Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DEventProcessor_track_skimmer.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DEventProcessor_track_skimmer.cc
4 // Created: Tue Jan 13 11:08:16 EST 2015
5 // Creator: Paul (on Darwin Pauls-MacBook-Pro.local 14.0.0 i386)
6 //
7 
9 
10 // Routine used to create our DEventProcessor
11 
12 extern "C"
13 {
14  void InitPlugin(JApplication *locApplication)
15  {
16  InitJANAPlugin(locApplication);
17  locApplication->AddProcessor(new DEventProcessor_track_skimmer()); //register this plugin
18  locApplication->AddFactoryGenerator(new DFactoryGenerator_track_skimmer()); //register the factory generator
19  }
20 } // "C"
21 
22 //------------------
23 // init
24 //------------------
26 {
27  // This is called once at program startup. If you are creating
28  // and filling historgrams in this plugin, you should lock the
29  // ROOT mutex like this:
30  //
31  // japp->RootWriteLock();
32  // ... create historgrams or trees ...
33  // japp->RootUnLock();
34  //
35 
36  //CREATE STREAMS
37 
38  //# Tracks
39  dIDXAStreamMap["q+"] = new ofstream("q+.idxa");
40  dIDXAStreamMap["2q+"] = new ofstream("2q+.idxa");
41  dIDXAStreamMap["3q+"] = new ofstream("3q+.idxa");
42  dIDXAStreamMap["q-"] = new ofstream("q-.idxa");
43  dIDXAStreamMap["2q-"] = new ofstream("2q-.idxa");
44 
45  //# Showers
46  dIDXAStreamMap["q0"] = new ofstream("q0.idxa");
47  dIDXAStreamMap["2q0"] = new ofstream("2q0.idxa");
48  dIDXAStreamMap["3q0"] = new ofstream("3q0.idxa");
49  dIDXAStreamMap["4q0"] = new ofstream("4q0.idxa");
50  dIDXAStreamMap["5q0"] = new ofstream("5q0.idxa");
51  dIDXAStreamMap["6q0"] = new ofstream("6q0.idxa");
52 
53  //# pi0s
54  dIDXAStreamMap["pi0"] = new ofstream("pi0.idxa");
55  dIDXAStreamMap["2pi0"] = new ofstream("2pi0.idxa");
56  dIDXAStreamMap["3pi0"] = new ofstream("3pi0.idxa");
57 
58  //KShort
59  dIDXAStreamMap["ks_2piq"] = new ofstream("ks_2piq.idxa");
60  dIDXAStreamMap["ks_2pi0"] = new ofstream("ks_2pi0.idxa");
61 
62  //Eta
63  dIDXAStreamMap["eta_2g"] = new ofstream("eta_2g.idxa");
64  dIDXAStreamMap["eta_3pi0"] = new ofstream("eta_3pi0.idxa");
65  dIDXAStreamMap["eta_3piq"] = new ofstream("eta_3piq.idxa");
66 
67  //Omega
68  dIDXAStreamMap["omega_3piq"] = new ofstream("omega_3piq.idxa");
69  dIDXAStreamMap["omega_pi0g"] = new ofstream("omega_pi0g.idxa");
70 
71  //EtaPrime
72  dIDXAStreamMap["etaprm_2piqeta_2g"] = new ofstream("etaprm_2piqeta_2g.idxa");
73  dIDXAStreamMap["etaprm_2piqeta_3pi0"] = new ofstream("etaprm_2piqeta_3pi0.idxa");
74  dIDXAStreamMap["etaprm_2piqeta_3piq"] = new ofstream("etaprm_2piqeta_3piq.idxa");
75  dIDXAStreamMap["etaprm_2piqg"] = new ofstream("etaprm_2piqg.idxa");
76  dIDXAStreamMap["etaprm_2pi0eta_2g"] = new ofstream("etaprm_2pi0eta_2g.idxa");
77  dIDXAStreamMap["etaprm_2pi0eta_3pi0"] = new ofstream("etaprm_2pi0eta_3pi0.idxa");
78  dIDXAStreamMap["etaprm_2pi0eta_3piq"] = new ofstream("etaprm_2pi0eta_3piq.idxa");
79 
80  //Phi
81  dIDXAStreamMap["phi_2kq"] = new ofstream("phi_2kq.idxa");
82  dIDXAStreamMap["phi_3piq"] = new ofstream("phi_3piq.idxa");
83 
84  //Strange Baryons
85  dIDXAStreamMap["lambda"] = new ofstream("lambda.idxa");
86  dIDXAStreamMap["sigma0"] = new ofstream("sigma0.idxa");
87  dIDXAStreamMap["sigma+"] = new ofstream("sigma+.idxa");
88  dIDXAStreamMap["xi-"] = new ofstream("xi-.idxa");
89  dIDXAStreamMap["xi0"] = new ofstream("xi0.idxa");
90 
91  // e+e-
92  dIDXAStreamMap["ee"] = new ofstream("ee.idxa");
93  dIDXAStreamMap["jpsi_ee"] = new ofstream("jpsi_ee.idxa");
94 
95  //First line
96  map<string, ofstream*>::iterator locStreamIterator = dIDXAStreamMap.begin();
97  for(; locStreamIterator != dIDXAStreamMap.end(); ++locStreamIterator)
98  *(locStreamIterator->second) << "IDXA" << endl;
99 
100  return NOERROR;
101 }
102 
103 //------------------
104 // brun
105 //------------------
106 jerror_t DEventProcessor_track_skimmer::brun(jana::JEventLoop* locEventLoop, int locRunNumber)
107 {
108  // This is called whenever the run number changes
109 
110  return NOERROR;
111 }
112 
113 //------------------
114 // evnt
115 //------------------
116 jerror_t DEventProcessor_track_skimmer::evnt(jana::JEventLoop* locEventLoop, uint64_t locEventNumber)
117 {
118  //CHECK TRIGGER TYPE
119  const DTrigger* locTrigger = NULL;
120  locEventLoop->GetSingle(locTrigger);
121  if(!locTrigger->Get_IsPhysicsEvent())
122  return NOERROR;
123 
124  // See whether this is MC data or real data
125  vector<const DMCThrown*> locMCThrowns;
126  locEventLoop->Get(locMCThrowns);
127 
128  unsigned int locRunNumber = locEventLoop->GetJEvent().GetRunNumber();
129  unsigned int locUniqueID = locMCThrowns.empty() ? 1 : Get_FileNumber(locEventLoop);
130 
131  //Default Tag: No PreSelect!! // Definition of PreSelect may change, and these skims are intended to be universal
132  vector<const DChargedTrack*> locChargedTracks;
133  locEventLoop->Get(locChargedTracks);
134  size_t locNumQPlus = 0, locNumQMinus = 0;
135  for(size_t loc_i = 0; loc_i < locChargedTracks.size(); ++loc_i)
136  {
137  if(locChargedTracks[loc_i]->Contains_Charge(1))
138  ++locNumQPlus;
139  if(locChargedTracks[loc_i]->Contains_Charge(-1)) //intentionally NOT "else if"!!! //can have a track with both charges!
140  ++locNumQMinus;
141  }
142 
143  //Default Tag: No PreSelect!! // Definition of PreSelect may change, and these skims are intended to be universal
144  vector<const DNeutralShower*> locNeutralShowers;
145  locEventLoop->Get(locNeutralShowers);
146 
147  //Find which skims are satisfied by this event
148  set<ofstream*> locSaveSkimStreams;
149 
150  //# Tracks
151  if(locNumQPlus >= 1)
152  locSaveSkimStreams.insert(dIDXAStreamMap["q+"]);
153  if(locNumQPlus >= 2)
154  locSaveSkimStreams.insert(dIDXAStreamMap["2q+"]);
155  if(locNumQPlus >= 3)
156  locSaveSkimStreams.insert(dIDXAStreamMap["3q+"]);
157  if(locNumQMinus >= 1)
158  locSaveSkimStreams.insert(dIDXAStreamMap["q-"]);
159  if(locNumQMinus >= 2)
160  locSaveSkimStreams.insert(dIDXAStreamMap["2q-"]);
161 
162  //# Showers
163  if(locNeutralShowers.size() >= 1)
164  locSaveSkimStreams.insert(dIDXAStreamMap["q0"]);
165  if(locNeutralShowers.size() >= 2)
166  locSaveSkimStreams.insert(dIDXAStreamMap["2q0"]);
167  if(locNeutralShowers.size() >= 3)
168  locSaveSkimStreams.insert(dIDXAStreamMap["3q0"]);
169  if(locNeutralShowers.size() >= 4)
170  locSaveSkimStreams.insert(dIDXAStreamMap["4q0"]);
171  if(locNeutralShowers.size() >= 5)
172  locSaveSkimStreams.insert(dIDXAStreamMap["5q0"]);
173  if(locNeutralShowers.size() >= 6)
174  locSaveSkimStreams.insert(dIDXAStreamMap["6q0"]);
175 
176  //Get the analysis results for all DReactions.
177  //Getting these objects triggers the analysis, if it wasn't performed already.
178  //These objects contain the DParticleCombo objects that survived the DAnalysisAction cuts that were added to the DReactions
179  vector<const DAnalysisResults*> locAnalysisResultsVector;
180  locEventLoop->Get(locAnalysisResultsVector);
181 
182  //DECAYING PARTICLES
183  for(size_t loc_i = 0; loc_i < locAnalysisResultsVector.size(); ++loc_i)
184  {
185  const DAnalysisResults* locAnalysisResults = locAnalysisResultsVector[loc_i];
186  if(locAnalysisResults->Get_NumPassedParticleCombos() == 0)
187  continue; // no combos passed
188 
189  string locReactionName = locAnalysisResults->Get_Reaction()->Get_ReactionName();
190 
191  //# Pi0
192  if(locReactionName == "skim_pi0")
193  locSaveSkimStreams.insert(dIDXAStreamMap["pi0"]);
194  else if(locReactionName == "skim_2pi0")
195  locSaveSkimStreams.insert(dIDXAStreamMap["2pi0"]);
196  else if(locReactionName == "skim_3pi0")
197  locSaveSkimStreams.insert(dIDXAStreamMap["3pi0"]);
198 
199  //KShort
200  else if(locReactionName == "skim_ks_2piq")
201  locSaveSkimStreams.insert(dIDXAStreamMap["ks_2piq"]);
202  else if(locReactionName == "skim_ks_2pi0")
203  locSaveSkimStreams.insert(dIDXAStreamMap["ks_2pi0"]);
204 
205  //Eta
206  else if(locReactionName == "skim_eta_2g")
207  locSaveSkimStreams.insert(dIDXAStreamMap["eta_2g"]);
208  else if(locReactionName == "skim_eta_3pi0")
209  locSaveSkimStreams.insert(dIDXAStreamMap["eta_3pi0"]);
210  else if(locReactionName == "skim_eta_3piq")
211  locSaveSkimStreams.insert(dIDXAStreamMap["eta_3piq"]);
212 
213  //Omega
214  else if(locReactionName == "skim_omega_3piq")
215  locSaveSkimStreams.insert(dIDXAStreamMap["omega_3piq"]);
216  else if(locReactionName == "skim_omega_pi0g")
217  locSaveSkimStreams.insert(dIDXAStreamMap["omega_pi0g"]);
218 
219  //EtaPrime
220  else if(locReactionName == "skim_etaprm_2piqeta_2g")
221  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2piqeta_2g"]);
222  else if(locReactionName == "skim_etaprm_2piqeta_3pi0")
223  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2piqeta_3pi0"]);
224  else if(locReactionName == "skim_etaprm_2piqeta_3piq")
225  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2piqeta_3piq"]);
226  else if(locReactionName == "skim_etaprm_2piqg")
227  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2piqg"]);
228  else if(locReactionName == "skim_etaprm_2pi0eta_2g")
229  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2pi0eta_2g"]);
230  else if(locReactionName == "skim_etaprm_2pi0eta_3pi0")
231  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2pi0eta_3pi0"]);
232  else if(locReactionName == "skim_etaprm_2pi0eta_3piq")
233  locSaveSkimStreams.insert(dIDXAStreamMap["etaprm_2pi0eta_3piq"]);
234 
235  //Phi
236  else if(locReactionName == "skim_phi_2kq")
237  locSaveSkimStreams.insert(dIDXAStreamMap["phi_2kq"]);
238  else if(locReactionName == "skim_phi_3piq")
239  locSaveSkimStreams.insert(dIDXAStreamMap["phi_3piq"]);
240 
241  //Strange Baryons
242  else if(locReactionName == "skim_lambda")
243  locSaveSkimStreams.insert(dIDXAStreamMap["lambda"]);
244  else if(locReactionName == "skim_sigma0")
245  locSaveSkimStreams.insert(dIDXAStreamMap["sigma0"]);
246  else if(locReactionName == "skim_sigma+")
247  locSaveSkimStreams.insert(dIDXAStreamMap["sigma+"]);
248  else if(locReactionName == "skim_xi-")
249  locSaveSkimStreams.insert(dIDXAStreamMap["xi-"]);
250  else if(locReactionName == "skim_xi0")
251  locSaveSkimStreams.insert(dIDXAStreamMap["xi0"]);
252 
253  // e+e- reactions
254  else if(locReactionName == "skim_ee")
255  locSaveSkimStreams.insert(dIDXAStreamMap["ee"]);
256  else if(locReactionName == "skim_jpsi_ee")
257  locSaveSkimStreams.insert(dIDXAStreamMap["jpsi_ee"]);
258 
259  }
260 
261  //BUILD TO-PRINT STRING
262  ostringstream locToPrintStream;
263  locToPrintStream << locRunNumber << " " << locEventNumber << " " << locUniqueID;
264  string locToPrintString = locToPrintStream.str();
265 
266  //LOCK AND PRINT
267  set<ofstream*>::iterator locSetIterator = locSaveSkimStreams.begin();
268  LockState();
269  {
270  for(; locSetIterator != locSaveSkimStreams.end(); ++locSetIterator)
271  (**locSetIterator) << locToPrintString << endl;
272  }
273  UnlockState();
274 
275  return NOERROR;
276 }
277 
278 int DEventProcessor_track_skimmer::Get_FileNumber(JEventLoop* locEventLoop) const
279 {
280  //Assume that the file name is in the format: *_X.ext, where:
281  //X is the file number (a string of numbers of any length)
282  //ext is the file extension (probably .evio or .hddm)
283 
284  //get the event source
285  JEventSource* locEventSource = locEventLoop->GetJEvent().GetJEventSource();
286  if(locEventSource == NULL)
287  return -1;
288 
289  //get the source file name (strip the path)
290  string locSourceFileName = locEventSource->GetSourceName();
291 
292  //find the last "_" & "." indices
293  size_t locUnderscoreIndex = locSourceFileName.rfind("_");
294  size_t locDotIndex = locSourceFileName.rfind(".");
295  if((locUnderscoreIndex == string::npos) || (locDotIndex == string::npos))
296  return -1;
297 
298  size_t locNumberLength = locDotIndex - locUnderscoreIndex - 1;
299  string locFileNumberString = locSourceFileName.substr(locUnderscoreIndex + 1, locNumberLength);
300 
301  int locFileNumber = -1;
302  istringstream locFileNumberStream(locFileNumberString);
303  locFileNumberStream >> locFileNumber;
304 
305  return locFileNumber;
306 }
307 
308 //------------------
309 // erun
310 //------------------
312 {
313  // This is called whenever the run number changes, before it is
314  // changed to give you a chance to clean up before processing
315  // events from the next run number.
316  return NOERROR;
317 }
318 
319 //------------------
320 // fini
321 //------------------
323 {
324  // Called before program exit after event processing is finished.
325 
326  //Close streams
327  map<string, ofstream*>::iterator locStreamIterator = dIDXAStreamMap.begin();
328  for(; locStreamIterator != dIDXAStreamMap.end(); ++locStreamIterator)
329  locStreamIterator->second->close();
330 
331  return NOERROR;
332 }
333 
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t locEventNumber)
Called every event.
jerror_t erun(void)
Called every time run number changes, provided brun has been called.
bool Get_IsPhysicsEvent(void) const
jerror_t brun(jana::JEventLoop *locEventLoop, int locRunNumber)
Called every time a new run number is detected.
InitPlugin_t InitPlugin
jerror_t init(void)
Called once at program start.
string Get_ReactionName(void) const
Definition: DReaction.h:75
const DReaction * Get_Reaction(void) const
jerror_t fini(void)
Called after last event of last event source has been processed.
int Get_FileNumber(JEventLoop *locEventLoop) const
size_t Get_NumPassedParticleCombos(void) const