2,652
edits
m (→Limitations) |
(→The script: v0.95 fix DLS Eiger HDF5 variant OSCILLATION_RANGE, STARTING_ANGLE. Attention: DLS Eiger variant needs h5dump 1.10 for OVERLOAD!) |
||
(5 intermediate revisions by the same user not shown) | |||
Line 108: | Line 108: | ||
# 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.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 . KD 16/01/2020 Allow negative starting angle for Eiger (found -33 at SLS !). | ||
REVISION="0. | # 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.95 (29-Jul-2020)" | |||
# | # | ||
Line 251: | Line 255: | ||
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 286: | Line 291: | ||
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 513: | Line 524: | ||
fi | fi | ||
# insert similar code for Petra P14 here | # 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 | |||
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 530: | Line 568: | ||
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 726: | Line 750: | ||
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 830: | Line 855: | ||
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 1,040: | Line 1,075: | ||
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. | 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) |