14 #include <FairLogger.h>
15 #include <FairRootManager.h>
16 #include <FairRuntimeDb.h>
19 #include <TClonesArray.h>
33 : FairTask(
"ATTPC SEGA Digitizer"), fMCPointDataCA(nullptr), fSeGACryCalDataCA(
"AtSeGACrystalCalData", 5)
39 LOG(INFO) <<
"AtSeGADigitizer: Delete instance";
41 fSeGACryCalDataCA.Delete();
47 FairRuntimeDb *rtdb = FairRuntimeDb::instance();
49 LOG(ERROR) <<
"AtSeGADigitizer:: FairRuntimeDb not opened!";
53 void AtSeGADigitizer::SetParameter() {}
57 LOG(INFO) <<
"AtSeGADigitizer::Init ";
59 FairRootManager *rootManager = FairRootManager::Instance();
61 LOG(fatal) <<
"Init: No FairRootManager";
63 fMCPointDataCA =
dynamic_cast<TClonesArray *
>(rootManager->GetObject(
"AtMCPoint"));
64 if (!fMCPointDataCA) {
65 LOG(fatal) <<
"Init: No AtMCPoint CA";
69 rootManager->Register(
"SeGACrystalCalData",
"CALIFA Crystal Cal", &fSeGACryCalDataCA, kTRUE);
81 Int_t nHits = fMCPointDataCA->GetEntries();
85 std::vector<AtMCPoint *> pointData;
86 for (Int_t i = 0; i < nHits; i++)
87 pointData.push_back(
dynamic_cast<AtMCPoint *
>(fMCPointDataCA->At(i)));
93 for (Int_t i = 0; i < nHits; i++) {
94 fDetCopyID = pointData[i]->GetDetCopyID();
95 time = pointData[i]->GetTime();
96 energy = pointData[i]->GetEnergyLoss();
98 Int_t nCrystalCals = fSeGACryCalDataCA.GetEntriesFast();
99 Bool_t existHit =
false;
100 if (nCrystalCals == 0)
103 for (Int_t j = 0; j < nCrystalCals; j++) {
104 if ((
dynamic_cast<AtSeGACrystalCalData *
>(fSeGACryCalDataCA.At(j)))->GetDetCopyID() == fDetCopyID) {
105 (
dynamic_cast<AtSeGACrystalCalData *
>(fSeGACryCalDataCA.At(j)))->AddMoreEnergy(NUSmearing(energy));
119 Int_t nCrystalCals = fSeGACryCalDataCA.GetEntriesFast();
120 if (nCrystalCals == 0)
124 Int_t tempCryID, parThres;
129 for (Int_t i = 0; i < nCrystalCals; i++) {
134 if (temp < fThreshold) {
135 fSeGACryCalDataCA.RemoveAt(i);
136 fSeGACryCalDataCA.Compress();
142 if (isGe(tempCryID) && fResolutionGe > 0)
143 (
dynamic_cast<AtSeGACrystalCalData *
>(fSeGACryCalDataCA.At(i)))->SetEnergy(ExpResSmearingGe(temp));
157 FairRootManager::Instance()->Register(
"CrystalCal", GetName(), &fSeGACryCalDataCA, kTRUE);
163 LOG(DEBUG) <<
"Clearing SeGACrystalCalData Structure";
164 fSeGACryCalDataCA.Clear();
173 fThreshold = thresholdEne;
174 LOG(INFO) <<
"AtSeGADigitizer::SetDetectionThreshold to " << fThreshold <<
" GeV.";
179 TClonesArray &clref = fSeGACryCalDataCA;
180 Int_t size = clref.GetEntriesFast();
182 LOG(INFO) <<
"-I- AtSeGADigitizer: Adding CrystalCalData "
183 <<
" with unique identifier " << ident <<
" entering with " << energy * 1e06 <<
" keV "
191 fResolutionGe = crystalResGe;
193 LOG(INFO) <<
"AtSeGADigitizer::SetExpEnergyRes to " << fResolutionGe <<
"% @ 1 MeV for Ge";
196 Double_t AtSeGADigitizer::NUSmearing(Double_t inputEnergy)
201 return gRandom->Uniform(inputEnergy - inputEnergy * fNonUniformity / 100,
202 inputEnergy + inputEnergy * fNonUniformity / 100);
207 fNonUniformity = nonU;
208 LOG(INFO) <<
"AtSeGADigitizer::SetNonUniformity to " << fNonUniformity <<
" %";
211 Double_t AtSeGADigitizer::ExpResSmearingGe(Double_t inputEnergy)
223 if (fResolutionGe == 0)
227 Double_t randomIs = gRandom->Gaus(0, inputEnergy * fResolutionGe * 1000 / (235 * sqrt(inputEnergy * 1000)));
228 return inputEnergy + randomIs / 1000;
232 Bool_t AtSeGADigitizer::isGe(Int_t
id)
234 if (
id > 0 &&
id < 16)