FROM lofarit_base_extras:latest
MAINTAINER Giuliano Taffoni <giuliano.taffoni@inaf.it>
ENV CONTAINER_NAME='lofarit_base_astro'

#=============================
# Switch to root for install
#=============================
USER root


#=============================
# Set install environment
#=============================

ENV J=40
ENV INSTALLDIR=/opt/lofar
ENV PYTHON_VERSION=2.7
# 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
# 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
ENV # Leave at latest, release versions crash for some reason.
# ENV CASAREST_VERSION=latest # Not used?
ENV CFITSIO_VERSION=7.3.47
ENV DPPP_VERSION=v4.2
ENV DYSCO_VERSION=v1.2
ENV EVERYBEAM_VERSION=1c22f47107187f21f6fb7c473c2c0c8a7e18b47c
ENV FFTW_VERSION=3.5.8
ENV HDF5_VERSION=1.10.5
#ENV IDG_VERSION=master # Not used?
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 # Not used?
ENV LSMTOOL_VERSION=v1.4.2
ENV OPENBLAS_VERSION=3.8.0
ENV PYBDSF_VERSION=380ea5f2adea122bbc081658a7105f891345d799
ENV PYTHON_CASACORE_VERSION=v2.2.1
ENV RMEXTRACT_VERSION=4c61232
ENV SUPERLU_VERSION=5.2.1
ENV WSCLEAN_VERSION=241ab7538624b840627ab027b40f88794db1a400
ENV WCSLIB_VERSION=6.4
ENV HDF5_USE_FILE_LOCKING=FALSE


#=============================
# Symlinks required for Fedora 31
#=============================

RUN ln -s /usr/lib64/libboost_python37.so /usr/lib64/libboost_python3.so && \
    ln -s /usr/lib64/libboost_numpy37.so /usr/lib64/libboost_numpy3.so  && \
    ln -s /usr/lib64/libboost_python27.so /usr/lib64/libboost_python.so && \
    ln -s /usr/lib64/libboost_numpy27.so /usr/lib64/libboost_numpy.so && \
    ln -s /usr/lib64/libnsl.so.2.0.0 /usr/lib64/libnsl.so


#=============================
# Setup the compiling env 
#=============================

#ARG CFLAGS="-mno-avx512f -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512ifma -mno-avx512vbmi"
#ARG CXXFLAGS="-std=c++11 -mno-avx512f -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512ifma -mno-avx512vbmi"
# Use below to optimize for a specific architecture
#export CFLAGS="-march=skylake-avx512 -mtune=skylake-avx512"
#export CXXFLAGS="-march=skylake-avx512 -mtune=skylake-avx512"
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  make=`which make`
ARG OLD_PYTHONPATH=$PYTHONPATH


#=============================
# Setup the Python environment.
#=============================

COPY requirements3.txt $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

COPY requirements.txt $INSTALLDIR/requirements.txt
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 $J


#=============================
# Install difmap
#=============================

RUN mkdir -p $INSTALLDIR/difmap && cd $INSTALLDIR/difmap && \
    wget https://github.com/tikk3r/lofar-grid-hpccloud/blob/master/misc/difmap2.5e.tar.gz?raw=true -O difmap2.5e.tar.gz && \
    tar zxf difmap2.5e.tar.gz && cd uvf_difmap && \
    wget https://raw.githubusercontent.com/nealjackson/loop3_difmap/5e1409ec906f5a9b3c090076ca988d4fd2b7e6de/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
#=============================

#ARG CFLAGS="-mno-avx512f -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512ifma -mno-avx512vbmi"
RUN  mkdir -p ${INSTALLDIR}/pybdsf && cd ${INSTALLDIR}/pybdsf && git clone https://github.com/lofar-astron/pybdsf pybdsf
RUN  cd ${INSTALLDIR}/pybdsf/pybdsf && git checkout ${PYBDSF_VERSION}
RUN cd ${INSTALLDIR}/pybdsf/pybdsf && python setup.py install
RUN 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
#export CFLAGS="-march=skylake -mtune=skylake -mno-avx512f"
#export CXXFLAGS="-march=skylake -mtune=skylake -mno-avx512f"
RUN mkdir -p ${INSTALLDIR}/casacore/build && mkdir -p ${INSTALLDIR}/casacore/data
RUN cd $INSTALLDIR/casacore && git clone https://github.com/casacore/casacore.git src
RUN cd ${INSTALLDIR}/casacore/src && git checkout tags/${CASACORE_VERSION}
# 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
RUN cd ${INSTALLDIR}/casacore/data && tar xf WSRT_Measures.ztar && rm WSRT_Measures.ztar
RUN 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 ${J} && make install
RUN 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
RUN cd ${INSTALLDIR}/python-casacore/python-casacore && git checkout tags/${PYTHON_CASACORE_VERSION}
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 
# and then reset the flags again if needed
#export CFLAGS="-march=skylake-avx512 -mtune=skylake-avx512"
#export CXXFLAGS="-march=skylake-avx512 -mtune=skylake-avx512"


#=============================
# Install Dysco
#=============================

RUN mkdir -p $INSTALLDIR/dysco/build
RUN cd $INSTALLDIR/dysco && git clone https://github.com/aroffringa/dysco.git src && cd src
RUN cd $INSTALLDIR/dysco/src && git checkout $DYSCO_VERSION
RUN cd $INSTALLDIR/dysco/build && cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/dysco -DCASACORE_ROOT_DIR=$INSTALLDIR/casacore -DPORTABLE=True ../src && make -s -j $J && 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 cd ${INSTALLDIR}/aoflagger/aoflagger &&  git checkout tags/${AOFLAGGER_VERSION}
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 ${J}  && 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 cd ${INSTALLDIR}/lofar && svn checkout https://svn.astron.nl/LOFAR/trunk src
RUN cd ${INSTALLDIR}/lofar && svn checkout https://svn.astron.nl/LOFAR/tags/LOFAR-Release-${LOFAR_VERSION} src
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/cd33001869d8318ca1ee14e838ac40122c405260/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/
ARG CMAKE_C_COMPILER=/usr/bin/gcc
ARG CMAKE_CXX_COMPILER=/usr/bin/g++
ARG CC=/usr/bin/gcc
ARG CXX=/usr/bin/g++
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd ${INSTALLDIR}/lofar/build/gnucxx11_opt && CC=/usr/bin/gcc && CXX=/usr/bin/g++ && 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 $J && 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 cd $INSTALLDIR/LOFARBeam/src && git checkout 5b5d80ff308784adbf00985293257b16afff86b2
RUN source $INSTALLDIR/pyenv-py2/bin/activate && cd $INSTALLDIR/LOFARBeam/build && cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/lofar ../src && make -j $J && 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 $J && make install

#=============================
# Install idg
#=============================
RUN mkdir -p $INSTALLDIR/idg/build && cd $INSTALLDIR/idg && git clone https://gitlab.com/astron-idg/idg src  && \
    cd src && git checkout 44c4fc08 && \
    #cmake -DCMAKE_INSTALL_PREFIX=/usr/local/idg/ .. && \
    cd $INSTALLDIR/idg/build && \
    cmake -DCMAKE_INSTALL_PREFIX=$INSTALLDIR/idg ../src && \
    make -j $J && 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 $J && 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 && git checkout $RMEXTRACT_VERSION
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 && git checkout $LOSOTO2_VERSION
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 && \
    git checkout $LSMTOOL_VERSION
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 && \ 
    cd ${INSTALLDIR}/wsclean/wsclean && git checkout $WSCLEAN_VERSION
RUN cd ${INSTALLDIR}/wsclean/wsclean &&  mkdir build && cd build
ARG CC=/usr/lib64/openmpi/bin/mpicc
ARG CXX=/usr/lib64/openmpi/bin/mpic++
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 ${J} && \
    make install && \
    cd $INSTALLDIR && rm -rf $INSTALLDIR/wsclean/wsclean


#=============================
# Switch back to normal compilers
#=============================

ARG CC=/usr/bin/gcc
ARG CXX=/usr/bin/g++


#=============================
# 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
RUN  sed -e 's/\\\$/\$/g' /opt/lofar/init.sh


#=============================
# Switch back to metauser
#=============================

USER metauser