CbmRoot
Loading...
Searching...
No Matches
CbmMvdSensorClusterfinderTask.cxx
Go to the documentation of this file.
1/* Copyright (C) 2014-2020 Institut fuer Kernphysik, Goethe-Universitaet Frankfurt, Frankfurt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Philipp Sitzmann [committer] */
4
5// -------------------------------------------------------------------------
6// ----- CbmMvdSensorClusterfinderTask source file -----
7// ----- Created 03.12.2014 by P. Sitzmann -----
8// -------------------------------------------------------------------------
9
11
12#include "TClonesArray.h"
13#include "TObjArray.h"
14
15#include <Logger.h>
16
17using std::endl;
18using std::pair;
19using std::vector;
20
21// ----- Default constructor -------------------------------------------
28// -------------------------------------------------------------------------
29
30// -------------------------------------------------------------------------
32// -------------------------------------------------------------------------
33
34// -------------------------------------------------------------------------
37 , fAdcDynamic(200)
38 , fAdcOffset(0)
39 , fAdcBits(1)
40 , fAdcSteps(-1)
41 , fAddress(0)
42 , fAdcStepSize(-1.)
43 , fDigis(nullptr)
44 , fPixelChargeHistos(nullptr)
46 , fResolutionHistoX(nullptr)
47 , fResolutionHistoY(nullptr)
48 , fResolutionHistoCleanX(nullptr)
49 , fResolutionHistoCleanY(nullptr)
52 , fBadHitHisto(nullptr)
53 , fGausArray(nullptr)
54 , fGausArrayIt(-1)
55 , fGausArrayLimit(5000)
56 , fDigiMap()
57 , fDigiMapIt()
58 , h(nullptr)
59 , h3(nullptr)
60 , h1(nullptr)
61 , h2(nullptr)
62 , Qseed(nullptr)
63 , fFullClusterHisto(nullptr)
64 , c1(nullptr)
65 , fNEvent(0)
66 , fMode(iMode)
67 , fCounter(0)
68 , fVerbose(iVerbose)
69 , fSigmaNoise(15.)
70 , fSeedThreshold(1.)
71 , fNeighThreshold(1.)
72 , fUseMCInfo(kFALSE)
73 , inputSet(kFALSE)
75 , fLayerRadius(0.)
77 , fLayerPosZ(0.)
78 , fHitPosX(0.)
79 , fHitPosY(0.)
80 , fHitPosZ(0.)
81 , fHitPosErrX(0.0005)
82 , fHitPosErrY(0.0005)
83 , fHitPosErrZ(0.0)
84 , fBranchName("MvdHit")
85 , fAddNoise(kFALSE)
86{
87 fPluginIDNumber = 200;
90 fPixelUsed = 0;
91}
92// -------------------------------------------------------------------------
93
94// ----- Virtual private method Init ----------------------------------
96{
97
98
99 fSensor = mysensor;
100 LOG(debug) << "CbmMvdSensorClusterfinderTask : Initialisation of sensor " << fSensor->GetName();
101 fInputBuffer = new TClonesArray("CbmMvdDigi", 100);
102 fOutputBuffer = new TClonesArray("CbmMvdCluster", 100);
103 fInputFrameBuffer = new TClonesArray("CbmMvdDigi", 100);
104 fOutputFrameBuffer = new TClonesArray("CbmMvdCluster", 100);
105
106 //Add charge collection histograms
107 fPixelChargeHistos = new TObjArray();
108
109 fTotalChargeInNpixelsArray = new TObjArray();
110
111 fAdcSteps = (Int_t) TMath::Power(2, fAdcBits);
113
114 //fAddress = 1000 * fSensor->GetStationNr() + fSensor->GetSensorNr();
115 fAddress = fSensor->GetAddress();
116
117 initialized = kTRUE;
118
119 if (fShowDebugHistos) {
120
121 fHistoArray = new TObjArray();
122
123 fResolutionHistoX = new TH1F("SinglePointResolution_X", "SinglePointResolution_X", 10000, -0.0100, 0.0100);
124 fResolutionHistoY = new TH1F("SinglePointResolution_Y", "SinglePointResolution_Y", 10000, -0.0100, 0.0100);
126 new TH1F("SinglePointResolution_X_Clean", "SinglePointResolution_X_Clean", 10000, -0.0100, 0.0100);
128 new TH1F("SinglePointResolution_Y_Clean", "SinglePointResolution_Y_Clean", 10000, -0.0100, 0.0100);
130 new TH1F("SinglePointResolution_X_Merged", "SinglePointResolution_X_Merged", 10000, -0.0100, 0.0100);
132 new TH1F("SinglePointResolution_Y_Merged", "SinglePointResolution_Y_Merged", 10000, -0.0100, 0.0100);
133 fBadHitHisto = new TH2F("BadHits", "Hits above 0.003cm", 1000, -2.5, 2.5, 1000, -2.5, 2.5);
134 fFullClusterHisto = new TH1F("ChargeOfAllPixels", "ChargeOfAllPixels", 12000, 0, 12000);
135
142 fHistoArray->AddLast(fBadHitHisto);
144
145
146 //}
147
148
149 //Add charge collection histograms
150 fPixelChargeHistos = new TObjArray();
151 size_t buf_size = 20;
152 char* histoName = new char[buf_size];
153 TH1F* histo;
154 for (Int_t i = 0; i < 49; i++) {
155 snprintf(histoName, buf_size - 1, "ChargePixel%i", i + 1);
156 histo = new TH1F(histoName, histoName, 200, 0, 200);
157 fPixelChargeHistos->AddLast(histo);
158 };
159 delete[] histoName;
160
161 fTotalChargeInNpixelsArray = new TObjArray();
162 buf_size = 50;
163 char* histoTotalChargeName = new char[buf_size];
164 TH1F* histoTotalCharge;
165 for (Int_t i = 0; i < 49; i++) {
166
167 snprintf(histoTotalChargeName, buf_size - 1, "totalChargeInNPixels%i", i + 1);
168 histoTotalCharge = new TH1F(histoTotalChargeName, histoTotalChargeName, 12000, 0, 12000);
169 fTotalChargeInNpixelsArray->AddLast(histoTotalCharge);
170 };
171 delete[] histoTotalChargeName;
172
173 //Number 49
174 histo = new TH1F("ChargePixelSeed", "ChargePixelSeed", 200, 0, 14000);
175 fPixelChargeHistos->AddLast(histo);
176 //Number 50
177 histo = new TH1F("ChargePixel9of49", "ChargePixel 9 Of 49", 200, 0, 14000);
178 fPixelChargeHistos->AddLast(histo);
179 //Number 51
180 histo = new TH1F("ChargePixel25of49", "ChargePixel 25 Of 49", 200, 0, 14000);
181 fPixelChargeHistos->AddLast(histo);
182 //Number 52
183 histo = new TH1F("ChargePixel49of49", "ChargePixel 49 Of 49", 200, 0, 14000);
184 fPixelChargeHistos->AddLast(histo);
185 //Number 53
186 histo = new TH1F("ChargePixel9of49Sorted", "ChargePixel 9 Of 49 Sorted", 200, 0, 14000);
187 fPixelChargeHistos->AddLast(histo);
188 //Number 54
189 histo = new TH1F("ChargePixel25of49Sorted", "ChargePixel 25 Of 49 Sorted", 200, 0, 14000);
190 fPixelChargeHistos->AddLast(histo);
191 //Number 55
192 histo = new TH1F("ChargePixel49of49Sorted", "ChargePixel 49 Of 49 Sorted", 49, 0.5, 49.5);
193 fPixelChargeHistos->AddLast(histo);
194 }
195 //LOG(debug) << "-Finished- " << GetName() << ": Initialisation of sensor " << fSensor->GetName();
196
197 //Copy histograms in fPixelChargeHistos to fHistoArray (the array for external communications)
198 for (Int_t i = 0; i < fPixelChargeHistos->GetEntriesFast(); i++) {
199 fHistoArray->AddLast(fPixelChargeHistos->At(i));
200 }
201}
202// -------------------------------------------------------------------------
203
204// ----- Virtual public method Reinit ----------------------------------
206{
207 LOG(info) << "CbmMvdSensorClusterfinderTask::ReInt---------------";
208 return kTRUE;
209}
210// -------------------------------------------------------------------------
211
212// ----- Virtual public method ExecChain --------------
214// -------------------------------------------------------------------------
215
217{
218
219
220 // Detect relevant frame numbers from digis in the input fInputBuffer
221
222 LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec starting" << endl;
223 LOG(debug) << "Detected " << fInputBuffer->GetEntriesFast() << " digis for sensor " << fSensor->GetName();
224
225
226 if (!fInputBuffer) {
227 Fatal("CbmMvdSensorClusterfinderTask::Exec - fInputBuffer missing",
228 "CbmMvdSensorClusterfinderTask::Exec - fInputBuffer missing");
229 }
230
231 if (fInputBuffer->GetEntriesFast() == 0) {
232 return;
233 }
234
235 CbmMvdDigi* digi = (CbmMvdDigi*) fInputBuffer->At(0);
236 Int_t minFrame = digi->GetFrameNumber();
237 Int_t maxFrame = digi->GetFrameNumber();
238
239
240 for (Int_t i = 0; i < fInputBuffer->GetEntriesFast(); i++) {
241
242 digi = (CbmMvdDigi*) fInputBuffer->At(i);
243 if (digi->GetFrameNumber() > maxFrame) {
244 maxFrame = digi->GetFrameNumber();
245 };
246 if (digi->GetFrameNumber() < minFrame) {
247 minFrame = digi->GetFrameNumber();
248 };
249 }
250
251
252 //Fill frameBuffer for the first frame of interest
253
254 for (Int_t i = fInputBuffer->GetEntriesFast() - 1; i >= 0; --i) {
255 digi = (CbmMvdDigi*) fInputBuffer->At(i);
256 if (digi->GetFrameNumber() == minFrame) {
257 fInputFrameBuffer->AbsorbObjects(fInputBuffer, i, i);
258 }
259 }
260
261 delete fPixelUsed;
262 fPixelUsed = nullptr;
263
264 // Continue filling starting from the 2nd frame. Two frames are processed by ExecFrame in order to avoid handle time walk
265 // Work on all frames of the input. Independent of running in time or event based
266 // mode the data should be written to the output. Any further data either
267 // belongs to the next event or the next timeslice. Since both events and
268 // time slices are independent of each other all data needs to be written
269 // to the output
270 Int_t currentFrame{minFrame};
271 for (currentFrame = minFrame; currentFrame < maxFrame + 1; currentFrame++) {
272
273 LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec() - Running frame " << currentFrame;
274
275 CleanBuffers(currentFrame);
276 delete fPixelUsed;
277
278 // Add data from the next frame. Note: This is the second of two valid frames.
279
280 for (Int_t i = fInputBuffer->GetEntriesFast() - 1; i >= 0; --i) {
281 digi = (CbmMvdDigi*) fInputBuffer->At(i);
282 if (digi->GetFrameNumber() == currentFrame + 1) {
283 fInputFrameBuffer->AbsorbObjects(fInputBuffer, i, i);
284 }
285 }
286
287 fPixelUsed = new TArrayS(fInputFrameBuffer->GetEntriesFast());
288
289 for (Int_t iDigi = 0; iDigi < fPixelUsed->GetSize(); iDigi++) {
290 fPixelUsed->AddAt(0, iDigi);
291 // Reset fPixelUsed-Array. All entries are set to 0 (not used)
292 }
293
294 ExecFrame(currentFrame);
295
296 fOutputBuffer->AbsorbObjects(fOutputFrameBuffer);
297 fOutputFrameBuffer->Clear();
298 }
299
300 CleanBuffers(currentFrame);
301}
302
304{
305 TString sensorName{fSensor->GetName()};
306 CbmMvdDigi* digi{nullptr};
307
308 // Clean up input buffer from possible digis, which were already associated to a cluster while processing the previous frame
309 if (fPixelUsed) {
310 for (Int_t i = fPixelUsed->GetSize() - 1; i >= 0; i--) {
311 if (fPixelUsed->At(i)) {
312 fInputFrameBuffer->RemoveAt(i);
313 }
314 }
315 }
316
317 // Clean up input buffer from possible digis of the previous frame, which were not associated to a cluster.
318 // With MIMOSIS, this should not happen.
319 // Note that always two frames should be present in the buffer, therefore the currentFrame remains and the consecutive Frame will
320 // be added in a next step.
321
322 fInputFrameBuffer->Compress();
323
324 for (Int_t i = fInputFrameBuffer->GetEntriesFast() - 1; i >= 0; --i) {
325 digi = (CbmMvdDigi*) fInputFrameBuffer->At(i);
326 if (digi->GetFrameNumber() < currentFrame - 1) {
327 LOG(error) << "We should never see this message";
328 fInputFrameBuffer->RemoveAt(i);
329 }
330 }
331
332 fInputFrameBuffer->Compress(); //Eliminate possible empty slots in the TClonesArray
333}
334
335// ----- Public method Exec --------------
337{
338 LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - Running Sensor " << fSensor->GetName();
339 LOG(debug) << "CbmMvdSensorClusterfinderTask::Exec - InputBufferSize " << fInputFrameBuffer->GetEntriesFast();
340
341 if (fInputFrameBuffer->GetEntriesFast() > 0) {
342 inputSet = kFALSE;
343 vector<Int_t>* clusterArray = new vector<Int_t>;
344
345 CbmMvdDigi* digi;
346
347 Int_t iDigi = 0;
348 digi = (CbmMvdDigi*) fInputFrameBuffer->At(iDigi);
349
350
351 if (!digi) {
352 LOG(error) << "CbmMvdSensorFindHitTask - Fatal: No Digits found in this event.";
353 }
354
355 Int_t nDigis = fInputFrameBuffer->GetEntriesFast();
356 //LOG(debug) << "CbmMvdClusterTrask::Exec(): Received following number of digis: " << nDigis;
357
358
359 fDigiMap.clear();
360
361 Int_t refId;
362
363 // Sort digis into a map in order to access them later by x-y coordinate.
364 // No double entries are possible (max 1 digi per pixel)
365
366 for (Int_t k = 0; k < nDigis; k++) {
367
368 digi = (CbmMvdDigi*) fInputFrameBuffer->At(k);
369 refId = digi->GetRefId();
370 if (refId < 0) {
371 LOG(fatal) << "RefID of this digi is -1 this should not happend ";
372 }
373 //apply fNeighThreshold
374
375 if (GetAdcCharge(digi->GetCharge()) < fNeighThreshold) {
376 /*
377 LOG(info) << "Digi Charge: " << digi->GetCharge();
378 LOG(info) << "ADC Charge: " << GetAdcCharge(digi->GetCharge());
379*/
380 fPixelUsed->AddAt(1, k);
381 continue;
382 }
383
384 pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY());
385 //LOG(debug) << "registerde pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY();
386
387
388 fDigiMap[a] = k;
389 };
390
391
392 LOG(debug) << GetName() << ": VolumeId " << fSensor->GetVolumeId();
393
394 //LOG(debug) <<"CbmMvdSensorClusterfinderTask: Working with " << nDigis << " digis";
395
396 //cout<<"CbmMvdSensorClusterfinderTask: Working with " << nDigis << " digis" << endl;
397
398 for (iDigi = 0; iDigi < nDigis; iDigi++) {
399
400 LOG_IF(debug, iDigi % 10000 == 0) << GetName() << " Digi:" << iDigi;
401
402 digi = (CbmMvdDigi*) fInputFrameBuffer->At(iDigi);
403 //LOG(debug) << "working with pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY();
404
405
406 /*
407 ---------------------------------------------------------
408 check if digi is above threshold (define seed pixel)
409 then check for neighbours.
410 Once the cluster is created (seed and neighbours)
411 calculate the position of the hit
412 using center of gravity (CoG) method.
413 ---------------------------------------------------------
414 */
415
416 LOG(debug) << "CbmMvdSensorClusterfinderTask: Checking for seed pixels...";
417
418 if ((GetAdcCharge(digi->GetCharge()) >= fSeedThreshold) && (fPixelUsed->At(iDigi) == kFALSE)
419 && digi->GetFrameNumber() == currentFrame) {
420 clusterArray->clear();
421 clusterArray->push_back(iDigi);
422
423 fPixelUsed->AddAt(1, iDigi);
424
425 pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY());
426 fDigiMapIt = fDigiMap.find(a);
427
428
429 if (fDigiMapIt != fDigiMap.end()) {
430 fDigiMap.erase(fDigiMapIt);
431 };
432 // This triggers a re-sort of the map. Performance?
433
434 for (ULong64_t iCluster = 0; iCluster < clusterArray->size(); iCluster++) {
435
436 LOG(debug) << " CbmMvdSensorClusterfinderTask: Calling method CheckForNeighbours()...";
437
438 CheckForNeighbours(clusterArray, iCluster, fPixelUsed);
439 //LOG(debug) << "checked for neighbours, create cluster";
440 }
441
442 Int_t i = 0;
443 Int_t pixelCharge;
444
445
446 pair<Int_t, Int_t> pixelCoords;
447 Int_t clusterSize = clusterArray->size();
448 Int_t nClusters = fOutputFrameBuffer->GetEntriesFast();
449 //LOG(debug) << "new cluster: " << nClusters;
450 CbmMvdCluster* clusterNew = new ((*fOutputFrameBuffer)[nClusters]) CbmMvdCluster();
451 clusterNew->SetAddress(fAddress);
452
453 CbmMvdDigi* digiInCluster = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(0));
454 Int_t earliestFrame = digiInCluster->GetFrameNumber();
455
456 for (i = 0; i < clusterSize; i++) {
457 digiInCluster = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(i));
458
459 if (digiInCluster->GetFrameNumber() < earliestFrame) {
460 earliestFrame = digiInCluster->GetFrameNumber();
461 } //fixme retundant for i==0
462
463 clusterNew->AddDigi(digiInCluster->GetRefId());
464 pixelCoords = std::make_pair(digiInCluster->GetPixelX(), digiInCluster->GetPixelY());
465 pixelCharge = digiInCluster->GetCharge();
466 ftempPixelMap[pixelCoords] = pixelCharge;
467 }
468 clusterNew->SetPixelMap(ftempPixelMap);
469 clusterNew->SetEarliestFrameNumber(earliestFrame);
470 ftempPixelMap.clear();
471
472 if (fShowDebugHistos) UpdateDebugHistos(clusterNew);
473
474 } // if AdcCharge>threshold
475 else { //LOG(debug) << "pixel is with " << digi->GetCharge() << " under Threshold or used";
476 }
477 } // loop on digis
478
479
480 clusterArray->clear();
481 delete clusterArray;
482
483 fDigiMap.clear();
484 }
485 else { //LOG(debug) << "No input found.";
486 }
487 // fInputFrameBuffer->Clear();
488}
489// -------------------------------------------------------------------------
490
491// -------------------------------------------------------------------------
493 TArrayS* pixelUsed)
494{
495 CbmMvdDigi* seed = (CbmMvdDigi*) fInputFrameBuffer->At(clusterArray->at(clusterDigi));
496 //LOG(debug) << "pixel nr. " << clusterDigi << " is seed";
497
498
499 // Remove Seed Pixel from list of non-used pixels
500 Int_t channelX = seed->GetPixelX();
501 Int_t channelY = seed->GetPixelY();
502 pair<Int_t, Int_t> a(channelX, channelY);
503
504 // Find first neighbour
505
506 a = std::make_pair(channelX + 1, channelY);
507 fDigiMapIt = fDigiMap.find(a);
508
509 if (!(fDigiMapIt == fDigiMap.end())) {
510 Int_t i = fDigiMap[a];
511 //LOG(debug) << "pixel nr. " << i << " is used";
512 // Only digis depassing fNeighThreshold are in the map, no cut required
513 clusterArray->push_back(i);
514
515 pixelUsed->AddAt(1, i); // block pixel for the seed pixel scanner
516 fDigiMap.erase(fDigiMapIt); // block pixel for the neighbour pixel scanner
517 }
518
519 a = std::make_pair(channelX - 1, channelY);
520 fDigiMapIt = fDigiMap.find(a);
521
522 if (!(fDigiMapIt == fDigiMap.end())) {
523 Int_t i = fDigiMap[a];
524 //LOG(debug) << "pixel nr. " << i << " is used";
525 // Only digits depassing fNeighThreshold are in the map, no cut required
526 clusterArray->push_back(i);
527 pixelUsed->AddAt(1, i); // block pixel for the seed pixel scanner
528 fDigiMap.erase(fDigiMapIt); // block pixel for the neighbour pixel scanner
529 }
530
531 a = std::make_pair(channelX, channelY - 1);
532 fDigiMapIt = fDigiMap.find(a);
533 if (!(fDigiMapIt == fDigiMap.end())) {
534 Int_t i = fDigiMap[a];
535 // Only digits depassing fNeighThreshold are in the map, no cut required
536 //LOG(debug) << "pixel nr. " << i << " is used";
537 clusterArray->push_back(i);
538 pixelUsed->AddAt(1, i); // block pixel for the seed pixel scanner
539 fDigiMap.erase(fDigiMapIt); // block pixel for the neighbour pixel scanner
540 }
541
542 a = std::make_pair(channelX, channelY + 1);
543 fDigiMapIt = fDigiMap.find(a);
544
545 if (!(fDigiMapIt == fDigiMap.end())) {
546 Int_t i = fDigiMap[a];
547 //LOG(debug) << "pixel nr. " << i << " is used";
548 // Only digis depassing fNeighThreshold are in the map, no cut required
549 clusterArray->push_back(i);
550 pixelUsed->AddAt(1, i); // block pixel for the seed pixel scanner
551 fDigiMap.erase(fDigiMapIt); // block pixel for the neighbour pixel scanner
552 }
553}
554// -------------------------------------------------------------------------
555
556// -------------------------------------------------------------------------
558{
559
560 Int_t adcCharge;
561
562 if (charge < fAdcOffset) {
563 return 0;
564 };
565
566 adcCharge = int((charge - fAdcOffset) / fAdcStepSize);
567 if (adcCharge > fAdcSteps - 1) {
568 adcCharge = fAdcSteps - 1;
569 }
570
571 return adcCharge;
572}
573// -------------------------------------------------------------------------
574
576{
577 /************************************************************
578 Algorithm for cluster shapes
579
580 ************************************************************/
583 Short_t seedPixelOffset = fChargeArraySize / 2; // 3 for 7, 2 for 5
584 Int_t seedIndexX = 0, seedIndexY = 0;
585 Float_t seedCharge = 0.;
586 Float_t clusterCharge = cluster->GetClusterCharge();
587 std::map<std::pair<Int_t, Int_t>, Int_t> clusterMap = cluster->GetPixelMap();
588
589 for (Int_t k = 0; k < fChargeArraySize; k++) {
590 for (Int_t j = 0; j < fChargeArraySize; j++) {
591 chargeArray3D[k][j] = gRandom->Gaus(0, fSigmaNoise);
592 }
593 }
594 for (std::map<std::pair<Int_t, Int_t>, Int_t>::iterator iter = clusterMap.begin(); iter != clusterMap.end(); iter++) {
595 if (iter->second > seedCharge) {
596 seedCharge = iter->second;
597 seedIndexX = iter->first.first;
598 seedIndexY = iter->first.second;
599 }
600 }
601 //LOG(debug) << "seed pixel with " << seedCharge << " charge";
602 for (std::map<std::pair<Int_t, Int_t>, Int_t>::iterator iter = clusterMap.begin(); iter != clusterMap.end(); iter++) {
603
604 Int_t relativeX = iter->first.first + seedPixelOffset - seedIndexX;
605 Int_t relativeY = iter->first.second + seedPixelOffset - seedIndexY;
606
607 if (fVerbose > 1) LOG(debug) << relativeX << " " << relativeY << " " << iter->first.first << " " << seedIndexX;
608
609
610 if (relativeX >= 0 && relativeX < fChargeArraySize && relativeY >= 0 && relativeY < fChargeArraySize) {
611 chargeArray3D[relativeX][relativeY] = iter->second;
612 }
613
614 if ((relativeX - seedPixelOffset == 0) && (relativeY - seedPixelOffset == 0)) { //seed digiArray
615 }
616 }
617
618 if (fVerbose > 1) {
619 std::stringstream ss;
620 for (Int_t i = 0; i < fChargeArraySize; i++) {
621 for (Int_t j = 0; j < fChargeArraySize; j++) {
622 ss << chargeArray3D[i][j] << " ";
623 }
624 ss << endl;
625 }
626 LOG(info) << ss.str();
627 }
628 fFullClusterHisto->Fill(clusterCharge);
629
630 for (Int_t k = 0; k < fChargeArraySize; k++) {
631 for (Int_t j = 0; j < fChargeArraySize; j++) {
632 chargeArray[fChargeArraySize * k + j] = chargeArray3D[k][j];
633 }
634 }
635
636 Int_t qSeed = chargeArray3D[seedPixelOffset][seedPixelOffset];
637 Int_t q9 = 0;
638
639 for (Int_t k = seedPixelOffset - 1; k < seedPixelOffset + 1; k++) {
640 for (Int_t j = seedPixelOffset - 1; j < seedPixelOffset + 1; j++) {
641 q9 = q9 + chargeArray3D[k][j];
642 }
643 };
644
645
646 if (fChargeArraySize <= 7) {
647 for (Int_t i = 0; i < (fChargeArraySize * fChargeArraySize); i++) {
648 ((TH1F*) fPixelChargeHistos->At(i))->Fill(chargeArray[i]);
649 //LOG(debug) << counter++<<" Charge: " << chargeArray[i];
650 };
651 };
652
653 //LOG(debug) << "End of Cluster: "<<fChargeArraySize*fChargeArraySize;
654
655 Int_t q25 = 0;
656 Int_t q49 = 0;
657
658
659 for (Int_t k = seedPixelOffset - 2; k < seedPixelOffset + 2; k++) {
660 for (Int_t j = seedPixelOffset - 2; j < seedPixelOffset + 2; j++) {
661 q25 = q25 + chargeArray3D[k][j];
662 }
663 };
664
665 if (fChargeArraySize >= 7) {
666 for (Int_t k = seedPixelOffset - 3; k < seedPixelOffset + 3; k++) {
667 for (Int_t j = seedPixelOffset - 3; j < seedPixelOffset + 3; j++) {
668 q49 = q49 + chargeArray3D[k][j];
669 }
670 }
671 }
672
673 ((TH1F*) fPixelChargeHistos->At(49))->Fill(qSeed);
674 ((TH1F*) fPixelChargeHistos->At(50))->Fill(q9);
675 ((TH1F*) fPixelChargeHistos->At(51))->Fill(q25);
676 ((TH1F*) fPixelChargeHistos->At(52))->Fill(q49);
677
678
679 //Prepare selection of crowns for charge bow histograms
680
681
683
684 TMath::Sort(fChargeArraySize * fChargeArraySize, chargeArray, orderArray, kTRUE);
685
686 Float_t qSort = 0;
687 for (Int_t i = 0; i < 9; i++) {
688 qSort += chargeArray[orderArray[i]];
689 };
690 ((TH1F*) fPixelChargeHistos->At(53))->Fill(qSort);
691
692 for (Int_t i = 9; i < 25; i++) {
693 qSort += chargeArray[orderArray[i]];
694 };
695 ((TH1F*) fPixelChargeHistos->At(54))->Fill(qSort);
696
697 TH1F* histoTotalCharge;
698 qSort = 0;
699 for (Int_t i = 0; i < fChargeArraySize * fChargeArraySize; i++) {
700 qSort += chargeArray[orderArray[i]];
701 ((TH1F*) fPixelChargeHistos->At(55))->Fill(i + 1, qSort);
702 histoTotalCharge = (TH1F*) fTotalChargeInNpixelsArray->At(i);
703 histoTotalCharge->Fill(qSort);
704 }
705}
706
707//--------------------------------------------------------------------------
709{
710
711 if (
712 kFALSE
713 && fShowDebugHistos) { //Reaction to ShowHistograms at the finish of the initial FairTask. Obsolete, thus switched off for now
714 LOG(info) << "============================================================";
715 LOG(info) << GetName() << "::Finish: Total events skipped: " << fCounter;
716 LOG(info) << "============================================================";
717 LOG(info) << "Parameters used";
718 LOG(info) << "Gaussian noise [electrons] : " << fSigmaNoise;
719 LOG(info) << "Noise simulated [Bool] : " << fAddNoise;
720 LOG(info) << "Threshold seed [ADC] : " << fSeedThreshold;
721 LOG(info) << "Threshold neighbours [ADC] : " << fNeighThreshold;
722 LOG(info) << "ADC - Bits : " << fAdcBits;
723 LOG(info) << "ADC - Dynamic [electrons] : " << fAdcDynamic;
724 LOG(info) << "ADC - Offset [electrons] : " << fAdcOffset;
725 LOG(info) << "============================================================";
726
727
728 TH1F* histo;
729 TH2F* clusterShapeHistogram;
730 TCanvas* canvas2 = new TCanvas("HitFinderCharge", "HitFinderCharge");
731 canvas2->Divide(2, 2);
732 canvas2->cd(1);
733 if (fChargeArraySize <= 7) {
734 clusterShapeHistogram = new TH2F("MvdClusterShape", "MvdClusterShape", fChargeArraySize, 0, fChargeArraySize,
736 for (Int_t i = 0; i < fChargeArraySize * fChargeArraySize; i++) {
737 histo = (TH1F*) fPixelChargeHistos->At(i);
738 Float_t charge = histo->GetMean();
739 //LOG(debug) <<i << " Charge " << charge << " xCluster: " << i%fChargeArraySize << " yCluster: " << i/fChargeArraySize;
740 //histo->Fit("landau");
741 //TF1* fitFunction= histo->GetFunction("landau");
742 //Double_t MPV=fitFunction->GetParameter(1);
743 clusterShapeHistogram->Fill(i % fChargeArraySize, i / fChargeArraySize, charge);
744 }
745 }
746 clusterShapeHistogram->Draw("Lego2");
747 canvas2->cd(2);
748 histo = (TH1F*) fPixelChargeHistos->At(50);
749 histo->Draw();
750 canvas2->cd(3);
751 histo = (TH1F*) fPixelChargeHistos->At(51);
752 histo->Draw();
753 canvas2->cd(4);
754 //fFullClusterHisto->Draw();
755 }
756}
757//--------------------------------------------------------------------------
758
ClassImp(CbmConverterManager)
float Float_t
int Int_t
bool Bool_t
void AddDigi(int32_t index)
Add digi to cluster.
Definition CbmCluster.h:51
void SetAddress(int32_t address)
Definition CbmCluster.h:94
float GetClusterCharge() const
void SetEarliestFrameNumber(Int_t frameNumber)
void SetPixelMap(std::map< std::pair< int32_t, int32_t >, int32_t > PixelMap)
std::map< std::pair< int32_t, int32_t >, int32_t > GetPixelMap() const
int32_t GetPixelY() const
Definition CbmMvdDigi.h:75
int32_t GetFrameNumber() const
Definition CbmMvdDigi.h:90
int32_t GetPixelX() const
Definition CbmMvdDigi.h:74
double GetCharge() const
Definition CbmMvdDigi.h:73
int32_t GetRefId() const
Definition CbmMvdDigi.h:93
void UpdateDebugHistos(CbmMvdCluster *cluster)
std::map< std::pair< Int_t, Int_t >, Int_t > fDigiMap
void CheckForNeighbours(std::vector< Int_t > *clusterArray, Int_t clusterDigi, TArrayS *pixelUsed)
std::map< std::pair< Int_t, Int_t >, Int_t >::iterator fDigiMapIt
std::map< std::pair< Int_t, Int_t >, Int_t > ftempPixelMap
virtual const char * GetName() const
CbmMvdSensor * fSensor
TClonesArray * fOutputBuffer
TClonesArray * fInputBuffer