FROM ubuntu:24.04

################################################################################
########     Note: main Dockerfile using AMD libraries should be used unless
########     there is a specific reason to use Intel OpenCL libraries
################################################################################

LABEL maintainer="David Lung (lungdm@gmail.com); Padraig Gleeson (p.gleeson@gmail.com)"

ARG USR=ow
ENV USER=$USR

RUN apt-get update && \
  apt-get upgrade -y && \
  apt-get dist-upgrade -y

RUN mkdir -p /etc/sudoers.d && \
  export uid=1000 gid=1000 && \
  mkdir -p /home/$USER && \
  echo "$USER:x:${uid}:${gid}:$USER,,,:/home/$USER:/bin/bash" >> /etc/passwd && \
  echo "$USER:x:${uid}:" >> /etc/group && \
  echo "$USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USER && \
  chmod 0440 /etc/sudoers.d/$USER && \
  chown ${uid}:${gid} -R /home/$USER

ENV DEBIAN_FRONTEND=noninteractive


################################################################################
########     Update/install essential libraries

RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils \
  wget nano htop build-essential make git automake autoconf \
  g++ rpm libtool libncurses5-dev zlib1g-dev bison flex \
  sudo xorg openbox x11-xserver-utils \
  libxext-dev libncurses-dev mercurial \
  freeglut3-dev libglu1-mesa-dev libglew-dev python3-dev python3-pip \
  kmod dkms linux-source linux-headers-generic \
  maven openjdk-8-jdk \
  libnuma1 \
  openmpi-bin  libopenmpi-dev \
  libgl1 libglx-mesa0  libgl1-mesa-dri libfreetype6-dev \
  libxft-dev  unzip ffmpeg xvfb tmux

#RUN  sudo pip install --upgrade pip

RUN sudo usermod -a -G video $USER

#USER $USER
ENV HOME=/home/$USER
WORKDIR $HOME



################################################################################
########     Install NEURON simulator

RUN sudo pip install neuron==8.2.6  --break-system-packages


################################################################################
########     Install c302 for building neuronal network models

RUN git clone https://github.com/openworm/c302.git && \
  cd c302 && \
  git checkout ow-0.9.7 && \
  sudo pip install .  --break-system-packages

# Note: pyNeuroML installed with the above library



################################################################################
########     Install Sibernetic for the worm body model

RUN git clone https://github.com/openworm/sibernetic.git && \
  cd sibernetic && \
  git checkout ow-0.9.7  # fixed to a specific branch


################################################################################
########     Install extra Python dependencies

RUN sudo pip install ruff  --break-system-packages


################################################################################
########     Set some paths//environment variables

ENV C302_HOME=$HOME/c302/c302
ENV SIBERNETIC_HOME=$HOME/sibernetic
ENV PYTHONPATH=$HOME/c302:$SIBERNETIC_HOME

ENV NEURON_MODULE_OPTIONS=-nogui


################################################################################
########     Install Intel OpenCL libraries needed for Sibernetic

# Legacy install of Intel's OpenCL Drivers:

RUN mkdir intel-opencl-tmp && \
   cd intel-opencl-tmp && \
   mkdir intel-opencl && \
   wget https://github.com/openworm/OpenWorm/raw/dev_inte/SRB5.0_linux64.zip && \
   unzip SRB5.0_linux64.zip && \
   tar -C intel-opencl -Jxf intel-opencl-r5.0-63503.x86_64.tar.xz && \
   tar -C intel-opencl -Jxf intel-opencl-devel-r5.0-63503.x86_64.tar.xz && \
   tar -C intel-opencl -Jxf intel-opencl-cpu-r5.0-63503.x86_64.tar.xz && \
   sudo cp -R intel-opencl/* / && \
   sudo ldconfig && \
   cd .. && \
   sudo rm -r intel-opencl-tmp

RUN sudo cp -R /opt/intel/opencl/include/CL /usr/include/ && \
    sudo apt install -y ocl-icd-opencl-dev vim

RUN echo "OpenCL Driver Installation Complete"


################################################################################
########     Build Sibernetic

RUN cd sibernetic && \
    make clean && make all && ldd ./Release/Sibernetic  # Use python 3 libs


################################################################################
########     Copy master python script

# Not working with --chown=$USER:$USER
COPY ./master_openworm.py $HOME/master_openworm.py
RUN sudo chown $USER:$USER $HOME/master_openworm.py

RUN printf '\n\nalias cd..="cd .."\nalias h=history\nalias ll="ls -alth"\n' >> ~/.bashrc

RUN pip list

RUN echo "Built the OpenWorm Docker image!"
