1 #include "numuCCAnalysis.hxx" 2 #include "FiducialVolumeDefinition.hxx" 3 #include "Parameters.hxx" 4 #include "UseGlobalAltMomCorrection.hxx" 5 #include "numuCCSelection.hxx" 6 #include "numuCCFGD2Selection.hxx" 7 #include "CategoriesUtils.hxx" 8 #include "BasicUtils.hxx" 10 #include "NuDirUtils.hxx" 11 #include "TreeConverterUtils.hxx" 12 #include "ConfigTreeTools.hxx" 30 SetMinAccumCutLevelToSave(ND::params().GetParameterI(
"numuCCAnalysis.MinAccumLevelToSave"));
33 _whichFGD = ND::params().
GetParameterI(
"numuCCAnalysis.Selections.whichFGD");
35 std::cout <<
"----------------------------------------------------" << std::endl;
36 std::cout <<
"WARNING: only for events with accum_level > 5 the vars in the output microtree will surely refer to the muon candidate in that FGD" << std::endl;
37 std::cout <<
"----------------------------------------------------" << std::endl;
41 if (ND::params().GetParameterI(
"numuCCAnalysis.Selections.UseAlternativeFV")) SetFV();
44 _saveMassWeights = ND::params().
GetParameterI(
"numuCCAnalysis.MicroTrees.SaveMassWeights");
55 void numuCCAnalysis::DefineSelections(){
60 sel().AddSelection(
"kTrackerNumuCC",
"inclusive numuCC selection",
new numuCCSelection(
false));
61 else if (_whichFGD==2)
62 sel().AddSelection(
"kTrackerNumuCCFGD2",
"inclusive numuCCFGD2 selection",
new numuCCFGD2Selection(
false));
63 else if (_whichFGD==3) {
64 sel().AddSelection(
"kTrackerNumuCC",
"inclusive numuCC selection",
new numuCCSelection(
false));
65 sel().AddSelection(
"kTrackerNumuCCFGD2",
"inclusive numuCCFGD2 selection",
new numuCCFGD2Selection(
false));
70 void numuCCAnalysis::DefineCorrections(){
74 baseTrackerAnalysis::DefineCorrections();
79 #if !VERSION_HAS_EQUIVALENT_MAIN_AND_ALT_FITS 80 if (ND::params().GetParameterI(
"numuCCAnalysis.Corrections.EnableUseMuonAltMom") == 1) {
93 output().GetTree(massWeightTree)->Fill();
97 void numuCCAnalysis::DefineMicroTrees(
bool addBase){
103 if (addBase) baseTrackerAnalysis::DefineMicroTrees(addBase);
106 AddVarF( output(), selmu_truemom,
"muon candidate true momentum");
107 AddVar4VF(output(), selmu_truepos,
"muon candidate true position");
108 AddVar4VF(output(), selmu_trueendpos,
"muon candidate true end position");
109 AddVar3VF(output(), selmu_truedir,
"muon candidate true direction");
112 AddVarI(output(), truelepton_pdg,
"true lepton PDG");
113 AddVarF(output(), truelepton_mom,
"true lepton true momentum");
114 AddVarF(output(), truelepton_costheta,
"true lepton true cos(theta) w.r.t. neutrino direction");
118 AddVar3VF(output(), selmu_dir,
"muon candidate reconstructed direction");
119 AddVar3VF(output(), selmu_enddir,
"muon candidate reconstructed end direction");
120 AddVar4VF(output(), selmu_pos,
"muon candidate reconstructed position");
121 AddVar4VF(output(), selmu_endpos,
"muon candidate reconstructed end position");
123 AddVarI( output(), selmu_closest_tpc,
"muon candidate closest TPC");
124 AddVarI( output(), selmu_detectors,
"muon candidate detectors");
125 AddVarI( output(), selmu_det,
"detector enum of the muon candidate start position");
127 AddToyVarF(output(), selmu_mom,
"muon candidate reconstructed momentum");
128 AddToyVarF(output(), selmu_costheta,
"muon candidate reconstructed cos(theta). w.r.t. to neutrino direction");
132 AddToyVarF(output(), selmu_nuErecQE,
"neutrino reconstructed energy with muon candidate's reconstructed kinematics in ccqe formula");
133 AddVarF(output(), truelepton_nuErecQE,
"neutrino reconstructed energy with true lepton kinematics in CCQE formula");
135 if (ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
136 AddToyVarF(output(), selmu_amom,
"muon candidate alternate reconstructed momentum ");
137 AddToyVarF(output(), selmu_likemu,
"muon candidate muon TPC PID likelihood");
138 AddToyVarF(output(), selmu_likemip,
"muon candidate MIP TPC PID likelihood");
139 AddToyVarF(output(), shmn_mom,
"second highest momentum negative track reconstructed momentum ");
142 AddVarF(output(), selmu_amom,
"muon candidate alternate reconstructed momentum ");
143 AddVarF(output(), selmu_likemu,
"muon candidate muon TPC PID likelihood");
144 AddVarF(output(), selmu_likemip,
"muon candidate MIP TPC PID likelihood");
145 AddVarF(output(), shmn_mom,
"second highest momentum negative track reconstructed momentum ");
149 AddVarVI(output(), selmu_tpc_det,
"muon candidate TPC number", selmu_ntpcs);
150 AddVarVI(output(), selmu_tpc_nhits,
"muon candidate #hits in each TPC", selmu_ntpcs);
151 AddVarVI(output(), selmu_tpc_nnodes,
"muon candidate #nodes in each TPC", selmu_ntpcs);
152 AddVarVF(output(), selmu_tpc_charge,
"muon candidate reconstructed charge in each TPC", selmu_ntpcs);
153 AddVarVF(output(), selmu_tpc_mom,
"muon candidate reconstructed momentum in each TPC", selmu_ntpcs);
154 AddVarVF(output(), selmu_tpc_bfield_mom,
"muon candidate reconstructed momentum with BField refit in each TPC", selmu_ntpcs);
155 AddVarVF(output(), selmu_tpc_efield_mom,
"muon candidate reconstructed momentum with EFiled refit in each TPC", selmu_ntpcs);
156 AddVarVF(output(), selmu_tpc_emom,
"muon candidate reconstructed momentum error in each TPC", selmu_ntpcs);
157 AddVarVF(output(), selmu_tpc_truemom,
"muon candidate true momentum in each TPC", selmu_ntpcs);
158 AddVarVF(output(), selmu_tpc_dedx_raw,
"muon candidate raw dEdx (CT) in each TPC", selmu_ntpcs);
159 AddVarVF(output(), selmu_tpc_dedx_expmu,
"muon candidate expected dEdx for muons in each TPC", selmu_ntpcs);
160 AddVarVF(output(), selmu_tpc_dedx_exppi,
"muon candidate expected dEdx for pions in each TPC", selmu_ntpcs);
161 AddVarVF(output(), selmu_tpc_dedx_expele,
"muon candidate expected dEdx for electrons in each TPC", selmu_ntpcs);
162 AddVarVF(output(), selmu_tpc_dedx_expp,
"muon candidate expected dEdx for protons in each TPC", selmu_ntpcs);
164 if (ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
165 AddToyVarVF(output(), selmu_tpc_pullmu,
"muon candidate muon pull in each TPC", NMAXTPCS);
166 AddToyVarVF(output(), selmu_tpc_pullpi,
"muon candidate pion pull in each TPC", NMAXTPCS);
167 AddToyVarVF(output(), selmu_tpc_pullele,
"muon candidate electron pull in each TPC", NMAXTPCS);
168 AddToyVarVF(output(), selmu_tpc_pullp,
"muon candidate proton pull in each TPC", NMAXTPCS);
169 AddToyVarVF(output(), selmu_tpc_dedx,
"muon candidate dEdx (CT) in each TPC", NMAXTPCS);
172 AddVarVF(output(), selmu_tpc_pullmu,
"muon candidate muon pull in each TPC", selmu_ntpcs);
173 AddVarVF(output(), selmu_tpc_pullpi,
"muon candidate pion pull in each TPC", selmu_ntpcs);
174 AddVarVF(output(), selmu_tpc_pullele,
"muon candidate electron pull in each TPC", selmu_ntpcs);
175 AddVarVF(output(), selmu_tpc_pullp,
"muon candidate proton pull in each TPC", selmu_ntpcs);
176 AddVarVF(output(), selmu_tpc_dedx,
"muon candidate dEdx (CT) in each TPC", selmu_ntpcs);
180 AddVarVI(output(), selmu_fgd_det,
"fgd index of muon candidate's fgd segments", selmu_nfgds);
181 AddVarVF(output(), selmu_fgd_x,
"muon candidate track length in each FGD", selmu_nfgds);
182 AddVarVF(output(), selmu_fgd_V11,
"muon candidate V11 vertex activity in each FGD", selmu_nfgds);
183 AddVarVF(output(), selmu_fgd_V33,
"muon candidate V33 vertex activity in each FGD", selmu_nfgds);
184 AddVarVF(output(), selmu_fgd_V55,
"muon candidate V55 vertex activity in each FGD", selmu_nfgds);
185 AddVarVF(output(), selmu_fgd_V77,
"muon candidate V77 vertex activity in each FGD", selmu_nfgds);
186 AddVarVF(output(), selmu_fgd_VLayer,
"muon candidate VLayer vertex activity in each FGD", selmu_nfgds);
188 if (ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
189 AddToyVarVF(output(), selmu_fgd_pullmu,
"muon candidate muon pull in each FGD ", NMAXFGDS);
192 AddVarVF(output(), selmu_fgd_pullmu,
"muon candidate muon pull in each FGD ", selmu_nfgds);
196 AddVarVI(output(), selmu_ecal_det,
"ECal sub-module", selmu_necals);
197 AddVarVI(output(), selmu_ecal_nhits,
"The number of hits in the selected track's ECal segment", selmu_necals);
198 AddVarVI(output(), selmu_ecal_nnodes,
"", selmu_necals);
199 AddVarVF(output(), selmu_ecal_length,
"", selmu_necals);
200 AddVarMF(output(), selmu_ecal_showerstartpos,
"", selmu_necals,-30,4);
201 AddVarMF(output(), selmu_ecal_showerendpos,
"", selmu_necals,-30,4);
202 AddVarMF(output(), selmu_ecal_showerstartdir,
"", selmu_necals,-30,3);
203 AddVarMF(output(), selmu_ecal_showerenddir,
"", selmu_necals,-30,3);
205 AddVarVF(output(), selmu_ecal_EMenergy,
"", selmu_necals);
206 AddVarVF(output(), selmu_ecal_edeposit,
"", selmu_necals);
207 AddVarVI(output(), selmu_ecal_IsShower,
"", selmu_necals);
209 AddVarVF(output(), selmu_ecal_mipem,
"MipEm value of the selected track's ECal segment. Negative means more MIP-like, positive means more EM shower-like", selmu_necals);
210 AddVarVF(output(), selmu_ecal_mippion,
"MipPion value the selected track's ECal segment. Negative means more MIP-like, positive means more showering pion-like", selmu_necals);
211 AddVarVF(output(), selmu_ecal_emhip,
"EmHip value of the selected track's ECal segment. Negative means more EM shower-like, positive means more HIP-like.", selmu_necals);
212 AddVarVF(output(), selmu_ecal_containment,
"", selmu_necals);
213 AddVarVF(output(), selmu_ecal_trshval,
"", selmu_necals);
214 AddVarVI(output(), selmu_ecal_mostupstreamlayerhit,
"", selmu_necals);
217 AddVarVI(output(), selmu_smrd_det,
"", selmu_nsmrds);
218 AddVarVI(output(), selmu_smrd_nhits,
"", selmu_nsmrds);
219 AddVarVI(output(), selmu_smrd_nnodes,
"", selmu_nsmrds);
220 AddVarMF(output(), selmu_smrd_dir,
"", selmu_nsmrds, -30, 3);
221 AddVarMF(output(), selmu_smrd_enddir,
"", selmu_nsmrds, -30, 3);
222 AddVarVF(output(), selmu_smrd_edeposit,
"", selmu_nsmrds);
225 AddToyVarI(output(), truevtx_mass_component,
"mass component enum related to the true vtx position (FGD1 / FGD2_scint / FGD2_water");
229 if (_saveMassWeights){
231 AddTree(output(),massWeightTree,NULL);
234 output().AddMatrixVar(massWeightTree,massWeight,
"massWeight",
"F",
"mass weight (FGD1, FGD1scint, FGD1water)",100,3);
237 output().InitializeTree(massWeightTree,
true);
242 void numuCCAnalysis::DefineTruthTree(){
246 baseTrackerAnalysis::DefineTruthTree();
249 AddVarI(output(), truevtx_mass_component,
"mass component enum related to the true vtx position (FGD1 / FGD2_scint / FGD2_water");
252 AddVarF(output(), truelepton_nuErecQE,
"neutrino reconstructed energy with true lepton kinematics in CCQE formula");
256 void numuCCAnalysis::FillMicroTrees(
bool addBase){
263 if (addBase) baseTrackerAnalysis::FillMicroTrees(addBase);
266 if (box().MainTrack){
269 if (box().MainTrack->TrueObject) {
272 output().FillVar(truelepton_pdg, vtx->
LeptonPDG);
273 output().FillVar(truelepton_mom, vtx->
LeptonMom);
274 double costheta_mu_nu = cos(anaUtils::ArrayToTVector3(vtx->
LeptonDir).Angle(anaUtils::ArrayToTVector3(vtx->
NuDir)));
275 output().FillVar(truelepton_costheta, (Float_t)costheta_mu_nu);
278 output().FillVar(truelepton_nuErecQE, Erec);
282 output().FillVectorVarFromArray(selmu_pos, box().MainTrack->PositionStart, 4);
283 output().FillVectorVarFromArray(selmu_endpos, box().MainTrack->PositionEnd, 4);
284 output().FillVectorVarFromArray(selmu_dir, box().MainTrack->DirectionStart, 3);
285 output().FillVectorVarFromArray(selmu_enddir, box().MainTrack->DirectionEnd, 3);
291 if (!ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
292 output().FillVar(selmu_amom, (static_cast<AnaTrack*>(box().MainTrack))->MomentumMuon);
299 if( box().MainTrack->TrueObject ) {
300 output().FillVar(selmu_truemom, box().MainTrack->GetTrueParticle()->Momentum);
301 output().FillVectorVarFromArray(selmu_truepos, box().MainTrack->GetTrueParticle()->Position, 4);
302 output().FillVectorVarFromArray(selmu_trueendpos,box().MainTrack->GetTrueParticle()->PositionEnd, 4);
303 output().FillVectorVarFromArray(selmu_truedir, box().MainTrack->GetTrueParticle()->Direction, 3);
308 output().FillVar(selmu_closest_tpc, tpc+1);
311 output().FillVar(selmu_detectors, static_cast<AnaTrack*>(box().MainTrack)->Detectors);
315 for (Int_t subdet = 0; subdet<3; subdet++) {
318 if (!TPCSegment)
continue;
319 output().FillVectorVar(selmu_tpc_det, subdet);
320 output().FillVectorVar(selmu_tpc_mom, TPCSegment->
Momentum);
322 output().FillVectorVar(selmu_tpc_bfield_mom, TPCSegment->
RefitMomentum);
324 output().FillVectorVar(selmu_tpc_charge, TPCSegment->
Charge);
325 output().FillVectorVar(selmu_tpc_nhits, TPCSegment->
NHits);
326 output().FillVectorVar(selmu_tpc_nnodes, TPCSegment->
NNodes);
327 output().FillVectorVar(selmu_tpc_emom, TPCSegment->
MomentumError);
333 output().FillVectorVar(selmu_tpc_dedx_raw, (static_cast< const AnaTPCParticle* >(TPCSegment->
Original->
Original))->dEdxMeas);
335 output().FillVectorVar(selmu_tpc_dedx_expmu, TPCSegment->
dEdxexpMuon);
336 output().FillVectorVar(selmu_tpc_dedx_exppi, TPCSegment->
dEdxexpPion);
337 output().FillVectorVar(selmu_tpc_dedx_expele, TPCSegment->
dEdxexpEle);
338 output().FillVectorVar(selmu_tpc_dedx_expp, TPCSegment->
dEdxexpProton);
340 if (!ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
341 output().FillVectorVar(selmu_tpc_dedx, TPCSegment->
dEdxMeas);
342 output().FillVectorVar(selmu_tpc_pullmu, TPCSegment->
Pullmu);
343 output().FillVectorVar(selmu_tpc_pullpi, TPCSegment->
Pullpi);
344 output().FillVectorVar(selmu_tpc_pullele,TPCSegment->
Pullele);
345 output().FillVectorVar(selmu_tpc_pullp, TPCSegment->
Pullp);
348 output().IncrementCounterForVar(selmu_tpc_det);
352 for (Int_t subdet = 0; subdet<2; subdet++) {
355 if (!FGDSegment)
continue;
358 output().FillVectorVar(selmu_fgd_det, subdet);
359 output().FillVectorVar(selmu_fgd_x, FGDSegment->
X);
360 output().FillVectorVar(selmu_fgd_V11, FGDSegment->
Vertex1x1);
361 output().FillVectorVar(selmu_fgd_V33, FGDSegment->Vertex3x3);
362 output().FillVectorVar(selmu_fgd_V55, FGDSegment->Vertex5x5);
363 output().FillVectorVar(selmu_fgd_V77, FGDSegment->Vertex7x7);
364 output().FillVectorVar(selmu_fgd_VLayer, FGDSegment->VertexLayer);
366 if (!ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars"))
367 output().FillVectorVar(selmu_fgd_pullmu, FGDSegment->
Pullmu);
369 output().IncrementCounterForVar(selmu_fgd_det);
373 for (Int_t subdet = 0; subdet<9; subdet++) {
378 if (!ECALSegment)
continue;
380 output().FillVectorVar(selmu_ecal_det, subdet);
381 output().FillVectorVar(selmu_ecal_nhits, ECALSegment->
NHits);
382 output().FillVectorVar(selmu_ecal_nnodes, ECALSegment->
NNodes);
383 output().FillVectorVar(selmu_ecal_length, ECALSegment->
Length);
384 output().FillMatrixVarFromArray(selmu_ecal_showerstartpos, ECALSegment->
PositionStart, 4 );
385 output().FillMatrixVarFromArray(selmu_ecal_showerendpos, ECALSegment->
PositionEnd, 4 );
386 output().FillMatrixVarFromArray(selmu_ecal_showerstartdir, ECALSegment->
DirectionStart, 3 );
387 output().FillMatrixVarFromArray(selmu_ecal_showerenddir, ECALSegment->
DirectionEnd, 3 );
389 output().FillVectorVar(selmu_ecal_EMenergy, ECALSegment->
EMEnergy);
390 output().FillVectorVar(selmu_ecal_edeposit, ECALSegment->
EDeposit);
391 output().FillVectorVar(selmu_ecal_IsShower, ECALSegment->
IsShowerLike);
393 output().FillVectorVar(selmu_ecal_trshval, ECALSegment->
TrShVal);
394 output().FillVectorVar(selmu_ecal_emhip, ECALSegment->PIDEmHip);
395 output().FillVectorVar(selmu_ecal_mippion, ECALSegment->PIDMipPion);
396 output().FillVectorVar(selmu_ecal_mipem, ECALSegment->
PIDMipEm);
397 output().FillVectorVar(selmu_ecal_containment, ECALSegment->Containment);
400 output().IncrementCounterForVar(selmu_ecal_det);
405 for (Int_t i = 0; i < box().MainTrack->nSMRDSegments; i++){
407 if (!smrdTrack)
continue;
409 output().FillVectorVar(selmu_smrd_det,
411 output().FillVectorVar(selmu_smrd_nhits, smrdTrack->
NHits);
412 output().FillVectorVar(selmu_smrd_nnodes, smrdTrack->
NNodes);
413 output().FillVectorVar(selmu_smrd_edeposit, smrdTrack->EDeposit);
414 output().FillMatrixVarFromArray(selmu_smrd_dir, smrdTrack->
DirectionStart, 3 );
415 output().FillMatrixVarFromArray(selmu_smrd_enddir, smrdTrack->
DirectionEnd, 3 );
416 output().IncrementCounterForVar(selmu_smrd_det);
421 if ( ! ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")) {
422 if (box().SHMNtrack) output().FillVar(shmn_mom, box().SHMNtrack->Momentum);
428 void numuCCAnalysis::FillToyVarsInMicroTrees(
bool addBase){
434 if (addBase) baseTrackerAnalysis::FillToyVarsInMicroTrees(addBase);
437 if (box().MainTrack){
440 output().FillToyVar(selmu_mom, box().MainTrack->Momentum);
444 TVector3 nuDirVec = anaUtils::GetNuDirRec(box().MainTrack->PositionStart);
445 TVector3 muDirVec = anaUtils::ArrayToTVector3(box().MainTrack->DirectionStart);
447 double costheta_mu_nu = nuDirVec.Dot(muDirVec);
448 output().FillToyVar(selmu_costheta, (Float_t)costheta_mu_nu);
452 output().FillToyVar(selmu_nuErecQE, Erec);
454 if (ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
455 output().FillToyVar(selmu_amom, (static_cast<AnaTrack*>(box().MainTrack))->MomentumMuon);
461 for (Int_t subdet = 0; subdet<3; subdet++) {
464 if (!TPCSegment)
continue;
465 output().FillToyVectorVar(selmu_tpc_dedx, TPCSegment->
dEdxMeas, subdet);
466 output().FillToyVectorVar(selmu_tpc_pullmu, TPCSegment->
Pullmu, subdet);
467 output().FillToyVectorVar(selmu_tpc_pullpi, TPCSegment->
Pullpi, subdet);
468 output().FillToyVectorVar(selmu_tpc_pullele,TPCSegment->
Pullele, subdet);
469 output().FillToyVectorVar(selmu_tpc_pullp, TPCSegment->
Pullp, subdet);
473 for (Int_t subdet = 0; subdet<2; subdet++) {
476 if (!FGDSegment)
continue;
477 output().FillToyVectorVar(selmu_fgd_pullmu, FGDSegment->
Pullmu, subdet);
482 if(box().MainTrack->TrueObject) {
487 output().FillToyVar(truevtx_mass_component, massComponent);
490 if (anaUtils::GetReactionCC(*vtx, SubDetId::kFGD1) == 1)
491 output().FillToyVar(true_signal, 1);
492 else if (anaUtils::GetReactionCC(*vtx, SubDetId::kFGD2) == 1)
493 output().FillToyVar(true_signal, 2);
495 output().FillToyVar(true_signal, 0);
498 static Int_t mass_weight_index=-2;
499 if (_saveMassWeights && conf().GetCurrentConfigurationIndex() == all_syst && mass_weight_index!=-1){
501 if (mass_weight_index==-2){
503 mass_weight_index = config.
GetWeightIndex(all_syst, SystId::kFgdMass);
505 if (mass_weight_index>=0){
506 Float_t massWeightValue = output().GetToyVectorVarValueF(AnalysisAlgorithm::weight_syst, mass_weight_index);
509 Int_t index = output().GetCurrentTree();
512 output().SetCurrentTree(massWeightTree);
514 Int_t massComponentIndex=-1;
515 if (massComponent == anaUtils::kFGD1) massComponentIndex=0;
516 else if (massComponent == anaUtils::kFGD2xymodules) massComponentIndex=1;
517 else if (massComponent == anaUtils::kFGD2watermodules) massComponentIndex=2;
520 if (massComponentIndex>= 0 && output().GetMatrixVarValueF(massWeight, output().GetToyIndex(),massComponentIndex) <=0)
521 output().FillMatrixVar( massWeight, massWeightValue, output().GetToyIndex(),massComponentIndex);
524 output().SetCurrentTree(index);
533 if (ND::params().GetParameterI(
"numuCCAnalysis.MicroTrees.AdditionalToyVars")){
534 if (box().SHMNtrack){
535 output().FillToyVar(shmn_mom, box().SHMNtrack->Momentum);
542 bool numuCCAnalysis::CheckFillTruthTree(
const AnaTrueVertex& vtx){
545 if (_whichFGD == 1) fgdID = SubDetId::kFGD1;
546 if (_whichFGD == 2) fgdID = SubDetId::kFGD2;
547 if (_whichFGD > 2) fgdID = SubDetId::kFGD;
550 bool numuCCinFV = (anaUtils::GetReactionCC(vtx, fgdID) == 1);
555 void numuCCAnalysis::FillTruthTree(
const AnaTrueVertex& vtx){
560 bool IsAntinu =
false;
561 return FillTruthTreeBase(vtx, IsAntinu);
565 void numuCCAnalysis::FillTruthTreeBase(
const AnaTrueVertex& vtx,
bool IsAntinu){
571 baseTrackerAnalysis::FillTruthTreeBase(vtx, SubDetId::kFGD1, IsAntinu);
583 if (anaUtils::GetReactionCC(vtx, SubDetId::kFGD1, IsAntinu) == 1)
584 output().FillVar(true_signal, 1);
585 else if (anaUtils::GetReactionCC(vtx, SubDetId::kFGD2, IsAntinu) == 1)
586 output().FillVar(true_signal, 2);
588 output().FillVar(true_signal, 0);
592 output().FillVar(truevtx_mass_component, massComponent);
595 double costheta_mu_nu = cos(anaUtils::ArrayToTVector3(vtx.
LeptonDir).Angle(anaUtils::ArrayToTVector3(vtx.
NuDir)));
597 output().FillVar(truelepton_nuErecQE, Erec);
601 void numuCCAnalysis::FillCategories(){
615 void numuCCAnalysis::FillConfigTree(){
619 AddVarD(output(), nNucleonsFGD1,
"number of targets in FGD1");
620 AddVarD(output(), nNucleonsFGD2scint,
"number of targets in FGD2 scintillator");
621 AddVarD(output(), nNucleonsFGD2water,
"number of targets in FGD2 water");
623 output().FillVar(nNucleonsFGD1, anaUtils::GetNTargets(anaUtils::kFGD1));
624 output().FillVar(nNucleonsFGD2scint, anaUtils::GetNTargets(anaUtils::kFGD2xymodules));
625 output().FillVar(nNucleonsFGD2water, anaUtils::GetNTargets(anaUtils::kFGD2watermodules));
630 void numuCCAnalysis::SetFV(){
634 if (ND::params().GetParameterI(
"numuCCAnalysis.Selections.UseAlternativeFV")) {
639 double FVXmin = TMath::Max(FVDef::FVdefminFGD1[0], FVDef::FVdefminFGD2[0]);
640 double FVXmax = TMath::Max(FVDef::FVdefmaxFGD1[0], FVDef::FVdefmaxFGD2[0]);
641 double FVYmin = TMath::Max(FVDef::FVdefminFGD1[1], FVDef::FVdefminFGD2[1]);
642 double FVYmax = TMath::Max(FVDef::FVdefmaxFGD1[1], FVDef::FVdefmaxFGD2[1]);
643 FVDef::FVdefminFGD1[0] = FVDef::FVdefminFGD2[0] = FVXmin;
644 FVDef::FVdefmaxFGD1[0] = FVDef::FVdefmaxFGD2[0] = FVXmax;
645 FVDef::FVdefminFGD1[1] = FVDef::FVdefminFGD2[1] = FVYmin;
646 FVDef::FVdefmaxFGD1[1] = FVDef::FVdefmaxFGD2[1] = FVYmax;
650 double halfmodule = DetDef::fgdXYModuleWidth/2.;
651 FVDef::FVdefminFGD1[2] = FVDef::FVdefminFGD2[2] = halfmodule;
652 FVDef::FVdefmaxFGD1[2] = FVDef::FVdefmaxFGD2[2] = halfmodule;
655 std::cout <<
"Using an alternative Fiducial Volume: " << std::endl;
656 std::cout <<
" DetDef::fgd1min = " << DetDef::fgd1min[0] <<
" " 657 << DetDef::fgd1min[1] <<
" " 658 << DetDef::fgd1min[2]
660 std::cout <<
" DetDef::fgd1max = " << DetDef::fgd1max[0] <<
" " 661 << DetDef::fgd1max[1] <<
" " 662 << DetDef::fgd1max[2]
664 std::cout <<
" DetDef::fgd2min = " << DetDef::fgd2min[0] <<
" " 665 << DetDef::fgd2min[1] <<
" " 666 << DetDef::fgd2min[2]
668 std::cout <<
" DetDef::fgd2max = " << DetDef::fgd2max[0] <<
" " 669 << DetDef::fgd2max[1] <<
" " 670 << DetDef::fgd2max[2]
672 std::cout <<
" FVDef::FVdefminFGD1 = " << FVDef::FVdefminFGD1[0] <<
" " 673 << FVDef::FVdefminFGD1[1] <<
" " 674 << FVDef::FVdefminFGD1[2]
676 std::cout <<
" FVDef::FVdefmaxFGD1 = " << FVDef::FVdefmaxFGD1[0] <<
" " 677 << FVDef::FVdefmaxFGD1[1] <<
" " 678 << FVDef::FVdefmaxFGD1[2]
680 std::cout <<
" FVDef::FVdefminFGD2 = " << FVDef::FVdefminFGD2[0] <<
" " 681 << FVDef::FVdefminFGD2[1] <<
" " 682 << FVDef::FVdefminFGD2[2]
684 std::cout <<
" FVDef::FVdefmaxFGD2 = " << FVDef::FVdefmaxFGD2[0] <<
" " 685 << FVDef::FVdefmaxFGD2[1] <<
" " 686 << FVDef::FVdefmaxFGD2[2]
Float_t dEdxexpMuon
Expected dE/dx for a muon, based on the reconstructed momentum.
Float_t Pullmu
Muon pull of the segment: (dEdxMeas-dEdxexpMuon)/dEdxSigmaMuon.
Float_t PositionStart[4]
The reconstructed start position of the particle.
Int_t LeptonPDG
The PDG code of the primary outgoing electron/muon.
int GetParameterI(std::string)
Get parameter. Value is returned as integer.
Float_t dEdxexpProton
Expected dE/dx for a proton, based on the reconstructed momentum.
void Finalize()
[AnalysisAlgorithm_optional]
Float_t LeptonDir[3]
The direction of the primary outgoing electron/muon.
Float_t DirectionEnd[3]
The reconstructed end direction of the particle.
void AddPackage(const std::string &name, const std::string &version)
Add a package.
Float_t Pullpi
Pion pull of the segment: (dEdxMeas-dEdxexpPion)/dEdxSigmaPion.
Int_t NNodes
The number of nodes in the reconstructed object.
SubDetId::SubDetEnum GetClosestTPC(const AnaTrackB &track)
For tracks that start in the FGD, get the closest TPC in the direction of the track.
Float_t Vertex1x1
Vertex activity variables.
Float_t ComputeRecNuEnergyCCQE(Float_t mom_lepton, Float_t mass_lepton, Float_t costheta_lepton, Float_t bindingEnergy=25.)
AnaTrueObjectC * TrueObject
The link to the true oject that most likely generated this reconstructed object.
static bool GetDetectorUsed(unsigned long BitField, SubDetId::SubDetEnum det)
Method to see if a certain subdetector or subdetector system is used.
bool Initialize()
[AnalysisAlgorithm_mandatory]
massComponentEnum GetMassComponent(bool IsMC, const Float_t *pos)
Get the detector component in which the position is.
Float_t Momentum
The initial momentum of the true particle.
SubDetId::SubDetEnum GetDetector(const Float_t *pos)
Return the detector in which the position is.
AnaParticleB * GetSegmentInDet(const AnaTrackB &track, SubDetId::SubDetEnum det)
Float_t dEdxexpPion
Expected dE/dx for a pion, based on the reconstructed momentum.
Float_t dEdxexpEle
Expected dE/dx for an electron, based on the reconstructed momentum.
Float_t Pullmu
Muon pull, according to FGD information.
Float_t Charge
The reconstructed charge of the particle.
std::string GetSoftwareVersionFromPath(const std::string &path)
Get The software version from the path of the package.
Float_t MomentumError
Error of the momentum at the start of the segment.
Float_t GetPIDLikelihood(const AnaTrackB &track, Int_t hypo, bool prod5Cut=0)
Float_t LeptonMom
The momentum of the primary outgoing electron/muon.
Float_t Momentum
The reconstructed momentum of the particle, at the start position.
Representation of a true Monte Carlo vertex.
const AnaParticleB * Original
Float_t Position[4]
The position the true interaction happened at.
SubDetEnum
Enumeration of all detector systems and subdetectors.
Float_t EFieldRefitMomentum
Reconstructed momentum with the E-field distortion corrections.
Int_t NHits
The number of hits in the particle.
void FillCategories(AnaEventB *event, AnaTrack *track, const std::string &prefix, const SubDetId::SubDetEnum det=SubDetId::kFGD1, bool IsAntinu=false, bool useCATSAND=true)
Fill the track categories for color drawing.
Float_t dEdxMeas
dE/dx as measured by the TPC.
static SubDetId::SubDetEnum GetSubdetectorEnum(unsigned long BitField)
Get the single subdetector that this track is from.
virtual bool Initialize()
[AnalysisAlgorithm_mandatory]
int GetLocalDetEnum(SubDetId::SubDetEnum det, SubDetId::SubDetEnum idet)
Get old local detector enumeration to find array index of Flat tree.
Float_t Pullp
Proton pull of the segment: (dEdxMeas-dEdxexpProton)/dEdxSigmaProton.
Float_t Length
The length of the ECal segment.
Float_t DirectionStart[3]
The reconstructed start direction of the particle.
Float_t Pullele
Electron pull of the segment: (dEdxMeas-dEdxexpEle)/dEdxSigmaEle.
void AddStandardCategories(const std::string &prefix="")
Add the standard categories only, given a prefix for their name.
Int_t MostUpStreamLayerHit
Innermost layer hit of the ecal object (used in ecal pi0 veto)
Representation of a TPC segment of a global track.
Float_t NuDir[3]
The true (unit) direction of the incoming neutrino.
AnaTrueParticleB * GetTrueParticle() const
Return a casted version of the AnaTrueObject associated.
Float_t GetPIDLikelihoodMIP(const AnaTrackB &track)
Get the likelihood for MIP: (like_mu+like_pi)/(1-like_p)
Float_t PositionEnd[4]
The reconstructed end position of the particle.
Float_t RefitMomentum
Reconstructed momentum with the empirical distortion corrections.