Mattione GlueX Analysis Factories
From GlueXWiki
Contents
Summary
- In his/her plugin, a user specifies the reactions he/she wants to study (DReaction objects), then just asks JANA for the results (DTrackCombo objects).
- Creates all possible track combinations for the desired reaction; user then cuts on the likelihood that those combinations represent the hypothesized reaction.
User Plugin DReaction Factory
- DReaction.h located in DANA libraries, DReaction_factory.h located in user plugin (along with a factory generator for it).
- Below shows how to set up DReaction for a Y(2175) analysis.
//------------------ // init //------------------ jerror_t DReaction_factory::init(void) { // Setting the PERSISTANT prevents JANA from deleting // the objects every event so we only create them once. SetFactoryFlag(PERSISTANT); DReaction* locReaction; DReactionStep* locReactionStep; // Make as many DReaction objects as desired locReaction = new DReaction(); locReaction->Set_ReactionName("Y2175"); //g, p -> phi(2175), (p) locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Gamma); locReactionStep->Set_TargetParticleID(Proton); locReactionStep->Add_FinalParticleID(Unknown); //phi(2175) locReactionStep->Add_FinalParticleID(Proton); locReactionStep->Set_MissingParticleIndex(1); //proton missing locReaction->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); //prevent memory leak //phi(2175) -> pi+, pi-, phi locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Unknown); //phi(2175) locReactionStep->Set_TargetParticleID(Unknown); //no target for this step locReactionStep->Add_FinalParticleID(PiPlus); locReactionStep->Add_FinalParticleID(PiMinus); locReactionStep->Add_FinalParticleID(phiMeson); locReactionStep->Set_MissingParticleIndex(-1); //none missing locReaction->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); //prevent memory leak //phi -> K+, K- locReactionStep = new DReactionStep(); locReactionStep->Set_InitialParticleID(Unknown); //phi(2175) locReactionStep->Set_TargetParticleID(Unknown); //no target for this step locReactionStep->Add_FinalParticleID(KPlus); locReactionStep->Add_FinalParticleID(KMinus); locReactionStep->Set_MissingParticleIndex(-1); //none missing locReaction->Add_ReactionStep(locReactionStep); dReactionStepPool.push_back(locReactionStep); //prevent memory leak _data.push_back(locReaction); return NOERROR; }
DTrackCombo
- Will be located in src/libraries/ANALYSIS
- DTrackCombo_factory: Generates a DTrackCombo object for each possible combination of detected tracks and DBeamPhotons (configurable time cut used to eliminate way-out-of-time photons).
- PID is NOT assumed, all possibilities are tested: For each q = +/-/0 particle in a given DReaction, all detected q = +/-/0 tracks are tested as to whether or not they are that particle.
- DKinFitResults_factory: Performs a single, full kinematic fit testing whether each DTrackCombo matches the DReaction: includes all mass, vertex, timing constraints.
- DTrackCombo_factory_KinFit: Create new DTrackCombo objects, using the kinematic fit track information and results.
class DTrackCombo : public JObject { private: const DReaction* dReaction; deque<const DTrackComboStep*> dTrackComboSteps; deque<const DChargedTrack*> dUnusedPositiveTracks; deque<const DChargedTrack*> dUnusedNegativeTracks; deque<const DNeutralShower*> dUnusedNeutralShowers; };
class DTrackComboStep { private: //PIDS: Particle_t dInitialParticleID; //e.g. lambda, phi, gamma Particle_t dTargetParticleID; //Unknown for no target deque<Particle_t> dFinalParticleIDs; //INITIAL PARTICLES: DKinematicData* dInitialParticle; //kinfit result, else measured DKinematicData* dInitialParticle_Measured; //e.g. DBeamPhoton DKinematicData* dTargetParticle; //NULL for no target //FINAL PARTICLES: deque<const DKinematicData*> dFinalParticles; //kinfit result, else measured //e.g. DChargedTrackHypothesis, DNeutralParticleHypothesis deque<const DKinematicData*> dFinalParticles_Measured; //e.g. DChargedTrackHypothesis, DNeutralParticleHypothesis deque<const JObject*> dFinalParticleSourceObjects; //original DChargedTrack or DNeutralShower objects //CONTROL VARIABLES: int dInitialParticleDecayFromStepIndex; //points to which DTrackComboStep represents the production of the initial particle (e.g. Lambda) deque<int> dDecayStepIndices; //let's you know whether a final state particle is decaying, missing, or detected. if decaying, points to which DTrackComboStep represents its decay };
User Plugin DEventProcessor
extern "C" { void InitPlugin(JApplication *app) { InitJANAPlugin(app); app->AddProcessor(new DEventProcessor_Y2175()); <span style="color:#0000FF">app->AddFactoryGenerator(new DFactoryGenerator_DReaction());</span> } } // "C" jerror_t DEventProcessor_Y2175::evnt(JEventLoop *locEventLoop, int eventnumber) { vector<const DKinFitTrackCombo*> locKinFitTrackCombos; locEventLoop->Get(locKinFitTrackCombos); //DO HISTS/CUTS/TUPLES HERE return NOERROR; }
Cutting/Histogramming
- Coming Soon...
//execute the contained action for each DTrackCombo of the given DReaction that has passed all previous cuts. class DAnalysisAction { public: //returns true/false if passes/fails cut/eval/etc, respectively virtual bool operator()(JEventLoop* locEventLoop, map<DTrackCombo*, bool>& locTrackComboCutStatus, deque<const JObject*>& locNewObjects) = 0; protected: DReaction* dReaction; //tells it to ignore DTrackCombo objects from other reactions };
Tupling
- Haven't gotten this far yet...