コード例 #1
0
ファイル: util.py プロジェクト: andrewhanlon/sigmond_scripts
def _get_free_obs(obs_handler, obs_name):
    obs_name = f"{obs_name}"
    obs_ind = 100000
    obs_info = sigmond.MCObsInfo(obs_name, obs_ind)
    while obs_handler.queryBins(obs_info) or obs_handler.queryFullAndSamplings(
            obs_info):
        obs_ind += 1
        obs_info = sigmond.MCObsInfo(obs_name, obs_ind)

    return obs_info
コード例 #2
0
    def parse(self, log_xml_root):
        self.energies = SortedDict()
        self.reorder = True
        energy_level_xmls = log_xml_root.findall(
            "Task/DoRotCorrMatInsertFitInfos/SinglePivot/ReorderEnergies/EnergyLevel"
        )
        if not energy_level_xmls:
            self.reorder = False
            energy_level_xmls = log_xml_root.findall(
                "Task/GetFromPivot/Energies/EnergyLevel")

        for energy_level_xml in energy_level_xmls:
            if self.reorder:
                new_level = int(energy_level_xml.findtext("LevelIndex"))
                orig_level = int(energy_level_xml.findtext("OriginalIndex"))
            else:
                new_level = int(energy_level_xml.findtext("Level"))
                orig_level = int(energy_level_xml.findtext("Level"))

            level = Level(new_level, orig_level)
            energy_obs_str = energy_level_xml.findtext("MCObservable/Info")
            pattern = r"^(?P<obsname>\S+) (?P<obsid>\d+) (?P<simple>s|n) (?P<complex_arg>re|im)$"
            match = regex.match(pattern, energy_obs_str.strip())
            if match.group('simple') != 'n' or match.group(
                    'complex_arg') != 're':
                logging.error("Energies are supposed to be simple and real")

            energy_obs = sigmond.MCObsInfo(match.group('obsname'),
                                           int(match.group('obsid')))
            fit_info = FitInfo.createFromObservable(energy_obs)
            self.energies[level] = fit_info

        self.zfactors = SortedDict()
        for operator_zfactor_xml in log_xml_root.findall(
                "Task/DoCorrMatrixZMagSquares/OperatorZMagnitudeSquares"):
            op_zfactors = SortedDict()
            op_str = [
                xml.text for xml in operator_zfactor_xml.iter()
                if 'OperatorString' in xml.tag
            ][0]

            op = Operator(op_str)

            for zfactor_xml in operator_zfactor_xml.findall("ZMagSquare"):
                level = int(zfactor_xml.findtext("Level"))
                zfactor_value = float(
                    zfactor_xml.findtext("Value/MCEstimate/FullEstimate"))
                op_zfactors[level] = zfactor_value

            self.zfactors[op] = op_zfactors
コード例 #3
0
def get_data(correlator, data_file, ensemble_name):
    stub, ext = os.path.splitext(data_file)
    suffix = int(ext[1:])
    file_list_info = sigmond.FileListInfo(stub, suffix, suffix, False)

    mcobs_xml = ET.Element("MCObservables")
    corr_data_xml = ET.SubElement(mcobs_xml, "BLCorrelatorData")
    corr_data_xml.append(file_list_info.xml())

    mcobs_xml_handler = sigmond.XMLHandler()
    mcobs_xml_handler.set_from_string(ET.tostring(mcobs_xml))
    sampling_info = sigmond.MCSamplingInfo()
    ensemble_info = sigmond.MCEnsembleInfo(ensemble_name, 'ensembles.xml')
    bins_info = sigmond.MCBinsInfo(ensemble_info)
    bins_info.addOmissions(defs.omissions[ensemble_name])
    obs_get_handler = sigmond.MCObsGetHandler(mcobs_xml_handler, bins_info,
                                              sampling_info)
    obs_handler = sigmond.MCObsHandler(obs_get_handler, False)

    corr_handler = sigmond.BLCorrelatorDataHandler([file_list_info], set(),
                                                   set(), ensemble_info)

    keys = corr_handler.getOrderedKeys(correlator)
    tmin = keys[0].getTimeIndex()
    tmax = keys[-1].getTimeIndex()

    correlator_data = dict()
    corr_time_info = sigmond.CorrelatorAtTimeInfo(correlator, 0, True, False)
    for tsep in range(tmin, tmax + 1):
        for cmp_i, complex_arg in enumerate(COMPLEX_ARGS):
            corr_time_info.resetTimeSeparation(tsep)
            obs_info = sigmond.MCObsInfo(corr_time_info, complex_arg)
            data = obs_handler.getBins(obs_info)
            correlator_data[obs_info] = np.array(data.array())

    return correlator_data
コード例 #4
0
def get_data(correlator, data_files, ensemble_name, ensemble_Nt, tsrc,
             forward):
    if not forward:
        correlator.setBackwards()

    mcobs_xml = ET.Element("MCObservables")
    corr_data_xml = ET.SubElement(mcobs_xml, "BLCorrelatorData")

    bl_op = correlator.getSource().getBasicLapH()
    # TODO: replace with isFermionic()
    change_sign = bl_op.isBaryon() or bl_op.isMesonBaryon()

    file_list_infos = list()
    has_opposite = data_files[1] is not None
    for data_file in data_files:
        if data_file is None:
            continue
        stub, ext = os.path.splitext(data_file)
        suffix = int(ext[1:])
        file_list_info = sigmond.FileListInfo(stub, suffix, suffix, False)
        corr_data_xml.append(file_list_info.xml())
        file_list_infos.append(file_list_info)

    mcobs_xml_handler = sigmond.XMLHandler()
    mcobs_xml_handler.set_from_string(ET.tostring(mcobs_xml))
    sampling_info = sigmond.MCSamplingInfo()
    ensemble_info = sigmond.MCEnsembleInfo(ensemble_name, 'ensembles.xml')
    bins_info = sigmond.MCBinsInfo(ensemble_info)
    bins_info.addOmissions(defs.omissions[ensemble_name])
    obs_get_handler = sigmond.MCObsGetHandler(mcobs_xml_handler, bins_info,
                                              sampling_info)
    obs_handler = sigmond.MCObsHandler(obs_get_handler, False)

    corr_handler = sigmond.BLCorrelatorDataHandler(file_list_infos, set(),
                                                   set(), ensemble_info)

    keys = corr_handler.getOrderedKeys(correlator)
    tmin = keys[0].getTimeIndex()
    tmax = keys[-1].getTimeIndex()

    if has_opposite:
        correlator_opposite = sigmond.CorrelatorInfo(correlator.getSource(),
                                                     correlator.getSink())
        keys = corr_handler.getOrderedKeys(correlator_opposite)
        tmin_opp = keys[0].getTimeIndex()
        tmax_opp = keys[-1].getTimeIndex()

        if tmin != tmin_opp:
            print("mismatch between tmin on corresponding correlators")
            exit()

        if tmax != tmax_opp:
            print("mismatch between tmax on corresponding correlators")
            exit()

    correlator_data = dict()
    corr_time_info = sigmond.CorrelatorAtTimeInfo(correlator, 0, False, False)
    if has_opposite:
        corr_time_info_opp = sigmond.CorrelatorAtTimeInfo(
            correlator_opposite, 0, False, False)

    corr_time_info_herm = sigmond.CorrelatorAtTimeInfo(correlator, 0, True,
                                                       False)
    for tsep in range(tmin, tmax + 1):
        for complex_arg in COMPLEX_ARGS:
            if correlator.isSinkSourceSame(
            ) and complex_arg is sigmond.ComplexArg.ImaginaryPart:
                continue

            corr_time_info.resetTimeSeparation(tsep)
            corr_time_info_obs_info = sigmond.MCObsInfo(
                corr_time_info, complex_arg)
            data = np.array(
                obs_handler.getBins(corr_time_info_obs_info).array())

            if has_opposite:
                corr_time_info_opp.resetTimeSeparation(tsep)
                corr_time_info_opp_obs_info = sigmond.MCObsInfo(
                    corr_time_info_opp, complex_arg)
                data_opp = np.array(
                    obs_handler.getBins(corr_time_info_opp_obs_info).array())
                if complex_arg is sigmond.ComplexArg.RealPart:
                    data = 0.5 * (data + data_opp)
                else:
                    data = 0.5 * (data - data_opp)

            if change_sign:
                if not forward:
                    data = -data

                for bin_i, config in enumerate(
                        defs.config_indices[ensemble_name]):
                    if forward:
                        T = tsep + tsrc + defs.source_lists[ensemble_name][
                            config] % SOURCE_MOD
                    else:
                        T = -tsep + tsrc + defs.source_lists[ensemble_name][
                            config] % SOURCE_MOD

                    if T >= ensemble_Nt or T < 0:
                        data[bin_i] = -data[bin_i]

            corr_time_info_herm.resetTimeSeparation(tsep)
            if not forward:
                corr_time_info_herm.setForwards()

            corr_time_info_herm_obs_info = sigmond.MCObsInfo(
                corr_time_info_herm, complex_arg)
            correlator_data[corr_time_info_herm_obs_info] = data

    if not forward:
        correlator.setForwards()

    return correlator_data
コード例 #5
0
def get_data(correlator, data_file, data_file_opposite, is_backwards,
             ensemble_name):
    if is_backwards:
        correlator.setBackwards()

    mcobs_xml = ET.Element("MCObservables")
    corr_data_xml = ET.SubElement(mcobs_xml, "BLCorrelatorData")

    file_list_infos = list()
    has_opposite = data_file_opposite is not None
    if has_opposite:
        data_files = [data_file, data_file_opposite]
    else:
        data_files = [data_file]

    for d_file in data_files:
        stub, ext = os.path.splitext(d_file)
        suffix = int(ext[1:])
        file_list_info = sigmond.FileListInfo(stub, suffix, suffix, False)
        corr_data_xml.append(file_list_info.xml())
        file_list_infos.append(file_list_info)

    mcobs_xml_handler = sigmond.XMLHandler()
    mcobs_xml_handler.set_from_string(ET.tostring(mcobs_xml))
    sampling_info = sigmond.MCSamplingInfo()
    ensemble_info = sigmond.MCEnsembleInfo(ensemble_name, 'ensembles.xml')
    bins_info = sigmond.MCBinsInfo(ensemble_info)
    bins_info.addOmissions(defs.omissions[ensemble_name])
    obs_get_handler = sigmond.MCObsGetHandler(mcobs_xml_handler, bins_info,
                                              sampling_info)
    obs_handler = sigmond.MCObsHandler(obs_get_handler, False)

    corr_handler = sigmond.BLCorrelatorDataHandler(file_list_infos, set(),
                                                   set(), ensemble_info)

    keys = corr_handler.getOrderedKeys(correlator)
    tmin = keys[0].getTimeIndex()
    tmax = keys[-1].getTimeIndex()

    if has_opposite:
        correlator_opposite = sigmond.CorrelatorInfo(correlator.getSource(),
                                                     correlator.getSink())
        keys = corr_handler.getOrderedKeys(correlator_opposite)
        tmin_opp = keys[0].getTimeIndex()
        tmax_opp = keys[-1].getTimeIndex()

        if tmin != tmin_opp:
            print("mismatch between tmin on corresponding correlators")
            exit()

        if tmax != tmax_opp:
            print("mismatch between tmax on corresponding correlators")
            exit()

    correlator_data = dict()
    corr_time_info = sigmond.CorrelatorAtTimeInfo(correlator, 0, False, False)
    if has_opposite:
        corr_time_info_opp = sigmond.CorrelatorAtTimeInfo(
            correlator_opposite, 0, False, False)

    corr_time_info_herm = sigmond.CorrelatorAtTimeInfo(correlator, 0, True,
                                                       False)
    for tsep in range(tmin, tmax + 1):
        for cmp_i, complex_arg in enumerate(COMPLEX_ARGS):
            if correlator.isSinkSourceSame(
            ) and complex_arg is sigmond.ComplexArg.ImaginaryPart:
                continue

            corr_time_info.resetTimeSeparation(tsep)
            corr_time_info_obs_info = sigmond.MCObsInfo(
                corr_time_info, complex_arg)
            data = np.array(
                obs_handler.getBins(corr_time_info_obs_info).array())

            if has_opposite:
                corr_time_info_opp.resetTimeSeparation(tsep)
                corr_time_info_opp_obs_info = sigmond.MCObsInfo(
                    corr_time_info_opp, complex_arg)
                data_opp = np.array(
                    obs_handler.getBins(corr_time_info_opp_obs_info).array())
                data = 0.5 * (data + np.conj(data_opp))

            corr_time_info_herm.resetTimeSeparation(tsep)
            if is_backwards:
                corr_time_info_herm.setForwards()

            corr_time_info_herm_obs_info = sigmond.MCObsInfo(
                corr_time_info_herm, complex_arg)
            correlator_data[corr_time_info_herm_obs_info] = data

    if is_backwards:
        correlator.setForwards()

    return correlator_data
コード例 #6
0
def convert_dibaryons(ensemble, channel, ops):
    if channel.flavor is None and ensemble.su3:
        return

    if channel.flavor is not None and not ensemble.su3:
        return

    if not ops:
        return

    data_dir = os.path.join(base_data_dir, f"analysis_{ensemble.dir_name}")
    data_str = 'c2_dibaryon'
    if ensemble.su3:
        data_str += f"/{channel.P}/{channel.irrep}/{channel.flavor}"
    else:
        data_str += f"/{channel.strangeness}/{channel.isospin}/{channel.P}/{channel.irrep}"

    data_handlers = list()
    raw_datas = list()
    for replica in ensemble.replica:
        if ensemble.su3:
            data_filename = f"{ensemble.dir_name}{replica}_{ensemble.modes}modes.hdf5"
        else:
            data_filename = f"{ensemble.dir_name}{replica}_{ensemble.modes}modes_{channel.strangeness}.hdf5"
        data_file = os.path.join(data_dir, data_filename)
        f_handler = h5py.File(data_file, 'r')
        data_handlers.append(f_handler)
        raw_datas.append(f_handler[data_str])

    ensemble_info = sig.MCEnsembleInfo(f"cls_{ensemble.name}", 'ensembles.xml')
    bins_info = sig.MCBinsInfo(ensemble_info)
    sampling_info = sig.MCSamplingInfo()
    xml_obs = sig.XMLHandler("MCObservables", "")
    obs_get_handler = sig.MCObsGetHandler(xml_obs, bins_info, sampling_info)
    obs_handler = sig.MCObsHandler(obs_get_handler, False)

    if ensemble.su3:
        bin_dir = os.path.join("data", ensemble.name, "dibaryons", channel.P,
                               channel.irrep, channel.flavor)
        os.makedirs(bin_dir, exist_ok=True)
        bin_filename = "{}{}_{}modes_{}_{}_F{}.bin".format(
            ensemble.name, ensemble.replica_str, ensemble.modes, channel.P,
            channel.irrep, channel.flavor)
    else:
        bin_dir = os.path.join("data", ensemble.name, "dibaryons",
                               f"{channel.isospin}_{channel.strangeness}",
                               channel.P, channel.irrep)
        os.makedirs(bin_dir, exist_ok=True)
        bin_filename = "{}{}_{}modes_{}_{}_{}_{}.bin".format(
            ensemble.name, ensemble.replica_str, ensemble.modes,
            channel.isospin, channel.strangeness, channel.P, channel.irrep)

    bin_file = os.path.join(bin_dir, bin_filename)
    obs_keys = set()

    for opsrc_i, opsrc_str in enumerate(ops):
        opsnks_enum = enumerate(
            ops[opsrc_i:], start=opsrc_i) if FORCE_HERM else enumerate(ops)
        for opsnk_i, opsnk_str in opsnks_enum:
            for t in range(ensemble.t0, ensemble.t0 + ensemble.ts):
                bin_datas = list()
                for raw_data in raw_datas:
                    bin_data = np.zeros(raw_data.shape[0], dtype=np.complex128)
                    for tsrc in range(ensemble.srcs):
                        for par in range(2):
                            if skip_source(ensemble.name, tsrc, par):
                                continue

                            if FORCE_HERM:
                                bin_data += 0.5 * (
                                    raw_data[:, tsrc, par, opsnk_i, opsrc_i,
                                             t - ensemble.t0] +
                                    np.conj(
                                        raw_data[:, tsrc, par, opsrc_i,
                                                 opsnk_i, t - ensemble.t0]))
                            else:
                                bin_data += raw_data[:, tsrc, par, opsnk_i,
                                                     opsrc_i, t - ensemble.t0]

                    bin_datas.append(bin_data)

                opsrc = sig.OperatorInfo(opsrc_str, sig.OpKind.GenIrrep)
                opsnk = sig.OperatorInfo(opsnk_str, sig.OpKind.GenIrrep)
                corr = sig.CorrelatorAtTimeInfo(opsnk, opsrc, t, FORCE_HERM,
                                                False)

                corr_re = sig.MCObsInfo(corr, sig.ComplexArg.RealPart)
                re_bin_data = sig.RVector(
                    sum([[x.real for x in bins] for bins in bin_datas], []))
                obs_handler.putBins(corr_re, re_bin_data)
                obs_keys.add(corr_re)

                if not FORCE_HERM or opsrc != opsnk:
                    corr_im = sig.MCObsInfo(corr, sig.ComplexArg.ImaginaryPart)
                    im_bin_data = sig.RVector(
                        sum([[x.imag for x in bins] for bins in bin_datas],
                            []))
                    obs_handler.putBins(corr_im, im_bin_data)
                    obs_keys.add(corr_im)

    xml_out = sig.XMLHandler("output", "")
    obs_handler.writeBinsToFile(obs_keys, bin_file, xml_out,
                                sig.WriteMode.Protect)
    obs_handler.clearData()

    for data_handler in data_handlers:
        data_handler.close()
コード例 #7
0
def convert_pseudoscalar(ensemble):
    data_dir = os.path.join(base_data_dir, f"analysis_{ensemble.dir_name}")
    data_handlers = list()
    tsrc_list = dict()
    raw_datas = dict()
    for ps_name in defs.pseudoscalar_names[ensemble.name]:
        raw_datas[ps_name] = list()

    for rep_num, replica in enumerate(ensemble.replica):
        data_filename = "{}{}_{}modes_pseudoscalar.hdf5".format(
            ensemble.dir_name, replica, defs.pseudoscalar_modes[ensemble.name])
        data_file = os.path.join(data_dir, data_filename)
        f_handler = h5py.File(data_file, 'r')
        data_handlers.append(f_handler)
        for ps_name in defs.pseudoscalar_names[ensemble.name]:
            raw_datas[ps_name].append(f_handler[ps_name])

        if ensemble.name in defs.tsrc_files:
            tsrc_list[rep_num] = dict()
            tsrc_file = os.path.join(data_dir,
                                     defs.tsrc_files[ensemble.name] + replica)
            with open(tsrc_file, 'r') as tsrc_file_h:
                for line in tsrc_file_h:
                    conf, tsrc = line.split()
                    tsrc_list[rep_num][int(conf) - 1] = int(tsrc)

    ensemble_info = sig.MCEnsembleInfo(f"cls_{ensemble.name}", 'ensembles.xml')
    bins_info = sig.MCBinsInfo(ensemble_info)
    sampling_info = sig.MCSamplingInfo()
    xml_obs = sig.XMLHandler("MCObservables", "")
    obs_get_handler = sig.MCObsGetHandler(xml_obs, bins_info, sampling_info)
    obs_handler = sig.MCObsHandler(obs_get_handler, False)

    bin_dir = os.path.join("data", ensemble.name, "single_particles")
    os.makedirs(bin_dir, exist_ok=True)
    bin_filename = "{}{}_{}modes_pseudoscalar.bin".format(
        ensemble.name, ensemble.replica_str,
        defs.pseudoscalar_modes[ensemble.name])
    bin_file = os.path.join(bin_dir, bin_filename)
    obs_keys = set()
    for ps_name in defs.pseudoscalar_names[ensemble.name]:
        for t in range(ensemble.Nt):
            bin_datas = list()
            for rep_num, raw_data in enumerate(raw_datas[ps_name]):
                bin_data = np.zeros(raw_data.shape[0], dtype=np.complex128)
                for tsrc in range(ensemble.srcs):

                    if tsrc_list:
                        for config in range(raw_data.shape[0]):
                            t0 = defs.pseudoscalar_sources[ensemble.name][
                                tsrc] + tsrc_list[rep_num][config]
                            ts_forward = (t0 + t) % ensemble.Nt
                            ts_reverse = (t0 - t) % ensemble.Nt

                            if not ensemble.open:
                                bin_data[config] += raw_data[config, tsrc,
                                                             ts_forward]
                            elif use_forward_pseudoscalar(
                                    ensemble.name,
                                    tsrc) and use_backward_pseudoscalar(
                                        ensemble.name, tsrc):
                                bin_data[config] += raw_data[config, tsrc,
                                                             ts_forward]
                                bin_data[config] += raw_data[config, tsrc,
                                                             ts_reverse]
                            elif use_forward_pseudoscalar(ensemble.name, tsrc):
                                bin_data[config] += raw_data[config, tsrc,
                                                             ts_forward]
                            elif use_backward_pseudoscalar(
                                    ensemble.name, tsrc):
                                bin_data[config] += raw_data[config, tsrc,
                                                             ts_reverse]

                    else:
                        t0 = defs.pseudoscalar_sources[ensemble.name][tsrc]
                        ts_forward = (t0 + t) % ensemble.Nt
                        ts_reverse = (t0 - t) % ensemble.Nt

                        if not ensemble.open:
                            bin_data += raw_data[:, tsrc, ts_forward]
                        elif use_forward_pseudoscalar(
                                ensemble.name,
                                tsrc) and use_backward_pseudoscalar(
                                    ensemble.name, tsrc):
                            bin_data += raw_data[:, tsrc, ts_forward]
                            bin_data += raw_data[:, tsrc, ts_reverse]
                        elif use_forward_pseudoscalar(ensemble.name, tsrc):
                            bin_data += raw_data[:, tsrc, ts_forward]
                        elif use_backward_pseudoscalar(ensemble.name, tsrc):
                            bin_data += raw_data[:, tsrc, ts_reverse]

                bin_datas.append(bin_data)

            op_str = defs.pseudoscalar_op_strs[ensemble.name][ps_name]
            op = sig.OperatorInfo(op_str, sig.OpKind.GenIrrep)
            corr = sig.CorrelatorAtTimeInfo(op, op, t, FORCE_HERM, False)

            corr_re = sig.MCObsInfo(corr, sig.ComplexArg.RealPart)
            re_bin_data = sig.RVector(
                sum([[x.real for x in bins] for bins in bin_datas], []))
            obs_handler.putBins(corr_re, re_bin_data)
            obs_keys.add(corr_re)

            if not FORCE_HERM:
                corr_im = sig.MCObsInfo(corr, sig.ComplexArg.ImaginaryPart)
                im_bin_data = sig.RVector(
                    sum([[x.imag for x in bins] for bins in bin_datas], []))
                obs_handler.putBins(corr_im, im_bin_data)
                obs_keys.add(corr_im)

    xml_out = sig.XMLHandler("output", "")
    obs_handler.writeBinsToFile(obs_keys, bin_file, xml_out,
                                sig.WriteMode.Protect)
    obs_handler.clearData()

    for data_handler in data_handlers:
        data_handler.close()
コード例 #8
0
def convert_baryons(ensemble):
    data_dir = os.path.join(base_data_dir, f"analysis_{ensemble.dir_name}")
    data_handlers = list()
    raw_datas = list()
    for replica in ensemble.replica:
        data_filename = "{}{}_{}modes_baryon.hdf5".format(
            ensemble.dir_name, replica, ensemble.modes)
        data_file = os.path.join(data_dir, data_filename)
        f_handler = h5py.File(data_file, 'r')
        data_handlers.append(f_handler)
        raw_datas.append(f_handler['c2_baryon'])

    flavors = ['lambda']
    num_flavors = 1
    if not ensemble.su3:
        flavors = list(
            map(lambda x: x.decode('utf-8'), f_handler['baryons'][:]))
        num_flavors = len(flavors)

    ensemble_info = sig.MCEnsembleInfo(f"cls_{ensemble.name}", 'ensembles.xml')
    bins_info = sig.MCBinsInfo(ensemble_info)
    sampling_info = sig.MCSamplingInfo()
    xml_obs = sig.XMLHandler("MCObservables", "")
    obs_get_handler = sig.MCObsGetHandler(xml_obs, bins_info, sampling_info)
    obs_handler = sig.MCObsHandler(obs_get_handler, False)

    bin_dir = os.path.join("data", ensemble.name, "single_particles")
    os.makedirs(bin_dir, exist_ok=True)
    if ensemble.su3:
        bin_filename = "{}{}_{}modes_lambda.bin".format(
            ensemble.name, ensemble.replica_str, ensemble.modes)
    else:
        bin_filename = "{}{}_{}modes_baryons.bin".format(
            ensemble.name, ensemble.replica_str, ensemble.modes)
    bin_file = os.path.join(bin_dir, bin_filename)
    obs_keys = set()

    for psq in range(4):
        irrep = defs.spin_half_irreps[psq]
        for flavor in range(num_flavors):
            flav_name = flavors[flavor]
            isospin = defs.baryon_isospin[flav_name]
            strangeness = defs.baryon_strangeness[flav_name]
            op_str = f"{isospin} S={strangeness} PSQ={psq} {irrep} {flav_name} 0"
            op = sig.OperatorInfo(op_str, sig.OpKind.GenIrrep)

            for t in range(ensemble.t0, ensemble.t0 + ensemble.ts):
                bin_datas = list()
                for raw_data in raw_datas:
                    bin_data = np.zeros(raw_data.shape[0], dtype=np.complex128)
                    for tsrc in range(ensemble.srcs):
                        for par in range(2):
                            if skip_source(ensemble.name, tsrc, par):
                                continue

                            bin_data += raw_data[:, tsrc, par, psq, flavor,
                                                 t - ensemble.t0]
                    bin_datas.append(bin_data)

                corr = sig.CorrelatorAtTimeInfo(op, op, t, FORCE_HERM, False)

                corr_re = sig.MCObsInfo(corr, sig.ComplexArg.RealPart)
                re_bin_data = sig.RVector(
                    sum([[x.real for x in bins] for bins in bin_datas], []))
                obs_handler.putBins(corr_re, re_bin_data)
                obs_keys.add(corr_re)

                if not FORCE_HERM:
                    corr_im = sig.MCObsInfo(corr, sig.ComplexArg.ImaginaryPart)
                    im_bin_data = sig.RVector(
                        sum([[x.imag for x in bins] for bins in bin_datas],
                            []))
                    obs_handler.putBins(corr_im, im_bin_data)
                    obs_keys.add(corr_im)

    xml_out = sig.XMLHandler("output", "")
    obs_handler.writeBinsToFile(obs_keys, bin_file, xml_out,
                                sig.WriteMode.Protect)
    obs_handler.clearData()

    for data_handler in data_handlers:
        data_handler.close()
コード例 #9
0
def find_sh_data(ensemble_name, search_dir):
  ensemble_info = sigmond.MCEnsembleInfo(ensemble_name, 'ensembles.xml')

  # search for data files
  print(f"Searching for correlators and time separations in {search_dir}")
  file_list_infos = dict()
  for root, dirs, files in os.walk(search_dir, topdown=True):
    for filename in files:
      base, ext = os.path.splitext(filename)
      full_base = os.path.join(root, base)

      try:
        suffix = int(ext[1:])
      except ValueError:
        continue

      if full_base in file_list_infos:
        if suffix < file_list_infos[full_base][0]:
          file_list_infos[full_base][0] = suffix
        elif suffix > file_list_infos[full_base][1]:
          file_list_infos[full_base][1] = suffix
      else:
        file_list_infos[full_base] = [suffix, suffix]

  file_list_infos = [sigmond.FileListInfo(stub, suffix[0], suffix[1], False)
                     for stub, suffix in file_list_infos.items()]


  # create sigmond handlers
  mcobs_xml = ET.Element("MCObservables")
  corr_data_xml = ET.SubElement(mcobs_xml, "BLCorrelatorData")
  for file_list_info in file_list_infos:
    corr_data_xml.append(file_list_info.xml())

  mcobs_xml_handler = sigmond.XMLHandler()
  mcobs_xml_handler.set_from_string(ET.tostring(mcobs_xml))
  sampling_info = sigmond.MCSamplingInfo()
  bins_info = sigmond.MCBinsInfo(ensemble_info)
  bins_info.addOmissions(defs.omissions[ensemble_name])
  obs_get_handler = sigmond.MCObsGetHandler(mcobs_xml_handler, bins_info, sampling_info)
  obs_handler = sigmond.MCObsHandler(obs_get_handler, False)

  corr_handler = sigmond.BLCorrelatorDataHandler(file_list_infos, set(), set(), ensemble_info)
  corrs = corr_handler.getCorrelatorSet()

  # search through found data
  operators = dict()
  max_tsep = 0
  time_seps = dict()
  for corr in corrs:
    if not corr.isSinkSourceSame():
      print("aren't sh ops diagonal?")
      exit()

    op_src = corr.getSource()
    if op_src.op_str() in missing_sh_ops.missing_operators:
      continue

    keys = corr_handler.getOrderedKeys(corr)
    tmin = keys[0].getTimeIndex()
    tmax = keys[-1].getTimeIndex()
    if tmax > max_tsep:
      max_tsep = tmax
    time_seps[corr] = (tmin, tmax)

    op_src = corr.getSource()
    op_src_bl = op_src.getBasicLapH()
    P = (op_src_bl.getXMomentum(), op_src_bl.getYMomentum(), op_src_bl.getZMomentum())
    Psq = P[0]**2 + P[1]**2 + P[2]**2
    irrep = op_src_bl.getLGIrrep()
    irrep_row = op_src_bl.getLGIrrepRow()
    flavor = op_src_bl.getFlavor()
    averaged_channel = defs.AveragedChannel(Psq, irrep)
    equivalent_frame = defs.EquivalentFrame(P, irrep_row)
    if flavor not in operators:
      operators[flavor] = dict()
    if averaged_channel not in operators[flavor]:
      operators[flavor][averaged_channel] = dict()
    if equivalent_frame in operators[flavor][averaged_channel]:
      print("aren't sh ops 1x1?")
      exit()

    operators[flavor][averaged_channel][equivalent_frame] = op_src

  print("Done searching for all correlators and time separations")
  print("Now finding data")

  data = dict()
  for flavor, averaged_channels in operators.items():
    print(f"Working on {flavor}")
    data[flavor] = dict()
    for averaged_channel, channel_ops in averaged_channels.items():
      print(f"\tWorking on {averaged_channel}")
      data[flavor][averaged_channel] = dict()
      for equivalent_frame, operator in channel_ops.items():
        print(f"\t\tWorking on {equivalent_frame}")
        bin_data = np.zeros((len(defs.configs[ensemble_name]), max_tsep+1), dtype=np.complex128)
        corr_info = sigmond.CorrelatorInfo(operator, operator)
        trange = time_seps[corr_info]
        corr_time_info = sigmond.CorrelatorAtTimeInfo(corr_info, 0, False, False)
        for tsep in range(trange[0], trange[1]+1):
          corr_time_info.resetTimeSeparation(tsep)

          if FORCE_HERM:
            obs_info_re = sigmond.MCObsInfo(corr_time_info, sigmond.ComplexArg.RealPart)

            bin_data[:,tsep] = np.array([obs_handler.getBins(obs_info_re).array()])
          else:
            obs_info_re = sigmond.MCObsInfo(corr_time_info, sigmond.ComplexArg.RealPart)
            obs_info_im = sigmond.MCObsInfo(corr_time_info, sigmond.ComplexArg.ImaginaryPart)

            bin_data[:,tsep] = np.array([(re + im*1j) for re, im in zip(obs_handler.getBins(obs_info_re).array(), obs_handler.getBins(obs_info_im).array())])


        data[flavor][averaged_channel][equivalent_frame] = bin_data
        obs_handler.clearData()

  return data
コード例 #10
0
def find_data(ensemble_name, search_dir):
  ensemble_info = sigmond.MCEnsembleInfo(ensemble_name, 'ensembles.xml')

  # search for data files
  print(f"Searching for correlators and time separations in {search_dir}")
  file_list_infos = dict()
  for root, dirs, files in os.walk(search_dir, topdown=True):
    for filename in files:
      base, ext = os.path.splitext(filename)
      full_base = os.path.join(root, base)

      try:
        suffix = int(ext[1:])
      except ValueError:
        continue

      if full_base in file_list_infos:
        if suffix < file_list_infos[full_base][0]:
          file_list_infos[full_base][0] = suffix
        elif suffix > file_list_infos[full_base][1]:
          file_list_infos[full_base][1] = suffix
      else:
        file_list_infos[full_base] = [suffix, suffix]

  file_list_infos = [sigmond.FileListInfo(stub, suffix[0], suffix[1], False)
                     for stub, suffix in file_list_infos.items()]


  # create sigmond handlers
  mcobs_xml = ET.Element("MCObservables")
  corr_data_xml = ET.SubElement(mcobs_xml, "BLCorrelatorData")
  for file_list_info in file_list_infos:
    corr_data_xml.append(file_list_info.xml())

  mcobs_xml_handler = sigmond.XMLHandler()
  mcobs_xml_handler.set_from_string(ET.tostring(mcobs_xml))
  sampling_info = sigmond.MCSamplingInfo()
  bins_info = sigmond.MCBinsInfo(ensemble_info)
  bins_info.addOmissions(defs.omissions[ensemble_name])
  obs_get_handler = sigmond.MCObsGetHandler(mcobs_xml_handler, bins_info, sampling_info)
  obs_handler = sigmond.MCObsHandler(obs_get_handler, False)

  corr_handler = sigmond.BLCorrelatorDataHandler(file_list_infos, set(), set(), ensemble_info)
  corrs = corr_handler.getCorrelatorSet()

  # search through found data
  operators = dict()
  max_tsep = 0
  time_seps = dict()
  for corr in corrs:
    op_snk = corr.getSink()
    op_src = corr.getSource()
    if EXCLUDE_OPERATORS and (op_snk.op_str() in excluded_ops.excluded_operators or op_src.op_str() in excluded_ops.excluded_operators):
      continue

    keys = corr_handler.getOrderedKeys(corr)
    tmin = keys[0].getTimeIndex()
    tmax = keys[-1].getTimeIndex()
    if tmax > max_tsep:
      max_tsep = tmax
    time_seps[corr] = (tmin, tmax)

    op_snk_bl = op_snk.getBasicLapH()
    op_src_bl = op_src.getBasicLapH()
    P = (op_src_bl.getXMomentum(), op_src_bl.getYMomentum(), op_src_bl.getZMomentum())
    Psq = P[0]**2 + P[1]**2 + P[2]**2
    irrep = op_src_bl.getLGIrrep()
    irrep_row = op_src_bl.getLGIrrepRow()
    averaged_channel = defs.AveragedChannel(Psq, irrep)
    equivalent_frame = defs.EquivalentFrame(P, irrep_row)
    if averaged_channel not in operators:
      operators[averaged_channel] = dict()
    if equivalent_frame not in operators[averaged_channel]:
      operators[averaged_channel][equivalent_frame] = SortedSet()

    operators[averaged_channel][equivalent_frame].add(op_snk)
    operators[averaged_channel][equivalent_frame].add(op_src)

  print("Done searching for all correlators and time separations")
  print("Now finding data")

  data = dict()
  for averaged_channel, channel_ops in operators.items():
    print(f"Working on {averaged_channel}")
    data[averaged_channel] = dict()
    for equivalent_frame, operators in channel_ops.items():
      print(f"\tWorking on {equivalent_frame}")
      operator_list = list(operators)

      bin_data = np.zeros((len(defs.configs[ensemble_name]), max_tsep+1, len(operator_list), len(operator_list)), dtype=np.complex128)
      for op_snk_i, op_snk in enumerate(operator_list):
        snk_op_phase = defs.phases.get(op_snk.op_str(), 1)
        for op_src_i, op_src in enumerate(operator_list[op_snk_i:], start=op_snk_i):
          src_op_phase = defs.phases.get(op_src.op_str(), 1)
          phase = snk_op_phase*np.conj(src_op_phase)

          corr_info = sigmond.CorrelatorInfo(op_snk, op_src)
          corr_info_opposite = sigmond.CorrelatorInfo(op_src, op_snk)
          if corr_info_opposite not in time_seps:
            trange = time_seps[corr_info]
          elif corr_info not in time_seps:
            trange = time_seps[corr_info_opposite]
          else:
            trange1 = time_seps[corr_info]
            trange2 = time_seps[corr_info_opposite]
            trange = (max(trange1[0], trange2[0]), min(trange1[1], trange2[1]))

          corr_time_info = sigmond.CorrelatorAtTimeInfo(corr_info, 0, False, False)
          corr_time_info_opposite = sigmond.CorrelatorAtTimeInfo(corr_info_opposite, 0, False, False)
          for tsep in range(trange[0], trange[1]+1):
            corr_time_info.resetTimeSeparation(tsep)
            corr_time_info_opposite.resetTimeSeparation(tsep)

            obs_info_re = sigmond.MCObsInfo(corr_time_info, sigmond.ComplexArg.RealPart)
            obs_info_im = sigmond.MCObsInfo(corr_time_info, sigmond.ComplexArg.ImaginaryPart)

            obs_info_opposite_re = sigmond.MCObsInfo(corr_time_info_opposite, sigmond.ComplexArg.RealPart)
            obs_info_opposite_im = sigmond.MCObsInfo(corr_time_info_opposite, sigmond.ComplexArg.ImaginaryPart)

            if corr_info_opposite not in time_seps:
              the_data = np.array([phase*(re + im*1j) for re, im in zip(obs_handler.getBins(obs_info_re).array(), obs_handler.getBins(obs_info_im).array())])

              bin_data[:,tsep,op_snk_i,op_src_i] = the_data
              bin_data[:,tsep,op_src_i,op_snk_i] = np.conj(the_data)

            elif corr_info not in time_seps:
              the_data = np.array([np.conj(phase)*(re + im*1j) for re, im in zip(obs_handler.getBins(obs_info_opposite_re).array(), obs_handler.getBins(obs_info_opposite_im).array())])

              bin_data[:,tsep,op_snk_i,op_src_i] = np.conj(the_data)
              bin_data[:,tsep,op_src_i,op_snk_i] = the_data

            elif corr_info == corr_info_opposite:
              if FORCE_HERM:
                the_data = np.array(obs_handler.getBins(obs_info_re).array())
              else:
                the_data = np.array([(re + im*1j) for re, im in zip(obs_handler.getBins(obs_info_re).array(), obs_handler.getBins(obs_info_im).array())])

              bin_data[:,tsep,op_snk_i,op_src_i] = the_data

            else:
              the_data = np.array([phase*(re + im*1j) for re, im in zip(obs_handler.getBins(obs_info_re).array(), obs_handler.getBins(obs_info_im).array())])
              the_data_opposite = np.array([np.conj(phase)*(re + im*1j) for re, im in zip(obs_handler.getBins(obs_info_opposite_re).array(), obs_handler.getBins(obs_info_opposite_im).array())])

              if FORCE_HERM:
                bin_data[:,tsep,op_snk_i,op_src_i] = 0.5*(the_data + np.conj(the_data_opposite))
                bin_data[:,tsep,op_src_i,op_snk_i] = 0.5*(np.conj(the_data) + the_data_opposite)
              else:
                bin_data[:,tsep,op_snk_i,op_src_i] = the_data
                bin_data[:,tsep,op_src_i,op_snk_i] = the_data_opposite

      data[averaged_channel][equivalent_frame] = (operator_list, bin_data)
      obs_handler.clearData()

  return data
コード例 #11
0
 def amplitude_observable(self):
   return sigmond.MCObsInfo(self.obs_name, self.obs_id(1))
コード例 #12
0
 def energy_observable(self):
   return sigmond.MCObsInfo(self.obs_name, self.obs_id(0))
コード例 #13
0
def get_data(correlators, ensemble_name, ensemble_Nt, tsrc):
  mcobs_xml = ET.Element("MCObservables")
  corr_data_xml = ET.SubElement(mcobs_xml, "BLCorrelatorData")

  file_list_infos = list()

  for data_file in correlators['data_files']:
    stub, ext = os.path.splitext(data_file)
    suffix = int(ext[1:])
    file_list_info = sigmond.FileListInfo(stub, suffix, suffix, False)
    corr_data_xml.append(file_list_info.xml())
    file_list_infos.append(file_list_info)

  mcobs_xml_handler = sigmond.XMLHandler()
  mcobs_xml_handler.set_from_string(ET.tostring(mcobs_xml))
  sampling_info = sigmond.MCSamplingInfo()
  ensemble_info = sigmond.MCEnsembleInfo(ensemble_name, 'ensembles.xml')
  bins_info = sigmond.MCBinsInfo(ensemble_info)
  bins_info.addOmissions(defs.omissions[ensemble_name])
  obs_get_handler = sigmond.MCObsGetHandler(mcobs_xml_handler, bins_info, sampling_info)
  obs_handler = sigmond.MCObsHandler(obs_get_handler, False)

  corr_handler = sigmond.BLCorrelatorDataHandler(file_list_infos, set(), set(), ensemble_info)

  operators = set()
  tmin = None
  tmax = None
  for corr in correlators['correlators']:
    src_op_str = corr.getSource()
    snk_op_str = corr.getSink()
    operators.add(src_op_str)
    operators.add(snk_op_str)

    if tmin is None:
      keys = corr_handler.getOrderedKeys(corr)
      tmin = keys[0].getTimeIndex()
      tmax = keys[-1].getTimeIndex()

  operators = sorted(list([operator_info.operator.Operator(op) for op in operators]))
  operators = [op.operator_info for op in operators]

  single_correlator = True if len(correlators['correlators']) == 1 else False

  if single_correlator:
    corr_data = np.zeros((bins_info.getNumberOfBins(), tmax+1), dtype=np.complex128)
  else:
    corr_data = np.zeros((bins_info.getNumberOfBins(), len(operators), len(operators), tmax+1), dtype=np.complex128)


  for snk_i, snk_op in enumerate(operators):
    for src_i, src_op in enumerate(operators):

      correlator = sigmond.CorrelatorInfo(snk_op, src_op)
      correlator_opposite = sigmond.CorrelatorInfo(src_op, snk_op)
      for tsep in range(tmin, tmax+1):
        correlator_time = sigmond.CorrelatorAtTimeInfo(correlator, tsep, False, False)
        correlator_time_re_obsinfo = sigmond.MCObsInfo(correlator_time, sigmond.ComplexArg.RealPart)
        correlator_time_im_obsinfo = sigmond.MCObsInfo(correlator_time, sigmond.ComplexArg.ImaginaryPart)

        has_re = obs_handler.queryBins(correlator_time_re_obsinfo)
        has_im = obs_handler.queryBins(correlator_time_im_obsinfo)

        if has_re and has_im:
          data = np.array(obs_handler.getBins(correlator_time_re_obsinfo).array()) + 1j*np.array(obs_handler.getBins(correlator_time_im_obsinfo).array())
        elif has_re:
          data = np.array(obs_handler.getBins(correlator_time_re_obsinfo).array())
        elif has_im:
          data = 1j*np.array(obs_handler.getBins(correlator_time_im_obsinfo).array())
        else:
          continue

        if single_correlator:
          corr_data[:,tsep] = data
        else:
          corr_data[:,snk_i,src_i,tsep] = data

  operators = [op.op_str() for op in operators]
  return corr_data, operators
コード例 #14
0
    def parse(self, log_xml_root):
        self.fits = SortedDict()
        for task_xml in log_xml_root.findall("Task"):
            count = task_xml.findtext("Count")
            fit_xml = task_xml.find("DoFit")
            if fit_xml is None or fit_xml.find("Error") is not None:
                continue

            try:
                eigenvalues = list()
                for eigenvalue in fit_xml.find("CovarianceMatrixEigenvalues"):
                    eigenvalues.append(float(eigenvalue.text))

                eigenvalues.sort()
                cov_cond = float(
                    fit_xml.findtext("CovarianceMatrixConditionNumber"))
                fit_results = fit_xml.find("BestFitResult")
                chisq_dof = float(fit_results.findtext("ChiSquarePerDof"))
                quality = float(fit_results.findtext("FitQuality"))
                energy_fit = fit_results.find("FitParameter0")
                energy_obs_str = energy_fit.findtext("MCObservable/Info")
                pattern = r"^(?P<obsname>\S+) (?P<obsid>\d+) (?P<simple>s|n) (?P<complex_arg>re|im)$"
                match = regex.match(pattern, energy_obs_str.strip())
                if match.group('simple') != 'n' or match.group(
                        'complex_arg') != 're':
                    logging.error(
                        "Energies are supposed to be simple and real")

                energy_obs = sigmond.MCObsInfo(match.group('obsname'),
                                               int(match.group('obsid')))
                fit_info = FitInfo.createFromObservable(energy_obs)
                energy_value = float(
                    energy_fit.findtext("MCEstimate/FullEstimate"))
                energy_error = float(
                    energy_fit.findtext("MCEstimate/SymmetricError"))
                energy = util.nice_value(energy_value, energy_error)
                amplitude_fit = fit_results.find("FitParameter1")
                amplitude_value = float(
                    amplitude_fit.findtext("MCEstimate/FullEstimate"))
                amplitude_error = float(
                    amplitude_fit.findtext("MCEstimate/SymmetricError"))
                amplitude = util.nice_value(amplitude_value, amplitude_error)
                gap = "---"
                if fit_info.has_gap:
                    sqrt_gap_fit = fit_results.find("FitParameter2")
                    sqrt_gap_value = float(
                        sqrt_gap_fit.findtext("MCEstimate/FullEstimate"))
                    gap_value = sqrt_gap_value**2
                    gap_error = 2. * abs(sqrt_gap_value) * float(
                        sqrt_gap_fit.findtext("MCEstimate/SymmetricError"))
                    gap = util.nice_value(gap_value, gap_error)

                const = '---'
                if fit_info.has_const:
                    const_fit_num = fit_info.num_params - 1
                    const_fit = fit_results.find(
                        f"FitParameter{const_fit_num}")
                    const_value = float(
                        const_fit.findtext("MCEstimate/FullEstimate"))
                    const_err = float(
                        const_fit.findtext("MCEstimate/SymmetricError"))
                    const = util.nice_value(const_value, const_err)

                fit_result = FitResult(chisq_dof, quality, energy, amplitude,
                                       gap, const, cov_cond)

                if fit_info in self.fits:
                    logging.warning(
                        f"Found two identical fits in {self.logfile}, ignoring..."
                    )
                    continue

                self.fits[fit_info] = fit_result

            except AttributeError as err:
                logging.warning(
                    f"{err} in DoFit task {count} in {self.logfile}")