/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #include "Utils/CppErrorHandler.hh" #include "Utils/JsonWrapper.hh" #include "Utils/DAQChannelMap.hh" #include "Interface/dataCards.hh" #include "API/PyWrapMapBase.hh" #include "Converter/DataConverters/CppJsonSpillConverter.hh" #include "Converter/DataConverters/JsonCppSpillConverter.hh" #include "src/map/MapCppEMRRecon/MapCppEMRRecon.hh" namespace MAUS { PyMODINIT_FUNC init_MapCppEMRRecon(void) { PyWrapMapBase::PyWrapMapBaseModInit ("MapCppEMRRecon", "", "", "", ""); } MapCppEMRRecon::MapCppEMRRecon() : MapBase("MapCppEMRRecon") { } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::_birth(const std::string& argJsonConfigDocument) { _classname = "MapCppEMRRecon"; char* pMAUS_ROOT_DIR = getenv("MAUS_ROOT_DIR"); if (!pMAUS_ROOT_DIR) { throw MAUS::Exception(Exception::recoverable, "Could not resolve ${MAUS_ROOT_DIR} environment variable", "MapCppEMRRecon::birth"); } // JsonCpp setup Json::Value configJSON; configJSON = JsonWrapper::StringToJson(argJsonConfigDocument); // Fetch variables _number_of_planes = configJSON["EMRnumberOfPlanes"].asInt(); _number_of_bars = configJSON["EMRnumberOfBars"].asInt(); _secondary_hits_bunching_distance = configJSON["EMRsecondaryHitsBunchingDistance"].asInt(); _secondary_hits_bunching_width = configJSON["EMRsecondaryHitsBunchingWidth"].asInt(); _primary_trigger_minXhits = configJSON["EMRprimaryTriggerMinXhits"].asInt(); _primary_trigger_minYhits = configJSON["EMRprimaryTriggerMinYhits"].asInt(); _primary_trigger_minNhits = configJSON["EMRprimaryTriggerMinNhits"].asInt(); _secondary_trigger_minXhits = configJSON["EMRsecondaryTriggerMinXhits"].asInt(); _secondary_trigger_minYhits = configJSON["EMRsecondaryTriggerMinYhits"].asInt(); _secondary_trigger_minNhits = configJSON["EMRsecondaryTriggerMinNhits"].asInt(); _secondary_trigger_minTot = configJSON["EMRsecondaryTriggerMinTot"].asInt(); _max_secondary_to_primary_track_distance = configJSON["EMRmaxSecondaryToPrimaryTrackDistance"].asInt(); } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::_death() { } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::_process(Data *data) const { // Get spill, break if there's no recon data Spill *spill = data->GetSpill(); int nPartEvents = spill->GetReconEventSize(); if (!nPartEvents) return; // Create DBB and fADC arrays with n+2 events (1 per trigger + noise + decays) EMRDBBEventVector emr_dbb_events_tmp = get_dbb_data_tmp(nPartEvents); EMRfADCEventVector emr_fadc_events_tmp = get_fadc_data_tmp(nPartEvents); // Create DBB and fADC arrays to future host n+1+n' events (1 per trigger + noise + 1 per decay) EMRDBBEventVector emr_dbb_events[3]; // preselected, primary, secondary EMRfADCEventVector emr_fadc_events; EMRTrackEventVector emr_track_events; // Fill temporary array with preselected events process_preselected_events(spill, emr_dbb_events_tmp, emr_fadc_events_tmp); // Bunch secondary hits and place them in new reconEvents process_secondary_events(emr_dbb_events_tmp, emr_fadc_events_tmp, emr_dbb_events, emr_fadc_events, emr_track_events); // Fill primary and secondary events array with the most significant bar of each plane tot_cleaning(nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events); // Reconstruct the coordinates of each Hit coordinates_reconstruction(nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events); // Match the primary tracks with their decay track_matching(nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events); // Fill the Recon event array with Spill information (1 per trigger + noise + decays) fill(spill, nPartEvents, emr_dbb_events, emr_fadc_events, emr_track_events); } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::process_preselected_events(MAUS::Spill *spill, EMRDBBEventVector& emr_dbb_events_tmp, EMRfADCEventVector& emr_fadc_events_tmp) const { int nPartEvents = spill->GetReconEvents()->size(); for (int iPe = 0; iPe < nPartEvents; iPe++) { EMREvent *evt = spill->GetReconEvents()->at(iPe)->GetEMREvent(); int nPlHits = evt->GetEMRPlaneHitArray().size(); if ( !nPlHits ) continue; // Total amount of bars hit in one trigger int nBarsTotal = 0; for (int iPlane = 0; iPlane < nPlHits; iPlane++) { EMRPlaneHit *plHit = evt->GetEMRPlaneHitArray().at(iPlane); nBarsTotal += plHit->GetEMRBarArray().size(); } // Fill collection of pre-selected events for (int iPlane = 0; iPlane < nPlHits; iPlane++) { EMRPlaneHit *plHit = evt->GetEMRPlaneHitArray().at(iPlane); int xPlane = plHit->GetPlane(); int nBars = plHit->GetEMRBarArray().size(); for (int iBar = 0; iBar < nBars; iBar++) { EMRBar *bar = plHit->GetEMRBarArray().at(iBar); int xBar = bar->GetBar(); // Skip calibration channel if (xBar == 0) continue; int nBarHits = bar->GetEMRBarHitArray().size(); for (int iBarHit = 0; iBarHit < nBarHits; iBarHit++) { EMRBarHit barHit = bar->GetEMRBarHitArray().at(iBarHit); int xTot = barHit.GetTot(); int xDeltaT = barHit.GetDeltaT(); int xHitTime = barHit.GetHitTime(); double x = 0.0; double y = 0.0; double z = 0.0; EMRBarHit bHit; bHit.SetTot(xTot); bHit.SetDeltaT(xDeltaT); bHit.SetHitTime(xHitTime); bHit.SetX(x); bHit.SetY(y); bHit.SetZ(z); emr_dbb_events_tmp[iPe][xPlane][xBar].push_back(bHit); } } int xOri = plHit->GetOrientation(); int xArrivalTime = plHit->GetDeltaT(); double xCharge = plHit->GetCharge(); double xPedestalArea = plHit->GetPedestalArea(); std::vector xSamples = plHit->GetSamples(); fADCdata data; data._orientation = xOri; data._charge = xCharge; data._pedestal_area = xPedestalArea; data._time = xArrivalTime; data._samples = xSamples; emr_fadc_events_tmp[iPe][xPlane] = data; } } } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::process_secondary_events(EMRDBBEventVector emr_dbb_events_tmp, EMRfADCEventVector emr_fadc_events_tmp, EMRDBBEventVector *emr_dbb_events, EMRfADCEventVector& emr_fadc_events, EMRTrackEventVector& emr_track_events) const { int nPartEvents = emr_fadc_events_tmp.size(); // The last trigger corresponds to the secondary events int secondaryEventId = nPartEvents-1; // Save hit time of each secondary trigger in a vector std::vector hitTimeVector; for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel int nHits = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar].size(); for (int iBarHit = 0; iBarHit < nHits; iBarHit++) { EMRBarHit bHit = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar][iBarHit]; int xTot = bHit.GetTot(); // DBB counts int hitTime = bHit.GetHitTime(); // DBB counts if (xTot > _secondary_trigger_minTot) hitTimeVector.push_back(hitTime); } } } // Sort the vector in ascending order sort(hitTimeVector.begin(), hitTimeVector.end()); int hitTimeVectorSize = hitTimeVector.size(); // Find groups of hits defined by _secondary_hits_bunching_width std::vector hitTimeGroup; int nHitsInGroup = 0; for (int iHit = 1; iHit < hitTimeVectorSize+1; iHit++) { int deltat; if (iHit == hitTimeVectorSize) deltat = _secondary_hits_bunching_distance+1; else deltat = hitTimeVector.at(iHit) - hitTimeVector.at(iHit-1); if (nHitsInGroup >= _secondary_trigger_minNhits && deltat > _secondary_hits_bunching_distance ) { hitTimeGroup.push_back(hitTimeVector.at(iHit-1)); nHitsInGroup = 0; } else if (deltat <= _secondary_hits_bunching_width) { nHitsInGroup++; } } // Number of the secondary trigger int nSeconPartEvents = hitTimeGroup.size(); // Resize the event arrays to accomodate one extra event per secondary track (n') for (int i = 0; i < 3; i++) emr_dbb_events[i] = get_dbb_data_tmp(nPartEvents+nSeconPartEvents); emr_fadc_events = get_fadc_data_tmp(nPartEvents+nSeconPartEvents); emr_track_events = get_track_data_tmp(nPartEvents+nSeconPartEvents); // Fill collection of events (pre-selected) for (int iPe = 0; iPe < nPartEvents; iPe++) { for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel int nHits = emr_dbb_events_tmp[iPe][iPlane][iBar].size(); for (int iBarHit = 0; iBarHit < nHits; iBarHit++) { EMRBarHit bHit = emr_dbb_events_tmp[iPe][iPlane][iBar][iBarHit]; emr_dbb_events[0][iPe][iPlane][iBar].push_back(bHit); } } if (iPe < nPartEvents-2) { // All triggers except the noise and secondary fADCdata data; data._orientation = emr_fadc_events_tmp[iPe][iPlane]._orientation; data._charge = emr_fadc_events_tmp[iPe][iPlane]._charge; data._pedestal_area = emr_fadc_events_tmp[iPe][iPlane]._pedestal_area; data._time = emr_fadc_events_tmp[iPe][iPlane]._time; data._samples = emr_fadc_events_tmp[iPe][iPlane]._samples; emr_fadc_events[iPe][iPlane] = data; } } } // Associate each bunch to a secondary trigger for (int iHitTimeGroup = 0; iHitTimeGroup < nSeconPartEvents; iHitTimeGroup++) { for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel int nHits = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar].size(); for (int iBarHit = 0; iBarHit < nHits; iBarHit++) { EMRBarHit bHit = emr_dbb_events_tmp[secondaryEventId][iPlane][iBar][iBarHit]; int hitTime = bHit.GetHitTime(); // DBB counts int deltat = hitTimeGroup.at(iHitTimeGroup) - hitTime; if (deltat >= 0 && deltat < _secondary_hits_bunching_width) { emr_dbb_events[0][secondaryEventId+1+iHitTimeGroup] [iPlane][iBar].push_back(bHit); } } } } } } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::tot_cleaning(int nPartEvents, EMRDBBEventVector *emr_dbb_events, EMRfADCEventVector& emr_fadc_events, EMRTrackEventVector& emr_track_events) const { int nTotalPartEvents = emr_fadc_events.size(); for (int iPe = 0; iPe < nTotalPartEvents; iPe++) { // Skip noise and secondary triggers if (iPe == nPartEvents-2 || iPe == nPartEvents-1) continue; // Count number of X and Y planes hit int xPlaneHits = 0; int yPlaneHits = 0; for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { int nHits = 0; for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel nHits = nHits + emr_dbb_events[0][iPe][iPlane][iBar].size(); } if (nHits && iPlane % 2 == 0) xPlaneHits++; if (nHits && iPlane % 2 == 1) yPlaneHits++; } // Reject triggers with too small amount of hits if (iPe < nPartEvents-2 && (xPlaneHits < _primary_trigger_minXhits || yPlaneHits < _primary_trigger_minYhits || (xPlaneHits + yPlaneHits) < _primary_trigger_minNhits)) continue; if (iPe >= nPartEvents && (xPlaneHits < _secondary_trigger_minXhits || yPlaneHits < _secondary_trigger_minYhits || (xPlaneHits + yPlaneHits) < _secondary_trigger_minNhits)) continue; emr_track_events[iPe]._has_primary = true; // Select the channel with the highest ToT in each plane for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { int xTotMax = 0; int xBarMax = 0; int xHitMax = 0; for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel int nHits = emr_dbb_events[0][iPe][iPlane][iBar].size(); for (int iBarHit = 0; iBarHit < nHits; iBarHit++) { EMRBarHit bHit = emr_dbb_events[0][iPe][iPlane][iBar][iBarHit]; int xTot = bHit.GetTot(); if (xTot > xTotMax) { xTotMax = xTot; xHitMax = iBarHit; xBarMax = iBar; } } } for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel int nHits = emr_dbb_events[0][iPe][iPlane][iBar].size(); // Fill primary events array for (int iBarHit = 0; iBarHit < nHits; iBarHit++) { EMRBarHit bHit = emr_dbb_events[0][iPe][iPlane][iBar][iBarHit]; if (iBar == xBarMax && iBarHit == xHitMax && bHit.GetTot()>_secondary_trigger_minTot) { emr_dbb_events[1][iPe][iPlane][iBar].push_back(bHit); } } } } } } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::coordinates_reconstruction(int nPartEvents, EMRDBBEventVector *emr_dbb_events, EMRfADCEventVector& emr_fadc_events, EMRTrackEventVector& emr_track_events) const { int nTotalPartEvents = emr_fadc_events.size(); for (int iPe = 0; iPe < nTotalPartEvents; iPe++) { // Skip noise and secondary triggers if (iPe == nPartEvents-1 || iPe == nPartEvents-2) continue; for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { EMRBarHit Hit0; bool Hit0Found = false; bool Hit1Found = false; bool Hit2Found = false; int barid = -1; int x0(-1), x1(-1), x2(-1), y1(-1), y2(-1); double y0(-1.0), a(-1.0), b(-1.0); // Find Primary hit for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel if (Hit0Found) break; if (emr_dbb_events[1][iPe][iPlane][iBar].size()) { Hit0 = emr_dbb_events[1][iPe][iPlane][iBar][0]; Hit0Found = true; x0 = iPlane; barid = iBar; } } if (!Hit0Found) continue; // Look backwards for hits for (int aPlane = iPlane-1; aPlane >= 0; aPlane = aPlane-2) { if (Hit1Found) break; for (int aBar = 1; aBar < _number_of_bars; aBar++) { // Skip test channel if (emr_dbb_events[1][iPe][aPlane][aBar].size()) { if (!Hit1Found) { Hit1Found = true; x1 = aPlane; y1 = aBar; } } } } // Look forward for hits for (int bPlane = iPlane+1; bPlane < _number_of_planes; bPlane = bPlane+2) { if (Hit1Found && Hit2Found) break; for (int bBar = 1; bBar < _number_of_bars; bBar++) { // Skip test channel if (emr_dbb_events[1][iPe][bPlane][bBar].size()) { if (Hit2Found && !Hit1Found) { Hit1Found = true; x1 = bPlane; y1 = bBar; } if (!Hit2Found) { Hit2Found = true; x2 = bPlane; y2 = bBar; } } } } // Look backwards for the second hit if nothing found in the forward direction for (int aPlane = iPlane-1; aPlane >= 0; aPlane = aPlane-2) { if (Hit1Found && Hit2Found) break; if (aPlane == x1) continue; for (int aBar = 1; aBar < _number_of_bars; aBar++) { // Skip test channel if (emr_dbb_events[1][iPe][aPlane][aBar].size()) { if (Hit1Found && !Hit2Found) { Hit2Found = true; x2 = aPlane; y2 = aBar; } } } } // Calculate the coordinates of the hit in each plane if (Hit1Found && Hit2Found) { a = (static_cast(y2)-static_cast(y1)) / (static_cast(x2)-static_cast(x1)); b = static_cast(y1) - a*static_cast(x1); y0 = a*static_cast(x0) + b; } if (Hit1Found && !Hit2Found) { y0 = y1; } if (!Hit1Found && Hit2Found) { y0 = y2; } if (iPlane % 2 == 0) { emr_dbb_events[1][iPe][x0][barid][0].SetX(barid); emr_dbb_events[1][iPe][x0][barid][0].SetY(y0); } if (iPlane % 2 == 1) { emr_dbb_events[1][iPe][x0][barid][0].SetX(y0); emr_dbb_events[1][iPe][x0][barid][0].SetY(barid); } emr_dbb_events[1][iPe][x0][barid][0].SetZ(x0); } } } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::track_matching(int nPartEvents, EMRDBBEventVector *emr_dbb_events, EMRfADCEventVector& emr_fadc_events, EMRTrackEventVector& emr_track_events) const { int nTotalPartEvents = emr_fadc_events.size(); for (int iPe = 0; iPe < nPartEvents; iPe++) { // Range calculation of primary tracks double x1(-1.0), y1(-1.0), z1(-1.0); double x2(-1.0), y2(-1.0), z2(-1.0); double primEventRange = 0.0; bool primHitsFound = false; for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { for (int iBar = 1; iBar < _number_of_bars; iBar++) { // Skip test channel if (emr_dbb_events[1][iPe][iPlane][iBar].size()) { EMRBarHit bHit = emr_dbb_events[1][iPe][iPlane][iBar][0]; // Last point x2 = bHit.GetX(); y2 = bHit.GetY(); z2 = bHit.GetZ(); if (primHitsFound) { primEventRange = primEventRange + sqrt(pow(x1-x2, 2)+pow(y1-y2, 2)+pow(z1-z2, 2)); } // Previous point x1 = bHit.GetX(); y1 = bHit.GetY(); z1 = bHit.GetZ(); primHitsFound = true; } } } // Range calculation of secondary tracks double minDist = 999.9; int seconEventId = -1; double seconEventRange = -1.0; for (int iiPe = nPartEvents; iiPe < nTotalPartEvents; iiPe++) { double x3(-1.0), y3(-1.0), z3(-1.0); double x4(-1.0), y4(-1.0), z4(-1.0); double x5(-1.0), y5(-1.0), z5(-1.0); double seconEventRangeTmp = 0.0; bool seconHitsFound = false; for (int iiPlane = 0; iiPlane < _number_of_planes; iiPlane++) { for (int iiBar = 1; iiBar < _number_of_bars; iiBar++) { // Skip test channel if (emr_dbb_events[1][iiPe][iiPlane][iiBar].size()) { EMRBarHit bHit = emr_dbb_events[1][iiPe][iiPlane][iiBar][0]; // Last point x5 = bHit.GetX(); y5 = bHit.GetY(); z5 = bHit.GetZ(); if (!seconHitsFound) { // First point x3 = x5; y3 = y5; z3 = z5; } if (seconHitsFound) { seconEventRangeTmp = seconEventRangeTmp + sqrt(pow(x5-x4, 2)+pow(y5-y4, 2)+pow(z5-z4, 2)); } // Previous point x4 = bHit.GetX(); y4 = bHit.GetY(); z4 = bHit.GetZ(); seconHitsFound = true; } } } // Look for a track close enough to the primary to match it if (seconHitsFound) { double dist23 = sqrt(pow(x2-x3, 2)+pow(y2-y3, 2)+pow(z2-z3, 2)); double dist25 = sqrt(pow(x2-x5, 2)+pow(y2-y5, 2)+pow(z2-z5, 2)); double dist = std::min(dist23, dist25); if (dist < minDist && dist < _max_secondary_to_primary_track_distance) { minDist = dist; seconEventId = iiPe; seconEventRange = seconEventRangeTmp; } } } // std::cerr << "minDist: " << minDist << " seconEventId: " << seconEventId << std::endl; // std::cerr << "Rp=" << primEventRange << " Rs=" << seconEventRange << " " << std::endl; // If a secondary is found, fill the corresponding secondary array if (seconEventId != -1) { for (int iiPlane = 0; iiPlane < _number_of_planes; iiPlane++) { for (int iiBar = 1; iiBar < _number_of_bars; iiBar++) { // Skip test channel if (emr_dbb_events[1][seconEventId][iiPlane][iiBar].size()) { EMRBarHit bHit = emr_dbb_events[1][seconEventId][iiPlane][iiBar][0]; emr_dbb_events[2][iPe][iiPlane][iiBar].push_back(bHit); } } } emr_track_events[iPe]._range_secondary = seconEventRange; emr_track_events[iPe]._has_secondary = true; emr_track_events[iPe]._secondary_to_primary_track_distance = minDist; } emr_track_events[iPe]._range_primary = primEventRange; } } //////////////////////////////////////////////////////////////////////////// void MapCppEMRRecon::fill(Spill *spill, int nPartEvents, EMRDBBEventVector *emr_dbb_events, EMRfADCEventVector& emr_fadc_events, EMRTrackEventVector& emr_track_events) const { int nTotalPartEvents = emr_fadc_events.size(); int recPartEvents = spill->GetReconEventSize(); int xRun = spill->GetRunNumber(); int xSpill = spill->GetSpillNumber(); ReconEventPArray *recEvts = spill->GetReconEvents(); if (recPartEvents < nTotalPartEvents) { for (int iPe = recPartEvents; iPe < nTotalPartEvents; iPe++) recEvts->push_back(new ReconEvent); } for (int iPe = 0; iPe < nTotalPartEvents; iPe++) { EMREvent *evt = new EMREvent; EMRPlaneHitArray plArray; for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { int xOri = emr_fadc_events[iPe][iPlane]._orientation; double xCharge = emr_fadc_events[iPe][iPlane]._charge; int xArrivalTime = emr_fadc_events[iPe][iPlane]._time; double xPedestalArea = emr_fadc_events[iPe][iPlane]._pedestal_area; std::vector xSamples = emr_fadc_events[iPe][iPlane]._samples; EMRPlaneHit *plHit = new EMRPlaneHit; plHit->SetPlane(iPlane); plHit->SetTrigger(iPe); plHit->SetRun(xRun); plHit->SetOrientation(xOri); plHit->SetCharge(xCharge); plHit->SetDeltaT(xArrivalTime); plHit->SetSpill(xSpill); plHit->SetPedestalArea(xPedestalArea); plHit->SetSamples(xSamples); EMRBarArray barArray; EMRBarArray barArrayPrimary; EMRBarArray barArraySecondary; for (int i = 0; i < 3; i++) { for (int iBar = 1; iBar < _number_of_bars; iBar++) { int nHits = emr_dbb_events[i][iPe][iPlane][iBar].size(); if (nHits) { EMRBar *bar = new EMRBar; bar->SetBar(iBar); bar->SetEMRBarHitArray(emr_dbb_events[i][iPe][iPlane][iBar]); if (i == 0) barArray.push_back(bar); if (i == 1) barArrayPrimary.push_back(bar); if (i == 2) barArraySecondary.push_back(bar); } } } plHit->SetEMRBarArray(barArray); plHit->SetEMRBarArrayPrimary(barArrayPrimary); plHit->SetEMRBarArraySecondary(barArraySecondary); if (barArray.size() || barArrayPrimary.size() || barArraySecondary.size() || xCharge) { plArray.push_back(plHit); } } evt->SetEMRPlaneHitArray(plArray); evt->SetRangePrimary(emr_track_events[iPe]._range_primary); evt->SetRangeSecondary(emr_track_events[iPe]._range_secondary); evt->SetSecondaryToPrimaryTrackDistance (emr_track_events[iPe]._secondary_to_primary_track_distance); evt->SetHasPrimary(emr_track_events[iPe]._has_primary); evt->SetHasSecondary(emr_track_events[iPe]._has_secondary); if (iPe < nPartEvents-2) evt->SetInitialTrigger(true); else evt->SetInitialTrigger(false); // std::cerr << "************************************************" << std::endl; // std::cerr << "range_primary = " << emr_track_events[iPe]._range_primary << std::endl; // std::cerr << "range_secondary = " << emr_track_events[iPe]._range_secondary << std::endl; // std::cerr << "secondary_to_primary_track_distance = " // << emr_track_events[iPe]._secondary_to_primary_track_distance << std::endl; // std::cerr << "has_primary = " << emr_track_events[iPe]._has_primary << std::endl; // std::cerr << "has_secondary = " << emr_track_events[iPe]._has_secondary << std::endl; // std::cerr << "================================================" << std::endl; recEvts->at(iPe)->SetEMREvent(evt); recEvts->at(iPe)->SetPartEventNumber(iPe); } spill->SetReconEvents(recEvts); } EMRDBBEventVector MapCppEMRRecon::get_dbb_data_tmp(int nPartEvts) const { EMRDBBEventVector emr_dbb_events_tmp; emr_dbb_events_tmp.resize(nPartEvts); for (int iPe = 0; iPe < nPartEvts; iPe++) { emr_dbb_events_tmp[iPe].resize(_number_of_planes); // number of planes for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { emr_dbb_events_tmp[iPe][iPlane].resize(_number_of_bars); // number of bars in a plane } } return emr_dbb_events_tmp; } EMRfADCEventVector MapCppEMRRecon::get_fadc_data_tmp(int nPartEvts) const { EMRfADCEventVector emr_fadc_events_tmp; emr_fadc_events_tmp.resize(nPartEvts); for (int iPe = 0; iPe < nPartEvts ;iPe++) { emr_fadc_events_tmp[iPe].resize(_number_of_planes); for (int iPlane = 0; iPlane < _number_of_planes; iPlane++) { fADCdata data; data._orientation = iPlane%2; data._charge = 0.0; data._pedestal_area = 0.0; data._time = 0; std::vector xSamples; data._samples = xSamples; emr_fadc_events_tmp[iPe][iPlane] = data; } } return emr_fadc_events_tmp; } EMRTrackEventVector MapCppEMRRecon::get_track_data_tmp(int nPartEvts) const { EMRTrackEventVector emr_track_events_tmp; emr_track_events_tmp.resize(nPartEvts); for (int iPe = 0; iPe < nPartEvts ;iPe++) { TrackData data; data._range_primary = 0.0; data._range_secondary = 0.0; data._secondary_to_primary_track_distance = 0.0; data._has_primary = false; data._has_secondary = false; emr_track_events_tmp[iPe] = data; } return emr_track_events_tmp; } }