def load_data(self):
"""Method to extract bunch parameters from a performed scan and return them in a format of `pandas.DataFrame`.
Returns:
df (pandas.DataFrame): Dataframe containing bunch parameters obtained in different runs. Columns:\n
`run`: run number,
`scanning_parameter`: value of the scanning parameter
`energy`: energy
`energy_spread`: rms energy spread
`x_emit`: rms normalized emittance in the transverse x plane
`y_emit`: rms normalized emittance in the transverse y plane
`x_rms`: rms bunch size in the transverse x plane
`y_rms`: rms bunch size in the transverse y plane
`xBar_rms`: rms beam divergence in the x plane
`yBar_rms`: rms beam divergence in the y plane
`Active particle ratio`: ratio of active (not lost) particles, if 1, no particles were lost
`Beam size (z_rms)`: rms bunch length
"""
# initialize properties to be plotted
energy = []
energy_spread = []
x_emit = []
y_emit = []
x_rms = [] # beam size
y_rms = [] # beam size
xBar_rms = [] # beam divergence
yBar_rms = [] # beam divergence
active_ratio = [] # ratio of active particles at the end (not lost)
beam_size = []
# the following ones are to check what runs and corresponding scanning parameter were included
included_runs=[]
scanning_parameter_include=[]
def get_from(from_df, property_name):
if self.zpos == "end":
return float(from_df.tail(1)[property_name])
else:
return from_df.loc[from_df[property_name] == self.zpos]
self.logger.info("Loading data for plots!")
# fill properties lists
for run in self.output["Run number"].to_numpy():
run = int(run)
# check if all neccessary file exist
if not self.output_files_exists(run, Xemit=True, Yemit=True, Zemit=True, TRemit=False):
self.logger.warn(f"Output files missing for {run}! Skipping.")
scanning_parameter_include+=[False]
continue
included_runs += [run]
scanning_parameter_include+=[True]
energy += [get_from(self.get_Zemit(run), "E")]
energy_spread += [get_from(self.get_Zemit(run), "E_rms")]
x_emit += [get_from(self.get_Xemit(run), "epsilon")]
y_emit += [get_from(self.get_Yemit(run), "epsilon")]
x_rms += [get_from(self.get_Xemit(run), "x_rms")]
y_rms += [get_from(self.get_Yemit(run), "y_rms")]
xBar_rms += [get_from(self.get_Xemit(run), "xBar_rms")]
yBar_rms += [get_from(self.get_Yemit(run), "yBar_rms")]
beam_size += [get_from(self.get_Zemit(run), "z_rms")]
# calculate lost particles
df = self.get_at_zpos(run, self.zpos)
total = df.shape[0]
active = df.loc[df["flag"] > 0].shape[0]
active_ratio += [active/total]
self.logger.info(f"Included run number {run}")
# returnad panda Dataframe
return pandas.DataFrame({
"run": included_runs,
"scanning_parameter": (self.output[self.scanning_parameter].to_numpy()*self.parameter_scaling)[scanning_parameter_include],
"energy": energy,
"energy_spread": energy_spread,
"x_emit": x_emit,
"y_emit": y_emit,
"x_rms": x_rms,
"y_rms": y_rms,
"xBar_rms": xBar_rms,
"yBar_rms": yBar_rms,
"Active particle ratio": active_ratio,
"Beam size (z_rms)": beam_size,
})