Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReaction_factory_Thrown.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DReaction_factory_Thrown.cc
4 // Created: Tue Aug 9 14:29:24 EST 2011
5 // Creator: pmatt
6 //
7 
8 #ifdef VTRACE
9 #include "vt_user.h"
10 #endif
11 
13 
14 //------------------
15 // init
16 //------------------
18 {
20 
21  return NOERROR;
22 }
23 
24 //------------------
25 // brun
26 //------------------
27 jerror_t DReaction_factory_Thrown::brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
28 {
29  vector<const DAnalysisUtilities*> locAnalysisUtilitiesVector;
30  locEventLoop->Get(locAnalysisUtilitiesVector);
31  dAnalysisUtilities = locAnalysisUtilitiesVector[0];
32  return NOERROR;
33 }
34 
35 //------------------
36 // evnt
37 //------------------
38 jerror_t DReaction_factory_Thrown::evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
39 {
40  // delete pool sizes if too large, preventing memory-leakage-like behavor.
42  for(size_t loc_i = MAX_dReactionStepPoolSize; loc_i < dReactionStepPool_All.size(); ++loc_i)
43  delete dReactionStepPool_All[loc_i];
45  }
47 
48  deque<pair<const DMCThrown*, deque<const DMCThrown*> > > locThrownSteps;
49  dAnalysisUtilities->Get_ThrownParticleSteps(locEventLoop, locThrownSteps);
50 
51  DReaction* locReaction = Build_ThrownReaction(locEventLoop, locThrownSteps);
52  _data.push_back(locReaction);
53 
54  return NOERROR;
55 }
56 
57 DReaction* DReaction_factory_Thrown::Build_ThrownReaction(JEventLoop* locEventLoop, deque<pair<const DMCThrown*, deque<const DMCThrown*> > >& locThrownSteps)
58 {
59 #ifdef VTRACE
60  VT_TRACER("DReaction_factory_Thrown::Build_ThrownReaction()");
61 #endif
62 
63  vector<const DMCReaction*> locMCReactions;
64  locEventLoop->Get(locMCReactions);
65 
66  DReaction* locReaction = new DReaction("Thrown");
67  DReactionStep* locReactionStep = Get_ReactionStepResource();
68 
69  if(!locMCReactions.empty())
70  {
71  locReactionStep->Set_InitialParticleID(locMCReactions[0]->beam.PID());
72  locReactionStep->Set_TargetParticleID(locMCReactions[0]->target.PID());
73  }
74  else //guess
75  {
76  locReactionStep->Set_InitialParticleID(Gamma);
77  locReactionStep->Set_TargetParticleID(Proton);
78  }
79 
80  for(size_t loc_i = 0; loc_i < locThrownSteps.size(); ++loc_i)
81  {
82  if(loc_i != 0) //else beam & target already set
83  {
84  locReactionStep = Get_ReactionStepResource();
85  locReactionStep->Set_InitialParticleID(locThrownSteps[loc_i].first->PID());
86  locReactionStep->Set_TargetParticleID(Unknown); //default (disabled)
87  }
88  for(size_t loc_j = 0; loc_j < locThrownSteps[loc_i].second.size(); ++loc_j)
89  locReactionStep->Add_FinalParticleID(locThrownSteps[loc_i].second[loc_j]->PID());
90  locReaction->Add_ReactionStep(locReactionStep);
91  }
92 
93  return locReaction;
94 }
95 
97 {
98  DReactionStep* locReactionStep;
99  if(dReactionStepPool_Available.empty())
100  {
101  locReactionStep = new DReactionStep();
102  dReactionStepPool_All.push_back(locReactionStep);
103  }
104  else
105  {
106  locReactionStep = dReactionStepPool_Available.back();
107  locReactionStep->Reset();
108  dReactionStepPool_Available.pop_back();
109  }
110  return locReactionStep;
111 }
112 
114 {
115  //deletes reaction, but recycles steps
116  for(size_t loc_i = 0; loc_i < locReaction->Get_NumReactionSteps(); ++loc_i)
117  {
118  DReactionStep* locReactionStep = const_cast<DReactionStep*>(locReaction->Get_ReactionStep(loc_i));
119  dReactionStepPool_Available.push_back(locReactionStep);
120  }
121  delete locReaction;
122 }
123 
124 //------------------
125 // erun
126 //------------------
128 {
129  return NOERROR;
130 }
131 
132 //------------------
133 // fini
134 //------------------
136 {
137  for(size_t loc_i = 0; loc_i < dReactionStepPool_All.size(); ++loc_i)
138  delete dReactionStepPool_All[loc_i];
139  return NOERROR;
140 }
141 
142 
void Add_ReactionStep(const DReactionStep *locReactionStep)
Definition: DReaction.h:48
void Recycle_Reaction(DReaction *locReaction)
deque< DReactionStep * > dReactionStepPool_All
void Add_FinalParticleID(Particle_t locPID, bool locIsMissingFlag=false)
DReactionStep * Get_ReactionStepResource(void)
jerror_t fini(void)
Called after last event of last event source has been processed.
jerror_t init(void)
Called once at program start.
jerror_t brun(jana::JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
void Get_ThrownParticleSteps(JEventLoop *locEventLoop, deque< pair< const DMCThrown *, deque< const DMCThrown * > > > &locThrownSteps) const
const DAnalysisUtilities * dAnalysisUtilities
void Set_InitialParticleID(Particle_t locPID, bool locIsMissingFlag=false)
DReaction * Build_ThrownReaction(JEventLoop *locEventLoop, deque< pair< const DMCThrown *, deque< const DMCThrown * > > > &locThrownSteps)
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
const DReactionStep * Get_ReactionStep(size_t locStepIndex) const
Definition: DReaction.h:84
size_t Get_NumReactionSteps(void) const
Definition: DReaction.h:83
void Set_TargetParticleID(Particle_t locPID)
Definition: DReactionStep.h:76
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
deque< DReactionStep * > dReactionStepPool_Available