29int main(
int argc,
char** argv)
34 fmt::println(stderr,
"USAGE: {} [HIPO_FILE] <NUM_INSPECT> <INTERACTIVE_MODE>", argv[0]);
35 fmt::println(stderr,
" NUM_INSPECT is optional; by default a few events are inspected");
36 fmt::println(stderr,
" INTERACTIVE_MODE=\"true\" will draw the plots interactively; default is non-interactive");
39 char const* in_file = argc > 1 ? argv[1] :
"data.hipo";
40 int const num_events = argc > 2 ? std::stoi(argv[2]) : 100;
41 bool const interactive_mode = argc > 3 ? std::string(argv[3]) ==
"true" :
false;
44 auto app = interactive_mode ?
new TApplication(
"app", &argc, argv) :
nullptr;
51 auto ds = std::make_unique<RIguanaDS>(in_file, num_events);
57 ds->CloneBankTo(
"REC::Particle",
"ORIG_REC_Particle");
61 iguana::ThreadedAlgo<iguana::clas12::EventBuilderFilter> algo_eventbuilder_filter;
62 iguana::ThreadedAlgo<iguana::clas12::rga::MomentumCorrection> algo_momentum_correction;
64 iguana::ThreadedCreatorAlgo<iguana::clas12::SectorFinder> algo_sector_finder(ds.get());
71 unsigned int nSlots = ROOT::IsImplicitMTEnabled() ? ROOT::GetThreadPoolSize() : 1;
73 for(
unsigned int i = 0; i < nSlots; i++) {
74 algo_eventbuilder_filter[i].SetConfigFile(
"examples/config_for_examples.yaml");
75 algo_momentum_correction[i].SetConfigFile(
"examples/config_for_examples.yaml");
76 algo_sector_finder[i].SetConfigFile(
"examples/config_for_examples.yaml");
80 algo_eventbuilder_filter.Start();
81 algo_momentum_correction.Start();
82 algo_sector_finder.Start();
87 ds->AddIguanaMask(
"REC::Particle",
"MASK_REC_Particle");
91 int i_particle = ds->GetBankIndex(
"REC::Particle");
92 int i_config = ds->GetBankIndex(
"RUN::config");
93 int i_track = ds->GetBankIndex(
"REC::Track");
94 int i_calorimeter = ds->GetBankIndex(
"REC::Calorimeter");
95 int i_scintillator = ds->GetBankIndex(
"REC::Scintillator");
97 int i_sector = ds->GetBankIndex(
"REC::Particle::Sector");
100 auto iguana_run_callback = [&](
unsigned int slot, hipo::banklist& banks) ->
bool {
101 auto& bank_particle = banks[i_particle];
102 auto& bank_config = banks[i_config];
103 auto& bank_track = banks[i_track];
104 auto& bank_calorimeter = banks[i_calorimeter];
105 auto& bank_scintillator = banks[i_scintillator];
106 auto& bank_sector = banks[i_sector];
107 if(!algo_eventbuilder_filter[slot].Run(bank_particle))
109 if(!algo_sector_finder[slot].Run(bank_particle, bank_track, bank_calorimeter, bank_scintillator, bank_sector))
111 if(!algo_momentum_correction[slot].Run(bank_particle, bank_sector, bank_config))
115 ds->SetEventCallback(iguana_run_callback);
118 auto df = ROOT::RDataFrame(std::move(ds));
121 auto const column_names = df.GetColumnNames();
122 fmt::println(
"\nDATAFRAME COLUMNS:");
123 for(
decltype(column_names)::size_type i = 0; i < column_names.size(); i++) {
124 fmt::print(
"{:<30}", column_names[i]);
125 if((i + 1) % 3 == 0 || i + 1 == column_names.size())
135 int pdg_min = -pdg_max;
136 int pdg_bins = pdg_max - pdg_min;
138 auto hist_pdg_filtered = df
139 .Define(
"pid",
"REC_Particle_pid[MASK_REC_Particle == 1]")
140 .Histo1D({
"pid_filtered",
"PDG filtered", pdg_bins,
static_cast<double>(pdg_min),
static_cast<double>(pdg_max)},
"pid");
142 auto hist_pdg_unfiltered = df.Histo1D({
"pid_unfiltered",
"PDG unfiltered", pdg_bins,
static_cast<double>(pdg_min),
static_cast<double>(pdg_max)},
"REC_Particle_pid");
147 auto hist_ele_sector = df
148 .Alias(
"REC_Particle_Sector_sector",
"REC_Particle::Sector_sector")
149 .Define(
"sector",
"REC_Particle_Sector_sector[MASK_REC_Particle == 1 && REC_Particle_pid == 11]")
150 .Histo1D({
"ele_sector",
"Electron Sector", 6, 0, 6},
"sector");
155 std::vector<std::string> rec_particle_vars{
"pid",
"px",
"py",
"pz",
"vx",
"vy",
"vz",
"vt",
"charge",
"beta",
"chi2pid",
"status"};
156 ROOT::RDF::RNode df_filtered = df;
157 for(
auto const& var : rec_particle_vars)
158 df_filtered = df_filtered.Define(
159 fmt::format(
"MASK_REC_Particle_{}", var),
160 fmt::format(
"REC_Particle_{}[MASK_REC_Particle == 1]", var));
162 for(
auto const& var : rec_particle_vars)
163 df_filtered = df_filtered.Define(
164 fmt::format(
"MASK_ORIG_REC_Particle_{}", var),
165 fmt::format(
"ORIG_REC_Particle_{}[MASK_REC_Particle == 1]", var));
169 auto df_mom_corr = df_filtered
170 .Alias(
"px_orig",
"MASK_ORIG_REC_Particle_px")
171 .Alias(
"py_orig",
"MASK_ORIG_REC_Particle_py")
172 .Alias(
"pz_orig",
"MASK_ORIG_REC_Particle_pz")
173 .Alias(
"px",
"MASK_REC_Particle_px")
174 .Alias(
"py",
"MASK_REC_Particle_py")
175 .Alias(
"pz",
"MASK_REC_Particle_pz")
176 .Define(
"p_orig",
"sqrt(px_orig*px_orig + py_orig*py_orig + pz_orig*pz_orig)")
177 .Define(
"p",
"sqrt(px*px + py*py + pz*pz)")
178 .Define(
"delta_p",
"p - p_orig");
180 auto hist_mom_corr = df_mom_corr.Histo2D({
"mom_corr",
"Momentum Correction;p [GeV];#Delta p [GeV]", 10, 0, 12, 100, -0.2, 0.2},
"p_orig",
"delta_p");
181 auto prof_mom_corr = df_mom_corr.Profile1D({
"prof_mom_corr",
"", 10, 0, 12},
"p_orig",
"delta_p");
184 auto canv =
new TCanvas(
"canv",
"canv", 1600, 1200);
187 for(
int p = 1; p <= 4; p++) {
188 auto pad = canv->GetPad(p);
193 hist_pdg_unfiltered->Draw();
197 hist_pdg_filtered->Draw();
200 hist_ele_sector->Draw();
203 hist_mom_corr->Draw(
"colz");
204 prof_mom_corr->SetLineColor(kBlack);
205 prof_mom_corr->SetLineWidth(5);
206 prof_mom_corr->SetErrorOption(
"s");
207 prof_mom_corr->Draw(
"same");
211 if(interactive_mode) {
212 fmt::print(
"\n\nShowing plots interactively;\npress ^C to exit.\n\n");
216 canv->SaveAs(
"out-iguana-dataframe-example.png");