Difference between revisions of "Analysis DReaction"

From GlueXWiki
Jump to: navigation, search
(Summary)
 
(65 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
== Summary ==
 
== Summary ==
* Note: The objects (not the factory) are located in: src/libraries/ANALYSIS/
+
* Note: The objects (<span style="color:red">not the factory</span>) are located in: $HALLD_HOME/src/libraries/ANALYSIS/
 +
** the '''ReactionFilter''' factory is in $HALLD_HOME/src/plugins/Analysis/ReactionFilter.
 
* '''DReactionStep''': Contains the particle types for an interaction or decay step in a reaction.
 
* '''DReactionStep''': Contains the particle types for an interaction or decay step in a reaction.
 
** The particle types are from the <span style="color:#0000FF">Particle_t</span> enum defined in sim-recon/src/libraries/include/particleType.h  
 
** The particle types are from the <span style="color:#0000FF">Particle_t</span> enum defined in sim-recon/src/libraries/include/particleType.h  
 
* '''DReaction''': Contains the <span style="color:#0000FF">DReactionStep</span> objects for a reaction, along with (optional) analysis actions/instructions.
 
* '''DReaction''': Contains the <span style="color:#0000FF">DReactionStep</span> objects for a reaction, along with (optional) analysis actions/instructions.
 
* '''DReaction_factory''': Users should create the <span style="color:#0000FF">DReaction</span> objects they want to study in this factory, and place it in their plugin.
 
* '''DReaction_factory''': Users should create the <span style="color:#0000FF">DReaction</span> objects they want to study in this factory, and place it in their plugin.
 +
** It is recommended that users create their class with a unique name and corresponding tag so that multiple analysis plugins can be run simultaneously.
 +
* The <span style="color:#0000FF">MakeReactionPlugin.pl</span> perl script (it is installed to $PATH) can be used to create template code for a new plugin.
  
 
== DReaction Notes ==
 
== DReaction Notes ==
Line 18: Line 21:
 
== DReactionStep Notes ==
 
== DReactionStep Notes ==
 
* The <span style="color:#0000FF">DReactionStep</span> objects must be added to the <span style="color:#0000FF">DReaction</span> in the correct order: the decay step for a particle must always be after its production step (it can be anywhere after it, but it must be after it).  
 
* The <span style="color:#0000FF">DReactionStep</span> objects must be added to the <span style="color:#0000FF">DReaction</span> in the correct order: the decay step for a particle must always be after its production step (it can be anywhere after it, but it must be after it).  
** However, you can study (for example) &pi;<sup>0</sup> decays without a &pi;<sup>0</sup> production step if you don't care how they're produced.  E.g.:
+
** However, you can study (for example) <span style="color:red">&pi;<sup>0</sup></span> decays without a <span style="color:red">&pi;<sup>0</sup></span> production step if you don't care how they're produced.  E.g.:
  
 
<syntaxhighlight>
 
<syntaxhighlight>
 
//pi0 -> gamma, gamma
 
//pi0 -> gamma, gamma
 
DReaction* locReaction = new DReaction("pi0"); //unique name
 
DReaction* locReaction = new DReaction("pi0"); //unique name
DReactionStep* locReactionStep = new DReactionStep();
+
locReaction->Add_ReactionStep(new DReactionStep(Pi0, {Gamma, Gamma}));
locReactionStep->Set_InitialParticleID(Pi0);
+
locReactionStep->Add_FinalParticleID(Gamma);
+
locReactionStep->Add_FinalParticleID(Gamma);
+
locReaction->Add_ReactionStep(locReactionStep);
+
 
</syntaxhighlight>
 
</syntaxhighlight>
  
* To define one of the particles as missing, when adding the particle add the optional "true" flag:
+
* To define one of the particles as missing, add it after the list of final state particles
 
<syntaxhighlight>
 
<syntaxhighlight>
locReactionStep->Add_FinalParticleID(Proton, true); //missing proton
+
locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiMinus}, Proton)); //proton is missing, pi+/- are detected
 
</syntaxhighlight>
 
</syntaxhighlight>
  
* '''IMPORTANT NOTE FOR ANALYZERS''': If a PID you need to use for your analysis is not defined by <span style="color:#0000FF">Particle_t</span>, you can use "Unknown" instead (e.g. a rare resonance) (if you don't need its mass or charge). However, only one PID per <span style="color:#0000FF">DReaction</span> can have the <span style="color:#0000FF">Particle_t</span> of "Unknown" (e.g. the resonance you are studying), because the framework will not distinguish between the two.  If you need more than one PID that is not included in <span style="color:#0000FF">Particle_t</span>, then add all of the PIDs you need but one to particleType.h (along with their charges, masses, names, etc.) and check in the update (because other people may need those particles too!).
+
* To analyze a channel inclusively (with no missing particles otherwise (the Unknown below)):
 
+
== Setting up DReactionStep Example: b1pi ==
+
 
+
 
<syntaxhighlight>
 
<syntaxhighlight>
jerror_t DReaction_factory::init(void)
+
locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiMinus, Proton}, Unknown, true)); //proton/pi+/- are detected, nothing is missing (Unknown), inclusive (true)
{
+
</syntaxhighlight>
  DReactionStep* locReactionStep;
+
  
  DReaction* locReaction = new DReaction("b1pi"); //unique name
+
* '''IMPORTANT NOTE FOR ANALYZERS''': Resonance PIDs (except for <span style="color:red">&omega;</span> and <span style="color:red">&phi;</span>) are not allowed anywhere in a <span style="color:#0000FF">DReactionStep</span>.  This is because you cannot identify on an event-by-event basis which particles decayed from a resonance and which did not.  However, since they are extremely narrow, the <span style="color:red">&omega;</span> and <span style="color:red">&phi;</span> resonances are allowed. 
  
/**************************************************** b1pi Steps ****************************************************/
+
* '''IMPORTANT NOTE FOR ANALYZERS''': The <span style="color:red">Unknown</span> PID can be used as an initial particle (for when you don't want to worry about beam particle selection). If a kinematic fit with a P4 constraint is selected, then four-momentum will not be constrained but any mass constraints still will be (inclusive kinematic fit).
  
  //g, p -> X(2000), (p)
+
* To disable a mass constraint from being applied during a kinematic fit, call the following on the DReactionStep where that particle is the initial particle:
  locReactionStep = new DReactionStep();
+
<syntaxhighlight>
  locReactionStep->Set_InitialParticleID(Gamma);
+
locReactionStep->Set_KinFitConstrainInitMassFlag(false);
  locReactionStep->Set_TargetParticleID(Proton);
+
</syntaxhighlight>
  locReactionStep->Add_FinalParticleID(Unknown); //x(2000)
+
  locReactionStep->Add_FinalParticleID(Proton, true); //proton missing
+
  locReaction->Add_ReactionStep(locReactionStep);
+
  
  //x(2000) -> b1(1235)+, pi-
+
== DReaction Control Variables ==
  locReactionStep = new DReactionStep();
+
  locReactionStep->Set_InitialParticleID(Unknown); //x(2000)
+
  locReactionStep->Add_FinalParticleID(b1_1235_Plus);
+
  locReactionStep->Add_FinalParticleID(PiMinus);
+
  locReaction->Add_ReactionStep(locReactionStep);
+
  
  //b1(1235)+ -> omega, pi+
+
=== Kinematic Fit Type ===
  locReactionStep = new DReactionStep();
+
* Defined by the <span style="color:#0000FF">DKinFitType</span> enum in sim-recon/src/libraries/Analysis/DReaction.h
  locReactionStep->Set_InitialParticleID(b1_1235_Plus);
+
** Values: <span style="color:red">d_NoFit</span>, <span style="color:red">d_P4Fit</span>, <span style="color:red">d_VertexFit</span>, <span style="color:red">d_SpacetimeFit</span>, <span style="color:red">d_P4AndVertexFit</span>, <span style="color:red">d_P4AndSpacetimeFit</span>
  locReactionStep->Add_FinalParticleID(omega);
+
** P4 fits include mass constraints
  locReactionStep->Add_FinalParticleID(PiPlus);
+
** The spacetime fits are currently unsupported.
  locReaction->Add_ReactionStep(locReactionStep);
+
  
  //omega -> pi+, pi-, pi0
+
=== TTree Output ===
  locReactionStep = new DReactionStep();
+
* If creating your own plugin, output the results from the analysis of a <span style="color:#0000FF">DReaction</span> is disabled by default, and must be enabled for each desired <span style="color:#0000FF">DReaction</span>.  This enabling is in addition to actually writing out the TTree (see [[Analysis_TTreeFormat| Standard TTree]] for details).  To enable <span style="color:#0000FF">TTree</span> output for a <span style="color:#0000FF">DReaction</span>, call:
  locReactionStep->Set_InitialParticleID(omega);
+
  locReactionStep->Add_FinalParticleID(PiPlus);
+
  locReactionStep->Add_FinalParticleID(PiMinus);
+
  locReactionStep->Add_FinalParticleID(Pi0);
+
  locReaction->Add_ReactionStep(locReactionStep);
+
  
  //pi0 -> gamma, gamma
+
<syntaxhighlight>
  locReactionStep = new DReactionStep();
+
// string is file name (must end in \".root\"!!): doen't need to be unique, feel free to change
  locReactionStep->Set_InitialParticleID(Pi0);
+
locReaction->Enable_TTreeOutput("tree_b1pi.root", false); //true/false: do/don't save unused hypotheses
  locReactionStep->Add_FinalParticleID(Gamma);
+
  locReactionStep->Add_FinalParticleID(Gamma);
+
  locReaction->Add_ReactionStep(locReactionStep);
+
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== DReaction Control Variables ==
+
* Note that if you specify more than one <span style="color:#0000FF">DReaction</span> to have the same file name, then they will both be saved in the same file.
 
+
=== Kinematic Fit Type ===
+
* Defined by the <span style="color:#0000FF">DKinFitType</span> enum in sim-recon/src/libraries/Analysis/DKinFitResults.h
+
** Values: d_NoFit, d_P4Fit, d_VertexFit, d_SpacetimeFit, d_P4AndVertexFit, d_P4AndSpacetimeFit
+
*** P4 fits include mass constraints
+
  
 
=== Comboing Cuts ===
 
=== Comboing Cuts ===
 
* There are several different cuts the user can place to cut out potential particle combinations that are "obviously" invalid before they are created.  
 
* There are several different cuts the user can place to cut out potential particle combinations that are "obviously" invalid before they are created.  
 
* These are useful for reducing memory usage spikes and cpu-time, especially in events with many (10+) garbage tracks/showers (in some cases the # of <span style="color:#0000FF">DParticleCombos</span> can exceed 20000)
 
* These are useful for reducing memory usage spikes and cpu-time, especially in events with many (10+) garbage tracks/showers (in some cases the # of <span style="color:#0000FF">DParticleCombos</span> can exceed 20000)
* These cuts are disabled by default.
+
* Most of these cuts are disabled by default.
 
* The values of these cuts are overridden if specified on the command line.
 
* The values of these cuts are overridden if specified on the command line.
 
{| border="1" cellpadding="2" align="left" valign="top" style="text-align:center;"
 
{| border="1" cellpadding="2" align="left" valign="top" style="text-align:center;"
Line 104: Line 77:
 
!width="600"| Comment
 
!width="600"| Comment
 
|-
 
|-
! Set_MinIndividualChargedPIDFOM(<span style="color:#0000FF">double</span>)
+
! Set_MaxExtraGoodTracks(<span style="color:#0000FF">size_t</span>)
| COMBO:MININDIVIDUALCHARGEDPIDFOM || disabled || Minimum individual-charged-track PID confidence level. Combined cut preferred.  
+
| NA || disabled || Maximum # extra good charged particles. Good tracks are ones that survive the <span style="color:#0000FF">DChargedTrack</span> <span style="color:red">"PreSelect"</span> (or user custom) factory.  
 
|-
 
|-
! Set_MinCombinedChargedPIDFOM(<span style="color:#0000FF">double</span>)
+
! Set_NumPlusMinusRFBunches(<span style="color:#0000FF">size_t</span>)
| COMBO:MINCOMBINEDCHARGEDPIDFOM || disabled || Minimum combined PID confidence level for all charged tracks in the combo.
+
| NA || disabled || Number of photon-RF sideband peaks to include (in addition to the main peak).  
|-
+
! Set_MinIndividualTrackingFOM(<span style="color:#0000FF">double</span>)
+
| COMBO:MININDIVIDUALTRACKINGFOM || disabled || Minimum individual-track tracking confidence level. Combined cut preferred.
+
|-
+
! Set_MinCombinedTrackingFOM(<span style="color:#0000FF">double</span>)
+
| COMBO:MINCOMBINEDTRACKINGFOM || disabled || Minimum combined tracking confidence level for all charged tracks in the combo.
+
|-
+
! Set_MaxPhotonRFDeltaT(<span style="color:#0000FF">double</span>)
+
| COMBO:MAXPHOTONRFDELTAT || disabled || Maximum photon-RF time difference.  For selecting potential beam photon(s) during high-luminosity running.
+
|-
+
! Set_MinProtonMomentum(<span style="color:#0000FF">double</span>)
+
| COMBO:MINPROTONMOMENTUM || enabled, 0.3 GeV/c || Minimum momentum for a DChargedTrack without a "Proton" hypothesis (e.g. failed tracking: slow pion) to be tested as a proton during comboing (value from track reconstruction).
+
 
|}
 
|}
 
<br style="clear:both;"/>
 
<br style="clear:both;"/>
  
=== Example: b1pi ===
+
=== Custom Track / Shower Pre-selection ===
 +
* Users can place custom cuts to select a subset of the reconstructed <span style="color:#0000FF">DChargedTrack</span> and <span style="color:#0000FF">DNeutralShower</span> objects.
 +
** To do this, create factories in your plugin(s) that perform the desired cuts. 
 +
** Tracks and showers that survive these cuts should be copied and saved as data members of those factories. 
 +
** In addition, make sure to create a factory of the <span style="color:#0000FF">DNeutralParticle</span> objects corresponding to your <span style="color:#0000FF">DNeutralShower</span>'s (use the PreSelect <span style="color:#0000FF">DNeutralParticle</span> factory as an example).
 +
** Then, specify which factories you would like to use on the command line with <span style="color:red">"COMBO:TRACK_SELECT_TAG"</span> and <span style="color:red">"COMBO:SHOWER_SELECT_TAG"</span>. For example:
 +
 
 
<syntaxhighlight>
 
<syntaxhighlight>
// continuation of DReaction_factory::init()
+
  hd_root dana_rest.hddm -PPLUGINS=b1pi_hists -PCOMBO:TRACK_SELECT_TAG=MyTracks -PCOMBO:SHOWER_SELECT_TAG=MyShowers
/**************************************************** b1pi Control Variables ****************************************************/
+
</syntaxhighlight>
  
  // Type of kinematic fit to perform:
+
* To disable them entirely (and use all tracks and showers), do:
  locReaction->Set_KinFitType(d_P4AndVertexFit); //enum defined in DKinFitResults.h
+
  
  // Comboing cuts: used to cut out potential particle combinations that are "obviously" invalid
+
<syntaxhighlight>
    // e.g. contains garbage tracks, PIDs way off
+
   hd_root dana_rest.hddm -PPLUGINS=b1pi_hists -PCOMBO:TRACK_SELECT_TAG= -PCOMBO:SHOWER_SELECT_TAG=
   // These cut values are overriden if specified on the command line
+
  locReaction->Set_MinCombinedChargedPIDFOM(0.001);
+
  locReaction->Set_MinCombinedTrackingFOM(0.001);
+
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Adding DAnalysisActions to DReaction Example: b1pi ==
+
* Example: A pre-selection factory cutting on the <span style="color:#0000FF">DNeutralShower</span> energy (where <span style="color:red">"MyShowers"</span> is the factory tag):
* Details on DAnalysisAction objects can be found at: [[Analysis_Actions | Analysis Actions]]
+
 
+
 
<syntaxhighlight>
 
<syntaxhighlight>
// continuation of DReaction_factory::init()
+
jerror_t DNeutralShower_factory_MyShowers::init(void)
/**************************************************** b1pi Actions ****************************************************/
+
{
 +
  //Setting this flag makes it so that JANA does not delete the objects in _data.  This factory will manage this memory.
 +
    //This is because some/all of these pointers are just copied from earlier objects, and should not be deleted. 
 +
  SetFactoryFlag(NOT_OBJECT_OWNER);
  
   //Extremely Loose Mass Cuts
+
   return NOERROR;
  locReaction->Add_AnalysisAction(new DCutAction_MissingMass(locReaction, false, 0.1, 1.6, "Proton_Loose")); //false: measured data
+
}
   locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, Pi0, false, 0.0, 0.5, "Pi0_Loose")); //false: measured data
+
jerror_t DNeutralShower_factory_MyShowers::evnt(JEventLoop* locEventLoop, int locEventNumber)
  locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, omega, false, 0.2, 1.4, "omega_Loose")); //false: measured data
+
{
  locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, b1_1235_Plus, false, 0.6, 1.8, "b1(1235)+_Loose")); //false: measured data
+
   //Clear previous memory
   locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, Unknown, false, 1.0, 3.0, "X(2000)_Loose")); //false: measured data
+
    //IF YOUR FACTORY CREATES NEW OBJECTS: be sure to manually delete them since NOT_OBJECT_OWNER is set.  
 +
   _data.clear();
  
   //PID
+
   //Grab already pre-selected showers.
  locReaction->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction, false)); //false: measured data
+
   vector<const DNeutralShower*> locNeutralShowers;
   locReaction->Add_AnalysisAction(new DHistogramAction_PID(locReaction));
+
   locEventLoop->Get(locNeutralShowers, "PreSelect");
   locReaction->Add_AnalysisAction(new DCutAction_AllPIDFOM(locReaction, 0.01)); //1%
+
  locReaction->Add_AnalysisAction(new DHistogramAction_TruePID(locReaction, "PostPID"));
+
  
   //Initial Mass Distributions
+
   //Place further cuts
   locReaction->Add_AnalysisAction(new DHistogramAction_MissingMass(locReaction, false, 650, 0.3, 1.6, "PostPID")); //false: measured data
+
   for(size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i)
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, Pi0, false, 500, 0.0, 0.5, "Pi0_PostPID")); //false: measured data
+
   {
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, omega, false, 600, 0.2, 1.4, "omega_PostPID")); //false: measured data
+
    if(locNeutralShowers[loc_i]->dEnergy < 0.02) //e.g. 20 MeV
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, b1_1235_Plus, false, 600, 0.6, 1.8, "b1(1235)+_PostPID")); //false: measured data
+
      continue;
   locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, Unknown, false, 1000, 1.0, 3.0, "X(2000)_PostPID")); //false: measured data
+
    _data.push_back(const_cast<DNeutralShower*>(locNeutralShowers[loc_i])); //save a copy of the shower
 
+
   }
  //Kinematic Fit Results and Confidence Level Cut
+
   return NOERROR;
  locReaction->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction, 0.05)); //5% confidence level cut on pull histograms only
+
}
  locReaction->Add_AnalysisAction(new DCutAction_KinFitFOM(locReaction, 0.01)); //1%
+
</syntaxhighlight>
 
+
  //Constrained Mass Distributions
+
  locReaction->Add_AnalysisAction(new DHistogramAction_MissingMass(locReaction, false, 650, 0.3, 1.6, "PostKinFitConLev")); //false: measured data
+
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, Pi0, false, 500, 0.0, 0.5, "Pi0_PostKinFitConLev")); //false: measured data
+
 
+
  //omega cut
+
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, omega, false, 600, 0.2, 1.4, "omega_PostKinFitConLev_Measured")); //false: measured data
+
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, omega, true, 600, 0.2, 1.4, "omega_PostKinFitConLev_KinFit")); //true: kinfit data
+
  locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, omega, true, 0.6, 1.0, "omega_PostKinFit")); //true: kinfit data
+
 
+
   //b1(1235)+ cut
+
   locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, b1_1235_Plus, false, 600, 0.6, 1.8, "b1(1235)+_PostKinFitConLev_Measured")); //false: measured data
+
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, b1_1235_Plus, true, 600, 0.6, 1.8, "b1(1235)+_PostKinFitConLev_KinFit")); //true: kinfit data
+
  locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, b1_1235_Plus, true, 1.1, 1.5, "b1(1235)+_PostKinFit")); //true: kinfit data
+
 
+
  //Signal Mass Hist
+
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, Unknown, false, 1000, 1.0, 3.0, "X(2000)_PostKinFitConLev_Measured")); //false: measured data
+
  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, Unknown, true, 1000, 1.0, 3.0, "X(2000)_PostKinFitConLev_KinFit")); //true: kinfit data
+
 
+
  //Final Track Kinematics & PID Check
+
  locReaction->Add_AnalysisAction(new DHistogramAction_TrackVertexComparison(locReaction, "Final"));
+
  locReaction->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction, true, "Final")); //true: kinfit data
+
  locReaction->Add_AnalysisAction(new DHistogramAction_TruePID(locReaction, "Final"));
+
 
+
  _data.push_back(locReaction); //Register the DReaction
+
  
 +
* Tell JANA that your factory exists by setting it in your plugin's factory generator:
 +
<syntaxhighlight>
 +
jerror_t GenerateFactories(jana::JEventLoop *loop)
 +
{
 +
  loop->AddFactory(new DReaction_factory_b1pi_hists());
 +
  loop->AddFactory(new DNeutralShower_factory_MyShowers());
 
   return NOERROR;
 
   return NOERROR;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Latest revision as of 10:34, 17 March 2022

Summary

  • Note: The objects (not the factory) are located in: $HALLD_HOME/src/libraries/ANALYSIS/
    • the ReactionFilter factory is in $HALLD_HOME/src/plugins/Analysis/ReactionFilter.
  • DReactionStep: Contains the particle types for an interaction or decay step in a reaction.
    • The particle types are from the Particle_t enum defined in sim-recon/src/libraries/include/particleType.h
  • DReaction: Contains the DReactionStep objects for a reaction, along with (optional) analysis actions/instructions.
  • DReaction_factory: Users should create the DReaction objects they want to study in this factory, and place it in their plugin.
    • It is recommended that users create their class with a unique name and corresponding tag so that multiple analysis plugins can be run simultaneously.
  • The MakeReactionPlugin.pl perl script (it is installed to $PATH) can be used to create template code for a new plugin.

DReaction Notes

  • The user should create a DReaction object in their plugin for each analysis they want to perform (can analyze more than one at once). For example, by creating additional DReaction objects you can:
    • Analyze different reactions in the same plugin.
    • Treat different particles as missing in the same reaction (or have no particles missing).
    • Perform different kinematic fits to the same reaction (e.g. compare results from p4-only and vertex-p4 fits)
    • Perform different DAnalysisActions to compare the results from having different cuts.
  • IMPORTANT NOTE FOR DEVELOPERS: Grabbing the DReaction objects from JANA is tricky, because a user may have several factories per plugin, or may be running several plugins at once. See DParticleComboBlueprint_factory::evnt() for an example on how to correctly grab all DReaction objects from JANA.

DReactionStep Notes

  • The DReactionStep objects must be added to the DReaction in the correct order: the decay step for a particle must always be after its production step (it can be anywhere after it, but it must be after it).
    • However, you can study (for example) π0 decays without a π0 production step if you don't care how they're produced. E.g.:
//pi0 -> gamma, gamma
DReaction* locReaction = new DReaction("pi0"); //unique name
locReaction->Add_ReactionStep(new DReactionStep(Pi0, {Gamma, Gamma}));
  • To define one of the particles as missing, add it after the list of final state particles
locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiMinus}, Proton)); //proton is missing, pi+/- are detected
  • To analyze a channel inclusively (with no missing particles otherwise (the Unknown below)):
locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiMinus, Proton}, Unknown, true)); //proton/pi+/- are detected, nothing is missing (Unknown), inclusive (true)
  • IMPORTANT NOTE FOR ANALYZERS: Resonance PIDs (except for ω and φ) are not allowed anywhere in a DReactionStep. This is because you cannot identify on an event-by-event basis which particles decayed from a resonance and which did not. However, since they are extremely narrow, the ω and φ resonances are allowed.
  • IMPORTANT NOTE FOR ANALYZERS: The Unknown PID can be used as an initial particle (for when you don't want to worry about beam particle selection). If a kinematic fit with a P4 constraint is selected, then four-momentum will not be constrained but any mass constraints still will be (inclusive kinematic fit).
  • To disable a mass constraint from being applied during a kinematic fit, call the following on the DReactionStep where that particle is the initial particle:
locReactionStep->Set_KinFitConstrainInitMassFlag(false);

DReaction Control Variables

Kinematic Fit Type

  • Defined by the DKinFitType enum in sim-recon/src/libraries/Analysis/DReaction.h
    • Values: d_NoFit, d_P4Fit, d_VertexFit, d_SpacetimeFit, d_P4AndVertexFit, d_P4AndSpacetimeFit
    • P4 fits include mass constraints
    • The spacetime fits are currently unsupported.

TTree Output

  • If creating your own plugin, output the results from the analysis of a DReaction is disabled by default, and must be enabled for each desired DReaction. This enabling is in addition to actually writing out the TTree (see Standard TTree for details). To enable TTree output for a DReaction, call:
// string is file name (must end in \".root\"!!): doen't need to be unique, feel free to change
locReaction->Enable_TTreeOutput("tree_b1pi.root", false); //true/false: do/don't save unused hypotheses
  • Note that if you specify more than one DReaction to have the same file name, then they will both be saved in the same file.

Comboing Cuts

  • There are several different cuts the user can place to cut out potential particle combinations that are "obviously" invalid before they are created.
  • These are useful for reducing memory usage spikes and cpu-time, especially in events with many (10+) garbage tracks/showers (in some cases the # of DParticleCombos can exceed 20000)
  • Most of these cuts are disabled by default.
  • The values of these cuts are overridden if specified on the command line.
DReaction set/enable method Command-line parameter Default Comment
Set_MaxExtraGoodTracks(size_t) NA disabled Maximum # extra good charged particles. Good tracks are ones that survive the DChargedTrack "PreSelect" (or user custom) factory.
Set_NumPlusMinusRFBunches(size_t) NA disabled Number of photon-RF sideband peaks to include (in addition to the main peak).


Custom Track / Shower Pre-selection

  • Users can place custom cuts to select a subset of the reconstructed DChargedTrack and DNeutralShower objects.
    • To do this, create factories in your plugin(s) that perform the desired cuts.
    • Tracks and showers that survive these cuts should be copied and saved as data members of those factories.
    • In addition, make sure to create a factory of the DNeutralParticle objects corresponding to your DNeutralShower's (use the PreSelect DNeutralParticle factory as an example).
    • Then, specify which factories you would like to use on the command line with "COMBO:TRACK_SELECT_TAG" and "COMBO:SHOWER_SELECT_TAG". For example:
  hd_root dana_rest.hddm -PPLUGINS=b1pi_hists -PCOMBO:TRACK_SELECT_TAG=MyTracks -PCOMBO:SHOWER_SELECT_TAG=MyShowers
  • To disable them entirely (and use all tracks and showers), do:
  hd_root dana_rest.hddm -PPLUGINS=b1pi_hists -PCOMBO:TRACK_SELECT_TAG= -PCOMBO:SHOWER_SELECT_TAG=
  • Example: A pre-selection factory cutting on the DNeutralShower energy (where "MyShowers" is the factory tag):
jerror_t DNeutralShower_factory_MyShowers::init(void)
{
  //Setting this flag makes it so that JANA does not delete the objects in _data.  This factory will manage this memory. 
    //This is because some/all of these pointers are just copied from earlier objects, and should not be deleted.  
  SetFactoryFlag(NOT_OBJECT_OWNER);
 
  return NOERROR;
}
jerror_t DNeutralShower_factory_MyShowers::evnt(JEventLoop* locEventLoop, int locEventNumber)
{
  //Clear previous memory
    //IF YOUR FACTORY CREATES NEW OBJECTS: be sure to manually delete them since NOT_OBJECT_OWNER is set. 
  _data.clear();
 
  //Grab already pre-selected showers. 
  vector<const DNeutralShower*> locNeutralShowers;
  locEventLoop->Get(locNeutralShowers, "PreSelect");
 
  //Place further cuts
  for(size_t loc_i = 0; loc_i < locNeutralShowers.size(); ++loc_i)
  {
    if(locNeutralShowers[loc_i]->dEnergy < 0.02) //e.g. 20 MeV
      continue;
    _data.push_back(const_cast<DNeutralShower*>(locNeutralShowers[loc_i])); //save a copy of the shower
  }
  return NOERROR;
}
  • Tell JANA that your factory exists by setting it in your plugin's factory generator:
jerror_t GenerateFactories(jana::JEventLoop *loop)
{
  loop->AddFactory(new DReaction_factory_b1pi_hists());
  loop->AddFactory(new DNeutralShower_factory_MyShowers());
  return NOERROR;
}