12 dOutputFileName =
"DSelector_p2pi_trees.root";
13 dOutputTreeFileName =
"tree_DSelector_p2pi_trees.root";
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));
63 dHist_MissingMassSquared =
new TH1I(
"MissingMassSquared",
";Missing Mass Squared (GeV/c^{2})^{2}", 600, -0.24, 0.24);
64 dHist_BeamEnergy =
new TH1I(
"BeamEnergy",
";Beam Energy (GeV)", 600, 0.0, 12.0);
69 dHist_Proton_dEdx_P =
new TH2I(
"Proton_dEdx_P",
" ;p_{proton} GeV/c; dE/dx (keV/cm)", 250, 0.0, 5.0, 250, 0.0, 25.);
70 dHist_KinFitChiSq =
new TH1I(
"KinFitChiSq",
";Kinematic Fit #chi^{2}/NDF", 250, 0., 25.);
71 dHist_KinFitCL =
new TH1I(
"KinFitCL",
";Kinematic Fit Confidence Level", 100, 0., 1.);
73 dHist_M2pi =
new TH1I(
"M2pi",
";M_{#pi^{+}#pi^{-}} (GeV/c^{2})", 600, 0, 1.2);
74 dHist_t =
new TH1I(
"t",
";|t| (GeV/c)^{2}", 100, 0.0, 2.0);
75 dHist_CosTheta_Psi =
new TH2I(
"CosTheta_Psi",
"; #psi; cos#theta", 360, -180., 180, 200, -1., 1.);
76 dHist_phi =
new TH1I(
"phi",
";phi (degrees)", 360,-180,180);
77 dHist_Phi =
new TH1I(
"Phi",
";Phi (degrees)", 360,-180,180);
78 dHist_psi =
new TH1I(
"psi",
";psi (degrees)", 360,-180,180);
80 dHist_pDeltap =
new TH1I(
"pDeltap",
"; proton: Thrown p - KinFit p/Thrown p",100,-0.2,0.2);
81 dHist_pipDeltap =
new TH1I(
"pipDeltap",
"; #pi^{+}: Thrown p - KinFit p/Thrown p",100,-0.2,0.2);
82 dHist_pimDeltap =
new TH1I(
"pimDeltap",
"; #pi^{-}: Thrown p - KinFit p/ Thrown p",100,-0.2,0.2);
84 dHist_pDeltap_Measured =
new TH1I(
"pDeltap_Measured",
"; proton: Thrown p - Measured p/Thrown p",100,-0.2,0.2);
89 fMinProton_dEdx =
new TF1(
"fMinProton_dEdx",
"exp(-1.*[0]*x + [1]) + [2]", 0., 10.);
91 fMaxPion_dEdx =
new TF1(
"fMaxPion_dEdx",
"exp(-1.*[0]*x + [1]) + [2]", 0., 10.);
167 UInt_t locRunNumber = Get_RunNumber();
178 Reset_Actions_NewEvent();
188 set<Int_t> locUsedSoFar_BeamEnergy;
189 set<Int_t> locUsedSoFar_Proton, locUsedSoFar_PiPlus, locUsedSoFar_PiMinus;
195 set<map<Particle_t, set<Int_t> > > locUsedSoFar_MissingMass, locUsedSoFar_2pi, locUsedSoFar_Angles;
216 if(dThrownBeam != NULL)
217 double locEbeam_Thrown = dThrownBeam->Get_P4().E();
220 TLorentzVector locProtonP4_Thrown;
221 TLorentzVector locPiPlusP4_Thrown;
222 TLorentzVector locPiMinusP4_Thrown;
224 for(UInt_t loc_i = 0; loc_i < Get_NumThrown(); ++loc_i)
227 dThrownWrapper->Set_ArrayIndex(loc_i);
228 Particle_t thrown_pid = dThrownWrapper->Get_PID();
230 TLorentzVector locP4_Thrown = dThrownWrapper->Get_P4();
231 if (loc_i == 0) locProtonP4_Thrown = locP4_Thrown;
232 if (loc_i == 1) locPiPlusP4_Thrown = locP4_Thrown;
233 if (loc_i == 2) locPiMinusP4_Thrown = locP4_Thrown;
247 for(UInt_t loc_i = 0; loc_i < Get_NumCombos(); ++loc_i)
250 dComboWrapper->Set_ComboIndex(loc_i);
253 if(dComboWrapper->Get_IsComboCut())
279 TLorentzVector locProtonP4_Measured =
dProtonWrapper->Get_P4_Measured();
280 TLorentzVector locPiPlusP4_Measured =
dPiPlusWrapper->Get_P4_Measured();
281 TLorentzVector locPiMinusP4_Measured =
dPiMinusWrapper->Get_P4_Measured();
288 TLorentzVector locMissingP4_Measured = locBeamP4_Measured + dTargetP4;
289 locMissingP4_Measured -= locProtonP4_Measured + locPiPlusP4_Measured + locPiMinusP4_Measured;
290 TLorentzVector loc2piP4 = locPiPlusP4 + locPiMinusP4;
293 cout <<
"MM2 =" << locMissingP4_Measured.M2() << endl;
300 if(!Execute_Actions())
323 if(locProton_dEdx_CDC < fMinProton_dEdx->Eval(locProtonP4.P())) {
324 dComboWrapper->Set_IsComboCut(
true);
331 if(locPiPlus_dEdx_CDC >
fMaxPion_dEdx->Eval(locPiPlusP4.P()) || locPiMinus_dEdx_CDC >
fMaxPion_dEdx->Eval(locPiMinusP4.P())) {
332 dComboWrapper->Set_IsComboCut(
true);
340 double locMissingMassSquared = locMissingP4_Measured.M2();
344 map<Particle_t, set<Int_t> > locUsedThisCombo_MissingMass;
345 locUsedThisCombo_MissingMass[
Unknown].insert(locBeamID);
346 locUsedThisCombo_MissingMass[
Proton].insert(locProtonTrackID);
347 locUsedThisCombo_MissingMass[
PiPlus].insert(locPiPlusTrackID);
348 locUsedThisCombo_MissingMass[
PiMinus].insert(locPiMinusTrackID);
352 dComboWrapper->Set_IsComboCut(
true);
358 dComboWrapper->Set_IsComboCut(
true);
363 dHist_KinFitChiSq->Fill(dComboWrapper->Get_ChiSq_KinFit()/dComboWrapper->Get_NDF_KinFit());
364 dHist_KinFitCL->Fill(dComboWrapper->Get_ConfidenceLevel_KinFit());
365 if(dComboWrapper->Get_ConfidenceLevel_KinFit() <=
dMinKinFitCL) {
366 dComboWrapper->Set_IsComboCut(
true);
371 map<Particle_t, set<Int_t> > locUsedThisCombo_2piMass;
372 locUsedThisCombo_2piMass[
PiPlus].insert(locPiPlusTrackID);
373 locUsedThisCombo_2piMass[
PiMinus].insert(locPiMinusTrackID);
375 dComboWrapper->Set_IsComboCut(
true);
378 if(locUsedSoFar_2pi.find(locUsedThisCombo_2piMass) == locUsedSoFar_2pi.end())
381 locUsedSoFar_2pi.insert(locUsedThisCombo_2piMass);
388 if(locUsedSoFar_BeamEnergy.find(locBeamID) == locUsedSoFar_BeamEnergy.end())
391 locUsedSoFar_BeamEnergy.insert(locBeamID);
395 if(locUsedSoFar_MissingMass.find(locUsedThisCombo_MissingMass) == locUsedSoFar_MissingMass.end())
399 locUsedSoFar_MissingMass.insert(locUsedThisCombo_MissingMass);
403 if(locUsedSoFar_Proton.find(locProtonTrackID) == locUsedSoFar_Proton.end())
407 dHist_pDeltap->Fill(locProtonP4_Thrown.Vect().Mag() > 0? (locProtonP4_Thrown.Vect().Mag()-locProtonP4.Vect().Mag())/locProtonP4_Thrown.Vect().Mag() : 0);
408 dHist_pDeltap_Measured->Fill(locProtonP4_Thrown.Vect().Mag() > 0? (locProtonP4_Thrown.Vect().Mag()-locProtonP4_Measured.Vect().Mag())/locProtonP4_Thrown.Vect().Mag() : 0);
409 locUsedSoFar_Proton.insert(locProtonTrackID);
412 if(locUsedSoFar_PiPlus.find(locPiPlusTrackID) == locUsedSoFar_PiPlus.end())
415 dHist_pipDeltap->Fill(locPiPlusP4_Thrown.Vect().Mag() > 0? (locPiPlusP4_Thrown.Vect().Mag()-locPiPlusP4.Vect().Mag())/locPiPlusP4_Thrown.Vect().Mag() : 0);
416 dHist_pipDeltap_Measured->Fill(locPiPlusP4_Thrown.Vect().Mag() > 0? (locPiPlusP4_Thrown.Vect().Mag()-locPiPlusP4_Measured.Vect().Mag())/locPiPlusP4_Thrown.Vect().Mag() : 0);
417 locUsedSoFar_PiPlus.insert(locPiPlusTrackID);
420 if(locUsedSoFar_PiMinus.find(locPiMinusTrackID) == locUsedSoFar_PiMinus.end())
423 dHist_pimDeltap->Fill(locPiMinusP4_Thrown.Vect().Mag() > 0? (locPiMinusP4_Thrown.Vect().Mag()-locPiMinusP4.Vect().Mag())/locPiMinusP4_Thrown.Vect().Mag() : 0);
424 dHist_pimDeltap_Measured->Fill(locPiMinusP4_Thrown.Vect().Mag() > 0? (locPiMinusP4_Thrown.Vect().Mag()-locPiMinusP4_Measured.Vect().Mag())/locPiMinusP4_Thrown.Vect().Mag() : 0);
425 locUsedSoFar_PiMinus.insert(locPiMinusTrackID);
428 cout <<
"Ebeam Thrown P4.E=" << dThrownBeam->Get_P4().E() <<
" Kinfit P4.E=" << locBeamP4.E() <<
" P4 Measured =" << locBeamP4_Measured.E() << endl;
429 cout <<
"Proton Thrown P4.E=" << locProtonP4_Thrown.E() <<
" Kinfit P4.E=" << locProtonP4.E() <<
" P4 Measured =" << locProtonP4_Measured.E() <<
" CL=" << dComboWrapper->Get_ConfidenceLevel_KinFit() << endl;
430 cout <<
"PiPlus Thrown P4.E=" << locPiPlusP4_Thrown.E() <<
" Kinfit P4.E=" << locPiPlusP4.E() <<
" P4 Measured =" << locPiPlusP4_Measured.E() << endl;
431 cout <<
"PiMinus Thrown P4.E=" << locPiMinusP4_Thrown.E() <<
" Kinfit P4.E=" << locPiMinusP4.E() <<
" P4 Measured =" << locPiMinusP4_Measured.E() << endl << endl;
434 double t = (locProtonP4 - dTargetP4).M2();
435 TLorentzRotation resonanceBoost( -loc2piP4.BoostVector() );
436 TLorentzVector beam_res = resonanceBoost * locBeamP4;
437 TLorentzVector recoil_res = resonanceBoost * locProtonP4;
438 TLorentzVector p1_res = resonanceBoost * locPiPlusP4;
439 TLorentzVector p2_res = resonanceBoost * locPiMinusP4;
443 TVector3
y = (locBeamP4.Vect().Unit().Cross(-locProtonP4.Vect().Unit())).Unit();
446 TVector3 z = -1. * recoil_res.Vect().Unit();
447 TVector3
x = y.Cross(z).Unit();
448 TVector3 angles( (p1_res.Vect()).Dot(x),
449 (p1_res.Vect()).Dot(y),
450 (p1_res.Vect()).Dot(z) );
452 double CosTheta = angles.CosTheta();
454 double phi = angles.Phi();
456 TVector3 eps(1.0, 0.0, 0.0);
457 double Phi = atan2(y.Dot(eps), locBeamP4.Vect().Unit().Dot(eps.Cross(y)));
459 double psi = phi - Phi;
460 if(psi < -3.14159) psi += 2*3.14159;
461 if(psi > 3.14159) psi -= 2*3.14159;
465 map<Particle_t, set<Int_t> > locUsedThisCombo_Angles;
466 locUsedThisCombo_Angles[
Unknown].insert(locBeamID);
467 locUsedThisCombo_Angles[
Proton].insert(locProtonTrackID);
468 locUsedThisCombo_Angles[
PiPlus].insert(locPiPlusTrackID);
469 locUsedThisCombo_Angles[
PiMinus].insert(locPiMinusTrackID);
470 if(locUsedSoFar_Angles.find(locUsedThisCombo_Angles) == locUsedSoFar_Angles.end())
477 locUsedSoFar_Angles.insert(locUsedThisCombo_Angles);
505 Fill_NumCombosSurvivedHists();
539 Bool_t locIsEventCut =
true;
540 for(UInt_t loc_i = 0; loc_i < Get_NumCombos(); ++loc_i) {
542 dComboWrapper->Set_ComboIndex(loc_i);
544 if(dComboWrapper->Get_IsComboCut())
546 locIsEventCut =
false;
549 if(!locIsEventCut && dOutputTreeFileName !=
"")
568 DSelector::Finalize();
UInt_t dPreviousRunNumber
DChargedTrackHypothesis * dPiMinusWrapper
TH1I * dHist_piplusMomentumMeasured
TH2I * dHist_Proton_dEdx_P
void Process(unsigned int &NEvents, unsigned int &NEvents_read)
Double_t dMaxMissingMassSquared
TH2I * dHist_CosTheta_Psi
Double_t dMinMissingMassSquared
Bool_t Process(Long64_t entry)
TH1I * dHist_MissingMassSquared
TH1I * dHist_pDeltap_Measured
DChargedTrackHypothesis * dPiPlusWrapper
DBeamParticle * dComboBeamWrapper
TH1I * dHist_pipDeltap_Measured
TH1I * dHist_pMomentumMeasured
TH1I * dHist_pimDeltap_Measured
void Get_ComboWrappers(void)
TH1I * dHist_piminusMomentumMeasured
DChargedTrackHypothesis * dProtonWrapper