#!/bin/bash

exfor_dir="/opt/EXFOR/C4all"
DataDir="${HOME}/EXFOR/data"

usage="
Usage: `basename $0` [OPTIONS]
Retract data from the X4 data library in C4 format.
The options recognized are:
 -h, --help                        display this help and exit
 -l, --list                        display a list of the datasets conforming to the reaction given
 --exfor_dir=<C4 library folder>   specify the folder where the X4 library in C4 format is installed
                                   NOTE: If no value is given the script will look in folder ${exfor_dir}
 --data_dir=<data folder>          specify the output data folder
                                   NOTE: If no value is given the script will write in home folder ${DataDir}
 --reaction=<reaction>             give the reaction to extract.
                                   NOTE: The reactions should be in the form \"65cu\(p,g\)\"
                                   To an extend wildcard characters can also be used, eg *cu\(\[ap\],g\)
 --entry=<entry>                   give an entry or dataset to extract the specific datasets.
                                   NOTE: If the entry given is not unique (i.e. you give only the first 4
                                   characters) then all the datasets that match will be extracted
"

for i in "$@" ; do
   case $i in
      -h|--help)
         echo "${usage}"
         exit 0
      ;;
      -l|--list)
         AskedList=1
      ;;
      --exfor_dir=*)
         exfor_dir="${i#*=}"
      ;;
      --data_dir=*)
         DataDir="${i#*=}"
      ;;
      --reaction=*)
         AskedReaction="${i#*=}"
      ;;
      --entry=*)
         AskedEntry="${i#*=}"
      ;;
      *)
         echo "Unknown flag ${i}. Please run with -h or --help to see usage"
         exit 1
      ;;
   esac
done

if [ ! -d ${exfor_dir} ] ; then
   echo "The exfor library in C4 format is not installed in folder ${exfor_dir}"
   echo "Please install it there, or define a different folder with --exfor_dir flag"
   exit 1
elif [ ! -f ${exfor_dir}/*.tbl ] ; then
   echo "The C4 table file doesn't exist in folder ${exfor_dir}"
   echo "Please check your installation of EXFOR"
   exit 1
elif [ ! -f ${exfor_dir}/*.xc4 ] ; then
   echo "The C4 library file doesn't exist in folder ${exfor_dir}"
   echo "Please check your installation of EXFOR"
   exit 1
fi
if [ ! ${exfor_version} ] ; then exfor_version=`ls ${exfor_dir}/*.tbl | sed "s/.\+C4\-\([0-9\-]\+\).\+/\1/g"` ; fi

if [ ! ${AskedReaction} ] && [ ! ${AskedEntry} ] ; then echo -e "You didn't provide any reaction or entry!!!\nPlease give one and try again!" ; exit 2 ; fi

exfor_c4file_name="C4-${exfor_version}.xc4"
exfor_c4file="${exfor_dir}/${exfor_c4file_name}"
exfor_c4table="${exfor_dir}/${exfor_c4file_name}.tbl"

if [ ${AskedReaction} ] ; then
   Target=`echo ${AskedReaction} | sed "s|\(.\+\)(\(.\+\))|\1|" `
   Reaction=`echo ${AskedReaction} | sed "s|\(.\+\)(\(.\+\))|\2|" `
   if [[ "${Target}" == '*' ]] ; then
      TargetNucl=".*"
      TargetA=".*"
   else
      TargetNucl=`echo ${Target} | sed "s|\([0-9^*]\+\)\([a-Z^*]\+\)|\2|" | sed "s|\*|\.\*|" `
      TargetA=`echo ${Target} | sed "s|\([0-9^*]\+\)\([a-Z^*]\+\)|\1|" | sed "s|\*|\.\*|" `
   fi
   if [[ "${Reaction}" == '*' ]] ; then
      ReactProj=".*"
      ReactEject=".*"
   else
      ReactProj=`echo ${Reaction} | sed "s|\(.\+\),\(.\+\)|\1|" | sed "s|\*|\.\*|" `
      ReactEject=`echo ${Reaction} | sed "s|\(.\+\),\(.\+\)|\2|" | sed "s|\*|\.\*|" `
   fi
fi

if [ ${AskedList} ] ; then
   sed -n "1 p" ${exfor_c4table}
   echo ""
   grep -i "${TargetNucl}-${TargetA}(${ReactProj},${ReactEject})" ${exfor_c4table}
else
   if [ ${AskedEntry} ] ; then
      DataSets=( $(grep -i "^${AskedEntry}" ${exfor_c4table} | grep "^.\{36\}\ [34]" | cut -c1-9) )
   else
      DataSets=( $(grep -i "${TargetNucl}-${TargetA}(${ReactProj},${ReactEject})" ${exfor_c4table} | grep "^.\{36\}\ [34]" | cut -c1-9) )  #"
   fi

   ExtractedIndex=0
   TotalToExtract=${#DataSets[@]}
   for DataSet in ${DataSets[@]} ; do
      ExtractedIndex=$((${ExtractedIndex} + 1))
      DataEntry=`echo ${DataSet} | cut -c1-5 `
      DataSubEntry=`echo ${DataSet} | cut -c6-9 `
#      DataSubEntryP=`echo ${DataSet} | cut -c9 `
   if [ "${DataEntry}" != "${EntryRead}" ] ; then
      DataEntryDumFile=${DataDir}/${EntryRead}.dum
      if [ -f ${DataEntryDumFile} ] ; then rm -f ${DataEntryDumFile} ; fi
      DataEntryDumFile=${DataDir}/${DataEntry}.dum
      if [ ! -d ${DataDir} ] ; then mkdir -p ${DataDir} ; fi
      sed -n "/^\#ENTRY.*\ ${DataEntry}/,/^\#\/ENTRY/p" ${exfor_c4file} > ${DataEntryDumFile}
      unset EntryAuthor
      unset EntryYear
      EntryAuthor=`sed -n "/^\#AUTHOR1/{p;q;}" ${DataEntryDumFile} | sed "s/#AUTHOR1\ \+//" | sed "s/[\+].*//" | sed "s/.*[\.\ ]//" | sed "s/[\ \n\r]//g"`
      EntryYear=`sed -n "/^\#YEAR/{p;q;}" ${DataEntryDumFile} | sed "s/.*[0-9][0-9]\([0-9][0-9]\).*/\1/"`
      EntryRead="${DataEntry}"
   fi
   DataSetDumFile=${DataDir}/${DataSet}.dum
   sed -n "/^\#DATASET.*\ ${DataSet}/,/^\#\/DATASET/p" ${DataEntryDumFile} > ${DataSetDumFile}
   DataTarget=`sed -n "/^\#REACTION/{p;q;}" ${DataSetDumFile} | sed "s/.*-\([A-Z]*\)-\([0-9]*\)[-\0]*(.*/\2\L\u\1/"`
   DataReaction=`sed -n "/^\#REACTION/{p;q;}" ${DataSetDumFile} | sed "s|.*(\(.*\),\(.*\)).*|\L\1\2|" | sed "s|\(.*\),\(.*\)).*|\1\2|"`
   echo -ne "Extracting dataset ${DataSet} by ${EntryAuthor} (${DataTarget}(${DataReaction})) (${ExtractedIndex}/${TotalToExtract})                                                                  \r"
   DataSetFileName=${EntryAuthor}-${EntryYear}_${DataReaction}_${DataSet}.dat
   DataByReactionFolder=${DataDir}/By_Reaction/${DataReaction}/${DataTarget}
   DataByMassFolder=${DataDir}/By_Mass/${DataTarget}/${DataReaction}

   if [ ! -d ${DataByReactionFolder} ] ; then mkdir -p ${DataByReactionFolder} ; fi
   if [ ! -d ${DataByMassFolder} ] ; then mkdir -p ${DataByMassFolder} ; fi
   sed -i "/^\#[^\ ^\-]/d" ${DataSetDumFile}
   cat ${DataSetDumFile} | cut -c1,12,20-22,23-31,32-40,41-49,50-58,59-97 > ${DataByReactionFolder}/${DataSetFileName}
   sed -i "s|^\(.\)\(.\{4\}\)\(.\{9\}\)\(.\{9\}\)\(.\{9\}\)\(.\{9\}\)\(.*\)|\1\3\5\4\6\2\7|g" ${DataByReactionFolder}/${DataSetFileName}
   ln -s -r ${DataByReactionFolder}/${DataSetFileName} ${DataByMassFolder}/${DataSetFileName}
   rm -f ${DataSetDumFile}
   done
   echo -ne "\nDone extracting ${TotalToExtract} DataSets\n"
   if [ -f ${DataEntryDumFile} ] ; then rm -f ${DataEntryDumFile} ; fi
fi

exit 0
