12 dOutputFileName =
"DSelector_Z2pi_trees.root";
13 dOutputTreeFileName =
"tree_DSelector_Z2pi_trees.root";
14 dFlatTreeFileName =
"";
19 bool locInitializedPriorFlag = dInitializedFlag;
20 DSelector::Init(locTree);
22 if(locInitializedPriorFlag)
34 dAnalysisActions.push_back(
new DHistogramAction_ParticleID(dComboWrapper,
false));
35 dAnalysisActions.push_back(
new DHistogramAction_ParticleID(dComboWrapper,
true,
"KinFit"));
50 dAnalysisActions.push_back(
new DHistogramAction_BeamEnergy(dComboWrapper,
false));
62 dHist_MissingMassSquared =
new TH1I(
"MissingMassSquared",
";Missing Mass Squared (GeV/c^{2})^{2}", 600, -0.24, 0.24);
63 dHist_BeamEnergy =
new TH1I(
"BeamEnergy",
";Beam Energy (GeV)", 600, 0.0, 12.0);
69 dHist_KinFitChiSq =
new TH1I(
"KinFitChiSq",
";Kinematic Fit #chi^{2}/NDF", 250, 0., 25.);
70 dHist_KinFitCL =
new TH1I(
"KinFitCL",
";Kinematic Fit Confidence Level", 100, 0., 1.);
72 dHist_M2pigen =
new TH1I(
"M2pigen",
";M_{#pi^{+}#pi^{-}} Gen (GeV/c^{2})", 400, 0.2, 0.6);
73 dHist_M2pikin =
new TH1I(
"M2pikin",
";M_{#pi^{+}#pi^{-}} Kin (GeV/c^{2})", 400, 0.2, 0.6);
74 dHist_M2pidiff =
new TH1I(
"M2pidiff",
";M_{#pi^{+}#pi^{-}} Kin - Gen (GeV/c^{2})", 400, -0.05, 0.05);
75 dHist_tgen =
new TH1I(
"tgen",
";|t| Gen (GeV/c)^{2}", 100, 0.0, 0.01);
76 dHist_tkin =
new TH1I(
"tkin",
";|t| Kin (GeV/c)^{2}", 100, 0.0, 0.01);
77 dHist_tdiff =
new TH1I(
"tdiff",
";|t| Kin - Gen (GeV/c)^{2}", 100, -0.01, 0.01);
78 dHist_tkin_tgen =
new TH2I(
"tkin_tgen",
"; |t| Gen ; |t| Kin (GeV/c)^{2}", 50, 0, 0.002, 50, 0, 0.002);
79 dHist_CosTheta_psi =
new TH2I(
"CosTheta_psi",
"; #psi; Cos#Theta", 90, -180., 180, 200, -1., 1.);
81 dHist_phigen_Phigen =
new TH2I(
"phigen_Phigen",
"; #Phi Gen; #phi Gen", 90, -180., 180, 90,-180,180);
82 dHist_phikin_Phikin =
new TH2I(
"phikin_Phikin",
"; #Phi Kin; #phi Kin", 90, -180., 180, 90,-180,180);
83 dHist_phimeas_phigen =
new TH2I(
"phimeas_phigen",
"; #phi Gen ; #phi Meas", 90, -180., 180, 90,-180,180);
84 dHist_phikin_phigen =
new TH2I(
"phikin_phigen",
"; #phi Gen ; #phi Kin", 90, -180., 180, 90,-180,180);
85 dHist_Phikin_Phigen =
new TH2I(
"Phikin_Phigen",
"; #Phi Gen ; #Phi Kin", 90, -180., 180, 90,-180,180);
86 dHist_Phimeas_Phigen =
new TH2I(
"Phimeas_Phigen",
"; #Phi Gen ; #Phi Meas", 90, -180., 180, 90,-180,180);
87 dHist_Delta_phi =
new TH2I(
"Delta_phi",
"; #phi ; #Delta #phi", 90, -180., 180, 90,-180,180);
88 dHist_Delta_Phi =
new TH2I(
"Delta_Phi",
"; #Phi ; #Delta #Phi", 90, -180., 180, 90,-180,180);
89 dHist_Delta_phimeas =
new TH2I(
"Delta_phimeas",
"; #phi ; #Delta #phi Meas", 90, -180., 180, 90,-180,180);
90 dHist_Delta_Phimeas =
new TH2I(
"Delta_Phimeas",
"; #Phi ; #Delta #Phi Meas", 90, -180., 180, 90,-180,180);
91 dHist_CosTheta =
new TH1I(
"CosTheta",
"; Cos#Theta", 100, -1., 1.);
92 dHist_CosThetadiff =
new TH1I(
"CosThetadiff",
"; Cos#Theta diff Kin-Gen", 50, -0.5, 0.5);
93 dHist_Phigen =
new TH1I(
"Phigen",
";Phigen (degrees)", 360,-180,180);
94 dHist_phigen =
new TH1I(
"phigen",
";phigen (degrees)", 360,-180,180);
95 dHist_Phikin =
new TH1I(
"Phikin",
";Phikin (degrees)", 360,-180,180);
96 dHist_phikin =
new TH1I(
"phikin",
";phikin (degrees)", 360,-180,180);
97 dHist_Phimeas =
new TH1I(
"Phimeas",
";Phimeas (degrees)", 360,-180,180);
98 dHist_phimeas =
new TH1I(
"phimeas",
";phimeas (degrees)", 360,-180,180);
99 dHist_psikin =
new TH1I(
"psikin",
";psi Kin (degrees)", 360,-180,180);
100 dHist_psigen =
new TH1I(
"psigen",
";psi Gen (degrees)", 360,-180,180);
101 dHist_Phidiff =
new TH1I(
"Phidiff",
";Phi Kin - Gen (degrees)", 100,-50,50);
102 dHist_phidiff =
new TH1I(
"phidiff",
";phi Kin - Gen (degrees)", 100,-50,50);
103 dHist_psidiff =
new TH1I(
"psidiff",
";psi Kin - Gen (degrees)", 100,-50,50);
105 dHist_pipDeltap =
new TH1I(
"pipDeltap",
"; #pi^{+}: Thrown p - KinFit p/Thrown p",100,-0.2,0.2);
106 dHist_pimDeltap =
new TH1I(
"pimDeltap",
"; #pi^{-}: Thrown p - KinFit p/ Thrown p",100,-0.2,0.2);
109 dHist_pimDeltap_Measured =
new TH1I(
"pimDeltap_Measured",
"; #pi^{-}: Thrown p - Measured p/ Thrown p",100,-0.2,0.2);
115 fMaxPion_dEdx =
new TF1(
"fMaxPion_dEdx",
"exp(-1.*[0]*x + [1]) + [2]", 0., 10.);
189 UInt_t locRunNumber = Get_RunNumber();
200 Reset_Actions_NewEvent();
210 set<Int_t> locUsedSoFar_BeamEnergy;
212 set<Int_t> locUsedSoFar_PiPlus, locUsedSoFar_PiMinus;
218 set<map<Particle_t, set<Int_t> > > locUsedSoFar_MissingMass, locUsedSoFar_2pi, locUsedSoFar_Angles;
240 double locEbeam_Thrown = 0;
241 if(dThrownBeam != NULL)
242 locEbeam_Thrown = dThrownBeam->Get_P4().E();
245 TLorentzVector locPb208P4_Thrown;
246 TLorentzVector locPiPlusP4_Thrown;
247 TLorentzVector locPiMinusP4_Thrown;
249 for(UInt_t loc_i = 0; loc_i < Get_NumThrown(); ++loc_i)
252 dThrownWrapper->Set_ArrayIndex(loc_i);
253 Particle_t thrown_pid = dThrownWrapper->Get_PID();
255 TLorentzVector locP4_Thrown = dThrownWrapper->Get_P4();
256 if (loc_i == 0) locPb208P4_Thrown = locP4_Thrown;
257 if (loc_i == 1) locPiPlusP4_Thrown = locP4_Thrown;
258 if (loc_i == 2) locPiMinusP4_Thrown = locP4_Thrown;
261 cout << endl <<
"Thrown" << endl;
262 cout <<
" dThrownBeam="; dThrownBeam->Get_P4().Print();
263 cout <<
" locPb208P4="; locPb208P4_Thrown.Print();
264 cout <<
" locPiPlusP4="; locPiPlusP4_Thrown.Print();
265 cout <<
" locPiMinusP4="; locPiMinusP4_Thrown.Print();
266 TLorentzVector loc2piP4_Thrown = locPiPlusP4_Thrown + locPiMinusP4_Thrown;
267 double tgen = (dThrownBeam->Get_P4() - locPiPlusP4_Thrown - locPiMinusP4_Thrown).M2();
275 for(UInt_t loc_i = 0; loc_i < Get_NumCombos(); ++loc_i)
278 dComboWrapper->Set_ComboIndex(loc_i);
281 if(dComboWrapper->Get_IsComboCut())
303 TLorentzVector locMissingP4 = locBeamP4;
304 locMissingP4 -= locPiPlusP4 + locPiMinusP4;
305 TLorentzVector loc2piP4 = locPiPlusP4 + locPiMinusP4;
307 cout <<
"Kin Fit" << endl;
308 cout <<
" locBeamP4="; locBeamP4.Print();
309 cout <<
" locMissingPb208P4="; locMissingPb208P4.Print();
310 cout <<
" locPiPlusP4="; locPiPlusP4.Print();
311 cout <<
" locPiMinusP4="; locPiMinusP4.Print();
312 cout <<
" locMissingP4="; locMissingP4.Print();
313 cout <<
" loc2piP4="; loc2piP4.Print();
316 cout <<
"KIN: MM2 =" << locMissingP4.M2() <<
" DeltaE=" << locBeamP4.E()-loc2piP4.E() <<
" GenDeltaE=" << locEbeam_Thrown-locBeamP4.E() << endl;
321 TLorentzVector locMissingPb208P4_Measured (0,0,0,193.750748);
323 TLorentzVector locPiPlusP4_Measured =
dPiPlusWrapper->Get_P4_Measured();
324 TLorentzVector locPiMinusP4_Measured =
dPiMinusWrapper->Get_P4_Measured();
326 TLorentzVector locMissingP4_Measured = locBeamP4_Measured;
327 locMissingP4_Measured -= locPiPlusP4_Measured + locPiMinusP4_Measured;
328 locMissingPb208P4_Measured += locMissingP4_Measured;
329 TLorentzVector loc2piP4_Measured = locPiPlusP4_Measured + locPiMinusP4_Measured;
331 cout <<
"Measured" << endl;
332 cout <<
" locBeamP4_Measured="; locBeamP4_Measured.Print();
333 cout <<
" locMissingPb208P4_Measured="; locMissingPb208P4_Measured.Print();
334 cout <<
" locPiPlusP4_Measured="; locPiPlusP4_Measured.Print();
335 cout <<
" locPiMinusP4_Measured="; locPiMinusP4_Measured.Print();
336 cout <<
" locMissingP4_Measured="; locMissingP4_Measured.Print();
337 cout <<
" loc2piP4_Measured="; loc2piP4_Measured.Print();
348 if(!Execute_Actions())
378 if(locPiPlus_dEdx_CDC >
fMaxPion_dEdx->Eval(locPiPlusP4.P()) || locPiMinus_dEdx_CDC >
fMaxPion_dEdx->Eval(locPiMinusP4.P())) {
379 dComboWrapper->Set_IsComboCut(
true);
383 cout <<
" Passed CDC dE/dX cut " << endl;
390 double locMissingMassSquared = locMissingP4_Measured.M2();
394 map<Particle_t, set<Int_t> > locUsedThisCombo_MissingMass;
395 locUsedThisCombo_MissingMass[
Unknown].insert(locBeamID);
396 locUsedThisCombo_MissingMass[
PiPlus].insert(locPiPlusTrackID);
397 locUsedThisCombo_MissingMass[
PiMinus].insert(locPiMinusTrackID);
401 dComboWrapper->Set_IsComboCut(
true);
405 cout <<
" Passed beam energy cut " << endl;
410 dComboWrapper->Set_IsComboCut(
true);
414 cout <<
" Passed Missing mass cut " << endl;
418 dHist_KinFitChiSq->Fill(dComboWrapper->Get_ChiSq_KinFit()/dComboWrapper->Get_NDF_KinFit());
419 dHist_KinFitCL->Fill(dComboWrapper->Get_ConfidenceLevel_KinFit());
420 if(dComboWrapper->Get_ConfidenceLevel_KinFit() <=
dMinKinFitCL) {
421 dComboWrapper->Set_IsComboCut(
true);
424 cout <<
" Passed kinematic Fit CL cut " << endl;
427 map<Particle_t, set<Int_t> > locUsedThisCombo_2piMass;
428 locUsedThisCombo_2piMass[
PiPlus].insert(locPiPlusTrackID);
429 locUsedThisCombo_2piMass[
PiMinus].insert(locPiMinusTrackID);
431 dComboWrapper->Set_IsComboCut(
true);
434 cout <<
" Passed 2pi mass cut " << endl;
437 if(locUsedSoFar_2pi.find(locUsedThisCombo_2piMass) == locUsedSoFar_2pi.end())
442 locUsedSoFar_2pi.insert(locUsedThisCombo_2piMass);
450 if(locUsedSoFar_BeamEnergy.find(locBeamID) == locUsedSoFar_BeamEnergy.end())
453 locUsedSoFar_BeamEnergy.insert(locBeamID);
457 if(locUsedSoFar_MissingMass.find(locUsedThisCombo_MissingMass) == locUsedSoFar_MissingMass.end())
461 locUsedSoFar_MissingMass.insert(locUsedThisCombo_MissingMass);
475 if(locUsedSoFar_PiPlus.find(locPiPlusTrackID) == locUsedSoFar_PiPlus.end())
478 dHist_pipDeltap->Fill(locPiPlusP4_Thrown.Vect().Mag() > 0? (locPiPlusP4_Thrown.Vect().Mag()-locPiPlusP4.Vect().Mag())/locPiPlusP4_Thrown.Vect().Mag() : 0);
479 dHist_pipDeltap_Measured->Fill(locPiPlusP4_Thrown.Vect().Mag() > 0? (locPiPlusP4_Thrown.Vect().Mag()-locPiPlusP4_Measured.Vect().Mag())/locPiPlusP4_Thrown.Vect().Mag() : 0);
480 locUsedSoFar_PiPlus.insert(locPiPlusTrackID);
483 if(locUsedSoFar_PiMinus.find(locPiMinusTrackID) == locUsedSoFar_PiMinus.end())
486 dHist_pimDeltap->Fill(locPiMinusP4_Thrown.Vect().Mag() > 0? (locPiMinusP4_Thrown.Vect().Mag()-locPiMinusP4.Vect().Mag())/locPiMinusP4_Thrown.Vect().Mag() : 0);
487 dHist_pimDeltap_Measured->Fill(locPiMinusP4_Thrown.Vect().Mag() > 0? (locPiMinusP4_Thrown.Vect().Mag()-locPiMinusP4_Measured.Vect().Mag())/locPiMinusP4_Thrown.Vect().Mag() : 0);
488 locUsedSoFar_PiMinus.insert(locPiMinusTrackID);
491 cout <<
"Ebeam Thrown P4.E=" << dThrownBeam->Get_P4().E() <<
" Kinfit P4.E=" << locBeamP4.E() <<
" P4 Measured =" << locBeamP4_Measured.E() << endl;
493 cout <<
"PiPlus Thrown P4.E=" << locPiPlusP4_Thrown.E() <<
" Kinfit P4.E=" << locPiPlusP4.E() <<
" P4 Measured =" << locPiPlusP4_Measured.E() << endl;
494 cout <<
"PiMinus Thrown P4.E=" << locPiMinusP4_Thrown.E() <<
" Kinfit P4.E=" << locPiMinusP4.E() <<
" P4 Measured =" << locPiMinusP4_Measured.E() << endl << endl;
497 if ( locBeamP4_Measured.Z() < 0 || locPiPlusP4_Measured.Z() < 0 || locPiMinusP4_Measured.Z() < 0 ||
498 locPiPlusP4.Z() < 0 || locPiMinusP4.Z() < 0 ) {
499 dComboWrapper->Set_IsComboCut(
true);
500 cout <<
"*** Negative pz ***" << endl;
503 cout <<
" Passed Negative pz cut " << endl;
508 double tgen = (dThrownBeam->Get_P4() - loc2piP4_Thrown).M2();
509 TLorentzRotation resonanceBoost( -loc2piP4_Thrown.BoostVector() );
510 TLorentzVector beam_res = resonanceBoost * dThrownBeam->Get_P4();
511 TLorentzVector recoil_res = resonanceBoost * locPb208P4_Thrown;
512 TLorentzVector p1_res = resonanceBoost * locPiPlusP4_Thrown;
513 TLorentzVector p2_res = resonanceBoost * locPiMinusP4_Thrown;
516 TVector3 eps(cos(phipol),
sin(phipol), 0.0);
519 TVector3
y = (dThrownBeam->Get_P4().Vect().Unit().Cross(-locPb208P4_Thrown.Vect().Unit())).Unit();
522 TVector3 z = -1. * recoil_res.Vect().Unit();
523 TVector3
x = y.Cross(z).Unit();
524 TVector3 anglesgen( (p1_res.Vect()).Dot(x),
525 (p1_res.Vect()).Dot(y),
526 (p1_res.Vect()).Dot(z) );
528 double CosThetagen = anglesgen.CosTheta();
529 double phigen = anglesgen.Phi();
531 double Phigen = atan2(y.Dot(eps), dThrownBeam->Get_P4().Vect().Unit().Dot(eps.Cross(y)));
533 double psigen = Phigen - phigen;
534 if(psigen < -3.14159) psigen += 2*3.14159;
535 if(psigen > 3.14159) psigen -= 2*3.14159;
540 double tkin = (locBeamP4 - loc2piP4).M2();
541 TLorentzRotation resonanceBoost2( -loc2piP4.BoostVector() );
542 beam_res = resonanceBoost2 * locBeamP4;
543 recoil_res = resonanceBoost2 * locMissingPb208P4;
544 p1_res = resonanceBoost2 * locPiPlusP4;
545 p2_res = resonanceBoost2 * locPiMinusP4;
548 y = (locBeamP4.Vect().Unit().Cross(-locMissingPb208P4.Vect().Unit())).Unit();
551 z = -1. * recoil_res.Vect().Unit();
552 x = y.Cross(z).Unit();
553 TVector3 angleskin( (p1_res.Vect()).Dot(x),
554 (p1_res.Vect()).Dot(y),
555 (p1_res.Vect()).Dot(z) );
557 double CosThetakin = angleskin.CosTheta();
558 double phikin = angleskin.Phi();
560 double Phikin = atan2(y.Dot(eps), locBeamP4.Vect().Unit().Dot(eps.Cross(y)));
562 double psikin = Phikin - phikin;
563 if(psikin < -3.14159) psikin += 2*3.14159;
564 if(psikin > 3.14159) psikin -= 2*3.14159;
568 double tmeas = (locBeamP4_Measured - loc2piP4_Measured).M2();
569 TLorentzRotation resonanceBoost3( -loc2piP4_Measured.BoostVector() );
570 beam_res = resonanceBoost3 * locBeamP4_Measured;
571 recoil_res = resonanceBoost3 * locMissingPb208P4_Measured;
572 p1_res = resonanceBoost3 * locPiPlusP4_Measured;
573 p2_res = resonanceBoost3 * locPiMinusP4_Measured;
576 y = (locBeamP4_Measured.Vect().Unit().Cross(-locMissingPb208P4_Measured.Vect().Unit())).Unit();
579 z = -1. * recoil_res.Vect().Unit();
580 x = y.Cross(z).Unit();
581 TVector3 anglesmeas( (p1_res.Vect()).Dot(x),
582 (p1_res.Vect()).Dot(y),
583 (p1_res.Vect()).Dot(z) );
585 double CosThetameas = anglesmeas.CosTheta();
586 double phimeas = anglesmeas.Phi();
588 double Phimeas = atan2(y.Dot(eps), locBeamP4_Measured.Vect().Unit().Dot(eps.Cross(y)));
590 double psimeas = Phimeas - phimeas;
591 if(psimeas < -3.14159) psimeas += 2*3.14159;
592 if(psimeas > 3.14159) psimeas -= 2*3.14159;
594 double Delta_phi = phikin - phigen;
595 double Delta_Phi = Phikin - Phigen;
596 double Delta_phimeas = phimeas - phigen;
597 double Delta_Phimeas = Phimeas - Phigen;
599 map<Particle_t, set<Int_t> > locUsedThisCombo_Angles;
600 locUsedThisCombo_Angles[
Unknown].insert(locBeamID);
602 locUsedThisCombo_Angles[
PiPlus].insert(locPiPlusTrackID);
603 locUsedThisCombo_Angles[
PiMinus].insert(locPiMinusTrackID);
604 if(locUsedSoFar_Angles.find(locUsedThisCombo_Angles) == locUsedSoFar_Angles.end())
637 locUsedSoFar_Angles.insert(locUsedThisCombo_Angles);
664 Fill_NumCombosSurvivedHists();
713 Bool_t locIsEventCut =
true;
714 for(UInt_t loc_i = 0; loc_i < Get_NumCombos(); ++loc_i) {
716 dComboWrapper->Set_ComboIndex(loc_i);
718 if(dComboWrapper->Get_IsComboCut())
720 locIsEventCut =
false;
723 if(!locIsEventCut && dOutputTreeFileName !=
"")
742 DSelector::Finalize();
TH2I * dHist_phikin_phigen
TH1I * dHist_CosThetadiff
void Process(unsigned int &NEvents, unsigned int &NEvents_read)
TH1I * dHist_pipDeltap_Measured
DKinematicData * dMissingPb208Wrapper
TH2I * dHist_phikin_Phikin
TH2I * dHist_Phimeas_Phigen
TH1I * dHist_pimDeltap_Measured
DBeamParticle * dComboBeamWrapper
TH1I * dHist_piplusMomentumMeasured
TH1I * dHist_piminusMomentumMeasured
UInt_t dPreviousRunNumber
DChargedTrackHypothesis * dPiMinusWrapper
TH2I * dHist_phimeas_phigen
Double_t dMaxMissingMassSquared
TH2I * dHist_Delta_Phimeas
TH2I * dHist_CosThetakin_CosThetagen
TH2I * dHist_phigen_Phigen
Bool_t Process(Long64_t entry)
void Get_ComboWrappers(void)
DChargedTrackHypothesis * dPiPlusWrapper
TH2I * dHist_Phikin_Phigen
TH2I * dHist_Delta_phimeas
TH1I * dHist_MissingMassSquared
TH2I * dHist_CosTheta_psi
Double_t dMinMissingMassSquared