Generate XDS.INP: Difference between revisions

Jump to navigation Jump to search
→‎The script: version 0.91 (allow negative STARTING_ANGLE for Eiger)
(→‎The script: version 0.91 (allow negative STARTING_ANGLE for Eiger))
(36 intermediate revisions by 3 users not shown)
Line 10: Line 10:


== The script ==
== The script ==
<pre>


<pre>
#!/bin/bash                                                                   
#!/bin/bash                                                                   
# purpose: generate XDS.INP                                                   
# purpose: generate XDS.INP                                                   
Line 95: Line 95:
# revision 0.77 . KD 19/12/2017 obtain QX QY from CBF header.
# revision 0.77 . KD 19/12/2017 obtain QX QY from CBF header.
# revision 0.78 . KD 21/12/2017 if possible and sensible, provide LIB= line with hardcoded /usr/local/lib64/dectris-neggia.so .
# revision 0.78 . KD 21/12/2017 if possible and sensible, provide LIB= line with hardcoded /usr/local/lib64/dectris-neggia.so .
# revision 0.79 . KD 16/01/2018 read OVERLOAD from CBF header instead of fixing at 1048576  
# revision 0.79 . KD 16/01/2018 read OVERLOAD from Pilatus miniCBF header instead of fixing at 1048576
REVISION="0.79 (16-Jan-2018)"
# revision 0.80 . KD 13/02/2018 remove DISTANCE keyword from REFINE() list; remove POSITION from REFINE(IDXREF)
# revision 0.81 . KD 21/02/2018 when encountering CBF files from Eiger (ESRF), treat as Pilatus detector
# revision 0.82 . KD 01/03/2018 STARTING_ANGLE for MarCCD/Pilatus/PHOTON, enabling to use dials.rs_mapper with spot2pdb.
# revision 0.83 . KD 25/06/2018 for ADSC detector #458 at APS BM19, revert the definition of ROTATION_AXIS=-1 0 0. See "Beamline notes" in this wiki.
# revision 0.84 . KD 10/10/2018 implement Pilatus detector with d*TREK header
# revision 0.85 . Jie Nan 09/01/2019 STARTING_ANGLE for Eiger
# revision 0.86 . Keitaro 03/05/2019 Add PILATUS3 6M, S/N 60-0123 at SSRF BL18U-1 with ROTATION_AXIS=-1 0 0
# revision 0.87 . KD 12/10/2019 Add PILATUS XXX, S/N XX-XXX at SSRF BL19U1 and MarCCD detector #43 at BL17B1 with ROTATION_AXIS=-1 0 0
# revision 0.88 . KD 16/10/2019 fixes for SSRF, add "-maxdepth 1" to "find -H ..."
# revision 0.89 . KD 21/10/2019 add ADSC S/N 905 at ALS 8.2.1, S/N 928 at Australian Synchrotron MX2 beamline; final SSRF fixes
# revision 0.90 . KD 25/10/2019 add OLDMAR detector type. Tested w/ SBGrid data set 6. Anomalous signal may have wrong hand!
# revision 0.91 . KD 16/01/2020 Allow negative starting angle for Eiger (found -33 at SLS !).
REVISION="0.91 (16-Jan-2020)"


#                                                                                                             
#                                                                                                             
Line 106: Line 118:
# - for ADSC detectors, there are at least three ways to obtain ORGX and ORGY values from the header (see below);
# - for ADSC detectors, there are at least three ways to obtain ORGX and ORGY values from the header (see below);
# - the same might be a problem for MAR headers, too (not sure about this)  
# - the same might be a problem for MAR headers, too (not sure about this)  
# - on Mac OS X, Xcode (from http://developer.apple.com/tools/xcode) might be needed - not sure about this                             
# - on Mac OS X, the Xcode command line tools (from https://developer.apple.com/download/more/) are needed.                           
#                                                                                                                 
#                                                                                                                 
# notes for debugging of the script:                                                                             
# notes for debugging of the script:                                                                             
# - add the -v option to the first line, to see where an error occurs                                             
# - add the -x option to the first line, to see where an error occurs                                             
# - comment out the removal of tmp1 and tmp2 in the last line                                                     
# - comment out the removal of tmp1 and tmp2 in the last line                                                     
#                                                                                                                 
#                                                                                                                 
Line 122: Line 134:
#                                                                                                                 
#                                                                                                                 
# defaults:                                                                                                       
# defaults:                                                                                                       
#                                                                                                              
#      
# conversion radian / degrees:
DEGTOR=57.2957795
                                                                                                       
DETECTOR="XXX MINIMUM_VALID_PIXEL_VALUE=XXX OVERLOAD=XXX"                                                         
DETECTOR="XXX MINIMUM_VALID_PIXEL_VALUE=XXX OVERLOAD=XXX"                                                         
REVERSE_PHI="no"
REVERSE_PHI="no"
Line 142: Line 157:
# default FRACTION_OF_POLARIZATION
# default FRACTION_OF_POLARIZATION
pol_frac=0.98
pol_frac=0.98
STARTING_ANGLE=0
dtrek_det=""
SEPMIN=7.0
CLUSTER_RADIUS=3.5


dname=`echo "$1" | xargs dirname`
dname=`echo "$1" | xargs dirname`
Line 152: Line 171:
# cope with blanks in directory / file name
# cope with blanks in directory / file name
IFS=$'\n'
IFS=$'\n'
find -H $dname -name "$bname" -or -name "${bname}.bz2" -or -name "${bname}.gz" -or -name "${bname}.xz" | egrep -v "_00000.cbf|_000.img" | sort > tmp1
find -H $dname -maxdepth 1 -name "$bname" -or -name "${bname}.bz2" -or -name "${bname}.gz" -or -name "${bname}.xz" | egrep -v "_00000.cbf|_000.img" | sort > tmp1
if [ ! -s tmp1 ]
if [ ! -s tmp1 ]
then
then
Line 207: Line 226:
  # the reason is that FIRSTFRAME may contain a blank, which makes some commands fail                                                 
  # the reason is that FIRSTFRAME may contain a blank, which makes some commands fail                                                 
  egrep -qi 'marccd|Corrected' tmp2 && DET=mccd                                 
  egrep -qi 'marccd|Corrected' tmp2 && DET=mccd                                 
  grep -q PILATUS tmp2            && DET=pilatus                            
  grep -q PILATUS tmp2            && DET=pilatus  
grep -iq Eiger tmp2              && DET=pilatus                           
  head -n1 tmp2 | grep -q "^RAXIS" && DET=raxis
  head -n1 tmp2 | grep -q "^RAXIS" && DET=raxis
  head -n1 tmp2 | grep -q "^R-AXIS" && DET=raxis
  head -n1 tmp2 | grep -q "^R-AXIS" && DET=raxis
Line 214: Line 234:
  grep -q mar345 tmp2 && DET=MAR345     
  grep -q mar345 tmp2 && DET=MAR345     
  grep -q BRUKER tmp2 && grep -q CBF tmp2  && DET=Bruker-cbf   
  grep -q BRUKER tmp2 && grep -q CBF tmp2  && DET=Bruker-cbf   
  grep -q CMOS1 tmp2 && DET=adsc-CMOS1                  
  grep -q CMOS1 tmp2 && DET=adsc-CMOS1  
grep -q MARCONTROL tmp2 && DET=OLDMAR                   
else
else
  h5dump -d "/entry/instrument/detector/description" $FIRSTFRAME | grep -i Eiger > /dev/null && DET=eiger
  h5dump -d "/entry/instrument/detector/description" $FIRSTFRAME | grep -i Eiger > /dev/null && DET=eiger
Line 237: Line 258:
   # Check detector serial number and recognize beamline for reversed-phi setting.
   # Check detector serial number and recognize beamline for reversed-phi setting.
   # Known detectors for reversed-phi in SPring-8: 24: BL26B2 Mar225, 31: BL32XU MX225HE, 38: BL44XU MX225HE, 42: BL44XU MX300HE, 40: BL41XU MX225HE, 106: BL32XU MX225HS
   # Known detectors for reversed-phi in SPring-8: 24: BL26B2 Mar225, 31: BL32XU MX225HE, 38: BL44XU MX225HE, 42: BL44XU MX300HE, 40: BL41XU MX225HE, 106: BL32XU MX225HS
  # same for SSRF: BL17B1 rayonix MX300. As on 2019-10-13, this also needs doubling of ORGX and ORGY. But the beamline staff (Wenming) wants to fix the header.
   REVERSEPHI_SNs="
   REVERSEPHI_SNs="
24
24
Line 243: Line 265:
40
40
42
42
43
106
106
"
"
Line 263: Line 286:
   DETECTOR_DISTANCE=$(od -t dI -j $SKIP -N 4 tmp2 | head -1 | awk '{print $2}')
   DETECTOR_DISTANCE=$(od -t dI -j $SKIP -N 4 tmp2 | head -1 | awk '{print $2}')
   DETECTOR_DISTANCE=`echo "scale=3; $DETECTOR_DISTANCE/1000" | bc -l`                                     
   DETECTOR_DISTANCE=`echo "scale=3; $DETECTOR_DISTANCE/1000" | bc -l`                                     
                                                                                                         
 
  let SKIP=1024+256+128+256+44
  STARTING_ANGLE=$(od -t dI -j $SKIP -N 4 tmp2 | head -1 | awk '{print $2}')
  STARTING_ANGLE=`echo "scale=2; $STARTING_ANGLE/1000" | bc -l `
  echo STARTING_ANGLE= $STARTING_ANGLE 
                                                                                                     
   let SKIP=1024+256+128+256+4                                                                             
   let SKIP=1024+256+128+256+4                                                                             
   ORGX=$(od -t dI -j $SKIP -N 4 tmp2 | head -1 | awk '{print $2}')             
   ORGX=$(od -t dI -j $SKIP -N 4 tmp2 | head -1 | awk '{print $2}')             
Line 322: Line 350:
       BEAM_CENTER_X=`grep BEAM_CENTER_X tmp2 | sed s/BEAM_CENTER_X=//`
       BEAM_CENTER_X=`grep BEAM_CENTER_X tmp2 | sed s/BEAM_CENTER_X=//`
       BEAM_CENTER_Y=`grep BEAM_CENTER_Y tmp2 | sed s/BEAM_CENTER_Y=//`
       BEAM_CENTER_Y=`grep BEAM_CENTER_Y tmp2 | sed s/BEAM_CENTER_Y=//`
# fix 2010-04-26 - tell user about possible ORGX, ORGY alternatives -  
   
       COMMENT_ORGXY="
       COMMENT_ORGXY="
! Following are possible beam center interpretations for ADSC detectors"
! Following are possible beam center interpretations for ADSC detectors"
# at ESRF, PF, ALS 5.0.2 and ... (pls fill in!) the following should be used:         
# at ESRF, PF, ALS 5.0.2, AS MX2 and ... (pls fill in!) the following should be used:         
       ORGX1=`echo "scale=1; $BEAM_CENTER_Y/$QX" | bc -l`
       ORGX1=`echo "scale=1; $BEAM_CENTER_Y/$QX" | bc -l`
       ORGY1=`echo "scale=1; $BEAM_CENTER_X/$QX" | bc -l`
       ORGY1=`echo "scale=1; $BEAM_CENTER_X/$QX" | bc -l`
       echo - at ESRF, PF, APS Argonne BLs use: ORGX=$ORGX1 ORGY=$ORGY1                     
       echo - at ESRF, PF, ALS 8.2.1, APS Argonne BLs use: ORGX=$ORGX1 ORGY=$ORGY1                     
       COMMENT_ORGXY="${COMMENT_ORGXY}
       COMMENT_ORGXY="${COMMENT_ORGXY}
! ORGX= $ORGX1 ORGY= $ORGY1 ! For ESRF, PF, APS Argonne ..."
! ORGX= $ORGX1 ORGY= $ORGY1 ! For ESRF, PF, APS, AS MX2 ..."
# this 2nd alternative convention should be used at the following beamlines (pls complete the list): ALS 5.0.3, ...
# this 2nd alternative convention should be used at the following beamlines (pls complete the list): ALS 5.0.3, ...
       ORGX2=`echo "scale=1; $NX-$BEAM_CENTER_X/$QX" | bc -l `
       ORGX2=`echo "scale=1; $NX-$BEAM_CENTER_X/$QX" | bc -l `
Line 353: Line 381:
       # Decision of beam center convention based on detector serial numbers.
       # Decision of beam center convention based on detector serial numbers.
       DET_SN=`grep DETECTOR_SN tmp2 | sed -e "s/DETECTOR_SN=//"`
       DET_SN=`grep DETECTOR_SN tmp2 | sed -e "s/DETECTOR_SN=//"`
       # For convention 1; Known PF detectors = 449: NW12A Q210, 472: NE3A Q270, 474: BL17A Q270, 912: BL5A Q315, 923: ALS BL5.0.2 Q315, 933: AichiSR BL2S1 Q315, 916: APS 24 IDE
      echo Detector serial number is $DET_SN
       # For convention 1; Known PF detectors = 449: NW12A Q210, 472: NE3A Q270, 474: BL17A Q270, 912: BL5A Q315, 923: ALS BL5.0.2 Q315, 933: AichiSR BL2S1 Q315, 916: APS 24 IDE, 928: AS MX2
       ORG1_SNs="
       ORG1_SNs="
449
449
Line 364: Line 393:
446
446
916
916
905
928
"
"
       ORG4_SNs="
       ORG4_SNs="
Line 371: Line 402:
       ORGX=$ORGX1
       ORGX=$ORGX1
       ORGY=$ORGY1
       ORGY=$ORGY1
      echo the following was chosen based on detector serial number:
       elif echo "${DET_SN}${ORG4_SNs}" | sort | uniq -d | grep [0-9] > /dev/null; then
       elif echo "${DET_SN}${ORG4_SNs}" | sort | uniq -d | grep [0-9] > /dev/null; then
       ORGX=$ORGX4
       ORGX=$ORGX4
       ORGY=$ORGY4
       ORGY=$ORGY4
      echo the following was chosen based on detector serial number:
       else
       else
       ORGX=$ORGX3
       ORGX=$ORGX3
       ORGY=$ORGY3
       ORGY=$ORGY3
      echo the following default was chosen because the detector serial number was not special-cased:
       fi
       fi


       # Check detector serial number and recognize beamline for reversed-phi setting.
       # Check detector serial number and recognize beamline for reversed-phi setting.
       # Known detectors for reversed-phi in SPring-8: 915: BL38B1 Q315; APS 19-ID: 458; BM30A: 924
       # Known detectors for reversed-phi in SPring-8: 915: BL38B1 Q315; APS 19-ID: 458; BM30A: 924
      # 928 is at Australian Beamline MX2
      # revision 0.83 of this script removes 458 from the list!
       REVERSEPHI_SNs="
       REVERSEPHI_SNs="
915
915
458
924
924
928
"
"
       if echo "${DET_SN}${REVERSEPHI_SNs}" | sort | uniq -d | grep [0-9] > /dev/null; then
       if echo "${DET_SN}${REVERSEPHI_SNs}" | sort | uniq -d | grep [0-9] > /dev/null; then
Line 417: Line 453:
   mv tmp1 tmp2                                                               
   mv tmp1 tmp2                                                               
   OVERLOAD=1048574
   OVERLOAD=1048574
   grep -q Count_cutoff tmp2 && OVERLOAD=`awk '{print $2}' tmp2`
  SEPMIN=4
  CLUSTER_RADIUS=2
   grep -q Count_cutoff tmp2 && OVERLOAD=`awk '/Count_cutoff/{print $2}' tmp2`
   DETECTOR="PILATUS MINIMUM_VALID_PIXEL_VALUE=0 OVERLOAD= $OVERLOAD  !PILATUS"
   DETECTOR="PILATUS MINIMUM_VALID_PIXEL_VALUE=0 OVERLOAD= $OVERLOAD  !PILATUS"
   QX=0.172 QY=0.172                                                         
   QX=0.172 QY=0.172                                                         
Line 437: Line 475:
       ORGY=`grep Beam_xy tmp2 | sed -e s/\(// -e s/\)// -e s/\,// | awk '{print $3}'`
       ORGY=`grep Beam_xy tmp2 | sed -e s/\(// -e s/\)// -e s/\,// | awk '{print $3}'`


       # find DETECTOR_DISTANCE and OSCILLATION_RANGE:
       # find DETECTOR_DISTANCE, OSCILLATION_RANGE, and STARTING_ANGLE:
       DETECTOR_DISTANCE=`awk '/distance/{print $2}' tmp2`
       DETECTOR_DISTANCE=`awk '/Detector_distance/{print $2}' tmp2`
       DETECTOR_DISTANCE=`echo "$DETECTOR_DISTANCE*1000" | bc -l`
       DETECTOR_DISTANCE=`echo "$DETECTOR_DISTANCE*1000" | bc -l`


       OSCILLATION_RANGE=`awk '/Angle/{print $2}' tmp2`
       OSCILLATION_RANGE=`awk '/Angle_increment/{print $2}' tmp2`
 
      STARTING_ANGLE=`awk '/Start_angle/{print $2}' tmp2`
      echo STARTING_ANGLE= $STARTING_ANGLE 


       # get detector serial number and check if it is included in the list
       # get detector serial number and check if it is included in the list
Line 448: Line 489:
       # Known detectors for reversed-phi at MX2 beamline (Brazilian Synchrotron National Laboratory - LNLS)
       # Known detectors for reversed-phi at MX2 beamline (Brazilian Synchrotron National Laboratory - LNLS)
       # Known detectors for reversed-phi at CHESS F1 PILATUS3 6M, S/N 60-0127
       # Known detectors for reversed-phi at CHESS F1 PILATUS3 6M, S/N 60-0127
      # Known detectors for reversed-phi at SSRF BL18U1 (S/N 60-0123) and BL19U1 (S/N XX-XXX) (!; 2019-10-19: staff will fix this)
       DET_SN=`grep "Detector:" tmp2 | sed "s/^.*Detector: *//"`
       DET_SN=`grep "Detector:" tmp2 | sed "s/^.*Detector: *//"`
       REVERSEPHI_SNs="
       REVERSEPHI_SNs="
Line 454: Line 496:
PILATUS 2M, S/N 24-0109
PILATUS 2M, S/N 24-0109
PILATUS3 6M, S/N 60-0127
PILATUS3 6M, S/N 60-0127
PILATUS3 6M, S/N 60-0123
"
"
       if echo "${DET_SN}${REVERSEPHI_SNs}" | sort | uniq -d | grep [0-9] > /dev/null; then
       if echo "${DET_SN}${REVERSEPHI_SNs}" | sort | uniq -d | grep [0-9] > /dev/null; then
         REVERSE_PHI="yes"
         REVERSE_PHI="yes"
      fi
      if [ "$DET_SN" == "PILATUS XXX, S/N XX-XXX" ] ; then
        REVERSE_PHI="yes"
        echo inverted rotation axis at SSRF BL19U1
       fi
       fi
        
        
Line 486: Line 533:
   DETECTOR_DISTANCE=`h5dump -d "/entry/instrument/detector/detector_distance" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'`
   DETECTOR_DISTANCE=`h5dump -d "/entry/instrument/detector/detector_distance" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'`
   OSCILLATION_RANGE=`h5dump -d "/entry/sample/goniometer/omega_range_average" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'`
   OSCILLATION_RANGE=`h5dump -d "/entry/sample/goniometer/omega_range_average" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'`
 
  #STARTING_ANGLE:
  # the \- was introduced in version 0.91 :
  STARTING_ANGLE=`h5dump -d "/entry/sample/goniometer/omega_start" $FIRSTFRAME | awk '/\(0\): [\-0-9]/{print $2}'`


   # If rotation vector set (NeXus)
   # If rotation vector set (NeXus)
   rotation_axis=`h5dump -a "/entry/sample/transformations/omega/vector" $FIRSTFRAME 2>/dev/null | grep "(0):" | sed -e "s/^.*://; s/,//g"`
   rotation_axis=`h5dump -a "/entry/sample/transformations/omega/vector" $FIRSTFRAME 2>/dev/null | grep "(0):" | sed -e "s/^.*://; s/,//g"`
  # Eiger 16M SSRF BL17U1
  SN=`h5dump -d "/entry/instrument/detector/detector_number" $FIRSTFRAME | awk '/\(0\): /{print $2}' | sed s/\"//g`
  if [ "$SN" == "E-32-0111" ]; then
    rotation_axis="-1 0 0"
    echo SSRF BL17U1 with inverted rotation axis
  fi
  SEPMIN=4
  CLUSTER_RADIUS=2
    
    
elif [ "$DET" == "raxis" ]; then
elif [ "$DET" == "raxis" ]; then
Line 512: Line 572:


elif [ "$DET" == "dtrek" ]; then
elif [ "$DET" == "dtrek" ]; then
   echo "Data from a RAXIS or Saturn detector with dTREK format"
   echo "Data from a RAXIS or Saturn or Pilatus detector with dTREK format"


   sed s/\;// tmp2 > tmp1
   sed s/\;// tmp2 > tmp1
Line 518: Line 578:


   dname=`grep "DETECTOR_NAMES=" tmp2 | sed -e "s/.*=//"`
   dname=`grep "DETECTOR_NAMES=" tmp2 | sed -e "s/.*=//"`
 
  flip=1
   if [ "$dname" == "CCD_" ]; then
   if [ "$dname" == "CCD_" ]; then
     DETECTOR="SATURN MINIMUM_VALID_PIXEL_VALUE=1"
     DETECTOR="SATURN MINIMUM_VALID_PIXEL_VALUE=1"
Line 535: Line 595:
     echo ""
     echo ""
   fi
   fi
   else # should be RX_
   elif [ "$dname" == "PILT_" ]; then
    DETECTOR="PILATUS MINIMUM_VALID_PIXEL_VALUE=0"
    dtrek_det="pilatus"
    SEPMIN=3
    CLUSTER_RADIUS=1.5
    rotation_axis="0 1 0"  # TODO: read from header
    flip=-1
    SENSOR_THICKNESS=0.45  # TODO: read from header
# 2theta
    TWOTHETA=`awk '/PILT_GONIO_VALUES=/{print $2}' tmp2`
    echo TWOTHETA=$TWOTHETA
    R1=`echo "scale=7;  c($TWOTHETA/$DEGTOR)" | bc -l`
    R3=`echo "scale=7; -s($TWOTHETA/$DEGTOR)" | bc -l`
    DIRECTION_OF_DETECTOR_X_AXIS="$R1 0 $R3"
  elif [ "$dname" == "RX_" ]; then
     DETECTOR="RAXIS MINIMUM_VALID_PIXEL_VALUE=0"
     DETECTOR="RAXIS MINIMUM_VALID_PIXEL_VALUE=0"
     dtrek_det="raxis"
     dtrek_det="raxis"
  else
    DETECTOR="XXX MINIMUM_VALID_PIXEL_VALUE=XXX"
    dtrek_det="unknown"
   fi
   fi
   # find OVERLOAD
   # find OVERLOAD
   SATURATED_VALUE=`grep SATURATED_VALUE tmp2 | head -1 | sed s/SATURATED_VALUE=//`
   SATURATED_VALUE=`grep SATURATED_VALUE tmp2 | head -1 | sed s/SATURATED_VALUE=//`
Line 569: Line 645:
   idx=$((i-1))
   idx=$((i-1))
   if [ "${GONIO_NAMES[$idx]}" == "Distance" ]; then
   if [ "${GONIO_NAMES[$idx]}" == "Distance" ]; then
    DETECTOR_DISTANCE="${GONIO_VALUES[$idx]}"
    # TODO: Check unit!! - ${GONIO_UNITS[$idx]}
  fi
  if [ $flip -gt 0 ]; then
     DETECTOR_DISTANCE="-${GONIO_VALUES[$idx]}"
     DETECTOR_DISTANCE="-${GONIO_VALUES[$idx]}"
     # TODO: Check unit!! - ${GONIO_UNITS[$idx]}
     # TODO: Check unit!! - ${GONIO_UNITS[$idx]}
    echo "using distance <0"
   fi
   fi
   done
   done
Line 598: Line 679:
  X_RAY_WAVELENGTH=`grep 'WAVELENGTH' tmp2 | awk '{print $2}'`  
  X_RAY_WAVELENGTH=`grep 'WAVELENGTH' tmp2 | awk '{print $2}'`  
  OSCILLATION_RANGE=`grep 'PHI' tmp2 | awk '{print $5-$3}'`     
  OSCILLATION_RANGE=`grep 'PHI' tmp2 | awk '{print $5-$3}'`     
  TRUSTED_REGION="0 0.99"         
  TRUSTED_REGION="0 0.99"  
 
elif [ "$DET" == "OLDMAR" ]; then
 
echo  "Data from old type MAR image plate detector"
DETECTOR="MAR  MINIMUM_VALID_PIXEL_VALUE=0  OVERLOAD=130000"
NX=`awk 'NR==2 {print $2}' tmp2`
NY=$NX
QX=`awk 'NR==2 {print $15}' tmp2`
QY=$QX
ORGX=`awk 'NR==2 {print $19}' tmp2`
ORGY=`awk 'NR==2 {print $20}' tmp2`
DETECTOR_DISTANCE=`awk 'NR==2 {print $22}' tmp2`             
X_RAY_WAVELENGTH=`awk 'NR==2 {print $21}' tmp2`
OSCILLATION_RANGE=`awk 'NR==2 {print $24-$23}' tmp2`   
TRUSTED_REGION="0 0.99" 
rotation_axis="0 1 0" 
echo unsure if sign of anomalous signal is correct - please verify or try both hands!
        
elif [ "$DET" == "Bruker-cbf" ]; then
elif [ "$DET" == "Bruker-cbf" ]; then
    
    
  echo  "Data from a Bruker-cbf detector"
  echo  "Data from a Bruker-cbf detector"
# conversion radian / degrees:
DEGTOR=57.2957795
# MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT:
# MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT:
  MNOPIAS=6  
  MNOPIAS=6  
Line 634: Line 731:
  DELTAPHI=`awk '/PHI \? \? \?/{printf "%5.4f",$6}' tmp2`
  DELTAPHI=`awk '/PHI \? \? \?/{printf "%5.4f",$6}' tmp2`
  KAPPA=`awk '/CHI \? \? \?/{print $5}' tmp2`
  KAPPA=`awk '/CHI \? \? \?/{print $5}' tmp2`
echo OMEGA DELTAOMEGA PHI DELTAPHI KAPPA= $OMEGA $DELTAOMEGA $PHI $DELTAPHI $KAPPA
# echo OMEGA DELTAOMEGA PHI DELTAPHI KAPPA= $OMEGA $DELTAOMEGA $PHI $DELTAPHI $KAPPA
 
# test whether the absolute value of deltaphi is > absolute value of deltaomega
# test whether the absolute value of deltaphi is > absolute value of deltaomega
  if (( $(echo "${DELTAPHI}^2 > ${DELTAOMEGA}^2"|bc -l) )); then
  if (( $(echo "${DELTAPHI}^2 > ${DELTAOMEGA}^2"|bc -l) )); then
Line 643: Line 741:
     rotation_axis="$R1 $R2 $R3"
     rotation_axis="$R1 $R2 $R3"
     OSCILLATION_RANGE=${DELTAPHI}
     OSCILLATION_RANGE=${DELTAPHI}
    STARTING_ANGLE=${PHI}
# here we could check if DELTAPHI is <0, and if so, negate it and rotation_axis
# here we could check if DELTAPHI is <0, and if so, negate it and rotation_axis
  else
  else
Line 648: Line 747:
     rotation_axis="0 -1 0"
     rotation_axis="0 -1 0"
     OSCILLATION_RANGE=${DELTAOMEGA}
     OSCILLATION_RANGE=${DELTAOMEGA}
    STARTING_ANGLE=${OMEGA}
# here we could check if DELTAOMEGA is <0, and if so, negate it and rotation_axis
# here we could check if DELTAOMEGA is <0, and if so, negate it and rotation_axis
  fi
  fi
echo STARTING_ANGLE= $STARTING_ANGLE        ! only read by IDXREF               
# 2theta
# 2theta
   TWOTHETA=`awk '/TWOTHETA \? \? \?/{print $5}' tmp2`
   TWOTHETA=`awk '/TWOTHETA \? \? \?/{print $5}' tmp2`
Line 664: Line 766:
echo ORGX= $ORGX ORGY= $ORGY - check these values with adxv !
echo ORGX= $ORGX ORGY= $ORGY - check these values with adxv !
echo DETECTOR_DISTANCE= $DETECTOR_DISTANCE  ! only read by XYCORR, IDXREF                     
echo DETECTOR_DISTANCE= $DETECTOR_DISTANCE  ! only read by XYCORR, IDXREF                     
echo OSCILLATION_RANGE= $OSCILLATION_RANGE  ! only read by IDXREF                
echo OSCILLATION_RANGE= $OSCILLATION_RANGE  ! only read by IDXREF  
echo X-RAY_WAVELENGTH= $X_RAY_WAVELENGTH    ! only read by IDXREF                   
echo X-RAY_WAVELENGTH= $X_RAY_WAVELENGTH    ! only read by IDXREF                   


Line 675: Line 777:
$COMMENT_ORGXY
$COMMENT_ORGXY
DETECTOR_DISTANCE= $DETECTOR_DISTANCE !read by XYCORR, IDXREF. Negative if detector normal points to crystal.               
DETECTOR_DISTANCE= $DETECTOR_DISTANCE !read by XYCORR, IDXREF. Negative if detector normal points to crystal.               
OSCILLATION_RANGE= $OSCILLATION_RANGE                  
OSCILLATION_RANGE= $OSCILLATION_RANGE  
STARTING_ANGLE= $STARTING_ANGLE               
X-RAY_WAVELENGTH= $X_RAY_WAVELENGTH                       
X-RAY_WAVELENGTH= $X_RAY_WAVELENGTH                       
NAME_TEMPLATE_OF_DATA_FRAMES=$NAME_TEMPLATE_OF_DATA_FRAMES
NAME_TEMPLATE_OF_DATA_FRAMES=$NAME_TEMPLATE_OF_DATA_FRAMES
Line 707: Line 810:
STRONG_PIXEL=4          ! COLSPOT: only use strong reflections (default is 3)
STRONG_PIXEL=4          ! COLSPOT: only use strong reflections (default is 3)
MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT=$MNOPIAS ! default of 6 is sometimes too high
MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT=$MNOPIAS ! default of 6 is sometimes too high
! close spots/long cell axis: reduce SEPMIN and CLUSTER_RADIUS from their defaults of 6 and 3
! close spots/long cell axis: reduce SEPMIN and CLUSTER_RADIUS from their defaults of 7 and 3.5
! SEPMIN=4 CLUSTER_RADIUS=2 ! should be default for Pilatus and other detectors with low PSF
SEPMIN=$SEPMIN CLUSTER_RADIUS=$CLUSTER_RADIUS ! 4 and 2 for Pixel Array Detectors
! since XDS 01-MAR-2015, POSITION supersedes DISTANCE. DISTANCE only for compatibility w/ old XDS.
! since XDS 01-MAR-2015, POSITION supersedes DISTANCE.
! nowadays headers are usually correct so refine DISTANCE/POSITION in INTEGRATE but not IDXREF
! nowadays headers are usually correct so refine POSITION in INTEGRATE but not IDXREF if low to medium resolution
REFINE(IDXREF)=CELL BEAM ORIENTATION AXIS POSITION ! works best with XDS >= BUILT=20170720
! however, if the spots from COLSPOT extend to 2A then POSITION could, and if 1.5A POSITION should be refined
REFINE(INTEGRATE)= DISTANCE POSITION BEAM ORIENTATION ! AXIS CELL
REFINE(IDXREF)=CELL BEAM ORIENTATION AXIS  ! add POSITION if high resolution, or DETECTOR_DISTANCE inaccurate
! REFINE(CORRECT)=CELL BEAM ORIENTATION AXIS DISTANCE POSITION ! Default is: refine everything
REFINE(INTEGRATE)= POSITION BEAM ORIENTATION ! AXIS CELL . If 1.5A or higher it is ok to refine CELL
! REFINE(CORRECT)=CELL BEAM ORIENTATION AXIS POSITION ! Default is: refine everything


! parameters specifically for this detector and beamline:
! parameters specifically for this detector and beamline:
Line 731: Line 835:
   else
   else
     echo !LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP
     echo !LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP
     echo /usr/local/lib64/dectris-neggia.so was not found!
     echo /usr/local/lib64/dectris-neggia.so was not found - specify location manually!
   fi
   fi
fi  
fi  
Line 748: Line 852:
   echo "ROTATION_AXIS= $rotation_axis  ! only read by IDXREF" >> XDS.INP
   echo "ROTATION_AXIS= $rotation_axis  ! only read by IDXREF" >> XDS.INP
  elif [ "$REVERSE_PHI" == "no" ]; then
  elif [ "$REVERSE_PHI" == "no" ]; then
   echo 'ROTATION_AXIS=1 0 0  ! Australian Synchrotron, SERCAT ID-22 (?), APS 19-ID (?), ESRF BM30A, SPring-8, SSRF BL17U need -1 0 0. Diamond ID24 needs 0 -1 0' >> XDS.INP
   echo 'ROTATION_AXIS=1 0 0  ! Australian Synchrotron, SERCAT ID-22 (?), APS 19-ID (?), ESRF BM30A, SPring-8, SSRF need -1 0 0. Diamond ID24 needs 0 -1 0' >> XDS.INP
  else
  else
   echo 'ROTATION_AXIS=-1 0 0  ! if this is wrong, please contact author.' >> XDS.INP
   echo 'ROTATION_AXIS=-1 0 0  ! if this is wrong, please contact author.' >> XDS.INP
Line 792: Line 896:
elif [ "$DET" == "pilatus" -o "$DET" == "eiger" ]; then
elif [ "$DET" == "pilatus" -o "$DET" == "eiger" ]; then
cat >> XDS.INP << eof
cat >> XDS.INP << eof
SEPMIN=4 CLUSTER_RADIUS=2
NUMBER_OF_PROFILE_GRID_POINTS_ALONG_ALPHA/BETA=13 ! Default is 9 - Increasing may improve data  
NUMBER_OF_PROFILE_GRID_POINTS_ALONG_ALPHA/BETA=13 ! Default is 9 - Increasing may improve data  
NUMBER_OF_PROFILE_GRID_POINTS_ALONG_GAMMA=13      ! accuracy, particularly if finely-sliced on phi,  
NUMBER_OF_PROFILE_GRID_POINTS_ALONG_GAMMA=13      ! accuracy, particularly if finely-sliced on phi,  
Line 887: Line 990:
echo BKGPIX.cbf, and the agreement of predicted and observed spots in FRAME.cbf!
echo BKGPIX.cbf, and the agreement of predicted and observed spots in FRAME.cbf!
rm -f tmp1 tmp2
rm -f tmp1 tmp2
# end of generate_XDS.INP
</pre>
</pre>


Line 900: Line 1,002:
By using your own file, you can easily update to the latest revision, or even change the script, without having to bother the system administrator.
By using your own file, you can easily update to the latest revision, or even change the script, without having to bother the system administrator.


On Mac OS X, installation of the "Command Line Tools" (from http://developer.apple.com/downloads; requires Apple ID) is required. These are also part of the (larger, but also free) [http://developer.apple.com/tools/xcode Xcode] package. This package comes with a license that has to be accepted by the user when running a Command Line Tool for the first time.
See also [[Generate_XDS.INP#Dependencies]] below, and the [[Installation]] article.
 
See also the [[Installation]] article.


== Obtaining generate_XDS.INP from this webpage ==
== Obtaining generate_XDS.INP from this webpage ==
Line 939: Line 1,039:
The script will only work if all the required commands are available. They reside in either the <code>coreutils</code> RPM, or specific RPMs (<code>gawk, sed, bc, grep, python</code> ...). Please note that to get the <code>strings</code> command on some Linux distributions (e.g. FC23) you need to install the <code>binutils</code> RPM package.
The script will only work if all the required commands are available. They reside in either the <code>coreutils</code> RPM, or specific RPMs (<code>gawk, sed, bc, grep, python</code> ...). Please note that to get the <code>strings</code> command on some Linux distributions (e.g. FC23) you need to install the <code>binutils</code> RPM package.
For Eiger data processing, the <code>h5dump</code> program must be installed. This is part of <code>hdf5-tools</code> (Ubuntu) or <code>hdf5</code> (RHEL).
For Eiger data processing, the <code>h5dump</code> program must be installed. This is part of <code>hdf5-tools</code> (Ubuntu) or <code>hdf5</code> (RHEL).
On Mac OS X, installation of the "Command Line Tools" (from http://developer.apple.com/downloads; requires Apple ID) is required. These are also part of the (larger, but also free) [http://developer.apple.com/tools/xcode Xcode] package. This package comes with a license that has to be accepted by the user when running a Command Line Tool (e.g. <code>strings</code>) for the first time.


An easy way to check for missing programs is
An easy way to check for missing programs is
Line 947: Line 1,049:
and for Ubuntu this would be (untested!)
and for Ubuntu this would be (untested!)
  sudo apt-get install coreutils binutils gawk sed bc grep python hdf5-tools
  sudo apt-get install coreutils binutils gawk sed bc grep python hdf5-tools
See also [[Installation]].


== Limitations ==
== Limitations ==


* The script tries to interpret the header of the frames, so is currently limited to Dectris (Pilatus, Eiger), ADSC (Quantum), Rigaku (several types), MAR (CCD and image plate) detectors, and one Bruker detector. Other detectors need some values to be manually filled into XDS.INP - the relevant places are marked with XXX. These are detector properties (type, pixel size and number, min and max counts in a pixel), and experimental parameters like oscillation range, wavelength, distance, and direct beam position (or rather: point of detector that is closest to the crystal). For fine-tuning of detector parameters, see the [http://xds.mpimf-heidelberg.mpg.de/html_doc/xds_prepare.html detector-specific templates].
* The script tries to interpret the header of the frames, so is currently limited to Dectris (Pilatus, Eiger), ADSC (Quantum), Rigaku (several types), MAR (CCD and image plate) detectors, and one Bruker detector. Other detectors need some values to be manually filled into XDS.INP - the relevant places are marked with XXX. These are detector properties (type, pixel size and number, min and max counts in a pixel), and experimental parameters like ROTATION_AXIS, OSCILLATION_RANGE, X-RAY_WAVELENGTH, DETECTOR_DISTANCE, and XORG, YORG. For fine-tuning of detector parameters, see the [http://xds.mpimf-heidelberg.mpg.de/html_doc/xds_prepare.html detector-specific templates].
* The authors have made a "best effort" to provide a XDS.INP that results in the correct sign of the anomalous signal. In the case of one detector type (internally called Rigaku SMV) this requires reversal of one detector axis, and a negative DETECTOR_DISTANCE, as is found in some of the [http://xds.mpimf-heidelberg.mpg.de/html_doc/xds_prepare.html detector-specific templates]. '''For an unusual or unknown detector setup, the correct sign of the anomalous signal needs to be established and verified e.g. with a good dataset from a test crystal that has a anomalous signal.''' The authors do not take any responsibility for problems arising from incorrect sign of the anomalous signal, nor - obviously! - for any other mischief arising in or from data processing.
* The authors have made a "best effort" to provide a XDS.INP that results in the correct sign of the anomalous signal. In the case of one detector type (internally called Rigaku SMV) this requires reversal of one detector axis, and a negative DETECTOR_DISTANCE, as is found in some of the [http://xds.mpimf-heidelberg.mpg.de/html_doc/xds_prepare.html detector-specific templates]. '''For an unusual or unknown detector setup, the correct sign of the anomalous signal needs to be established and verified e.g. with a good dataset from a test crystal that has a anomalous signal.''' The authors do not take any responsibility for problems arising from incorrect sign of the anomalous signal, nor - obviously! - for any other mischief arising in or from data processing.
* At some beamlines, the ROTATION_AXIS should be -1 0 0 ("backwards") instead of the usual 1 0 0 ("horizontal"), or even 0 1 0 ("vertical") like at one of the PETRA Hamburg BLs. We have only just started the article [[Beamline notes]], and the frame headers do not have this information, so the default chosen by [[generate_XDS.INP]] may be wrong and need manual correction.
* At some beamlines, the ROTATION_AXIS should be -1 0 0 ("backwards") instead of the usual 1 0 0 ("horizontal"), or even 0 1 0 ("vertical") like at one of the PETRA Hamburg BLs. We have only just started the article [[Beamline notes]], and the frame headers do not have this information, so the default chosen by [[generate_XDS.INP]] may be wrong and need manual correction.
Line 959: Line 1,063:
* GlobalPhasing's list of beamlines and their settings is at http://www.globalphasing.com/autoproc/wiki/index.cgi?BeamlineSettings .
* GlobalPhasing's list of beamlines and their settings is at http://www.globalphasing.com/autoproc/wiki/index.cgi?BeamlineSettings .
* [[Beamline notes]] to collect information about specific settings
* [[Beamline notes]] to collect information about specific settings
* [[spot2pdb]] for visualizing reciprocal space
2,652

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.

Navigation menu