FROM git.ia2.inaf.it:5050/lofarit/containers/vlbi-inaf-base:latest
MAINTAINER Giuliano Taffoni <giuliano.taffoni@inaf.it>
ENV CONTAINER_NAME='lovarVLBISoftware'

USER root
#
# Environmental variables
#
ENV PYTHON_VERSION=2.7
# Settings relevant to the installed software.
ENV AOFLAGGER_VERSION=v2.15.0
ENV ARMADILLO_VERSION=9.900.3
ENV BLAS_VERSION=3.8.0
ENV BOOST_VERSION=1.69.0
ENV CASACORE_VERSION=v2.4.1
# Leave at latest, release versions crash for some reason.
ENV CASAREST_VERSION=latest
ENV CFITSIO_VERSION=7.3.47
ENV DPPP_VERSION=v4.2
ENV DYSCO_VERSION=v1.2
#export EVERYBEAM_VERSION=0cc64a81
ENV EVERYBEAM_VERSION=master
ENV FFTW_VERSION=3.5.8
ENV HDF5_VERSION=1.10.5
ENV IDG_VERSION=master
ENV LAPACK_VERSION=3.8.0
ENV LOFAR_VERSION=3_2_18
# Don't change LOSOTO2_VERSION. This is the last commit that plays nice with Python 2.
ENV LOSOTO2_VERSION=c8fbd61
ENV LOSOTO3_VERSION=latest
ENV LSMTOOL_VERSION=v1.4.2
ENV OPENBLAS_VERSION=3.8.0
ENV PYBDSF_VERSION=master
ENV PYTHON_CASACORE_VERSION=v2.2.1
ENV RMEXTRACT_VERSION=4c61232
ENV SUPERLU_VERSION=5.2.1
ENV WSCLEAN_VERSION=latest
ENV WCSLIB_VERSION=6.4
ENV HDF5_USE_FILE_LOCKING=FALSE

#
# Setup the compiling enviroment 
#
ARG CMAKE_C_COMPILER=/usr/bin/gcc
ARG CMAKE_CXX_COMPILER=/usr/bin/g++
ARG CC_GLOBAL=/usr/bin/gcc
ARG CXX_GLOBAL=/usr/bin/g++
ARG MPICC=/usr/lib64/openmpi/bin/mpicc
ARG MPICXX=/usr/lib64/openmpi/bin/mpic++
ARG CFLAGS_GLOBAL="-mno-avx512f -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512ifma -mno-avx512vbmi"
ARG CXXFLAGS_GLOBAL="-std=c++11 -mno-avx512f -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512ifma -mno-avx512vbmi"
ARG CASA_CXXFLAGS
ARG CASA_CFLAGS
ARG CPLUS_INCLUDE_PATH="/usr/include/openmpi-x86_64:/usr/include/c++/9:$CPLUS_INCLUDE_PATH:/usr/include/python2.7:$INSTALLDIR/casacore/include:/usr/include/boost:/usr/include/cfitsio:$INSTALLDIR/EveryBeam/include"
ARG CPATH="/usr/include/openmpi-x86_64/:/opt/intel/mkl/include:${INSTALLDIR}/casacore/include:$INSTALLDIR/LOFARBeam/include:$INSTALLDIR/idg/include:$INSTALLDIR/aoflagger/include:$INSTALLDIR/EveryBeam/include:$CPATH"
ARG CMAKE_PREFIX_PATH="$INSTALLDIR/aoflagger:$INSTALLDIR/casacore:$INSTALLDIR/lofar:$INSTALLDIR/LOFARBeam:/usr/lib64/openmpi:$INSTALLDIR/EveryBeam"
ARG LD_LIBRARY_PATH="$INSTALLDIR/aoflagger/lib:$INSTALLDIR/casacore/lib:$INSTALLDIR/idg/lib:$INSTALLDIR/LOFARBeam/lib:/usr/lib64/openmpi/lib/:$INSTALLDIR/EveryBeam/lib:LD_LIBRARY_PATH"
ARG PATH="/usr/lib64/openmpi/bin:$PATH"
ARG OLD_PYTHONPATH=$PYTHONPATH

ARG NCORES=2
ARG INSTALLDIR=/opt/lofar
# Path to where the patch for python-casacore's setup is stored.
ENV PYTHON_CASACORE_PATCH=$INSTALLDIR/python-casacore/python_casacore_setup_patch.patch
ENV PATCH_LOFAR=$INSTALLDIR/lofar/lofar.patch

#
# Env to set at building
#
ENV CC=${CC_GLOBAL}
ENV CXX=${CXX_GLOBAL}
ENV CFLAGS=${CFLAGS_GLOBAL}
ENV CXXFLAGS=${CXXFLAGS_GLOBAL}
#

#
# Symlinks required for Fedora 31
#
RUN ln -s /usr/lib64/libboost_python37.so /usr/lib64/libboost_python3.so
RUN ln -s /usr/lib64/libboost_numpy37.so /usr/lib64/libboost_numpy3.so
RUN ln -s /usr/lib64/libboost_python27.so /usr/lib64/libboost_python.so
RUN ln -s /usr/lib64/libboost_numpy27.so /usr/lib64/libboost_numpy.so
RUN ln -s /usr/lib64/libnsl.so.2.0.0 /usr/lib64/libnsl.so

#
# Setup the Python environment.
#
RUN    wget https://raw.githubusercontent.com/tikk3r/lofar-grid-hpccloud/fedora/requirements.txt -O $INSTALLDIR/requirements.txt
RUN    wget https://raw.githubusercontent.com/tikk3r/lofar-grid-hpccloud/fedora/requirements3.txt -O $INSTALLDIR/requirements3.txt
RUN    pip install xmlrunner && pip3 install xmlrunner
RUN    echo lofar-h5plot >> $INSTALLDIR/requirements3.txt  
RUN    pip --no-cache-dir install "virtualenv<20"
RUN    virtualenv $INSTALLDIR/pyenv-py3 --python=python3
RUN    source $INSTALLDIR/pyenv-py3/bin/activate && export HDF5_VERSION=1.10.5 && pip install numpy && pip install --no-binary h5py h5py && \
       pip install -r $INSTALLDIR/requirements3.txt && deactivate
RUN    virtualenv $INSTALLDIR/pyenv-py2 --python=python2
RUN    source $INSTALLDIR/pyenv-py2/bin/activate && export HDF5_VERSION=1.10.5 && pip install numpy && pip install --no-binary h5py h5py && \
       pip install -r $INSTALLDIR/requirements.txt && pip install --no-deps "reproject==0.5.1"


#
# Install Montage
#
RUN    mkdir -p /opt/montage && cd /opt/montage && wget https://github.com/Caltech-IPAC/Montage/archive/v6.0.tar.gz -O Montage_v6.0.tar.gz && \ 
	tar xf Montage_v6.0.tar.gz && cd Montage-6.0 && make -j $NCORES

#
# Install difmap
#
RUN mkdir -p $INSTALLDIR/difmap && cd $INSTALLDIR/difmap && wget ftp://ftp.astro.caltech.edu/pub/difmap/difmap2.5e.tar.gz && \
    tar zxf difmap2.5e.tar.gz && cd uvf_difmap && \
    wget https://raw.githubusercontent.com/nealjackson/loop3_difmap/master/corplt.c -O difmap_src/corplt.c && \
    sed -i.bak -e '97d' configure && \
    sed -i.bak -e '97 i PGPLOT_LIB=/usr/lib64/libpgplot.so.5' configure && \
    ./configure linux-i486-gcc && export PGPLOT_LIB=/usr/lib64/libpgplot.so.5 && export CFLAGS="-L/usr/lib64/libpgplot.so.5" && \
    ./makeall
RUN rm -rf $INSTALLDIR/difmap/*.tar.gz

#
# Install PyBDSF
#
ENV CFLAGS=${CFLAGS_GLOBAL}
RUN  mkdir -p ${INSTALLDIR}/pybdsf && cd ${INSTALLDIR}/pybdsf && git clone https://github.com/lofar-astron/pybdsf pybdsf
RUN  if [ "${PYBDSF_VERSION}" != "latest" ]; then cd ${INSTALLDIR}/pybdsf/pybdsf && git checkout ${PYBDSF_VERSION}; fi

RUN cd ${INSTALLDIR}/pybdsf/pybdsf && python setup.py install && cd $INSTALLDIR && rm -rf $INSTALLDIR/pybdsf/pybdsf


#
# Install CASAcore
#
# Casacore 2.4.1 does not seem to deal well with AVX512 instructions, so disable them if needed
ENV CFLAGS=$CASA_CFLAGS
ENV CXXFLAGS=$CASA_CXXFLAGS
RUN mkdir -p ${INSTALLDIR}/casacore/build && mkdir -p ${INSTALLDIR}/casacore/data && \
    cd $INSTALLDIR/casacore && git clone https://github.com/casacore/casacore.git src && \
    if [ "${CASACORE_VERSION}" != "latest" ]; then cd ${INSTALLDIR}/casacore/src && git checkout tags/${CASACORE_VERSION}; fi
# Backport patch UVFITS for LOFAR. This is fixed in recent versions > May 26 2020
# wget https://patch-diff.githubusercontent.com/raw/casacore/casacore/pull/1033.patch -O $INSTALLDIR/casacore/1033.patch
# cd $INSTALLDIR/casacore/src && patch --fuzz 3 -p1 < $INSTALLDIR/casacore/1033.patch
RUN cd ${INSTALLDIR}/casacore/data && wget --retry-connrefused ftp://anonymous@ftp.astron.nl/outgoing/Measures/WSRT_Measures.ztar && \
    cd ${INSTALLDIR}/casacore/data && tar xf WSRT_Measures.ztar && rm WSRT_Measures.ztar && \
    cd ${INSTALLDIR}/casacore/build && cmake -DCMAKE_INSTALL_PREFIX=${INSTALLDIR}/casacore/ -DDATA_DIR=${INSTALLDIR}/casacore/data -DBUILD_PYTHON=True -DUSE_OPENMP=True -DUSE_FFTW3=TRUE -DUSE_HDF5=True -DBUILD_PYTHON3=False ../src/ 
RUN cd ${INSTALLDIR}/casacore/build && make -s -j ${NCORES} && make install && cd $INSTALLDIR && rm -rf $INSTALLDIR/casacore/build && rm -rf $INSTALLDIR/casacore/src

#
# Install Python-CASAcore
#

RUN mkdir ${INSTALLDIR}/python-casacore && cd ${INSTALLDIR}/python-casacore && git clone https://github.com/casacore/python-casacore && \
    if [ "$PYTHON_CASACORE_VERSION" != "latest" ]; then cd ${INSTALLDIR}/python-casacore/python-casacore && git checkout tags/${PYTHON_CASACORE_VERSION}; fi
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd ${INSTALLDIR}/python-casacore/python-casacore && python setup.py build_ext -I${INSTALLDIR}/casacore/include/:/usr/include/python2.7:/usr/include/cfitsio -L${INSTALLDIR}/casacore/lib/:/usr/lib64/ && python setup.py install #--prefix=${INSTALLDIR}/python-casacore/
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/python-casacore/python-casacore 

# 
# reset to global
#
ENV CFLAGS=${CFLAGS_GLOBAL}
ENV CXXFLAGS=${CXXFLAGS_GLOBAL}

#
# Install Dysco
#
RUN mkdir -p $INSTALLDIR/dysco/build
RUN cd $INSTALLDIR/dysco && git clone https://github.com/aroffringa/dysco.git src && cd src
RUN if [ "$DYSCO_VERSION" != "latest" ]; then cd $INSTALLDIR/dysco/src && git checkout $DYSCO_VERSION; fi
RUN cd $INSTALLDIR/dysco/build && cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/dysco -DCASACORE_ROOT_DIR=$INSTALLDIR/casacore -DPORTABLE=True ../src && make -s -j ${NCORES} && make install
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/dysco/build && rm -rf $INSTALLDIR/dysco/src

#
# Install AOFlagger
#
RUN mkdir -p ${INSTALLDIR}/aoflagger/build &&  cd ${INSTALLDIR}/aoflagger && git clone git://git.code.sf.net/p/aoflagger/code aoflagger && cd ${INSTALLDIR}/aoflagger/aoflagger
RUN if [ "${AOFLAGGER_VERSION}" != "latest" ]; then cd ${INSTALLDIR}/aoflagger/aoflagger &&  git checkout tags/${AOFLAGGER_VERSION}; fi
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd ${INSTALLDIR}/aoflagger/build && cmake -DCMAKE_INSTALL_PREFIX=${INSTALLDIR}/aoflagger/ -DCASACORE_ROOT_DIR=${INSTALLDIR}/casacore -DBUILD_SHARED_LIBS=ON -DPORTABLE=True ../aoflagger
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd ${INSTALLDIR}/aoflagger/build && make -s -j ${NCORES}  && make install
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/aoflagger/aoflagger && rm -rf $INSTALLDIR/aoflagger/build &&  rm -rf $INSTALLDIR/aoflagger/src

#
# Install LOFAR
#
RUN mkdir -p ${INSTALLDIR}/lofar/build/gnucxx11_opt 
RUN if [ "${LOFAR_VERSION}" = "latest" ]; then cd ${INSTALLDIR}/lofar && svn checkout https://svn.astron.nl/LOFAR/trunk src; fi
RUN if [ "${LOFAR_VERSION}" != "latest" ]; then cd ${INSTALLDIR}/lofar && svn checkout https://svn.astron.nl/LOFAR/tags/LOFAR-Release-${LOFAR_VERSION} src; fi
RUN cd $INSTALLDIR/lofar && svn update --depth=infinity $INSTALLDIR/lofar/src/CMake
RUN cd $INSTALLDIR/lofar/ && wget https://raw.githubusercontent.com/tikk3r/lofar-grid-hpccloud/master/patches/lofar.patch && \
	patch $INSTALLDIR/lofar/src/CMake/variants/GNUCXX11.cmake $PATCH_LOFAR && \
	cd ${INSTALLDIR}/lofar/build/gnucxx11_opt
    #cmake -DCMAKE_PREFIX_PATH=$INSTALLDIR/aoflagger:$INSTALLDIR/casacore:$INSTALLDIR/dysco -DBUILD_PACKAGES="StationResponse pystationresponse ParmDB pyparmdb Pipeline MS" -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/lofar/ -DUSE_LOG4CPLUS=OFF -DUSE_OPENMP=True ${INSTALLDIR}/lofar/src/
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd ${INSTALLDIR}/lofar/build/gnucxx11_opt && cmake -DCMAKE_PREFIX_PATH=$INSTALLDIR/aoflagger:$INSTALLDIR/casacore:$INSTALLDIR/dysco -DBUILD_PACKAGES="Pipeline" -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/lofar/ -DUSE_LOG4CPLUS=OFF -DUSE_OPENMP=True -DBUILD_PYTHON3=OFF ${INSTALLDIR}/lofar/src/ && make -s -j ${NCORES} && make install
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/lofar/build && rm -rf $INSTALLDIR/lofar/src

#
# Install msoverview separately
#
RUN    mkdir -p $INSTALLDIR/msoverview/src
RUN    cd $INSTALLDIR/msoverview/src && svn export https://svn.astron.nl/LOFAR/tags/LOFAR-Release-3_2_18/CEP/MS/src/msoverview.cc && \
       source $INSTALLDIR/pyenv-py2/bin/activate && gcc -I/opt/lofar/casacore/include/casacore/ -L/opt/lofar/casacore/lib msoverview.cc \
        -o $INSTALLDIR/lofar/bin/msoverview -lcasa_casa -lcasa_ms -lcasa_tables -lstdc++
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/msoverview
    
#
# Install the standalone StationResponse libraries.
#   
RUN mkdir -p $INSTALLDIR/LOFARBeam/build && cd $INSTALLDIR/LOFARBeam && git clone https://github.com/lofar-astron/LOFARBeam.git src
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd $INSTALLDIR/LOFARBeam/build && cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/lofar ../src && make -j ${NCORES} && make install
RUN touch /opt/lofar/lofar/lib64/python2.7/site-packages/lofar/__init__.py
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/LOFARBeam/build && rm -rf $INSTALLDIR/LOFARBeam/src

#
# Install EveryBeam library
#
RUN mkdir -p $INSTALLDIR/EveryBeam/build && cd $INSTALLDIR/EveryBeam && git clone https://git.astron.nl/RD/EveryBeam.git src && \ 
    cd src && git checkout $EVERYBEAM_VERSION && \
    cd $INSTALLDIR/EveryBeam/build && \
    cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/EveryBeam ../src && \
    make -j ${NCORES} && make install

#
# Install DPPP
#
RUN mkdir -p $INSTALLDIR/DPPP/build && git clone https://github.com/lofar-astron/DP3.git $INSTALLDIR/DPPP/src && \ 
    cd $INSTALLDIR/DPPP/src && git checkout tags/${DPPP_VERSION}
RUN cd $INSTALLDIR/DPPP/build && cmake3 -DCMAKE_CXX_FLAGS="-D_GLIB_USE_CXX_ABI=1 -DBOOST_NO_CXX11_SCOPED_ENUMS" -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLDIR/DPPP -DLOFAR_STATION_RESPONSE_DIR:PATH=$INSTALLDIR/lofar/include -DLOFAR_STATION_RESPONSE_LIB:FILEPATH=$INSTALLDIR/lofar/lib/libstationresponse.so -DIDGAPI_LIBRARIES=$INSTALLDIR/idg/lib/libidg-api.so -DIDGAPI_INCLUDE_DIRS=$INSTALLDIR/idg/include -DAOFLAGGER_INCLUDE_DIR=$INSTALLDIR/aoflagger/include -DAOFLAGGER_LIB=$INSTALLDIR/aoflagger/lib/libaoflagger.so ../src && make -s -j ${NCORES} && make install
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/DPPP/build && rm -rf $INSTALLDIR/DPPP/src

############################################
# Install Python packages for Python 2 now #
############################################
#
# Install RMextract
#
RUN mkdir -p $INSTALLDIR/RMextract/build && cd $INSTALLDIR/RMextract/build && git clone https://github.com/lofar-astron/RMextract.git src && \
    cd src && if [ "$RMEXTRACT_VERSION" != "latest" ]; then git checkout $RMEXTRACT_VERSION; fi
RUN source $INSTALLDIR/pyenv-py2/bin/activate &&  cd $INSTALLDIR/RMextract/build/src &&  python setup.py build --add-lofar-utils && \
    python setup.py install --add-lofar-utils && deactivate
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/RMextract

#
# Install LoSoTo
#
RUN mkdir -p $INSTALLDIR/losoto/build && cd ${INSTALLDIR}/losoto/build && \
    git clone https://github.com/revoltek/losoto.git src && \
    cd src && if [ "$LOSOTO2_VERSION" != "latest" ]; then git checkout $LOSOTO2_VERSION; fi
RUN source $INSTALLDIR/pyenv-py2/bin/activate &&  cd ${INSTALLDIR}/losoto/build/src &&  python setup.py build && \
    python setup.py install  && deactivate
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/losoto

#
# Install LSMTool.
#
RUN mkdir -p $INSTALLDIR/lsmtool && cd $INSTALLDIR/lsmtool && \
    git clone https://github.com/darafferty/LSMTool.git lsmtool && \ 
    cd $INSTALLDIR/lsmtool/lsmtool && \
    if [ "$LSMTOOL_VERSION" != "latest" ]; then git checkout $LSMTOOL_VERSION; fi
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd $INSTALLDIR/lsmtool/lsmtool &&  python setup.py install  && deactivate
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/lsmtool

############################################
# Install Python packages for Python 3 now #
############################################
#
# Install LoSoTo
#
RUN mkdir -p $INSTALLDIR/losoto/build && \
    cd $INSTALLDIR/losoto/build && \
    git clone https://github.com/revoltek/losoto.git src 
RUN cd $INSTALLDIR/losoto/build/src && source $INSTALLDIR/pyenv-py3/bin/activate && \
    python setup.py build && \
    python setup.py install && deactivate
RUN cd $INSTALLDIR && rm -rf $INSTALLDIR/losoto

# Switch back to py2 to wrap up installation
#
# Install-WSClean
#
RUN mkdir $INSTALLDIR/wsclean && cd ${INSTALLDIR}/wsclean && git clone https://gitlab.com/aroffringa/wsclean.git && \ 
    if [ "$WSCLEAN_VERSION" != "latest" ]; then cd ${INSTALLDIR}/wsclean/wsclean && git checkout $WSCLEAN_VERSION; fi
RUN cd ${INSTALLDIR}/wsclean/wsclean &&  mkdir build && cd build
ENV CC=${MPICC}
ENV CXX=${MPICXX}
RUN source $INSTALLDIR/pyenv-py2/bin/activate  && cd ${INSTALLDIR}/wsclean/wsclean/build &&  cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/wsclean -DPORTABLE=True -DIDGAPI_LIBRARIES=$INSTALLDIR/idg/lib/libidg-api.so -DIDGAPI_INCLUDE_DIRS=$INSTALLDIR/idg/include .. && \
    make -j ${NCORES} && \
    make install && \
    cd $INSTALLDIR && rm -rf $INSTALLDIR/wsclean/wsclean
#
# Switch back to normal compilers
ENV CC=${CC_GLOBAL}
ENV CXX=${CXX_GLOBAL}
#
#
# Install DS9
#
RUN mkdir -p $INSTALLDIR/ds9/bin && cd $INSTALLDIR/ds9 && \
    wget http://ds9.si.edu/download/fedora30/ds9.fedora30.8.2.tar.gz && \
    tar xf ds9*.tar.gz -C $INSTALLDIR/ds9/bin && \
    rm ds9*.tar.gz
#
# Finaly cleanup of unnecessary stuff
# 
ENV  PYTHONPATH=$OLD_PYTHONPATH
RUN rm -rf /var/cache/dnf/* && \
    rm -rf /var/cache/yum/* && \
    rm -rf /var/log/* && \
    dnf -y clean all 

#
# init-lofar
#
RUN    ln -s /opt/lofar/DPPP/bin/DPPP /opt/lofar/lofar/bin/NDPPP && \
       ln -s /opt/lofar/DPPP/bin/makesourcedb /opt/lofar/lofar/bin/makesourcedb &&\
       ln -s $INSTALLDIR/pyenv-py3/bin/h5plot /usr/bin/h5plot
COPY files/post_init /tmp/post_init
RUN  cat /tmp/post_init >> $INSTALLDIR/init.sh && rm -f /tmp/post_init
RUN  sed -e 's/\\\$/\$/g' /opt/lofar/init.sh
RUN sudo touch /opt/lofar/.casarc && sudo chmod 666 /opt/lofar/.casarc
USER metauser
