Ejemplo n.º 1
0
      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))
Ejemplo n.º 2
0
  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