2,684
edits
(→The script: bash -x should be used for debugging, not bash -v) |
|||
(26 intermediate revisions by the same user not shown) | |||
Line 104: | Line 104: | ||
# 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.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.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. | # 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.92 . KD 27/02/2020 read *_master.h5 from Diamond Light Source | |||
# revision 0.93 . KD 13/03/2020 print out 2theta for MarCCD (DETECTOR_*_AXIS can be derived from this) | |||
# revision 0.94 . KD 16/03/2020 bugfix for Bruker-cbf to make bc accept e.g. 3.1e-005 by using awk printf "%.5f" instead of awk print | |||
# revision 0.95 . KD 29/07/2020 fix DLS Eiger HDF5 variant OSCILLATION_RANGE, STARTING_ANGLE. Attention: DLS Eiger variant needs h5dump 1.10 for OVERLOAD! | |||
# revision 0.96 . KD 03/10/2020 make script echo detector serial number if inverted ROTATION_AXIS is detected. | |||
# revision 0.97 . KD 19/10/2020 add UNTRUSTED_RECTANGLEs for Eiger2 (which has a few pixels less than Eiger (thanks to Andreas Förster) | |||
REVISION="0.97 (19-Oct-2020)" | |||
# | # | ||
Line 167: | Line 177: | ||
# 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 230: | Line 240: | ||
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 246: | Line 257: | ||
elif [ "$DET" == "mccd" ]; then | elif [ "$DET" == "mccd" ]; then | ||
echo Data from a MarCCD detector | echo Data from a MarCCD detector | ||
# http://www.sb.fsu.edu/~xray/Manuals/marCCD165header.html has header information | |||
DETECTOR="CCDCHESS MINIMUM_VALID_PIXEL_VALUE= 1 OVERLOAD= 65500" | DETECTOR="CCDCHESS MINIMUM_VALID_PIXEL_VALUE= 1 OVERLOAD= 65500" | ||
Line 267: | Line 279: | ||
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" | ||
echo inverted ROTATION_AXIS since Detector Serial Number is "${DET_SN}" | |||
fi | fi | ||
Line 281: | Line 294: | ||
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` | ||
# Mar 12, 2020 KD | |||
let SKIP=1724 | |||
TWOTHETA=$(od -t dI -j $SKIP -N 4 tmp2 | head -1 | awk '{print $2}') | |||
TWOTHETA=`echo "scale=3; $TWOTHETA/1000" | bc -l` | |||
echo 2THETA= $TWOTHETA | |||
let SKIP=1024+256+128+256+44 | let SKIP=1024+256+128+256+44 | ||
Line 345: | Line 364: | ||
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=//` | ||
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 | ! 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 376: | Line 395: | ||
# 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 387: | Line 407: | ||
446 | 446 | ||
916 | 916 | ||
905 | |||
928 | |||
" | " | ||
ORG4_SNs=" | ORG4_SNs=" | ||
Line 394: | Line 416: | ||
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! | # revision 0.83 of this script removes 458 from the list! | ||
REVERSEPHI_SNs=" | REVERSEPHI_SNs=" | ||
915 | 915 | ||
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 | ||
REVERSE_PHI="yes" | REVERSE_PHI="yes" | ||
echo inverted ROTATION_AXIS since detector serial number is ${DET_SN} | |||
fi | fi | ||
Line 484: | Line 512: | ||
PILATUS3 6M, S/N 60-0127 | PILATUS3 6M, S/N 60-0127 | ||
PILATUS3 6M, S/N 60-0123 | 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" | ||
echo inverted ROTATION_AXIS since detector serial number is ${DET_SN} | |||
fi | |||
if [ "$DET_SN" == "PILATUS XXX, S/N XX-XXX" ] ; then | |||
REVERSE_PHI="yes" | |||
echo inverted rotation axis at SSRF BL19U1 | |||
fi | fi | ||
Line 494: | Line 526: | ||
if grep -q "Oscillation_axis X.CW +SLOW" tmp2 ; then | if grep -q "Oscillation_axis X.CW +SLOW" tmp2 ; then | ||
rotation_axis="0 -1 0" | rotation_axis="0 -1 0" | ||
echo ROTATION_AXIS="0 -1 0" at Diamond I24 | |||
fi | fi | ||
fi | fi | ||
# insert similar code for Petra P14 here | # FIXME: insert similar code for Petra P14 here | ||
elif [ "$DET" == "eiger" ]; then | elif [ "$DET" == "eiger" ]; then | ||
OVERLOAD=`h5dump -d "/entry/instrument/detector/detectorSpecific/countrate_correction_count_cutoff" $FIRSTFRAME | awk '/\(0\):/{print $2}' ` | # find out if HDF5 from Diamond (DLS=1) or Dectris (DLS=0) | ||
DLS=0 | |||
OVERLOAD=`h5dump -d "/entry/instrument/detector/detectorSpecific/countrate_correction_count_cutoff" $FIRSTFRAME 2>/dev/null` || DLS=1 | |||
if [ "$DLS" == 1 ]; then | |||
echo Eiger HDF5 from Diamond | |||
# unfortunately h5dump 1.10 is required to get this right for the DLS .h5 files. This version is available at DLS but usually not elsewhere | |||
OVERLOAD=`h5dump -d "/entry/instrument/detector/saturation_value" $FIRSTFRAME | awk '/\(0\):/{print $2}'` | |||
# v0.95: fix the next 2 lines by taking care of negative values with the \- , and stop after first "(0)" | |||
OSCILLATION_RANGE=`h5dump -d "/entry/data/omega" $FIRSTFRAME | awk '/\(0\): [\-0-9]/{print $3-$2;exit}'` | |||
STARTING_ANGLE=`h5dump -d "/entry/data/omega" $FIRSTFRAME | awk '/\(0\): [\-0-9]/{print $2;exit}' | sed -e "s/,//"` | |||
echo OSCILLATION_RANGE=$OSCILLATION_RANGE STARTING_ANGLE=$STARTING_ANGLE | |||
# 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 | |||
else | |||
echo Eiger HDF5 from Dectris | |||
OVERLOAD=`h5dump -d "/entry/instrument/detector/detectorSpecific/countrate_correction_count_cutoff" $FIRSTFRAME | awk '/\(0\):/{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=`h5dump -d "/entry/sample/goniometer/omega_start" $FIRSTFRAME | awk '/\(0\): [\-0-9]/{print $2}'` | |||
# 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"` | |||
# 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 | |||
fi | |||
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}'` | ||
QY=`h5dump -d "/entry/instrument/detector/y_pixel_size" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'` | QY=`h5dump -d "/entry/instrument/detector/y_pixel_size" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'` | ||
echo | echo OVERLOAD=$OVERLOAD | ||
SENSOR_THICKNESS=`h5dump -d "/entry/instrument/detector/sensor_thickness" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'` | SENSOR_THICKNESS=`h5dump -d "/entry/instrument/detector/sensor_thickness" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2*1000}'` | ||
X_RAY_WAVELENGTH=`h5dump -d "/entry/instrument/beam/incident_wavelength" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'` | X_RAY_WAVELENGTH=`h5dump -d "/entry/instrument/beam/incident_wavelength" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'` | ||
Line 514: | Line 575: | ||
ORGY=`h5dump -d "/entry/instrument/detector/beam_center_y" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'` | ORGY=`h5dump -d "/entry/instrument/detector/beam_center_y" $FIRSTFRAME | awk '/\(0\): [0-9]/{print $2}'` | ||
# find DETECTOR_DISTANCE | # find DETECTOR_DISTANCE : | ||
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}'` | ||
SEPMIN=4 | SEPMIN=4 | ||
CLUSTER_RADIUS=2 | CLUSTER_RADIUS=2 | ||
elif [ "$DET" == "raxis" ]; then | elif [ "$DET" == "raxis" ]; then | ||
echo Data from a RAXIS detector | echo Data from a RAXIS detector | ||
Line 655: | Line 710: | ||
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 | ||
Line 684: | Line 757: | ||
X_RAY_WAVELENGTH=`awk '/diffrn_radiation_wavelength.wavelength/{print $2}' tmp2` | X_RAY_WAVELENGTH=`awk '/diffrn_radiation_wavelength.wavelength/{print $2}' tmp2` | ||
OMEGA=`awk '/OMEGA \? \? \?/{ | # fix 16.3.20: instead of print, use printf "%.5f", because bc does not accept e.g. 3.1e-005 | ||
DELTAOMEGA=`awk '/OMEGA \? \? \?/{ | OMEGA=`awk '/OMEGA \? \? \?/{printf "%.5f",$5}' tmp2` | ||
PHI=`awk '/PHI \? \? \?/{ | DELTAOMEGA=`awk '/OMEGA \? \? \?/{printf "%.5f",$6}' tmp2` | ||
DELTAPHI=`awk '/PHI \? \? \?/{printf "% | PHI=`awk '/PHI \? \? \?/{printf "%.5f",$5}' tmp2` | ||
KAPPA=`awk '/CHI \? \? \?/{ | DELTAPHI=`awk '/PHI \? \? \?/{printf "%.5f",$6}' tmp2` | ||
KAPPA=`awk '/CHI \? \? \?/{printf "%.5f",$5}' tmp2` | |||
# echo OMEGA DELTAOMEGA PHI DELTAPHI KAPPA= $OMEGA $DELTAOMEGA $PHI $DELTAPHI $KAPPA | # echo OMEGA DELTAOMEGA PHI DELTAPHI KAPPA= $OMEGA $DELTAOMEGA $PHI $DELTAPHI $KAPPA | ||
Line 771: | Line 845: | ||
SEPMIN=$SEPMIN CLUSTER_RADIUS=$CLUSTER_RADIUS ! 4 and 2 for Pixel Array Detectors | SEPMIN=$SEPMIN CLUSTER_RADIUS=$CLUSTER_RADIUS ! 4 and 2 for Pixel Array Detectors | ||
! since XDS 01-MAR-2015, POSITION supersedes DISTANCE. | ! since XDS 01-MAR-2015, POSITION supersedes DISTANCE. | ||
! nowadays headers are usually correct so refine 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 ! | ! however, if the spots from COLSPOT extend to 2A then POSITION could, and if 1.5A POSITION should be refined | ||
REFINE(INTEGRATE)= POSITION BEAM ORIENTATION ! AXIS CELL | 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(CORRECT)=CELL BEAM ORIENTATION AXIS POSITION ! Default is: refine everything | ! REFINE(CORRECT)=CELL BEAM ORIENTATION AXIS POSITION ! Default is: refine everything | ||
Line 787: | Line 862: | ||
if [ "$DET" == "eiger" ] && [ "$is_h5" == 1 ]; then | if [ "$DET" == "eiger" ] && [ "$is_h5" == 1 ]; then | ||
if [ -e /usr/local/lib64/dectris-neggia.so ]; then | if [ "$DLS" == 0 ] ; then | ||
if [ -e /usr/local/lib64/dectris-neggia.so ]; then | |||
echo LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP | |||
echo LIB= line was written to XDS.INP | |||
else | |||
echo !LIB=/usr/local/lib64/dectris-neggia.so >> XDS.INP | |||
echo /usr/local/lib64/dectris-neggia.so was not found - specify location manually! | |||
fi | |||
else | else | ||
echo !LIB=/usr/local/lib64/ | if [ -e /usr/local/lib64/durin-plugin.so ]; then | ||
echo LIB=/usr/local/lib64/durin-plugin.so >> XDS.INP | |||
fi | echo LIB= line was written to XDS.INP | ||
else | |||
echo !LIB=/usr/local/lib64/durin-plugin.so >> XDS.INP | |||
echo /usr/local/lib64/durin-plugin.so was not found - specify location manually! | |||
fi | |||
fi | |||
fi | fi | ||
Line 809: | Line 894: | ||
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 | 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 857: | Line 942: | ||
! and does not seem to have any downsides. | ! and does not seem to have any downsides. | ||
eof | eof | ||
if [ $NX == "1475" ]; then | if [ $NX == "1028" -a $NY == "1062" ]; then | ||
# Eiger2 1M ; v0.97 numbers from Andreas Förster | |||
cat >> XDS.INP << eof | |||
UNTRUSTED_RECTANGLE= 0 1029 512 551 | |||
eof | |||
elif [ $NX == "1475" ]; then | |||
if ! grep -q Flat_field tmp2 ; then | if ! grep -q Flat_field tmp2 ; then | ||
cat >> XDS.INP << eof | cat >> XDS.INP << eof | ||
Line 890: | Line 980: | ||
eof | eof | ||
fi | fi | ||
elif [ $NX == "2068" -a $NY == "2162" ]; then | |||
# Eiger2 4M ; v0.97 numbers from Andreas Förster | |||
cat >> XDS.INP << eof | |||
!EXCLUSION OF VERTICAL DEAD AREAS OF THE EIGER2 4M DETECTOR | |||
UNTRUSTED_RECTANGLE= 1028 1041 0 2163 | |||
!EXCLUSION OF HORIZONTAL DEAD AREAS OF THE EIGER 4M DETECTOR | |||
UNTRUSTED_RECTANGLE= 0 2069 512 551 | |||
UNTRUSTED_RECTANGLE= 0 2069 1062 1101 | |||
UNTRUSTED_RECTANGLE= 0 2069 1612 1651 | |||
eof | |||
elif [ $NX == "2463" ]; then | elif [ $NX == "2463" ]; then | ||
# Pilatus 6M | # Pilatus 6M | ||
Line 923: | Line 1,023: | ||
UNTRUSTED_RECTANGLE= 0 3110 2717 2757 | UNTRUSTED_RECTANGLE= 0 3110 2717 2757 | ||
eof | eof | ||
elif [ $NX == "4150" | elif [ $NX == "3108" -a $NY == "3262" ]; then | ||
# Eiger2 9M ; v0.97 numbers from Andreas Förster | |||
cat >> XDS.INP << eof | |||
!EXCLUSION OF VERTICAL DEAD AREAS OF THE EIGER2 9M DETECTOR | |||
UNTRUSTED_RECTANGLE= 1028 1041 0 3262 | |||
UNTRUSTED_RECTANGLE= 2068 2081 0 3263 | |||
!EXCLUSION OF HORIZONTAL DEAD AREAS OF THE EIGER2 9M DETECTOR | |||
UNTRUSTED_RECTANGLE= 0 3109 512 551 | |||
UNTRUSTED_RECTANGLE= 0 3109 1062 1101 | |||
UNTRUSTED_RECTANGLE= 0 3109 1612 1651 | |||
UNTRUSTED_RECTANGLE= 0 3109 2162 2201 | |||
UNTRUSTED_RECTANGLE= 0 3109 2712 2751 | |||
eof | |||
elif [ $NX == "4150" -a $NY == "4371" ]; then | |||
# Eiger 16M | # Eiger 16M | ||
cat >> XDS.INP << eof | cat >> XDS.INP << eof | ||
Line 938: | Line 1,051: | ||
UNTRUSTED_RECTANGLE= 2069 2082 0 4371 | UNTRUSTED_RECTANGLE= 2069 2082 0 4371 | ||
UNTRUSTED_RECTANGLE= 3109 3122 0 4371 | UNTRUSTED_RECTANGLE= 3109 3122 0 4371 | ||
eof | |||
elif [ $NX == "4148" -a $NY == "4362" ]; then | |||
# Eiger2 16M ; v0.97 numbers from Andreas Förster | |||
cat >> XDS.INP << eof | |||
!EXCLUSION OF HORIZONTAL DEAD AREAS OF THE EIGER2 16M DETECTOR | |||
UNTRUSTED_RECTANGLE= 1028 1041 0 4363 | |||
UNTRUSTED_RECTANGLE= 2068 2081 0 4363 | |||
UNTRUSTED_RECTANGLE= 3108 3121 0 4363 | |||
!EXCLUSION OF VERTICAL DEAD AREAS OF THE EIGER2 16M DETECTOR | |||
UNTRUSTED_RECTANGLE= 0 4149 512 551 | |||
UNTRUSTED_RECTANGLE= 0 4149 1062 1101 | |||
UNTRUSTED_RECTANGLE= 0 4149 1612 1651 | |||
UNTRUSTED_RECTANGLE= 0 4149 2162 2201 | |||
UNTRUSTED_RECTANGLE= 0 4149 2712 2751 | |||
UNTRUSTED_RECTANGLE= 0 4149 3262 3301 | |||
UNTRUSTED_RECTANGLE= 0 4149 3812 3851 | |||
eof | eof | ||
fi | fi | ||
Line 995: | Line 1,124: | ||
The script makes use of many GNU commands, like <code>ls, grep, egrep, awk, cut, cat, echo, wc, bc, head, sed, tail, cp, od, python</code>. Some of them (like <code>od</code> and <code>python</code>) are only used in case of specific detectors (MarCCD and RAXIS, respectively). | The script makes use of many GNU commands, like <code>ls, grep, egrep, awk, cut, cat, echo, wc, bc, head, sed, tail, cp, od, python</code>. Some of them (like <code>od</code> and <code>python</code>) are only used in case of specific detectors (MarCCD and RAXIS, respectively). | ||
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). The .h5 files collected at Diamond Light Source require a very new version of h5dump (namely h5dump 1.10) to extract the OVERLOAD parameter from the .h5 file; this version is available by default in Ubuntu 20.04 and RHEL/CentOS 8. | ||
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. | On Mac OS X, installation of the "Command Line Tools" (from http://developer.apple.com/downloads; requires Apple ID) is required (open a terminal and type <code>xcode-select --install</code>). 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. | ||
One way to check for missing programs is | |||
#!/bin/bash | |||
for i in ls grep egrep awk cut cat echo wc bc head sed tail cp od python strings h5dump ; do | |||
if [ ! -x /bin/$i ] && [ ! -x /usr/bin/$i ]; then | |||
echo $i not found | |||
fi | |||
done | |||
A command that should go a long way in providing all these tools for RedHat-derived distros is (as root) | A command that should go a long way in providing all these tools for RedHat-derived distros is (as root) | ||
Line 1,012: | Line 1,146: | ||
* 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 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 | * 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 an 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. | ||
* 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. |