CbmRoot
Loading...
Searching...
No Matches
CbmMvdSensorFindHitTask.cxx
Go to the documentation of this file.
1/* Copyright (C) 2013-2019 Institut fuer Kernphysik, Goethe-Universitaet Frankfurt, Frankfurt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Philipp Sitzmann [committer], Florian Uhlig */
4
5// ---------------------------------------------------------------------------------------------
6// ----- CbmMvdSensorFindHitTask source file -----
7// ----- Created 11/09/13 by P.Sitzmann -----
8// ----- -----
9// ---------------------------------------------------------------------------------------------
10// Includes from MVD
12
13#include "CbmMvdCluster.h"
14#include "CbmMvdHit.h"
15#include "CbmMvdPileupManager.h"
16#include "CbmMvdPoint.h"
17
18// Includes from base
19#include "CbmMCTrack.h"
20#include "FairGeoNode.h"
21#include "FairRootManager.h"
22#include "FairRunAna.h"
23#include "FairRuntimeDb.h"
24
25#include <Logger.h>
26
27// Includes from ROOT
28#include "TArrayD.h"
29#include "TCanvas.h"
30#include "TClonesArray.h"
31#include "TF1.h"
32#include "TGeoManager.h"
33#include "TGeoTube.h"
34#include "TH1.h"
35#include "TH2.h"
36#include "TMath.h"
37#include "TObjArray.h"
38#include "TRandom3.h"
39#include "TRefArray.h"
40#include "TString.h"
41#include "TVector3.h"
42
43// Includes from C++
44#include <iomanip>
45#include <iostream>
46#include <map>
47#include <vector>
48
49using std::fixed;
50using std::ios_base;
51using std::left;
52using std::map;
53using std::pair;
54using std::right;
55using std::setprecision;
56using std::setw;
57using std::vector;
58
59
60// ----- Default constructor ------------------------------------------
63 , fAdcDynamic(200)
64 , fAdcOffset(0)
65 , fAdcBits(1)
66 , fAdcSteps(-1)
67 , fAdcStepSize(-1.)
68 , fDigis(nullptr)
69 , fHits(nullptr)
70 , fClusters(new TClonesArray("CbmMvdCluster", 10000))
71 , fPixelChargeHistos(nullptr)
72 , fTotalChargeInNpixelsArray(nullptr)
73 , fResolutionHistoX(nullptr)
74 , fResolutionHistoY(nullptr)
75 , fResolutionHistoCleanX(nullptr)
76 , fResolutionHistoCleanY(nullptr)
77 , fResolutionHistoMergedX(nullptr)
78 , fResolutionHistoMergedY(nullptr)
79 , fBadHitHisto(nullptr)
80 , fGausArray(nullptr)
81 , fGausArrayIt(-1)
82 , fGausArrayLimit(5000)
83 , fDigiMap()
84 , fDigiMapIt()
85 , h(nullptr)
86 , h3(nullptr)
87 , h1(nullptr)
88 , h2(nullptr)
89 , Qseed(nullptr)
90 , fFullClusterHisto(nullptr)
91 , c1(nullptr)
92 , fNEvent(0)
93 , fMode(0)
94 , fCounter(0)
95 , fSigmaNoise(15.)
96 , fSeedThreshold(1.)
97 , fNeighThreshold(1.)
98 , fShowDebugHistos(kFALSE)
99 , fUseMCInfo(kFALSE)
100 , inputSet(kFALSE)
101 , fLayerRadius(0.)
102 , fLayerRadiusInner(0.)
103 , fLayerPosZ(0.)
104 , fHitPosX(0.)
105 , fHitPosY(0.)
106 , fHitPosZ(0.)
107 , fHitPosErrX(0.0005)
108 , fHitPosErrY(0.0005)
109 , fHitPosErrZ(0.0)
110 , fBranchName("MvdHit")
111 , fDigisInCluster(-1)
112 , fAddNoise(kFALSE)
113{
114 fPluginIDNumber = 400;
115}
116// -------------------------------------------------------------------------
117
118
119// ----- Standard constructor ------------------------------------------
122 , fAdcDynamic(200)
123 , fAdcOffset(0)
124 , fAdcBits(1)
125 , fAdcSteps(-1)
126 , fAdcStepSize(-1.)
127 , fDigis(nullptr)
128 , fHits(nullptr)
129 , fClusters(new TClonesArray("CbmMvdCluster", 100))
130 , fPixelChargeHistos(nullptr)
131 , fTotalChargeInNpixelsArray(nullptr)
132 , fResolutionHistoX(nullptr)
133 , fResolutionHistoY(nullptr)
134 , fResolutionHistoCleanX(nullptr)
135 , fResolutionHistoCleanY(nullptr)
136 , fResolutionHistoMergedX(nullptr)
137 , fResolutionHistoMergedY(nullptr)
138 , fBadHitHisto(nullptr)
139 , fGausArray(nullptr)
140 , fGausArrayIt(-1)
141 , fGausArrayLimit(5000)
142 , fDigiMap()
143 , fDigiMapIt()
144 , h(nullptr)
145 , h3(nullptr)
146 , h1(nullptr)
147 , h2(nullptr)
148 , Qseed(nullptr)
149 , fFullClusterHisto(nullptr)
150 , c1(nullptr)
151 , fNEvent(0)
152 , fMode(iMode)
153 , fCounter(0)
154 , fSigmaNoise(15.)
155 , fSeedThreshold(1.)
156 , fNeighThreshold(1.)
157 , fShowDebugHistos(kFALSE)
158 , fUseMCInfo(kFALSE)
159 , inputSet(kFALSE)
160 , fLayerRadius(0.)
161 , fLayerRadiusInner(0.)
162 , fLayerPosZ(0.)
163 , fHitPosX(0.)
164 , fHitPosY(0.)
165 , fHitPosZ(0.)
166 , fHitPosErrX(0.0005)
167 , fHitPosErrY(0.0005)
168 , fHitPosErrZ(0.0)
169 , fBranchName("MvdHit")
170 , fDigisInCluster(-1)
171 , fAddNoise(kFALSE)
172{
173 fPluginIDNumber = 400;
174}
175// -------------------------------------------------------------------------
176
177// ----- Destructor ----------------------------------------------------
179{
180
181 if (fHits) {
182 fHits->Delete();
183 delete fHits;
184 }
185
186 if (fClusters) {
187 fClusters->Delete();
188 delete fClusters;
189 }
190
191 if (fInputBuffer) {
192 fInputBuffer->Delete();
193 delete fInputBuffer;
194 }
195}
196// -------------------------------------------------------------------------
197
198// ----- Virtual private method Init ----------------------------------
200{
201
202
203 fSensor = mysensor;
204 //LOG(debug) << GetName() << ": Initialisation of sensor " << fSensor->GetName();
205 fInputBuffer = new TClonesArray("CbmMvdDigi", 100);
206 fOutputBuffer = new TClonesArray("CbmMvdHit", 100);
207 fHits = new TClonesArray("CbmMvdHit", 100);
208
209
210 //Add charge collection histograms
211 fPixelChargeHistos = new TObjArray();
212
213 fTotalChargeInNpixelsArray = new TObjArray();
214
215 fAdcSteps = (Int_t) TMath::Power(2, fAdcBits);
217
218 fGausArray = new Float_t[fGausArrayLimit];
219 for (Int_t i = 0; i < fGausArrayLimit; i++) {
220 fGausArray[i] = gRandom->Gaus(0, fSigmaNoise);
221 };
222 fGausArrayIt = 0;
223
224
225 initialized = kTRUE;
226
227 //LOG(debug) << "-Finished- " << GetName() << ": Initialisation of sensor " << fSensor->GetName();
228}
229// -------------------------------------------------------------------------
230
231// ----- Virtual public method Reinit ----------------------------------
233{
234 LOG(info) << "CbmMvdSensorFindHitTask::ReInt---------------";
235 return kSUCCESS;
236}
237// -------------------------------------------------------------------------
238
239// ----- Virtual public method ExecChain --------------
241// -------------------------------------------------------------------------
242
243// ----- Virtual public method Exec --------------
245{
246 // if(!inputSet)
247 // {
248 // fInputBuffer->Clear();
249 // fInputBuffer->AbsorbObjects(fPreviousPlugin->GetOutputArray());
250 // LOG(debug) << "absorbt object from previous plugin at " << fSensor->GetName() << " got " << fInputBuffer->GetEntriesFast() << " entrys";
251 // }
252 if (fInputBuffer->GetEntriesFast() > 0) {
253 fHits->Clear("C");
254 fOutputBuffer->Clear();
255 fClusters->Clear("C");
256 inputSet = kFALSE;
257 vector<Int_t>* clusterArray = new vector<Int_t>;
258
259 CbmMvdDigi* digi = nullptr;
260
261 Int_t iDigi = 0;
262 digi = (CbmMvdDigi*) fInputBuffer->At(iDigi);
263
264
265 if (!digi) {
266 LOG(error) << "CbmMvdSensorFindHitTask - Fatal: No Digits found in this event.";
267 }
268
269 Int_t nDigis = fInputBuffer->GetEntriesFast();
270
271 //LOG(debug) << "working with " << nDigis << " entries";
272
273
274 if (fAddNoise == kTRUE) {
275 // Generate random number and call it noise
276 // add the noise to the charge of the digis
277
278 LOG(info) << "CbmMvdSensorFindHitTask: Calling method AddNoiseToDigis()..."
279
280 for (iDigi = 0; iDigi < nDigis; iDigi++)
281 {
282
283 digi = (CbmMvdDigi*) fInputBuffer->At(iDigi);
284 AddNoiseToDigis(digi);
285 }
286 }
287
288 if (fMode == 1) {
289 // GenerateFakeDigis(pixelSizeX, pixelSizeY); // -------- Create Fake Digis -
290 //LOG(debug) << "generate fake digis";
291 }
292
293
294 nDigis = fInputBuffer->GetEntriesFast();
295 TArrayS* pixelUsed = new TArrayS(nDigis);
296
297 for (iDigi = 0; iDigi < nDigis; iDigi++) {
298 pixelUsed->AddAt(0, iDigi);
299 }
300
301 fDigiMap.clear();
302 Int_t refId;
303 for (Int_t k = 0; k < nDigis; k++) {
304
305 digi = (CbmMvdDigi*) fInputBuffer->At(k);
306 refId = digi->GetRefId();
307 if (refId < 0) {
308 LOG(fatal) << "RefID of this digi is -1 this should not happend ";
309 }
310 //apply fNeighThreshold
311
312 if (GetAdcCharge(digi->GetCharge()) < fNeighThreshold) continue;
313
314 pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY());
315 // LOG(debug) << "registerde pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY();
316 fDigiMap[a] = k;
317 };
318
319
320 LOG(debug) << GetName() << ": VolumeId " << fSensor->GetVolumeId();
321
322 for (iDigi = 0; iDigi < nDigis; iDigi++) {
323
324 LOG_If(debug, iDigi % 10000 == 0) << GetName() << " Digi:" << iDigi;
325
326 digi = (CbmMvdDigi*) fInputBuffer->At(iDigi);
327 //LOG(debug) << "working with pixel x:" << digi->GetPixelX() << " y:" << digi->GetPixelY();
328
329
330 /*
331 ---------------------------------------------------------
332 check if digi is above threshold (define seed pixel)
333 then check for neighbours.
334 Once the cluster is created (seed and neighbours)
335 calculate the position of the hit
336 using center of gravity (CoG) method.
337 ---------------------------------------------------------
338 */
339
340 LOG(debug) << "CbmMvdSensorFindHitTask: Checking for seed pixels...";
341
342 if ((GetAdcCharge(digi->GetCharge()) >= fSeedThreshold) && (pixelUsed->At(iDigi) == kFALSE)) {
343 clusterArray->clear();
344 clusterArray->push_back(iDigi);
345
346
347 pixelUsed->AddAt(1, iDigi);
348
349 pair<Int_t, Int_t> a(digi->GetPixelX(), digi->GetPixelY());
350 fDigiMapIt = fDigiMap.find(a);
351 fDigiMap.erase(fDigiMapIt);
352
353 for (ULong64_t iCluster = 0; iCluster < clusterArray->size(); iCluster++) {
354
355 LOG(debug) << " CbmMvdSensorFindHitTask: Calling method CheckForNeighbours()...";
356
357 CheckForNeighbours(clusterArray, iCluster, pixelUsed);
358 }
359
360 //Calculate the center of gravity of all pixels in the cluster.
361 TVector3 pos(0, 0, 0);
362 TVector3 dpos(0, 0, 0);
363
364 LOG(debug) << " CbmMvdSensorFindHitTask: Calling method CreateHit()...";
365
366 CreateHit(clusterArray, pos, dpos);
367
368
369 } // if AdcCharge>threshold
370 else { //LOG(debug) << "pixel is with " << digi->GetCharge() << " under Threshold or used";
371 }
372 } // loop on digis
373
374
375 //----------------------------------------------------------------------------------
376 //------------- End of Detector Loops ----------------------------------------------
377 //----------------------------------------------------------------------------------
378
379 // LOG(debug) << "End of task " << GetName() << ": Event Nr: " << fNEvent << ", nDIGIS: "<<nDigis << ", nHits:"<<fHits->GetEntriesFast();
380
381
382 /*LOG(debug) << "registered " << fHits->GetEntriesFast()
383 << " new hits out of " << fInputBuffer->GetEntriesFast()
384 << " Digis on sensor "
385 << fSensor->GetName(); */
386
387 delete pixelUsed;
388 clusterArray->clear();
389 delete clusterArray;
390 fInputBuffer->Clear();
391
392 fDigiMap.clear();
393 }
394 else { //LOG(debug) << "No input found.";
395 }
396}
397//--------------------------------------------------------------------------
398
399
400//--------------------------------------------------------------------------
402{
403 Double_t noise = fGausArray[fGausArrayIt++]; // noise is simulated by a gauss
404 if (fGausArrayIt - 2 > fGausArrayLimit) {
405 fGausArrayIt = 0;
406 };
407 Double_t charge = digi->GetCharge() + noise;
408 digi->SetCharge((int) charge);
409}
410//--------------------------------------------------------------------------
411
412
413//--------------------------------------------------------------------------
414//void CbmMvdSensorFindHitTask::GenerateFakeDigis( Double_t pixelSizeX, Double_t pixelSizeY){
415
416//max index of pixels
417//Int_t nx = TMath::Nint(2*fLayerRadius/pixelSizeX);
418//Int_t ny = TMath::Nint(2*fLayerRadius/pixelSizeY);
419
420//cdritsa: parametrise geometry: 15/12/08
421/* Double_t layerRadius = station->GetRmax();
422// Double_t layerRadiusInner = station->GetRmin();
423
424 Int_t nx = int(2*layerRadius/pixelSizeX);
425 Int_t ny = int(2*layerRadius/pixelSizeY);
426
427 Double_t x;
428 Double_t y;
429 Double_t distance2;
430 Double_t noise;
431 Double_t r2 = layerRadius*layerRadius;
432 Double_t r2_inner = layerRadiusInner*layerRadiusInner;
433
434 for( Int_t i=0; i<nx; i++){
435
436 x = (i+0.5)*pixelSizeX - layerRadius;
437
438 for( Int_t j=0; j<ny; j++){
439
440 y = (j+0.5)*pixelSizeY - layerRadius;
441
442 distance2 = x*x + y*y ;
443
444
445 if( distance2>r2 || distance2<r2_inner ) continue;
446
447 noise = fGausArray[fGausArrayIt++]; // noise is simulated by a gauss
448 if (fGausArrayIt-2>fGausArrayLimit){fGausArrayIt=0;};
449
450 if ( noise>fSeedThreshold && //pixel is not used ???){
451 Int_t nDigis = fInputBuffer->GetEntriesFast();
452 CbmMvdDigi* fakeDigi=
453 new ((*fInputBuffer)[nDigis]) CbmMvdDigi(station->GetVolumeId(), i,j, noise, pixelSizeX,pixelSizeY);
454
455 Int_t data[5];
456 Float_t data2[5];
457
458
459
460
461 }
462 }
463 }
464
465
466
467}*/
468
469//--------------------------------------------------------------------------
470//--------------------------------------------------------------------------
471
472void CbmMvdSensorFindHitTask::CheckForNeighbours(vector<Int_t>* clusterArray, Int_t clusterDigi, TArrayS* pixelUsed)
473{
474 CbmMvdDigi* seed = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(clusterDigi));
475 //LOG(debug) << "pixel nr. " << clusterDigi << " is seed";
476 // Remove Seed Pixel from list of non-used pixels
477 Int_t channelX = seed->GetPixelX();
478 Int_t channelY = seed->GetPixelY();
479 pair<Int_t, Int_t> a(channelX, channelY);
480
481 // Find first neighbour
482
483 a = std::make_pair(channelX + 1, channelY);
484 fDigiMapIt = fDigiMap.find(a);
485
486 if (!(fDigiMapIt == fDigiMap.end())) {
487 Int_t i = fDigiMap[a];
488 //LOG(debug) << "pixel nr. " << i << " is used";
489 // Only digis depassing fNeighThreshold are in the map, no cut required
490 clusterArray->push_back(i);
491
492 pixelUsed->AddAt(1, i); // block pixel for the seed pixel scanner
493 fDigiMap.erase(fDigiMapIt); // block pixel for the neighbour pixel scanner
494 }
495
496 a = std::make_pair(channelX - 1, channelY);
497 fDigiMapIt = fDigiMap.find(a);
498
499 if (!(fDigiMapIt == fDigiMap.end())) {
500 Int_t i = fDigiMap[a];
501 //LOG(debug) << "pixel nr. " << i << " is used";
502 // Only digits depassing fNeighThreshold are in the map, no cut required
503 clusterArray->push_back(i);
504 pixelUsed->AddAt(1, i); // block pixel for the seed pixel scanner
505 fDigiMap.erase(fDigiMapIt); // block pixel for the neighbour pixel scanner
506 }
507
508 a = std::make_pair(channelX, channelY - 1);
509 fDigiMapIt = fDigiMap.find(a);
510 if (!(fDigiMapIt == fDigiMap.end())) {
511 Int_t i = fDigiMap[a];
512 // Only digits depassing fNeighThreshold are in the map, no cut required
513 //LOG(debug) << "pixel nr. " << i << " is used";
514 clusterArray->push_back(i);
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, channelY + 1);
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 digis 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
532//--------------------------------------------------------------------------
533//--------------------------------------------------------------------------
534void CbmMvdSensorFindHitTask::CreateHit(vector<Int_t>* clusterArray, TVector3& pos, TVector3& dpos)
535{
536
537 //loop on cluster array elements
538 //calculate the CoG for this cluster
539
540 Int_t clusterSize = clusterArray->size();
541 Int_t digiIndex = 0;
542 //LOG(debug) << "try to create hit from " << clusterSize << " pixels";
543 CbmMvdDigi* pixelInCluster = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(digiIndex));
544 Int_t thisRefID = pixelInCluster->GetRefId();
545 while (thisRefID < 0 && digiIndex < clusterSize) {
546 pixelInCluster = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(digiIndex));
547 thisRefID = pixelInCluster->GetRefId();
548 digiIndex++;
549 }
550 if (thisRefID < 0)
551 LOG(fatal) << "RefID of this digi is -1 this should not happend checked " << digiIndex << " digis in this Cluster";
552
553 // Calculate the center of gravity of the charge of a cluster
554
555 ComputeCenterOfGravity(clusterArray, pos, dpos);
556
557
558 Int_t indexX, indexY;
559 Double_t local[3] = {pos.X(), pos.Y(), pos.Z()};
560
561 //LOG(debug) << "found center of gravity at: " << local[0] << " , " << local[1];
562
563 fSensor->TopToPixel(local, indexX, indexY);
564
565 //LOG(debug) << "Center is on pixel: " << indexX << " , " << indexY;
566 //Fill HitClusters
567
568 Int_t i = 0;
569 Int_t* digiArray = new Int_t[fDigisInCluster];
570
571 for (i = 0; i < fDigisInCluster; i++) {
572 digiArray[i] = 0;
573 };
574
575 Int_t latestClusterIndex = -1;
576 Int_t digisInArray = 0;
577
578 CbmMvdCluster* latestCluster = nullptr;
579 Int_t nClusters = -1;
580
581 for (i = 0; i < clusterSize; i++) {
582
583 digiArray[i % fDigisInCluster] = clusterArray->at(i);
584 digisInArray = digisInArray + 1;
585
586 if (digisInArray == fDigisInCluster) { // intermediate buffer full
587
588 nClusters = fClusters->GetEntriesFast();
589 CbmMvdCluster* clusterNew =
590 new ((*fClusters)[nClusters]) CbmMvdCluster(digiArray, digisInArray, clusterSize, latestClusterIndex);
591 if (latestCluster) {
592 latestCluster->SetNeighbourUp(nClusters);
593 }
594 latestCluster = clusterNew;
595 latestClusterIndex = nClusters;
596 digisInArray = 0;
597 }
598 }
599
600 if (digisInArray != 0) {
601 nClusters = fClusters->GetEntriesFast();
602 CbmMvdCluster* clusterNew =
603 new ((*fClusters)[nClusters]) CbmMvdCluster(digiArray, digisInArray, clusterSize, latestClusterIndex);
604 clusterNew->SetNeighbourUp(-1);
605 if (latestCluster) {
606 latestCluster->SetNeighbourUp(nClusters);
607 };
608 };
609
610
611 // Save hit into array
612 Int_t nHits = fHits->GetEntriesFast();
613 //LOG(debug) << "adding new hit to fHits at X: " << pos.X() << " , Y: "<< pos.Y() << " , Z: " << pos.Z() << " , ";
614 new ((*fHits)[nHits]) CbmMvdHit(fSensor->GetStationNr(), pos, dpos, indexX, indexY, nClusters, 0);
615 CbmMvdHit* currentHit = new CbmMvdHit;
616 currentHit = (CbmMvdHit*) fHits->At(nHits);
617 currentHit->SetTime(fSensor->GetCurrentEventTime());
618 currentHit->SetTimeError(fSensor->GetIntegrationtime() / 2);
619 currentHit->SetRefId(thisRefID);
620 if (pixelInCluster->GetRefId() < 0)
621 LOG(info) << "new hit with refID " << pixelInCluster->GetRefId() << " to hit " << nHits;
622
623 nHits = fOutputBuffer->GetEntriesFast();
624 new ((*fOutputBuffer)[nHits]) CbmMvdHit(fSensor->GetStationNr(), pos, dpos, indexX, indexY, nClusters, 0);
625 currentHit = (CbmMvdHit*) fOutputBuffer->At(nHits);
626 currentHit->SetTime(fSensor->GetCurrentEventTime());
627 currentHit->SetTimeError(fSensor->GetIntegrationtime() / 2);
628 currentHit->SetRefId(pixelInCluster->GetRefId());
629
630 delete[] digiArray;
631}
632
633//--------------------------------------------------------------------------
634
635void CbmMvdSensorFindHitTask::UpdateDebugHistos(vector<Int_t>* clusterArray, Int_t seedIndexX, Int_t seedIndexY)
636{
637 /************************************************************
638 Algorithm for cluster shapes
639
640 ************************************************************/
641
642
643 Float_t chargeArray3D[fChargeArraySize][fChargeArraySize];
644 Float_t chargeArray[fChargeArraySize * fChargeArraySize];
645 Short_t seedPixelOffset = fChargeArraySize / 2; // 3 for 7, 2 for 5
646 Float_t xCentralTrack = 0.0;
647 Float_t yCentralTrack = 0.0;
648 Float_t clusterCharge = 0;
649
650 Int_t clusterSize = clusterArray->size();
651
652 for (Int_t k = 0; k < fChargeArraySize; k++) {
653 for (Int_t j = 0; j < fChargeArraySize; j++) {
654 chargeArray3D[k][j] = gRandom->Gaus(0, fSigmaNoise);
655 }
656 }
657
658 for (Int_t k = 0; k < clusterSize; k++) {
659 CbmMvdDigi* digi = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(k));
660
661 clusterCharge = clusterCharge + digi->GetCharge();
662
663 Int_t relativeX = digi->GetPixelX() + seedPixelOffset - seedIndexX;
664 Int_t relativeY = digi->GetPixelY() + seedPixelOffset - seedIndexY;
665
666 //for debugging
667 //LOG(debug) << relativeX << " " << relativeY << " " <<digi->GetPixelX()<< " " << seedIndexX;
668
669
670 if (relativeX >= 0 && relativeX < fChargeArraySize && relativeY >= 0 && relativeY < fChargeArraySize) {
671 chargeArray3D[relativeX][relativeY] = digi->GetCharge();
672 }
673
674 if ((relativeX - seedPixelOffset == 0) && (relativeY - seedPixelOffset == 0)) { //seed digiArray
675 }
676 }
677
678 //for debugging
679 //for(Int_t i=0;i<fChargeArraySize;i++)
680 //{for (Int_t j=0;j<fChargeArraySize;j++) {LOG(debug) << chargeArray3D[i][j] << " " ;}
681 //}
682
683 fFullClusterHisto->Fill(clusterCharge);
684
685 for (Int_t k = 0; k < fChargeArraySize; k++) {
686 for (Int_t j = 0; j < fChargeArraySize; j++) {
687 chargeArray[fChargeArraySize * k + j] = chargeArray3D[k][j];
688 }
689 }
690
691 Int_t qSeed = chargeArray3D[seedPixelOffset][seedPixelOffset];
692 Int_t q9 = 0;
693
694 for (Int_t k = seedPixelOffset - 1; k < seedPixelOffset + 1; k++) {
695 for (Int_t j = seedPixelOffset - 1; j < seedPixelOffset + 1; j++) {
696 q9 = q9 + chargeArray3D[k][j];
697 }
698 };
699
700 if (fChargeArraySize <= 7) {
701 for (Int_t i = 0; i < (fChargeArraySize * fChargeArraySize); i++) {
702 ((TH1F*) fPixelChargeHistos->At(i))->Fill(chargeArray[i]);
703 //LOG(debug) << counter++<<" Charge: " << chargeArray[i];
704 };
705 };
706
707 //LOG(debug) << "End of Cluster: "<<fChargeArraySize*fChargeArraySize;
708
709 Int_t q25 = 0;
710 Int_t q49 = 0;
711
712
713 for (Int_t k = seedPixelOffset - 2; k < seedPixelOffset + 2; k++) {
714 for (Int_t j = seedPixelOffset - 2; j < seedPixelOffset + 2; j++) {
715 q25 = q25 + chargeArray3D[k][j];
716 }
717 };
718
719 if (fChargeArraySize >= 7) {
720 for (Int_t k = seedPixelOffset - 3; k < seedPixelOffset + 3; k++) {
721 for (Int_t j = seedPixelOffset - 3; j < seedPixelOffset + 3; j++) {
722 q49 = q49 + chargeArray3D[k][j];
723 }
724 }
725 }
726
727 ((TH1F*) fPixelChargeHistos->At(49))->Fill(qSeed);
728 ((TH1F*) fPixelChargeHistos->At(50))->Fill(q9);
729 ((TH1F*) fPixelChargeHistos->At(51))->Fill(q25);
730 ((TH1F*) fPixelChargeHistos->At(52))->Fill(q49);
731
732 if (fHitPosX - xCentralTrack > 0.003 && fHitPosZ < 6) {
734 }
735
736 fResolutionHistoX->Fill(fHitPosX - xCentralTrack);
737 fResolutionHistoY->Fill(fHitPosY - yCentralTrack);
738
739
740 //Prepare selection of crowns for charge bow histograms
741
742
743 Int_t orderArray[fChargeArraySize * fChargeArraySize];
744
745 TMath::Sort(fChargeArraySize * fChargeArraySize, chargeArray, orderArray, kTRUE);
746
747 Float_t qSort = 0;
748 for (Int_t i = 0; i < 9; i++) {
749 qSort += chargeArray[orderArray[i]];
750 };
751 ((TH1F*) fPixelChargeHistos->At(53))->Fill(qSort);
752
753 for (Int_t i = 9; i < 25; i++) {
754 qSort += chargeArray[orderArray[i]];
755 };
756 ((TH1F*) fPixelChargeHistos->At(54))->Fill(qSort);
757
758 TH1F* histoTotalCharge;
759 qSort = 0;
760 for (Int_t i = 0; i < fChargeArraySize * fChargeArraySize; i++) {
761 qSort += chargeArray[orderArray[i]];
762 ((TH1F*) fPixelChargeHistos->At(55))->Fill(i + 1, qSort);
763 histoTotalCharge = (TH1F*) fTotalChargeInNpixelsArray->At(i);
764 histoTotalCharge->Fill(qSort);
765 };
766}
767
768
769//--------------------------------------------------------------------------
770
771void CbmMvdSensorFindHitTask::ComputeCenterOfGravity(vector<Int_t>* clusterArray, TVector3& pos, TVector3& dpos)
772{
773 Double_t numeratorX = 0;
774 Double_t numeratorY = 0;
775 Double_t denominator = 0;
776 Double_t pixelSizeX = 0;
777 Double_t pixelSizeY = 0;
778 Int_t charge;
779 Int_t xIndex;
780 Int_t yIndex;
781 Double_t x, y;
782 Double_t layerPosZ = fSensor->GetZ();
783 CbmMvdDigi* pixelInCluster;
784 Double_t lab[3] = {0, 0, 0};
785
786 Int_t clusterSize = clusterArray->size();
787
788 for (Int_t iCluster = 0; iCluster < clusterSize; iCluster++) {
789
790 pixelInCluster = (CbmMvdDigi*) fInputBuffer->At(clusterArray->at(iCluster));
791
792
793 charge = GetAdcCharge(pixelInCluster->GetCharge());
794 xIndex = pixelInCluster->GetPixelX();
795 yIndex = pixelInCluster->GetPixelY();
796 pixelSizeX = pixelInCluster->GetPixelSizeX();
797 pixelSizeY = pixelInCluster->GetPixelSizeY();
798
799 LOG(debug) << "CbmMvdSensorFindHitTask:: iCluster= " << iCluster << " , clusterSize= " << clusterSize;
800 LOG(debug) << "CbmMvdSensorFindHitTask::xIndex " << xIndex << " , yIndex " << yIndex
801 << " , charge = " << pixelInCluster->GetAdcCharge(fAdcDynamic, fAdcOffset, fAdcBits);
802 }
803
805
806 x = lab[0];
807 y = lab[1];
808
809 //LOG(debug) << "x = " << x << " y = " << y;
810 //Calculate x,y coordinates of the pixel in the detector ref frame
811 //Double_t x = ( 0.5+double(xIndex) )*pixelSizeX;
812 //Double_t y = ( 0.5+double(yIndex) )*pixelSizeY;
813
814 Double_t xc = x * charge;
815 Double_t yc = y * charge;
816
817
818 numeratorX += xc;
819 numeratorY += yc;
820 denominator += charge;
821}
822
823LOG(debug) << "CbmMvdSensorFindHitTask::=========================";
824LOG(debug) << "CbmMvdSensorFindHitTask::numeratorX: " << numeratorX << " , numeratorY: " << numeratorY
825 << ", denominator: " << denominator;
826
827//Calculate x,y coordinates of the pixel in the laboratory ref frame
828if (denominator != 0) {
829 fHitPosX = (numeratorX / denominator);
830 fHitPosY = (numeratorY / denominator);
831 fHitPosZ = layerPosZ;
832}
833else {
834 fHitPosX = 0;
835 fHitPosY = 0;
836 fHitPosZ = 0;
837}
838LOG(debug) << "CbmMvdSensorFindHitTask::-----------------------------------";
839LOG(debug) << "CbmMvdSensorFindHitTask::X hit= " << fHitPosX << " Y hit= " << fHitPosY << " Z hit= " << fHitPosZ;
840LOG(debug) << "CbmMvdSensorFindHitTask::-----------------------------------";
841
842// pos = center of gravity (labframe), dpos uncertainty
843pos.SetXYZ(fHitPosX, fHitPosY, fHitPosZ);
844dpos.SetXYZ(fHitPosErrX, fHitPosErrY, fHitPosErrZ);
845}
846
847//--------------------------------------------------------------------------
848
849
850//--------------------------------------------------------------------------
852{
853 if (fShowDebugHistos) {
854 LOG(info) << "============================================================";
855 LOG(info) << GetName() << "::Finish: Total events skipped: " << fCounter;
856 LOG(info) << "============================================================";
857 LOG(info) << "Parameters used";
858 LOG(info) << "Gaussian noise [electrons] : " << fSigmaNoise;
859 LOG(info) << "Noise simulated [Bool] : " << fAddNoise;
860 LOG(info) << "Threshold seed [ADC] : " << fSeedThreshold;
861 LOG(info) << "Threshold neighbours [ADC] : " << fNeighThreshold;
862 LOG(info) << "ADC - Bits : " << fAdcBits;
863 LOG(info) << "ADC - Dynamic [electrons] : " << fAdcDynamic;
864 LOG(info) << "ADC - Offset [electrons] : " << fAdcOffset;
865 LOG(info) << "============================================================";
866
867
868 TH1F* histo;
869 TH2F* clusterShapeHistogram;
870
871
872 TCanvas* canvas2 = new TCanvas("HitFinderCharge", "HitFinderCharge");
873 //LOG(debug) <<fChargeArraySize;
874 canvas2->Divide(2, 2);
875 canvas2->cd(1);
876
877
878 if (fChargeArraySize <= 7) {
879 clusterShapeHistogram = new TH2F("MvdClusterShape", "MvdClusterShape", fChargeArraySize, 0, fChargeArraySize,
881
882 for (Int_t i = 0; i < fChargeArraySize * fChargeArraySize; i++) {
883 histo = (TH1F*) fPixelChargeHistos->At(i);
884 Float_t charge = histo->GetMean();
885 //LOG(debug) <<i << " Charge " << charge << " xCluster: " << i%fChargeArraySize << " yCluster: " << i/fChargeArraySize;
886 //histo->Fit("landau");
887 //TF1* fitFunction= histo->GetFunction("landau");
888 // Double_t MPV=fitFunction->GetParameter(1);
889 clusterShapeHistogram->Fill(i % fChargeArraySize, i / fChargeArraySize, charge);
890 //canvas2->cd(i);
891 //histo->Draw();
892 }
893 }
894
895 clusterShapeHistogram->Draw("Lego2");
896 canvas2->cd(2);
897 histo = (TH1F*) fPixelChargeHistos->At(24);
898 histo->Draw();
899 //LOG(debug) <<"Mean charge" << histo->GetMean();
900 /*
901 TCanvas* canvas=new TCanvas("HitFinderCanvas","HitFinderCanvas");
902 canvas->Divide (2,3);
903 canvas->cd(1);
904 fResolutionHistoX->Draw();
905 fResolutionHistoX->Write();
906 canvas->cd(2);
907 fResolutionHistoY->Draw();
908 fResolutionHistoY->Write();
909 canvas->cd(3);
910 ((TH1F*)fPixelChargeHistos->At(49))->Draw();
911 ((TH1F*)fPixelChargeHistos->At(49))->Fit("landau");
912 canvas->cd(4);
913 fFullClusterHisto->Draw();
914 canvas->cd(5);
915 ((TH1F*)fTotalChargeInNpixelsArray->At(0))->Draw();
916 ((TH1F*)fTotalChargeInNpixelsArray->At(0))->Fit("landau");
917 //fResolutionHistoMergedX->Write();
918 canvas->cd(6);
919 clusterShapeHistogram->Draw("Lego2");
920 //fResolutionHistoMergedY->Draw();
921 //fResolutionHistoMergedY->Write();*/
922 }
923}
924//--------------------------------------------------------------------------
925
926Int_t CbmMvdSensorFindHitTask::GetAdcCharge(Float_t charge)
927{
928
929 Int_t adcCharge;
930
931 if (charge < fAdcOffset) {
932 return 0;
933 };
934
935 adcCharge = int((charge - fAdcOffset) / fAdcStepSize);
936 if (adcCharge > fAdcSteps - 1) {
937 adcCharge = fAdcSteps - 1;
938 }
939
940 return adcCharge;
941}
942
943
944// ----- Private method Reset ------------------------------------------
946{
947 fHits->Clear("C");
948 fClusters->Clear("C");
949}
950
951// -------------------------------------------------------------------------
952
953
ClassImp(CbmConverterManager)
Double_t denominator
TVector3 dpos
Double_t numeratorY
Double_t lab[3]
Double_t numeratorX
const constexpr Int_t fCounter(0)
void SetTimeError(double error)
Definition CbmHit.h:91
void SetRefId(int32_t refId)
Definition CbmHit.h:82
void SetTime(double time)
Definition CbmHit.h:85
void SetCharge(float charge)
Definition CbmMvdDigi.h:75
double GetPixelSizeX()
Definition CbmMvdDigi.h:50
int32_t GetAdcCharge(int32_t adcDynamic, int32_t adcOffset, int32_t adcBits)
int32_t GetPixelY()
double GetPixelSizeY()
Definition CbmMvdDigi.h:51
int32_t GetPixelX()
double GetCharge() const
Definition CbmMvdDigi.h:47
int32_t GetRefId() const
Definition CbmMvdDigi.h:61
static const Short_t fChargeArraySize
void UpdateDebugHistos(std::vector< Int_t > *clusterArray, Int_t seedIndexX, Int_t seedIndexY)
void ComputeCenterOfGravity(std::vector< Int_t > *clusterArray, TVector3 &pos, TVector3 &dpos)
std::map< std::pair< Int_t, Int_t >, Int_t > fDigiMap
void AddNoiseToDigis(CbmMvdDigi *digi)
std::map< std::pair< Int_t, Int_t >, Int_t >::iterator fDigiMapIt
void CheckForNeighbours(std::vector< Int_t > *clusterArray, Int_t clusterDigi, TArrayS *pixelUsed)
void InitTask(CbmMvdSensor *mySensor)
Int_t GetAdcCharge(Float_t charge)
void CreateHit(std::vector< Int_t > *clusterArray, TVector3 &pos, TVector3 &dpos)
virtual const char * GetName() const
CbmMvdSensor * fSensor
TClonesArray * fOutputBuffer
TClonesArray * fInputBuffer
void PixelToTop(Int_t pixelNumberX, Int_t pixelNumberY, Double_t *lab)
Double_t GetCurrentEventTime() const
Int_t GetVolumeId() const
Double_t GetIntegrationtime() const
Double_t GetZ() const
Int_t GetStationNr() const
void TopToPixel(Double_t *lab, Int_t &pixelNumberX, Int_t &pixelNumberY)
Data class with information on a STS local track.