Generate XDS.INP: Difference between revisions
| (15 intermediate revisions by the same user not shown) | |||
| Line 10: | Line 10: | ||
== The script ==  | == The script ==  | ||
<pre>  | <pre>  | ||
| Line 119: | Line 120: | ||
# revision 1.01 . KD 07/12/2020 ROTATION_AXIS=0 -1 0 for Pilatus3 2M, S/N 24-0118 at ID23-2 (http://www.globalphasing.com/autoproc/wiki/index.cgi?BeamlineSettings)  | # revision 1.01 . KD 07/12/2020 ROTATION_AXIS=0 -1 0 for Pilatus3 2M, S/N 24-0118 at ID23-2 (http://www.globalphasing.com/autoproc/wiki/index.cgi?BeamlineSettings)  | ||
# revision 1.02 . KD 11/01/2021 recognize mar555 detector as mar345 (thanks to Thomas Hauß, HZB)    | # revision 1.02 . KD 11/01/2021 recognize mar555 detector as mar345 (thanks to Thomas Hauß, HZB)    | ||
REVISION="1.  | # revision 1.03 . Feng Yu 18/7/2021 fix/expand information about Shanghai Synchrotron Radiation Facility (SSRF)  | ||
# revision 1.04 . Zhipu Luo 13/08/2021 extract ORGX,ORGY for electron diffraction from SMV header if the wavelength value starts with 0.0   | |||
# revision 1.05 . KD specialcase extraction of number of images for BNL detectors E-32-0101 and E-18-0104  | |||
# revision 1.06 . KD fix URLs in output. Availability of Apple M1 processor dectris-neggia-Apple-arm64.so . LC_ALL=C .  | |||
# revision 1.07 . KD, Thomas Hauß, Gleb Bourenkov 25/10/2021. Detector moved from Petra P14 to P13  | |||
# revision 1.08 . KD, Thomas Hauß, Feng Yu 7/11/2021 fix TZ in timestamps for SSRF detectors  | |||
# revision 1.09 . KD, Feng Yu 7/11/2021 fix detector number BNL E-18-0121 to be E-18-0104  | |||
REVISION="1.09 (9-NOV-2021)"  | |||
#                                                                                                               | #                                                                                                               | ||
| Line 143: | Line 151: | ||
   exit                                                                                                              |    exit                                                                                                              | ||
fi                                                                                                                  | fi                                                                                                                  | ||
# make sure the locale does not interfere with e.g. awk calculations:  | |||
LC_ALL="C";export LC_ALL  | |||
#                                                                                                                   | #                                                                                                                   | ||
# defaults:                                                                                                         | # defaults:                                                                                                         | ||
| Line 172: | Line 182: | ||
SEPMIN=7.0  | SEPMIN=7.0  | ||
CLUSTER_RADIUS=3.5  | CLUSTER_RADIUS=3.5  | ||
REFINE_CORRECT="CELL BEAM ORIENTATION AXIS POSITION ! Default is: refine everything"  | |||
dname=`echo "$1" | xargs dirname`  | dname=`echo "$1" | xargs dirname`  | ||
| Line 201: | Line 212: | ||
  data_last=`cut -b $pos1-$pos2 tmp1 | tail -n1 | bc`  |   data_last=`cut -b $pos1-$pos2 tmp1 | tail -n1 | bc`  | ||
  DATA_RANGE="$data_first $data_last"  |   DATA_RANGE="$data_first $data_last"  | ||
 echo DATA_RANGE=$DATA_RANGE  | |||
  # set SPOT_RANGE to first half of DATA_RANGE  |   # set SPOT_RANGE to first half of DATA_RANGE  | ||
| Line 212: | Line 224: | ||
FIRSTFRAME=`head -1 tmp1`  | FIRSTFRAME=`head -1 tmp1`  | ||
echo $FIRSTFRAME | grep "\.h5$" && is_h5=1 || is_h5=0  | echo $FIRSTFRAME | grep "\.h5$" && is_h5=1 || is_h5=0  | ||
# find out detector type  | # find out detector type  | ||
| Line 248: | Line 251: | ||
  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   |   grep -q MARCONTROL tmp2 && DET=OLDMAR    | ||
 grep -q "WAVELENGTH=0.0" tmp2 && DET=experimental-ED                                       | |||
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 468: | Line 472: | ||
   DETECTOR_DISTANCE=`grep ^DISTANCE tmp2 | sed s/DISTANCE=/-/`                                                                        |    DETECTOR_DISTANCE=`grep ^DISTANCE tmp2 | sed s/DISTANCE=/-/`                                                                        | ||
   OSCILLATION_RANGE=`grep OMEGA_DELTA tmp2 | sed s/OMEGA_DELTA=//`     |    OSCILLATION_RANGE=`grep OMEGA_DELTA tmp2 | sed s/OMEGA_DELTA=//`     | ||
   DIRECTION_OF_DETECTOR_X_AXIS="-1 0 0"                                                                    |    DIRECTION_OF_DETECTOR_X_AXIS="-1 0 0"    | ||
elif [ "$DET" == "experimental-ED" ]; then  | |||
  DETECTOR="ADSC MINIMUM_VALID_PIXEL_VALUE= 1 OVERLOAD= 65000  ! OVERLOAD is really unknown "  | |||
  echo --- Electron diffraction data in SMV format!  | |||
  SENSOR_THICKNESS=0.01                                                          | |||
  sed s/\;// tmp2 > tmp1                                                         | |||
  mv tmp1 tmp2                                                                   | |||
  X_RAY_WAVELENGTH=`grep WAVELENGTH tmp2 | head -1 | sed s/WAVELENGTH=//`  | |||
  NX=`grep SIZE1 tmp2 | tail -1 | sed s/SIZE1=//`  | |||
  QX=`grep PIXEL_SIZE tmp2 | sed s/PIXEL_SIZE=//`  | |||
  NY=`grep SIZE2 tmp2 | tail -1 | sed s/SIZE2=//`                                               | |||
  QY=$QX    | |||
  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=//`   | |||
  QXY=`echo "scale=1; $QX*($BEAM_CENTER_X+$BEAM_CENTER_Y)" | bc -l`  | |||
      if [ "$QXY" "<" "$BEAM_CENTER_X" ] ; then  | |||
       ORGX=`echo "scale=2; $BEAM_CENTER_Y/$QX" | bc -l`  | |||
       ORGY=`echo "scale=2; $BEAM_CENTER_X/$QX" | bc -l`  | |||
      else  | |||
       ORGX=`echo "scale=2; $BEAM_CENTER_X/1" | bc -l`  | |||
       ORGY=`echo "scale=2; $BEAM_CENTER_Y/1" | bc -l`  | |||
      fi  | |||
  DETECTOR_DISTANCE=`grep ^DISTANCE tmp2 | sed s/DISTANCE=//`                                                                       | |||
  OSCILLATION_RANGE=`grep OSC_RANGE tmp2 | sed s/OSC_RANGE=//`   | |||
  STARTING_ANGLE=`grep OSC_START tmp2 | sed s/OSC_START=//`   | |||
  echo --- For TIMEPIX detector, please fix ROTATION_AXIS yourself!  | |||
  DIRECTION_OF_DETECTOR_X_AXIS="1 0 0"   | |||
  REFINE_CORRECT="ORIENTATION CELL AXIS BEAM ! for ED, no POSITION when CELL is refined"  | |||
elif [ "$DET" == "pilatus" ]; then  | elif [ "$DET" == "pilatus" ]; then  | ||
| Line 485: | Line 517: | ||
       # find SENSOR_THICKNESS:  |        # find SENSOR_THICKNESS:  | ||
       SENSOR_THICKNESS=`grep thickness tmp2 | sed -e s/'  |        SENSOR_THICKNESS=`grep thickness tmp2 | sed -e s/'Si.* sensor, thickness'// | awk '{print $1*1000}'`  | ||
       # find X_RAY_WAVELENGTH:                                                                                  |        # find X_RAY_WAVELENGTH:                                                                                  | ||
       X_RAY_WAVELENGTH=`grep Wavelength tmp2 | sed -e s/Wavelength// -e s/A// | awk '{print $1}'`               |        X_RAY_WAVELENGTH=`grep Wavelength tmp2 | sed -e s/Wavelength// -e s/A// | awk '{print $1}'`               | ||
| Line 537: | Line 569: | ||
       fi  |        fi  | ||
# PETRA P14: raw data from Eiger are stored as CBF files so this is treated as Pilatus  | # PETRA P14: raw data from Eiger are stored as CBF files so this is treated as Pilatus  | ||
       if [   |        if [ "$DET_SN" == "Dectris Eiger 4M, E-08-0107" -o "$DET_SN" == "PILATUS 6M-F, S/N 60-0115-F" ] ; then  | ||
         rotation_axis="0 -1 0"  |          rotation_axis="0 -1 0"  | ||
         echo ROTATION_AXIS="0 -1 0" at PETRA P14  |          echo ROTATION_AXIS="0 -1 0" at PETRA P14  | ||
      fi  | |||
# similarly, Eiger 16M at PETRA P14 until May 22, 2021  | |||
      if [ "$DET_SN" == "Dectris Eiger 16M, E-32-0107" ] ; then  | |||
        egrep -q '^# 2020-|^# 2021-0[1-5]|^# 2021-06-[01]|^# 2021-06-2[01]' tmp2 || isatP13=1  | |||
        if [ "$isatP13" == 1 ] ; then  | |||
          echo using the default ROTATION_AXIS=1 0 0 at PETRA P13  | |||
        else  | |||
          rotation_axis="0 -1 0"  | |||
          echo ROTATION_AXIS="0 -1 0" at PETRA P14  | |||
        fi  | |||
       fi  |        fi  | ||
# ESRF ID23-2:  | # ESRF ID23-2:  | ||
| Line 548: | Line 590: | ||
elif [ "$DET" == "eiger" ]; then  | elif [ "$DET" == "eiger" ]; then  | ||
 nframes=`h5dump -d "/entry/instrument/detector/detectorSpecific/nimages" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'`  | |||
 DATA_RANGE="1 $nframes"  | |||
 SPOT_RANGE="1 `echo "scale=0; if (${nframes}<2) 1; if (${nframes}>1) ${nframes}/2"|bc -l`"  | |||
# find out if HDF5 from Diamond (DLS=1) or Dectris (DLS=0)  | # find out if HDF5 from Diamond (DLS=1) or Dectris (DLS=0)  | ||
   DLS=0  |    DLS=0  | ||
| Line 567: | Line 613: | ||
   # STARTING_ANGLE:  the \- was introduced in version 0.91 to allow negative values :  |    # STARTING_ANGLE:  the \- was introduced in version 0.91 to allow negative values :  | ||
     STARTING_ANGLE=`h5dump -d "/entry/sample/goniometer/omega_start" $FIRSTFRAME | awk '/\(0\): [\-0-9]/{print $2}'`  |      STARTING_ANGLE=`h5dump -d "/entry/sample/goniometer/omega_start" $FIRSTFRAME | awk '/\(0\): [\-0-9]/{print $2}'`  | ||
  # /entry/sample/goniometer/omega_start is missing in some eiger2 detectors (e.g. Eiger2 9M with fw version release-2020.2.1 and SIMPLON API 1.8) (Feng YU 2021-07-18)  | |||
    if [ "$STARTING_ANGLE" == "" ]; then  | |||
		  echo "/entry/sample/goniometer/omega_start not found, try /entry/sample/goniometer/omega"  | |||
		  STARTING_ANGLE=`h5dump -d /entry/sample/goniometer/omega $FIRSTFRAME | grep "(0):" | head -n 1 | awk '{print $2}' | sed -e "s/,//g"`  | |||
    fi  | |||
    echo "STARTING_ANGLE=$STARTING_ANGLE"  | |||
   # 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"`  | ||
   #   |    # EIGER2 16M CHESS ID7B2 has S/N E-32-0123 (A. Finke 2020-11-07) v0.99  | ||
     SN=`h5dump -d "/entry/instrument/detector/detector_number" $FIRSTFRAME | awk '/\(0\): /{print $2}' | sed s/\"//g`  |      SN=`h5dump -d "/entry/instrument/detector/detector_number" $FIRSTFRAME | awk '/\(0\): /{print $2}' | sed s/\"//g`  | ||
     if   |      if [ "$SN" == "E-32-0123" ]; then  | ||
       rotation_axis="-1 0 0"  |        rotation_axis="-1 0 0"  | ||
       echo SSRF BL17U1   |        echo CHESS ID7B2 with inverted rotation axis  | ||
     fi    |     fi  | ||
  # SSRF BL17U1 and SSRF BL10U2 (Feng YU 2021-07-18)  | |||
  # Eiger X 16M (S/N E-32-0111) was installed at SSRF BL17U1 from Oct 2017 to Feb 2021. After Feb 2021, it was moved back to SSRF BL10U2.  | |||
	# 2021-03-01 00:00:00 time stamp is 1614528000  | |||
    if [ "$SN" == "E-32-0111" ]; then  | |||
      collection_time=`h5dump -d "/entry/instrument/detector/detectorSpecific/data_collection_date" $FIRSTFRAME | grep "(0):" | awk '{print $2}' | sed -e "s/\.\(.*\)//g; s/\"//g"`  | |||
      if [ `uname -s` == "Darwin" ]; then  | |||
        collection_timestamp=`date -j -f "%Y-%m-%dT%H:%M:%S" $collection_time +%s`  | |||
      elif [ `uname -s` == "Linux" ]; then  | |||
        collection_timestamp=`date -d $collection_time +%s`  | |||
      else  | |||
        collection_timestamp=0  | |||
      fi  | |||
      if [ $collection_timestamp -eq 0 ]; then  | |||
        is_rotation_axis_set=1  | |||
        rotation_axis=`h5dump -d "/SSRF/RotationAxis" $FIRSTFRAME 2>/dev/null || is_rotation_axis_set=0`  | |||
        if [ "$is_rotation_axis_set" == "1" ]; then  | |||
          rotation_axis=`h5dump -d "/SSRF/RotationAxis" $FIRSTFRAME | grep "(0):" | sed -e "s/^.*://; s/,//g"`  | |||
          echo "The rotation axis of SSRF BL10U2 (Eiger X 16M) is $rotation_axis"  | |||
        else  | |||
          rotation_axis="-1 0 0    ! Cannot determine rotation axis. SSRF BL17U1: -1 0 0; SSRF BL02U1: 0 -1 0"  | |||
        fi  | |||
      elif [ $collection_timestamp -ge 0 ] && [ $collection_timestamp -le 1614528000 ]; then  | |||
        # SSRF BL17U1  | |||
        rotation_axis="-1 0 0"  | |||
        echo "SSRF BL17U1 (Eiger X 16M) with inverted rotation axis"  | |||
      else  | |||
        # SSRF BL10U2  | |||
        is_rotation_axis_set=1  | |||
        rotation_axis=`h5dump -d "/SSRF/RotationAxis" $FIRSTFRAME 2>/dev/null || is_rotation_axis_set=0`  | |||
        if [ "$is_rotation_axis_set" == "1" ]; then  | |||
          rotation_axis=`h5dump -d "/SSRF/RotationAxis" $FIRSTFRAME | grep "(0):" | sed -e "s/^.*://; s/,//g"`  | |||
          echo "The rotation axis of SSRF BL10U2 (Eiger X 16M) is $rotation_axis"  | |||
        else  | |||
          rotation_axis="0 -1 0"  | |||
          echo "SSRF BL10U2 (Eiger X 16M) with vertical rotation axis"  | |||
        fi  | |||
      fi  | |||
    fi  | |||
  # SSRF BL02U1 (Feng YU 2021-07-18)  | |||
  # EIGER2 S 9M SSRF BL02U1 has S/N E-18-0121  | |||
    if [ "$SN" == "E-18-0121" ]; then  | |||
      is_rotation_axis_set=1  | |||
      rotation_axis=`h5dump -d "/SSRF/RotationAxis" $FIRSTFRAME 2>/dev/null || is_rotation_axis_set=0`  | |||
      if [ "$is_rotation_axis_set" == "1" ]; then  | |||
        rotation_axis=`h5dump -d "/SSRF/RotationAxis" $FIRSTFRAME | grep "(0):" | sed -e "s/^.*://; s/,//g"`  | |||
        echo "The rotation axis of SSRF BL02U1 (Eiger2 S 9M) is $rotation_axis"  | |||
      else  | |||
        rotation_axis="1 0 0"  | |||
        echo "SSRF BL02U1 (Eiger2 S 9M) with horizontal rotation axis"  | |||
      fi  | |||
    fi  | |||
# revision 1.05 specialcase nframes for Eiger detectors at BNL  | |||
    if [ "$SN" == "E-18-0104" -o "$SN" == "E-32-0101" ]; then  | |||
      echo specialcase nframes for Eiger detectors at BNL:  | |||
      nframes=`h5dump -A -g "/entry/data" $FIRSTFRAME | grep "DATASPACE  SIMPLE" | sed -e "s/,.*//" | awk '{a+=$5}END{print a}'`  | |||
      DATA_RANGE="1 $nframes"  | |||
      SPOT_RANGE="1 `echo "scale=0; if (${nframes}<2) 1; if (${nframes}>1) ${nframes}/2"|bc -l`"  | |||
     fi  | |||
   fi  |    fi  | ||
  echo DATA_RANGE=$DATA_RANGE  | |||
   DETECTOR="EIGER MINIMUM_VALID_PIXEL_VALUE=0 OVERLOAD= $OVERLOAD"  |    DETECTOR="EIGER MINIMUM_VALID_PIXEL_VALUE=0 OVERLOAD= $OVERLOAD"  | ||
   QX=`h5dump -d "/entry/instrument/detector/x_pixel_size" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'`  |    QX=`h5dump -d "/entry/instrument/detector/x_pixel_size" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'`  | ||
| Line 874: | Line 985: | ||
! however, if the spots from COLSPOT extend to 2A then POSITION could, and if 1.5A POSITION should be refined  | ! however, if the spots from COLSPOT extend to 2A then POSITION could, and if 1.5A POSITION should be refined  | ||
REFINE(IDXREF)=CELL BEAM ORIENTATION AXIS  ! add POSITION if high resolution, or DETECTOR_DISTANCE inaccurate  | REFINE(IDXREF)=CELL BEAM ORIENTATION AXIS  ! add POSITION if high resolution, or DETECTOR_DISTANCE inaccurate  | ||
REFINE(INTEGRATE)= POSITION BEAM ORIENTATION ! AXIS CELL . If 1.5A or higher it is ok to refine CELL  | REFINE(INTEGRATE)= POSITION BEAM ORIENTATION ! AXIS CELL . If 1.5A or higher it is ok to refine CELL (unless electron diffraction)  | ||
REFINE(CORRECT)= $REFINE_CORRECT  | |||
! parameters specifically for this detector and beamline:  | ! parameters specifically for this detector and beamline:  | ||
DETECTOR= $DETECTOR  | DETECTOR= $DETECTOR  | ||
| Line 891: | Line 1,001: | ||
     if [ -e /usr/local/lib64/dectris-neggia.so ]; then  |      if [ -e /usr/local/lib64/dectris-neggia.so ]; then  | ||
       echo LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP  |        echo LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP  | ||
       echo LIB= line was written to XDS.INP  |        echo LIB= line was written to XDS.INP . For Apple ARM64 processors, you must modify the name.  | ||
     else  |      else  | ||
       echo !LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP  |        echo !LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP  | ||
| Line 1,097: | Line 1,207: | ||
fi  | fi  | ||
echo XDS.INP is ready for use. The file has only the most important keywords.  | echo XDS.INP is ready for use. The file has only the most important keywords.  | ||
echo Full documentation, including complete detector templates,   | echo Full documentation, including complete detector templates, at xds.mr.mpg.de .  | ||
echo   | echo More documentation in strucbio.biologie.uni-konstanz.de/xdswiki/index.php .  | ||
echo After running xds, inspect  | echo After running xds, inspect at least the agreement of predicted and observed    | ||
echo spots in FRAME.cbf!  | |||
rm -f tmp1 tmp2  | rm -f tmp1 tmp2  | ||
</pre>  | </pre>  | ||