29int main(
int argc,
char ** argv) {
31 std::cout <<
"Starting neutrino filter" << std::endl;
34 std::cout <<
"Two arguments required: input file name (or reg exp), output file name, cut set (0: stage 1 selection, 1: no veto or scifi 1st layer, 2: FV sideband, 3: include walls 2 and 5, 4: nue filter (no DS selection, allow walls 1 to 4." << std::endl;
40 TChain * ch =
new TChain(
"rawConv");
42 if (ch->GetEntries() == 0){
44 ch =
new TChain(
"cbmsim");
46 if (ch->GetEntries() > 0) {
48 ch->SetBranchStatus(
"EventHeader", 0);
49 ch->SetBranchStatus(
"EventHeader.", 0);
51 std::cout <<
"Didn't find rawConv or cbmsim in input file" << std::endl;
55 std::cout <<
"Got input tree" << std::endl;
58 TClonesArray * MCTracks =
new TClonesArray(
"ShipMCTrack", 5000);
59 if (isMC) ch->SetBranchAddress(
"MCTrack", &MCTracks);
62 TFile * outFile =
new TFile(argv[2],
"RECREATE");
63 std::cout <<
"Got output file" << std::endl;
66 ch->GetFile()->Get(
"BranchList")->Write(
"BranchList", TObject::kSingleKey);
67 ch->GetFile()->Get(
"TimeBasedBranchList")->Write(
"TimeBasedBranchList", TObject::kSingleKey);
68 if (ch->GetFile()->Get(
"FileHeader")) ch->GetFile()->Get(
"FileHeader")->Write();
69 if (ch->GetFile()->Get(
"FileHeaderHeader")) ch->GetFile()->Get(
"FileHeaderHeader")->Write();
72 TTree * outTree = ch->CloneTree(0);
73 std::cout <<
"Got output tree" << std::endl;
76 std::cout <<
"Starting cut set up" << std::endl;
78 std::vector< snd::analysis_cuts::baseCut * > cutFlow;
80 int selected_cutset = std::atoi(argv[3]);
130 }
else if (selected_cutset ==
nueFilter) {
137 std::cout <<
"Unrecognized cutset. Exitting" << std::endl;
140 std::cout <<
"Done initializing cuts" << std::endl;
142 int n_cuts = (int) cutFlow.size();
147 std::vector<std::vector<TH1D*> > cut_by_cut_var_histos = std::vector<std::vector<TH1D*> >();
148 for (
int i_cut = -1; i_cut < n_cuts; i_cut++){
149 std::vector<TH1D*> this_cut_by_cut_var_histos = std::vector<TH1D*>();
151 for(
int i_dim = 0; i_dim < cut->getNbins().size(); i_dim++){
152 this_cut_by_cut_var_histos.push_back(
new TH1D((std::to_string(i_cut)+
"_"+cut->getShortName()+
"_"+std::to_string(i_dim)).c_str(),
153 cut->getShortName().c_str(),
154 cut->getNbins()[i_dim], cut->getRangeStart()[i_dim], cut->getRangeEnd()[i_dim]));
157 cut_by_cut_var_histos.push_back(this_cut_by_cut_var_histos);
160 std::vector<std::vector<std::vector<TH1D*> > > cut_by_cut_truth_histos = std::vector<std::vector<std::vector<TH1D*> > >();
162 for (
int i_species = 0; i_species < 5; i_species++){
163 std::vector<std::vector<TH1D*> > this_species_histos = std::vector<std::vector<TH1D*> >();
164 std::string species_suffix;
167 species_suffix =
"nueCC";
170 species_suffix =
"numuCC";
173 species_suffix =
"nutauCC";
176 species_suffix =
"NC";
179 species_suffix =
"Other";
182 std::cerr <<
"MC truth histograms initialization error! Unknown species" << std::endl;
186 for (
int i_cut = -1; i_cut < n_cuts; i_cut++){
188 std::vector<TH1D*> this_cut_by_cut_truth_histos = std::vector<TH1D*>();
189 this_cut_by_cut_truth_histos.push_back(
new TH1D((species_suffix+
"_"+std::to_string(i_cut)+
"_Enu").c_str(),
"Enu", 300, 0, 3000));
190 this_cut_by_cut_truth_histos.push_back(
new TH1D((species_suffix+
"_"+std::to_string(i_cut)+
"_EEM").c_str(),
"ELep", 300, 0, 3000));
191 this_cut_by_cut_truth_histos.push_back(
new TH1D((species_suffix+
"_"+std::to_string(i_cut)+
"_EHad").c_str(),
"EHad", 300, 0, 3000));
192 this_cut_by_cut_truth_histos.push_back(
new TH1D((species_suffix+
"_"+std::to_string(i_cut)+
"_vtxX").c_str(),
"vtxX", 200, -100, 0));
193 this_cut_by_cut_truth_histos.push_back(
new TH1D((species_suffix+
"_"+std::to_string(i_cut)+
"_vtxY").c_str(),
"vtxY", 200, 0, 100));
194 this_cut_by_cut_truth_histos.push_back(
new TH1D((species_suffix+
"_"+std::to_string(i_cut)+
"_vtxZ").c_str(),
"vtxZ", 200, 280, 380));
196 this_species_histos.push_back(this_cut_by_cut_truth_histos);
198 cut_by_cut_truth_histos.push_back(this_species_histos);
202 std::vector<TH1D*> n_minus_1_var_histos = std::vector<TH1D*>();
204 for(
int i_dim = 0; i_dim < cut->getNbins().size(); i_dim++){
205 n_minus_1_var_histos.push_back(
new TH1D((
"n_minus_1_"+cut->getShortName()+
"_"+std::to_string(i_dim)).c_str(),
206 cut->getShortName().c_str(),
207 cut->getNbins()[i_dim], cut->getRangeStart()[i_dim], cut->getRangeEnd()[i_dim]));
211 std::cout <<
"Done initializing histograms" << std::endl;
214 TH1D * cutFlowHistogram =
new TH1D(
"cutFlow",
"Cut flow;;Number of events passing cut", n_cuts+1, 0, n_cuts+1);
215 for (
int i = 2; i <= cutFlowHistogram->GetNbinsX(); i++){
216 cutFlowHistogram->GetXaxis()->SetBinLabel(i, cutFlow.at(i-2)->getName().c_str());
219 std::cout <<
"Done initializing cut flow histogram" << std::endl;
222 unsigned long int n_entries = ch->GetEntries();
225 std::vector<bool> passes_cut = std::vector<bool>(n_cuts,
false);
227 std::cout <<
"Starting event loop" << std::endl;
228 for (
unsigned long int i_entry = 0; i_entry < n_entries; i_entry++){
229 ch->GetEntry(i_entry);
230 if (i_entry%10000 == 0) std::cout <<
"Reading entry " << i_entry << std::endl;
232 cutFlowHistogram->Fill(0);
235 int n_cuts_passed = 0;
236 bool accept_event =
true;
240 if (accept_event) cutFlowHistogram->Fill(1 + i_cut);
241 passes_cut[i_cut] =
true;
244 accept_event =
false;
245 passes_cut[i_cut] =
false;
249 if (accept_event) outTree->Fill();
253 std::vector<TH1D*>::iterator hist_it;
255 for (
int seq_cut = -1; seq_cut < ((int) passes_cut.size()); seq_cut++){
257 if (not passes_cut[seq_cut])
break;
259 hist_it = cut_by_cut_var_histos[seq_cut+1].begin();
261 for (
int i_dim = 0; i_dim < cut->getPlotVar().size(); i_dim++){
262 (*hist_it)->Fill(cut->getPlotVar()[i_dim]);
268 int this_species = -1;
269 if (MCTracks->GetEntries() < 2) {
273 int pdgIn = abs(((
ShipMCTrack*)MCTracks->At(0))->GetPdgCode());
274 int pdgOut = abs(((
ShipMCTrack*)MCTracks->At(1))->GetPdgCode());
276 if (pdgIn == (pdgOut+1)){
278 if (pdgIn == 12) this_species = 0;
279 if (pdgIn == 14) this_species = 1;
280 if (pdgIn == 16) this_species = 2;
281 }
else if (pdgIn == pdgOut) {
289 cut_by_cut_truth_histos[this_species][seq_cut+1][0]->Fill(((
ShipMCTrack*) MCTracks->At(0))->GetEnergy());
290 if (this_species < 4) {
291 cut_by_cut_truth_histos[this_species][seq_cut+1][1]->Fill(((
ShipMCTrack*) MCTracks->At(1))->GetEnergy());
292 cut_by_cut_truth_histos[this_species][seq_cut+1][2]->Fill(((
ShipMCTrack*) MCTracks->At(0))->GetEnergy()-((
ShipMCTrack*) MCTracks->At(1))->GetEnergy());
294 cut_by_cut_truth_histos[this_species][seq_cut+1][3]->Fill(((
ShipMCTrack*) MCTracks->At(0))->GetStartX());
295 cut_by_cut_truth_histos[this_species][seq_cut+1][4]->Fill(((
ShipMCTrack*) MCTracks->At(0))->GetStartY());
296 cut_by_cut_truth_histos[this_species][seq_cut+1][5]->Fill(((
ShipMCTrack*) MCTracks->At(0))->GetStartZ());
302 hist_it = n_minus_1_var_histos.begin();
304 for (
int i_dim = 0; i_dim < cut->getPlotVar().size(); i_dim++){
305 if (((not passes_cut[current_cut]) and (n_cuts_passed == (cutFlow.size()-1)))
306 or (n_cuts_passed == cutFlow.size()) ) (*hist_it)->Fill(cut->getPlotVar()[i_dim]);