Bug Summary

File:libraries/HDDM/DEventSourceHDDM.cc
Location:line 1214, column 13
Description:Value stored to 'mass' is never read

Annotated Source Code

1// $Id: DEventSourceHDDM.cc 19023 2015-07-14 20:23:27Z beattite $
2//
3// Author: David Lawrence June 24, 2004
4//
5// changes: Wed Jun 20 17:08:13 EDT 2007 B. Zihlmann
6// modify TOF section to add several new variables incuding the
7// GEANT particle type to the Truth hits and the hit and track-hit
8// list.
9//
10// Oct 3, 2012 Yi Qiang: add functions for Cherenkov RICH detector
11// Oct 11, 2012 Yi Qiang: complete functions for Cherenkov detector
12// Oct 8, 2013 Yi Qiang: added dedicated object for RICH Truth Hit
13// July 5, 2014 R.T.Jones: changed over from c to c++ API for hddm
14// June 22, 2015 J. Stevens: changed RICH -> DIRC and remove CERE
15// May 7, 2017 R. Dzhygadlo: added DDIRCTruthPmtHit DDIRCTruthBarHit
16// Oct 20, 2017 A. Somov: Added fields for the DPSHit/DPSCHit
17//
18// DEventSourceHDDM methods
19//
20
21#include <iostream>
22#include <iomanip>
23#include <cmath>
24using namespace std;
25
26#include <JANA/JFactory_base.h>
27#include <JANA/JEventLoop.h>
28#include <JANA/JEvent.h>
29#include <DANA/DStatusBits.h>
30
31#include <JANA/JGeometryXML.h>
32#include "BCAL/DBCALGeometry.h"
33#include "PAIR_SPECTROMETER/DPSGeometry.h"
34
35#include <DVector2.h>
36#include <DEventSourceHDDM.h>
37#include <FDC/DFDCGeometry.h>
38#include <FCAL/DFCALGeometry.h>
39#include <FCAL/DFCALHit.h>
40#include <CCAL/DCCALGeometry.h>
41#include <CCAL/DCCALHit.h>
42
43
44//------------------------------------------------------------------
45// Binary predicate used to sort hits
46//------------------------------------------------------------------
47class MCTrackHitSort{
48 public:
49 bool operator()(DMCTrackHit* const &thit1,
50 DMCTrackHit* const &thit2) const {
51 return thit1->z < thit2->z;
52 }
53};
54
55bool MCTrackHitSort_C(DMCTrackHit* const &thit1,
56 DMCTrackHit* const &thit2) {
57 return thit1->z < thit2->z;
58}
59
60
61//----------------
62// Constructor
63//----------------
64DEventSourceHDDM::DEventSourceHDDM(const char* source_name)
65: JEventSource(source_name)
66{
67 /// Constructor for DEventSourceHDDM object
68 ifs = new ifstream(source_name);
69 ifs->get();
70 ifs->unget();
71 if (ifs->rdbuf()->in_avail() > 30) {
72 class nonstd_streambuf: public std::streambuf {
73 public: char *pub_gptr() {return gptr();}
74 };
75 void *buf = (void*)ifs->rdbuf();
76 std::string head(((nonstd_streambuf*)buf)->pub_gptr(), 30);
77 std::string expected = " class=\"s\" ";
78 std::string also_supported = " class=\"mc_s\" ";
79 if (head.find(expected) == head.npos &&
80 head.find(also_supported) == head.npos)
81 {
82 std::string msg("Unexpected header found in input HDDM stream: ");
83 throw std::runtime_error(msg + head + source_name);
84 }
85 }
86
87 fin = new hddm_s::istream(*ifs);
88 initialized = false;
89 dapp = NULL__null;
90 bfield = NULL__null;
91 geom = NULL__null;
92
93 dRunNumber = -1;
94
95 if( (!gPARMS->Exists("JANA_CALIB_CONTEXT")) && (getenv("JANA_CALIB_CONTEXT")==NULL__null) ){
96 cout << "============================================================" << endl;
97 cout << " WARNING: JANA_CALIB_CONTEXT not set. " << endl;
98 cout << "You are reading from an HDDM file which is most likely" << endl;
99 cout << "MC data. In most cases, you will want to set this parameter" << endl;
100 cout << "to get proper reconstruction." << endl;
101 cout << "(usually something like \"variation=mc\")" << endl;
102 cout << "============================================================" << endl;
103 }
104}
105
106//----------------
107// Destructor
108//----------------
109DEventSourceHDDM::~DEventSourceHDDM()
110{
111 if (fin)
112 delete fin;
113 if (ifs)
114 delete ifs;
115}
116
117//----------------
118// GetEvent
119//----------------
120jerror_t DEventSourceHDDM::GetEvent(JEvent &event)
121{
122 /// Implementation of JEventSource virtual function
123
124 if (!fin)
125 return EVENT_SOURCE_NOT_OPEN;
126
127 // Each open HDDM file takes up about 1M of memory so it's
128 // worthwhile to close it as soon as we can.
129 else if (!ifs->good()) {
130 delete fin;
131 fin = NULL__null;
132 delete ifs;
133 ifs = NULL__null;
134 return NO_MORE_EVENTS_IN_SOURCE;
135 }
136
137 hddm_s::HDDM *record = new hddm_s::HDDM();
138 while (record->getPhysicsEvents().size() == 0) {
139 if (! (*fin >> *record)) {
140 delete fin;
141 fin = NULL__null;
142 delete ifs;
143 ifs = NULL__null;
144 return NO_MORE_EVENTS_IN_SOURCE;
145 }
146 }
147
148 ++Nevents_read;
149
150 int event_number = -1;
151 int run_number = -1;
152
153 if(!record->getPhysicsEvents().empty()) {
154 // Get event/run numbers from HDDM
155 hddm_s::PhysicsEvent &pe = record->getPhysicsEvent(0);
156 event_number = pe.getEventNo();
157 run_number = pe.getRunNo();
158 }
159
160 // Copy the reference info into the JEvent object
161 event.SetJEventSource(this);
162 event.SetEventNumber(event_number);
163 event.SetRunNumber(run_number);
164 event.SetRef(record);
165 event.SetStatusBit(kSTATUS_HDDM);
166 event.SetStatusBit(kSTATUS_FROM_FILE);
167 event.SetStatusBit(kSTATUS_PHYSICS_EVENT);
168
169 return NOERROR;
170}
171
172//----------------
173// FreeEvent
174//----------------
175void DEventSourceHDDM::FreeEvent(JEvent &event)
176{
177 hddm_s::HDDM *record = (hddm_s::HDDM*)event.GetRef();
178 delete record;
179}
180
181//----------------
182// GetObjects
183//----------------
184jerror_t DEventSourceHDDM::GetObjects(JEvent &event, JFactory_base *factory)
185{
186 /// This gets called through the virtual method of the
187 /// JEventSource base class. It creates the objects of the type
188 /// on which factory is based. It uses the hddm_s::HDDM* object
189 /// kept in the ref field of the JEvent object passed.
190
191 // We must have a factory to hold the data
192 if (!factory)
193 throw RESOURCE_UNAVAILABLE;
194
195 // HDDM doesn't exactly support tagged factories, but the tag
196 // can be used to direct filling of the correct factory.
197 string tag = (factory->Tag()==NULL__null)? "" : factory->Tag();
198
199 // The ref field of the JEvent is just the HDDM object pointer.
200 hddm_s::HDDM *record = (hddm_s::HDDM*)event.GetRef();
201 if (!record)
202 throw RESOURCE_UNAVAILABLE;
203
204 // Get pointer to the B-field object and Geometry object
205 JEventLoop *loop = event.GetJEventLoop();
206 if (initialized == false && loop) {
207 initialized = true;
208 dRunNumber = event.GetRunNumber();
209 dapp = dynamic_cast<DApplication*>(loop->GetJApplication());
210 if (dapp) {
211 jcalib = dapp->GetJCalibration(event.GetRunNumber());
212 // Make sure jcalib is set
213 if (!jcalib) {
214 _DBG_std::cerr<<"libraries/HDDM/DEventSourceHDDM.cc"<<
":"<<214<<" "
<< "ERROR - no jcalib set!" <<endl;
215 return RESOURCE_UNAVAILABLE;
216 }
217 // Get constants and do basic check on number of elements
218 vector< map<string, float> > tvals;
219 if(jcalib->Get("FDC/strip_calib", tvals))
220 throw JException("Could not load CCDB table: FDC/strip_calib");
221
222 if (tvals.size() != 192) {
223 _DBG_std::cerr<<"libraries/HDDM/DEventSourceHDDM.cc"<<
":"<<223<<" "
<< "ERROR - strip calibration vectors are not the right size!"
224 << endl;
225 return VALUE_OUT_OF_RANGE;
226 }
227 map<string,float>::iterator iter;
228 for (iter=tvals[0].begin(); iter!=tvals[0].end(); iter++) {
229 // Copy values into tables. We preserve the order since
230 // that is how it was originally done in hitFDC.c
231 for (unsigned int i=0; i<tvals.size(); i++) {
232 map<string, float> &row = tvals[i];
233 uscale[i]=row["qru"];
234 vscale[i]=row["qrv"];
235 }
236 }
237 }
238 // load BCAL geometry
239 vector<const DBCALGeometry *> BCALGeomVec;
240 loop->Get(BCALGeomVec);
241 if(BCALGeomVec.size() == 0)
242 throw JException("Could not load DBCALGeometry object!");
243 dBCALGeom = BCALGeomVec[0];
244
245 // load PS geometry
246 vector<const DPSGeometry*> psGeomVect;
247 loop->Get(psGeomVect);
248 if (psGeomVect.size() < 1)
249 return OBJECT_NOT_AVAILABLE;
250 psGeom = psGeomVect[0];
251
252
253 }
254
255 // Warning: This class is not completely thread-safe and can fail if running
256 // running in multithreaded mode over files with events from multiple runs
257 // It is expected that simulated data will rarely contain events from multiple
258 // runs, as this is an intermediate format in the simulation chain, so for
259 // now we just insert a sanity check, and push the problem to the future
260 if(dRunNumber != event.GetRunNumber()) {
261 jerr << endl
262 << "WARNING: DEventSourceHDDM cannot currently handle HDDM files containing" << endl
263 << "events with multiple runs! If you encounter this error message," << endl
264 << "please contact the GlueX Offline Software Group: halld-offline@jlab.org" << endl
265 << endl;
266 exit(-1);
267 }
268
269 //Get target center
270 //multiple reader threads can access this object: need lock
271 bool locNewRunNumber = false;
272 unsigned int locRunNumber = event.GetRunNumber();
273 LockRead();
274 {
275 locNewRunNumber = (dTargetCenterZMap.find(locRunNumber) == dTargetCenterZMap.end());
276 }
277 UnlockRead();
278 if(locNewRunNumber)
279 {
280 DApplication* dapp = dynamic_cast<DApplication*>(loop->GetJApplication());
281 DGeometry* locGeometry = dapp->GetDGeometry(loop->GetJEvent().GetRunNumber());
282 double locTargetCenterZ = 0.0;
283 locGeometry->GetTargetZ(locTargetCenterZ);
284
285 JGeometryXML *jgeom = dynamic_cast<JGeometryXML *>(locGeometry);
286 hddm_s::GeometryList geolist = record->getGeometrys();
287 if (jgeom != 0 && geolist.size() > 0) {
288 std::string md5sim = geolist(0).getMd5simulation();
289 std::string md5smear = geolist(0).getMd5smear();
290 std::string md5recon = jgeom->GetChecksum();
291 geolist(0).setMd5reconstruction(md5recon);
292 if (md5sim != md5smear) {
293 jerr << std::endl
294 << "WARNING: simulation geometry checksum does not match"
295 << " that shown for the mcsmear step."
296 << std::endl;
297 }
298 else if (md5sim != md5recon) {
299 jerr << endl
300 << "WARNING: simulation geometry checksum does not match"
301 << " the geometry being used for reconstruction."
302 << std::endl;
303 }
304 }
305
306 vector<double> locBeamPeriodVector;
307 if(loop->GetCalib("PHOTON_BEAM/RF/beam_period", locBeamPeriodVector))
308 throw runtime_error("Could not load CCDB table: PHOTON_BEAM/RF/beam_period");
309 double locBeamBunchPeriod = locBeamPeriodVector[0];
310
311 LockRead();
312 {
313 dTargetCenterZMap[locRunNumber] = locTargetCenterZ;
314 dBeamBunchPeriodMap[locRunNumber] = locBeamBunchPeriod;
315 }
316 UnlockRead();
317 }
318
319 // Get name of data class we're trying to extract
320 string dataClassName = factory->GetDataClassName();
321
322 if (dataClassName == "DPSHit")
323 return Extract_DPSHit(record,
324 dynamic_cast<JFactory<DPSHit>*>(factory), tag);
325
326 if (dataClassName == "DPSTruthHit")
327 return Extract_DPSTruthHit(record,
328 dynamic_cast<JFactory<DPSTruthHit>*>(factory), tag);
329
330 if (dataClassName == "DPSCHit")
331 return Extract_DPSCHit(record,
332 dynamic_cast<JFactory<DPSCHit>*>(factory), tag);
333
334 if (dataClassName == "DPSCTruthHit")
335 return Extract_DPSCTruthHit(record,
336 dynamic_cast<JFactory<DPSCTruthHit>*>(factory), tag);
337
338 if (dataClassName == "DRFTime")
339 return Extract_DRFTime(record,
340 dynamic_cast<JFactory<DRFTime>*>(factory), loop);
341
342 if (dataClassName == "DTAGMHit")
343 return Extract_DTAGMHit(record,
344 dynamic_cast<JFactory<DTAGMHit>*>(factory), tag);
345
346 if (dataClassName == "DTAGHHit")
347 return Extract_DTAGHHit(record,
348 dynamic_cast<JFactory<DTAGHHit>*>(factory), tag);
349
350 if (dataClassName == "DMCTrackHit")
351 return Extract_DMCTrackHit(record,
352 dynamic_cast<JFactory<DMCTrackHit>*>(factory), tag);
353
354 if (dataClassName == "DMCReaction")
355 return Extract_DMCReaction(record,
356 dynamic_cast<JFactory<DMCReaction>*>(factory), tag, loop);
357
358 if (dataClassName == "DMCThrown")
359 return Extract_DMCThrown(record,
360 dynamic_cast<JFactory<DMCThrown>*>(factory), tag);
361
362 if (dataClassName == "DBCALTruthShower")
363 return Extract_DBCALTruthShower(record,
364 dynamic_cast<JFactory<DBCALTruthShower>*>(factory), tag);
365
366 if (dataClassName == "DBCALSiPMSpectrum")
367 return Extract_DBCALSiPMSpectrum(record,
368 dynamic_cast<JFactory<DBCALSiPMSpectrum>*>(factory), tag);
369
370 if (dataClassName == "DBCALTruthCell")
371 return Extract_DBCALTruthCell(record,
372 dynamic_cast<JFactory<DBCALTruthCell>*>(factory), tag);
373
374 if (dataClassName == "DBCALSiPMHit")
375 return Extract_DBCALSiPMHit(record,
376 dynamic_cast<JFactory<DBCALSiPMHit>*>(factory), tag);
377
378 if (dataClassName == "DBCALDigiHit")
379 return Extract_DBCALDigiHit(record,
380 dynamic_cast<JFactory<DBCALDigiHit>*>(factory), tag);
381
382 if (dataClassName == "DBCALIncidentParticle")
383 return Extract_DBCALIncidentParticle(record,
384 dynamic_cast<JFactory<DBCALIncidentParticle>*>(factory), tag);
385
386 if (dataClassName == "DBCALTDCDigiHit")
387 return Extract_DBCALTDCDigiHit(record,
388 dynamic_cast<JFactory<DBCALTDCDigiHit>*>(factory), tag);
389
390 if (dataClassName == "DCDCHit")
391 return Extract_DCDCHit(loop, record,
392 dynamic_cast<JFactory<DCDCHit>*>(factory) , tag);
393
394 if (dataClassName == "DFDCHit")
395 return Extract_DFDCHit(record,
396 dynamic_cast<JFactory<DFDCHit>*>(factory), tag);
397
398 if (dataClassName == "DFCALTruthShower")
399 return Extract_DFCALTruthShower(record,
400 dynamic_cast<JFactory<DFCALTruthShower>*>(factory), tag);
401
402 if (dataClassName == "DFCALHit")
403 return Extract_DFCALHit(record,
404 dynamic_cast<JFactory<DFCALHit>*>(factory), tag,
405 event.GetJEventLoop());
406
407 if (dataClassName == "DCCALTruthShower")
408 return Extract_DCCALTruthShower(record,
409 dynamic_cast<JFactory<DCCALTruthShower>*>(factory), tag);
410
411 if (dataClassName == "DCCALHit")
412 return Extract_DCCALHit(record,
413 dynamic_cast<JFactory<DCCALHit>*>(factory), tag,
414 event.GetJEventLoop());
415
416 if (dataClassName == "DMCTrajectoryPoint" && tag == "")
417 return Extract_DMCTrajectoryPoint(record,
418 dynamic_cast<JFactory<DMCTrajectoryPoint>*>(factory), tag);
419
420 if (dataClassName == "DTOFTruth")
421 return Extract_DTOFTruth(record,
422 dynamic_cast<JFactory<DTOFTruth>*>(factory), tag);
423
424 // TOF is a special case: TWO factories are needed at the same time
425 // DTOFHit and DTOFHitMC
426 if (dataClassName == "DTOFHit") {
427 JFactory_base* factory2 = loop->GetFactory("DTOFHitMC", tag.c_str());
428 return Extract_DTOFHit(record,
429 dynamic_cast<JFactory<DTOFHit>*>(factory),
430 dynamic_cast<JFactory<DTOFHitMC>*>(factory2), tag);
431 }
432 if (dataClassName == "DTOFHitMC") {
433 JFactory_base* factory2 = loop->GetFactory("DTOFHit", tag.c_str());
434 return Extract_DTOFHit(record,
435 dynamic_cast<JFactory<DTOFHit>*>(factory2),
436 dynamic_cast<JFactory<DTOFHitMC>*>(factory), tag);
437 }
438
439 if (dataClassName == "DSCHit")
440 return Extract_DSCHit(record,
441 dynamic_cast<JFactory<DSCHit>*>(factory), tag);
442
443 if (dataClassName == "DSCTruthHit")
444 return Extract_DSCTruthHit(record,
445 dynamic_cast<JFactory<DSCTruthHit>*>(factory), tag);
446
447 if (dataClassName == "DFMWPCTruthHit")
448 return Extract_DFMWPCTruthHit(record,
449 dynamic_cast<JFactory<DFMWPCTruthHit>*>(factory), tag);
450
451 if (dataClassName == "DFMWPCTruth")
452 return Extract_DFMWPCTruth(record,
453 dynamic_cast<JFactory<DFMWPCTruth>*>(factory), tag);
454
455 if (dataClassName == "DFMWPCHit")
456 return Extract_DFMWPCHit(record,
457 dynamic_cast<JFactory<DFMWPCHit>*>(factory), tag);
458
459 if (dataClassName == "DCTOFTruth")
460 return Extract_DCTOFTruth(record,
461 dynamic_cast<JFactory<DCTOFTruth>*>(factory), tag);
462
463 if (dataClassName == "DCTOFHit")
464 return Extract_DCTOFHit(record,
465 dynamic_cast<JFactory<DCTOFHit>*>(factory), tag);
466
467 if (dataClassName == "DDIRCTruthBarHit")
468 return Extract_DDIRCTruthBarHit(record,
469 dynamic_cast<JFactory<DDIRCTruthBarHit>*>(factory), tag);
470
471 if (dataClassName == "DDIRCTruthPmtHit")
472 return Extract_DDIRCTruthPmtHit(record,
473 dynamic_cast<JFactory<DDIRCTruthPmtHit>*>(factory), tag);
474
475 if (dataClassName == "DDIRCPmtHit")
476 return Extract_DDIRCPmtHit(record,
477 dynamic_cast<JFactory<DDIRCPmtHit>*>(factory), tag, event.GetJEventLoop());
478
479 // extract CereTruth and CereRichHit hits, yqiang Oct 3, 2012
480 // removed CereTruth (merged into MCThrown), added CereHit, yqiang Oct 10 2012
481 if (dataClassName == "DCereHit")
482 return Extract_DCereHit(record,
483 dynamic_cast<JFactory<DCereHit>*>(factory), tag);
484
485 if (dataClassName == "DTPOLHit")
486 return Extract_DTPOLHit(record,
487 dynamic_cast<JFactory<DTPOLHit>*>(factory), tag);
488
489 if (dataClassName == "DTPOLTruthHit")
490 return Extract_DTPOLTruthHit(record,
491 dynamic_cast<JFactory<DTPOLTruthHit>*>(factory), tag);
492
493 return OBJECT_NOT_AVAILABLE;
494}
495
496//------------------
497// Extract_DRFTime
498//------------------
499jerror_t DEventSourceHDDM::Extract_DRFTime(hddm_s::HDDM *record,
500 JFactory<DRFTime> *factory, JEventLoop* locEventLoop)
501{
502 if (factory==NULL__null)
503 return OBJECT_NOT_AVAILABLE;
504 string tag = (factory->Tag())? factory->Tag() : "";
505
506 vector<DRFTime*> locRFTimes;
507
508 // loop over RF-time records
509 const hddm_s::RFtimeList &rftimes = record->getRFtimes();
510 hddm_s::RFtimeList::iterator iter;
511 for (iter = rftimes.begin(); iter != rftimes.end(); ++iter)
512 {
513 if (iter->getJtag() != tag)
514 continue;
515 DRFTime *locRFTime = new DRFTime;
516 locRFTime->dTime = iter->getTsync();
517 locRFTime->dTimeVariance = 0.0; //SET ME!!
518 locRFTimes.push_back(locRFTime);
519 }
520
521 if(!locRFTimes.empty())
522 {
523 //found in the file, copy into factory and return
524 factory->CopyTo(locRFTimes);
525 return NOERROR;
526 }
527
528 //Not found in the file, so either:
529 //Experimental data & it's missing: bail
530 //MC data: generate it
531
532 vector<const DBeamPhoton*> locMCGENPhotons;
533 locEventLoop->Get(locMCGENPhotons, "MCGEN");
534 if(locMCGENPhotons.empty())
535 return OBJECT_NOT_AVAILABLE; //Experimental data & it's missing: bail
536
537 //Is MC data. Either:
538 //No tag: return t = 0.0, but true t is 0.0 +/- n*locBeamBunchPeriod: must select the correct beam bunch
539 //TRUTH tag: get exact t from DBeamPhoton tag MCGEN
540
541 if(tag == "TRUTH")
542 {
543 DRFTime *locRFTime = new DRFTime;
544 locRFTime->dTime = locMCGENPhotons[0]->time();
545 locRFTime->dTimeVariance = 0.0;
546 locRFTimes.push_back(locRFTime);
547 }
548 else
549 {
550 double locBeamBunchPeriod = 0.0;
551 int locRunNumber = locEventLoop->GetJEvent().GetRunNumber();
552 LockRead();
553 {
554 locBeamBunchPeriod = dBeamBunchPeriodMap[locRunNumber];
555 }
556 UnlockRead();
557
558 //start with true RF time, increment/decrement by multiples of locBeamBunchPeriod ns until closest to 0
559 double locTime = locMCGENPhotons[0]->time();
560 int locNumRFBuckets = int(locTime/locBeamBunchPeriod);
561 locTime -= double(locNumRFBuckets)*locBeamBunchPeriod;
562 while(locTime > 0.5*locBeamBunchPeriod)
563 locTime -= locBeamBunchPeriod;
564 while(locTime < -0.5*locBeamBunchPeriod)
565 locTime += locBeamBunchPeriod;
566
567 DRFTime *locRFTime = new DRFTime;
568 locRFTime->dTime = locTime;
569 locRFTime->dTimeVariance = 0.0;
570 locRFTimes.push_back(locRFTime);
571 }
572
573 // Copy into factories
574 factory->CopyTo(locRFTimes);
575
576 return NOERROR;
577}
578
579//------------------
580// Extract_DMCTrackHit
581//------------------
582jerror_t DEventSourceHDDM::Extract_DMCTrackHit(hddm_s::HDDM *record,
583 JFactory<DMCTrackHit> *factory, string tag)
584{
585 /// Copies the data from the given hddm_s structure. This is called
586 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
587 /// returns OBJECT_NOT_AVAILABLE immediately.
588
589 if (factory == NULL__null)
590 return OBJECT_NOT_AVAILABLE;
591 if (tag != "")
592 return OBJECT_NOT_AVAILABLE;
593
594 // The following routines will create DMCTrackHit objects and add them
595 // to data.
596 vector<DMCTrackHit*> data;
597 GetCDCTruthHits(record, data);
598 GetFDCTruthHits(record, data);
599 GetBCALTruthHits(record, data);
600 GetTOFTruthHits(record, data);
601 GetCherenkovTruthHits(record, data);
602 GetFCALTruthHits(record, data);
603 GetSCTruthHits(record, data);
604
605 // It has happened that some CDC hits have "nan" for the drift time
606 // in a peculiar event Alex Somov came across. This ultimately caused
607 // a seg. fault in MCTrackHitSort_C. I hate doing this since it
608 // is treating the symptom rather than the cause, but nonetheless,
609 // it patches up the problem for now until there is time to revisit
610 // it later.
611 for (unsigned int i=0; i < data.size(); i++)
612 if (!isfinite(data[i]->z))
613 data[i]->z = -1000.0;
614
615 // sort hits by z
616 sort(data.begin(), data.end(), MCTrackHitSort_C);
617
618 // Some systems will use negative phis. Force them all to
619 // be in the 0 to 2pi range
620 for (unsigned int i=0; i < data.size(); i++) {
621 DMCTrackHit *mctrackhit = data[i];
622 if (mctrackhit->phi < 0.0)
623 mctrackhit->phi += 2.0*M_PI3.14159265358979323846;
624 }
625
626 // Copy into factory
627 factory->CopyTo(data);
628
629 return NOERROR;
630}
631
632//-------------------
633// GetCDCTruthHits
634//-------------------
635jerror_t DEventSourceHDDM::GetCDCTruthHits(hddm_s::HDDM *record,
636 vector<DMCTrackHit*>& data)
637{
638 const hddm_s::CdcTruthPointList &points = record->getCdcTruthPoints();
639 hddm_s::CdcTruthPointList::iterator iter;
640 for (iter = points.begin(); iter != points.end(); ++iter) {
641 DMCTrackHit *mctrackhit = new DMCTrackHit;
642 mctrackhit->r = iter->getR();
643 mctrackhit->phi = iter->getPhi();
644 mctrackhit->z = iter->getZ();
645 mctrackhit->track = iter->getTrack();
646 mctrackhit->primary = iter->getPrimary();
647 mctrackhit->ptype = iter->getPtype();
648 mctrackhit->system = SYS_CDC;
649 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
650 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
651 data.push_back(mctrackhit);
652 }
653
654 return NOERROR;
655}
656
657//-------------------
658// GetFDCTruthHits
659//-------------------
660jerror_t DEventSourceHDDM::GetFDCTruthHits(hddm_s::HDDM *record,
661 vector<DMCTrackHit*>& data)
662{
663 const hddm_s::FdcTruthPointList &points = record->getFdcTruthPoints();
664 hddm_s::FdcTruthPointList::iterator iter;
665 for (iter = points.begin(); iter != points.end(); ++iter) {
666 float x = iter->getX();
667 float y = iter->getY();
668 DMCTrackHit *mctrackhit = new DMCTrackHit;
669 mctrackhit->r = sqrt(x*x + y*y);
670 mctrackhit->phi = atan2(y,x);
671 mctrackhit->z = iter->getZ();
672 mctrackhit->track = iter->getTrack();
673 mctrackhit->primary = iter->getPrimary();
674 mctrackhit->ptype = iter->getPtype();
675 mctrackhit->system = SYS_FDC;
676 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
677 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
678 data.push_back(mctrackhit);
679 }
680
681 return NOERROR;
682}
683
684//-------------------
685// GetBCALTruthHits
686//-------------------
687jerror_t DEventSourceHDDM::GetBCALTruthHits(hddm_s::HDDM *record,
688 vector<DMCTrackHit*>& data)
689{
690 const hddm_s::BcalTruthShowerList &showers = record->getBcalTruthShowers();
691 hddm_s::BcalTruthShowerList::iterator iter;
692 for (iter = showers.begin(); iter != showers.end(); ++iter) {
693 DMCTrackHit *mctrackhit = new DMCTrackHit;
694 mctrackhit->r = iter->getR();
695 mctrackhit->phi = iter->getPhi();
696 mctrackhit->z = iter->getZ();
697 mctrackhit->track = iter->getTrack();
698 mctrackhit->primary = iter->getPrimary();
699 mctrackhit->ptype = iter->getPtype();
700 mctrackhit->system = SYS_BCAL;
701 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
702 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
703 data.push_back(mctrackhit);
704 }
705
706 return NOERROR;
707}
708
709//-------------------
710// GetTOFTruthHits
711//-------------------
712jerror_t DEventSourceHDDM::GetTOFTruthHits(hddm_s::HDDM *record,
713 vector<DMCTrackHit*>& data)
714{
715 const hddm_s::FtofTruthPointList &points = record->getFtofTruthPoints();
716 hddm_s::FtofTruthPointList::iterator iter;
717 for (iter = points.begin(); iter != points.end(); ++iter) {
718 float x = iter->getX();
719 float y = iter->getY();
720 DMCTrackHit *mctrackhit = new DMCTrackHit;
721 mctrackhit->r = sqrt(x*x + y*y);
722 mctrackhit->phi = atan2(y,x);
723 mctrackhit->z = iter->getZ();
724 mctrackhit->track = iter->getTrack();
725 mctrackhit->primary = iter->getPrimary();
726 mctrackhit->ptype = iter->getPtype(); // save GEANT particle type
727 mctrackhit->system = SYS_TOF;
728 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
729 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
730 data.push_back(mctrackhit);
731 }
732
733 return NOERROR;
734}
735
736//-------------------
737// GetCherenkovTruthHits
738// modified by yqiang, Oct 10 2012
739//-------------------
740jerror_t DEventSourceHDDM::GetCherenkovTruthHits(hddm_s::HDDM *record,
741 vector<DMCTrackHit*>& data)
742{
743 const hddm_s::CereTruthPointList &points = record->getCereTruthPoints();
744 hddm_s::CereTruthPointList::iterator iter;
745 for (iter = points.begin(); iter != points.end(); ++iter) {
746 float x = iter->getX();
747 float y = iter->getY();
748 DMCTrackHit *mctrackhit = new DMCTrackHit;
749 mctrackhit->r = sqrt(x*x + y*y);
750 mctrackhit->phi = atan2(y,x);
751 mctrackhit->z = iter->getZ();
752 mctrackhit->track = iter->getTrack();
753 mctrackhit->primary = iter->getPrimary();
754 mctrackhit->ptype = iter->getPtype(); // save GEANT particle typ()e
755 mctrackhit->system = SYS_CHERENKOV;
756 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
757 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
758 data.push_back(mctrackhit);
759 }
760
761 return NOERROR;
762}
763
764//-------------------
765// GetFCALTruthHits
766//-------------------
767jerror_t DEventSourceHDDM::GetFCALTruthHits(hddm_s::HDDM *record,
768 vector<DMCTrackHit*>& data)
769{
770 const hddm_s::FcalTruthShowerList &points = record->getFcalTruthShowers();
771 hddm_s::FcalTruthShowerList::iterator iter;
772 for (iter = points.begin(); iter != points.end(); ++iter) {
773 float x = iter->getX();
774 float y = iter->getY();
775 DMCTrackHit *mctrackhit = new DMCTrackHit;
776 mctrackhit->r = sqrt(x*x + y*y);
777 mctrackhit->phi = atan2(y,x);
778 mctrackhit->z = iter->getZ();
779 mctrackhit->track = iter->getTrack();
780 mctrackhit->primary = iter->getPrimary();
781 mctrackhit->ptype = iter->getPtype();
782 mctrackhit->system = SYS_FCAL;
783 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
784 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
785 data.push_back(mctrackhit);
786 }
787
788 return NOERROR;
789}
790
791//-------------------
792// GetCCALTruthHits
793//-------------------
794jerror_t DEventSourceHDDM::GetCCALTruthHits(hddm_s::HDDM *record,
795 vector<DMCTrackHit*>& data)
796{
797 const hddm_s::CcalTruthShowerList &points = record->getCcalTruthShowers();
798 hddm_s::CcalTruthShowerList::iterator iter;
799 for (iter = points.begin(); iter != points.end(); ++iter) {
800 float x = iter->getX();
801 float y = iter->getY();
802 DMCTrackHit *mctrackhit = new DMCTrackHit;
803 mctrackhit->r = sqrt(x*x + y*y);
804 mctrackhit->phi = atan2(y,x);
805 mctrackhit->z = iter->getZ();
806 mctrackhit->track = iter->getTrack();
807 mctrackhit->primary = iter->getPrimary();
808 mctrackhit->ptype = iter->getPtype();
809 mctrackhit->system = SYS_CCAL;
810 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
811 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
812 data.push_back(mctrackhit);
813 }
814
815 return NOERROR;
816}
817
818
819//-------------------
820// GetSCTruthHits
821//-------------------
822jerror_t DEventSourceHDDM::GetSCTruthHits(hddm_s::HDDM *record,
823 vector<DMCTrackHit*>& data)
824{
825 const hddm_s::StcTruthPointList &points = record->getStcTruthPoints();
826 hddm_s::StcTruthPointList::iterator iter;
827 for (iter = points.begin(); iter != points.end(); ++iter) {
828 DMCTrackHit *mctrackhit = new DMCTrackHit;
829 mctrackhit->r = iter->getR();
830 mctrackhit->phi = iter->getPhi();
831 mctrackhit->z = iter->getZ();
832 mctrackhit->track = iter->getTrack();
833 mctrackhit->primary = iter->getPrimary();
834 mctrackhit->ptype = iter->getPtype(); // save GEANT particle type
835 mctrackhit->system = SYS_START;
836 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
837 mctrackhit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
838 data.push_back(mctrackhit);
839 }
840
841 return NOERROR;
842}
843
844//------------------
845// Extract_DBCALSiPMHit
846//------------------
847jerror_t DEventSourceHDDM::Extract_DBCALSiPMHit(hddm_s::HDDM *record,
848 JFactory<DBCALSiPMHit> *factory, string tag)
849{
850 /// Copies the data from the given hddm_s structure. This is called
851 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
852 /// returns OBJECT_NOT_AVAILABLE immediately.
853
854 if (factory == NULL__null)
855 return OBJECT_NOT_AVAILABLE;
856 if (tag != "")
857 return OBJECT_NOT_AVAILABLE;
858
859 vector<DBCALSiPMHit*> data;
860
861 const hddm_s::BcalSiPMUpHitList &uphits = record->getBcalSiPMUpHits();
862 hddm_s::BcalSiPMUpHitList::iterator uiter;
863 for (uiter = uphits.begin(); uiter != uphits.end(); ++uiter) {
864 DBCALSiPMHit *response = new DBCALSiPMHit;
865 response->module = uiter->getModule();
866 response->layer = uiter->getLayer();
867 response->sector = uiter->getSector();
868 response->E = uiter->getE();
869 response->t = uiter->getT();
870 response->end = DBCALGeometry::kUpstream;
871 response->cellId = dBCALGeom->cellId(uiter->getModule(),
872 uiter->getLayer(),
873 uiter->getSector());
874 data.push_back(response);
875 }
876
877 const hddm_s::BcalSiPMDownHitList &downhits = record->getBcalSiPMDownHits();
878 hddm_s::BcalSiPMDownHitList::iterator diter;
879 for (diter = downhits.begin(); diter != downhits.end(); ++diter) {
880 DBCALSiPMHit *response = new DBCALSiPMHit;
881 response->module = diter->getModule();
882 response->layer = diter->getLayer();
883 response->sector = diter->getSector();
884 response->E = diter->getE();
885 response->t = diter->getT();
886 response->end = DBCALGeometry::kDownstream;
887 response->cellId = dBCALGeom->cellId(diter->getModule(),
888 diter->getLayer(),
889 diter->getSector());
890 data.push_back(response);
891 }
892
893 // Copy into factory
894 factory->CopyTo(data);
895
896 return NOERROR;
897}
898
899//------------------
900// Extract_DBCALDigiHit
901//------------------
902jerror_t DEventSourceHDDM::Extract_DBCALDigiHit(hddm_s::HDDM *record,
903 JFactory<DBCALDigiHit> *factory, string tag)
904{
905 /// Copies the data from the given hddm_s structure. This is called
906 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
907 /// returns OBJECT_NOT_AVAILABLE immediately.
908
909 if (factory == NULL__null)
910 return OBJECT_NOT_AVAILABLE;
911 if (tag != "")
912 return OBJECT_NOT_AVAILABLE;
913
914 vector<DBCALDigiHit*> data;
915
916 const hddm_s::BcalfADCDigiHitList &digihits = record->getBcalfADCDigiHits();
917 hddm_s::BcalfADCDigiHitList::iterator iter;
918 for (iter = digihits.begin(); iter != digihits.end(); ++iter) {
919 DBCALDigiHit *response = new DBCALDigiHit;
920 response->module = iter->getModule();
921 response->layer = iter->getLayer();
922 response->sector = iter->getSector();
923 response->pulse_integral = (uint32_t)iter->getPulse_integral();
924 response->pulse_peak = 0;
925 if(iter->getBcalfADCPeaks().size() > 0) {
926 response->pulse_peak = iter->getBcalfADCPeak().getPeakAmp();
927 }
928 response->pulse_time = (uint32_t)iter->getPulse_time();
929 response->pedestal = 1;
930 response->QF = 1;
931 response->nsamples_integral = 1;
932 response->nsamples_pedestal = 1;
933 response->datasource = 3;
934 response->end = (iter->getEnd() == 0)? DBCALGeometry::kUpstream :
935 DBCALGeometry::kDownstream;
936 data.push_back(response);
937 }
938
939 // Copy into factory
940 factory->CopyTo(data);
941
942 return NOERROR;
943}
944
945//------------------
946// Extract_DBCALIncidentParticle
947//------------------
948jerror_t DEventSourceHDDM::Extract_DBCALIncidentParticle(hddm_s::HDDM *record,
949 JFactory<DBCALIncidentParticle> *factory,
950 string tag)
951{
952 /// Copies the data from the given hddm_s structure. This is called
953 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
954 /// returns OBJECT_NOT_AVAILABLE immediately.
955
956 if (factory == NULL__null)
957 return OBJECT_NOT_AVAILABLE;
958 if (tag != "")
959 return OBJECT_NOT_AVAILABLE;
960
961 vector<DBCALIncidentParticle*> data;
962
963 const hddm_s::BcalTruthIncidentParticleList &plist =
964 record->getBcalTruthIncidentParticles();
965 hddm_s::BcalTruthIncidentParticleList::iterator iter;
966 for (iter = plist.begin(); iter != plist.end(); ++iter) {
967 DBCALIncidentParticle *part = new DBCALIncidentParticle;
968 part->ptype = iter->getPtype();
969 part->px = iter->getPx();
970 part->py = iter->getPy();
971 part->pz = iter->getPz();
972 part->x = iter->getX();
973 part->y = iter->getY();
974 part->z = iter->getZ();
975 data.push_back(part);
976 }
977
978 factory->CopyTo(data);
979
980 return NOERROR;
981}
982
983//------------------
984// Extract_DBCALSiPMSpectrum
985//------------------
986jerror_t DEventSourceHDDM::Extract_DBCALSiPMSpectrum(hddm_s::HDDM *record,
987 JFactory<DBCALSiPMSpectrum> *factory,
988 string tag)
989{
990 /// Copies the data from the given hddm_s structure. This is called
991 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
992 /// returns OBJECT_NOT_AVAILABLE immediately.
993
994 if (factory == NULL__null)
995 return OBJECT_NOT_AVAILABLE;
996 if (tag != "" && tag != "TRUTH")
997 return OBJECT_NOT_AVAILABLE;
998
999 vector<DBCALSiPMSpectrum*> data;
1000
1001 const hddm_s::BcalSiPMSpectrumList &specs = record->getBcalSiPMSpectrums();
1002 hddm_s::BcalSiPMSpectrumList::iterator iter;
1003 for (iter = specs.begin(); iter != specs.end(); ++iter) {
1004 DBCALSiPMSpectrum *dana_spectrum = new DBCALSiPMSpectrum;
1005 dana_spectrum->module = iter->getModule();
1006 dana_spectrum->layer = iter->getLayer();
1007 dana_spectrum->sector = iter->getSector();
1008 dana_spectrum->end = (iter->getEnd()==0)?
1009 DBCALGeometry::kUpstream :
1010 DBCALGeometry::kDownstream;
1011 if (tag == "")
1012 dana_spectrum->incident_id = 0;
1013 else if (tag == "TRUTH") {
1014 const hddm_s::BcalSiPMTruthList &truths = iter->getBcalSiPMTruths();
1015 if (truths.size() > 0)
1016 dana_spectrum->incident_id = truths.begin()->getIncident_id();
1017 else
1018 dana_spectrum->incident_id = 0;
1019 }
1020
1021 double t = iter->getTstart();
1022 double bin_width = iter->getBin_width();
1023 stringstream ss(iter->getVals());
1024
1025 // Extract values and use them to fill histo
1026 string entry;
1027 while (ss >> entry) {
1028 if (entry[0] == 'X') {
1029 // get rid of the X, the rest of the entry is the number of zeroes to add
1030 stringstream sss(entry.substr(1));
1031 int num_zeros;
1032 sss >> num_zeros;
1033
1034 for(int i=0; i<num_zeros; i++) {
1035 dana_spectrum->spectrum.Fill(t, 0.0);
1036 t += bin_width;
1037 }
1038 } else {
1039 stringstream sss(entry);
1040 double dE;
1041 sss >> dE;
1042 dana_spectrum->spectrum.Fill(t, dE);
1043 t += bin_width;
1044 }
1045 }
1046
1047 data.push_back(dana_spectrum);
1048 }
1049
1050 // Copy into factory
1051 factory->CopyTo(data);
1052
1053 return NOERROR;
1054}
1055
1056//------------------
1057// Extract_DBCALTDCDigiHit
1058//------------------
1059jerror_t DEventSourceHDDM::Extract_DBCALTDCDigiHit(hddm_s::HDDM *record,
1060 JFactory<DBCALTDCDigiHit> *factory, string tag)
1061{
1062 /// Copies the data from the given hddm_s structure. This is called
1063 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1064 /// returns OBJECT_NOT_AVAILABLE immediately.
1065
1066 if (factory == NULL__null)
1067 return OBJECT_NOT_AVAILABLE;
1068 if (tag != "")
1069 return OBJECT_NOT_AVAILABLE;
1070
1071 vector<DBCALTDCDigiHit*> data;
1072
1073 const hddm_s::BcalTDCDigiHitList &hits = record->getBcalTDCDigiHits();
1074 hddm_s::BcalTDCDigiHitList::iterator iter;
1075 for (iter = hits.begin(); iter != hits.end(); ++iter) {
1076 DBCALTDCDigiHit *bcaltdchit = new DBCALTDCDigiHit;
1077 bcaltdchit->module = iter->getModule();
1078 bcaltdchit->layer = iter->getLayer();
1079 bcaltdchit->sector = iter->getSector();
1080 bcaltdchit->end = (iter->getEnd() == 0)? DBCALGeometry::kUpstream :
1081 DBCALGeometry::kDownstream;
1082 bcaltdchit->time = (uint32_t)iter->getTime();
1083 data.push_back(bcaltdchit);
1084 }
1085
1086 // Copy into factory
1087 factory->CopyTo(data);
1088
1089 return NOERROR;
1090}
1091
1092//------------------
1093// Extract_DMCReaction
1094//------------------
1095jerror_t DEventSourceHDDM::Extract_DMCReaction(hddm_s::HDDM *record,
1096 JFactory<DMCReaction> *factory, string tag,
1097 JEventLoop *loop)
1098{
1099 /// Copies the data from the given hddm_s structure. This is called
1100 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1101 /// returns OBJECT_NOT_AVAILABLE immediately.
1102
1103 if (tag != "")
1104 return OBJECT_NOT_AVAILABLE;
1105
1106 if (factory == NULL__null)
1107 return OBJECT_NOT_AVAILABLE;
1108
1109 double locTargetCenterZ = 0.0;
1110 int locRunNumber = loop->GetJEvent().GetRunNumber();
1111 LockRead();
1112 {
1113 locTargetCenterZ = dTargetCenterZMap[locRunNumber];
1114 }
1115 UnlockRead();
1116 DVector3 locPosition(0.0, 0.0, locTargetCenterZ);
1117
1118 vector<DMCReaction*> dmcreactions;
1119
1120 const hddm_s::ReactionList &reacts = record->getReactions();
1121 hddm_s::ReactionList::iterator iter;
1122 for (iter = reacts.begin(); iter != reacts.end(); ++iter) {
1123 DMCReaction *mcreaction = new DMCReaction;
1124 dmcreactions.push_back(mcreaction);
1125 mcreaction->type = iter->getType();
1126 mcreaction->weight = iter->getWeight();
1127 hddm_s::Origin &origin = iter->getVertex().getOrigin();
1128 double torig = origin.getT();
1129 double zorig = origin.getVz();
1130
1131 const hddm_s::BeamList &beams = record->getBeams();
1132 if (beams.size() > 0) {
1133 hddm_s::Beam &beam = iter->getBeam();
1134 DVector3 mom(beam.getMomentum().getPx(),
1135 beam.getMomentum().getPy(),
1136 beam.getMomentum().getPz());
1137 mcreaction->beam.setPosition(locPosition);
1138 mcreaction->beam.setMomentum(mom);
1139 mcreaction->beam.setPID(Gamma);
1140 mcreaction->target.setPID(IDTrack(mcreaction->beam.charge(),
1141 mcreaction->beam.mass()));
1142 mcreaction->beam.setTime(torig - (zorig - locTargetCenterZ)/29.9792458);
1143 }
1144 else {
1145 // fake values for DMCReaction
1146 mcreaction->beam.setPosition(locPosition);
1147 mcreaction->beam.setPID(Gamma);
1148 }
1149
1150 const hddm_s::TargetList &targets = record->getTargets();
1151 if (targets.size() > 0) {
1152 hddm_s::Target &target = iter->getTarget();
1153 DKinematicData target_kd;
1154 DVector3 mom(target.getMomentum().getPx(),
1155 target.getMomentum().getPy(),
1156 target.getMomentum().getPz());
1157 mcreaction->target.setPosition(locPosition);
1158 mcreaction->target.setMomentum(mom);
1159 mcreaction->target.setPID(IDTrack(target.getProperties().getCharge(),
1160 target.getProperties().getMass()));
1161 mcreaction->target.setTime(torig - (zorig - locTargetCenterZ)/29.9792458);
1162 }
1163 else {
1164 // fake values for DMCReaction
1165 mcreaction->target.setPosition(locPosition);
1166 }
1167 }
1168
1169 // Copy into factories
1170 //_DBG_<<"Creating "<<dmcreactions.size()<<" DMCReaction objects"<<endl;
1171
1172 factory->CopyTo(dmcreactions);
1173
1174 return NOERROR;
1175}
1176
1177//------------------
1178// Extract_DMCThrown
1179//------------------
1180jerror_t DEventSourceHDDM::Extract_DMCThrown(hddm_s::HDDM *record,
1181 JFactory<DMCThrown> *factory, string tag)
1182{
1183 /// Copies the data from the given hddm_s structure. This is called
1184 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1185 /// returns OBJECT_NOT_AVAILABLE immediately.
1186
1187 if (factory == NULL__null)
1188 return OBJECT_NOT_AVAILABLE;
1189 if (tag != "")
1190 return OBJECT_NOT_AVAILABLE;
1191
1192 vector<DMCThrown*> data;
1193
1194 const hddm_s::VertexList &verts = record->getVertices();
1195 hddm_s::VertexList::iterator iter;
1196 for (iter = verts.begin(); iter != verts.end(); ++iter) {
1197 const hddm_s::OriginList &origs = iter->getOrigins();
1198 const hddm_s::ProductList &prods = iter->getProducts();
1199 double vertex[4] = {0., 0., 0., 0.};
1200 if (origs.size() > 0) {
1201 vertex[0] = iter->getOrigin().getT();
1202 vertex[1] = iter->getOrigin().getVx();
1203 vertex[2] = iter->getOrigin().getVy();
1204 vertex[3] = iter->getOrigin().getVz();
1205 }
1206 hddm_s::ProductList::iterator piter;
1207 for (piter = prods.begin(); piter != prods.end(); ++piter) {
1208 double E = piter->getMomentum().getE();
1209 double px = piter->getMomentum().getPx();
1210 double py = piter->getMomentum().getPy();
1211 double pz = piter->getMomentum().getPz();
1212 double mass = sqrt(E*E - (px*px + py*py + pz*pz));
1213 if (!isfinite(mass))
1214 mass = 0.0;
Value stored to 'mass' is never read
1215 DMCThrown *mcthrown = new DMCThrown;
1216 mcthrown->type = piter->getType();
1217 mcthrown->myid = piter->getId();
1218 mcthrown->parentid = piter->getParentid();
1219 mcthrown->mech = piter->getMech();
1220 mcthrown->pdgtype = piter->getPdgtype();
1221 mcthrown->setPID((Particle_t)mcthrown->type);
1222 mcthrown->setMomentum(DVector3(px, py, pz));
1223 mcthrown->setPosition(DVector3(vertex[1], vertex[2], vertex[3]));
1224 mcthrown->setTime(vertex[0]);
1225 data.push_back(mcthrown);
1226 }
1227 }
1228
1229 // Copy into factory
1230 factory->CopyTo(data);
1231
1232 return NOERROR;
1233}
1234
1235//------------------
1236// Extract_DCDCHit
1237//------------------
1238jerror_t DEventSourceHDDM::Extract_DCDCHit(JEventLoop* locEventLoop, hddm_s::HDDM *record,
1239 JFactory<DCDCHit> *factory, string tag)
1240{
1241 /// Copies the data from the given hddm_s structure. This is called
1242 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1243 /// returns OBJECT_NOT_AVAILABLE immediately.
1244
1245 if (factory == NULL__null)
1246 return OBJECT_NOT_AVAILABLE;
1247
1248 // Since we are writing out CDC hits with the new "Calib" tag by default
1249 // assume that is what we are reading in, so that we don't support the
1250 // default tag anymore
1251 // sdobbs -- 3/13/2018
1252 //if (tag != "" && tag != "TRUTH" && tag != "Calib")
1253 if (tag != "TRUTH" && tag != "Calib")
1254 return OBJECT_NOT_AVAILABLE;
1255
1256 vector<DCDCHit*> data;
1257
1258 if ( tag == "" || tag == "Calib" ) {
1259 vector<const DCDCHit*> locTruthHits;
1260 locEventLoop->Get(locTruthHits, "TRUTH");
1261
1262 //pre-sort truth hits
1263 map<pair<int, int>, vector<const DCDCHit*>> locTruthHitMap; //key pair: ring, straw
1264 for(auto& locTruthHit : locTruthHits)
1265 locTruthHitMap[std::make_pair(locTruthHit->ring, locTruthHit->straw)].push_back(locTruthHit);
1266
1267 const hddm_s::CdcStrawHitList &hits = record->getCdcStrawHits();
1268 hddm_s::CdcStrawHitList::iterator iter;
1269 int locIndex = 0;
1270 for (iter = hits.begin(); iter != hits.end(); ++iter) {
1271 DCDCHit *hit = new DCDCHit;
1272 hit->ring = iter->getRing();
1273 hit->straw = iter->getStraw();
1274 hit->q = iter->getQ();
1275 hit->t = iter->getT();
1276 if(iter->getCdcDigihits().size() > 0) {
1277 hit->amp = iter->getCdcDigihit().getPeakAmp();
1278 }
1279 else{
1280 // for generated events (not folded-in background events) for which we
1281 // have no digi hits return q
1282 hit->amp=hit->q;
1283 }
1284 hit->QF = 0;
1285 if(iter->getCdcHitQFs().size() > 0) {
1286 hit->QF = iter->getCdcHitQF().getQF();
1287 }
1288 hit->d = 0.; // initialize to zero to avoid any NaN
1289 hit->itrack = 0; // track information is in TRUTH tag
1290 hit->ptype = 0; // ditto
1291
1292 //match hit between truth & recon
1293 auto& locPotentialTruthHits = locTruthHitMap[std::make_pair(hit->ring, hit->straw)];
1294 double locBestDeltaT = 9.9E99;
1295 const DCDCHit* locBestTruthHit = nullptr;
1296 for(auto& locTruthHit : locPotentialTruthHits)
1297 {
1298 auto locDeltaT = fabs(hit->t - locTruthHit->t);
1299 if(locDeltaT >= locBestDeltaT)
1300 continue;
1301 locBestDeltaT = locDeltaT;
1302 locBestTruthHit = locTruthHit;
1303 }
1304 if(locBestTruthHit != nullptr)
1305 hit->AddAssociatedObject(locBestTruthHit);
1306
1307 data.push_back(hit);
1308 ++locIndex;
1309 }
1310 }
1311 else if (tag == "TRUTH") {
1312 const hddm_s::CdcStrawTruthHitList &thits = record->getCdcStrawTruthHits();
1313 hddm_s::CdcStrawTruthHitList::iterator iter;
1314 for (iter = thits.begin(); iter != thits.end(); ++iter) {
1315 DCDCHit *hit = new DCDCHit;
1316 hit->ring = iter->getRing();
1317 hit->straw = iter->getStraw();
1318 hit->q = iter->getQ();
1319 hit->t = iter->getT();
1320 hit->d = iter->getD();
1321 hit->itrack = iter->getItrack();
1322 hit->ptype = iter->getPtype();
1323 data.push_back(hit);
1324 }
1325 }
1326
1327 // Copy into factory
1328 factory->CopyTo(data);
1329
1330 return NOERROR;
1331}
1332
1333
1334//------------------
1335// Extract_DFDCHit
1336//------------------
1337jerror_t DEventSourceHDDM::Extract_DFDCHit(hddm_s::HDDM *record,
1338 JFactory<DFDCHit> *factory, string tag)
1339{
1340 /// Copies the data from the given hddm_s structure. This is called
1341 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1342 /// returns OBJECT_NOT_AVAILABLE immediately.
1343
1344 if (factory == NULL__null)
1345 return OBJECT_NOT_AVAILABLE;
1346 if (tag != "" && tag != "TRUTH" && tag != "CALIB")
1347 return OBJECT_NOT_AVAILABLE;
1348
1349 vector<DFDCHit*> data;
1350
1351 if (tag == "") {
1352 const hddm_s::FdcAnodeHitList &ahits = record->getFdcAnodeHits();
1353 hddm_s::FdcAnodeHitList::iterator ahiter;
1354 for (ahiter = ahits.begin(); ahiter != ahits.end(); ++ahiter) {
1355 DFDCHit* newHit = new DFDCHit();
1356 newHit->layer = ahiter->getLayer();
1357 newHit->module = ahiter->getModule();
1358 newHit->element = ahiter->getWire();
1359 newHit->q = ahiter->getDE();
1360 newHit->pulse_height = 0.; // not measured
1361 newHit->t = ahiter->getT();
1362 newHit->d = 0.; // initialize to zero to avoid any NaN
1363 newHit->itrack = 0; // track information is in TRUTH tag
1364 newHit->ptype = 0; // ditto
1365 newHit->plane = 2;
1366 newHit->type = 0;
1367 newHit->gPlane = DFDCGeometry::gPlane(newHit);
1368 newHit->gLayer = DFDCGeometry::gLayer(newHit);
1369 newHit->r = DFDCGeometry::getWireR(newHit);
1370 data.push_back(newHit);
1371 }
1372
1373 // Ditto for the cathodes.
1374 const hddm_s::FdcCathodeHitList &chits = record->getFdcCathodeHits();
1375 hddm_s::FdcCathodeHitList::iterator chiter;
1376 for (chiter = chits.begin(); chiter != chits.end(); ++chiter) {
1377 DFDCHit* newHit = new DFDCHit();
1378 newHit->layer = chiter->getLayer();
1379 newHit->module = chiter->getModule();
1380 newHit->element = chiter->getStrip();
1381 if (newHit->element > 1000)
1382 newHit->element -= 1000;
1383 newHit->plane = chiter->getPlane();
1384 newHit->q = chiter->getQ();
1385 newHit->pulse_height = newHit->q;
1386 if(chiter->getFdcDigihits().size() > 0) {
1387 newHit->pulse_height = chiter->getFdcDigihit().getPeakAmp();
1388 }
1389 newHit->t = chiter->getT();
1390 newHit->d = 0.; // initialize to zero to avoid any NaN
1391 newHit->itrack = 0; // track information is in TRUTH tag
1392 newHit->ptype = 0; // ditto
1393 newHit->type = 1;
1394 newHit->gPlane = DFDCGeometry::gPlane(newHit);
1395 newHit->gLayer = DFDCGeometry::gLayer(newHit);
1396 newHit->r = DFDCGeometry::getStripR(newHit);
1397 data.push_back(newHit);
1398 }
1399 }
1400
1401 else if (tag == "TRUTH"){
1402 const hddm_s::FdcAnodeTruthHitList &aths = record->getFdcAnodeTruthHits();
1403 hddm_s::FdcAnodeTruthHitList::iterator atiter;
1404 for (atiter = aths.begin(); atiter != aths.end(); ++atiter) {
1405 DFDCHit* newHit = new DFDCHit();
1406 newHit->layer = atiter->getLayer();
1407 newHit->module = atiter->getModule();
1408 newHit->element = atiter->getWire();
1409 newHit->q = atiter->getDE();
1410 newHit->pulse_height=0.; // not measured
1411 newHit->t = atiter->getT();
1412 newHit->d = atiter->getD();
1413 newHit->itrack = atiter->getItrack();
1414 newHit->ptype = atiter->getPtype();
1415 newHit->plane = 2;
1416 newHit->type = 0;
1417 newHit->gPlane = DFDCGeometry::gPlane(newHit);
1418 newHit->gLayer = DFDCGeometry::gLayer(newHit);
1419 newHit->r = DFDCGeometry::getWireR(newHit);
1420 data.push_back(newHit);
1421 }
1422
1423 // Ditto for the cathodes.
1424 const hddm_s::FdcCathodeTruthHitList &cths =
1425 record->getFdcCathodeTruthHits();
1426 hddm_s::FdcCathodeTruthHitList::iterator ctiter;
1427 for (ctiter = cths.begin(); ctiter != cths.end(); ++ctiter) {
1428 DFDCHit* newHit = new DFDCHit();
1429 newHit->layer = ctiter->getLayer();
1430 newHit->module = ctiter->getModule();
1431 newHit->element = ctiter->getStrip();
1432 if (newHit->element > 1000)
1433 newHit->element -= 1000;
1434 newHit->plane = ctiter->getPlane();
1435 newHit->q = ctiter->getQ();
1436 newHit->pulse_height = newHit->q;
1437 newHit->t = ctiter->getT();
1438 newHit->d = 0.; // initialize to zero to avoid any NaN
1439 newHit->itrack = ctiter->getItrack();
1440 newHit->ptype = ctiter->getPtype();
1441 newHit->type = 1;
1442 newHit->gPlane = DFDCGeometry::gPlane(newHit);
1443 newHit->gLayer = DFDCGeometry::gLayer(newHit);
1444 newHit->r = DFDCGeometry::getStripR(newHit);
1445 data.push_back(newHit);
1446 }
1447 }
1448
1449 else if (tag == "CALIB") {
1450 // Deal with the wires
1451 const hddm_s::FdcAnodeHitList &ahits = record->getFdcAnodeHits();
1452 hddm_s::FdcAnodeHitList::iterator ahiter;
1453 for (ahiter = ahits.begin(); ahiter != ahits.end(); ++ahiter) {
1454 DFDCHit* newHit = new DFDCHit();
1455 newHit->layer = ahiter->getLayer();
1456 newHit->module = ahiter->getModule();
1457 newHit->element = ahiter->getWire();
1458 newHit->q = ahiter->getDE();
1459 newHit->t = ahiter->getT();
1460 newHit->d = 0.; // initialize to zero to avoid any NaN
1461 newHit->itrack = 0; // track information is in TRUTH tag
1462 newHit->ptype = 0; // ditto
1463 newHit->plane = 2;
1464 newHit->type = 0;
1465 newHit->gPlane = DFDCGeometry::gPlane(newHit);
1466 newHit->gLayer = DFDCGeometry::gLayer(newHit);
1467 newHit->r = DFDCGeometry::getWireR(newHit);
1468 data.push_back(newHit);
1469 }
1470
1471 // Ditto for the cathodes.
1472 const hddm_s::FdcCathodeHitList &chits = record->getFdcCathodeHits();
1473 hddm_s::FdcCathodeHitList::iterator chiter;
1474 for (chiter = chits.begin(); chiter != chits.end(); ++chiter) {
1475 DFDCHit* newHit = new DFDCHit();
1476 newHit->layer = chiter->getLayer();
1477 newHit->module = chiter->getModule();
1478 newHit->element = chiter->getStrip();
1479 if (newHit->element > 1000)
1480 newHit->element-=1000;
1481 newHit->plane = chiter->getPlane();
1482 if (newHit->plane == 1) // v
1483 newHit->q = chiter->getQ()*vscale[newHit->element-1];
1484 else // u
1485 newHit->q = chiter->getQ()*uscale[newHit->element-1];
1486 newHit->t = chiter->getT();
1487 newHit->d = 0.; // initialize to zero to avoid any NaN
1488 newHit->itrack = 0; // track information is in TRUTH tag
1489 newHit->ptype = 0; // ditto
1490 newHit->type = 1;
1491 newHit->gPlane = DFDCGeometry::gPlane(newHit);
1492 newHit->gLayer = DFDCGeometry::gLayer(newHit);
1493 newHit->r = DFDCGeometry::getStripR(newHit);
1494 data.push_back(newHit);
1495 }
1496 }
1497
1498 // Copy into factory
1499 factory->CopyTo(data);
1500
1501 return NOERROR;
1502}
1503
1504//------------------
1505// Extract_DBCALTruthShower
1506//------------------
1507jerror_t DEventSourceHDDM::Extract_DBCALTruthShower(hddm_s::HDDM *record,
1508 JFactory<DBCALTruthShower> *factory,
1509 string tag)
1510{
1511 /// Copies the data from the given hddm_s structure. This is called
1512 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1513 /// returns OBJECT_NOT_AVAILABLE immediately.
1514
1515 if (factory == NULL__null)
1516 return OBJECT_NOT_AVAILABLE;
1517 if (tag != "")
1518 return OBJECT_NOT_AVAILABLE;
1519
1520 vector<DBCALTruthShower*> data;
1521
1522 const hddm_s::BcalTruthShowerList &shows = record->getBcalTruthShowers();
1523 hddm_s::BcalTruthShowerList::iterator iter;
1524 for (iter = shows.begin(); iter != shows.end(); ++iter) {
1525 DBCALTruthShower *bcaltruth = new DBCALTruthShower;
1526 bcaltruth->track = iter->getTrack();
1527 bcaltruth->ptype = iter->getPtype();
1528 bcaltruth->primary = (iter->getPrimary())? 1 : 0;
1529 bcaltruth->phi = iter->getPhi();
1530 bcaltruth->r = iter->getR();
1531 bcaltruth->z = iter->getZ();
1532 bcaltruth->t = iter->getT();
1533 bcaltruth->E = iter->getE();
1534 bcaltruth->px = iter->getPx();
1535 bcaltruth->py = iter->getPy();
1536 bcaltruth->pz = iter->getPz();
1537 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
1538 bcaltruth->itrack = (ids.size())? ids.begin()->getItrack() : 0;
1539 data.push_back(bcaltruth);
1540 }
1541
1542 // Copy into factory
1543 factory->CopyTo(data);
1544
1545 return NOERROR;
1546}
1547
1548//------------------
1549// Extract_DBCALTruthCell
1550//------------------
1551jerror_t DEventSourceHDDM::Extract_DBCALTruthCell(hddm_s::HDDM *record,
1552 JFactory<DBCALTruthCell> *factory,
1553 string tag)
1554{
1555 /// Copies the data from the given hddm_s structure. This is called
1556 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1557 /// returns OBJECT_NOT_AVAILABLE immediately.
1558
1559 if (factory == NULL__null)
1560 return OBJECT_NOT_AVAILABLE;
1561 if (tag != "")
1562 return OBJECT_NOT_AVAILABLE;
1563
1564 vector<DBCALTruthCell*> data;
1565
1566 const hddm_s::BcalTruthHitList &hits = record->getBcalTruthHits();
1567 hddm_s::BcalTruthHitList::iterator hiter;
1568 for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
1569 DBCALTruthCell *truthcell = new DBCALTruthCell();
1570 truthcell->module = hiter->getModule();
1571 truthcell->layer = hiter->getLayer();
1572 truthcell->sector = hiter->getSector();
1573 truthcell->E = hiter->getE();
1574 truthcell->t = hiter->getT();
1575 truthcell->zLocal = hiter->getZLocal();
1576 data.push_back(truthcell);
1577 }
1578
1579 // Copy into factory
1580 factory->CopyTo(data);
1581
1582 return NOERROR;
1583}
1584
1585//------------------
1586// Extract_DFCALTruthShower
1587//------------------
1588jerror_t DEventSourceHDDM::Extract_DFCALTruthShower(hddm_s::HDDM *record,
1589 JFactory<DFCALTruthShower> *factory,
1590 string tag)
1591{
1592 /// Copies the data from the given hddm_s structure. This is called
1593 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1594 /// returns OBJECT_NOT_AVAILABLE immediately.
1595
1596 if (factory == NULL__null)
1597 return OBJECT_NOT_AVAILABLE;
1598 if (tag != "")
1599 return OBJECT_NOT_AVAILABLE;
1600
1601 vector<DFCALTruthShower*> data;
1602 JObject::oid_t id=1;
1603
1604 const hddm_s::FcalTruthShowerList &shows = record->getFcalTruthShowers();
1605 hddm_s::FcalTruthShowerList::iterator iter;
1606 for (iter = shows.begin(); iter != shows.end(); ++iter) {
1607 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
1608 int itrack = (ids.size())? ids.begin()->getItrack() : 0;
1609 DFCALTruthShower *dfcaltruthshower = new DFCALTruthShower(
1610 id++,
1611 iter->getX(),
1612 iter->getY(),
1613 iter->getZ(),
1614 iter->getPx(),
1615 iter->getPy(),
1616 iter->getPz(),
1617 iter->getE(),
1618 iter->getT(),
1619 iter->getPrimary(),
1620 iter->getTrack(),
1621 iter->getPtype(),
1622 itrack
1623 );
1624 data.push_back(dfcaltruthshower);
1625 }
1626
1627 // Copy into factory
1628 factory->CopyTo(data);
1629
1630 return NOERROR;
1631}
1632
1633//------------------
1634// Extract_DFCALHit
1635//------------------
1636jerror_t DEventSourceHDDM::Extract_DFCALHit(hddm_s::HDDM *record,
1637 JFactory<DFCALHit> *factory, string tag,
1638 JEventLoop* eventLoop)
1639{
1640 /// Copies the data from the given hddm_s structure. This is called
1641 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1642 /// returs OBJECT_NOT_AVAILABLE immediately.
1643
1644 if (factory == NULL__null)
1645 return OBJECT_NOT_AVAILABLE;
1646 if (tag != "" && tag != "TRUTH")
1647 return OBJECT_NOT_AVAILABLE;
1648
1649 // extract the FCAL Geometry (for isBlockActive() and positionOnFace())
1650 vector<const DFCALGeometry*> fcalGeomVect;
1651 eventLoop->Get( fcalGeomVect );
1652 if (fcalGeomVect.size() < 1)
1653 return OBJECT_NOT_AVAILABLE;
1654 const DFCALGeometry& fcalGeom = *(fcalGeomVect[0]);
1655
1656 vector<DFCALHit*> data;
1657
1658 if (tag == "") {
1659 const hddm_s::FcalHitList &hits = record->getFcalHits();
1660 hddm_s::FcalHitList::iterator iter;
1661 for (iter = hits.begin(); iter != hits.end(); ++iter) {
1662 int row = iter->getRow();
1663 int column = iter->getColumn();
1664
1665 // Filter out non-physical blocks here
1666 if (!fcalGeom.isBlockActive(row, column))
1667 continue;
1668
1669 // Get position of blocks on front face. (This should really come from
1670 // hdgeant directly so the positions can be shifted in mcsmear.)
1671 DVector2 pos = fcalGeom.positionOnFace(row, column);
1672
1673 DFCALHit *mchit = new DFCALHit();
1674 mchit->row = row;
1675 mchit->column = column;
1676 mchit->x = pos.X();
1677 mchit->y = pos.Y();
1678 mchit->E = iter->getE();
1679 mchit->t = iter->getT();
1680 mchit->intOverPeak = 6.;
1681 if(iter->getFcalDigihits().size() > 0) {
1682 mchit->intOverPeak = iter->getFcalDigihit().getIntegralOverPeak();
1683 }
1684 data.push_back(mchit);
1685 }
1686 }
1687 else if (tag == "TRUTH") {
1688 const hddm_s::FcalTruthHitList &hits = record->getFcalTruthHits();
1689 hddm_s::FcalTruthHitList::iterator iter;
1690 for (iter = hits.begin(); iter != hits.end(); ++iter) {
1691 int row = iter->getRow();
1692 int column = iter->getColumn();
1693
1694 // Filter out non-physical blocks here
1695 if (!fcalGeom.isBlockActive(row, column))
1696 continue;
1697
1698 // Get position of blocks on front face. (This should really come from
1699 // hdgeant directly so the positions can be shifted in mcsmear.)
1700 DVector2 pos = fcalGeom.positionOnFace(row, column);
1701
1702 DFCALHit *mchit = new DFCALHit();
1703 mchit->row = row;
1704 mchit->column = column;
1705 mchit->x = pos.X();
1706 mchit->y = pos.Y();
1707 mchit->E = iter->getE();
1708 mchit->t = iter->getT();
1709 mchit->intOverPeak = 6.;
1710 data.push_back(mchit);
1711 }
1712 }
1713
1714 // Copy into factory
1715 factory->CopyTo(data);
1716
1717 return NOERROR;
1718}
1719
1720//------------------
1721// Extract_DCCALTruthShower
1722//------------------
1723jerror_t DEventSourceHDDM::Extract_DCCALTruthShower(hddm_s::HDDM *record,
1724 JFactory<DCCALTruthShower> *factory,
1725 string tag)
1726{
1727 /// Copies the data from the given hddm_s structure. This is called
1728 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1729 /// returns OBJECT_NOT_AVAILABLE immediately.
1730
1731 if (factory == NULL__null)
1732 return OBJECT_NOT_AVAILABLE;
1733 if (tag != "")
1734 return OBJECT_NOT_AVAILABLE;
1735
1736 vector<DCCALTruthShower*> data;
1737 JObject::oid_t id=1;
1738
1739 const hddm_s::CcalTruthShowerList &shows = record->getCcalTruthShowers();
1740 hddm_s::CcalTruthShowerList::iterator iter;
1741 for (iter = shows.begin(); iter != shows.end(); ++iter) {
1742 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
1743 int itrack = (ids.size())? ids.begin()->getItrack() : 0;
1744 DCCALTruthShower *dccaltruthshower = new DCCALTruthShower(
1745 id++,
1746 iter->getX(),
1747 iter->getY(),
1748 iter->getZ(),
1749 iter->getPx(),
1750 iter->getPy(),
1751 iter->getPz(),
1752 iter->getE(),
1753 iter->getT(),
1754 iter->getPrimary(),
1755 iter->getTrack(),
1756 iter->getPtype(),
1757 itrack
1758 );
1759 data.push_back(dccaltruthshower);
1760 }
1761
1762 // Copy into factory
1763 factory->CopyTo(data);
1764
1765 return NOERROR;
1766}
1767
1768//------------------
1769// Extract_DCCALHit
1770//------------------
1771jerror_t DEventSourceHDDM::Extract_DCCALHit(hddm_s::HDDM *record,
1772 JFactory<DCCALHit> *factory, string tag,
1773 JEventLoop* eventLoop)
1774{
1775 /// Copies the data from the given hddm_s structure. This is called
1776 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1777 /// returs OBJECT_NOT_AVAILABLE immediately.
1778
1779 if (factory == NULL__null)
1780 return OBJECT_NOT_AVAILABLE;
1781 if (tag != "" && tag != "TRUTH")
1782 return OBJECT_NOT_AVAILABLE;
1783
1784 // extract the CCAL Geometry (for isBlockActive() and positionOnFace())
1785 vector<const DCCALGeometry*> ccalGeomVect;
1786 eventLoop->Get( ccalGeomVect );
1787 if (ccalGeomVect.size() < 1)
1788 return OBJECT_NOT_AVAILABLE;
1789 const DCCALGeometry& ccalGeom = *(ccalGeomVect[0]);
1790
1791 vector<DCCALHit*> data;
1792 int hitId = 0;
1793
1794 if (tag == "") {
1795 const hddm_s::CcalHitList &hits = record->getCcalHits();
1796 hddm_s::CcalHitList::iterator iter;
1797 for (iter = hits.begin(); iter != hits.end(); ++iter) {
1798 int row = iter->getRow();
1799 int column = iter->getColumn();
1800
1801 // Filter out non-physical blocks here
1802 if (!ccalGeom.isBlockActive(row, column))
1803 continue;
1804
1805 // Get position of blocks on front face. (This should really come from
1806 // hdgeant directly so the poisitions can be shifted in mcsmear.)
1807 DVector2 pos = ccalGeom.positionOnFace(row, column);
1808
1809 DCCALHit *mchit = new DCCALHit();
1810 mchit->row = row;
1811 mchit->column = column;
1812 mchit->x = pos.X();
1813 mchit->y = pos.Y();
1814 mchit->E = iter->getE();
1815 mchit->t = iter->getT();
1816 mchit->id = hitId++;
1817 data.push_back(mchit);
1818 }
1819 }
1820
1821 else if (tag == "TRUTH") {
1822 const hddm_s::CcalTruthHitList &hits = record->getCcalTruthHits();
1823 hddm_s::CcalTruthHitList::iterator iter;
1824 for (iter = hits.begin(); iter != hits.end(); ++iter) {
1825 int row = iter->getRow();
1826 int column = iter->getColumn();
1827
1828 // Filter out non-physical blocks here
1829 if (!ccalGeom.isBlockActive(row, column))
1830 continue;
1831
1832 // Get position of blocks on front face. (This should really come from
1833 // hdgeant directly so the poisitions can be shifted in mcsmear.)
1834 DVector2 pos = ccalGeom.positionOnFace(row, column);
1835
1836 DCCALHit *mchit = new DCCALHit();
1837 mchit->row = row;
1838 mchit->column = column;
1839 mchit->x = pos.X();
1840 mchit->y = pos.Y();
1841 mchit->E = iter->getE();
1842 mchit->t = iter->getT();
1843 mchit->id = hitId++;
1844 data.push_back(mchit);
1845 }
1846 }
1847
1848 // Copy into factory
1849 factory->CopyTo(data);
1850
1851 return NOERROR;
1852}
1853
1854//------------------
1855// Extract_DMCTrajectoryPoint
1856//------------------
1857jerror_t DEventSourceHDDM::Extract_DMCTrajectoryPoint(hddm_s::HDDM *record,
1858 JFactory<DMCTrajectoryPoint> *factory,
1859 string tag)
1860{
1861 /// Copies the data from the given hddm_s structure. This is called
1862 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1863 /// returns OBJECT_NOT_AVAILABLE immediately.
1864
1865 if (factory == NULL__null)
1866 return OBJECT_NOT_AVAILABLE;
1867 if (tag != "")
1868 return OBJECT_NOT_AVAILABLE;
1869
1870 vector<DMCTrajectoryPoint*> data;
1871
1872 const hddm_s::McTrajectoryPointList &pts = record->getMcTrajectoryPoints();
1873 hddm_s::McTrajectoryPointList::iterator iter;
1874 for (iter = pts.begin(); iter != pts.end(); ++iter) {
1875 DMCTrajectoryPoint *p = new DMCTrajectoryPoint;
1876 p->x = iter->getX();
1877 p->y = iter->getY();
1878 p->z = iter->getZ();
1879 p->t = iter->getT();
1880 p->px = iter->getPx();
1881 p->py = iter->getPy();
1882 p->pz = iter->getPz();
1883 p->E = iter->getE();
1884 p->dE = iter->getDE();
1885 p->primary_track = iter->getPrimary_track();
1886 p->track = iter->getTrack();
1887 p->part = iter->getPart();
1888 p->radlen = iter->getRadlen();
1889 p->step = iter->getStep();
1890 p->mech = iter->getMech();
1891 data.push_back(p);
1892 }
1893
1894 // Copy into factory
1895 factory->CopyTo(data);
1896
1897 return NOERROR;
1898}
1899
1900//------------------
1901// Extract_DTOFTruth
1902//------------------
1903jerror_t DEventSourceHDDM::Extract_DTOFTruth(hddm_s::HDDM *record,
1904 JFactory<DTOFTruth>* factory, string tag)
1905{
1906 /// Copies the data from the given hddm_s structure. This is called
1907 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1908 /// returns OBJECT_NOT_AVAILABLE immediately.
1909
1910 if (factory == NULL__null)
1911 return OBJECT_NOT_AVAILABLE;
1912 if (tag != "")
1913 return OBJECT_NOT_AVAILABLE;
1914
1915 vector<DTOFTruth*> data;
1916
1917 const hddm_s::FtofTruthPointList &points = record->getFtofTruthPoints();
1918 hddm_s::FtofTruthPointList::iterator iter;
1919 for (iter = points.begin(); iter != points.end(); ++iter) {
1920 DTOFTruth *toftruth = new DTOFTruth;
1921 toftruth->primary = iter->getPrimary();
1922 toftruth->track = iter->getTrack();
1923 toftruth->x = iter->getX();
1924 toftruth->y = iter->getY();
1925 toftruth->z = iter->getZ();
1926 toftruth->t = iter->getT();
1927 toftruth->px = iter->getPx();
1928 toftruth->py = iter->getPy();
1929 toftruth->pz = iter->getPz();
1930 toftruth->E = iter->getE();
1931 toftruth->ptype = iter->getPtype();
1932 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
1933 toftruth->itrack = (ids.size())? ids.begin()->getItrack() : 0;
1934 data.push_back(toftruth);
1935 }
1936
1937 // Copy into factory
1938 factory->CopyTo(data);
1939
1940 return NOERROR;
1941}
1942
1943//------------------
1944// Extract_DTOFHit
1945//------------------
1946jerror_t DEventSourceHDDM::Extract_DTOFHit( hddm_s::HDDM *record,
1947 JFactory<DTOFHit>* factory,
1948 JFactory<DTOFHitMC> *factoryMC,
1949 string tag)
1950{
1951 /// Copies the data from the given hddm_s structure. This is called
1952 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
1953 /// returns OBJECT_NOT_AVAILABLE immediately.
1954
1955 if (factory == NULL__null)
1956 return OBJECT_NOT_AVAILABLE;
1957 if (tag != "" && tag != "TRUTH")
1958 return OBJECT_NOT_AVAILABLE;
1959
1960 vector<DTOFHit*> data;
1961 vector<DTOFHitMC*> dataMC;
1962
1963 const hddm_s::FtofCounterList &ctrs = record->getFtofCounters();
1964 hddm_s::FtofCounterList::iterator iter;
1965 for (iter = ctrs.begin(); iter != ctrs.end(); ++iter) {
1966 if (tag == "") {
1967 vector<DTOFHit*> north_hits;
1968 vector<DTOFHit*> south_hits;
1969
1970 // Loop over north AND south hits
1971 const hddm_s::FtofHitList &hits = iter->getFtofHits();
1972 hddm_s::FtofHitList::iterator hiter;
1973 for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
1974 DTOFHit *tofhit = new DTOFHit;
1975 tofhit->bar = hiter->getBar();
1976 tofhit->plane = hiter->getPlane();
1977 tofhit->end = hiter->getEnd();
1978 tofhit->dE = hiter->getDE();
1979 tofhit->Amp = 0.;
1980 if(hiter->getFtofDigihits().size() > 0) {
1981 tofhit->Amp = hiter->getFtofDigihit().getPeakAmp();
1982 }
1983 tofhit->t = hiter->getT();
1984 tofhit->t_TDC = tofhit->t;
1985 tofhit->t_fADC= tofhit->t;
1986 tofhit->has_TDC=true;
1987 tofhit->has_fADC=true;
1988 data.push_back(tofhit);
1989 if (tofhit->end == 0)
1990 north_hits.push_back(tofhit);
1991 else
1992 south_hits.push_back(tofhit);
1993 }
1994
1995 // return truth hits in a different factory
1996 const hddm_s::FtofTruthHitList &truths = iter->getFtofTruthHits();
1997 hddm_s::FtofTruthHitList::iterator titer;
1998 unsigned int north_mchits = 0;
1999 unsigned int south_mchits = 0;
2000 for (titer = truths.begin(); titer != truths.end(); ++titer) {
2001 DTOFHitMC *tofmchit = new DTOFHitMC;
2002 tofmchit->bar = titer->getBar();
2003 tofmchit->plane = titer->getPlane();
2004 tofmchit->end = titer->getEnd();
2005 tofmchit->itrack = titer->getFtofTruthExtra(0).getItrack();
2006 tofmchit->ptype = titer->getFtofTruthExtra(0).getPtype();
2007 tofmchit->dist = titer->getFtofTruthExtra(0).getDist();
2008 tofmchit->x = titer->getFtofTruthExtra(0).getX();
2009 tofmchit->y = titer->getFtofTruthExtra(0).getY();
2010 tofmchit->z = titer->getFtofTruthExtra(0).getZ();
2011 tofmchit->px = titer->getFtofTruthExtra(0).getPx();
2012 tofmchit->py = titer->getFtofTruthExtra(0).getPy();
2013 tofmchit->pz = titer->getFtofTruthExtra(0).getPz();
2014 tofmchit->E = titer->getFtofTruthExtra(0).getE();
2015 dataMC.push_back(tofmchit);
2016
2017 // best-guess at tofhit-tofMChit association, not exact
2018 if (tofmchit->end == 0) {
2019 if (north_mchits < north_hits.size()) {
2020 north_hits[north_mchits]->AddAssociatedObject(tofmchit);
2021 }
2022 north_mchits++;
2023 }
2024 else {
2025 if (south_mchits < south_hits.size()) {
2026 south_hits[south_mchits]->AddAssociatedObject(tofmchit);
2027 }
2028 south_mchits++;
2029 }
2030 }
2031 }
2032
2033 else if (tag == "TRUTH") {
2034 const hddm_s::FtofTruthHitList &truths = iter->getFtofTruthHits();
2035 hddm_s::FtofTruthHitList::iterator titer;
2036 for (titer = truths.begin(); titer != truths.end(); ++titer) {
2037 DTOFHit *tofhit = new DTOFHit;
2038 tofhit->bar = titer->getBar();
2039 tofhit->plane = titer->getPlane();
2040 tofhit->end = titer->getEnd();
2041 tofhit->dE = titer->getDE();
2042 tofhit->t = titer->getT();
2043 tofhit->t_fADC= tofhit->t;
2044 tofhit->t_TDC = tofhit->t;
2045 tofhit->has_TDC=true;
2046 tofhit->has_fADC=true;
2047 data.push_back(tofhit);
2048
2049 DTOFHitMC *tofmchit = new DTOFHitMC;
2050 tofmchit->bar = tofhit->bar;
2051 tofmchit->plane = tofhit->plane;
2052 tofmchit->end = tofhit->end;
2053 tofmchit->itrack = titer->getFtofTruthExtra().getItrack();
2054 tofmchit->ptype = titer->getFtofTruthExtra().getPtype();
2055 tofmchit->dist = titer->getFtofTruthExtra().getDist();
2056 tofmchit->x = titer->getFtofTruthExtra().getX();
2057 tofmchit->y = titer->getFtofTruthExtra().getY();
2058 tofmchit->z = titer->getFtofTruthExtra().getZ();
2059 tofmchit->px = titer->getFtofTruthExtra().getPx();
2060 tofmchit->py = titer->getFtofTruthExtra().getPy();
2061 tofmchit->pz = titer->getFtofTruthExtra().getPz();
2062 tofmchit->E = titer->getFtofTruthExtra().getE();
2063 dataMC.push_back(tofmchit);
2064 tofhit->AddAssociatedObject(tofmchit);
2065 }
2066 }
2067 }
2068
2069 // Copy into factory
2070 factory->CopyTo(data);
2071 factoryMC->CopyTo(dataMC);
2072
2073 return NOERROR;
2074}
2075
2076//------------------
2077// Extract_DSCHit
2078//------------------
2079jerror_t DEventSourceHDDM::Extract_DSCHit(hddm_s::HDDM *record,
2080 JFactory<DSCHit>* factory, string tag)
2081{
2082 /// Copies the data from the given hddm_s structure. This is called
2083 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2084 /// returns OBJECT_NOT_AVAILABLE immediately.
2085
2086 if (factory == NULL__null)
2087 return OBJECT_NOT_AVAILABLE;
2088 if (tag != "" && tag != "TRUTH")
2089 return OBJECT_NOT_AVAILABLE;
2090
2091 vector<DSCHit*> data;
2092
2093 if (tag == "") {
2094 const hddm_s::StcHitList &hits = record->getStcHits();
2095 hddm_s::StcHitList::iterator iter;
2096 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2097 DSCHit *hit = new DSCHit;
2098 hit->sector = iter->getSector();
2099 hit->dE = iter->getDE();
2100 hit->t = iter->getT();
2101 hit->t_TDC=hit->t;
2102 hit->t_fADC=hit->t;
2103 hit->pulse_height = 0.;
2104 if(iter->getStcDigihits().size() > 0) {
2105 hit->pulse_height = iter->getStcDigihit().getPeakAmp();
2106 }
2107 hit->has_TDC=true;
2108 hit->has_fADC=true;
2109 data.push_back(hit);
2110 }
2111 }
2112 else if (tag == "TRUTH") {
2113 const hddm_s::StcTruthHitList &hits = record->getStcTruthHits();
2114 hddm_s::StcTruthHitList::iterator iter;
2115 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2116 DSCHit *hit = new DSCHit;
2117 hit->sector = iter->getSector();
2118 hit->dE = iter->getDE();
2119 hit->t = iter->getT();
2120 hit->t_TDC=hit->t;
2121 hit->t_fADC=hit->t;
2122 hit->has_TDC=true;
2123 hit->has_fADC=true;
2124 data.push_back(hit);
2125 }
2126 }
2127
2128 // Copy into factory
2129 factory->CopyTo(data);
2130
2131 return NOERROR;
2132}
2133
2134//------------------
2135// Extract_DSCTruthHit
2136//------------------
2137jerror_t DEventSourceHDDM::Extract_DSCTruthHit(hddm_s::HDDM *record,
2138 JFactory<DSCTruthHit>* factory, string tag)
2139{
2140 /// Copies the data from the given hddm_s structure. This is called
2141 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2142 /// returns OBJECT_NOT_AVAILABLE immediately.
2143
2144 if (factory == NULL__null)
2145 return OBJECT_NOT_AVAILABLE;
2146 if (tag != "")
2147 return OBJECT_NOT_AVAILABLE;
2148
2149 vector<DSCTruthHit*> data;
2150
2151 const hddm_s::StcTruthPointList &points = record->getStcTruthPoints();
2152 hddm_s::StcTruthPointList::iterator iter;
2153 for (iter = points.begin(); iter != points.end(); ++iter) {
2154 DSCTruthHit *hit = new DSCTruthHit;
2155 hit->dEdx = iter->getDEdx();
2156 hit->phi = iter->getPhi();
2157 hit->primary = iter->getPrimary();
2158 hit->ptype = iter->getPtype();
2159 hit->r = iter->getR();
2160 hit->t = iter->getT();
2161 hit->z = iter->getZ();
2162 hit->track = iter->getTrack();
2163 hit->sector = iter->getSector();
2164 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
2165 hit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
2166 data.push_back(hit);
2167 }
2168
2169 // Copy into factory
2170 factory->CopyTo(data);
2171
2172 return NOERROR;
2173}
2174
2175//------------------
2176// Extract_DTrackTimeBased
2177//------------------
2178jerror_t DEventSourceHDDM::Extract_DTrackTimeBased(hddm_s::HDDM *record,
2179 JFactory<DTrackTimeBased> *factory,
2180 string tag, int32_t runnumber, JEventLoop* locEventLoop)
2181{
2182 // Note: Since this is a reconstructed factory, we want to generally return OBJECT_NOT_AVAILABLE
2183 // rather than NOERROR. The reason being that the caller interprets "NOERROR" to mean "yes I
2184 // usually can provide objects of that type, but this event has none." This will cause it to
2185 // skip any attempt at reconstruction. On the other hand, a value of "OBJECT_NOT_AVAILABLE" tells
2186 // it "I cannot provide those type of objects for this event."
2187
2188 if (factory == NULL__null)
2189 return OBJECT_NOT_AVAILABLE;
2190 if (tag != "")
2191 return OBJECT_NOT_AVAILABLE;
2192
2193 vector<DTrackTimeBased*> data;
2194 vector<DReferenceTrajectory*> rts;
2195
2196 const hddm_s::TracktimebasedList &ttbs = record->getTracktimebaseds();
2197 hddm_s::TracktimebasedList::iterator iter;
2198 for (iter = ttbs.begin(); iter != ttbs.end(); ++iter) {
2199 DVector3 mom(iter->getMomentum().getPx(),
2200 iter->getMomentum().getPy(),
2201 iter->getMomentum().getPz());
2202 DVector3 pos(iter->getOrigin().getVx(),
2203 iter->getOrigin().getVy(),
2204 iter->getOrigin().getVz());
2205 DTrackTimeBased *track = new DTrackTimeBased();
2206 track->setMomentum(mom);
2207 track->setPosition(pos);
2208 track->setPID(IDTrack(iter->getProperties().getCharge(),
2209 iter->getProperties().getMass()));
2210 track->chisq = iter->getChisq();
2211 track->Ndof = iter->getNdof();
2212 track->FOM = iter->getFOM();
2213 track->candidateid = iter->getCandidateid();
2214 track->id = iter->getId();
2215
2216 // Reconstitute errorMatrix
2217 auto locCovarianceMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
2218 locCovarianceMatrix->ResizeTo(7, 7);
2219 string str_vals = iter->getErrorMatrix().getVals();
2220 StringToTMatrixFSym(str_vals, locCovarianceMatrix.get(),
2221 iter->getErrorMatrix().getNrows(),
2222 iter->getErrorMatrix().getNcols());
2223 track->setErrorMatrix(locCovarianceMatrix);
2224
2225 // Reconstitute TrackingErrorMatrix
2226 str_vals = iter->getTrackingErrorMatrix().getVals();
2227 auto TrackingErrorMatrix = dResourcePool_TMatrixFSym->Get_SharedResource();
2228 TrackingErrorMatrix->ResizeTo(5, 5);
2229 StringToTMatrixFSym(str_vals, TrackingErrorMatrix.get(),
2230 iter->getTrackingErrorMatrix().getNrows(),
2231 iter->getTrackingErrorMatrix().getNcols());
2232 track->setTrackingErrorMatrix(TrackingErrorMatrix);
2233
2234 data.push_back(track);
2235 }
2236
2237 // Copy into factory
2238 if (ttbs.size() > 0){
2239 factory->CopyTo(data);
2240
2241 // If the event had a s_Tracktimebased_t pointer, then report
2242 // back that we read them in from the file. Otherwise, report
2243 // OBJECT_NOT_AVAILABLE
2244 return NOERROR;
2245 }
2246
2247 // If we get to here then there was not even a placeholder in the HDDM file.
2248 // Return OBJECT_NOT_AVAILABLE to indicate reconstruction should be tried.
2249 return OBJECT_NOT_AVAILABLE;
2250}
2251
2252
2253//-------------------------------
2254// StringToTMatrixFSym
2255//-------------------------------
2256string DEventSourceHDDM::StringToTMatrixFSym(string &str_vals, TMatrixFSym* mat,
2257 int Nrows, int Ncols)
2258{
2259 /// This is the inverse of the DMatrixDSymToString method in the
2260 /// danahddm plugin.
2261
2262 // Convert the given string into a symmetric matrix
2263 mat->ResizeTo(Nrows, Ncols);
2264 stringstream ss(str_vals);
2265 for (int irow=0; irow<mat->GetNrows(); irow++) {
2266 for (int icol=irow; icol<mat->GetNcols(); icol++) {
2267 ss >> (*mat)[irow][icol];
2268 (*mat)[icol][irow] = (*mat)[irow][icol];
2269 }
2270 }
2271
2272 return ss.str();
2273}
2274
2275//------------------
2276// Extract_DTAGMHit
2277//------------------
2278jerror_t DEventSourceHDDM::Extract_DTAGMHit(hddm_s::HDDM *record,
2279 JFactory<DTAGMHit>* factory,
2280 string tag)
2281{
2282 /// Copies the data from the given hddm_s structure. This is called
2283 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2284 /// returns OBJECT_NOT_AVAILABLE immediately.
2285
2286 if (factory == NULL__null)
2287 return OBJECT_NOT_AVAILABLE;
2288 if (tag != "" && tag != "TRUTH")
2289 return OBJECT_NOT_AVAILABLE;
2290
2291 vector<DTAGMHit*> data;
2292
2293 // loop over microChannel/taggerHit records
2294 const hddm_s::MicroChannelList &tags = record->getMicroChannels();
2295 hddm_s::MicroChannelList::iterator iter;
2296 for (iter = tags.begin(); iter != tags.end(); ++iter) {
2297 if (tag == "") {
2298 const hddm_s::TaggerHitList &hits = iter->getTaggerHits();
2299 hddm_s::TaggerHitList::iterator hiter;
2300 for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
2301 DTAGMHit *taghit = new DTAGMHit();
2302 taghit->E = hiter->getE();
2303 taghit->t = hiter->getT();
2304 taghit->npix_fadc = hiter->getNpe();
2305 taghit->time_fadc = hiter->getTADC();
2306 taghit->column = hiter->getColumn();
2307 taghit->row = hiter->getRow();
2308 taghit->has_fADC = true;
2309 taghit->has_TDC = true;
2310 data.push_back(taghit);
2311 }
2312 }
2313 else if (tag == "TRUTH") {
2314 const hddm_s::TaggerTruthHitList &hits = iter->getTaggerTruthHits();
2315 hddm_s::TaggerTruthHitList::iterator hiter;
2316 for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
2317 DTAGMHit *taghit = new DTAGMHit();
2318 taghit->E = hiter->getE();
2319 taghit->t = hiter->getT();
2320 taghit->npix_fadc = hiter->getDE() * 1e5; // ~1e5 pixels/GeV
2321 taghit->time_fadc = hiter->getT();
2322 taghit->column = hiter->getColumn();
2323 taghit->row = hiter->getRow();
2324 taghit->has_fADC = true;
2325 taghit->has_TDC = true;
2326 taghit->bg = hiter->getBg();
2327 data.push_back(taghit);
2328 }
2329 }
2330 }
2331
2332 // Copy into factory
2333 factory->CopyTo(data);
2334
2335 return NOERROR;
2336}
2337
2338//------------------
2339// Extract_DTAGHHit
2340//------------------
2341jerror_t DEventSourceHDDM::Extract_DTAGHHit( hddm_s::HDDM *record,
2342 JFactory<DTAGHHit>* factory,
2343 string tag)
2344{
2345 /// Copies the data from the given hddm_s structure. This is called
2346 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2347 /// returns OBJECT_NOT_AVAILABLE immediately.
2348
2349 if (factory == NULL__null)
2350 return OBJECT_NOT_AVAILABLE;
2351 if (tag != "" && tag != "TRUTH")
2352 return OBJECT_NOT_AVAILABLE;
2353
2354 vector<DTAGHHit*> data;
2355
2356 // loop over hodoChannel/taggerHit records
2357 const hddm_s::HodoChannelList &tags = record->getHodoChannels();
2358 hddm_s::HodoChannelList::iterator iter;
2359 for (iter = tags.begin(); iter != tags.end(); ++iter) {
2360 if (tag == "") {
2361 const hddm_s::TaggerHitList &hits = iter->getTaggerHits();
2362 hddm_s::TaggerHitList::iterator hiter;
2363 for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
2364 DTAGHHit *taghit = new DTAGHHit();
2365 taghit->E = hiter->getE();
2366 taghit->t = hiter->getT();
2367 taghit->npe_fadc = hiter->getNpe();
2368 taghit->time_fadc = hiter->getTADC();
2369 taghit->counter_id = hiter->getCounterId();
2370 taghit->has_fADC = true;
2371 taghit->has_TDC = true;
2372 data.push_back(taghit);
2373 }
2374 }
2375 else if (tag == "TRUTH") {
2376 const hddm_s::TaggerTruthHitList &hits = iter->getTaggerTruthHits();
2377 hddm_s::TaggerTruthHitList::iterator hiter;
2378 for (hiter = hits.begin(); hiter != hits.end(); ++hiter) {
2379 DTAGHHit *taghit = new DTAGHHit();
2380 taghit->E = hiter->getE();
2381 taghit->t = hiter->getT();
2382 taghit->npe_fadc = hiter->getDE() * 5e5; // ~5e5 pe/GeV
2383 taghit->time_fadc = hiter->getT();
2384 taghit->counter_id = hiter->getCounterId();
2385 taghit->has_fADC = true;
2386 taghit->has_TDC = true;
2387 taghit->bg = hiter->getBg();
2388
2389 data.push_back(taghit);
2390 }
2391 }
2392 }
2393
2394 // Copy into factory
2395 factory->CopyTo(data);
2396
2397 return NOERROR;
2398}
2399
2400//------------------
2401// Extract_DPSHit
2402//------------------
2403jerror_t DEventSourceHDDM::Extract_DPSHit(hddm_s::HDDM *record,
2404 JFactory<DPSHit>* factory, string tag)
2405{
2406 /// Copies the data from the given hddm_s structure. This is called
2407 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2408 /// returns OBJECT_NOT_AVAILABLE immediately.
2409
2410 if (factory == NULL__null)
2411 return OBJECT_NOT_AVAILABLE;
2412 if (tag != "" && tag != "TRUTH")
2413 return OBJECT_NOT_AVAILABLE;
2414
2415 vector<DPSHit*> data;
2416
2417 if (tag == "") {
2418 const hddm_s::PsHitList &hits = record->getPsHits();
2419 hddm_s::PsHitList::iterator iter;
2420 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2421 DPSHit *hit = new DPSHit;
2422 if(iter->getArm() == 0)
2423 hit->arm = DPSGeometry::Arm::kNorth;
2424 else
2425 hit->arm = DPSGeometry::Arm::kSouth;
2426 hit->column = iter->getColumn();
2427 double npix_fadc = iter->getDE()*0.5e5; // 100 pixels in 2 MeV
2428 hit->npix_fadc = npix_fadc;
2429 hit->t = iter->getT();
2430
2431 hit->E = 0.5*(psGeom->getElow(hit->arm,hit->column) + psGeom->getEhigh(hit->arm,hit->column));
2432 hit->pulse_peak = npix_fadc*21; // 1 pixel 21 fadc counts
2433 hit->integral = npix_fadc*21*5.1; // integral/peak = 5.1
2434 data.push_back(hit);
2435 }
2436 }
2437 else if (tag == "TRUTH") {
2438 const hddm_s::PsTruthHitList &hits = record->getPsTruthHits();
2439 hddm_s::PsTruthHitList::iterator iter;
2440 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2441 DPSHit *hit = new DPSHit;
2442 if(iter->getArm() == 0)
2443 hit->arm = DPSGeometry::Arm::kNorth;
2444 else
2445 hit->arm = DPSGeometry::Arm::kSouth;
2446 hit->column = iter->getColumn();
2447 hit->npix_fadc = iter->getDE() * 1e5; // ~1e5 pixels/GeV
2448 hit->t = iter->getT();
2449 data.push_back(hit);
2450 }
2451 }
2452
2453 // Copy into factory
2454 factory->CopyTo(data);
2455
2456 return NOERROR;
2457}
2458
2459//------------------
2460// Extract_DPSTruthHit
2461//------------------
2462jerror_t DEventSourceHDDM::Extract_DPSTruthHit(hddm_s::HDDM *record,
2463 JFactory<DPSTruthHit>* factory, string tag)
2464{
2465 /// Copies the data from the given hddm_s structure. This is called
2466 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2467 /// returns OBJECT_NOT_AVAILABLE immediately.
2468
2469 if (factory == NULL__null)
2470 return OBJECT_NOT_AVAILABLE;
2471 if (tag != "")
2472 return OBJECT_NOT_AVAILABLE;
2473
2474 vector<DPSTruthHit*> data;
2475
2476 const hddm_s::PsTruthPointList &points = record->getPsTruthPoints();
2477 hddm_s::PsTruthPointList::iterator iter;
2478 for (iter = points.begin(); iter != points.end(); ++iter) {
2479 DPSTruthHit *hit = new DPSTruthHit;
2480 hit->dEdx = iter->getDEdx();
2481 hit->primary = iter->getPrimary();
2482 hit->ptype = iter->getPtype();
2483 hit->t = iter->getT();
2484 hit->x = iter->getX();
2485 hit->y = iter->getY();
2486 hit->z = iter->getZ();
2487 hit->track = iter->getTrack();
2488 hit->column = iter->getColumn();
2489 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
2490 hit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
2491 data.push_back(hit);
2492 }
2493
2494 // Copy into factory
2495 factory->CopyTo(data);
2496
2497 return NOERROR;
2498}
2499
2500//------------------
2501// Extract_DPSCHit
2502//------------------
2503jerror_t DEventSourceHDDM::Extract_DPSCHit(hddm_s::HDDM *record,
2504 JFactory<DPSCHit>* factory, string tag)
2505{
2506 /// Copies the data from the given hddm_s structure. This is called
2507 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2508 /// returns OBJECT_NOT_AVAILABLE immediately.
2509
2510 if (factory == NULL__null)
2511 return OBJECT_NOT_AVAILABLE;
2512 if (tag != "" && tag != "TRUTH")
2513 return OBJECT_NOT_AVAILABLE;
2514
2515 vector<DPSCHit*> data;
2516
2517 if (tag == "") {
2518 const hddm_s::PscHitList &hits = record->getPscHits();
2519 hddm_s::PscHitList::iterator iter;
2520 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2521 DPSCHit *hit = new DPSCHit;
2522 if(iter->getArm() == 0)
2523 hit->arm = DPSGeometry::Arm::kNorth;
2524 else
2525 hit->arm = DPSGeometry::Arm::kSouth;
2526 hit->module = iter->getModule();
2527
2528 double npe_fadc = iter->getDE()*2.5e5;
2529 hit->npe_fadc = npe_fadc;
2530 hit->pulse_peak = npe_fadc*0.4; // 1000 pe - 400 fadc count
2531 hit->integral = npe_fadc*0.4*3; // integral/peak = 3.
2532
2533 hit->t = iter->getT();
2534 hit->time_tdc = iter->getT();
2535 hit->time_fadc = iter->getT();
2536
2537 hit->has_fADC = true;
2538 hit->has_TDC = true;
2539
2540 data.push_back(hit);
2541 }
2542 }
2543 else if (tag == "TRUTH") {
2544 const hddm_s::PscTruthHitList &hits = record->getPscTruthHits();
2545 hddm_s::PscTruthHitList::iterator iter;
2546 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2547 DPSCHit *hit = new DPSCHit;
2548 if(iter->getArm() == 0)
2549 hit->arm = DPSGeometry::Arm::kNorth;
2550 else
2551 hit->arm = DPSGeometry::Arm::kSouth;
2552 hit->module = iter->getModule();
2553 hit->npe_fadc = iter->getDE() * 5e5; // ~5e5 pe/GeV
2554 hit->t = iter->getT();
2555 data.push_back(hit);
2556 }
2557 }
2558
2559 // Copy into factory
2560 factory->CopyTo(data);
2561
2562 return NOERROR;
2563}
2564
2565//------------------
2566// Extract_DPSCTruthHit
2567//------------------
2568jerror_t DEventSourceHDDM::Extract_DPSCTruthHit(hddm_s::HDDM *record,
2569 JFactory<DPSCTruthHit>* factory, string tag)
2570{
2571 /// Copies the data from the given hddm_s structure. This is called
2572 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2573 /// returns OBJECT_NOT_AVAILABLE immediately.
2574
2575 if (factory == NULL__null)
2576 return OBJECT_NOT_AVAILABLE;
2577 if (tag != "")
2578 return OBJECT_NOT_AVAILABLE;
2579
2580 vector<DPSCTruthHit*> data;
2581
2582 const hddm_s::PscTruthPointList &points = record->getPscTruthPoints();
2583 hddm_s::PscTruthPointList::iterator iter;
2584 for (iter = points.begin(); iter != points.end(); ++iter) {
2585 DPSCTruthHit *hit = new DPSCTruthHit;
2586 hit->dEdx = iter->getDEdx();
2587 hit->primary = iter->getPrimary();
2588 hit->ptype = iter->getPtype();
2589 hit->t = iter->getT();
2590 hit->x = iter->getX();
2591 hit->y = iter->getY();
2592 hit->z = iter->getZ();
2593 hit->track = iter->getTrack();
2594 hit->column = iter->getModule();
2595 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
2596 hit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
2597 data.push_back(hit);
2598 }
2599
2600 // Copy into factory
2601 factory->CopyTo(data);
2602
2603 return NOERROR;
2604}
2605
2606//------------------
2607// Etract_DTPOLHit
2608//------------------
2609jerror_t DEventSourceHDDM::Extract_DTPOLHit(hddm_s::HDDM *record,
2610 JFactory<DTPOLHit>* factory, string tag)
2611{
2612 if (factory == NULL__null)
2613 return OBJECT_NOT_AVAILABLE;
2614 if (tag != "")
2615 return OBJECT_NOT_AVAILABLE;
2616
2617 vector<DTPOLHit*> data;
2618
2619 if (tag == "")
2620 {
2621 const hddm_s::TpolHitList &hits = record->getTpolHits();
2622 hddm_s::TpolHitList::iterator iter;
2623 for (iter = hits.begin(); iter != hits.end(); ++iter)
2624 {
2625 DTPOLHit *hit = new DTPOLHit;
2626 hit->sector = iter->getSector();
2627 hit->ring = iter->getRing();
2628 hit->dE = iter->getDE();
2629 hit->t = iter->getT();
2630
2631 data.push_back(hit);
2632 }
2633 }
2634 else if (tag == "Truth")
2635 {
2636 const hddm_s::TpolTruthHitList &truthHits = record->getTpolTruthHits();
2637 hddm_s::TpolTruthHitList::iterator iter;
2638 for (iter = truthHits.begin(); iter != truthHits.end(); ++iter)
2639 {
2640 DTPOLHit *hit = new DTPOLHit;
2641 hit->sector = iter->getSector();
2642 hit->t = iter->getT();
2643
2644 data.push_back(hit);
2645 }
2646 }
2647
2648 factory->CopyTo(data);
2649
2650 return NOERROR;
2651}
2652
2653//------------------------
2654// Extract_DTPOLTruthHit
2655//------------------------
2656jerror_t DEventSourceHDDM::Extract_DTPOLTruthHit(hddm_s::HDDM *record, JFactory<DTPOLTruthHit>* factory, string tag)
2657{
2658 if (factory == NULL__null)
2659 return OBJECT_NOT_AVAILABLE;
2660 if (tag != "")
2661 return OBJECT_NOT_AVAILABLE;
2662
2663 vector<DTPOLTruthHit*> data;
2664
2665 const hddm_s::TpolTruthPointList &points = record->getTpolTruthPoints();
2666 hddm_s::TpolTruthPointList::iterator iter;
2667 for (iter = points.begin(); iter != points.end(); ++iter)
2668 {
2669 DTPOLTruthHit *hit = new DTPOLTruthHit;
2670 hit->dEdx = iter->getDEdx();
2671 hit->primary = iter->getPrimary();
2672 hit->track = iter->getTrack();
2673 hit->ptype = iter->getPtype();
2674 hit->r = iter->getR();
2675 hit->phi = iter->getPhi();
2676 hit->t = iter->getT();
2677 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
2678 hit->itrack = (ids.size())? ids.begin()->getItrack() : 0;
2679
2680 data.push_back(hit);
2681 }
2682
2683 factory->CopyTo(data);
2684
2685 return NOERROR;
2686}
2687
2688Particle_t DEventSourceHDDM::IDTrack(float locCharge, float locMass) const
2689{
2690 float locMassTolerance = 0.010;
2691 if (locCharge > 0.1) // Positive particles
2692 {
2693 if (fabs(locMass - ParticleMass(Proton)) < locMassTolerance) return Proton;
2694 if (fabs(locMass - ParticleMass(PiPlus)) < locMassTolerance) return PiPlus;
2695 if (fabs(locMass - ParticleMass(KPlus)) < locMassTolerance) return KPlus;
2696 if (fabs(locMass - ParticleMass(Positron)) < locMassTolerance) return Positron;
2697 if (fabs(locMass - ParticleMass(MuonPlus)) < locMassTolerance) return MuonPlus;
2698 }
2699 else if(locCharge < -0.1) // Negative particles
2700 {
2701 if (fabs(locMass - ParticleMass(PiMinus)) < locMassTolerance) return PiMinus;
2702 if (fabs(locMass - ParticleMass(KMinus)) < locMassTolerance) return KMinus;
2703 if (fabs(locMass - ParticleMass(MuonMinus)) < locMassTolerance) return MuonMinus;
2704 if (fabs(locMass - ParticleMass(Electron)) < locMassTolerance) return Electron;
2705 if (fabs(locMass - ParticleMass(AntiProton)) < locMassTolerance) return AntiProton;
2706 }
2707 else //Neutral Track
2708 {
2709 if (fabs(locMass - ParticleMass(Gamma)) < locMassTolerance) return Gamma;
2710 if (fabs(locMass - ParticleMass(Neutron)) < locMassTolerance) return Neutron;
2711 }
2712 return Unknown;
2713}
2714
2715//------------------
2716// Extract_DFMWPCTruthHit
2717//------------------
2718jerror_t DEventSourceHDDM::Extract_DFMWPCTruthHit(hddm_s::HDDM *record, JFactory<DFMWPCTruthHit> *factory, string tag)
2719{
2720 /// Copies the data from the given hddm_s record. This is called
2721 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2722 /// returns OBJECT_NOT_AVAILABLE immediately.
2723
2724 if (factory == NULL__null) return OBJECT_NOT_AVAILABLE;
2725 if (tag != "") return OBJECT_NOT_AVAILABLE;
2726
2727 vector<DFMWPCTruthHit*> data;
2728
2729 const hddm_s::FmwpcTruthHitList &points = record->getFmwpcTruthHits();
2730 hddm_s::FmwpcTruthHitList::iterator iter;
2731 for (iter = points.begin(); iter != points.end(); ++iter) {
2732 DFMWPCTruthHit *hit = new DFMWPCTruthHit;
2733 hit->layer = iter->getLayer();
2734 hit->wire = iter->getWire();
2735 hit->dE = iter->getDE();
2736 hit->dx = iter->getDx();
2737 hit->t = iter->getT();
2738 data.push_back(hit);
2739 }
2740
2741 // Copy into factory
2742 factory->CopyTo(data);
2743
2744 return NOERROR;
2745}
2746
2747
2748//------------------
2749// Extract_DFMWPCTruth
2750//------------------
2751jerror_t DEventSourceHDDM::Extract_DFMWPCTruth(hddm_s::HDDM *record,
2752 JFactory<DFMWPCTruth>* factory, string tag)
2753{
2754 /// Copies the data from the given hddm_s structure. This is called
2755 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2756 /// returns OBJECT_NOT_AVAILABLE immediately.
2757
2758 if (factory == NULL__null)
2759 return OBJECT_NOT_AVAILABLE;
2760 if (tag != "")
2761 return OBJECT_NOT_AVAILABLE;
2762
2763 vector<DFMWPCTruth*> data;
2764
2765 const hddm_s::FmwpcTruthPointList &points = record->getFmwpcTruthPoints();
2766 hddm_s::FmwpcTruthPointList::iterator iter;
2767 for (iter = points.begin(); iter != points.end(); ++iter) {
2768 DFMWPCTruth *fmwpctruth = new DFMWPCTruth;
2769 fmwpctruth->primary = iter->getPrimary();
2770 fmwpctruth->track = iter->getTrack();
2771 fmwpctruth->x = iter->getX();
2772 fmwpctruth->y = iter->getY();
2773 fmwpctruth->z = iter->getZ();
2774 fmwpctruth->t = iter->getT();
2775 fmwpctruth->px = iter->getPx();
2776 fmwpctruth->py = iter->getPy();
2777 fmwpctruth->pz = iter->getPz();
2778 fmwpctruth->E = iter->getE();
2779 fmwpctruth->ptype = iter->getPtype();
2780 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
2781 fmwpctruth->itrack = (ids.size())? ids.begin()->getItrack() : 0;
2782 data.push_back(fmwpctruth);
2783 }
2784
2785 // Copy into factory
2786 factory->CopyTo(data);
2787
2788 return NOERROR;
2789}
2790
2791//------------------
2792// Extract_DFMWPCHit
2793//------------------
2794jerror_t DEventSourceHDDM::Extract_DFMWPCHit(hddm_s::HDDM *record, JFactory<DFMWPCHit> *factory, string tag)
2795{
2796 /// Copies the data from the given hddm_s record. This is called
2797 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2798 /// returns OBJECT_NOT_AVAILABLE immediately.
2799
2800 if (factory == NULL__null) return OBJECT_NOT_AVAILABLE;
2801 if (tag != "") return OBJECT_NOT_AVAILABLE;
2802
2803 vector<DFMWPCHit*> data;
2804
2805 const hddm_s::FmwpcHitList &points = record->getFmwpcHits();
2806 hddm_s::FmwpcHitList::iterator iter;
2807 for (iter = points.begin(); iter != points.end(); ++iter) {
2808 DFMWPCHit *hit = new DFMWPCHit;
2809 hit->layer = iter->getLayer();
2810 hit->wire = iter->getWire();
2811 hit->dE = iter->getDE();
2812 hit->t = iter->getT();
2813 data.push_back(hit);
2814 }
2815
2816 // Copy into factory
2817 factory->CopyTo(data);
2818
2819 return NOERROR;
2820}
2821
2822
2823//------------------
2824// Extract_DCTOFTruth
2825//------------------
2826jerror_t DEventSourceHDDM::Extract_DCTOFTruth(hddm_s::HDDM *record,
2827 JFactory<DCTOFTruth>* factory, string tag)
2828{
2829 /// Copies the data from the given hddm_s structure. This is called
2830 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2831 /// returns OBJECT_NOT_AVAILABLE immediately.
2832
2833 if (factory == NULL__null)
2834 return OBJECT_NOT_AVAILABLE;
2835 if (tag != "")
2836 return OBJECT_NOT_AVAILABLE;
2837
2838 vector<DCTOFTruth*> data;
2839
2840 const hddm_s::CtofTruthPointList &points = record->getCtofTruthPoints();
2841 hddm_s::CtofTruthPointList::iterator iter;
2842 for (iter = points.begin(); iter != points.end(); ++iter) {
2843 DCTOFTruth *ctoftruth = new DCTOFTruth;
2844 ctoftruth->primary = iter->getPrimary();
2845 ctoftruth->track = iter->getTrack();
2846 ctoftruth->x = iter->getX();
2847 ctoftruth->y = iter->getY();
2848 ctoftruth->z = iter->getZ();
2849 ctoftruth->t = iter->getT();
2850 ctoftruth->px = iter->getPx();
2851 ctoftruth->py = iter->getPy();
2852 ctoftruth->pz = iter->getPz();
2853 ctoftruth->E = iter->getE();
2854 ctoftruth->ptype = iter->getPtype();
2855 const hddm_s::TrackIDList &ids = iter->getTrackIDs();
2856 ctoftruth->itrack = (ids.size())? ids.begin()->getItrack() : 0;
2857 data.push_back(ctoftruth);
2858 }
2859
2860 // Copy into factory
2861 factory->CopyTo(data);
2862
2863 return NOERROR;
2864}
2865
2866
2867//------------------
2868// Extract_DCTOFHit
2869//------------------
2870jerror_t DEventSourceHDDM::Extract_DCTOFHit(hddm_s::HDDM *record, JFactory<DCTOFHit> *factory, string tag)
2871{
2872 /// Copies the data from the given hddm_s record. This is called
2873 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2874 /// returns OBJECT_NOT_AVAILABLE immediately.
2875
2876 if (factory == NULL__null) return OBJECT_NOT_AVAILABLE;
2877 if (tag != "") return OBJECT_NOT_AVAILABLE;
2878
2879 vector<DCTOFHit*> data;
2880
2881 const hddm_s::CtofHitList &points = record->getCtofHits();
2882 hddm_s::CtofHitList::iterator iter;
2883 for (iter = points.begin(); iter != points.end(); ++iter) {
2884 DCTOFHit *hit = new DCTOFHit;
2885 hit->bar = iter->getBar();
2886 hit->end = iter->getEnd();
2887 hit->dE = iter->getDE();
2888 hit->t = iter->getT();
2889 data.push_back(hit);
2890 }
2891
2892 // Copy into factory
2893 factory->CopyTo(data);
2894
2895 return NOERROR;
2896}
2897
2898//------------------
2899// Extract_DDIRCPmtHit
2900//------------------
2901jerror_t DEventSourceHDDM::Extract_DDIRCPmtHit(hddm_s::HDDM *record,
2902 JFactory<DDIRCPmtHit> *factory, string tag,
2903 JEventLoop* eventLoop)
2904{
2905 /// Copies the data from the given hddm_s structure. This is called
2906 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
2907 /// returs OBJECT_NOT_AVAILABLE immediately.
2908
2909 if (factory == NULL__null)
2910 return OBJECT_NOT_AVAILABLE;
2911 if (tag != "")
2912 return OBJECT_NOT_AVAILABLE;
2913
2914 vector<DDIRCPmtHit*> data;
2915
2916 if (tag == "") {
2917 vector<const DDIRCTruthPmtHit*> locDIRCTruthPmtHit;
2918 eventLoop->Get(locDIRCTruthPmtHit);
2919
2920 const hddm_s::DircPmtHitList &hits = record->getDircPmtHits();
2921 hddm_s::DircPmtHitList::iterator iter;
2922 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2923 double time = iter->getT();
2924 int channel = iter->getCh();
2925
2926 DDIRCPmtHit *hit = new DDIRCPmtHit();
2927 hit->t = time;
2928 hit->ch = channel;
2929
2930 for (auto& iterTruth : locDIRCTruthPmtHit) { //.begin(); iterTruth != locDIRCTruthPmtHit.end(); ++iterTruth) {
2931
2932 // must match channel and time
2933 if(channel == iterTruth->ch && fabs(time-iterTruth->t) < 5.0) {
2934
2935 hit->AddAssociatedObject(iterTruth);
2936
2937 break;
2938 }
2939 }
2940
2941 data.push_back(hit);
2942 }
2943 }
2944
2945 // Copy into factory
2946 factory->CopyTo(data);
2947
2948 return NOERROR;
2949}
2950
2951//------------------
2952// Extract_DCereHit
2953// added by yqiang Oct 11, 2012
2954//------------------
2955jerror_t DEventSourceHDDM::Extract_DCereHit(hddm_s::HDDM *record,
2956 JFactory<DCereHit>* factory, string tag)
2957{
2958 if (factory == NULL__null)
2959 return OBJECT_NOT_AVAILABLE;
2960 if (tag != "" && tag != "TRUTH")
2961 return OBJECT_NOT_AVAILABLE;
2962
2963 vector<DCereHit*> data;
2964
2965 if (tag == "") {
2966 const hddm_s::CereHitList &hits = record->getCereHits();
2967 hddm_s::CereHitList::iterator iter;
2968 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2969 DCereHit *hit = new DCereHit;
2970 hit->sector = iter->getSector();
2971 hit->pe = iter->getPe();
2972 hit->t = iter->getT();
2973 data.push_back(hit);
2974 }
2975 }
2976 else if (tag == "TRUTH") {
2977 const hddm_s::CereTruthHitList &hits = record->getCereTruthHits();
2978 hddm_s::CereTruthHitList::iterator iter;
2979 for (iter = hits.begin(); iter != hits.end(); ++iter) {
2980 DCereHit *hit = new DCereHit;
2981 hit->sector = iter->getSector();
2982 hit->pe = iter->getPe();
2983 hit->t = iter->getT();
2984 data.push_back(hit);
2985 }
2986 }
2987
2988 // copy into factory
2989 factory->CopyTo(data);
2990
2991 return NOERROR;
2992}
2993
2994//------------------
2995// Extract_DDIRCTruthBarHit
2996//------------------
2997jerror_t DEventSourceHDDM::Extract_DDIRCTruthBarHit(hddm_s::HDDM *record,
2998 JFactory<DDIRCTruthBarHit>* factory, string tag)
2999{
3000 /// Copies the data from the given hddm_s structure. This is called
3001 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
3002 /// returns OBJECT_NOT_AVAILABLE immediately.
3003
3004 if (factory == NULL__null)
3005 return OBJECT_NOT_AVAILABLE;
3006 if (tag != "")
3007 return OBJECT_NOT_AVAILABLE;
3008
3009 vector<DDIRCTruthBarHit*> data;
3010
3011 const hddm_s::DircTruthBarHitList &hits = record->getDircTruthBarHits();
3012 hddm_s::DircTruthBarHitList::iterator iter;
3013 for (iter = hits.begin(); iter != hits.end(); ++iter) {
3014 DDIRCTruthBarHit *hit = new DDIRCTruthBarHit;
3015 hit->x = iter->getX();
3016 hit->y = iter->getY();
3017 hit->z = iter->getZ();
3018 hit->px = iter->getPx();
3019 hit->py = iter->getPy();
3020 hit->pz = iter->getPz();
3021 hit->t = iter->getT();
3022 hit->E = iter->getE();
3023 hit->pdg = iter->getPdg();
3024 hit->bar = iter->getBar();
3025 hit->track = iter->getTrack();
3026 data.push_back(hit);
3027 }
3028
3029 // Copy into factory
3030 factory->CopyTo(data);
3031
3032 return NOERROR;
3033}
3034
3035//------------------
3036// Extract_DDIRCTruthPmtHit
3037//------------------
3038jerror_t DEventSourceHDDM::Extract_DDIRCTruthPmtHit(hddm_s::HDDM *record,
3039 JFactory<DDIRCTruthPmtHit>* factory, string tag)
3040{
3041 /// Copies the data from the given hddm_s structure. This is called
3042 /// from JEventSourceHDDM::GetObjects. If factory is NULL, this
3043 /// returns OBJECT_NOT_AVAILABLE immediately.
3044
3045 if (factory == NULL__null)
3046 return OBJECT_NOT_AVAILABLE;
3047 if (tag != "")
3048 return OBJECT_NOT_AVAILABLE;
3049
3050 vector<DDIRCTruthPmtHit*> data;
3051
3052
3053 const hddm_s::DircTruthPmtHitList &hits = record->getDircTruthPmtHits();
3054 hddm_s::DircTruthPmtHitList::iterator iter;
3055 for (iter = hits.begin(); iter != hits.end(); ++iter) {
3056 DDIRCTruthPmtHit *hit = new DDIRCTruthPmtHit;
3057 hit->x = iter->getX();
3058 hit->y = iter->getY();
3059 hit->z = iter->getZ();
3060 hit->t = iter->getT();
3061 hit->E = iter->getE();
3062 hit->ch = iter->getCh();
3063 hit->key_bar = iter->getKey_bar();
3064 hddm_s::DircTruthPmtHitExtraList &hitextras = iter->getDircTruthPmtHitExtras();
3065 if(hitextras.size() > 0) {
3066 hit->t_fixed = hitextras(0).getT_fixed();
3067 hit->path = hitextras(0).getPath();
3068 hit->refl = hitextras(0).getRefl();
3069 hit->bbrefl = hitextras(0).getBbrefl();
3070 }
3071 data.push_back(hit);
3072 }
3073
3074 // Copy into factory
3075 factory->CopyTo(data);
3076
3077 return NOERROR;
3078}