#!/bin/bash
# A script to generate an XDS.INP for a pilatus header and integrate batches of a dataset
# Robin Owen 07/11/2011, edited by Arwen Pearson 14/07/2015
# Original script found at Pubmed ID 25282611
# Script edited to run on P14 at PETRA III by RS 05/06/2017

#################USER INPUT#############
# Data location and number of wedges to be integrated
TOPDIR=/path/ # insert path to image files here
OUTDIR=/path/ # insert path to output directory here

WEDGEID=run- # insert wedge ID
NUMBEROFWEDGES=100 # insert number of wedges
NUMBERIMAGE=10 # total number of images collected
NBATCH=5 # number of batches to split this into
# to integrate single images set NBATCH=NUMBERIMAGE
# NUMBERIMAGE/NBATCH MUST be an integer

SPACEGROUPNUMBER=23 # Spacegroup and unit cell 
A=94
B=99
C=103
ALPHA=90
BETA=90
GAMMA=90

FRIEDELSLAW=TRUE # Set Friedels law 
MINIMUMRES=50 # Set min and max resolution
MAXIMUMRES=1.5
BEAMX=1238.068 # Set beam centre. 
BEAMY=1276.53

###########DO NOT CHANGE BELOW THIS LINE##########
mkdir $OUTDIR

for (( i=1; i<=NUMBEROFWEDGES; i++))
do
  #Comment below in for individual image integration
  for (( j=1; j<=NBATCH; j++))
	do

########   Make procesing directory   ##############
		#cd $TOPDIR
                ##cd $WEDGEID/$WEDGE$i
		#mkdir run-$i/xds-$j > /dev/null
		#cd run-$i/xds-$j > /dev/null
		cd $OUTDIR
                mkdir run-$i > /dev/null
		cd run-$i > /dev/null
		
		touch XDS.INP

###### Calculate local names and file numbers ##########
		FULLLOCATION=$TOPDIR/$WEDGEID$i
		FILE=$(ls $TOPDIR/$WEDGEID$i/*.cbf | head -1 | awk -F"/" '{print $NF}')
		FILENAME=$(echo $FILE | awk -F"/" '{print $(NF)}')
		LEADINGNAME=$(echo $FILE | awk -F"_00" '{print $1}')
		#LOCALFILENAME=$(echo $LEADINGNAME"_"$i"_####.cbf")
		STARTNUMBER=$(( 1+ ($j-1) *  ($NUMBERIMAGE/$NBATCH) ))
		FINISHNUMBER=$(( $j*($NUMBERIMAGE/$NBATCH) ))
		ln -s $FULLLOCATION images


####### NOW STRIP THE NEEDED INFO FROM THE CBF HEADER ######


		SILICONTHICKNESS=$(head -31 $FULLLOCATION/$FILENAME | grep "Silicon sensor, thickness" | awk -F" " '{print $5}')
		SILICONTHICKNESS=$(echo "$SILICONTHICKNESS*1000" | bc)
		SILICONTHICKNESS="0"$SILICONTHICKNESS
		EXPOSUREPERIOD=$(head -31 $FULLLOCATION/$FILENAME | grep "Exposure_period" | awk -F" " '{print $3}')
		WAVELENGTH=$(head -31 $FULLLOCATION/$FILENAME | grep "Wavelength" | awk -F" " '{print $3}')
		DETECTORDISTANCE=$(head -31 $FULLLOCATION/$FILENAME | grep "Detector_distance" | awk -F" " '{print $3}')
		DETECTORDISTANCE=$(echo "$DETECTORDISTANCE * 1000" | bc)
		if [ "$BEAMCENTERFROMIMAGE" = "TRUE" ]; then
		BEAMX=$(head -31 $FULLLOCATION/$FILENAME | grep "Beam_xy" | awk -F"(" '{print $2}' | awk -F"," '{print$1}')
		BEAMY=$(head -31 $FULLLOCATION/$FILENAME | grep "Beam_xy" | awk -F"," '{print $2}' | awk -F")" '{print$1}')
		fi
		FLUX=$(head -31 $FULLLOCATION/$FILENAME | grep "Flux" | awk -F" " '{print $3}')
		FILTERTRANSMITTION=$(head -31 $FULLLOCATION/$FILENAME | grep "Filter_transmission" | awk -F" " '{print $3}')
		OSCILLATIONANGLE=$(head -31 $FULLLOCATION/$FILENAME | grep "Angle_increment" | awk -F" " '{print $3}')
		POLARIZATION=$(head -31 $FULLLOCATION/$FILENAME | grep "Polarization" | awk -F" " '{print $3}')


### Now we have all the needed info, create the XDS.INP file ####
		echo "!=====================================================================" >> XDS.INP
		echo "!===========  XDS.INP created by xdsintegratebatch at P14 ============" >> XDS.INP
		echo "!==============   X-Ray data collected at: PetraIII P14   ============" >> XDS.INP
		echo "!=====================================================================" >> XDS.INP 
		echo "!                                                                     " >> XDS.INP
		echo "!                                                                     " >> XDS.INP
		echo "!                         #####  #     #                              " >> XDS.INP
		echo "!                         #   #  #    ##                              " >> XDS.INP
		echo "!                         ####   #   # #                              " >> XDS.INP 
		echo "!                         #      #  #####                             " >> XDS.INP 
		echo "!                         #      #     #                              " >> XDS.INP
		echo "!                                                                     " >> XDS.INP
		echo "!=====================================================================" >> XDS.INP
		echo "!================   Detector type: Pilatus 6M    =====================" >> XDS.INP
		echo "!=====================================================================" >> XDS.INP
		echo "!==========    To convert output to mtz use pointless    =============" >> XDS.INP
		echo "!==  > pointless -copy xdsin XDS_ASCII.HKL hklout outputfile.mtz  ====" >> XDS.INP
		echo "!=====================================================================" >> XDS.INP
		echo "" >> XDS.INP
		echo ""	>> XDS.INP
		echo " JOB= ALL " >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP;
		echo "!==================== SELECTION OF DATA IMAGES ==============================" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo " NAME_TEMPLATE_OF_DATA_FRAMES=images/${LEADINGNAME}_???.cbf CBF" >> XDS.INP
		echo "" >> XDS.INP	
		echo "" >> XDS.INP
		echo "!===========     nb, max line length of 80 characters	=============" >> XDS.INP
		echo "!========     create softlink to data directory using ln -s	========" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo " DATA_RANGE=$STARTNUMBER $FINISHNUMBER    !Numbers of first and last data image collected" >> XDS.INP
		echo " SPOT_RANGE=$STARTNUMBER $FINISHNUMBER    !First and last data image number for finding spots " >> XDS.INP
		#echo " DATA_RANGE=$STARTNUMBER 20 !$FINISHNUMBER    !Numbers of first and last data image collected" >> XDS.INP
		#echo " SPOT_RANGE=$STARTNUMBER 20 !$FINISHNUMBER    !First and last data image number for finding spots " >> XDS.INP
		echo "" >> XDS.INP
		echo " BACKGROUND_RANGE=$STARTNUMBER $FINISHNUMBER  !Numbers of first and last data image for background" >> XDS.INP
		echo "" >> XDS.INP
		echo "!=================== EXPERIMENTAL PARAMETERS ==========================" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo " OSCILLATION_RANGE= $OSCILLATIONANGLE  !degrees (>0) " >> XDS.INP
		echo "" >> XDS.INP
		echo " X-RAY_WAVELENGTH=  $WAVELENGTH !(Angstroem) " >> XDS.INP
		echo "" >> XDS.INP
		echo " DETECTOR_DISTANCE= $DETECTORDISTANCE !(mm)" >> XDS.INP
		echo "" >> XDS.INP
		echo " ORGX=$BEAMX  ORGY=$BEAMY   !Detector origin (pixels).  ORGX=NX/2; ORGY=NY/2" >> XDS.INP
		echo "!=======    If indexing fails check and double check these    =========" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo "!======================= CRYSTAL PARAMETERS ================================= " >> XDS.INP
		echo "" >> XDS.INP
		echo " SPACE_GROUP_NUMBER=$SPACEGROUPNUMBER   !0 for unknown crystals; cell constants are ignored." >> XDS.INP
		echo "" >> XDS.INP
		echo " UNIT_CELL_CONSTANTS= $A $B $C $ALPHA $BETA $GAMMA " >> XDS.INP
		echo ""	>> XDS.INP
		echo " FRIEDEL'S_LAW= $FRIEDELSLAW !Default is TRUE" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo "!================  DETECTOR AND GEOMETRICAL PARAMETERS  =====================" >> XDS.INP
		echo "" >> XDS.INP
		echo " DIRECTION_OF_DETECTOR_X-AXIS= 1 0 0" >> XDS.INP
		echo " DIRECTION_OF_DETECTOR_Y-AXIS= 0 1 0" >> XDS.INP
		echo " ROTATION_AXIS=  0.0  -1.0  0.0" >> XDS.INP
		echo " INCIDENT_BEAM_DIRECTION=-0.0  0.0  1.0" >> XDS.INP
		echo " FRACTION_OF_POLARIZATION=0.98" >> XDS.INP
		echo " POLARIZATION_PLANE_NORMAL= 0 1 0" >> XDS.INP
		echo "" >> XDS.INP
		echo " DETECTOR=PILATUS  NX=2463 NY=2527 QX=0.172  QY=0.172" >> XDS.INP
		echo " MINIMUM_VALID_PIXEL_VALUE=-1  OVERLOAD=1048500" >> XDS.INP
		echo " MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT=3 ! Default is 6" >> XDS.INP
		echo " !MINIMUM_ZETA=0.05" >> XDS.INP
		echo " ! Reduce STRONG_PIXEL for very weak data" >> XDS.INP
		echo " STRONG_PIXEL=3" >> XDS.INP
		echo "" >> XDS.INP
		echo " SENSOR_THICKNESS=$SILICONTHICKNESS" >> XDS.INP
		echo " !SILICON=0.0       !Commenting this line in means no silicon efficiency correction" >> XDS.INP
		echo " TRUSTED_REGION=0.0 1.15 !Relative radii limiting trusted detector region" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE= 487  495     0 2528" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE= 981  989     0 2528" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=1475 1483     0 2528" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=1969 1977     0 2528" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464   195  213" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464   407  425" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464   619  637" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464   831  849" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  1043 1061" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  1255 1273" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  1467 1485" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  1679 1697" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  1891 1909" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  2103 2121" >> XDS.INP
		echo " UNTRUSTED_RECTANGLE=   0 2464  2315 2333" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo "!==================== DATA COLLECTION STRATEGY (XPLAN) ======================" >> XDS.INP
		echo "!                       !!! Warning !!!" >> XDS.INP
		echo "! If you processed your data for a crystal with unknown cell constants and" >> XDS.INP
		echo "! space group symmetry, XPLAN will report the results for space group P1." >> XDS.INP
		echo "" >> XDS.INP
		echo "!================= PARAMETERS CONTROLLING REFINEMENTS =======================" >> XDS.INP
		echo "" >> XDS.INP
		echo "!REFINE(IDXREF)=BEAM AXIS ORIENTATION CELL !DISTANCE" >> XDS.INP
		echo "REFINE(INTEGRATE)=BEAM ORIENTATION CELL !DISTANCE AXIS" >> XDS.INP
		echo "!REFINE(CORRECT)=DISTANCE BEAM ORIENTATION CELL AXIS" >> XDS.INP
		echo "!BEAM_DIVERGENCE=   0.202" >> XDS.INP
		echo "!BEAM_DIVERGENCE_E.S.D.=   0.020" >> XDS.INP
		echo "!REFLECTING_RANGE=  0.357" >> XDS.INP
		echo "!REFLECTING_RANGE_E.S.D.=  0.051" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo "!====================== COMPUTING PARAMETERS ==================================" >> XDS.INP
		echo "!MINUTE=1" >> XDS.INP
		echo "!MAXIMUM_NUMBER_OF_JOBS=8  !Speeds-up COLSPOT & INTEGRATE on a Linux-cluster" >> XDS.INP
		echo "!MAXIMUM_NUMBER_OF_PROCESSORS=8!<25;ignored by single cpu version of xds" >> XDS.INP
		echo "" >> XDS.INP
		echo "" >> XDS.INP
		echo "!================== CRITERIA FOR ACCEPTING REFLECTIONS ======================" >> XDS.INP
		echo " VALUE_RANGE_FOR_TRUSTED_DETECTOR_PIXELS= 7000 30000 !Used by DEFPIX" >> XDS.INP
		echo "!for excluding shaded parts of the detector." >> XDS.INP
		echo "" >> XDS.INP
		echo "INCLUDE_RESOLUTION_RANGE=$MINIMUMRES $MAXIMUMRES !Angstroem; used by DEFPIX,INTEGRATE,CORRECT" >> XDS.INP
		echo "" >> XDS.INP

		chmod 755 XDS.INP
	
####  Now run xds and convert output to mtz ########
	
		xds_par
		mv CORRECT.LP CORRECT_$j.LP
		mv XDS_ASCII.HKL XDS_ASCII_$j.HKL

	cd - > /dev/null
	done

done



