diff --git a/reco/detectors/trd/CbmTrdModuleRecR.cxx b/reco/detectors/trd/CbmTrdModuleRecR.cxx index b99feaec9864a2bbb262160ef8e9939e07303296..875891595a31f6637fee6bdb075425cdb1464e5f 100644 --- a/reco/detectors/trd/CbmTrdModuleRecR.cxx +++ b/reco/detectors/trd/CbmTrdModuleRecR.cxx @@ -440,7 +440,7 @@ void CbmTrdModuleRecR::addClusters(std::deque<std::pair<Int_t, const CbmTrdDigi* Bool_t CbmTrdModuleRecR::MakeHits() { return kTRUE; } //_______________________________________________________________________________ -CbmTrdHit* CbmTrdModuleRecR::MakeHit(Int_t clusterId, const CbmTrdCluster* /*cluster*/, +CbmTrdHit* CbmTrdModuleRecR::MakeHit(Int_t clusterId, const CbmTrdCluster* cluster, std::vector<const CbmTrdDigi*>* digis) { @@ -541,6 +541,9 @@ CbmTrdHit* CbmTrdModuleRecR::MakeHit(Int_t clusterId, const CbmTrdCluster* /*clu cluster_pad_dposV[1] = sqrt(fDigiPar->GetPadSizeY(1)); } + // Set charge of incomplete clusters (missing NTs) to -1 (not deleting them because they are still relevant for tracking) + if (!IsClusterComplete(cluster)) totalCharge = -1.0; + Int_t nofHits = fHits->GetEntriesFast(); // return new ((*fHits)[nofHits]) CbmTrdHit(fModAddress, global, @@ -579,4 +582,53 @@ Double_t CbmTrdModuleRecR::GetSpaceResolution(Double_t val) return selval; } +bool CbmTrdModuleRecR::IsClusterComplete(const CbmTrdCluster* cluster) +{ + uint32_t colMin = fDigiPar->GetNofColumns(); + uint32_t rowMin = fDigiPar->GetNofRows(); + + for (int i = 0; i < cluster->GetNofDigis(); ++i) { + const CbmTrdDigi* digi = CbmDigiManager::Instance()->Get<CbmTrdDigi>(cluster->GetDigi(i)); + int digiCol = fDigiPar->GetPadColumn(digi->GetAddressChannel()); + int digiRow = fDigiPar->GetPadRow(digi->GetAddressChannel()); + + if (digiCol < colMin) colMin = digiCol; + if (digiRow < rowMin) rowMin = digiRow; + } + + const UShort_t nCols = cluster->GetNCols(); + const UShort_t nRows = cluster->GetNRows(); + + CbmTrdDigi* digiMap[nRows][nCols]; //create array on stack for optimal performance + memset(digiMap, 0, sizeof(CbmTrdDigi*) * nCols * nRows); //init with nullpointers + + for (int i = 0; i < cluster->GetNofDigis(); ++i) { + const CbmTrdDigi* digi = CbmDigiManager::Instance()->Get<CbmTrdDigi>(cluster->GetDigi(i)); + int digiCol = fDigiPar->GetPadColumn(digi->GetAddressChannel()); + int digiRow = fDigiPar->GetPadRow(digi->GetAddressChannel()); + + if (digiMap[digiRow - rowMin][digiCol - colMin]) + return false; // To be investigated why this sometimes happens (Redmin Issue 2914) + + digiMap[digiRow - rowMin][digiCol - colMin] = const_cast<CbmTrdDigi*>(digi); + } + + // check if each row of the cluster starts and ends with a kNeighbor digi + for (int iRow = 0; iRow < nRows; ++iRow) { + int colStart = 0; + while (digiMap[iRow][colStart] == nullptr) + ++colStart; + if (digiMap[iRow][colStart]->GetTriggerType() != static_cast<Int_t>(CbmTrdDigi::eTriggerType::kNeighbor)) + return false; + + int colStop = nCols - 1; + while (digiMap[iRow][colStop] == nullptr) + --colStop; + if (digiMap[iRow][colStop]->GetTriggerType() != static_cast<Int_t>(CbmTrdDigi::eTriggerType::kNeighbor)) + return false; + } + + return true; +} + ClassImp(CbmTrdModuleRecR) diff --git a/reco/detectors/trd/CbmTrdModuleRecR.h b/reco/detectors/trd/CbmTrdModuleRecR.h index c54c0edc5e330469b0b55e59a5a652fb545925cd..f04e2cb11ca725d7a07457b4b887e05bb7657200 100644 --- a/reco/detectors/trd/CbmTrdModuleRecR.h +++ b/reco/detectors/trd/CbmTrdModuleRecR.h @@ -41,6 +41,7 @@ public: Int_t GetOverThreshold() const { return fDigiCounter; } Double_t GetSpaceResolution(Double_t val = 3.0); + bool IsClusterComplete(const CbmTrdCluster* cluster); /** * \brief Steering routine for building hits **/