2,652
edits
(→Usage) |
|||
(32 intermediate revisions by the same user not shown) | |||
Line 8: | Line 8: | ||
For improved interaction with [[XDSGUI]], it is advantageous to provide an ''absolute'' filename for the data files - one that starts with a slash ("/"). | For improved interaction with [[XDSGUI]], it is advantageous to provide an ''absolute'' filename for the data files - one that starts with a slash ("/"). | ||
== The script == | |||
<pre> | <pre> | ||
Line 118: | 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.03 . Feng | # revision 1.03 . Feng Yu 18/7/2021 fix/expand information about Shanghai Synchrotron Radiation Facility (SSRF) | ||
REVISION="1. | # 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.10 . KD NeXus header for Eiger | |||
# revision 1.11 . KD / Helena Taberman ROTATION_AXIS=-1 0 0 for Eiger .cbf data from Petra P14 | |||
# revision 1.12 . KD / Helena Taberman correct rev 1.11 to be 0 -1 0 | |||
# revision 1.13 . KD variables for /usr/local/lib64/dectris-neggia.so and durin-plugin.so . Remove h5dump error messages. | |||
REVISION="1.13 (04-Jun-2022)" | |||
# | # | ||
Line 129: | Line 141: | ||
# - 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 | # - on macOS, the "Command Line Tools for Xcode" (from https://developer.apple.com/download/more/) are needed. | ||
# | # | ||
# notes for debugging of the script: | # notes for debugging of the script: | ||
# - add the -x option to | # - add the -x option to #!/bin/bash in 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 143: | Line 155: | ||
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 166: | Line 180: | ||
# default DIRECTION_OF_DETECTOR_X-AXIS | # default DIRECTION_OF_DETECTOR_X-AXIS | ||
DIRECTION_OF_DETECTOR_X_AXIS="1 0 0" | DIRECTION_OF_DETECTOR_X_AXIS="1 0 0" | ||
# default DIRECTION_OF_DETECTOR_Y-AXIS | |||
DIRECTION_OF_DETECTOR_Y_AXIS="0 1 0" | |||
# default FRACTION_OF_POLARIZATION | # default FRACTION_OF_POLARIZATION | ||
pol_frac=0.98 | pol_frac=0.98 | ||
Line 172: | Line 188: | ||
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 218: | ||
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 230: | ||
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 257: | ||
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 478: | ||
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=//` | ||
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 523: | ||
# 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 575: | ||
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 [ "$DET_SN" == "Dectris Eiger | if [ "$DET_SN" == "Dectris Eiger 4M, E-08-0107" -o "$DET_SN" == "PILATUS 6M-F, S/N 60-0115-F" \ | ||
-o "$DET_SN" == "Dectris EIGER2 CdTe 16M, E-32-0129" ] ; 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 597: | ||
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`" | |||
SN=`h5dump -d "/entry/instrument/detector/detector_number" $FIRSTFRAME | awk '/\(0\): /{print $2}' | sed s/\"//g` | |||
echo detector serial number is $SN | |||
# 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 561: | Line 616: | ||
# 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"` | ||
# the above gives -1 0 0 for DLS data instead of the correct 1 0 0, so commented out for now | # the above gives -1 0 0 for DLS data instead of the correct 1 0 0, so commented out for now | ||
# comment while implementing rev 1.10: this is because the DLS headers are NeXus, so DIRECTION_OF_DETECTOR_X/Y_AXIS must be adjusted. | |||
else | else | ||
echo Eiger HDF5 from Dectris | echo Eiger HDF5 from Dectris | ||
Line 566: | Line 622: | ||
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 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 2>/dev/null | 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) | # /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 | if [ "$STARTING_ANGLE" == "" ]; then | ||
echo "/entry/sample/goniometer/omega_start not found, | echo "/entry/sample/goniometer/omega_start not found, trying /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"` | STARTING_ANGLE=`h5dump -d /entry/sample/goniometer/omega $FIRSTFRAME | grep "(0):" | head -n 1 | awk '{print $2}' | sed -e "s/,//g"` | ||
fi | fi | ||
echo "STARTING_ANGLE=$STARTING_ANGLE" | echo "STARTING_ANGLE=$STARTING_ANGLE" | ||
# If rotation | # If rotation axis 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 | # EIGER2 16M CHESS ID7B2 has S/N E-32-0123 (A. Finke 2020-11-07) v0.99 | ||
if [ "$SN" == "E-32-0123" ]; then | if [ "$SN" == "E-32-0123" ]; then | ||
rotation_axis="-1 0 0" | rotation_axis="-1 0 0" | ||
Line 583: | Line 638: | ||
# SSRF BL17U1 and SSRF BL10U2 (Feng YU 2021-07-18) | # 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. | # 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- | # 2021-03-01 00:00:00 time stamp is 1614528000 | ||
if [ "$SN" == "E-32-0111" ]; then | 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/\.\(.*\)/ | 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 | if [ `uname -s` == "Darwin" ]; then | ||
collection_timestamp=`date -j -f "%Y-%m-%dT%H:%M:%S | collection_timestamp=`date -j -f "%Y-%m-%dT%H:%M:%S" $collection_time +%s` | ||
elif [ `uname -s` == "Linux" ]; then | elif [ `uname -s` == "Linux" ]; then | ||
collection_timestamp=`date -d $collection_time +%s` | collection_timestamp=`date -d $collection_time +%s` | ||
Line 602: | Line 657: | ||
rotation_axis="-1 0 0 ! Cannot determine rotation axis. SSRF BL17U1: -1 0 0; SSRF BL02U1: 0 -1 0" | rotation_axis="-1 0 0 ! Cannot determine rotation axis. SSRF BL17U1: -1 0 0; SSRF BL02U1: 0 -1 0" | ||
fi | fi | ||
elif [ $collection_timestamp -ge 0 ] && [ $collection_timestamp -le | elif [ $collection_timestamp -ge 0 ] && [ $collection_timestamp -le 1614528000 ]; then | ||
# SSRF BL17U1 | # SSRF BL17U1 | ||
rotation_axis="-1 0 0" | rotation_axis="-1 0 0" | ||
Line 632: | Line 687: | ||
fi | fi | ||
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 | |||
# rev 1.10: check for NeXus header. If found, its geometry will overwrite any rotation_axis set until here. | |||
NeXus=0 | |||
h5dump -d "/entry/definition" $FIRSTFRAME 2>/dev/null | grep -q NXmx && NeXus=1 | |||
if [ "$NeXus" == "1" ]; then | |||
echo NeXus header found. This defines DIRECTION_OF_DETECTOR_X/Y-AXIS and ROTATION_AXIS. | |||
DIRECTION_OF_DETECTOR_X_AXIS=$(h5dump -d "/entry/instrument/detector/module/fast_pixel_direction" $FIRSTFRAME 2>/dev/null | grep "(0):" | tail -1 | sed -e "s/^.*://; s/,//g") | |||
DIRECTION_OF_DETECTOR_Y_AXIS=$(h5dump -d "/entry/instrument/detector/module/slow_pixel_direction" $FIRSTFRAME 2>/dev/null | grep "(0):" | tail -1 | 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") | |||
else | |||
echo no NeXus header found. | |||
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 660: | Line 734: | ||
#let SKIP=768 | #let SKIP=768 | ||
#NX=$(od -t x -j $SKIP -N 4 $FIRSTFRAME |awk 'NR==1{print toupper($2)}'|perl -nle '@array= $_ =~/.{2}/g; print "ibase=16;obase=A;".join("",reverse @array)'|bc) | #NX=$(od -t x -j $SKIP -N 4 $FIRSTFRAME |awk 'NR==1{print toupper($2)}'|perl -nle '@array= $_ =~/.{2}/g; print "ibase=16;obase=A;".join("",reverse @array)'|bc) | ||
NX=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(768);print("%.4d"%struct.unpack(">i",f.read(4)))') | NX=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(768);print("%.4d"%struct.unpack(">i",f.read(4)))') | ||
NY=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(772);print("%.4d"%struct.unpack(">i",f.read(4)))') | NY=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(772);print("%.4d"%struct.unpack(">i",f.read(4)))') | ||
DETECTOR_DISTANCE=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(344);print("-%.4f"%struct.unpack(">f",f.read(4)))') | DETECTOR_DISTANCE=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(344);print("-%.4f"%struct.unpack(">f",f.read(4)))') | ||
ORGX=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(540);print("%.4f"%struct.unpack(">f",f.read(4)))') | ORGX=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(540);print("%.4f"%struct.unpack(">f",f.read(4)))') | ||
ORGY=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(544);print("%.4f"%struct.unpack(">f",f.read(4)))') | ORGY=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(544);print("%.4f"%struct.unpack(">f",f.read(4)))') | ||
OSCILLATION_RANGE=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(524);phis,phie=struct.unpack(">ff",f.read(8));print("%.4f"%(phie-phis))') | OSCILLATION_RANGE=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(524);phis,phie=struct.unpack(">ff",f.read(8));print("%.4f"%(phie-phis))') | ||
QX=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(776);print("%.6f"%struct.unpack(">f",f.read(4)))') | QX=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(776);print("%.6f"%struct.unpack(">f",f.read(4)))') | ||
QY=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(780);print("%.6f"%struct.unpack(">f",f.read(4)))') | QY=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(780);print("%.6f"%struct.unpack(">f",f.read(4)))') | ||
X_RAY_WAVELENGTH=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(292);print("%.6f"%struct.unpack(">f",f.read(4)))') | X_RAY_WAVELENGTH=$(python -c 'import struct; f=open("'$FIRSTFRAME'","rb");f.seek(292);print("%.6f"%struct.unpack(">f",f.read(4)))') | ||
Line 931: | Line 991: | ||
! 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 946: | Line 1,005: | ||
if [ "$DET" == "eiger" ] && [ "$is_h5" == 1 ]; then | if [ "$DET" == "eiger" ] && [ "$is_h5" == 1 ]; then | ||
if [ "$DLS" == 0 ] ; then | if [ "$DLS" == 0 ] ; then | ||
neggia_path=/usr/local/lib64/dectris-neggia.so | |||
echo LIB= | if [ -e $neggia_path ]; then | ||
echo LIB= | echo LIB=$neggia_path >> XDS.INP | ||
echo "LIB= <dectris-neggia> was written to XDS.INP . Check the path! For Apple M1 processors, 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 | ||
echo | echo "dectris-neggia.so not found. Specify LIB=<path-to-dectris-neggia> in XDS.INP & fix your generate_XDS.INP !" | ||
fi | fi | ||
else | else | ||
durin_path=/usr/local/lib64/durin-plugin.so | |||
echo LIB= | if [ -e $durin_path ]; then | ||
echo LIB= | echo LIB=$durin_path >> XDS.INP | ||
echo "LIB= <durin-plugin> was written to XDS.INP . Check the path! For Apple M1 processors, modify the name." | |||
else | else | ||
echo !LIB=/usr/local/lib64/durin-plugin.so >> XDS.INP | echo !LIB=/usr/local/lib64/durin-plugin.so >> XDS.INP | ||
echo | echo "durin-plugin.so not found. Specify LIB=<path-to-durin-plugin> in XDS.INP & fix your generate_XDS.INP !" | ||
fi | fi | ||
fi | fi | ||
Line 989: | Line 1,050: | ||
cat >> XDS.INP << eof | cat >> XDS.INP << eof | ||
DIRECTION_OF_DETECTOR_X-AXIS=$DIRECTION_OF_DETECTOR_X_AXIS | DIRECTION_OF_DETECTOR_X-AXIS=$DIRECTION_OF_DETECTOR_X_AXIS | ||
DIRECTION_OF_DETECTOR_Y-AXIS= | DIRECTION_OF_DETECTOR_Y-AXIS=$DIRECTION_OF_DETECTOR_Y_AXIS | ||
eof | eof | ||
fi | fi | ||
Line 1,154: | Line 1,215: | ||
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> | ||
Line 1,165: | Line 1,225: | ||
Ask your system adminstrator to cut-and-paste the script into e.g. /usr/local/bin/generate_XDS.INP, and to make it "executable". | Ask your system adminstrator to cut-and-paste the script into e.g. /usr/local/bin/generate_XDS.INP, and to make it "executable". | ||
If you work with Eiger data, you may want to make a one-line change to the script after downloading, in order to point to the correct path on your system of the Dectris' Neggia library, or the Durin plugin, respectively. Just open the script with an editor and adjust neggia_path or durin_path ! This relieves users from having to change the LIB= line for every data set. You should also insert that path into the Menu / Settings / "generic library" in [[XDSGUI]] . | |||
But you may also cut-and-paste the script from this webpage into a file in e.g. your home directory; the filename should be generate_XDS.INP. After creating the file, make it executable - e.g. if it's in your $HOME, use: | But you may also cut-and-paste the script from this webpage into a file in e.g. your home directory; the filename should be generate_XDS.INP. After creating the file, make it executable - e.g. if it's in your $HOME, use: | ||
Line 1,200: | Line 1,262: | ||
</pre> | </pre> | ||
If you do use cut-and-paste from the webpage, be aware of the following problem report: On the Mac, after loading frames, by clicking “generate XDS.INP”, the program gives some strange symbol “Ô in XDS.INP. And the more you click “save” button, the more “Ô appear. This looks like e.g. <br>SPACE_GROUP_NUMBER=0 à ! 0 if unknown <br>UNIT_CELL_CONSTANTS= 70 80 90 90 90 90 à <br> ''The problem is due to the “Rich text” format in TextEdit when saving "generate_XDS.INP". It is solved by re-downloading the script, and changing format to Plain - everything should work then.'' | If you do use cut-and-paste from the webpage, be aware of the following problem report: On the Mac, after loading frames, by clicking “generate XDS.INP”, the program gives some strange symbol “Ô in XDS.INP. And the more you click “save” button, the more “Ô appear. This looks like e.g. <br>SPACE_GROUP_NUMBER=0 à ! 0 if unknown <br>UNIT_CELL_CONSTANTS= 70 80 90 90 90 90 à <br> ''The problem is due to the “Rich text” format in TextEdit when saving "generate_XDS.INP". It is solved by re-downloading the script, and changing format to Plain - everything should work then.'' | ||
Attention beamline staff: it would be great if you could make a one-line change to the script after downloading, in order to point to the correct path to Dectris' Neggia library, or the Durin plugin, respectively. Just open the script with an editor and adjust neggia_path or durin_path ! This relieves users from having to change the LIB= line for every data set. | |||
== Calling generate_XDS.INP from a Python script == | == Calling generate_XDS.INP from a Python script == | ||
Line 1,242: | Line 1,306: | ||
* 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. The frame headers do not have this information, so the default chosen by [[generate_XDS.INP]] may be wrong and need manual correction. Pls also see the article [[Beamline notes]]. | * 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. The frame headers do not have this information, so the default chosen by [[generate_XDS.INP]] may be wrong and need manual correction. Pls also see the article [[Beamline notes]]. | ||
* Sometimes, the x- and y- values of the primary beam position recorded in the header should be used for ORGY and ORGX (i.e reversed) instead of as ORGX and ORGY. For ADSC, this has been implemented in the script for a number of beamlines. | * Sometimes, the x- and y- values of the primary beam position recorded in the header should be used for ORGY and ORGX (i.e reversed) instead of as ORGX and ORGY. For ADSC, this has been implemented in the script for a number of beamlines. | ||
* there are apparently several flavours of HDF5 files produced at Diamond Light Source. They differ e.g. in the naming of the header items. This means that items like NX, NY, DETECTOR_DISTANCE and number of images cannot be | * there are apparently several flavours of HDF5 files produced at Diamond Light Source. They differ e.g. in the naming of the header items. This means that items like NX, NY, DETECTOR_DISTANCE and number of images cannot always be determined by the [[generate_XDS.INP]] script. Example: The data at /dls/i04-1/data/2021/mx28114-9/processing/Lenye_Diamini/ThiL/ThiL found during the CCP4 2021 online Cape Town workshop. A workaround is to use e.g. xia2 pipeline=3dii to process these files, and - if needed - extract those items from its output files, e.g. from DEFAULT/NATIVE/SWEEP1/index/XDS.INP . | ||
== See also == | == See also == |