// $Id$ // // File: DReaction_factory_papp.cc // Created: Fri Jun 17 11:39:33 EDT 2016 // Creator: vbajaj (on Linux maria 2.6.32-573.3.1.el6.x86_64 x86_64) // #include "DReaction_factory_papp.h" #include "DCustomAction_indi_P4.h" //------------------ // brun //------------------ jerror_t DReaction_factory_papp::brun(JEventLoop* locEventLoop, int32_t locRunNumber) { vector locBeamPeriodVector; locEventLoop->GetCalib("PHOTON_BEAM/RF/beam_period", locBeamPeriodVector); dBeamBunchPeriod = locBeamPeriodVector[0]; return NOERROR; } //------------------ // evnt //------------------ jerror_t DReaction_factory_papp::evnt(JEventLoop* locEventLoop, uint64_t locEventNumber) { // Make as many DReaction objects as desired DReactionStep* locReactionStep = NULL; DReaction* locReaction = NULL; //create with a unique name for each DReaction object. CANNOT (!) be "Thrown" DReaction* locReaction1 = NULL; //create with a unique name for each DReaction object. CANNOT (!) be "Thrown" DReaction* locReaction2 = NULL; //create with a unique name for each DReaction object. CANNOT (!) be "Thrown" DReaction* locReaction3 = NULL; //create with a unique name for each DReaction object. CANNOT (!) be "Thrown" DReaction* locReaction4 = NULL; //create with a unique name for each DReaction object. CANNOT (!) be "Thrown" DReaction* locReaction5 = NULL; //create with a unique name for each DReaction object. CANNOT (!) be "Thrown" // DOCUMENTATION: // ANALYSIS library: https://halldweb1.jlab.org/wiki/index.php/GlueX_Analysis_Software // DReaction factory: https://halldweb1.jlab.org/wiki/index.php/Analysis_DReaction /************************************************** papp Reaction Definition *************************************************/ locReaction = new DReaction("papp"); locReaction1 = new DReaction("p(ap)p"); locReaction2 = new DReaction("(p)app"); locReaction3 = new DReaction("ppipi"); locReaction4 = new DReaction("ppipi_P4"); locReaction5 = new DReaction("ppipi_Vertex"); //Required: DReactionSteps to specify the channel and decay chain you want to study //Particles are of type Particle_t, an enum defined in sim-recon/src/libraries/include/particleType.h //Reaction 0 : Gamma, Proton -> Proton, AntiProton, Proton locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Gamma); locReactionStep->Set_TargetParticleID(Proton); locReactionStep->Add_FinalParticleID(Proton); locReactionStep->Add_FinalParticleID(Proton); locReactionStep->Add_FinalParticleID(AntiProton); locReaction->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); //register so will be deleted later: prevent memory leak //Reaction 1: Gamma, Proton -> Proton, AntiProton(missing), Proton locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Gamma); locReactionStep->Set_TargetParticleID(Proton); locReactionStep->Add_FinalParticleID(Proton); locReactionStep->Add_FinalParticleID(AntiProton,true); locReactionStep->Add_FinalParticleID(Proton); locReaction1->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); //Reaction 2: Gamma, Proton -> Proton, AntiProton, Proton(missing) locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Gamma); locReactionStep->Set_TargetParticleID(Proton); locReactionStep->Add_FinalParticleID(Proton); locReactionStep->Add_FinalParticleID(AntiProton); locReactionStep->Add_FinalParticleID(Proton,true); locReaction2->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); //Reaction 3: Gamma, Proton -> Proton, PiPlus, PiMinus locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Gamma); locReactionStep->Set_TargetParticleID(Proton); locReactionStep->Add_FinalParticleID(Proton); locReactionStep->Add_FinalParticleID(PiPlus); locReactionStep->Add_FinalParticleID(PiMinus); locReaction3->Add_ReactionStep(locReactionStep); locReaction4->Add_ReactionStep(locReactionStep); locReaction5->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); // locReaction->Set_EventStoreSkims("2q+,q-"); // locReaction1->Set_EventStoreSkims("2q+"); // locReaction2->Set_EventStoreSkims("q+,q-"); // locReaction3->Set_EventStoreSkims("2q+,q-"); /**************************************************** papp Control Settings ****************************************************/ // Recommended: Type of kinematic fit to perform (default is d_NoFit) //fit types are of type DKinFitType, an enum defined in sim-recon/src/libraries/ANALYSIS/DReaction.h //Options: d_NoFit (default), d_P4Fit, d_VertexFit, d_P4AndVertexFit //P4 fits automatically constrain decaying particle masses, unless they are manually disabled locReaction->Set_KinFitType(d_P4AndVertexFit); locReaction1->Set_KinFitType(d_P4AndVertexFit); locReaction2->Set_KinFitType(d_P4AndVertexFit); locReaction3->Set_KinFitType(d_P4AndVertexFit); locReaction4->Set_KinFitType(d_P4Fit); locReaction5->Set_KinFitType(d_VertexFit); // Highly Recommended: When generating particle combinations, reject all beam photons that match to a different RF bunch (delta_t > 1.002 ns) locReaction->Set_MaxPhotonRFDeltaT(0.5*dBeamBunchPeriod); //should be minimum cut value locReaction1->Set_MaxPhotonRFDeltaT(0.5*dBeamBunchPeriod); //should be minimum cut value locReaction2->Set_MaxPhotonRFDeltaT(0.5*dBeamBunchPeriod); //should be minimum cut value locReaction3->Set_MaxPhotonRFDeltaT(0.5*dBeamBunchPeriod); //should be minimum cut value locReaction4->Set_MaxPhotonRFDeltaT(0.5*dBeamBunchPeriod); //should be minimum cut value locReaction5->Set_MaxPhotonRFDeltaT(0.5*dBeamBunchPeriod); //should be minimum cut value // Optional: When generating particle combinations, reject all photon candidates with a PID confidence level < 5.73303E-7 (+/- 5-sigma) // Make sure PID errors are calculated correctly before using. //locReaction->Set_MinPhotonPIDFOM(5.73303E-7); // Optional: When generating particle combinations, reject all charged track candidates with a PID confidence level < 5.73303E-7 (+/- 5-sigma) // Make sure PID errors are calculated correctly before using. //locReaction->Set_MinChargedPIDFOM(5.73303E-7); // Highly Recommended: Cut on number of extra "good" tracks. "Good" tracks are ones that survive the "PreSelect" (or user custom) factory. // Important: Keep cut large: Can have many ghost and accidental tracks that look "good" locReaction->Set_MaxExtraGoodTracks(4); locReaction1->Set_MaxExtraGoodTracks(4); locReaction2->Set_MaxExtraGoodTracks(4); locReaction3->Set_MaxExtraGoodTracks(4); locReaction4->Set_MaxExtraGoodTracks(4); locReaction5->Set_MaxExtraGoodTracks(4); //Newly added: # of photons in one pulse of the beam locReaction->Set_MaxNumBeamPhotonsInBunch(3); locReaction1->Set_MaxNumBeamPhotonsInBunch(3); locReaction2->Set_MaxNumBeamPhotonsInBunch(3); locReaction3->Set_MaxNumBeamPhotonsInBunch(3); locReaction4->Set_MaxNumBeamPhotonsInBunch(3); locReaction5->Set_MaxNumBeamPhotonsInBunch(3); // Highly Recommended: Enable ROOT TTree output for this DReaction locReaction->Enable_TTreeOutput("tree_papp.root"); //string is file name (must end in ".root"!!): doen't need to be unique, feel free to change locReaction1->Enable_TTreeOutput("tree_papp_missing_ap.root"); //string is file name (must end in ".root"!!): doen't need to be unique, feel free to change locReaction2->Enable_TTreeOutput("tree_papp_missing_p.root"); //string is file name (must end in ".root"!!): doen't need to be unique, feel free to change locReaction3->Enable_TTreeOutput("tree_ppipi.root"); //string is file name (must end in ".root"!!): doen't need to be unique, feel free to change /************************************************** papp Pre-Combo Custom Cuts *************************************************/ // Highly Recommended: Very loose invariant mass cuts, applied during DParticleComboBlueprint construction // Example: pi0 -> g, g cut // locReaction->Set_InvariantMassCut(Pi0, 0.0, 0.3); // Highly Recommended: Very loose DAnalysisAction cuts, applied just after creating the combination (before saving it) // Example: Missing mass of proton // locReaction->Add_ComboPreSelectionAction(new DCutAction_MissingMass(locReaction, false, 0.7, 1.2)); /**************************************************** papp Analysis Actions ****************************************************/ //deques to input into missing mass functor to calculate missing mass off of... deque p_p_deque = {Proton,Proton}; deque p_ap_deque = {Proton,AntiProton}; // Recommended: Analysis actions automatically performed by the DAnalysisResults factories to histogram useful quantities. //These actions are executed sequentially, and are executed on each surviving (non-cut) particle combination //Pre-defined actions can be found in ANALYSIS/DHistogramActions_*.h and ANALYSIS/DCutActions.h //If a histogram action is repeated, it should be created with a unique name (string) to distinguish them // HISTOGRAM PID locReaction->Add_AnalysisAction(new DHistogramAction_PID(locReaction)); locReaction1->Add_AnalysisAction(new DHistogramAction_PID(locReaction1)); locReaction2->Add_AnalysisAction(new DHistogramAction_PID(locReaction2)); locReaction3->Add_AnalysisAction(new DHistogramAction_PID(locReaction3)); locReaction4->Add_AnalysisAction(new DHistogramAction_PID(locReaction4)); locReaction5->Add_AnalysisAction(new DHistogramAction_PID(locReaction5)); locReaction->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction, false, 100, -1., 1., "MMSq_Pre_dEdx")); locReaction1->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction1,0,p_p_deque, false, 100, -2.0, 2.0, "AProt_MMSq_Pre_dEdx")); locReaction2->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction2,0,p_ap_deque, false, 100, -2.0, 2.0, "Prot_MMSq_Pre_dEdx")); locReaction3->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction3, false, 100, -2.0, 2.0, "MMSq_Pre_dEdx")); // CUT PID //locReaction->Add_AnalysisAction(new DHistogramAction_PID(locReaction,"Post_dEdxCut")); // SYS_TOF, SYS_BCAL, SYS_FCAL, ...: DetectorSystem_t: Defined in libraries/include/GlueX.h // locReaction->Add_AnalysisAction(new DCutAction_EachPIDFOM(locReaction, 5.73303E-7)); locReaction->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction, false, 1.5, Unknown, SYS_NULL)); //cut at delta-t +/- 1.0 //false: measured data locReaction1->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction1, false, 1.5, Unknown, SYS_NULL)); //cut at delta-t +/- 1.0 //false: measured data locReaction2->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction2, false, 1.5, Unknown, SYS_NULL)); //cut at delta-t +/- 1.0 //false: measured data locReaction3->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction3, false, 1.5, Unknown, SYS_NULL)); //cut at delta-t +/- 1.0 //false: measured data locReaction4->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction4, false, 1.5, Unknown, SYS_NULL)); //cut at delta-t +/- 1.0 //false: measured data locReaction5->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction5, false, 1.5, Unknown, SYS_NULL)); //cut at delta-t +/- 1.0 //false: measured data locReaction->Add_AnalysisAction(new DCustomAction_indi_P4(locReaction,false)); locReaction3->Add_AnalysisAction(new DCustomAction_indi_P4(locReaction3,false)); // HISTOGRAM PID POST DeltaT Cut locReaction->Add_AnalysisAction(new DHistogramAction_PID(locReaction,"Post_DeltaTCut")); locReaction1->Add_AnalysisAction(new DHistogramAction_PID(locReaction1,"Post_DeltaTCut")); locReaction2->Add_AnalysisAction(new DHistogramAction_PID(locReaction2,"Post_DeltaTCut")); locReaction3->Add_AnalysisAction(new DHistogramAction_PID(locReaction3,"Post_DeltaTCut")); // HISTOGRAM MASSES //false/true: measured/kinfit data locReaction->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction,false, 100, -1., 1., "AProt_MMSq_Post_dEdx")); locReaction1->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction1,0,p_p_deque, false, 100, -2., 2.0, "AProt_MMSq_Post_dEdx")); locReaction2->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction2,0,p_ap_deque, false, 100, -2., 2.0, "Prot_MMSq_Post_dEdx")); locReaction3->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction3, false, 100, -2., 2.0, "MMSq_Post_dEdx")); // KINEMATIC FIT locReaction->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction, 0.02)); locReaction->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction, 0.00)); //0% confidence level cut //require kinematic fit converges locReaction1->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction1, 0.02)); locReaction1->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction1, 0.00)); //0% confidence level cut //require kinematic fit converges locReaction2->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction2, 0.02)); locReaction2->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction2, 0.00)); //0% confidence level cut //require kinematic fit converges locReaction3->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction3, 0.02)); locReaction3->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction3, 0.00)); //0% confidence level cut //require kinematic fit converges locReaction4->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction4, 0.02)); locReaction4->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction4, 0.00)); //0% confidence level cut //require kinematic fit converges locReaction5->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction5, 0.02)); locReaction5->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction5, 0.00)); //0% confidence level cut //require kinematic fit converges // HISTOGRAM MASSES //false/true: measured/kinfit data //locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction,0, deque (Proton,AntiProton),false, 600, 1.8, 3.0, "PAP_Post_dEdx_KinFit")); //locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction,AntiProton, false, 600, 1.8, 3., "AntiProton_Post_KinFit")); locReaction->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction, false, 100, -1.0, 1.0, "AProt_MMSq_Post_KinFit")); locReaction1->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction1,0, p_p_deque, false, 100, -2., 2.0, "AProt_MMSq_Post_KinFit")); locReaction2->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction2,0,p_ap_deque, false, 100, -2., 2.0, "Prot_MMSq_Post_KinFit")); locReaction3->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction3,false, 100, -2.0, 2.0, "MMSq_Post_KinFit")); //locReaction->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction, false, 100, -1., 1., "MMSq_Post_dEdx_KinFit")); // Kinematics locReaction->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction, false)); //false: measured data locReaction1->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction1, false)); //false: measured data locReaction2->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction2, false)); //false: measured data locReaction3->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction3, false)); //false: measured data locReaction4->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction4, false)); //false: measured data locReaction5->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction5, false)); //false: measured data // locReaction->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction, true, "KinFit")); //true: kinematic-fit data locReaction->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction)); locReaction1->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction1)); locReaction2->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction2)); locReaction3->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction3)); locReaction4->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction4)); locReaction5->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction5)); _data.push_back(locReaction); //Register the DReaction with the factory // EXCLUSIVE ONLY FOR NOW //_data.push_back(locReaction1); //Register the DReaction with the factory //_data.push_back(locReaction2); //Register the DReaction with the factory //_data.push_back(locReaction3); //Register the DReaction with the factory //_data.push_back(locReaction4); //Register the DReaction with the factory //_data.push_back(locReaction5); //Register the DReaction with the factory return NOERROR; } //------------------ // fini //------------------ jerror_t DReaction_factory_papp::fini(void) { for(size_t loc_i = 0; loc_i < dReactionStepPool.size(); ++loc_i) delete dReactionStepPool[loc_i]; //cleanup memory return NOERROR; }