Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DEventSourceREST.cc
Go to the documentation of this file.
1 //
2 // Author: Richard Jones June 29, 2012
3 //
4 //
5 // DEventSourceREST methods
6 //
7 
8 #include <iostream>
9 #include <iomanip>
10 #include <fstream>
11 #include <climits>
12 
13 #include <JANA/JFactory_base.h>
14 #include <JANA/JEventLoop.h>
15 #include <JANA/JEvent.h>
16 #include <DANA/DStatusBits.h>
17 
18 #include <DVector2.h>
19 #include <DEventSourceREST.h>
20 
21 //----------------
22 // Constructor
23 //----------------
24 DEventSourceREST::DEventSourceREST(const char* source_name)
25  : JEventSource(source_name)
26 {
27  /// Constructor for DEventSourceREST object
28  ifs = new std::ifstream(source_name);
29  if (ifs && ifs->is_open()) {
30  // hddm_r::istream constructor can throw a std::runtime_error
31  // which is not being caught here -- policy question in JANA:
32  // who catches the exceptions, top-level user code or here?
33  fin = new hddm_r::istream(*ifs);
34  }
35  else {
36  // One might want to throw an exception or report an error here.
37  fin = NULL;
38  }
39 
41  gPARMS->SetDefaultParameter("REST:PRUNE_DUPLICATE_TRACKS", PRUNE_DUPLICATE_TRACKS,
42  "Turn on/off cleaning up multiple tracks with the same hypothesis from the same candidate. Set to \"0\" to turn off (it's on by default)");
43 
44  RECO_DIRC_CALC_LUT = false;
45  gPARMS->SetDefaultParameter("REST:DIRC_CALC_LUT", RECO_DIRC_CALC_LUT, "Turn on/off DIRC LUT reconstruction (it's off by default)");
46 
47  dDIRCMaxChannels = 108*64;
48 }
49 
50 //----------------
51 // Destructor
52 //----------------
54 {
55  if (fin) {
56  delete fin;
57  }
58  if (ifs) {
59  delete ifs;
60  }
61 }
62 
63 //----------------
64 // GetEvent
65 //----------------
66 jerror_t DEventSourceREST::GetEvent(JEvent &event)
67 {
68  /// Implementation of JEventSource virtual function
69 
70  if (!fin) {
71  return EVENT_SOURCE_NOT_OPEN;
72  }
73 
74  // Each open hddm file takes up about 1M of memory so it's
75  // worthwhile to close it as soon as we can.
76  if (ifs->eof()) {
77  delete fin;
78  fin = NULL;
79  delete ifs;
80  ifs = NULL;
81 
82  return NO_MORE_EVENTS_IN_SOURCE;
83  }
84 
85 #if HDDM_SETPOSITION_EXAMPLE
86  static std::ifstream fevlist("events.list");
87  static int events_to_go = 0;
88  if (events_to_go-- == 0 && fevlist.good()) {
89  uint64_t start;
90  uint32_t offset, status;
91  fevlist >> start >> offset >> status >> events_to_go;
92  if (fevlist.good())
93  fin->setPosition(hddm_r::streamposition(start, offset, status));
94  }
95 #endif
96 
97 #if HDDM_GETPOSITION_EXAMPLE
98  hddm_r::streamposition pos(fin->getPosition());
99  // Later on below, if this event passes all of your selection cuts
100  // then you might want to write the event position to output, as in
101  // std::cout << "interesting event found at "
102  // << pos.start << "," << pos.offset << "," << pos.status
103  // << std::endl;
104 #endif
105 
106  hddm_r::HDDM *record = new hddm_r::HDDM();
107  try{
108  if (! (*fin >> *record)) {
109  delete fin;
110  fin = NULL;
111  delete ifs;
112  ifs = NULL;
113  return NO_MORE_EVENTS_IN_SOURCE;
114  }
115  }catch(std::runtime_error &e){
116  cerr << "Exception caught while trying to read REST file!" << endl;
117  cerr << e.what() << endl;
118  _DBG__;
119  return NO_MORE_EVENTS_IN_SOURCE;
120  }
121 
122  // Copy the reference info into the JEvent object
123  while (true) {
124  hddm_r::ReconstructedPhysicsEvent &re
125  = record->getReconstructedPhysicsEvent();
126  int runno = re.getRunNo();
127  int eventno = re.getEventNo();
128  if (runno == 0 && eventno == 0) {
129  // found a comment record, print comment strings and continue
130  const hddm_r::CommentList &comments = re.getComments();
131  hddm_r::CommentList::iterator iter;
132  for (iter = comments.begin(); iter != comments.end(); ++iter) {
133  std::cout << " | " << iter->getText() << std::endl;
134  }
135 
136  //set version string
137  const hddm_r::DataVersionStringList& locVersionStrings = re.getDataVersionStrings();
138  hddm_r::DataVersionStringList::iterator Versioniter;
139  for (Versioniter = locVersionStrings.begin(); Versioniter != locVersionStrings.end(); ++Versioniter) {
140  string HDDM_DATA_VERSION_STRING = Versioniter->getText();
141  if(gPARMS->Exists("REST:DATAVERSIONSTRING"))
142  gPARMS->SetParameter("REST:DATAVERSIONSTRING", HDDM_DATA_VERSION_STRING);
143  else
144  gPARMS->SetDefaultParameter("REST:DATAVERSIONSTRING", HDDM_DATA_VERSION_STRING);
145  break;
146  }
147 
148  //set REST calib context
149  const hddm_r::CcdbContextList& locContextStrings = re.getCcdbContexts();
150  hddm_r::CcdbContextList::iterator Contextiter;
151  for (Contextiter = locContextStrings.begin(); Contextiter != locContextStrings.end(); ++Contextiter) {
152  string REST_JANA_CALIB_CONTEXT = Contextiter->getText();
153  gPARMS->SetDefaultParameter("REST:JANACALIBCONTEXT", REST_JANA_CALIB_CONTEXT);
154  }
155 
156  if (! (*fin >> *record)) {
157  delete fin;
158  fin = NULL;
159  delete ifs;
160  ifs = NULL;
161  return NO_MORE_EVENTS_IN_SOURCE;
162  }
163 
164  continue;
165  }
166  event.SetEventNumber(re.getEventNo());
167  event.SetRunNumber(re.getRunNo());
168  event.SetJEventSource(this);
169  event.SetRef(record);
170  event.SetStatusBit(kSTATUS_REST);
171  event.SetStatusBit(kSTATUS_FROM_FILE);
172  event.SetStatusBit(kSTATUS_PHYSICS_EVENT);
173 
174  ++Nevents_read;
175  break;
176  }
177 
178  return NOERROR;
179 }
180 
181 //----------------
182 // FreeEvent
183 //----------------
184 void DEventSourceREST::FreeEvent(JEvent &event)
185 {
186  hddm_r::HDDM *record = (hddm_r::HDDM*)event.GetRef();
187  delete record;
188 }
189 
190 //----------------
191 // GetObjects
192 //----------------
193 jerror_t DEventSourceREST::GetObjects(JEvent &event, JFactory_base *factory)
194 {
195  /// This gets called through the virtual method of the
196  /// JEventSource base class. It creates the objects of the type
197  /// on which factory is based. It uses the HDDM_Element object
198  /// kept in the ref field of the JEvent object passed.
199 
200  // We must have a factory to hold the data
201  if (!factory) {
202  throw RESOURCE_UNAVAILABLE;
203  }
204 
205  // The ref field of the JEvent is just the HDDM record pointer.
206  hddm_r::HDDM *record = (hddm_r::HDDM*)event.GetRef();
207  if (!record) {
208  throw RESOURCE_UNAVAILABLE;
209  }
210 
211  JEventLoop* locEventLoop = event.GetJEventLoop();
212  string dataClassName = factory->GetDataClassName();
213 
214  //Get target center
215  //multiple reader threads can access this object: need lock
216  bool locNewRunNumber = false;
217  unsigned int locRunNumber = event.GetRunNumber();
218  LockRead();
219  {
220  locNewRunNumber = (dTargetCenterZMap.find(locRunNumber) == dTargetCenterZMap.end());
221  }
222  UnlockRead();
223  if(locNewRunNumber)
224  {
225  DApplication* dapp = dynamic_cast<DApplication*>(locEventLoop->GetJApplication());
226  DGeometry* locGeometry = dapp->GetDGeometry(locEventLoop->GetJEvent().GetRunNumber());
227  double locTargetCenterZ = 0.0;
228  locGeometry->GetTargetZ(locTargetCenterZ);
229 
230  vector<double> locBeamPeriodVector;
231  if(locEventLoop->GetCalib("PHOTON_BEAM/RF/beam_period", locBeamPeriodVector))
232  throw JException("Could not load CCDB table: PHOTON_BEAM/RF/beam_period");
233  double locBeamBunchPeriod = locBeamPeriodVector[0];
234 
235  vector< vector <int> > locDIRCChannelStatus;
236  vector<int> new_dirc_status(dDIRCMaxChannels);
237  locDIRCChannelStatus.push_back(new_dirc_status);
238  locDIRCChannelStatus.push_back(new_dirc_status);
239  if(RECO_DIRC_CALC_LUT) { // get DIRC channel status from DB
240  if (locEventLoop->GetCalib("/DIRC/North/channel_status", locDIRCChannelStatus[0]))
241  jout << "Error loading /DIRC/North/channel_status !" << endl;
242  if (locEventLoop->GetCalib("/DIRC/South/channel_status", locDIRCChannelStatus[1]))
243  jout << "Error loading /DIRC/South/channel_status !" << endl;
244  }
245 
246  LockRead();
247  {
248  dTargetCenterZMap[locRunNumber] = locTargetCenterZ;
249  dBeamBunchPeriodMap[locRunNumber] = locBeamBunchPeriod;
250  dDIRCChannelStatusMap[locRunNumber] = locDIRCChannelStatus;
251  }
252  UnlockRead();
253  }
254 
255  if (dataClassName =="DMCReaction") {
256  return Extract_DMCReaction(record,
257  dynamic_cast<JFactory<DMCReaction>*>(factory), locEventLoop);
258  }
259  if (dataClassName =="DRFTime") {
260  return Extract_DRFTime(record,
261  dynamic_cast<JFactory<DRFTime>*>(factory), locEventLoop);
262  }
263  if (dataClassName =="DBeamPhoton") {
264  return Extract_DBeamPhoton(record,
265  dynamic_cast<JFactory<DBeamPhoton>*>(factory),
266  locEventLoop);
267  }
268  if (dataClassName =="DMCThrown") {
269  return Extract_DMCThrown(record,
270  dynamic_cast<JFactory<DMCThrown>*>(factory));
271  }
272  if (dataClassName =="DTOFPoint") {
273  return Extract_DTOFPoint(record,
274  dynamic_cast<JFactory<DTOFPoint>*>(factory));
275  }
276  if (dataClassName =="DSCHit") {
277  return Extract_DSCHit(record,
278  dynamic_cast<JFactory<DSCHit>*>(factory));
279  }
280  if (dataClassName =="DFCALShower") {
281  return Extract_DFCALShower(record,
282  dynamic_cast<JFactory<DFCALShower>*>(factory));
283  }
284  if (dataClassName =="DBCALShower") {
285  return Extract_DBCALShower(record,
286  dynamic_cast<JFactory<DBCALShower>*>(factory));
287  }
288  if (dataClassName =="DTrackTimeBased") {
289  return Extract_DTrackTimeBased(record,
290  dynamic_cast<JFactory<DTrackTimeBased>*>(factory), locEventLoop);
291  }
292  if (dataClassName =="DTrigger") {
293  return Extract_DTrigger(record,
294  dynamic_cast<JFactory<DTrigger>*>(factory));
295  }
296  if (dataClassName =="DDIRCPmtHit") {
297  return Extract_DDIRCPmtHit(record,
298  dynamic_cast<JFactory<DDIRCPmtHit>*>(factory), locEventLoop);
299  }
300  if (dataClassName =="DDetectorMatches") {
301  return Extract_DDetectorMatches(locEventLoop, record,
302  dynamic_cast<JFactory<DDetectorMatches>*>(factory));
303  }
304 
305 
306  return OBJECT_NOT_AVAILABLE;
307 }
308 
309 //------------------
310 // Extract_DMCReaction
311 //------------------
312 jerror_t DEventSourceREST::Extract_DMCReaction(hddm_r::HDDM *record,
313  JFactory<DMCReaction> *factory, JEventLoop* locEventLoop)
314 {
315  /// Copies the data from the Reaction hddm class. This is called
316  /// from JEventSourceREST::GetObjects. If factory is NULL, this
317  /// returns OBJECT_NOT_AVAILABLE immediately.
318 
319  if (factory==NULL) {
320  return OBJECT_NOT_AVAILABLE;
321  }
322  std::string tag = (factory->Tag())? factory->Tag() : "";
323 
324  double locTargetCenterZ = 0.0;
325  int locRunNumber = locEventLoop->GetJEvent().GetRunNumber();
326  LockRead();
327  {
328  locTargetCenterZ = dTargetCenterZMap[locRunNumber];
329  }
330  UnlockRead();
331  DVector3 locPosition(0.0, 0.0, locTargetCenterZ);
332 
333  vector<DMCReaction*> dmcreactions;
334 
335  // loop over reaction records
336  const hddm_r::ReactionList &reactions = record->getReactions();
337  hddm_r::ReactionList::iterator iter;
338  for (iter = reactions.begin(); iter != reactions.end(); ++iter) {
339  if (iter->getJtag() != tag) {
340  continue;
341  }
342  DMCReaction *mcreaction = new DMCReaction;
343  dmcreactions.push_back(mcreaction);
344  mcreaction->type = iter->getType();
345  mcreaction->weight = iter->getWeight();
346  double Ebeam = iter->getEbeam();
347 
348  hddm_r::Origin &origin = iter->getVertex().getOrigin();
349  double torig = origin.getT();
350  double zorig = origin.getVz();
351 
352  mcreaction->beam.setPosition(locPosition);
353  mcreaction->beam.setMomentum(DVector3(0.0, 0.0, Ebeam));
354  mcreaction->beam.setTime(torig - (zorig - locTargetCenterZ)/29.9792458);
355  mcreaction->beam.setPID(Gamma);
356 
357  mcreaction->target.setPosition(locPosition);
358  Particle_t ttype = iter->getTargetType();
359  mcreaction->target.setPID((Particle_t)ttype);
360  mcreaction->target.setTime(torig - (zorig - locTargetCenterZ)/29.9792458);
361  }
362 
363  // Copy into factories
364  factory->CopyTo(dmcreactions);
365 
366  return NOERROR;
367 }
368 
369 //------------------
370 // Extract_DRFTime
371 //------------------
372 jerror_t DEventSourceREST::Extract_DRFTime(hddm_r::HDDM *record,
373  JFactory<DRFTime> *factory, JEventLoop* locEventLoop)
374 {
375  if (factory==NULL)
376  return OBJECT_NOT_AVAILABLE;
377  string tag = (factory->Tag())? factory->Tag() : "";
378 
379  vector<DRFTime*> locRFTimes;
380 
381  // loop over RF-time records
382  const hddm_r::RFtimeList &rftimes = record->getRFtimes();
383  hddm_r::RFtimeList::iterator iter;
384  for (iter = rftimes.begin(); iter != rftimes.end(); ++iter)
385  {
386  if (iter->getJtag() != tag)
387  continue;
388  DRFTime *locRFTime = new DRFTime;
389  locRFTime->dTime = iter->getTsync();
390  locRFTime->dTimeVariance = 0.0; //SET ME!!
391  locRFTimes.push_back(locRFTime);
392  }
393 
394  if(!locRFTimes.empty())
395  {
396  //found in the file, copy into factory and return
397  factory->CopyTo(locRFTimes);
398  return NOERROR;
399  }
400 
401  //Not found in the file, so either:
402  //Experimental data & it's missing: bail
403  //MC data: generate it
404 
405  vector<const DBeamPhoton*> locMCGENPhotons;
406  locEventLoop->Get(locMCGENPhotons, "MCGEN");
407  if(locMCGENPhotons.empty())
408  return OBJECT_NOT_AVAILABLE; //Experimental data & it's missing: bail
409 
410  //Is MC data. Either:
411  //No tag: return photon_time propagated by +/- n*locBeamBunchPeriod to get close to 0.0
412  //TRUTH tag: get exact t from DBeamPhoton tag MCGEN
413 
414  if(tag == "TRUTH")
415  {
416  DRFTime *locRFTime = new DRFTime;
417  locRFTime->dTime = locMCGENPhotons[0]->time();
418  locRFTime->dTimeVariance = 0.0;
419  locRFTimes.push_back(locRFTime);
420  }
421  else
422  {
423  double locBeamBunchPeriod = 0.0;
424  int locRunNumber = locEventLoop->GetJEvent().GetRunNumber();
425  LockRead();
426  {
427  locBeamBunchPeriod = dBeamBunchPeriodMap[locRunNumber];
428  }
429  UnlockRead();
430 
431  //start with true RF time, increment/decrement by multiples of locBeamBunchPeriod ns until closest to 0
432  double locTime = locMCGENPhotons[0]->time();
433  int locNumRFBuckets = int(locTime/locBeamBunchPeriod);
434  locTime -= double(locNumRFBuckets)*locBeamBunchPeriod;
435  while(locTime > 0.5*locBeamBunchPeriod)
436  locTime -= locBeamBunchPeriod;
437  while(locTime < -0.5*locBeamBunchPeriod)
438  locTime += locBeamBunchPeriod;
439  DRFTime *locRFTime = new DRFTime;
440  locRFTime->dTime = locTime;
441  locRFTime->dTimeVariance = 0.0;
442  locRFTimes.push_back(locRFTime);
443  }
444 
445  // Copy into factories
446  factory->CopyTo(locRFTimes);
447 
448  return NOERROR;
449 }
450 
451 //------------------
452 // Extract_DBeamPhoton
453 //------------------
454 jerror_t DEventSourceREST::Extract_DBeamPhoton(hddm_r::HDDM *record,
455  JFactory<DBeamPhoton> *factory,
456  JEventLoop *eventLoop)
457 {
458  /// This is called from JEventSourceREST::GetObjects. If factory is NULL,
459  /// return OBJECT_NOT_AVAILABLE immediately. If factory tag="MCGEN" then
460  /// copy the beam photon data from the Reaction hddm class.
461 
462  if (factory==NULL)
463  return OBJECT_NOT_AVAILABLE;
464  string tag = (factory->Tag())? factory->Tag() : "";
465 
466  vector<DBeamPhoton*> dbeam_photons;
467 
468  // extract the TAGH geometry
469  vector<const DTAGHGeometry*> taghGeomVect;
470  eventLoop->Get(taghGeomVect);
471  if (taghGeomVect.empty())
472  return OBJECT_NOT_AVAILABLE;
473  const DTAGHGeometry* taghGeom = taghGeomVect[0];
474 
475  // extract the TAGM geometry
476  vector<const DTAGMGeometry*> tagmGeomVect;
477  eventLoop->Get(tagmGeomVect);
478  if (tagmGeomVect.empty())
479  return OBJECT_NOT_AVAILABLE;
480  const DTAGMGeometry* tagmGeom = tagmGeomVect[0];
481 
482  if(tag == "MCGEN")
483  {
484  vector<const DMCReaction*> dmcreactions;
485  eventLoop->Get(dmcreactions);
486 
487  for(size_t loc_i = 0; loc_i < dmcreactions.size(); ++loc_i)
488  {
489  DBeamPhoton *beamphoton = new DBeamPhoton;
490  *(DKinematicData*)beamphoton = dmcreactions[loc_i]->beam;
491  if(tagmGeom->E_to_column(beamphoton->energy(), beamphoton->dCounter))
492  beamphoton->dSystem = SYS_TAGM;
493  else if(taghGeom->E_to_counter(beamphoton->energy(), beamphoton->dCounter))
494  beamphoton->dSystem = SYS_TAGH;
495  else
496  beamphoton->dSystem = SYS_NULL;
497  dbeam_photons.push_back(beamphoton);
498  }
499 
500  // Copy into factories
501  factory->CopyTo(dbeam_photons);
502 
503  return NOERROR;
504  }
505 
506  double locTargetCenterZ = 0.0;
507  int locRunNumber = eventLoop->GetJEvent().GetRunNumber();
508  LockRead();
509  {
510  locTargetCenterZ = dTargetCenterZMap[locRunNumber];
511  }
512  UnlockRead();
513 
514  DVector3 pos(0.0, 0.0, locTargetCenterZ);
515 
516  //now get the objects
517  const hddm_r::TagmBeamPhotonList &locTagmBeamPhotonList = record->getTagmBeamPhotons();
518  hddm_r::TagmBeamPhotonList::iterator locTAGMiter;
519  for(locTAGMiter = locTagmBeamPhotonList.begin(); locTAGMiter != locTagmBeamPhotonList.end(); ++locTAGMiter)
520  {
521  if (locTAGMiter->getJtag() != tag)
522  continue;
523 
524  DBeamPhoton* gamma = new DBeamPhoton();
525 
526  DVector3 mom(0.0, 0.0, locTAGMiter->getE());
527  gamma->setPID(Gamma);
528  gamma->setMomentum(mom);
529  gamma->setPosition(pos);
530  gamma->setTime(locTAGMiter->getT());
531  gamma->dSystem = SYS_TAGM;
532 
533  auto locCovarianceMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
534  locCovarianceMatrix->ResizeTo(7, 7);
535  locCovarianceMatrix->Zero();
536  gamma->setErrorMatrix(locCovarianceMatrix);
537 
538  tagmGeom->E_to_column(locTAGMiter->getE(), gamma->dCounter);
539  dbeam_photons.push_back(gamma);
540  }
541 
542  const hddm_r::TaghBeamPhotonList &locTaghBeamPhotonList = record->getTaghBeamPhotons();
543  hddm_r::TaghBeamPhotonList::iterator locTAGHiter;
544  for(locTAGHiter = locTaghBeamPhotonList.begin(); locTAGHiter != locTaghBeamPhotonList.end(); ++locTAGHiter)
545  {
546  if (locTAGHiter->getJtag() != tag)
547  continue;
548 
549  DBeamPhoton* gamma = new DBeamPhoton();
550 
551  DVector3 mom(0.0, 0.0, locTAGHiter->getE());
552  gamma->setPID(Gamma);
553  gamma->setMomentum(mom);
554  gamma->setPosition(pos);
555  gamma->setTime(locTAGHiter->getT());
556  gamma->dSystem = SYS_TAGH;
557 
558  auto locCovarianceMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
559  locCovarianceMatrix->ResizeTo(7, 7);
560  locCovarianceMatrix->Zero();
561  gamma->setErrorMatrix(locCovarianceMatrix);
562 
563  taghGeom->E_to_counter(locTAGHiter->getE(), gamma->dCounter);
564  dbeam_photons.push_back(gamma);
565  }
566 
567  if((tag == "TAGGEDMCGEN") && dbeam_photons.empty())
568  return OBJECT_NOT_AVAILABLE; //EITHER: didn't hit a tagger counter //OR: old MC data (pre-saving TAGGEDMCGEN): try using TAGGEDMCGEN factory
569 
570  // Copy into factories
571  factory->CopyTo(dbeam_photons);
572 
573  return NOERROR;
574 }
575 
576 //------------------
577 // Extract_DMCThrown
578 //------------------
579 jerror_t DEventSourceREST::Extract_DMCThrown(hddm_r::HDDM *record,
580  JFactory<DMCThrown> *factory)
581 {
582  /// Copies the data from the hddm vertex records. This is called
583  /// from JEventSourceREST::GetObjects. If factory is NULL, this
584  /// returns OBJECT_NOT_AVAILABLE immediately.
585 
586  if (factory==NULL) {
587  return OBJECT_NOT_AVAILABLE;
588  }
589  string tag = (factory->Tag())? factory->Tag() : "";
590 
591  vector<DMCThrown*> data;
592 
593  // loop over vertex records
594  hddm_r::VertexList vertices = record->getVertices();
595  hddm_r::VertexList::iterator iter;
596  for (iter = vertices.begin(); iter != vertices.end(); ++iter) {
597  if (iter->getJtag() != tag) {
598  continue;
599  }
600  const hddm_r::Origin &orig = iter->getOrigin();
601  double vx = orig.getVx();
602  double vy = orig.getVy();
603  double vz = orig.getVz();
604  double vt = orig.getT();
605  const hddm_r::ProductList &products = iter->getProducts();
606  hddm_r::ProductList::iterator piter;
607  for (piter = products.begin(); piter != products.end(); ++piter) {
608  double E = piter->getMomentum().getE();
609  double px = piter->getMomentum().getPx();
610  double py = piter->getMomentum().getPy();
611  double pz = piter->getMomentum().getPz();
612  double mass = sqrt(E*E - (px*px + py*py + pz*pz));
613  if (!isfinite(mass)) {
614  mass = 0.0;
615  }
616  DMCThrown *mcthrown = new DMCThrown;
617  int pdgtype = piter->getPdgtype();
618  Particle_t ptype = PDGtoPType(pdgtype);
619  mcthrown->type = ptype;
620  mcthrown->pdgtype = pdgtype;
621  mcthrown->myid = piter->getId();
622  mcthrown->parentid = piter->getParentId();
623  mcthrown->mech = 0;
624  mcthrown->setPID(ptype);
625  mcthrown->setMomentum(DVector3(px, py, pz));
626  mcthrown->setPosition(DVector3(vx, vy, vz));
627  mcthrown->setTime(vt);
628  data.push_back(mcthrown);
629  }
630  }
631 
632  // Copy into factory
633  factory->CopyTo(data);
634 
635  return NOERROR;
636 }
637 
638 //------------------
639 // Extract_DTOFPoint
640 //------------------
641 jerror_t DEventSourceREST::Extract_DTOFPoint(hddm_r::HDDM *record,
642  JFactory<DTOFPoint>* factory)
643 {
644  /// Copies the data from the tofPoint hddm record. This is called
645  /// from JEventSourceREST::GetObjects. If factory is NULL, this
646  /// returns OBJECT_NOT_AVAILABLE immediately.
647 
648  if (factory==NULL) {
649  return OBJECT_NOT_AVAILABLE;
650  }
651  string tag = (factory->Tag())? factory->Tag() : "";
652 
653  vector<DTOFPoint*> data;
654 
655  // loop over tofPoint records
656  const hddm_r::TofPointList &tofs = record->getTofPoints();
657  hddm_r::TofPointList::iterator iter;
658  for (iter = tofs.begin(); iter != tofs.end(); ++iter) {
659  if (iter->getJtag() != tag) {
660  continue;
661  }
662  DTOFPoint *tofpoint = new DTOFPoint();
663  tofpoint->pos = DVector3(iter->getX(),iter->getY(),iter->getZ());
664  tofpoint->t = iter->getT();
665  tofpoint->dE = iter->getDE();
666  tofpoint->tErr = iter->getTerr();
667 
668  //Status
669  const hddm_r::TofStatusList& locTofStatusList = iter->getTofStatuses();
670  hddm_r::TofStatusList::iterator locStatusIterator = locTofStatusList.begin();
671  if(locStatusIterator == locTofStatusList.end())
672  {
673  tofpoint->dHorizontalBar = 0;
674  tofpoint->dVerticalBar = 0;
675  tofpoint->dHorizontalBarStatus = 3;
676  tofpoint->dVerticalBarStatus = 3;
677  }
678  else //should only be 1
679  {
680  for(; locStatusIterator != locTofStatusList.end(); ++locStatusIterator)
681  {
682  int locStatus = locStatusIterator->getStatus(); //horizontal_bar + 45*vertical_bar + 45*45*horizontal_status + 45*45*4*vertical_status
683  tofpoint->dVerticalBarStatus = locStatus/(45*45*4);
684  locStatus %= 45*45*4; //Assume compiler optimizes multiplication
685  tofpoint->dHorizontalBarStatus = locStatus/(45*45);
686  locStatus %= 45*45;
687  tofpoint->dVerticalBar = locStatus/45;
688  tofpoint->dHorizontalBar = locStatus % 45;
689  }
690  }
691 
692  data.push_back(tofpoint);
693  }
694 
695  // Copy into factory
696  factory->CopyTo(data);
697 
698  return NOERROR;
699 }
700 
701 //------------------
702 // Extract_DSCHit
703 //------------------
704 jerror_t DEventSourceREST::Extract_DSCHit(hddm_r::HDDM *record,
705  JFactory<DSCHit>* factory)
706 {
707  /// Copies the data from the startHit hddm record. This is called
708  /// from JEventSourceREST::GetObjects. If factory is NULL, this
709  /// returns OBJECT_NOT_AVAILABLE immediately.
710 
711  if (factory==NULL) {
712  return OBJECT_NOT_AVAILABLE;
713  }
714  string tag = (factory->Tag())? factory->Tag() : "";
715 
716  vector<DSCHit*> data;
717 
718  // loop over startHit records
719  const hddm_r::StartHitList &starts = record->getStartHits();
720  hddm_r::StartHitList::iterator iter;
721  for (iter = starts.begin(); iter != starts.end(); ++iter) {
722  if (iter->getJtag() != tag) {
723  continue;
724  }
725  DSCHit *start = new DSCHit();
726  start->sector = iter->getSector();
727  start->dE = iter->getDE();
728  start->t = iter->getT();
729  data.push_back(start);
730  }
731 
732  // Copy into factory
733  factory->CopyTo(data);
734 
735  return NOERROR;
736 }
737 
738 //-----------------------
739 // Extract_DTrigger
740 //-----------------------
741 jerror_t DEventSourceREST::Extract_DTrigger(hddm_r::HDDM *record, JFactory<DTrigger>* factory)
742 {
743  /// Copies the data from the trigger hddm record. This is
744  /// call from JEventSourceREST::GetObjects. If factory is NULL, this
745  /// returns OBJECT_NOT_AVAILABLE immediately.
746 
747  if (factory==NULL)
748  return OBJECT_NOT_AVAILABLE;
749  string tag = (factory->Tag())? factory->Tag() : "";
750 
751  vector<DTrigger*> data;
752 
753  // loop over trigger records
754  const hddm_r::TriggerList &triggers = record->getTriggers();
755  hddm_r::TriggerList::iterator iter;
756  for (iter = triggers.begin(); iter != triggers.end(); ++iter)
757  {
758  if (iter->getJtag() != tag)
759  continue;
760 
761  DTrigger *locTrigger = new DTrigger();
762  locTrigger->Set_L1TriggerBits(Convert_SignedIntToUnsigned(iter->getL1_trig_bits()));
763  locTrigger->Set_L1FrontPanelTriggerBits(Convert_SignedIntToUnsigned(iter->getL1_fp_trig_bits()));
764  data.push_back(locTrigger);
765  }
766 
767  // Copy into factory
768  factory->CopyTo(data);
769 
770  return NOERROR;
771 }
772 
773 //-----------------------
774 // Extract_DFCALShower
775 //-----------------------
776 jerror_t DEventSourceREST::Extract_DFCALShower(hddm_r::HDDM *record,
777  JFactory<DFCALShower>* factory)
778 {
779  /// Copies the data from the fcalShower hddm record. This is
780  /// call from JEventSourceREST::GetObjects. If factory is NULL, this
781  /// returns OBJECT_NOT_AVAILABLE immediately.
782 
783  if (factory==NULL) {
784  return OBJECT_NOT_AVAILABLE;
785  }
786  string tag = (factory->Tag())? factory->Tag() : "";
787 
788  vector<DFCALShower*> data;
789 
790  // loop over fcal shower records
791  const hddm_r::FcalShowerList &showers =
792  record->getFcalShowers();
793  hddm_r::FcalShowerList::iterator iter;
794  for (iter = showers.begin(); iter != showers.end(); ++iter) {
795  if (iter->getJtag() != tag)
796  continue;
797 
798  DFCALShower *shower = new DFCALShower();
799  shower->setPosition(DVector3(iter->getX(),iter->getY(),iter->getZ()));
800  shower->setEnergy(iter->getE());
801  shower->setTime(iter->getT());
802 
803  TMatrixFSym covariance(5);
804  covariance(0,0) = iter->getEerr()*iter->getEerr();
805  covariance(1,1) = iter->getXerr()*iter->getXerr();
806  covariance(2,2) = iter->getYerr()*iter->getYerr();
807  covariance(3,3) = iter->getZerr()*iter->getZerr();
808  covariance(4,4) = iter->getTerr()*iter->getTerr();
809  covariance(1,2) = covariance(2,1) = iter->getXycorr()*iter->getXerr()*iter->getYerr();
810  covariance(1,3) = covariance(3,1) = iter->getXzcorr()*iter->getXerr()*iter->getZerr();
811  covariance(2,3) = covariance(3,2) = iter->getYzcorr()*iter->getYerr()*iter->getZerr();
812  covariance(0,3) = covariance(3,0) = iter->getEzcorr()*iter->getEerr()*iter->getZerr();
813  covariance(3,4) = covariance(4,3) = iter->getTzcorr()*iter->getTerr()*iter->getZerr();
814 
815  // further correlations (an extension of REST format, so code is different.)
816  const hddm_r::FcalCorrelationsList& locFcalCorrelationsList = iter->getFcalCorrelationses();
817  hddm_r::FcalCorrelationsList::iterator locFcalCorrelationsIterator = locFcalCorrelationsList.begin();
818  if(locFcalCorrelationsIterator != locFcalCorrelationsList.end()) {
819  covariance(0,4) = covariance(4,0) = locFcalCorrelationsIterator->getEtcorr()*iter->getEerr()*iter->getTerr();
820  covariance(0,1) = covariance(1,0) = locFcalCorrelationsIterator->getExcorr()*iter->getEerr()*iter->getXerr();
821  covariance(0,2) = covariance(2,0) = locFcalCorrelationsIterator->getEycorr()*iter->getEerr()*iter->getYerr();
822  covariance(1,4) = covariance(4,1) = locFcalCorrelationsIterator->getTxcorr()*iter->getTerr()*iter->getXerr();
823  covariance(2,4) = covariance(4,2) = locFcalCorrelationsIterator->getTycorr()*iter->getTerr()*iter->getYerr();
824  }
825  shower->ExyztCovariance = covariance;
826 
827  // MVA classifier output - this information is being calculated in DNeutralShower now!
828  //const hddm_r::FcalShowerClassificationList& locFcalShowerClassificationList = iter->getFcalShowerClassifications();
829  //hddm_r::FcalShowerClassificationList::iterator locFcalShowerClassificationIterator = locFcalShowerClassificationList.begin();
830  //if(locFcalShowerClassificationIterator != locFcalShowerClassificationList.end()) {
831  // shower->setClassifierOutput(locFcalShowerClassificationIterator->getClassifierOuput());
832  //}
833 
834  // shower shape and other parameters. used e.g. as input to MVA classifier
835  const hddm_r::FcalShowerPropertiesList& locFcalShowerPropertiesList = iter->getFcalShowerPropertiesList();
836  hddm_r::FcalShowerPropertiesList::iterator locFcalShowerPropertiesIterator = locFcalShowerPropertiesList.begin();
837  if(locFcalShowerPropertiesIterator != locFcalShowerPropertiesList.end()) {
838  shower->setDocaTrack(locFcalShowerPropertiesIterator->getDocaTrack());
839  shower->setTimeTrack(locFcalShowerPropertiesIterator->getTimeTrack());
840  shower->setSumU(locFcalShowerPropertiesIterator->getSumU());
841  shower->setSumV(locFcalShowerPropertiesIterator->getSumV());
842  shower->setE1E9(locFcalShowerPropertiesIterator->getE1E9());
843  shower->setE9E25(locFcalShowerPropertiesIterator->getE9E25());
844  }
845 
846  const hddm_r::FcalShowerNBlocksList& locFcalShowerNBlocksList = iter->getFcalShowerNBlockses();
847  hddm_r::FcalShowerNBlocksList::iterator locFcalShowerNBlocksIterator = locFcalShowerNBlocksList.begin();
848  if(locFcalShowerNBlocksIterator != locFcalShowerNBlocksList.end()) {
849  shower->setNumBlocks(locFcalShowerNBlocksIterator->getNumBlocks());
850  }
851  data.push_back(shower);
852  }
853 
854  // Copy into factory
855  factory->CopyTo(data);
856 
857  return NOERROR;
858 }
859 
860 //-----------------------
861 // Extract_DBCALShower
862 //-----------------------
863 jerror_t DEventSourceREST::Extract_DBCALShower(hddm_r::HDDM *record,
864  JFactory<DBCALShower>* factory)
865 {
866  /// Copies the data from the bcalShower hddm record. This is
867  /// call from JEventSourceREST::GetObjects. If factory is NULL, this
868  /// returns OBJECT_NOT_AVAILABLE immediately.
869 
870  if (factory==NULL) {
871  return OBJECT_NOT_AVAILABLE;
872  }
873  string tag = (factory->Tag())? factory->Tag() : "";
874 
875  vector<DBCALShower*> data;
876 
877  // loop over bcal shower records
878  const hddm_r::BcalShowerList &showers =
879  record->getBcalShowers();
880  hddm_r::BcalShowerList::iterator iter;
881  for (iter = showers.begin(); iter != showers.end(); ++iter) {
882  if (iter->getJtag() != tag)
883  continue;
884 
885  DBCALShower *shower = new DBCALShower();
886  shower->E = iter->getE();
887  shower->E_raw = -1;
888  shower->x = iter->getX();
889  shower->y = iter->getY();
890  shower->z = iter->getZ();
891  shower->t = iter->getT();
892  shower->Q = 0; // Fix this to zero for now, can add to REST if it's ever used in higher-level analyses
893  TMatrixFSym covariance(5);
894  covariance(0,0) = iter->getEerr()*iter->getEerr();
895  covariance(1,1) = iter->getXerr()*iter->getXerr();
896  covariance(2,2) = iter->getYerr()*iter->getYerr();
897  covariance(3,3) = iter->getZerr()*iter->getZerr();
898  covariance(4,4) = iter->getTerr()*iter->getTerr();
899  covariance(1,2) = covariance(2,1) = iter->getXycorr()*iter->getXerr()*iter->getYerr();
900  covariance(1,3) = covariance(3,1) = iter->getXzcorr()*iter->getXerr()*iter->getZerr();
901  covariance(2,3) = covariance(3,2) = iter->getYzcorr()*iter->getYerr()*iter->getZerr();
902  covariance(0,3) = covariance(3,0) = iter->getEzcorr()*iter->getEerr()*iter->getZerr();
903  covariance(3,4) = covariance(4,3) = iter->getTzcorr()*iter->getTerr()*iter->getZerr();
904 
905  // further correlations (an extension of REST format, so code is different.)
906  const hddm_r::BcalCorrelationsList& locBcalCorrelationsList = iter->getBcalCorrelationses();
907  hddm_r::BcalCorrelationsList::iterator locBcalCorrelationsIterator = locBcalCorrelationsList.begin();
908  if(locBcalCorrelationsIterator != locBcalCorrelationsList.end()) {
909  covariance(0,4) = covariance(4,0) = locBcalCorrelationsIterator->getEtcorr()*iter->getEerr()*iter->getTerr();
910  covariance(0,1) = covariance(1,0) = locBcalCorrelationsIterator->getExcorr()*iter->getEerr()*iter->getXerr();
911  covariance(0,2) = covariance(2,0) = locBcalCorrelationsIterator->getEycorr()*iter->getEerr()*iter->getYerr();
912  covariance(1,4) = covariance(4,1) = locBcalCorrelationsIterator->getTxcorr()*iter->getTerr()*iter->getXerr();
913  covariance(2,4) = covariance(4,2) = locBcalCorrelationsIterator->getTycorr()*iter->getTerr()*iter->getYerr();
914  }
915  shower->ExyztCovariance = covariance;
916 
917  // preshower
918  const hddm_r::PreshowerList& locPreShowerList = iter->getPreshowers();
919  hddm_r::PreshowerList::iterator locPreShowerIterator = locPreShowerList.begin();
920  if(locPreShowerIterator == locPreShowerList.end())
921  shower->E_preshower = 0.0;
922  else //should only be 1
923  {
924  for(; locPreShowerIterator != locPreShowerList.end(); ++locPreShowerIterator)
925  shower->E_preshower = locPreShowerIterator->getPreshowerE();
926  }
927 
928  // width
929  const hddm_r::WidthList& locWidthList = iter->getWidths();
930  hddm_r::WidthList::iterator locWidthIterator = locWidthList.begin();
931  if(locWidthIterator == locWidthList.end()) {
932  shower->sigLong = -1.;
933  shower->sigTrans = -1.;
934  shower->sigTheta = -1.;
935  }
936  else //should only be 1
937  {
938  for(; locWidthIterator != locWidthList.end(); ++locWidthIterator) {
939  shower->sigLong = locWidthIterator->getSigLong();
940  shower->sigTrans = locWidthIterator->getSigTrans();
941  shower->sigTheta = locWidthIterator->getSigTheta();
942  }
943  }
944 
945  const hddm_r::BcalClusterList& locBcalClusterList = iter->getBcalClusters();
946  hddm_r::BcalClusterList::iterator locBcalClusterIterator = locBcalClusterList.begin();
947  if(locBcalClusterIterator == locBcalClusterList.end())
948  shower->N_cell = -1;
949  else //should only be 1
950  {
951  for(; locBcalClusterIterator != locBcalClusterList.end(); ++locBcalClusterIterator)
952  shower->N_cell = locBcalClusterIterator->getNcell();
953  }
954 
955  const hddm_r::BcalLayersList& locBcalLayersList = iter->getBcalLayerses();
956  hddm_r::BcalLayersList::iterator locBcalLayersIterator = locBcalLayersList.begin();
957  if(locBcalLayersIterator == locBcalLayersList.end()) {
958  shower->E_L2 = 0.;
959  shower->E_L3 = 0.;
960  shower->E_L4 = 0.;
961  shower->rmsTime = -1;
962  }
963  else //should only be 1
964  {
965  for(; locBcalLayersIterator != locBcalLayersList.end(); ++locBcalLayersIterator) {
966  shower->rmsTime = locBcalLayersIterator->getRmsTime();
967  shower->E_L2 = locBcalLayersIterator->getE_L2();
968  shower->E_L3 = locBcalLayersIterator->getE_L3();
969  shower->E_L4 = locBcalLayersIterator->getE_L4();
970  }
971  }
972 
973  data.push_back(shower);
974  }
975 
976  // Copy into factory
977  factory->CopyTo(data);
978 
979  return NOERROR;
980 }
981 
982 //--------------------------------
983 // Extract_DTrackTimeBased
984 //--------------------------------
985 jerror_t DEventSourceREST::Extract_DTrackTimeBased(hddm_r::HDDM *record,
986  JFactory<DTrackTimeBased>* factory, JEventLoop* locEventLoop)
987 {
988  /// Copies the data from the chargedTrack hddm record. This is
989  /// call from JEventSourceREST::GetObjects. If factory is NULL, this
990  /// returns OBJECT_NOT_AVAILABLE immediately.
991 
992  if (factory==NULL) {
993  return OBJECT_NOT_AVAILABLE;
994  }
995  string tag = (factory->Tag())? factory->Tag() : "";
996 
997  vector<DTrackTimeBased*> data;
998 
999  // loop over chargedTrack records
1000  const hddm_r::ChargedTrackList &tracks = record->getChargedTracks();
1001  hddm_r::ChargedTrackList::iterator iter;
1002  for (iter = tracks.begin(); iter != tracks.end(); ++iter) {
1003  if (iter->getJtag() != tag) {
1004  continue;
1005  }
1006  DTrackTimeBased *tra = new DTrackTimeBased();
1007  tra->trackid = 0;
1008  tra->candidateid = iter->getCandidateId();
1009  Particle_t ptype = iter->getPtype();
1010  tra->setPID(ptype);
1011 
1012  const hddm_r::TrackFit &fit = iter->getTrackFit();
1013  tra->Ndof = fit.getNdof();
1014  tra->chisq = fit.getChisq();
1015  tra->FOM = TMath::Prob(tra->chisq, tra->Ndof);
1016  tra->setTime(fit.getT0());
1017  DVector3 track_pos(fit.getX0(),fit.getY0(),fit.getZ0());
1018  DVector3 track_mom(fit.getPx(),fit.getPy(),fit.getPz());
1019  tra->setPosition(track_pos);
1020  tra->setMomentum(track_mom);
1021 
1022  auto loc5x5ErrorMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
1023  loc5x5ErrorMatrix->ResizeTo(5, 5);
1024  (*loc5x5ErrorMatrix)(0,0) = fit.getE11();
1025  (*loc5x5ErrorMatrix)(0,1) = (*loc5x5ErrorMatrix)(1,0) = fit.getE12();
1026  (*loc5x5ErrorMatrix)(0,2) = (*loc5x5ErrorMatrix)(2,0) = fit.getE13();
1027  (*loc5x5ErrorMatrix)(0,3) = (*loc5x5ErrorMatrix)(3,0) = fit.getE14();
1028  (*loc5x5ErrorMatrix)(0,4) = (*loc5x5ErrorMatrix)(4,0) = fit.getE15();
1029  (*loc5x5ErrorMatrix)(1,1) = fit.getE22();
1030  (*loc5x5ErrorMatrix)(1,2) = (*loc5x5ErrorMatrix)(2,1) = fit.getE23();
1031  (*loc5x5ErrorMatrix)(1,3) = (*loc5x5ErrorMatrix)(3,1) = fit.getE24();
1032  (*loc5x5ErrorMatrix)(1,4) = (*loc5x5ErrorMatrix)(4,1) = fit.getE25();
1033  (*loc5x5ErrorMatrix)(2,2) = fit.getE33();
1034  (*loc5x5ErrorMatrix)(2,3) = (*loc5x5ErrorMatrix)(3,2) = fit.getE34();
1035  (*loc5x5ErrorMatrix)(2,4) = (*loc5x5ErrorMatrix)(4,2) = fit.getE35();
1036  (*loc5x5ErrorMatrix)(3,3) = fit.getE44();
1037  (*loc5x5ErrorMatrix)(3,4) = (*loc5x5ErrorMatrix)(4,3) = fit.getE45();
1038  (*loc5x5ErrorMatrix)(4,4) = fit.getE55();
1039  tra->setTrackingErrorMatrix(loc5x5ErrorMatrix);
1040 
1041  // Convert from cartesian coordinates to the 5x1 state vector corresponding to the tracking error matrix.
1042  double vect[5];
1043  vect[2]=tan(M_PI_2 - track_mom.Theta());
1044  vect[1]=track_mom.Phi();
1045  double sinphi=sin(vect[1]);
1046  double cosphi=cos(vect[1]);
1047  vect[0]=tra->charge()/track_mom.Perp();
1048  vect[4]=track_pos.Z();
1049  vect[3]=track_pos.Perp();
1050 
1051  if ((track_pos.X() > 0 && sinphi>0) || (track_pos.Y() <0 && cosphi>0) || (track_pos.Y() >0 && cosphi<0) || (track_pos.X() <0 && sinphi<0))
1052  vect[3] *= -1.;
1053  tra->setTrackingStateVector(vect[0], vect[1], vect[2], vect[3], vect[4]);
1054 
1055  // Set the 7x7 covariance matrix.
1056  auto loc7x7ErrorMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
1057  loc7x7ErrorMatrix->ResizeTo(7, 7);
1058  Get7x7ErrorMatrix(tra->mass(), vect, loc5x5ErrorMatrix.get(), loc7x7ErrorMatrix.get());
1059  tra->setErrorMatrix(loc7x7ErrorMatrix);
1060  (*loc7x7ErrorMatrix)(6, 6) = fit.getT0err()*fit.getT0err();
1061 
1062  // Hit layers
1063  const hddm_r::ExpectedhitsList& locExpectedhitsList = iter->getExpectedhitses();
1064  hddm_r::ExpectedhitsList::iterator locExpectedhitsIterator = locExpectedhitsList.begin();
1065  if(locExpectedhitsIterator == locExpectedhitsList.end())
1066  {
1067  tra->potential_cdc_hits_on_track = 0;
1068  tra->potential_fdc_hits_on_track = 0;
1069  tra->measured_cdc_hits_on_track = 0;
1070  tra->measured_fdc_hits_on_track = 0;
1071  //tra->cdc_hit_usage.total_hits = 0;
1072  //tra->fdc_hit_usage.total_hits = 0;
1073  }
1074  else //should only be 1
1075  {
1076  for(; locExpectedhitsIterator != locExpectedhitsList.end(); ++locExpectedhitsIterator)
1077  {
1078  tra->potential_cdc_hits_on_track = locExpectedhitsIterator->getExpectedCDChits();
1079  tra->potential_fdc_hits_on_track = locExpectedhitsIterator->getExpectedFDChits();
1080  tra->measured_cdc_hits_on_track = locExpectedhitsIterator->getMeasuredCDChits();
1081  tra->measured_fdc_hits_on_track = locExpectedhitsIterator->getMeasuredFDChits();
1082  //tra->cdc_hit_usage.total_hits = locExpectedhitsIterator->getMeasuredCDChits();
1083  //tra->fdc_hit_usage.total_hits = locExpectedhitsIterator->getMeasuredFDChits();
1084  }
1085  }
1086 
1087  // Expected number of hits
1088  const hddm_r::HitlayersList& locHitlayersList = iter->getHitlayerses();
1089  hddm_r::HitlayersList::iterator locHitlayersIterator = locHitlayersList.begin();
1090  if(locHitlayersIterator == locHitlayersList.end())
1091  {
1092  tra->dCDCRings = 0;
1093  tra->dFDCPlanes = 0;
1094  }
1095  else //should only be 1
1096  {
1097  for(; locHitlayersIterator != locHitlayersList.end(); ++locHitlayersIterator)
1098  {
1099  tra->dCDCRings = locHitlayersIterator->getCDCrings();
1100  tra->dFDCPlanes = locHitlayersIterator->getFDCplanes();
1101  }
1102  }
1103 
1104  // MC match hit info
1105  const hddm_r::McmatchList& locMCMatchesList = iter->getMcmatchs();
1106  hddm_r::McmatchList::iterator locMcmatchIterator = locMCMatchesList.begin();
1107  if(locMcmatchIterator == locMCMatchesList.end())
1108  {
1109  tra->dCDCRings = 0;
1110  tra->dFDCPlanes = 0;
1111  }
1112  else //should only be 1
1113  {
1114  for(; locMcmatchIterator != locMCMatchesList.end(); ++locMcmatchIterator)
1115  {
1116  tra->dMCThrownMatchMyID = locMcmatchIterator->getIthrown();
1117  tra->dNumHitsMatchedToThrown = locMcmatchIterator->getNumhitsmatch();
1118  }
1119  }
1120 
1121  // add the drift chamber dE/dx information
1122  const hddm_r::DEdxDCList &el = iter->getDEdxDCs();
1123  hddm_r::DEdxDCList::iterator diter = el.begin();
1124  if (diter != el.end()) {
1125  tra->dNumHitsUsedFordEdx_FDC = diter->getNsampleFDC();
1126  tra->dNumHitsUsedFordEdx_CDC = diter->getNsampleCDC();
1127  tra->ddEdx_FDC = diter->getDEdxFDC();
1128  tra->ddEdx_CDC = diter->getDEdxCDC();
1129  tra->ddx_FDC = diter->getDxFDC();
1130  tra->ddx_CDC = diter->getDxCDC();
1131  const hddm_r::CDCAmpdEdxList &el2 = diter->getCDCAmpdEdxs();
1132  hddm_r::CDCAmpdEdxList::iterator diter2 = el2.begin();
1133  if (diter2 != el2.end()){
1134  tra->ddx_CDC_amp= diter2->getDxCDCAmp();
1135  tra->ddEdx_CDC_amp = diter2->getDEdxCDCAmp();
1136  }
1137  else{
1138  tra->ddx_CDC_amp=tra->ddx_CDC;
1139  tra->ddEdx_CDC_amp=tra->ddEdx_CDC;
1140  }
1141  }
1142  else {
1143  tra->dNumHitsUsedFordEdx_FDC = 0;
1144  tra->dNumHitsUsedFordEdx_CDC = 0;
1145  tra->ddEdx_FDC = 0.0;
1146  tra->ddEdx_CDC = 0.0;
1147  tra->ddx_FDC = 0.0;
1148  tra->ddx_CDC = 0.0;
1149  tra->ddEdx_CDC_amp = 0.0;
1150  tra->ddx_CDC_amp = 0.0;
1151  }
1152 
1153  data.push_back(tra);
1154  }
1155 
1156  if( PRUNE_DUPLICATE_TRACKS && (data.size() > 1) ) {
1157  vector< int > indices_to_erase;
1158  vector<DTrackTimeBased*>::iterator it = data.begin();
1159 
1160  for( unsigned int i=0; i<data.size()-1; i++ ) {
1161  for( unsigned int j=i+1; j<data.size(); j++ ) {
1162  if(find(indices_to_erase.begin(), indices_to_erase.end(), j) != indices_to_erase.end())
1163  continue;
1164 
1165  // look through the remaining tracks for duplicates
1166  // (1) if there is a track with the same candidate/PID and worse chi^2, reject that track
1167  // (2) if there is a track with the same candidate/PID and better chi^2, reject this track
1168  if( (data[i]->candidateid == data[j]->candidateid)
1169  && (data[i]->PID() == data[j]->PID()) ) { // is a duplicate track
1170  if(data[i]->chisq < data[j]->chisq) {
1171  indices_to_erase.push_back(j);
1172  } else {
1173  indices_to_erase.push_back(i);
1174  }
1175  }
1176  }
1177  }
1178 
1179  // create the new set of tracks
1180  vector<DTrackTimeBased*> new_data;
1181  for( unsigned int i=0; i<data.size(); i++ ) {
1182  if(find(indices_to_erase.begin(), indices_to_erase.end(), i) != indices_to_erase.end())
1183  continue;
1184 
1185  new_data.push_back(data[i]);
1186  }
1187  data = new_data; // replace the set of tracks with the pruned one
1188  }
1189 
1190  // Copy into factory
1191  factory->CopyTo(data);
1192 
1193  return NOERROR;
1194 }
1195 
1196 //--------------------------------
1197 // Extract_DDetectorMatches
1198 //--------------------------------
1199 jerror_t DEventSourceREST::Extract_DDetectorMatches(JEventLoop* locEventLoop, hddm_r::HDDM *record, JFactory<DDetectorMatches>* factory)
1200 {
1201  /// Copies the data from the detectorMatches hddm record. This is
1202  /// called from JEventSourceREST::GetObjects. If factory is NULL, this
1203  /// returns OBJECT_NOT_AVAILABLE immediately.
1204 
1205  if(factory==NULL)
1206  return OBJECT_NOT_AVAILABLE;
1207 
1208  string tag = (factory->Tag())? factory->Tag() : "";
1209  vector<DDetectorMatches*> data;
1210 
1211  vector<const DTrackTimeBased*> locTrackTimeBasedVector;
1212  locEventLoop->Get(locTrackTimeBasedVector);
1213 
1214  vector<const DSCHit*> locSCHits;
1215  locEventLoop->Get(locSCHits);
1216 
1217  vector<const DTOFPoint*> locTOFPoints;
1218  locEventLoop->Get(locTOFPoints);
1219 
1220  vector<const DBCALShower*> locBCALShowers;
1221  locEventLoop->Get(locBCALShowers);
1222 
1223  vector<const DFCALShower*> locFCALShowers;
1224  locEventLoop->Get(locFCALShowers);
1225 
1226  const DParticleID* locParticleID = NULL;
1227  vector<const DDIRCPmtHit*> locDIRCHits;
1228  vector<const DDIRCTruthBarHit*> locDIRCBarHits;
1229  if(RECO_DIRC_CALC_LUT) {
1230  locEventLoop->GetSingle(locParticleID);
1231  locEventLoop->Get(locDIRCHits);
1232  locEventLoop->Get(locDIRCBarHits);
1233  }
1234 
1235  const hddm_r::DetectorMatchesList &detectormatches = record->getDetectorMatcheses();
1236 
1237  // loop over chargedTrack records
1238  hddm_r::DetectorMatchesList::iterator iter;
1239  for(iter = detectormatches.begin(); iter != detectormatches.end(); ++iter)
1240  {
1241  if(iter->getJtag() != tag)
1242  continue;
1243 
1244  DDetectorMatches *locDetectorMatches = new DDetectorMatches();
1245 
1246  const hddm_r::DircMatchParamsList &dircList = iter->getDircMatchParamses();
1247  hddm_r::DircMatchParamsList::iterator dircIter = dircList.begin();
1248  const hddm_r::DircMatchHitList &dircMatchHitList = iter->getDircMatchHits();
1249 
1250  for(; dircIter != dircList.end(); ++dircIter)
1251  {
1252  size_t locTrackIndex = dircIter->getTrack();
1253 
1254  auto locDIRCMatchParams = std::make_shared<DDIRCMatchParams>();
1255  map<shared_ptr<const DDIRCMatchParams> ,vector<const DDIRCPmtHit*> > locDIRCTrackMatchParams;
1256  locDetectorMatches->Get_DIRCTrackMatchParamsMap(locDIRCTrackMatchParams);
1257 
1258  if(RECO_DIRC_CALC_LUT) {
1259  TVector3 locProjPos(dircIter->getX(),dircIter->getY(),dircIter->getZ());
1260  TVector3 locProjMom(dircIter->getPx(),dircIter->getPy(),dircIter->getPz());
1261  double locFlightTime = dircIter->getT();
1262 
1263  if( locParticleID->Get_DIRCLut()->CalcLUT(locProjPos, locProjMom, locDIRCHits, locFlightTime, locTrackTimeBasedVector[locTrackIndex]->PID(), locDIRCMatchParams, locDIRCBarHits, locDIRCTrackMatchParams) )
1264  locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], std::const_pointer_cast<const DDIRCMatchParams>(locDIRCMatchParams));
1265  }
1266  else {
1267  // add hits to match list
1268  hddm_r::DircMatchHitList::iterator dircMatchHitIter = dircMatchHitList.begin();
1269  for(; dircMatchHitIter != dircMatchHitList.end(); ++dircMatchHitIter) {
1270  size_t locMatchHitTrackIndex = dircMatchHitIter->getTrack();
1271  if(locMatchHitTrackIndex == locTrackIndex) {
1272  size_t locMatchHitIndex = dircMatchHitIter->getHit();
1273  locDIRCTrackMatchParams[locDIRCMatchParams].push_back(locDIRCHits[locMatchHitIndex]);
1274  }
1275  }
1276 
1277  locDIRCMatchParams->dExtrapolatedPos = DVector3(dircIter->getX(),dircIter->getY(),dircIter->getZ());
1278  locDIRCMatchParams->dExtrapolatedMom = DVector3(dircIter->getPx(),dircIter->getPy(),dircIter->getPz());
1279  locDIRCMatchParams->dExtrapolatedTime = dircIter->getT();
1280  locDIRCMatchParams->dExpectedThetaC = dircIter->getExpectthetac();
1281  locDIRCMatchParams->dThetaC = dircIter->getThetac();
1282  locDIRCMatchParams->dDeltaT = dircIter->getDeltat();
1283  locDIRCMatchParams->dLikelihoodElectron = dircIter->getLele();
1284  locDIRCMatchParams->dLikelihoodPion = dircIter->getLpi();
1285  locDIRCMatchParams->dLikelihoodKaon = dircIter->getLk();
1286  locDIRCMatchParams->dLikelihoodProton = dircIter->getLp();
1287  locDIRCMatchParams->dNPhotons = dircIter->getNphotons();
1288  locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], std::const_pointer_cast<const DDIRCMatchParams>(locDIRCMatchParams));
1289  }
1290  }
1291 
1292  const hddm_r::BcalMatchParamsList &bcalList = iter->getBcalMatchParamses();
1293  hddm_r::BcalMatchParamsList::iterator bcalIter = bcalList.begin();
1294  for(; bcalIter != bcalList.end(); ++bcalIter)
1295  {
1296  size_t locShowerIndex = bcalIter->getShower();
1297  size_t locTrackIndex = bcalIter->getTrack();
1298 
1299  auto locShowerMatchParams = std::make_shared<DBCALShowerMatchParams>();
1300  locShowerMatchParams->dBCALShower = locBCALShowers[locShowerIndex];
1301  locShowerMatchParams->dx = bcalIter->getDx();
1302  locShowerMatchParams->dFlightTime = bcalIter->getTflight();
1303  locShowerMatchParams->dFlightTimeVariance = bcalIter->getTflightvar();
1304  locShowerMatchParams->dPathLength = bcalIter->getPathlength();
1305  locShowerMatchParams->dDeltaPhiToShower = bcalIter->getDeltaphi();
1306  locShowerMatchParams->dDeltaZToShower = bcalIter->getDeltaz();
1307 
1308  locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], locBCALShowers[locShowerIndex], std::const_pointer_cast<const DBCALShowerMatchParams>(locShowerMatchParams));
1309  }
1310 
1311  const hddm_r::FcalMatchParamsList &fcalList = iter->getFcalMatchParamses();
1312  hddm_r::FcalMatchParamsList::iterator fcalIter = fcalList.begin();
1313  for(; fcalIter != fcalList.end(); ++fcalIter)
1314  {
1315  size_t locShowerIndex = fcalIter->getShower();
1316  size_t locTrackIndex = fcalIter->getTrack();
1317 
1318  auto locShowerMatchParams = std::make_shared<DFCALShowerMatchParams>();
1319  locShowerMatchParams->dFCALShower = locFCALShowers[locShowerIndex];
1320  locShowerMatchParams->dx = fcalIter->getDx();
1321  locShowerMatchParams->dFlightTime = fcalIter->getTflight();
1322  locShowerMatchParams->dFlightTimeVariance = fcalIter->getTflightvar();
1323  locShowerMatchParams->dPathLength = fcalIter->getPathlength();
1324  locShowerMatchParams->dDOCAToShower = fcalIter->getDoca();
1325 
1326  locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], locFCALShowers[locShowerIndex], std::const_pointer_cast<const DFCALShowerMatchParams>(locShowerMatchParams));
1327  }
1328 
1329  const hddm_r::ScMatchParamsList &scList = iter->getScMatchParamses();
1330  hddm_r::ScMatchParamsList::iterator scIter = scList.begin();
1331  for(; scIter != scList.end(); ++scIter)
1332  {
1333  size_t locHitIndex = scIter->getHit();
1334  size_t locTrackIndex = scIter->getTrack();
1335 
1336  auto locSCHitMatchParams = std::make_shared<DSCHitMatchParams>();
1337  locSCHitMatchParams->dSCHit = locSCHits[locHitIndex];
1338  locSCHitMatchParams->dEdx = scIter->getDEdx();
1339  locSCHitMatchParams->dHitTime = scIter->getThit();
1340  locSCHitMatchParams->dHitTimeVariance = scIter->getThitvar();
1341  locSCHitMatchParams->dHitEnergy = scIter->getEhit();
1342  locSCHitMatchParams->dFlightTime = scIter->getTflight();
1343  locSCHitMatchParams->dFlightTimeVariance = scIter->getTflightvar();
1344  locSCHitMatchParams->dPathLength = scIter->getPathlength();
1345  locSCHitMatchParams->dDeltaPhiToHit = scIter->getDeltaphi();
1346 
1347  locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], locSCHits[locHitIndex], std::const_pointer_cast<const DSCHitMatchParams>(locSCHitMatchParams));
1348  }
1349 
1350  const hddm_r::TofMatchParamsList &tofList = iter->getTofMatchParamses();
1351  hddm_r::TofMatchParamsList::iterator tofIter = tofList.begin();
1352  for(; tofIter != tofList.end(); ++tofIter)
1353  {
1354  size_t locHitIndex = tofIter->getHit();
1355  size_t locTrackIndex = tofIter->getTrack();
1356 
1357  auto locTOFHitMatchParams = std::make_shared<DTOFHitMatchParams>();
1358  locTOFHitMatchParams->dTOFPoint = locTOFPoints[locHitIndex];
1359 
1360  locTOFHitMatchParams->dHitTime = tofIter->getThit();
1361  locTOFHitMatchParams->dHitTimeVariance = tofIter->getThitvar();
1362  locTOFHitMatchParams->dHitEnergy = tofIter->getEhit();
1363 
1364  locTOFHitMatchParams->dEdx = tofIter->getDEdx();
1365  locTOFHitMatchParams->dFlightTime = tofIter->getTflight();
1366  locTOFHitMatchParams->dFlightTimeVariance = tofIter->getTflightvar();
1367  locTOFHitMatchParams->dPathLength = tofIter->getPathlength();
1368  locTOFHitMatchParams->dDeltaXToHit = tofIter->getDeltax();
1369  locTOFHitMatchParams->dDeltaYToHit = tofIter->getDeltay();
1370 
1371  locDetectorMatches->Add_Match(locTrackTimeBasedVector[locTrackIndex], locTOFPoints[locHitIndex], std::const_pointer_cast<const DTOFHitMatchParams>(locTOFHitMatchParams));
1372  }
1373 
1374  const hddm_r::BcalDOCAtoTrackList &bcaldocaList = iter->getBcalDOCAtoTracks();
1375  hddm_r::BcalDOCAtoTrackList::iterator bcaldocaIter = bcaldocaList.begin();
1376  for(; bcaldocaIter != bcaldocaList.end(); ++bcaldocaIter)
1377  {
1378  size_t locShowerIndex = bcaldocaIter->getShower();
1379  double locDeltaPhi = bcaldocaIter->getDeltaphi();
1380  double locDeltaZ = bcaldocaIter->getDeltaz();
1381  locDetectorMatches->Set_DistanceToNearestTrack(locBCALShowers[locShowerIndex], locDeltaPhi, locDeltaZ);
1382  }
1383 
1384  const hddm_r::FcalDOCAtoTrackList &fcaldocaList = iter->getFcalDOCAtoTracks();
1385  hddm_r::FcalDOCAtoTrackList::iterator fcaldocaIter = fcaldocaList.begin();
1386  for(; fcaldocaIter != fcaldocaList.end(); ++fcaldocaIter)
1387  {
1388  size_t locShowerIndex = fcaldocaIter->getShower();
1389  double locDOCA = fcaldocaIter->getDoca();
1390  locDetectorMatches->Set_DistanceToNearestTrack(locFCALShowers[locShowerIndex], locDOCA);
1391  }
1392 
1393  const hddm_r::TflightPCorrelationList &correlationList = iter->getTflightPCorrelations();
1394  hddm_r::TflightPCorrelationList::iterator correlationIter = correlationList.begin();
1395  for(; correlationIter != correlationList.end(); ++correlationIter)
1396  {
1397  size_t locTrackIndex = correlationIter->getTrack();
1398  DetectorSystem_t locDetectorSystem = (DetectorSystem_t)correlationIter->getSystem();
1399  double locCorrelation = correlationIter->getCorrelation();
1400  locDetectorMatches->Set_FlightTimePCorrelation(locTrackTimeBasedVector[locTrackIndex], locDetectorSystem, locCorrelation);
1401  }
1402 
1403  data.push_back(locDetectorMatches);
1404  }
1405 
1406  // Copy data to factory
1407  factory->CopyTo(data);
1408 
1409  return NOERROR;
1410 }
1411 
1412 // Transform the 5x5 tracking error matrix into a 7x7 error matrix in cartesian
1413 // coordinates.
1414 // This was copied and transformed from DKinFit.cc
1415 void DEventSourceREST::Get7x7ErrorMatrix(double mass, const double vec[5], const TMatrixFSym* C5x5, TMatrixFSym* loc7x7ErrorMatrix)
1416 {
1417  TMatrixF J(7,5);
1418 
1419  // State vector
1420  double q_over_pt=vec[0];
1421  double phi=vec[1];
1422  double tanl=vec[2];
1423  double D=vec[3];
1424 
1425  double pt=1./fabs(q_over_pt);
1426  double pt_sq=pt*pt;
1427  double cosphi=cos(phi);
1428  double sinphi=sin(phi);
1429  double q=(q_over_pt>0)?1.:-1.;
1430 
1431  J(0, 0)=-q*pt_sq*cosphi;
1432  J(0, 1)=-pt*sinphi;
1433 
1434  J(1, 0)=-q*pt_sq*sinphi;
1435  J(1, 1)=pt*cosphi;
1436 
1437  J(2, 0)=-q*pt_sq*tanl;
1438  J(2, 2)=pt;
1439 
1440  J(3, 1)=-D*cosphi;
1441  J(3, 3)=-sinphi;
1442 
1443  J(4, 1)=-D*sinphi;
1444  J(4, 3)=cosphi;
1445 
1446  J(5, 4)=1.;
1447 
1448  // C'= JCJ^T
1449  TMatrixFSym locTempMatrix(*C5x5);
1450  *loc7x7ErrorMatrix=locTempMatrix.Similarity(J);
1451 }
1452 
1453 uint32_t DEventSourceREST::Convert_SignedIntToUnsigned(int32_t locSignedInt) const
1454 {
1455  //Convert uint32_t to int32_t
1456  //Reverse scheme (from DEventWriterREST):
1457  //If is >= 0, then the int32_t is the same as the uint32_t (last bit not set)
1458  //If is the minimum int: bit 32 is 1, and all of the other bits are zero
1459  //Else, bit 32 is 1, then the uint32_t is -1 * int32_t, + add the last bit
1460  if(locSignedInt >= 0)
1461  return uint32_t(locSignedInt); //bit 32 is zero
1462  else if(locSignedInt == numeric_limits<int32_t>::min()) // -(2^31)
1463  return uint32_t(0x80000000); //bit 32 is 1, all others are 0
1464  return uint32_t(-1*locSignedInt) + uint32_t(0x80000000); //bit 32 is 1, all others are negative of signed int (which was negative)
1465 }
1466 
1467 //-----------------------
1468 // Extract_DDIRCPmtHit
1469 //-----------------------
1470 jerror_t DEventSourceREST::Extract_DDIRCPmtHit(hddm_r::HDDM *record,
1471  JFactory<DDIRCPmtHit>* factory, JEventLoop* locEventLoop)
1472 {
1473  /// Copies the data from the fcalShower hddm record. This is
1474  /// call from JEventSourceREST::GetObjects. If factory is NULL, this
1475  /// returns OBJECT_NOT_AVAILABLE immediately.
1476 
1477  if (factory==NULL) {
1478  return OBJECT_NOT_AVAILABLE;
1479  }
1480  string tag = (factory->Tag())? factory->Tag() : "";
1481 
1482  vector<DDIRCPmtHit*> data;
1483 
1484  // loop over fcal shower records
1485  const hddm_r::DircHitList &hits =
1486  record->getDircHits();
1487  hddm_r::DircHitList::iterator iter;
1488  for (iter = hits.begin(); iter != hits.end(); ++iter) {
1489  if (iter->getJtag() != tag)
1490  continue;
1491 
1492  // throw away hits from bad or noisy channels (after REST reconstruction)
1493  int locRunNumber = locEventLoop->GetJEvent().GetRunNumber();
1494  int box = (iter->getCh() < dDIRCMaxChannels) ? 1 : 0;
1495  int channel = iter->getCh() % dDIRCMaxChannels;
1496  dirc_status_state status = static_cast<dirc_status_state>(dDIRCChannelStatusMap[locRunNumber][box][channel]);
1497  if ( (status==BAD) || (status==NOISY) ) {
1498  continue;
1499  }
1500 
1501  DDIRCPmtHit *hit = new DDIRCPmtHit();
1502  hit->setChannel(iter->getCh());
1503  hit->setTime(iter->getT());
1504  hit->setTOT(iter->getTot());
1505 
1506  data.push_back(hit);
1507  }
1508 
1509  // Copy into factory
1510  factory->CopyTo(data);
1511 
1512  return NOERROR;
1513 }
unsigned int dCounter
Definition: DBeamPhoton.h:18
void setDocaTrack(const double docaTrack)
Definition: DFCALShower.cc:40
void setTOT(double timeOverThreshold)
Definition: DDIRCPmtHit.h:22
void setMomentum(const DVector3 &aMomentum)
void setTimeTrack(const double tTrack)
Definition: DFCALShower.cc:41
jerror_t Extract_DTOFPoint(hddm_r::HDDM *record, JFactory< DTOFPoint > *factory)
void setTime(double locTime)
DApplication * dapp
DKinematicData target
Definition: DMCReaction.h:24
virtual ~DEventSourceREST()
int dHorizontalBar
Definition: DTOFPoint.h:38
void FreeEvent(JEvent &event)
DEventSourceREST(const char *source_name)
float chisq
Chi-squared for the track (not chisq/dof!)
void setTime(double time)
Definition: DDIRCPmtHit.h:21
float dE
Definition: DTOFPoint.h:35
bool Get_DIRCTrackMatchParamsMap(map< shared_ptr< const DDIRCMatchParams >, vector< const DDIRCPmtHit * > > &locDIRCTrackMatchParamsMap)
void setE9E25(const double e9e25)
Definition: DFCALShower.cc:44
TVector3 DVector3
Definition: DVector3.h:14
Definition: GlueX.h:16
void Get7x7ErrorMatrix(double mass, const double vec[5], const TMatrixFSym *C5x5, TMatrixFSym *loc7x7ErrorMatrix)
double energy(void) const
uint32_t Convert_SignedIntToUnsigned(int32_t locSignedInt) const
jerror_t Extract_DBeamPhoton(hddm_r::HDDM *record, JFactory< DBeamPhoton > *factory, JEventLoop *eventLoop)
TMatrixFSym ExyztCovariance
Definition: DBCALShower.h:34
double dTimeVariance
Definition: DRFTime.h:25
char string[256]
int dHorizontalBarStatus
Definition: DTOFPoint.h:43
jerror_t GetObjects(JEvent &event, JFactory_base *factory)
Definition: GlueX.h:29
oid_t trackid
id of DTrackWireBased corresponding to this track
jerror_t Extract_DRFTime(hddm_r::HDDM *record, JFactory< DRFTime > *factory, JEventLoop *locEventLoop)
jerror_t Extract_DFCALShower(hddm_r::HDDM *record, JFactory< DFCALShower > *factory)
double dTime
Definition: DRFTime.h:24
void setTrackingErrorMatrix(const shared_ptr< const TMatrixFSym > &aMatrix)
Definition: DTrackingData.h:29
Definition: GlueX.h:24
static Particle_t PDGtoPType(int locPDG_PID)
unsigned int potential_cdc_hits_on_track
void setTime(const double time)
Definition: DFCALShower.cc:30
jerror_t Extract_DMCThrown(hddm_r::HDDM *record, JFactory< DMCThrown > *factory)
jerror_t Extract_DSCHit(hddm_r::HDDM *record, JFactory< DSCHit > *factory)
DetectorSystem_t
Definition: GlueX.h:15
jerror_t Extract_DTrackTimeBased(hddm_r::HDDM *record, JFactory< DTrackTimeBased > *factory, JEventLoop *locEventLoop)
void setSumU(const double sumU)
Definition: DFCALShower.cc:42
map< unsigned int, vector< vector< int > > > dDIRCChannelStatusMap
int pdgtype
PDG particle type (not used by GEANT)
Definition: DMCThrown.h:21
oid_t candidateid
id of DTrackCandidate corresponding to this track
void setChannel(int channel)
Definition: DDIRCPmtHit.h:23
int sector
Definition: DSCHit.h:18
jerror_t Extract_DTrigger(hddm_r::HDDM *record, JFactory< DTrigger > *factory)
DKinematicData beam
Definition: DMCReaction.h:25
unsigned int dFDCPlanes
jerror_t Extract_DDIRCPmtHit(hddm_r::HDDM *record, JFactory< DDIRCPmtHit > *factory, JEventLoop *locEventLoop)
void setPosition(const DVector3 &aPosition)
Definition: DFCALShower.cc:35
double weight
Definition: DMCReaction.h:23
void Add_Match(const DTrackingData *locTrack, const DBCALShower *locBCALShower, const shared_ptr< const DBCALShowerMatchParams > &locShowerMatchParams)
static thread_local shared_ptr< DResourcePool< TMatrixFSym > > dResourcePool_TMatrixFSym
jerror_t Extract_DMCReaction(hddm_r::HDDM *record, JFactory< DMCReaction > *factory, JEventLoop *locEventLoop)
Definition: DSCHit.h:14
void setTrackingStateVector(double a1, double a2, double a3, double a4, double a5)
Definition: DTrackingData.h:55
void setErrorMatrix(const shared_ptr< const TMatrixFSym > &aMatrix)
TEllipse * e
DVector3 pos
Definition: DTOFPoint.h:33
int mech
production mechanism of this partcle (generator specific)
Definition: DMCThrown.h:24
TMatrixFSym ExyztCovariance
Definition: DFCALShower.h:56
jerror_t Extract_DBCALShower(hddm_r::HDDM *record, JFactory< DBCALShower > *factory)
void Set_L1FrontPanelTriggerBits(uint32_t locL1FrontPanelTriggerBits)
int parentid
id of parent of this particle from original generator
Definition: DMCThrown.h:23
void Set_DistanceToNearestTrack(const DBCALShower *locBCALShower, double locDeltaPhi, double locDeltaZ)
map< unsigned int, double > dBeamBunchPeriodMap
DGeometry * GetDGeometry(unsigned int run_number)
jerror_t Extract_DDetectorMatches(JEventLoop *locEventLoop, hddm_r::HDDM *record, JFactory< DDetectorMatches > *factory)
bool E_to_column(double E, unsigned int &column) const
void setEnergy(const double energy)
Definition: DFCALShower.cc:25
unsigned int potential_fdc_hits_on_track
hddm_r::istream * fin
int Ndof
Number of degrees of freedom in the fit.
double charge(void) const
#define _DBG__
Definition: HDEVIO.h:13
TH1D * py[NCHANNELS]
void setE1E9(const double e1e9)
Definition: DFCALShower.cc:45
void setPID(Particle_t locPID)
double sqrt(double)
unsigned int dCDCRings
const DDIRCLut * Get_DIRCLut() const
double sin(double)
int dVerticalBar
Definition: DTOFPoint.h:39
DetectorSystem_t dSystem
Definition: DBeamPhoton.h:19
void Set_L1TriggerBits(uint32_t locL1TriggerBits)
unsigned int measured_cdc_hits_on_track
bool CalcLUT(TVector3 locProjPos, TVector3 locProjMom, const vector< const DDIRCPmtHit * > locDIRCHits, double locFlightTime, Particle_t locPID, shared_ptr< DDIRCMatchParams > &locDIRCMatchParams, const vector< const DDIRCTruthBarHit * > locDIRCBarHits, map< shared_ptr< const DDIRCMatchParams >, vector< const DDIRCPmtHit * > > &locDIRCTrackMatchParams) const
Definition: DDIRCLut.cc:122
jerror_t GetEvent(JEvent &event)
std::ifstream * ifs
float dE
Definition: DSCHit.h:19
float E_preshower
Definition: DBCALShower.h:19
float t
Definition: DSCHit.h:20
map< unsigned int, double > dTargetCenterZMap
float t
Definition: DTOFPoint.h:34
void setPosition(const DVector3 &aPosition)
int type
GEANT particle ID.
Definition: DMCThrown.h:20
void setSumV(const double sumV)
Definition: DFCALShower.cc:43
unsigned int dNumHitsUsedFordEdx_FDC
bool E_to_counter(double E, unsigned int &counter) const
float tErr
Definition: DTOFPoint.h:36
bool GetTargetZ(double &z_target) const
z-location of center of target
Definition: DGeometry.cc:1933
unsigned int measured_fdc_hits_on_track
int myid
id of this particle from original generator
Definition: DMCThrown.h:22
unsigned int dNumHitsUsedFordEdx_CDC
void Set_FlightTimePCorrelation(const DTrackingData *locTrack, DetectorSystem_t locDetectorSystem, double locCorrelation)
void setNumBlocks(const int numBlocks)
Definition: DFCALShower.cc:46
float E_raw
Definition: DBCALShower.h:18
double mass(void) const
Particle_t
Definition: particleType.h:12
int dVerticalBarStatus
Definition: DTOFPoint.h:44