imgname=filelist[i] img = dxtbx.load(imgname) detector = img.get_detector() beam = img.get_beam() scan = img.get_scan() gonio = img.get_goniometer() print "s0 from ",imgname,": ",beam.get_s0() print "wavelength from ",imgname,": ",beam.get_wavelength() crystal = copy.deepcopy(experiments.crystals()[0]) axis = gonio.get_rotation_axis() start_angle, delta_angle = scan.get_oscillation() crystal.rotate_around_origin(axis, start_angle + (delta_angle/2), deg=True) if (output_format == "json"): exp_list = ExperimentList() exp_list.append(Experiment(imageset=ImageSetFactory.make_imageset(list([imgname])), beam=beam, detector=detector, goniometer=gonio, scan=scan, crystal=crystal)) if (add_background_images==True): if (len(bkglist) != 1): bkgname=bkglist[i] exp_list[0].imageset.external_lookup.pedestal.filename=os.path.abspath(bkgname) dump.experiment_list(exp_list,json_dir+"/experiments_for_lunus_{0:05d}.json".format(imnum)) else: from scitbx import matrix A_matrix = matrix.sqr(crystal.get_A()).inverse() At = np.asarray(A_matrix.transpose()).reshape((3,3))
def build_statistics_rejecting_outliers(self,refl_gen): # XXX duplicates behavior of above function; should refactor to cover both cases with same code. n_total = 0 n_file = 0 sum_delta_x = 0 sum_delta_y = 0 deltax = {} deltay = {} delRoverR = {} panel_deltax = {} panel_deltay = {} panel_deltapsi = {} cumPANNO = {} cumOBS = {} cumCALC = {} run_nos = {} print ("Reading %d refl files, WITH REJECTION printing the first 10"%(len(refl_gen))) for item in refl_gen: strong_refls = item["strong_refls"] nrefls = len(strong_refls) keep_refls = flex.bool(nrefls, True) if self.params.dispatch.by_run==True: run_match = RUN.match(item["strfile"]) run_token = int(run_match.group(1)); run_nos[run_token]=run_nos.get(run_token,0); run_nos[run_token]+=1 deltax[run_token] = deltax.get(run_token, flex.double()) deltay[run_token] = deltay.get(run_token, flex.double()) delRoverR[run_token] = delRoverR.get(run_token, flex.double()) OBS = flex.vec2_double() CALC = flex.vec2_double() if n_file < 1000: print (item["strfile"], nrefls) n_total += nrefls n_file += 1 fcalc = strong_refls["xyzcal.mm"] fobs = strong_refls["xyzobs.mm.value"] delpsi = strong_refls["delpsical.rad"] panno = strong_refls["panel"] if n_file==1: for ipanel in range(256): panel_deltax[ipanel] = panel_deltax.get(ipanel, flex.double()) panel_deltay[ipanel] = panel_deltay.get(ipanel, flex.double()) panel_deltapsi[ipanel] = panel_deltapsi.get(ipanel, flex.double()) for isensor in range(32): cumOBS[isensor] = cumOBS.get(isensor, flex.vec3_double()) cumCALC[isensor] = cumCALC.get(isensor, flex.vec3_double()) cumPANNO[isensor] = cumPANNO.get(isensor, flex.int()) expt_files = glob.glob(self.params.input.expt_glob) expt_file = expt_files[0] from dxtbx.model.experiment_list import ExperimentList int_expt = ExperimentList.from_file(expt_file, check_format=False)[0] D = int_expt.detector B = int_expt.beam Beam = D.hierarchy().get_beam_centre_lab((0,0,-1)) # hard code the sample to source vector for now distance = D.hierarchy().get_distance() for irefl in range(len(strong_refls)): trial_delta_x = (fcalc[irefl][0] - fobs[irefl][0]) trial_delta_y = (fcalc[irefl][1] - fobs[irefl][1]) #if irefl==26 and nrefls==400: import ipdb;ipdb.set_trace() try: maha_distance = self.record_MCD_models[panno[irefl]].rob_cov.mahalanobis(X=[ (trial_delta_x,trial_delta_y,delpsi[irefl]) ])[0] except KeyError: maha_distance = None if ( maha_distance is None or maha_distance >= (self.params.residuals.mcd_filter.mahalanobis_distance)**2 ): keep_refls[irefl]=False continue sum_delta_x += trial_delta_x sum_delta_y += trial_delta_y panel = D[panno[irefl]] panel_deltax[panno[irefl]].append( trial_delta_x ) panel_deltay[panno[irefl]].append( trial_delta_y ) panel_deltapsi[panno[irefl]].append( delpsi[irefl] ) CALC.append(panel.get_lab_coord(fcalc[irefl][0:2])[0:2]) # take only the xy coords; assume z along beam OBS.append(panel.get_lab_coord(fobs[irefl][0:2])[0:2]) cumCALC[panno[irefl]//8].append(panel.get_lab_coord(fcalc[irefl][0:2])) cumOBS[panno[irefl]//8].append(panel.get_lab_coord(fobs[irefl][0:2])) cumPANNO[panno[irefl]//8].append(panno[irefl]) if self.params.dispatch.by_run==True: for irefl in range(len(strong_refls)): deltax[run_token].append( (fcalc[irefl][0] - fobs[irefl][0]) ) deltay[run_token].append( (fcalc[irefl][1] - fobs[irefl][1]) ) R_sq = CALC.dot(CALC) DIFF = CALC-OBS Dr_over_r = (DIFF.dot(CALC))/R_sq if self.params.dispatch.by_run==True: for irefl in range(len(Dr_over_r)): delRoverR[run_token].append( Dr_over_r[irefl] ) if self.params.output.observations_filtered_replaces is not None: filtered_file = item["obsfile"].replace(self.params.output.observations_filtered_replaces,"filtered") item["strong_refls"].select(keep_refls).as_file(filtered_file) from libtbx import adopt_init_args obj = dict(n_total=n_total, n_file=n_file, sum_delta_x=sum_delta_x, sum_delta_y=sum_delta_y, deltax=deltax, deltay=deltay, distance=distance, delRoverR=delRoverR, panel_deltax=panel_deltax, panel_deltay=panel_deltay, panel_deltapsi=panel_deltapsi, cumOBS=cumOBS, cumCALC=cumCALC, cumPANNO=cumPANNO, O="ok") adopt_init_args(self, obj) self.ordered_run_nos = sorted(list(run_nos.keys())) self.run_nos = run_nos