diff --git a/core/detectors/trd/CbmTrdGeoHandler.cxx b/core/detectors/trd/CbmTrdGeoHandler.cxx index d0e082225fad87d8747f796cd1d8e6eb47dd93f5..cff3dcf2e586791bd69fec7518277cf4383224b5 100644 --- a/core/detectors/trd/CbmTrdGeoHandler.cxx +++ b/core/detectors/trd/CbmTrdGeoHandler.cxx @@ -192,10 +192,17 @@ void CbmTrdGeoHandler::NavigateTo(const TString& path) Double_t local[3] = {0., 0., 0.}; // Local center of volume gGeoManager->LocalToMaster(local, fGlobal); fGlobalMatrix = gGeoManager->GetCurrentMatrix(); - // Get module type information which is decoded in copy number. - const char* moduleName = gGeoManager->GetMother()->GetName(); - fModuleType = std::atoi(string(1, *(moduleName + 6)).c_str()); // 6th element module type + // Get module type information which is decoded in copy number. + std::string moduleName = gGeoManager->GetMother()->GetName(); + auto typeposstart = moduleName.find("module") + 6; + uint ndigits = 0; + auto partoftype = moduleName.at(typeposstart); + while (std::isdigit(partoftype) && (ndigits + typeposstart) < moduleName.size()) { + partoftype = moduleName.at(typeposstart + ndigits); + ++ndigits; + } + fModuleType = std::atoi(moduleName.substr(typeposstart, ndigits).data()); // 6th element+ module type // We take the mother of the mother node (layer) of the current node we are in (gas). TGeoNode* layernode = gGeoManager->GetMother(2); // get layer Int_t layercopyNr = layernode->GetNumber(); diff --git a/core/detectors/trd/CbmTrdParSet.cxx b/core/detectors/trd/CbmTrdParSet.cxx index f58ba93b4c49d21528ef430f2463aa5d524c4b41..98165360d5e704c812680bc84cabb126079b6edf 100644 --- a/core/detectors/trd/CbmTrdParSet.cxx +++ b/core/detectors/trd/CbmTrdParSet.cxx @@ -53,6 +53,14 @@ const CbmTrdParMod* CbmTrdParSet::GetModulePar(Int_t detId) const return imod->second; } +//_______________________________________________________________________________ +CbmTrdParMod* CbmTrdParSet::GetModulePar(Int_t detId) +{ + map<Int_t, CbmTrdParMod*>::const_iterator imod = fModuleMap.find(detId); + if (imod == fModuleMap.end()) return nullptr; + return imod->second; +} + //_______________________________________________________________________________ Bool_t CbmTrdParSet::getParams(FairParamList* l) { diff --git a/core/detectors/trd/CbmTrdParSet.h b/core/detectors/trd/CbmTrdParSet.h index f736bc1de6c29b1e17e5e23458cc7afddb6c8173..e57ac3954acde15a04f916065f1c85a6d78cad7a 100644 --- a/core/detectors/trd/CbmTrdParSet.h +++ b/core/detectors/trd/CbmTrdParSet.h @@ -34,6 +34,7 @@ public: virtual Int_t GetModuleId(Int_t i) const; virtual const CbmTrdParMod* GetModulePar(Int_t detId) const; + virtual CbmTrdParMod* GetModulePar(Int_t detId); virtual Int_t GetNrOfModules() const { return fNrOfModules; } std::map<Int_t, CbmTrdParMod*> GetModuleMap() { return fModuleMap; } virtual void addParam(CbmTrdParMod* mod); diff --git a/core/detectors/trd/CbmTrdParSetAsic.cxx b/core/detectors/trd/CbmTrdParSetAsic.cxx index bcd84aeaa53288f3b1ed8883b61a938d93248ff8..51e8bf447639926f6ce2892e9fa8423efc79ec0f 100644 --- a/core/detectors/trd/CbmTrdParSetAsic.cxx +++ b/core/detectors/trd/CbmTrdParSetAsic.cxx @@ -43,9 +43,20 @@ CbmTrdParSetAsic::~CbmTrdParSetAsic() fModPar.clear(); } } + +//_______________________________________________________________________________ +void CbmTrdParSetAsic::addParam(CbmTrdParMod* mod) +{ + if (mod->IsA() != CbmTrdParFasp::Class() && mod->IsA() != CbmTrdParSpadic::Class()) return; + + fModuleMap[((CbmTrdParAsic*) mod)->GetAddress()] = mod; + fNrOfModules++; +} + //_______________________________________________________________________________ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) { + //LOG(info) << GetName() << "::getParams(FairParamList*)"; if (!l) return kFALSE; if (!l->fill("NrOfModules", &fNrOfModules)) return kFALSE; TArrayI moduleId(fNrOfModules); @@ -60,6 +71,7 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) if (nAsic[imod] > maxNrAsics) maxNrAsics = nAsic[imod]; } Int_t address(0); + fType = 0xff; CbmTrdParAsic* asic(nullptr); for (Int_t i = 0; i < fNrOfModules; i++) { @@ -74,10 +86,12 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) for (Int_t iasic = 0; iasic < nAsic[i]; iasic++) { Int_t offset = iasic * (sizePerFasp); address = values[offset + 0]; + if (address == moduleId[i] * 1000 + 999) continue; asic = new CbmTrdParFasp(address); static_cast<CbmTrdParFasp*>(asic)->LoadParams(values, iasic); fModPar[moduleId[i]]->SetAsicPar(address, asic); } + fModPar[moduleId[i]]->SetAsicType(1); } else { Int_t maxValues = maxNrAsics * (5 + NSPADICCH); @@ -97,6 +111,7 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) asic->SetChannelAddresses(addresses); fModPar[moduleId[i]]->SetAsicPar(address, asic); } + fModPar[moduleId[i]]->SetAsicType(0); } } return kTRUE; @@ -106,7 +121,7 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) void CbmTrdParSetAsic::putParams(FairParamList* l) { if (!l) return; - LOG(info) << GetName() << "::putParams(FairParamList*)"; + //LOG(info) << GetName() << "::putParams(FairParamList*)"; Int_t idx(0); TArrayI moduleId(fNrOfModules), nAsic(fNrOfModules), typeAsic(fNrOfModules); @@ -271,6 +286,7 @@ void CbmTrdParSetAsic::SetAsicPar(Int_t address, CbmTrdParAsic* p) { std::map<Int_t, CbmTrdParMod*>::iterator it = fModuleMap.find(address); if (it != fModuleMap.end()) { + if (address % 1000 == 999) return; LOG(warn) << GetName() << "::SetAsicPar : The ASIC @ " << address << " already initialized. Skip."; return; } diff --git a/core/detectors/trd/CbmTrdParSetAsic.h b/core/detectors/trd/CbmTrdParSetAsic.h index 8009ea17a87bad5510215455d69ffae6807892a5..8e7475a7fc51b3d0a50216ff2d2885c8bcdd22f2 100644 --- a/core/detectors/trd/CbmTrdParSetAsic.h +++ b/core/detectors/trd/CbmTrdParSetAsic.h @@ -30,6 +30,7 @@ public: /** \brief Reset all parameters **/ virtual void clear() { ; } + virtual void addParam(CbmTrdParMod* mod); void AddParameters(CbmTrdParSetAsic*); // (VF) renamed to avoid shadowing of virtual method Bool_t getParams(FairParamList*); void putParams(FairParamList*); diff --git a/macro/mcbm/geometry/trd/Create_TRD_Geometry_v21a.C b/macro/mcbm/geometry/trd/Create_TRD_Geometry_v21a.C index c74c43d849531a8052662b99327d573b1a9170d9..38bd7c1b1733c9ef339a05f9c477803967d2f08d 100644 --- a/macro/mcbm/geometry/trd/Create_TRD_Geometry_v21a.C +++ b/macro/mcbm/geometry/trd/Create_TRD_Geometry_v21a.C @@ -329,7 +329,8 @@ const Int_t layer3o[9][11] = { // Parameters defining the layout of the different detector modules const Int_t NofModuleTypes = 10; const Int_t ModuleType[NofModuleTypes] = { - 0, 0, 0, 2, 1, 1, 1, 1, 2, 3}; // 0 = small module, 1 = large module, 2 = mCBM Bucharest prototype + 0, 0, 0, 2, 1, 1, + 1, 1, 2, 3}; // 0 = small module, 1 = large module, 2 = mCBM Bucharest prototype, 3 = mCBM Bucharest TRD-2Dh prototype // FEB inclination angle const Double_t feb_rotation_angle[NofModuleTypes] = { @@ -2947,8 +2948,8 @@ void create_detector_layers(Int_t layerId) //install TRD2D detectors in the TRD setup Int_t type = -1; - if (layerId == 2 && layerType == 2) type = 9; - if (layerId == 3 && layerType == 2) type = 10; + if (layerId == 2 && layerType == 2) type = 10; + if (layerId == 3 && layerType == 2) type = 9; if (type < 0) return; Info("create_detector_layers", "add module[0x%p] of type[%d]", (void*) gModules[type - 1], type); @@ -2962,7 +2963,7 @@ void create_detector_layers(Int_t layerId) module_rotation = new TGeoRotation(); TGeoCombiTrans* module_placement = - new TGeoCombiTrans(xPos, yPos, LayerPosition[0] - (3 - layerId) * LayerThickness / 2, + new TGeoCombiTrans(xPos, yPos, LayerPosition[0] - (layerId - 1) * LayerThickness / 2, module_rotation); // shift by half layer thickness Int_t copy = copy_nr(1, 1, 0, PlaneId[layerId], 1); gGeoMan->GetVolume(layername)->AddNode(gModules[type - 1], copy, module_placement); diff --git a/macro/run/run_unpack_tsa.C b/macro/run/run_unpack_tsa.C index 8629aff0f4854c792c2f8e820646ea8df469b26a..7e9753cb124a23b268ad1a32510c883dcf8e0c14 100644 --- a/macro/run/run_unpack_tsa.C +++ b/macro/run/run_unpack_tsa.C @@ -159,7 +159,7 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid // ---- TRDFASP2D ---- std::shared_ptr<CbmTrdUnpackConfigFasp2D> trdfasp2dconfig = nullptr; - trdfasp2dconfig = std::make_shared<CbmTrdUnpackConfigFasp2D>("", runid); + trdfasp2dconfig = std::make_shared<CbmTrdUnpackConfigFasp2D>(trdsetuptag.Data(), 3); if (trdfasp2dconfig) { // trdfasp2dconfig->SetDebugState(); trdfasp2dconfig->SetDoWriteOutput(); diff --git a/reco/detectors/trd/CbmTrdRecoLinkDef.h b/reco/detectors/trd/CbmTrdRecoLinkDef.h index 016bd716063310a7a79b7f4331ba7f2a3b100aad..c0f2d416da957939c564ef5a1fc6ebb5067035b9 100644 --- a/reco/detectors/trd/CbmTrdRecoLinkDef.h +++ b/reco/detectors/trd/CbmTrdRecoLinkDef.h @@ -27,6 +27,7 @@ #pragma link C++ class CbmTrdRecoQa + ; #pragma link C++ class CbmTrdTracksPidQa + ; +#pragma link C++ class std::vector<std::pair<unsigned long, unsigned long>> + ; #pragma link C++ class CbmTrdUnpackAlgoBaseR + ; #pragma link C++ class CbmTrdUnpackAlgoR + ; #pragma link C++ class CbmTrdUnpackAlgoLegacy2020R + ; diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.cxx index 29ac720573721f9ec8fca2b2309a0e86cac90072..8fe568c0246224567af2cb159e845975b9227e3b 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.cxx +++ b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.cxx @@ -6,8 +6,17 @@ #include "CbmTrdUnpackAlgoFasp2D.h" #include "CbmTrdDigi.h" - +#include "CbmTrdParFasp.h" +#include "CbmTrdParModDigi.h" +#include "CbmTrdParSetDigi.h" +#include "CbmTrdParSetGain.h" +#include "CbmTrdParSetGas.h" +#include "CbmTrdParSpadic.h" + +#include <FairParAsciiFileIo.h> #include <FairParGenericSet.h> +#include <FairParamList.h> +#include <FairRuntimeDb.h> #include <FairTask.h> #include <Logger.h> @@ -18,13 +27,95 @@ using namespace std; -CbmTrdUnpackAlgoFasp2D::CbmTrdUnpackAlgoFasp2D() : CbmRecoUnpackAlgo("CbmTrdUnpackAlgoFasp2D") +CbmTrdUnpackAlgoFasp2D::CbmTrdUnpackAlgoFasp2D() + : CbmRecoUnpackAlgo("CbmTrdUnpackAlgoFasp2D") + , fModuleId() + , fAsicPar() + , fDigiSet(nullptr) { memset(fTime, 0, NCRI * sizeof(ULong64_t)); } +//_________________________________________________________________________________ CbmTrdUnpackAlgoFasp2D::~CbmTrdUnpackAlgoFasp2D() {} +//_________________________________________________________________________________ +Bool_t CbmTrdUnpackAlgoFasp2D::initParSet(FairParGenericSet* parset) +{ + FairParamList parList; + Int_t nModules(0); + if (strcmp(parset->ClassName(), "CbmTrdParSetAsic") == 0) { + CbmTrdParSetAsic* setPar = static_cast<CbmTrdParSetAsic*>(parset); + for (auto did : fModuleId) { + const CbmTrdParSetAsic* setDet = static_cast<const CbmTrdParSetAsic*>(setPar->GetModuleSet(did)); + if (!setDet) continue; + if (setDet->GetAsicType() != Int_t(CbmTrdDigi::eCbmTrdAsicType::kFASP)) continue; + nModules++; + std::vector<Int_t> a; + setDet->GetAsicAddresses(&a); + for (auto add : a) { + CbmTrdParAsic* asic = (CbmTrdParAsic*) setDet->GetModulePar(add); + if (asic->IsA() == CbmTrdParSpadic::Class()) continue; + fAsicPar.addParam(asic); + // asic->Print(); + } + } + // setPar->printParams(); + LOG(info) << GetName() << "::initParSet - for container " << parset->ClassName() << " modules " << nModules + << " asics " << fAsicPar.GetNrOfModules(); + } + else if (strcmp(parset->ClassName(), "CbmTrdParSetDigi") == 0) { + fDigiSet = static_cast<CbmTrdParSetDigi*>(parset); + map<Int_t, CbmTrdParMod*> digiPar = fDigiSet->GetModuleMap(); + for (auto digi : digiPar) + fModuleId.emplace_back(digi.first); + // setPar->printParams(); + LOG(info) << GetName() << "::initParSet - for container " << parset->ClassName() << " modules " << fModuleId.size(); + } + else if (strcmp(parset->ClassName(), "CbmTrdParSetGas") == 0) { + CbmTrdParSetGas* setPar = static_cast<CbmTrdParSetGas*>(parset); + setPar->printParams(); + nModules = setPar->GetNrOfModules(); + } + else if (strcmp(parset->ClassName(), "CbmTrdParSetGain") == 0) { + CbmTrdParSetGain* setPar = static_cast<CbmTrdParSetGain*>(parset); + setPar->printParams(); + nModules = setPar->GetNrOfModules(); + } + else { + LOG(error) << "Parameter set " << parset->ClassName() << " not known. Skip."; + return kFALSE; + } + return kTRUE; +} + +//_________________________________________________________________________________ +std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>* +CbmTrdUnpackAlgoFasp2D::GetParContainerRequest(std::string geoTag, std::uint32_t runId) +{ + LOG(info) << GetName() << "::GetParContainerRequest - for container " << geoTag.data() << " run " << runId << " " + << fParFilesBasePath.data(); + + // Basepath for default Trd parameter sets (those connected to a geoTag) + std::string basepath = Form("%s/trd_%s", fParFilesBasePath.data(), geoTag.data()); + std::string temppath = ""; + + // Digest the runId information in case of runId = 0 we use the default fall back + std::string runpath = ""; + if (runId != 0) { runpath = ".run" + std::to_string(runId); } + + temppath = basepath + runpath + ".digi" + ".par"; + fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmTrdParSetDigi>())); + temppath = basepath + runpath + ".asic" + ".par"; + fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmTrdParSetAsic>())); + // temppath = basepath + runpath + ".gas" + ".par"; + // fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmTrdParSetGas>())); + // temppath = basepath + runpath + ".gain" + ".par"; + // fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmTrdParSetGain>())); + + return &fParContVec; +} + //_________________________________________________________________________________ CbmTrdUnpackAlgoFasp2D::CbmTrdFaspMessageType CbmTrdUnpackAlgoFasp2D::mess_type(uint32_t wd) { @@ -82,25 +173,56 @@ void CbmTrdUnpackAlgoFasp2D::mess_prt(CbmTrdFaspContent* mess) bool CbmTrdUnpackAlgoFasp2D::pushDigis( std::map<UChar_t, std::vector<CbmTrdUnpackAlgoFasp2D::CbmTrdFaspContent*>> messes) { - bool use(false); + bool use(false), kRowInverted(false); UChar_t lFasp(0xff); UShort_t lchR, lchT; Double_t r, t; - Int_t dt, dtime; + Int_t dt, dtime, pad, row; + ULong64_t tlab; + CbmTrdParFasp* faspPar(nullptr); + CbmTrdParModDigi* digiPar(nullptr); vector<CbmTrdDigi*> digis; for (Int_t col(0); col < NCOLS; col++) { if (!messes[col].size()) continue; - if (lFasp == 0xff) lFasp = messes[col][0]->fasp; - //printf("col[%d]=%lu\n", col, messes[col].size()); - for (vector<CbmTrdFaspContent*>::iterator i = messes[col].begin(); i != messes[col].end(); i++) { + vector<CbmTrdFaspContent*>::iterator i = messes[col].begin(); + if (lFasp == 0xff) { + lFasp = messes[col][0]->fasp; + // link data to the position on the padplane + if (!(faspPar = (CbmTrdParFasp*) fAsicPar.GetAsicPar((*i)->cri * 1000 + lFasp))) { + LOG(error) << GetName() << "::pushDigis - FASP par " << (int) lFasp << " for module " << (*i)->cri + << " missing. Skip."; + return false; + } + if (!(digiPar = (CbmTrdParModDigi*) fDigiSet->GetModulePar((*i)->cri))) { + LOG(error) << GetName() << "::pushDigis - DIGI par for module " << (*i)->cri << " missing. Skip."; + return false; + } + pad = faspPar->GetChannelAddress(0); + row = digiPar->GetPadRow(pad); + + // determine the HW direction in which the FASP channels are ordered + if (row % 2 == 0) { // valid only for mCBM-07.2021 TRD-2D + kRowInverted = kTRUE; + pad = faspPar->GetChannelAddress(15 - (*i)->ch); + } + } + + for (; i != messes[col].end(); i++) { if (VERBOSE) mess_prt((*i)); lchR = 0; lchT = 0; use = false; - if ((*i)->ch % 2) lchR = (*i)->data; - else - lchT = (*i)->data; + if ((*i)->ch % 2 != 0) { + if (!kRowInverted) lchR = (*i)->data; + else + lchT = (*i)->data; + } + else { + if (!kRowInverted) lchT = (*i)->data; + else + lchR = (*i)->data; + } for (vector<CbmTrdDigi*>::iterator id = digis.begin(); id != digis.end(); id++) { dtime = (*id)->GetTimeDAQ() - (*i)->tlab; if (TMath::Abs(dtime) < 5) { @@ -111,13 +233,21 @@ bool CbmTrdUnpackAlgoFasp2D::pushDigis( break; } else if (lchT && !int(t)) { + tlab = (*id)->GetTimeDAQ(); (*id)->SetCharge(lchT, r, +dtime); + (*id)->SetTimeDAQ(ULong64_t(tlab - dtime)); use = true; break; } } } - if (!use) digis.push_back(new CbmTrdDigi(lFasp * NCOLS + col, lchT, lchR, (*i)->tlab)); + + if (!use) { + pad = faspPar->GetChannelAddress(kRowInverted ? (15 - (*i)->ch) : (*i)->ch); + CbmTrdDigi* digi = new CbmTrdDigi(pad, lchT, lchR, (*i)->tlab); + digi->SetAddressModule((*i)->cri); + digis.push_back(digi); + } delete (*i); } @@ -210,16 +340,25 @@ bool CbmTrdUnpackAlgoFasp2D::unpack(const fles::Timeslice* ts, std::uint16_t ico vDigi.clear(); lFaspOld = fasp_id; } + if (data & 0x1) { + LOG(warn) << GetName() << "::unpack - Data corrupted : detect end bit set."; + continue; + } if (VERBOSE) cout << boost::format(" DD : fasp_id=%02d ch_id=%02d slice=%03d data=%4d\n") % static_cast<unsigned int>(fasp_id) % static_cast<unsigned int>(ch_id) % static_cast<unsigned int>(slice) % static_cast<unsigned int>(data >> 1); + if (data & 0x2000) { + LOG(debug) << GetName() << "::unpack - Self-triggered data."; + data &= 0x1fff; + } mess = new CbmTrdFaspContent; mess->ch = ch_id; mess->type = 1; mess->tlab = slice; mess->data = data >> 1; mess->fasp = lFaspOld; + mess->cri = 53; col = ch_id >> 1; vDigi[col].push_back(mess); } diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.h b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.h index 6abe90ad4c97b6f6c6b0b2beb000450954a5bf49..7abae638e8e44cbfebf484b5a46de9f771a75727 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.h +++ b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoFasp2D.h @@ -24,6 +24,7 @@ #include "CbmRecoUnpackAlgo.tmpl" #include "CbmTrdDigi.h" +#include "CbmTrdParSetAsic.h" #include "Timeslice.hpp" // timeslice @@ -38,6 +39,7 @@ #define NCRI 40 // no of CRI in the system (1/TRD-2D_FASP module) #define NCOLS 8 // no of cols / FASP +class CbmTrdParSetDigi; class CbmTrdUnpackAlgoFasp2D : public CbmRecoUnpackAlgo<CbmTrdDigi> { public: /** @brief Bytes per FASP frame stored in the microslices (32 bits words) @@ -94,7 +96,17 @@ public: uint8_t cri; }; - // Setters + /** + * @brief Get the requested parameter containers. + * Return the required parameter containers together with the paths to the ascii + * files to. + * + * @param[in] std::string geoTag as used in CbmSetup + * @param[in] std::uint32_t runId for runwise defined parameters + * @return fParContVec + */ + virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>* + GetParContainerRequest(std::string geoTag, std::uint32_t runId); protected: /** @brief Get message type from the FASP word */ @@ -126,8 +138,7 @@ protected: * @param parset * @return Bool_t initOk */ - Bool_t initParSet(FairParGenericSet* /*parset*/) { return kTRUE; } - + Bool_t initParSet(FairParGenericSet* parset); /** * @brief Unpack a given microslice. @@ -163,7 +174,11 @@ protected: private: void prt_wd(uint32_t w); - ClassDef(CbmTrdUnpackAlgoFasp2D, 2) + std::vector<Int_t> fModuleId; + CbmTrdParSetAsic fAsicPar; + CbmTrdParSetDigi* fDigiSet; + + ClassDef(CbmTrdUnpackAlgoFasp2D, 2) // unpack FASP read-out detectors }; #endif // CbmTrdUnpackAlgoFasp2D_H diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx index a7e5f7579f288f1ca54adeba9700db37c2d8c8d0..1622a51d863031bea89c1199cc709b98967805aa 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx +++ b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx @@ -446,6 +446,7 @@ std::double_t CbmTrdUnpackMonitor::getDeltaT(CbmTrdDigi* digi) if (modulevecpair == fLastDigiTimeMap.end()) { auto nchannels = fModuleNrColumns.find(moduleid)->second * fModuleNrRows.find(moduleid)->second; std::vector<size_t> channelsvec(nchannels, 0); + if (channelid > nchannels) return 0; channelsvec.at(channelid) = digi->GetTime(); auto pair = std::make_pair(moduleid, channelsvec); fLastDigiTimeMap.emplace(pair);