Пример #1
0
def main():
    filenames = glob.glob(
        '../data/orm/2019-01-20_quadscan/M8-E108-F1-I9-G1/*/*_X.yml')
    raw_data = [yaml.safe_load(read_file(filename)) for filename in filenames]

    m = Madx(stdout=False)
    m.verbose()
    m.call('../hit_models/hht3/sequence.madx', chdir=True)
    m.command.beam()
    m.use('hht3')
    #m.call('../hit_models/hht3/strengths0.madx', chdir=True)

    for data in raw_data:

        mean = mean_values(data)
        err = stddevs(data)
        kl = np.array([
            sum(optics.values())
            for optics, group in itertools.groupby(data['records'],
                                                   key=lambda r: r['optics'])
        ])

        mon = data['monitors'][0]
        knob, = data['optics'][0].keys()
        quad = [
            elem.name for elem in m.sequence.hht3.expanded_elements
            if elem.base_name == 'quadrupole'
            and knob in m.expr_vars(elem.defs.k1)
        ][0]

        m.globals.update(data['base_optics'])

        for i, x in enumerate('xy'):
            #plt.subplot(2, 1, i+1)
            plt.title(f"pos{x}_{mon}({knob})")
            plt.ylabel("{x} [m]")
            plt.xlabel(f"{knob} [$m^{{-1}}$]")

            plt.errorbar(kl, mean[:, 0, i], err[:, 0, i], label=x)

            for pos in np.linspace(-0.002, 0.002, 5):
                modelled = np.array([
                    track(m, optics, range=f'{quad}/{mon}', **{x: pos})[i]
                    for optics, group in itertools.groupby(
                        data['records'], key=lambda r: r['optics'])
                ])
                i0 = np.argmin(kl)
                modelled += mean[i0, 0, i] - modelled[i0]

                plt.plot(kl, modelled, label=f'${x}_0$={pos}')

            plt.legend()
            plt.show()