-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbest.py
executable file
·189 lines (165 loc) · 8.6 KB
/
best.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import re
'''
best --help
BEST: Commmand Line Interface
========================
SYNOPSIS
best -f {detector} -t {time} [OPTIONS] [FILES DENZO/HKL]
best -f {detector} -t {time} [OPTIONS] -mos [FILES/MOSFLM]
best -f {detector} -t {time} [OPTIONS] -xds [FILES/XDS]
Compulsory arguments
-f {detector}
-t {exposure time}
FILES
DENZO/HKL
image_file file1.x {file2.x ...}
MOSFLM
-mos{flm) bestfile.dat bestfile.par bestfile1.hkl {bestfile2.hkl ...}
XDS
-xds CORRECT.LP BKGPIX.cbf XDS_ASCII_1.HKL {XDS_ASCII_2.HKL ...}
MOSFLM-XDS
-MXDS bestfile.par BKGINIT.cbf bestfile1.hkl {bestfile2.hkl ...}
OPTIONS
--help gives help message
-i2s <I/SigI>, aimed <I/SigI> at aimed resolution, default 3.0
-i2s max determine maximal reachable <I/SigI> at aimed resolution
-q minimize total time, default minimize the absorbed dose
-r {aimed resolution in �} , default automatic (by -T), >= ref.frame >= 0.9
-T(otal) {number}, maximum total exposure/measurement time, sec, default unlimited
-DMAX {number}, maximum permited total data collection DoseGy, default unlimited
-a, Friedel low broken - taking into account anomalous scattering
-asad, strategy for SAD data collection, resolution selected automatically, rot.interval=360 dg.
-Rf {number}, target Rfiedel used for SAD resolution selectiondefault = 0.05
-GpS {GpS} , dose rate, Gray per Second, default 0.0 - radiation damage neglected
-sh(ape) {number}, shape factor, default 1, - increase for large crystal in a small beam
-su(susceptibility) {number}, default 1, - increase for radiation-sensitive crystals
-C(ompliteness) {number}, aimed completeness, default 0.99
-R(redundancy) {number}, aimed redundancy, default automatic
-p(hi) {start range}, user defined rotation range, default auto
-w {number}, minimum rotation width per frame, deg., default 0.05
-pl(an) {file} output plan file
-e {none|min|full}, equivalent complexity level {single line|few lines|complicated}
-g some useful plots generated (plotmtv required), default not
-o {file} plots generated and stored in file
-dna {file} xml formatted data stored in file
-S(peed) {number}, maximum rotation speed, deg/sec, (default fast)
-M(inexposure) {number}, minimum exposure per frame, sec, (default short)
-in {file} calculate statistics for data collection plan read from file
-m {number of detector read outs}, default 1
-d {preset counts} , default time mode
-s {.sca file name}, default - use .x file(s)
-l show configured detector formats
-SAD {no|yes|graph}, strategy for SAD data collection if "yes", "graph" - estimation of resolution for SAD
-low {never|ever|only}, calculate low resolution pass strategy, default "only"
-DamPar calculate plan for rad.damage coefficients determination
-Bonly only B and scale will calculate
-Trans {number}, initial image transmission(%),default 100
-TRmin {number}, minimum transmission (%),default 1
-Npos {number}, number of crystal positions,default 1
-DIS_MAX {number}, max limit crystal-detector distance, default 2000 mm
-DIS_MIN {number}, min limit crystal-detector distance, default 0 mm
'''
class best:
def __init__(self,
xds_directory,
detector='eiger9m',
plan='best.plan',
exposure_time=0.025,
i2s=1.5,
DIS_MAX=1100.,
DIS_MIN=100.,
GpS=0.,
Minexposure=0.0043,
Speed=130.,
DMAX=20.e6,
Trans=100.,
g=True):
self.xds_directory = xds_directory
self.detector = detector
self.plan = plan
self.exposure_time = exposure_time
self.i2s = i2s
self.DIS_MAX = DIS_MAX
self.DIS_MIN = DIS_MIN
self.GpS = GpS
self.Minexposure = Minexposure
self.Speed = Speed
self.DMAX = DMAX
self.Trans = Trans
self.g = g
def get_best_line(self):
if self.g == True:
self.plot = '-g'
else:
self.plot = ''
best_line = 'best -f {detector} -t {exposure_time} -M {Minexposure} -i2s {i2s} -S {Speed} -Trans {Trans} -GpS {GpS} -DMAX {DMAX} {plot} -o {plot_file} -dna {dna_file} -xds {xds_directory}/CORRECT.LP {xds_directory}/BKGINIT.cbf {xds_directory}/XDS_ASCII.HKL | tee {plan_file}'.format(detector=self.detector, exposure_time=self.exposure_time, Minexposure=self.Minexposure, Trans=self.Trans, GpS=self.GpS, Speed=self.Speed, DMAX=self.DMAX, plot=self.plot, xds_directory=self.xds_directory, plot_file=os.path.join(self.xds_directory, 'best_plots.mtv'), dna_file=os.path.join(self.xds_directory, 'best_strategy.xml'), plan_file=os.path.join(self.xds_directory, self.plan), i2s=self.i2s)
return best_line
def run(self):
best_line = self.get_best_line()
print('best_line')
print(best_line)
os.system(best_line)
def get_strategy(self):
l = open('{plan_file}'.format(plan_file=os.path.join(self.xds_directory, self.plan))).read()
print('BEST strategy')
print(l)
''' Main Wedge
================
Resolution limit is set according to the given max.time
Resolution limit =2.48 Angstrom Transmission = 10.0% Distance = 275.5mm
-----------------------------------------------------------------------------------------
WEDGE PARAMETERS || INFORMATION
----------------------------------||-----------------------------------------------------
sub-| Phi |Rot. | Exposure| N.of||Over|sWedge|Exposure|Exposure| Dose | Dose |Comple-
We-|start |width | /image | ima-||-lap| width| /sWedge| total |/sWedge| total |teness
dge|degree|degree| s | ges|| |degree| s | s | MGy | MGy | %
----------------------------------||-----------------------------------------------------
1 74.00 0.15 0.015 954|| No 143.10 14.2 14.2 3.540 3.540 100.0
-----------------------------------------------------------------------------------------
'''
subwedge = ' (\d)\s*'
start = '([\d\.]*)\s*'
width = '([\d\.]*)\s*'
exposure = '([\d\.]*)\s*'
nimages = '([\d]*)\|\|'
search = subwedge + start + width + exposure + nimages
wedges = re.findall(search, l)
'''
[('1', '74.00', '0.15', '0.063', '767'),
('2', '189.05', '0.15', '0.161', '187')]
'''
strategy = []
for wedge in wedges:
wedge_parameters = {}
wedge_parameters['order'] = int(wedge[0])
wedge_parameters['scan_start_angle'] = float(wedge[1])
wedge_parameters['angle_per_frame'] = float(wedge[2])
wedge_parameters['exposure_per_frame'] = float(wedge[3])
wedge_parameters['nimages'] = int(wedge[4])
wedge_parameters['scan_exposure_time'] = wedge_parameters['nimages'] * wedge_parameters['exposure_per_frame']
strategy.append(wedge_parameters)
return strategy
def main():
import optparse
parser = optparse.OptionParser()
parser.add_option('-d', '--xds_directory', default=None, type=str, help='Directory with XDS processing results')
parser.add_option('-f', '--detector', default='eiger9m', type=str, help='Detector type')
parser.add_option('-p', '--plan', default='best.plan', type=str, help='Plan file')
parser.add_option('-e', '--exposure_time', default=0.025, type=float, help='Exposure time')
parser.add_option('-I', '--i2s', default=1.5, type=float, help='I over sigma at highest resolution')
parser.add_option('--DIS_MAX', default=1100., type=float, help='Maximum detector distance')
parser.add_option('--DIS_MIN', default=100., type=float, help='Minimum detector distance')
parser.add_option('--GpS', default=0., type=float, help='Dose rate in Grays per second')
parser.add_option('--Minexposure', default=0.0043, type=float, help='Minimum exposure time')
parser.add_option('--Speed', default=120., type=float, help='Maximum sample rotation speed in degrees per second')
parser.add_option('--DMAX', default=20.e6, type=float, help='Maximum dose in Gray')
parser.add_option('--Trans', default=100., type=float, help='Transmission')
parser.add_option('-g', action='store_true', help='Generate useful plots')
options, args = parser.parse_args()
b = best(**vars(options))
b.run()
if __name__ == '__main__':
main()