diff --git a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx index cd951aab9c051ac1de50af11f71041404e88b5d9..07a7194f5e499847a3ca22c48a7df32cbaec69b0 100644 --- a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx +++ b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.cxx @@ -23,6 +23,8 @@ CbmMvdSensorClusterfinderTask::CbmMvdSensorClusterfinderTask() : CbmMvdSensorClu { fPluginIDNumber = 200; + fPixelUsed=0; + } // ------------------------------------------------------------------------- @@ -84,6 +86,9 @@ CbmMvdSensorClusterfinderTask::CbmMvdSensorClusterfinderTask(Int_t iMode, Int_t , fAddNoise(kFALSE) { fPluginIDNumber = 200; + fInputFrameBuffer=0; + fOutputFrameBuffer=0; + fPixelUsed=0; } // ------------------------------------------------------------------------- @@ -96,7 +101,8 @@ void CbmMvdSensorClusterfinderTask::InitTask(CbmMvdSensor* mysensor) LOG(debug) << "CbmMvdSensorClusterfinderTask : Initialisation of sensor " << fSensor->GetName(); fInputBuffer = new TClonesArray("CbmMvdDigi", 100); fOutputBuffer = new TClonesArray("CbmMvdCluster", 100); - + fInputFrameBuffer = new TClonesArray("CbmMvdDigi", 100); + fOutputFrameBuffer = new TClonesArray("CbmMvdCluster", 100); //Add charge collection histograms fPixelChargeHistos = new TObjArray(); @@ -209,38 +215,144 @@ Bool_t CbmMvdSensorClusterfinderTask::ReInit() void CbmMvdSensorClusterfinderTask::ExecChain() { Exec(); } // ------------------------------------------------------------------------- +void CbmMvdSensorClusterfinderTask::Exec() { + + Int_t minFrame=0; //smalles frame number in this time slice + Int_t maxFrame=0; //biggest frame number in this time slice + + // Detect relevant frame numbers from digis in the input fInputBuffer + + CbmMvdDigi* digi; + + if (!fInputBuffer) {Fatal("CbmMvdSensorClusterfinderTask::Exec - fInputBuffer missing", "CbmMvdSensorClusterfinderTask::Exec - fInputBuffer missing");} + if (fInputBuffer->GetEntriesFast()==0) {return;} + + digi=(CbmMvdDigi*)fInputBuffer->At(0); + minFrame=digi->GetFrameNumber(); + maxFrame=digi->GetFrameNumber(); + + + for (Int_t i=0; i<fInputBuffer->GetEntriesFast(); i++) { + + digi=(CbmMvdDigi*)fInputBuffer->At(i); + if(digi->GetFrameNumber()>maxFrame){maxFrame=digi->GetFrameNumber();}; + if(digi->GetFrameNumber()<minFrame){minFrame=digi->GetFrameNumber();}; + } + + //Fill frameBuffer for the first frame of interest + + for(Int_t i=0; i<fInputBuffer->GetEntriesFast(); i++) { + + digi=(CbmMvdDigi*) fInputBuffer->At(i); + if(digi->GetFrameNumber()==minFrame){fInputFrameBuffer->AbsorbObjects(fInputBuffer,i,i);} + } + + + + // Continue filling starting from the 2nd frame. Two frames are processed by ExecFrame in order to avoid handle time walk + + for(Int_t currentFrame=minFrame; maxFrame-1; currentFrame++){ + + + + + // Clean up input buffer from possible digis, which were already associated to a cluster while processing the previous frame + if (fPixelUsed) { + + for (Int_t i=fPixelUsed->GetSize()-1 ; i>=0; i--) { + + if(fPixelUsed->At(i)){fInputFrameBuffer->RemoveAt(i);} + + } + + } + + delete fPixelUsed; //Reset pixel used array + + // Clean up input buffer from possible digis of the previous frame, which were not associated to a cluster. + // With MIMOSIS, this should not happen. + // Note that always two frames should be present in the buffer, therefore the currentFrame remains and the consecutive Frame will + // be added in a next step. + + fInputFrameBuffer->Compress(); + + for (Int_t i=0; i<fInputFrameBuffer->GetEntriesFast(); i++) { + + digi=(CbmMvdDigi*) fInputFrameBuffer->At(i); + + if(digi->GetFrameNumber()<currentFrame-1){ + fInputFrameBuffer->RemoveAt(i); + + } + } + + fInputFrameBuffer->Compress(); //Eliminate possible empty slots in the TClonesArray + + // Add data from the next frame. Note: This is the second of two valid frames. + + for (Int_t i=0; i<fInputBuffer->GetEntriesFast(); i++) { + digi=(CbmMvdDigi*) fInputBuffer->At(i); + if(digi->GetFrameNumber()==currentFrame+1){ fInputFrameBuffer->AbsorbObjects(fInputBuffer,i,i); } + + } + + + fPixelUsed = new TArrayS(fInputFrameBuffer->GetEntriesFast()); + + for (Int_t iDigi = 0; iDigi < fPixelUsed->GetSize(); iDigi++) { + fPixelUsed->AddAt(0, iDigi); + // Reset fPixelUsed-Array. All entries are set to 0 (not used) + } + + ExecFrame(currentFrame); + + fOutputBuffer->AbsorbObjects(fOutputFrameBuffer); + fOutputFrameBuffer->Clear(); + + + } + + delete fPixelUsed; + +} + + + + + + // ----- Public method Exec -------------- -void CbmMvdSensorClusterfinderTask::Exec() +void CbmMvdSensorClusterfinderTask::ExecFrame(Int_t currentFrame) { LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - Running Sensor " << fSensor->GetName(); - LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - InputBufferSize " << fInputBuffer->GetEntriesFast(); + LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - InputBufferSize " << fInputFrameBuffer->GetEntriesFast(); - if (fInputBuffer->GetEntriesFast() > 0) { - fOutputBuffer->Delete(); + if (fInputFrameBuffer->GetEntriesFast() > 0) { inputSet = kFALSE; vector<Int_t>* clusterArray = new vector<Int_t>; CbmMvdDigi* digi; Int_t iDigi = 0; - digi = (CbmMvdDigi*) fInputBuffer->At(iDigi); + digi = (CbmMvdDigi*) fInputFrameBuffer->At(iDigi); if (!digi) { LOG(error) << "CbmMvdSensorFindHitTask - Fatal: No Digits found in this event."; } - Int_t nDigis = fInputBuffer->GetEntriesFast(); + Int_t nDigis = fInputFrameBuffer->GetEntriesFast(); //LOG(debug) << "CbmMvdClusterTrask::Exec(): Received following number of digis: " << nDigis; - TArrayS* pixelUsed = new TArrayS(nDigis); - for (iDigi = 0; iDigi < nDigis; iDigi++) { - pixelUsed->AddAt(0, iDigi); - } fDigiMap.clear(); + Int_t refId; + + // Sort digis into a map in order to access them later by x-y coordinate. + // No double entries are possible (max 1 digi per pixel) + for (Int_t k = 0; k < nDigis; k++) { - digi = (CbmMvdDigi*) fInputBuffer->At(k); + digi = (CbmMvdDigi*) fInputFrameBuffer->At(k); refId = digi->GetRefId(); if (refId < 0) { LOG(fatal) << "RefID of this digi is -1 this should not happend "; } //apply fNeighThreshold @@ -249,6 +361,9 @@ void CbmMvdSensorClusterfinderTask::Exec() pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY()); //LOG(debug) << "registerde pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY(); + + + fDigiMap[a] = k; }; @@ -263,7 +378,7 @@ void CbmMvdSensorClusterfinderTask::Exec() LOG_IF(debug, iDigi % 10000 == 0) << GetName() << " Digi:" << iDigi; - digi = (CbmMvdDigi*) fInputBuffer->At(iDigi); + digi = (CbmMvdDigi*) fInputFrameBuffer->At(iDigi); //LOG(debug) << "working with pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY(); @@ -279,21 +394,24 @@ void CbmMvdSensorClusterfinderTask::Exec() LOG(debug) << "CbmMvdSensorClusterfinderTask: Checking for seed pixels..."; - if ((GetAdcCharge(digi->GetCharge()) >= fSeedThreshold) && (pixelUsed->At(iDigi) == kFALSE)) { + if ((GetAdcCharge(digi->GetCharge()) >= fSeedThreshold) && (fPixelUsed->At(iDigi) == kFALSE)) { clusterArray->clear(); clusterArray->push_back(iDigi); - pixelUsed->AddAt(1, iDigi); + fPixelUsed->AddAt(1, iDigi); pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY()); fDigiMapIt = fDigiMap.find(a); + + if (fDigiMapIt != fDigiMap.end()) { fDigiMap.erase(fDigiMapIt); }; + // This triggers a re-sort of the map. Performance? for (ULong64_t iCluster = 0; iCluster < clusterArray->size(); iCluster++) { LOG(debug) << " CbmMvdSensorClusterfinderTask: Calling method CheckForNeighbours()..."; - CheckForNeighbours(clusterArray, iCluster, pixelUsed); + CheckForNeighbours(clusterArray, iCluster, fPixelUsed); //LOG(debug) << "checked for neighbours, create cluster"; } @@ -303,13 +421,13 @@ void CbmMvdSensorClusterfinderTask::Exec() pair<Int_t, Int_t> pixelCoords; Int_t clusterSize = clusterArray->size(); - Int_t nClusters = fOutputBuffer->GetEntriesFast(); + Int_t nClusters = fOutputFrameBuffer->GetEntriesFast(); //LOG(debug) << "new cluster: " << nClusters; - CbmMvdCluster* clusterNew = new ((*fOutputBuffer)[nClusters]) CbmMvdCluster(); + CbmMvdCluster* clusterNew = new ((*fOutputFrameBuffer)[nClusters]) CbmMvdCluster(); clusterNew->SetAddress(fAddress); for (i = 0; i < clusterSize; i++) { - CbmMvdDigi* digiInCluster = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(i)); + CbmMvdDigi* digiInCluster = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(i)); clusterNew->AddDigi(digiInCluster->GetRefId()); pixelCoords = std::make_pair(digiInCluster->GetPixelX(), digiInCluster->GetPixelY()); pixelCharge = digiInCluster->GetCharge(); @@ -326,16 +444,15 @@ void CbmMvdSensorClusterfinderTask::Exec() } // loop on digis - delete pixelUsed; + clusterArray->clear(); delete clusterArray; - fInputBuffer->Delete(); fDigiMap.clear(); } else { //LOG(debug) << "No input found."; } - fInputBuffer->Clear(); + fInputFrameBuffer->Clear(); } // ------------------------------------------------------------------------- @@ -343,7 +460,7 @@ void CbmMvdSensorClusterfinderTask::Exec() void CbmMvdSensorClusterfinderTask::CheckForNeighbours(vector<Int_t>* clusterArray, Int_t clusterDigi, TArrayS* pixelUsed) { - CbmMvdDigi* seed = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(clusterDigi)); + CbmMvdDigi* seed = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(clusterDigi)); //LOG(debug) << "pixel nr. " << clusterDigi << " is seed"; diff --git a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h index 1ca9cbe9ef655af6c5cda969927c4a502896cc64..97934c7fc89e5eaaf0f98cb7e5d68d6d2a3acadc 100644 --- a/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h +++ b/reco/detectors/mvd/plugins/tasks/CbmMvdSensorClusterfinderTask.h @@ -59,7 +59,8 @@ public: /** Task execution **/ void ExecChain(); - void Exec(); + void Exec(); // Processes time slice by organizing data and calling ExecFrame for each hardware frame. + void ExecFrame(Int_t currentFrame); // Processes data of a given frame + consecutive frame (time walk). /** Intialisation **/ void InitTask(CbmMvdSensor* mySensor); @@ -195,6 +196,10 @@ private: CbmMvdSensorClusterfinderTask(const CbmMvdSensorClusterfinderTask&); CbmMvdSensorClusterfinderTask operator=(const CbmMvdSensorClusterfinderTask&); + TClonesArray* fInputFrameBuffer; + TClonesArray* fOutputFrameBuffer; + TArrayS* fPixelUsed; + ClassDef(CbmMvdSensorClusterfinderTask, 1); }; diff --git a/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx b/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx index 977b0aed98cd7bd8bde3dbe0c47d8f1873c541dc..c0e593234dcb0576efb814ff386cbf20cbbb88b0 100644 --- a/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx +++ b/sim/detectors/mvd/plugins/tasks/CbmMvdSensorDigitizerTask.cxx @@ -329,6 +329,8 @@ CbmMvdSensorDigitizerTask::~CbmMvdSensorDigitizerTask() fInputPoints->Delete(); delete fInputPoints; } + + if (fOutputBuffer) { fOutputBuffer->Delete(); delete fOutputBuffer;