Bug Summary

File:/home/sdobbs/work/clang/halld_recon/src/libraries/HDDM/DEventSourceHDDM.cc
Warning:line 282, column 56
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

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