def get_group_symmetry_reference_matched(self, ref_cs):
        ref_v6 = xtal.v6cell(ref_cs.niggli_cell().unit_cell())
        ncdists = []
        for i, keys in enumerate(self.groups):
            v6 = xtal.v6cell(
                uctbx.unit_cell(self._average_p1_cell(keys)).niggli_cell())
            ncdists.append(NCDist(v6, ref_v6))
            print "Group %d: NCDist to reference: %f" % (i + 1, ncdists[-1])

        return ncdists.index(min(ncdists)) + 1
def run(params):
    if params.datout is None: params.datout = os.path.basename(params.lstin)+".dat"

    xac_files = read_path_list(params.lstin)
    ofs_dat = open(params.datout, "w")

    ref_v6cell = None
    if params.ref_cell is not None:
        ref_v6cell = v6cell(uctbx.unit_cell(params.ref_cell).niggli_cell())
        ofs_dat.write("# ref_cell= %s\n" % params.ref_cell)

    if params.n_residues is not None: ofs_dat.write("# n_residues= %d\n" % params.n_residues)

    ofs_dat.write("file ioversigma resnatsnr1 wilsonb abdist a b c al be ga\n")

    ret = easy_mp.pool_map(fixed_func=lambda x: calc_stats(x, params.stats, params.n_residues, ref_v6cell,
                                                           params.min_peak, params.min_peak_percentile,
                                                           params.correct_peak),
                           args=xac_files,
                           processes=params.nproc)
    
    for stat in ret:
        getornan = lambda x: stat.get(x, float("nan")) # get or nan
        ofs_dat.write("%s %.3f %.3f %.3f %.3e"%(stat["filename"],
                                                getornan("ioversigma"), getornan("resnatsnr1"),
                                                getornan("wilsonb"), getornan("abdist")))
        ofs_dat.write(" %.3f %.3f %.3f %.2f %.2f %.2f\n" % stat["cell"])

    ofs_dat.close()
def run(params):
    if params.datout is None:
        params.datout = os.path.basename(params.lstin) + ".dat"

    xac_files = read_path_list(params.lstin)
    ofs_dat = open(params.datout, "w")

    ref_v6cell = None
    if params.ref_cell is not None:
        ref_v6cell = v6cell(uctbx.unit_cell(params.ref_cell).niggli_cell())
        ofs_dat.write("# ref_cell= %s\n" % params.ref_cell)

    if params.n_residues is not None:
        ofs_dat.write("# n_residues= %d\n" % params.n_residues)

    ofs_dat.write("file ioversigma resnatsnr1 wilsonb abdist a b c al be ga\n")

    ret = easy_mp.pool_map(fixed_func=lambda x: calc_stats(
        x, params.stats, params.n_residues, ref_v6cell, params.min_peak, params
        .min_peak_percentile, params.correct_peak),
                           args=xac_files,
                           processes=params.nproc)

    for stat in ret:
        getornan = lambda x: stat.get(x, float("nan"))  # get or nan
        ofs_dat.write(
            "%s %.3f %.3f %.3f %.3e" %
            (stat["filename"], getornan("ioversigma"), getornan("resnatsnr1"),
             getornan("wilsonb"), getornan("abdist")))
        ofs_dat.write(" %.3f %.3f %.3f %.2f %.2f %.2f\n" % stat["cell"])

    ofs_dat.close()
def calc_stats(xac_file, stat_choice, n_residues=None, ref_v6cell=None,
               min_peak=None, min_peak_percentile=None, correct_peak=None):
    # Open XDS_ASCII
    if xac_file.endswith(".pkl"): xac = pickle.load(open(xac_file))
    else: xac = xds_ascii.XDS_ASCII(xac_file)
    
    sel_remove = flex.bool(xac.iobs.size(), False)
    if min_peak is not None:
        sel = xac.peak < min_peak
        sel_remove |= sel
    elif min_peak_percentile is not None:
        q = numpy.percentile(xac.peak, min_peak_percentile)
        print "percentile %.2f %s" % (q, xac)
        sel = xac.peak < q
        sel_remove |= sel

    if correct_peak: sel_remove |= (xac.peak < 1) # remove PEAK==0

    xac.remove_selection(sel_remove)

    if params.correct_peak:
        xac.iobs *= xac.peak * .01
        xac.sigma_iobs *= xac.peak * .01

    iobs = xac.i_obs(anomalous_flag=False)
    iobs = iobs.select(iobs.sigmas()>0).merge_equivalents(use_internal_variance=False).array()
    
    stats = dict(filename=xac_file, cell=iobs.unit_cell().parameters())

    if iobs.size() == 0:
        return stats

    if "ioversigma" in stat_choice or "resnatsnr1" in stat_choice:
        binner = iobs.setup_binner(auto_binning=True)

        if "ioversigma" in stat_choice: stats["ioversigma"] = flex.mean(iobs.data()/iobs.sigmas())

        if "resnatsnr1" in stat_choice:
            res = float("nan")
            for i_bin in binner.range_used():
                sel = binner.selection(i_bin)
                tmp = iobs.select(sel)
                if tmp.size() == 0: continue
                sn = flex.mean(tmp.data()/tmp.sigmas())
                if sn <= 1:
                    res = binner.bin_d_range(i_bin)[1]
                    break

            stats["resnatsnr1"] = res

    if "abdist" in stat_choice:
        from cctbx.uctbx.determine_unit_cell import NCDist
        G6a, G6b = ref_v6cell, v6cell(iobs.unit_cell().niggli_cell())
        abdist = NCDist(G6a, G6b)
        stats["abdist"] = abdist

    if "wilsonb" in stat_choice:
        iso_scale_and_b = ml_iso_absolute_scaling(iobs, n_residues, 0)
        stats["wilsonb"] = iso_scale_and_b.b_wilson

    print stats
    return stats
def calc_stats(xac_file,
               stat_choice,
               n_residues=None,
               ref_v6cell=None,
               min_peak=None,
               min_peak_percentile=None,
               correct_peak=None):
    # Open XDS_ASCII
    if xac_file.endswith(".pkl"): xac = pickle.load(open(xac_file))
    else: xac = xds_ascii.XDS_ASCII(xac_file)

    sel_remove = flex.bool(xac.iobs.size(), False)
    if min_peak is not None:
        sel = xac.peak < min_peak
        sel_remove |= sel
    elif min_peak_percentile is not None:
        q = numpy.percentile(xac.peak, min_peak_percentile)
        print "percentile %.2f %s" % (q, xac)
        sel = xac.peak < q
        sel_remove |= sel

    if correct_peak: sel_remove |= (xac.peak < 1)  # remove PEAK==0

    xac.remove_selection(sel_remove)

    if params.correct_peak:
        xac.iobs *= xac.peak * .01
        xac.sigma_iobs *= xac.peak * .01

    iobs = xac.i_obs(anomalous_flag=False)
    iobs = iobs.select(iobs.sigmas() > 0).merge_equivalents(
        use_internal_variance=False).array()

    stats = dict(filename=xac_file, cell=iobs.unit_cell().parameters())

    if iobs.size() == 0:
        return stats

    if "ioversigma" in stat_choice or "resnatsnr1" in stat_choice:
        binner = iobs.setup_binner(auto_binning=True)

        if "ioversigma" in stat_choice:
            stats["ioversigma"] = flex.mean(iobs.data() / iobs.sigmas())

        if "resnatsnr1" in stat_choice:
            res = float("nan")
            for i_bin in binner.range_used():
                sel = binner.selection(i_bin)
                tmp = iobs.select(sel)
                if tmp.size() == 0: continue
                sn = flex.mean(tmp.data() / tmp.sigmas())
                if sn <= 1:
                    res = binner.bin_d_range(i_bin)[1]
                    break

            stats["resnatsnr1"] = res

    if "abdist" in stat_choice:
        from cctbx.uctbx.determine_unit_cell import NCDist
        G6a, G6b = ref_v6cell, v6cell(iobs.unit_cell().niggli_cell())
        abdist = NCDist(G6a, G6b)
        stats["abdist"] = abdist

    if "wilsonb" in stat_choice:
        iso_scale_and_b = ml_iso_absolute_scaling(iobs, n_residues, 0)
        stats["wilsonb"] = iso_scale_and_b.b_wilson

    print stats
    return stats