Difference between revisions of "Analysis Actions"

From GlueXWiki
Jump to: navigation, search
(Setup and Execution)
(Details for writing DAnalysisActions)
 
(116 intermediate revisions by the same user not shown)
Line 8: Line 8:
 
** Many common actions have been pre-defined in DHistogramActions.* and DCutActions.*, located in sim-recon/src/libraries/ANALYSIS/
 
** Many common actions have been pre-defined in DHistogramActions.* and DCutActions.*, located in sim-recon/src/libraries/ANALYSIS/
 
** Additional, custom actions can be created in any plugin.
 
** Additional, custom actions can be created in any plugin.
 +
* The <span style="color:#0000FF">MakeAnalysisAction.pl</span> perl script (it is installed to $PATH) can be used to create template code for a new, custom action.
 +
** Run it with no arguments for instructions.
 +
* For details on how to perform an anti(opposite)-cut, and how to call an action from within another action, see the [[Analysis_FAQ Analysis FAQ]].
  
 
== Reaction-Independent Actions ==
 
== Reaction-Independent Actions ==
Line 17: Line 20:
 
** E.g.: Histogram the track multiplicity for events that satisfy a kinematic fit confidence level cut.   
 
** E.g.: Histogram the track multiplicity for events that satisfy a kinematic fit confidence level cut.   
  
=== Setup and Execution ===
+
=== Setup ===
 
* There are (or should be) three different constructors for reaction-independent objects:
 
* There are (or should be) three different constructors for reaction-independent objects:
** (<span style="color:#0000FF">const DReaction</span>* locReaction, <span style="color:#0000FF">string</span> locActionUniqueString = ""): Use this constructor if you want to add the action to a <span style="color:#0000FF">DReaction</span>.  
+
** (<span style="color:#0000FF">const DReaction</span>* <span style="color:#008000">locReaction</span>, <span style="color:#0000FF">string</span> <span style="color:#008000">locActionUniqueString</span> = ""): Use this constructor if you want to add the action to a <span style="color:#0000FF">DReaction</span>.
** (<span style="color:#0000FF">void</span>) and (<span style="color:#0000FF">string</span> locActionUniqueString): Use these constructors when executing completely independently of any <span style="color:#0000FF">DReaction</span>.  
+
*** '''WARNING:''' If you create two different objects of this type without unique action strings, such as one in each of two plugins and then run with both of those plugins simultaneously, you will double-count in any histograms and trees that are filled.  
 +
** (<span style="color:#0000FF">void</span>) and (<span style="color:#0000FF">string</span> <span style="color:#008000">locActionUniqueString</span>): Use these constructors when executing completely independently of any <span style="color:#0000FF">DReaction</span>.  
  
* The "locActionUniqueString" is used to distinguish the histograms between different instances of the same action.  
+
* The <span style="color:#008000">locActionUniqueString</span> is used to distinguish the histograms between different instances of the same action.  
 
** For example, you may wish to create two sets of <span style="color:#0000FF">DHistogramAction_DetectedParticleKinematics</span> histograms and have them filled under different scenarios.   
 
** For example, you may wish to create two sets of <span style="color:#0000FF">DHistogramAction_DetectedParticleKinematics</span> histograms and have them filled under different scenarios.   
** locActionUniqueString should only be left unspecified (== "") up to one time (per thread), and other instances should be assigned a unique, distinguishing string.   
+
** <span style="color:#008000">locActionUniqueString</span> should only be left unspecified (== "") up to one time (per thread), and other instances should be assigned a unique, distinguishing string.   
 +
 
 +
=== Execution ===
 +
 
 +
* When these actions are not added to a <span style="color:#0000FF">const DReaction</span>, you should call the Initialize() method before executing it.
 +
 
 +
* There are two function-call operators that you can call to execute the action: one with particle combos as input, one without.  If the action acts on particle combinations, you MUST use the operator with the combos as input.
 +
 
 +
* For the combo-independent function-call operator, the return-type is bool: this is the same bool as returned by the Perform_Action() function.  This allows access to the result from combo-independent cuts.  This is only true for combo-independent actions. 
 +
 
 +
* For the combo-dependent function-call operator, the return-type is void: the bools for each combo returned by the Perform_Action() function can be found in the input.
  
 
* Example:  
 
* Example:  
Line 33: Line 47:
 
   DHistogramAction_DetectedParticleKinematics dHist_DetectedParticleKinematics;
 
   DHistogramAction_DetectedParticleKinematics dHist_DetectedParticleKinematics;
 
   DHistogramAction_GenReconTrackComparison dHist_GenReconTrackComparison;
 
   DHistogramAction_GenReconTrackComparison dHist_GenReconTrackComparison;
 +
  DHistogramAction_NumReconstructedObjects dHist_NumReconstructedObjects;
 +
 +
  //Initialize the actions (e.g. in plugin processor brun() method):
 +
  dHist_TrackMultiplicity.Initialize(locEventLoop);
 +
  dHist_ThrownParticleKinematics.Initialize(locEventLoop);
 +
  dHist_DetectedParticleKinematics.Initialize(locEventLoop);
 +
  dHist_GenReconTrackComparison.Initialize(locEventLoop);
 +
  dHist_NumReconstructedObjects.Initialize(locEventLoop);
  
 
   //Execute the actions (e.g., in plugin processor evnt() method):
 
   //Execute the actions (e.g., in plugin processor evnt() method):
Line 40: Line 62:
 
   dHist_DetectedParticleKinematics(locEventLoop);
 
   dHist_DetectedParticleKinematics(locEventLoop);
 
   dHist_GenReconTrackComparison(locEventLoop);
 
   dHist_GenReconTrackComparison(locEventLoop);
 +
  dHist_NumReconstructedObjects(locEventLoop);
 
</syntaxhighlight>
 
</syntaxhighlight>
 
=== Pre-defined Actions ===
 
 
* Note: These can be found in sim-recon/src/libraries/ANALYSIS/DHistogramActions.*
 
* '''DHistogramAction_TrackMultiplicity''': Histogram how many protons, pions, kaons, neutrals, etc. are reconstructed in each event.
 
** Note: For particle ID, it uses the matching to the thrown tracks if available (from <span style="color:#0000FF">DMCThrownMatching</span>), and the PID FOM if not available.
 
** Note: You can histogram for different particle types by modifying the public <span style="color:#008000">dFinalStatePIDs</span> variable before calling the function-call operator.
 
* '''DHistogramAction_ThrownParticleKinematics''': Histogram the kinematics of the thrown particles, including momentum, &theta;, &phi;, vertex position, and vertex time.
 
** Note: You can histogram for different particle types by modifying the public <span style="color:#008000">dFinalStatePIDs</span> variable before calling the function-call operator.
 
* '''DHistogramAction_DetectedParticleKinematics''': Histogram the kinematics of the detected particles, including momentum, &theta;, &phi;, vertex position, vertex time, &beta;, &Delta;&beta;, and tracking FOM.
 
** Note: For particle ID, it uses the matching to the thrown tracks if available (from <span style="color:#0000FF">DMCThrownMatching</span>), and the PID FOM if not available.
 
** Note: You can histogram for different particle types by modifying the public <span style="color:#008000">dFinalStatePIDs</span> variable before calling the function-call operator.
 
* '''DHistogramAction_GenReconTrackComparison''': Histogram the difference between the reconstructed and thrown track kinematics, including momentum, &theta;, &phi;, vertex position, and vertex time.
 
** Note: You can histogram for different particle types by modifying the public <span style="color:#008000">dFinalStatePIDs</span> variable before calling the function-call operator.
 
* '''DHistogramAction_TOFHitStudy''': Histogram the difference between the reconstructed and thrown TOF point information, including hit position, energy, and time.
 
** Note: This action does not work on REST data, as the generated TOF hits are no longer available.
 
  
 
== Reaction-Dependent Actions ==
 
== Reaction-Dependent Actions ==
Line 64: Line 71:
 
* The actions are executed sequentially, in the order they are added to the <span style="color:#0000FF">DReaction</span>, by the <span style="color:#0000FF">DAnalysisResults_factory</span>'s.
 
* The actions are executed sequentially, in the order they are added to the <span style="color:#0000FF">DReaction</span>, by the <span style="color:#0000FF">DAnalysisResults_factory</span>'s.
 
** Actions will be executed on a given <span style="color:#0000FF">DParticleCombo</span> object until it fails a cut, after which the remaining actions won't be executed on that object.
 
** Actions will be executed on a given <span style="color:#0000FF">DParticleCombo</span> object until it fails a cut, after which the remaining actions won't be executed on that object.
 
+
* '''WARNING''': NEVER EVER create a reaction-dependent action object that is shared amongst multiple threads.  Create a unique object for each thread.  Objects that are created within factories (such as <span style="color:#0000FF">DReaction_factory</span>) are fine.  Objects that are members of your plugin's processor are not. This will cause race-condition issues between threads.
=== Pre-defined Histogram Actions ===
+
* Note: These can be found in sim-recon/src/libraries/ANALYSIS/DHistogramActions.*
+
* '''DHistogramAction_ParticleComboKinematics'''(<span style="color:#0000FF">const DReaction</span>* locReaction, <span style="color:#0000FF">bool</span> locUseKinFitResultsFlag, <span style="color:#0000FF">string</span> locActionUniqueString = ""): Histogram the kinematics of the detected particles, including momentum, &theta;, &phi;, vertex position, vertex time, &beta;, &Delta;&beta;, and tracking FOM.  
+
* '''DHistogramAction_PID''':
+
* '''DHistogramAction_TruePID''':
+
* '''DHistogramAction_TrackVertexComparison''':
+
* '''DHistogramAction_KinFitResults''':
+
* '''DHistogramAction_InvariantMass''':
+
* '''DHistogramAction_MissingMass''':
+
* '''DHistogramAction_MissingMassSquared''':
+
 
+
=== Pre-defined Cut Actions ===
+
* Note: These can be found in sim-recon/src/libraries/ANALYSIS/DCutActions.*
+

Latest revision as of 07:48, 3 November 2017

Summary

  • It is often desirable to place cuts and make histograms of the data in JANA prior to making a ROOT TTree.
    • For example: data monitoring, cuts to reduce the # of kinematic fits, cuts on the pid or kinematic fit confidence levels, comparison of mass distributions before/after the kinematic fit, skim cuts, etc.
  • DAnalysisAction objects enable users to easily integrate these tasks into an analysis: they encapsulate the setup and execution of a given action.
  • These actions can be executed directly, but if they are added to the DReaction they will be executed sequentially by the DAnalysisResults_factory.
    • Actions will be executed on a given DParticleCombo object until it fails a cut, after which the remaining actions won't be executed on that object.
  • All analysis action objects inherit from DAnalysisAction.
    • Many common actions have been pre-defined in DHistogramActions.* and DCutActions.*, located in sim-recon/src/libraries/ANALYSIS/
    • Additional, custom actions can be created in any plugin.
  • The MakeAnalysisAction.pl perl script (it is installed to $PATH) can be used to create template code for a new, custom action.
    • Run it with no arguments for instructions.
  • For details on how to perform an anti(opposite)-cut, and how to call an action from within another action, see the Analysis_FAQ Analysis FAQ.

Reaction-Independent Actions

  • Reaction-independent actions are actions that can be executed independently from the rest of the analysis framework. They do not depend on DReaction or DParticleCombo in any way.
    • These actions (should) have a default (void) constructor, distinguishing them from reaction-dependent actions (which do not).
  • However, they can be added to DReaction objects and executed in sequence with the other DAnalysisAction objects.
    • This can be used to histogram reaction-independent quantities for events that satisfy cuts on your DReaction.
    • E.g.: Histogram the track multiplicity for events that satisfy a kinematic fit confidence level cut.

Setup

  • There are (or should be) three different constructors for reaction-independent objects:
    • (const DReaction* locReaction, string locActionUniqueString = ""): Use this constructor if you want to add the action to a DReaction.
      • WARNING: If you create two different objects of this type without unique action strings, such as one in each of two plugins and then run with both of those plugins simultaneously, you will double-count in any histograms and trees that are filled.
    • (void) and (string locActionUniqueString): Use these constructors when executing completely independently of any DReaction.
  • The locActionUniqueString is used to distinguish the histograms between different instances of the same action.
    • For example, you may wish to create two sets of DHistogramAction_DetectedParticleKinematics histograms and have them filled under different scenarios.
    • locActionUniqueString should only be left unspecified (== "") up to one time (per thread), and other instances should be assigned a unique, distinguishing string.

Execution

  • When these actions are not added to a const DReaction, you should call the Initialize() method before executing it.
  • There are two function-call operators that you can call to execute the action: one with particle combos as input, one without. If the action acts on particle combinations, you MUST use the operator with the combos as input.
  • For the combo-independent function-call operator, the return-type is bool: this is the same bool as returned by the Perform_Action() function. This allows access to the result from combo-independent cuts. This is only true for combo-independent actions.
  • For the combo-dependent function-call operator, the return-type is void: the bools for each combo returned by the Perform_Action() function can be found in the input.
  • Example:
  //Define the actions (e.g., in plugin proccessor header file):
  DHistogramAction_TrackMultiplicity dHist_TrackMultiplicity;
  DHistogramAction_ThrownParticleKinematics dHist_ThrownParticleKinematics;
  DHistogramAction_DetectedParticleKinematics dHist_DetectedParticleKinematics;
  DHistogramAction_GenReconTrackComparison dHist_GenReconTrackComparison;
  DHistogramAction_NumReconstructedObjects dHist_NumReconstructedObjects;
 
  //Initialize the actions (e.g. in plugin processor brun() method):
  dHist_TrackMultiplicity.Initialize(locEventLoop);
  dHist_ThrownParticleKinematics.Initialize(locEventLoop);
  dHist_DetectedParticleKinematics.Initialize(locEventLoop);
  dHist_GenReconTrackComparison.Initialize(locEventLoop);
  dHist_NumReconstructedObjects.Initialize(locEventLoop);
 
  //Execute the actions (e.g., in plugin processor evnt() method):
    //The histograms are created upon first-execution
  dHist_TrackMultiplicity(locEventLoop);
  dHist_ThrownParticleKinematics(locEventLoop);
  dHist_DetectedParticleKinematics(locEventLoop);
  dHist_GenReconTrackComparison(locEventLoop);
  dHist_NumReconstructedObjects(locEventLoop);

Reaction-Dependent Actions

  • Reaction-dependent actions are actions that are designed to be executed on a given reaction's DParticleCombo objects.
    • They should be added to DReaction and executed by DAnalysisResults_factory's.
    • All of the constructors for these actions (should) require a DReaction* argument, distinguishing them from reaction-independent actions (which can have default constructors).
  • The actions are executed sequentially, in the order they are added to the DReaction, by the DAnalysisResults_factory's.
    • Actions will be executed on a given DParticleCombo object until it fails a cut, after which the remaining actions won't be executed on that object.
  • WARNING: NEVER EVER create a reaction-dependent action object that is shared amongst multiple threads. Create a unique object for each thread. Objects that are created within factories (such as DReaction_factory) are fine. Objects that are members of your plugin's processor are not. This will cause race-condition issues between threads.