1
/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus
3
* MAUS is free software: you can redistribute it and/or modify
4
* it under the terms of the GNU General Public License as published by
5
* the Free Software Foundation, either version 3 of the License, or
6
* (at your option) any later version.
8
* MAUS is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with MAUS. If not, see <http://www.gnu.org/licenses/>.
18
#include "Utils/CppErrorHandler.hh"
19
#include "Utils/JsonWrapper.hh"
20
#include "Utils/DAQChannelMap.hh"
21
#include "Interface/dataCards.hh"
22
#include "API/PyWrapMapBase.hh"
23
#include "Converter/DataConverters/CppJsonSpillConverter.hh"
24
#include "Converter/DataConverters/JsonCppSpillConverter.hh"
26
#include "src/map/MapCppEMRRecon/MapCppEMRRecon.hh"
30
PyMODINIT_FUNC init_MapCppEMRRecon(void) {
31
PyWrapMapBase<MAUS::MapCppEMRRecon>::PyWrapMapBaseModInit
32
("MapCppEMRRecon", "", "", "", "");
35
MapCppEMRRecon::MapCppEMRRecon()
36
: MapBase<MAUS::Data>("MapCppEMRRecon") {
39
////////////////////////////////////////////////////////////////////////////
40
void MapCppEMRRecon::_birth(const std::string& argJsonConfigDocument) {
41
_classname = "MapCppEMRRecon";
42
char* pMAUS_ROOT_DIR = getenv("MAUS_ROOT_DIR");
44
if (!pMAUS_ROOT_DIR) {
45
throw MAUS::Exception(Exception::recoverable,
46
"Could not resolve ${MAUS_ROOT_DIR} environment variable",
47
"MapCppEMRRecon::birth");
51
Json::Value configJSON;
53
configJSON = JsonWrapper::StringToJson(argJsonConfigDocument);
56
_number_of_planes = configJSON["EMRnumberOfPlanes"].asInt();
57
_number_of_bars = configJSON["EMRnumberOfBars"].asInt();
59
_secondary_hits_bunching_distance = configJSON["EMRsecondaryHitsBunchingDistance"].asInt();
60
_secondary_hits_bunching_width = configJSON["EMRsecondaryHitsBunchingWidth"].asInt();
62
_primary_trigger_minXhits = configJSON["EMRprimaryTriggerMinXhits"].asInt();
63
_primary_trigger_minYhits = configJSON["EMRprimaryTriggerMinYhits"].asInt();
64
_primary_trigger_minNhits = configJSON["EMRprimaryTriggerMinNhits"].asInt();
65
_secondary_trigger_minXhits = configJSON["EMRsecondaryTriggerMinXhits"].asInt();
66
_secondary_trigger_minYhits = configJSON["EMRsecondaryTriggerMinYhits"].asInt();
67
_secondary_trigger_minNhits = configJSON["EMRsecondaryTriggerMinNhits"].asInt();
68
_secondary_trigger_minTot = configJSON["EMRsecondaryTriggerMinTot"].asInt();
70
_max_secondary_to_primary_track_distance
71
= configJSON["EMRmaxSecondaryToPrimaryTrackDistance"].asInt();
74
////////////////////////////////////////////////////////////////////////////
75
void MapCppEMRRecon::_death() {
78
////////////////////////////////////////////////////////////////////////////
79
void MapCppEMRRecon::_process(Data *data) const {
81
// Get spill, break if there's no recon data
82
Spill *spill = data->GetSpill();
84
int nPartEvents = spill->GetReconEventSize();
88
// Create DBB and fADC arrays with n+2 events (1 per trigger + noise + decays)
89
EMRDBBEventVector emr_dbb_events_tmp = get_dbb_data_tmp(nPartEvents);
90
EMRfADCEventVector emr_fadc_events_tmp = get_fadc_data_tmp(nPartEvents);
92
// Create DBB and fADC arrays to future host n+1+n' events (1 per trigger + noise + 1 per decay)
93
EMRDBBEventVector emr_dbb_events[3]; // preselected, primary, secondary
94
EMRfADCEventVector emr_fadc_events;
95
EMRTrackEventVector emr_track_events;
97
// Fill temporary array with preselected events
98
process_preselected_events(spill, emr_dbb_events_tmp, emr_fadc_events_tmp);
100
// Bunch secondary hits and place them in new reconEvents
101
process_secondary_events(emr_dbb_events_tmp, emr_fadc_events_tmp,
102
emr_dbb_events, emr_fadc_events, emr_track_events);
104
// Fill primary and secondary events array with the most significant bar of each plane
105
tot_cleaning(nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events);
107
// Reconstruct the coordinates of each Hit
108
coordinates_reconstruction(nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events);
110
// Match the primary tracks with their decay
111
track_matching(nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events);
113
// Fill the Recon event array with Spill information (1 per trigger + noise + decays)
114
fill(spill, nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events);
117
////////////////////////////////////////////////////////////////////////////
118
void MapCppEMRRecon::process_preselected_events(MAUS::Spill *spill,
119
EMRDBBEventVector& emr_dbb_events_tmp,
120
EMRfADCEventVector& emr_fadc_events_tmp) const {
122
int nPartEvents = spill->GetReconEvents()->size();
124
for (int iPe = 0; iPe < nPartEvents; iPe++) {
126
EMREvent *evt = spill->GetReconEvents()->at(iPe)->GetEMREvent();
128
int nPlHits = evt->GetEMRPlaneHitArray().size();
130
if ( !nPlHits ) continue;
132
// Total amount of bars hit in one trigger
134
for (int iPlane = 0; iPlane < nPlHits; iPlane++) {
135
EMRPlaneHit *plHit = evt->GetEMRPlaneHitArray().at(iPlane);
136
nBarsTotal += plHit->GetEMRBarArray().size();
139
// Fill collection of pre-selected events
140
for (int iPlane = 0; iPlane < nPlHits; iPlane++) {
142
EMRPlaneHit *plHit = evt->GetEMRPlaneHitArray().at(iPlane);
143
int xPlane = plHit->GetPlane();
144
int nBars = plHit->GetEMRBarArray().size();
146
for (int iBar = 0; iBar < nBars; iBar++) {
148
EMRBar *bar = plHit->GetEMRBarArray().at(iBar);
149
int xBar = bar->GetBar();
151
// Skip calibration channel
152
if (xBar == 0) continue;
154
int nBarHits = bar->GetEMRBarHitArray().size();
156
for (int iBarHit = 0; iBarHit < nBarHits; iBarHit++) {
158
EMRBarHit barHit = bar->GetEMRBarHitArray().at(iBarHit);
159
int xTot = barHit.GetTot();
160
int xDeltaT = barHit.GetDeltaT();
161
int xHitTime = barHit.GetHitTime();
168
bHit.SetDeltaT(xDeltaT);
169
bHit.SetHitTime(xHitTime);
174
emr_dbb_events_tmp[iPe][xPlane][xBar].push_back(bHit);
178
int xOri = plHit->GetOrientation();
179
int xArrivalTime = plHit->GetDeltaT();
180
double xCharge = plHit->GetCharge();
181
double xPedestalArea = plHit->GetPedestalArea();
182
std::vector<int> xSamples = plHit->GetSamples();
185
data._orientation = xOri;
186
data._charge = xCharge;
187
data._pedestal_area = xPedestalArea;
188
data._time = xArrivalTime;
189
data._samples = xSamples;
190
emr_fadc_events_tmp[iPe][xPlane] = data;
195
////////////////////////////////////////////////////////////////////////////
196
void MapCppEMRRecon::process_secondary_events(EMRDBBEventVector emr_dbb_events_tmp,
197
EMRfADCEventVector emr_fadc_events_tmp,
198
EMRDBBEventVector *emr_dbb_events,
199
EMRfADCEventVector& emr_fadc_events,
200
EMRTrackEventVector& emr_track_events) const {
202
int nPartEvents = emr_fadc_events_tmp.size();
204
// The last trigger corresponds to the secondary events
205
int secondaryEventId = nPartEvents-1;
207
// Save hit time of each secondary trigger in a vector
208
std::vector<int> hitTimeVector;
209
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
210
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
211
int nHits = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar].size();
213
for (int iBarHit = 0; iBarHit < nHits; iBarHit++) {
214
EMRBarHit bHit = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar][iBarHit];
215
int xTot = bHit.GetTot(); // DBB counts
216
int hitTime = bHit.GetHitTime(); // DBB counts
217
if (xTot > _secondary_trigger_minTot) hitTimeVector.push_back(hitTime);
222
// Sort the vector in ascending order
223
sort(hitTimeVector.begin(), hitTimeVector.end());
224
int hitTimeVectorSize = hitTimeVector.size();
226
// Find groups of hits defined by _secondary_hits_bunching_width
227
std::vector<int> hitTimeGroup;
228
int nHitsInGroup = 0;
230
for (int iHit = 1; iHit < hitTimeVectorSize+1; iHit++) {
232
if (iHit == hitTimeVectorSize) deltat = _secondary_hits_bunching_distance+1;
234
deltat = hitTimeVector.at(iHit) - hitTimeVector.at(iHit-1);
236
if (nHitsInGroup >= _secondary_trigger_minNhits &&
237
deltat > _secondary_hits_bunching_distance ) {
238
hitTimeGroup.push_back(hitTimeVector.at(iHit-1));
240
} else if (deltat <= _secondary_hits_bunching_width) {
245
// Number of the secondary trigger
246
int nSeconPartEvents = hitTimeGroup.size();
248
// Resize the event arrays to accomodate one extra event per secondary track (n')
249
for (int i = 0; i < 3; i++)
250
emr_dbb_events[i] = get_dbb_data_tmp(nPartEvents+nSeconPartEvents);
251
emr_fadc_events = get_fadc_data_tmp(nPartEvents+nSeconPartEvents);
252
emr_track_events = get_track_data_tmp(nPartEvents+nSeconPartEvents);
254
// Fill collection of events (pre-selected)
255
for (int iPe = 0; iPe < nPartEvents; iPe++) {
256
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
257
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
258
int nHits = emr_dbb_events_tmp[iPe][iPlane][iBar].size();
260
for (int iBarHit = 0; iBarHit < nHits; iBarHit++) {
261
EMRBarHit bHit = emr_dbb_events_tmp[iPe][iPlane][iBar][iBarHit];
262
emr_dbb_events[0][iPe][iPlane][iBar].push_back(bHit);
266
if (iPe < nPartEvents-2) { // All triggers except the noise and secondary
268
data._orientation = emr_fadc_events_tmp[iPe][iPlane]._orientation;
269
data._charge = emr_fadc_events_tmp[iPe][iPlane]._charge;
270
data._pedestal_area = emr_fadc_events_tmp[iPe][iPlane]._pedestal_area;
271
data._time = emr_fadc_events_tmp[iPe][iPlane]._time;
272
data._samples = emr_fadc_events_tmp[iPe][iPlane]._samples;
273
emr_fadc_events[iPe][iPlane] = data;
278
// Associate each bunch to a secondary trigger
279
for (int iHitTimeGroup = 0; iHitTimeGroup < nSeconPartEvents; iHitTimeGroup++) {
280
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
281
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
282
int nHits = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar].size();
284
for (int iBarHit = 0; iBarHit < nHits; iBarHit++) {
285
EMRBarHit bHit = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar][iBarHit];
286
int hitTime = bHit.GetHitTime(); // DBB counts
287
int deltat = hitTimeGroup.at(iHitTimeGroup) - hitTime;
289
if (deltat >= 0 && deltat < _secondary_hits_bunching_width) {
290
emr_dbb_events[0][secondaryEventId+1+iHitTimeGroup]
291
[iPlane][iBar].push_back(bHit);
299
////////////////////////////////////////////////////////////////////////////
300
void MapCppEMRRecon::tot_cleaning(int nPartEvents,
301
EMRDBBEventVector *emr_dbb_events,
302
EMRfADCEventVector& emr_fadc_events,
303
EMRTrackEventVector& emr_track_events) const {
305
int nTotalPartEvents = emr_fadc_events.size();
307
for (int iPe = 0; iPe < nTotalPartEvents; iPe++) {
308
// Skip noise and secondary triggers
309
if (iPe == nPartEvents-2 || iPe == nPartEvents-1) continue;
311
// Count number of X and Y planes hit
315
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
318
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
319
nHits = nHits + emr_dbb_events[0][iPe][iPlane][iBar].size();
321
if (nHits && iPlane % 2 == 0) xPlaneHits++;
322
if (nHits && iPlane % 2 == 1) yPlaneHits++;
325
// Reject triggers with too small amount of hits
326
if (iPe < nPartEvents-2 &&
327
(xPlaneHits < _primary_trigger_minXhits ||
328
yPlaneHits < _primary_trigger_minYhits ||
329
(xPlaneHits + yPlaneHits) < _primary_trigger_minNhits)) continue;
330
if (iPe >= nPartEvents &&
331
(xPlaneHits < _secondary_trigger_minXhits ||
332
yPlaneHits < _secondary_trigger_minYhits ||
333
(xPlaneHits + yPlaneHits) < _secondary_trigger_minNhits)) continue;
335
emr_track_events[iPe]._has_primary = true;
337
// Select the channel with the highest ToT in each plane
338
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
343
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
344
int nHits = emr_dbb_events[0][iPe][iPlane][iBar].size();
346
for (int iBarHit = 0; iBarHit < nHits; iBarHit++) {
347
EMRBarHit bHit = emr_dbb_events[0][iPe][iPlane][iBar][iBarHit];
348
int xTot = bHit.GetTot();
350
if (xTot > xTotMax) {
357
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
358
int nHits = emr_dbb_events[0][iPe][iPlane][iBar].size();
360
// Fill primary events array
361
for (int iBarHit = 0; iBarHit < nHits; iBarHit++) {
362
EMRBarHit bHit = emr_dbb_events[0][iPe][iPlane][iBar][iBarHit];
364
if (iBar == xBarMax && iBarHit == xHitMax &&
365
bHit.GetTot()>_secondary_trigger_minTot) {
366
emr_dbb_events[1][iPe][iPlane][iBar].push_back(bHit);
374
////////////////////////////////////////////////////////////////////////////
375
void MapCppEMRRecon::coordinates_reconstruction(int nPartEvents,
376
EMRDBBEventVector *emr_dbb_events,
377
EMRfADCEventVector& emr_fadc_events,
378
EMRTrackEventVector& emr_track_events) const {
380
int nTotalPartEvents = emr_fadc_events.size();
382
for (int iPe = 0; iPe < nTotalPartEvents; iPe++) {
384
// Skip noise and secondary triggers
385
if (iPe == nPartEvents-1 || iPe == nPartEvents-2) continue;
387
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
390
bool Hit0Found = false;
391
bool Hit1Found = false;
392
bool Hit2Found = false;
396
int x0(-1), x1(-1), x2(-1), y1(-1), y2(-1);
397
double y0(-1.0), a(-1.0), b(-1.0);
400
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
401
if (Hit0Found) break;
402
if (emr_dbb_events[1][iPe][iPlane][iBar].size()) {
403
Hit0 = emr_dbb_events[1][iPe][iPlane][iBar][0];
410
if (!Hit0Found) continue;
412
// Look backwards for hits
413
for (int aPlane = iPlane-1; aPlane >= 0; aPlane = aPlane-2) {
414
if (Hit1Found) break;
415
for (int aBar = 1; aBar < _number_of_bars; aBar++) { // Skip test channel
416
if (emr_dbb_events[1][iPe][aPlane][aBar].size()) {
426
// Look forward for hits
427
for (int bPlane = iPlane+1; bPlane < _number_of_planes; bPlane = bPlane+2) {
428
if (Hit1Found && Hit2Found) break;
429
for (int bBar = 1; bBar < _number_of_bars; bBar++) { // Skip test channel
430
if (emr_dbb_events[1][iPe][bPlane][bBar].size()) {
431
if (Hit2Found && !Hit1Found) {
445
// Look backwards for the second hit if nothing found in the forward direction
446
for (int aPlane = iPlane-1; aPlane >= 0; aPlane = aPlane-2) {
447
if (Hit1Found && Hit2Found) break;
448
if (aPlane == x1) continue;
449
for (int aBar = 1; aBar < _number_of_bars; aBar++) { // Skip test channel
450
if (emr_dbb_events[1][iPe][aPlane][aBar].size()) {
451
if (Hit1Found && !Hit2Found) {
460
// Calculate the coordinates of the hit in each plane
461
if (Hit1Found && Hit2Found) {
462
a = (static_cast<double>(y2)-static_cast<double>(y1))
463
/ (static_cast<double>(x2)-static_cast<double>(x1));
464
b = static_cast<double>(y1) - a*static_cast<double>(x1);
465
y0 = a*static_cast<double>(x0) + b;
468
if (Hit1Found && !Hit2Found) {
472
if (!Hit1Found && Hit2Found) {
476
if (iPlane % 2 == 0) {
477
emr_dbb_events[1][iPe][x0][barid][0].SetX(barid);
478
emr_dbb_events[1][iPe][x0][barid][0].SetY(y0);
480
if (iPlane % 2 == 1) {
481
emr_dbb_events[1][iPe][x0][barid][0].SetX(y0);
482
emr_dbb_events[1][iPe][x0][barid][0].SetY(barid);
484
emr_dbb_events[1][iPe][x0][barid][0].SetZ(x0);
489
////////////////////////////////////////////////////////////////////////////
490
void MapCppEMRRecon::track_matching(int nPartEvents,
491
EMRDBBEventVector *emr_dbb_events,
492
EMRfADCEventVector& emr_fadc_events,
493
EMRTrackEventVector& emr_track_events) const {
495
int nTotalPartEvents = emr_fadc_events.size();
497
for (int iPe = 0; iPe < nPartEvents; iPe++) {
498
// Range calculation of primary tracks
499
double x1(-1.0), y1(-1.0), z1(-1.0);
500
double x2(-1.0), y2(-1.0), z2(-1.0);
501
double primEventRange = 0.0;
502
bool primHitsFound = false;
504
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
505
for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel
506
if (emr_dbb_events[1][iPe][iPlane][iBar].size()) {
507
EMRBarHit bHit = emr_dbb_events[1][iPe][iPlane][iBar][0];
513
primEventRange = primEventRange + sqrt(pow(x1-x2, 2)+pow(y1-y2, 2)+pow(z1-z2, 2));
519
primHitsFound = true;
524
// Range calculation of secondary tracks
525
double minDist = 999.9;
526
int seconEventId = -1;
527
double seconEventRange = -1.0;
529
for (int iiPe = nPartEvents; iiPe < nTotalPartEvents; iiPe++) {
530
double x3(-1.0), y3(-1.0), z3(-1.0);
531
double x4(-1.0), y4(-1.0), z4(-1.0);
532
double x5(-1.0), y5(-1.0), z5(-1.0);
533
double seconEventRangeTmp = 0.0;
534
bool seconHitsFound = false;
536
for (int iiPlane = 0; iiPlane < _number_of_planes; iiPlane++) {
537
for (int iiBar = 1; iiBar < _number_of_bars; iiBar++) { // Skip test channel
538
if (emr_dbb_events[1][iiPe][iiPlane][iiBar].size()) {
539
EMRBarHit bHit = emr_dbb_events[1][iiPe][iiPlane][iiBar][0];
546
if (!seconHitsFound) {
552
if (seconHitsFound) {
553
seconEventRangeTmp = seconEventRangeTmp
554
+ sqrt(pow(x5-x4, 2)+pow(y5-y4, 2)+pow(z5-z4, 2));
560
seconHitsFound = true;
565
// Look for a track close enough to the primary to match it
566
if (seconHitsFound) {
567
double dist23 = sqrt(pow(x2-x3, 2)+pow(y2-y3, 2)+pow(z2-z3, 2));
568
double dist25 = sqrt(pow(x2-x5, 2)+pow(y2-y5, 2)+pow(z2-z5, 2));
569
double dist = std::min(dist23, dist25);
571
if (dist < minDist && dist < _max_secondary_to_primary_track_distance) {
574
seconEventRange = seconEventRangeTmp;
579
// std::cerr << "minDist: " << minDist << " seconEventId: " << seconEventId << std::endl;
580
// std::cerr << "Rp=" << primEventRange << " Rs=" << seconEventRange << " " << std::endl;
582
// If a secondary is found, fill the corresponding secondary array
583
if (seconEventId != -1) {
584
for (int iiPlane = 0; iiPlane < _number_of_planes; iiPlane++) {
585
for (int iiBar = 1; iiBar < _number_of_bars; iiBar++) { // Skip test channel
586
if (emr_dbb_events[1][seconEventId][iiPlane][iiBar].size()) {
587
EMRBarHit bHit = emr_dbb_events[1][seconEventId][iiPlane][iiBar][0];
588
emr_dbb_events[2][iPe][iiPlane][iiBar].push_back(bHit);
592
emr_track_events[iPe]._range_secondary = seconEventRange;
593
emr_track_events[iPe]._has_secondary = true;
594
emr_track_events[iPe]._secondary_to_primary_track_distance = minDist;
596
emr_track_events[iPe]._range_primary = primEventRange;
600
////////////////////////////////////////////////////////////////////////////
601
void MapCppEMRRecon::fill(Spill *spill,
603
EMRDBBEventVector *emr_dbb_events,
604
EMRfADCEventVector& emr_fadc_events,
605
EMRTrackEventVector& emr_track_events) const {
607
int nTotalPartEvents = emr_fadc_events.size();
608
int recPartEvents = spill->GetReconEventSize();
609
int xRun = spill->GetRunNumber();
610
int xSpill = spill->GetSpillNumber();
612
ReconEventPArray *recEvts = spill->GetReconEvents();
614
if (recPartEvents < nTotalPartEvents) {
615
for (int iPe = recPartEvents; iPe < nTotalPartEvents; iPe++)
616
recEvts->push_back(new ReconEvent);
619
for (int iPe = 0; iPe < nTotalPartEvents; iPe++) {
620
EMREvent *evt = new EMREvent;
621
EMRPlaneHitArray plArray;
623
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
624
int xOri = emr_fadc_events[iPe][iPlane]._orientation;
625
double xCharge = emr_fadc_events[iPe][iPlane]._charge;
626
int xArrivalTime = emr_fadc_events[iPe][iPlane]._time;
627
double xPedestalArea = emr_fadc_events[iPe][iPlane]._pedestal_area;
628
std::vector<int> xSamples = emr_fadc_events[iPe][iPlane]._samples;
630
EMRPlaneHit *plHit = new EMRPlaneHit;
631
plHit->SetPlane(iPlane);
632
plHit->SetTrigger(iPe);
634
plHit->SetOrientation(xOri);
635
plHit->SetCharge(xCharge);
636
plHit->SetDeltaT(xArrivalTime);
637
plHit->SetSpill(xSpill);
638
plHit->SetPedestalArea(xPedestalArea);
639
plHit->SetSamples(xSamples);
641
EMRBarArray barArray;
642
EMRBarArray barArrayPrimary;
643
EMRBarArray barArraySecondary;
644
for (int i = 0; i < 3; i++) {
645
for (int iBar = 1; iBar < _number_of_bars; iBar++) {
646
int nHits = emr_dbb_events[i][iPe][iPlane][iBar].size();
648
EMRBar *bar = new EMRBar;
650
bar->SetEMRBarHitArray(emr_dbb_events[i][iPe][iPlane][iBar]);
651
if (i == 0) barArray.push_back(bar);
652
if (i == 1) barArrayPrimary.push_back(bar);
653
if (i == 2) barArraySecondary.push_back(bar);
658
plHit->SetEMRBarArray(barArray);
659
plHit->SetEMRBarArrayPrimary(barArrayPrimary);
660
plHit->SetEMRBarArraySecondary(barArraySecondary);
661
if (barArray.size() || barArrayPrimary.size() || barArraySecondary.size() || xCharge) {
662
plArray.push_back(plHit);
665
evt->SetEMRPlaneHitArray(plArray);
666
evt->SetRangePrimary(emr_track_events[iPe]._range_primary);
667
evt->SetRangeSecondary(emr_track_events[iPe]._range_secondary);
668
evt->SetSecondaryToPrimaryTrackDistance
669
(emr_track_events[iPe]._secondary_to_primary_track_distance);
670
evt->SetHasPrimary(emr_track_events[iPe]._has_primary);
671
evt->SetHasSecondary(emr_track_events[iPe]._has_secondary);
673
if (iPe < nPartEvents-2) evt->SetInitialTrigger(true);
675
evt->SetInitialTrigger(false);
677
// std::cerr << "************************************************" << std::endl;
678
// std::cerr << "range_primary = " << emr_track_events[iPe]._range_primary << std::endl;
679
// std::cerr << "range_secondary = " << emr_track_events[iPe]._range_secondary << std::endl;
680
// std::cerr << "secondary_to_primary_track_distance = "
681
// << emr_track_events[iPe]._secondary_to_primary_track_distance << std::endl;
682
// std::cerr << "has_primary = " << emr_track_events[iPe]._has_primary << std::endl;
683
// std::cerr << "has_secondary = " << emr_track_events[iPe]._has_secondary << std::endl;
684
// std::cerr << "================================================" << std::endl;
686
recEvts->at(iPe)->SetEMREvent(evt);
687
recEvts->at(iPe)->SetPartEventNumber(iPe);
689
spill->SetReconEvents(recEvts);
692
EMRDBBEventVector MapCppEMRRecon::get_dbb_data_tmp(int nPartEvts) const {
693
EMRDBBEventVector emr_dbb_events_tmp;
694
emr_dbb_events_tmp.resize(nPartEvts);
695
for (int iPe = 0; iPe < nPartEvts; iPe++) {
696
emr_dbb_events_tmp[iPe].resize(_number_of_planes); // number of planes
697
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
698
emr_dbb_events_tmp[iPe][iPlane].resize(_number_of_bars); // number of bars in a plane
701
return emr_dbb_events_tmp;
704
EMRfADCEventVector MapCppEMRRecon::get_fadc_data_tmp(int nPartEvts) const {
705
EMRfADCEventVector emr_fadc_events_tmp;
706
emr_fadc_events_tmp.resize(nPartEvts);
707
for (int iPe = 0; iPe < nPartEvts ;iPe++) {
708
emr_fadc_events_tmp[iPe].resize(_number_of_planes);
709
for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) {
711
data._orientation = iPlane%2;
713
data._pedestal_area = 0.0;
715
std::vector<int> xSamples;
716
data._samples = xSamples;
717
emr_fadc_events_tmp[iPe][iPlane] = data;
720
return emr_fadc_events_tmp;
723
EMRTrackEventVector MapCppEMRRecon::get_track_data_tmp(int nPartEvts) const {
724
EMRTrackEventVector emr_track_events_tmp;
725
emr_track_events_tmp.resize(nPartEvts);
726
for (int iPe = 0; iPe < nPartEvts ;iPe++) {
728
data._range_primary = 0.0;
729
data._range_secondary = 0.0;
730
data._secondary_to_primary_track_distance = 0.0;
731
data._has_primary = false;
732
data._has_secondary = false;
733
emr_track_events_tmp[iPe] = data;
735
return emr_track_events_tmp;