20#include "FairGeoNode.h"
21#include "FairRootManager.h"
22#include "FairRunAna.h"
23#include "FairRuntimeDb.h"
30#include "TClonesArray.h"
32#include "TGeoManager.h"
55using std::setprecision;
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)
82 , fGausArrayLimit(5000)
90 , fFullClusterHisto(nullptr)
98 , fShowDebugHistos(kFALSE)
102 , fLayerRadiusInner(0.)
107 , fHitPosErrX(0.0005)
108 , fHitPosErrY(0.0005)
110 , fBranchName(
"MvdHit")
111 , fDigisInCluster(-1)
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)
141 , fGausArrayLimit(5000)
149 , fFullClusterHisto(nullptr)
156 , fNeighThreshold(1.)
157 , fShowDebugHistos(kFALSE)
161 , fLayerRadiusInner(0.)
166 , fHitPosErrX(0.0005)
167 , fHitPosErrY(0.0005)
169 , fBranchName(
"MvdHit")
170 , fDigisInCluster(-1)
207 fHits =
new TClonesArray(
"CbmMvdHit", 100);
234 LOG(info) <<
"CbmMvdSensorFindHitTask::ReInt---------------";
257 vector<Int_t>* clusterArray =
new vector<Int_t>;
266 LOG(error) <<
"CbmMvdSensorFindHitTask - Fatal: No Digits found in this event.";
278 LOG(info) <<
"CbmMvdSensorFindHitTask: Calling method AddNoiseToDigis()..."
280 for (iDigi = 0; iDigi < nDigis; iDigi++)
295 TArrayS* pixelUsed =
new TArrayS(nDigis);
297 for (iDigi = 0; iDigi < nDigis; iDigi++) {
298 pixelUsed->AddAt(0, iDigi);
303 for (Int_t k = 0; k < nDigis; k++) {
308 LOG(fatal) <<
"RefID of this digi is -1 this should not happend ";
322 for (iDigi = 0; iDigi < nDigis; iDigi++) {
324 LOG_If(debug, iDigi % 10000 == 0) <<
GetName() <<
" Digi:" << iDigi;
340 LOG(debug) <<
"CbmMvdSensorFindHitTask: Checking for seed pixels...";
343 clusterArray->clear();
344 clusterArray->push_back(iDigi);
347 pixelUsed->AddAt(1, iDigi);
353 for (ULong64_t iCluster = 0; iCluster < clusterArray->size(); iCluster++) {
355 LOG(debug) <<
" CbmMvdSensorFindHitTask: Calling method CheckForNeighbours()...";
361 TVector3
pos(0, 0, 0);
362 TVector3
dpos(0, 0, 0);
364 LOG(debug) <<
" CbmMvdSensorFindHitTask: Calling method CreateHit()...";
388 clusterArray->clear();
407 Double_t charge = digi->
GetCharge() + noise;
479 pair<Int_t, Int_t> a(channelX, channelY);
483 a = std::make_pair(channelX + 1, channelY);
490 clusterArray->push_back(i);
492 pixelUsed->AddAt(1, i);
496 a = std::make_pair(channelX - 1, channelY);
503 clusterArray->push_back(i);
504 pixelUsed->AddAt(1, i);
508 a = std::make_pair(channelX, channelY - 1);
514 clusterArray->push_back(i);
515 pixelUsed->AddAt(1, i);
519 a = std::make_pair(channelX, channelY + 1);
526 clusterArray->push_back(i);
527 pixelUsed->AddAt(1, i);
540 Int_t clusterSize = clusterArray->size();
544 Int_t thisRefID = pixelInCluster->
GetRefId();
545 while (thisRefID < 0 && digiIndex < clusterSize) {
547 thisRefID = pixelInCluster->
GetRefId();
551 LOG(fatal) <<
"RefID of this digi is -1 this should not happend checked " << digiIndex <<
" digis in this Cluster";
558 Int_t indexX, indexY;
559 Double_t local[3] = {
pos.X(),
pos.Y(),
pos.Z()};
575 Int_t latestClusterIndex = -1;
576 Int_t digisInArray = 0;
579 Int_t nClusters = -1;
581 for (i = 0; i < clusterSize; i++) {
584 digisInArray = digisInArray + 1;
590 new ((*fClusters)[nClusters])
CbmMvdCluster(digiArray, digisInArray, clusterSize, latestClusterIndex);
592 latestCluster->SetNeighbourUp(nClusters);
594 latestCluster = clusterNew;
595 latestClusterIndex = nClusters;
600 if (digisInArray != 0) {
603 new ((*fClusters)[nClusters])
CbmMvdCluster(digiArray, digisInArray, clusterSize, latestClusterIndex);
604 clusterNew->SetNeighbourUp(-1);
606 latestCluster->SetNeighbourUp(nClusters);
612 Int_t nHits =
fHits->GetEntriesFast();
621 LOG(info) <<
"new hit with refID " << pixelInCluster->
GetRefId() <<
" to hit " << nHits;
646 Float_t xCentralTrack = 0.0;
647 Float_t yCentralTrack = 0.0;
648 Float_t clusterCharge = 0;
650 Int_t clusterSize = clusterArray->size();
654 chargeArray3D[k][j] = gRandom->Gaus(0,
fSigmaNoise);
658 for (Int_t k = 0; k < clusterSize; k++) {
661 clusterCharge = clusterCharge + digi->
GetCharge();
663 Int_t relativeX = digi->
GetPixelX() + seedPixelOffset - seedIndexX;
664 Int_t relativeY = digi->
GetPixelY() + seedPixelOffset - seedIndexY;
670 if (relativeX >= 0 && relativeX < fChargeArraySize && relativeY >= 0 && relativeY <
fChargeArraySize) {
671 chargeArray3D[relativeX][relativeY] = digi->
GetCharge();
674 if ((relativeX - seedPixelOffset == 0) && (relativeY - seedPixelOffset == 0)) {
691 Int_t qSeed = chargeArray3D[seedPixelOffset][seedPixelOffset];
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];
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];
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];
748 for (Int_t i = 0; i < 9; i++) {
749 qSort += chargeArray[orderArray[i]];
753 for (Int_t i = 9; i < 25; i++) {
754 qSort += chargeArray[orderArray[i]];
758 TH1F* histoTotalCharge;
761 qSort += chargeArray[orderArray[i]];
764 histoTotalCharge->Fill(qSort);
776 Double_t pixelSizeX = 0;
777 Double_t pixelSizeY = 0;
784 Double_t
lab[3] = {0, 0, 0};
786 Int_t clusterSize = clusterArray->size();
788 for (Int_t iCluster = 0; iCluster < clusterSize; iCluster++) {
799 LOG(debug) <<
"CbmMvdSensorFindHitTask:: iCluster= " << iCluster <<
" , clusterSize= " << clusterSize;
800 LOG(debug) <<
"CbmMvdSensorFindHitTask::xIndex " <<
xIndex <<
" , yIndex " <<
yIndex
814 Double_t xc =
x * charge;
815 Double_t yc =
y * charge;
823LOG(debug) <<
"CbmMvdSensorFindHitTask::=========================";
824LOG(debug) <<
"CbmMvdSensorFindHitTask::numeratorX: " <<
numeratorX <<
" , numeratorY: " <<
numeratorY
831 fHitPosZ = layerPosZ;
838LOG(debug) <<
"CbmMvdSensorFindHitTask::-----------------------------------";
839LOG(debug) <<
"CbmMvdSensorFindHitTask::X hit= " << fHitPosX <<
" Y hit= " << fHitPosY <<
" Z hit= " << fHitPosZ;
840LOG(debug) <<
"CbmMvdSensorFindHitTask::-----------------------------------";
843pos.SetXYZ(fHitPosX, fHitPosY, fHitPosZ);
844dpos.SetXYZ(fHitPosErrX, fHitPosErrY, fHitPosErrZ);
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;
862 LOG(info) <<
"ADC - Bits : " <<
fAdcBits;
863 LOG(info) <<
"ADC - Dynamic [electrons] : " <<
fAdcDynamic;
864 LOG(info) <<
"ADC - Offset [electrons] : " <<
fAdcOffset;
865 LOG(info) <<
"============================================================";
869 TH2F* clusterShapeHistogram;
872 TCanvas* canvas2 =
new TCanvas(
"HitFinderCharge",
"HitFinderCharge");
874 canvas2->Divide(2, 2);
884 Float_t charge = histo->GetMean();
895 clusterShapeHistogram->Draw(
"Lego2");
ClassImp(CbmConverterManager)
const constexpr Int_t fCounter(0)
void SetTimeError(double error)
void SetRefId(int32_t refId)
void SetTime(double time)
void SetCharge(float charge)
int32_t GetAdcCharge(int32_t adcDynamic, int32_t adcOffset, int32_t adcBits)
virtual ~CbmMvdSensorFindHitTask()
static const Short_t fChargeArraySize
void UpdateDebugHistos(std::vector< Int_t > *clusterArray, Int_t seedIndexX, Int_t seedIndexY)
TObjArray * fPixelChargeHistos
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)
CbmMvdSensorFindHitTask()
TObjArray * fTotalChargeInNpixelsArray
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
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
Int_t GetStationNr() const
void TopToPixel(Double_t *lab, Int_t &pixelNumberX, Int_t &pixelNumberY)
Data class with information on a STS local track.