ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtSeGADigitizer.cxx
Go to the documentation of this file.
1 /********************************************************************************
2  * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence version 3 (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 
9 #include "AtSeGADigitizer.h"
10 
11 #include "AtMCPoint.h" // for AtMCPoint
12 #include "AtSeGACrystalCalData.h" // for AtSeGACrystalCalData
13 
14 #include <FairLogger.h> // for Logger, LOG
15 #include <FairRootManager.h> // for FairRootManager
16 #include <FairRuntimeDb.h> // for FairRuntimeDb
17 #include <FairTask.h> // for FairTask, InitStatus, kFATAL, kSUC...
18 
19 #include <TClonesArray.h> // for TClonesArray
20 #include <TObject.h> // for TObject
21 #include <TRandom.h> // for TRandom, gRandom
22 
23 #include <algorithm> // for max
24 #include <cmath> // for sqrt
25 #include <iostream> // for cerr, cout, endl
26 #include <vector> // for allocator, vector
27 
28 using std::cerr;
29 using std::cout;
30 using std::endl;
33  : FairTask("ATTPC SEGA Digitizer"), fMCPointDataCA(nullptr), fSeGACryCalDataCA("AtSeGACrystalCalData", 5)
34 {
35 }
36 
38 {
39  LOG(INFO) << "AtSeGADigitizer: Delete instance";
40 
41  fSeGACryCalDataCA.Delete();
42 }
43 
45 {
46 
47  FairRuntimeDb *rtdb = FairRuntimeDb::instance();
48  if (!rtdb) {
49  LOG(ERROR) << "AtSeGADigitizer:: FairRuntimeDb not opened!";
50  }
51 }
52 
53 void AtSeGADigitizer::SetParameter() {}
54 
56 {
57  LOG(INFO) << "AtSeGADigitizer::Init ";
58 
59  FairRootManager *rootManager = FairRootManager::Instance();
60  if (!rootManager)
61  LOG(fatal) << "Init: No FairRootManager";
62 
63  fMCPointDataCA = dynamic_cast<TClonesArray *>(rootManager->GetObject("AtMCPoint")); // NOLINT
64  if (!fMCPointDataCA) {
65  LOG(fatal) << "Init: No AtMCPoint CA";
66  return kFATAL;
67  }
68 
69  rootManager->Register("SeGACrystalCalData", "CALIFA Crystal Cal", &fSeGACryCalDataCA, kTRUE);
70 
71  SetParameter();
72  return kSUCCESS;
73 }
74 
75 void AtSeGADigitizer::Exec(Option_t *option)
76 {
77  // Reset entries in output arrays, local arrays
78  Reset();
79 
80  // Reading the Input -- Point data --
81  Int_t nHits = fMCPointDataCA->GetEntries();
82  if (!nHits)
83  return;
84 
85  std::vector<AtMCPoint *> pointData;
86  for (Int_t i = 0; i < nHits; i++)
87  pointData.push_back(dynamic_cast<AtMCPoint *>(fMCPointDataCA->At(i)));
88 
89  Int_t fDetCopyID;
90  Double_t time;
91  Double_t energy;
92 
93  for (Int_t i = 0; i < nHits; i++) {
94  fDetCopyID = pointData[i]->GetDetCopyID();
95  time = pointData[i]->GetTime();
96  energy = pointData[i]->GetEnergyLoss();
97 
98  Int_t nCrystalCals = fSeGACryCalDataCA.GetEntriesFast();
99  Bool_t existHit = false;
100  if (nCrystalCals == 0)
101  AddCrystalCal(fDetCopyID, NUSmearing(energy), time);
102  else {
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));
106  if ((dynamic_cast<AtSeGACrystalCalData *>(fSeGACryCalDataCA.At(j)))->GetTime() > time) {
107  (dynamic_cast<AtSeGACrystalCalData *>(fSeGACryCalDataCA.At(j)))->SetTime(time);
108  }
109  existHit = true; // to avoid the creation of a new CrystalHit
110 
111  break;
112  }
113  }
114  if (!existHit)
115  AddCrystalCal(fDetCopyID, NUSmearing(energy), time);
116  }
117  }
118 
119  Int_t nCrystalCals = fSeGACryCalDataCA.GetEntriesFast();
120  if (nCrystalCals == 0)
121  return;
122 
123  Double_t temp = 0;
124  Int_t tempCryID, parThres;
125  Bool_t inUse;
126  Int_t tempIndex;
127  Float_t parReso;
128 
129  for (Int_t i = 0; i < nCrystalCals; i++) {
130 
131  tempCryID = (dynamic_cast<AtSeGACrystalCalData *>(fSeGACryCalDataCA.At(i)))->GetDetCopyID();
132 
133  temp = (dynamic_cast<AtSeGACrystalCalData *>(fSeGACryCalDataCA.At(i)))->GetEnergy();
134  if (temp < fThreshold) {
135  fSeGACryCalDataCA.RemoveAt(i);
136  fSeGACryCalDataCA.Compress();
137  nCrystalCals--; // remove from CalData those below threshold
138  i--;
139  continue;
140  }
141 
142  if (isGe(tempCryID) && fResolutionGe > 0)
143  (dynamic_cast<AtSeGACrystalCalData *>(fSeGACryCalDataCA.At(i)))->SetEnergy(ExpResSmearingGe(temp));
144  }
145 }
146 
147 // ----- Public method EndOfEvent -----------------------------------------
149 {
150  // fMCPointDataCA->Clear();
151  // fSeGACryCalDataCA.Clear();
152  ResetParameters();
153 }
154 
156 {
157  FairRootManager::Instance()->Register("CrystalCal", GetName(), &fSeGACryCalDataCA, kTRUE);
158 }
159 
161 {
162  // Clear the CA structure
163  LOG(DEBUG) << "Clearing SeGACrystalCalData Structure";
164  fSeGACryCalDataCA.Clear();
165 
166  ResetParameters();
167 }
168 
170 
171 void AtSeGADigitizer::SetDetectionThreshold(Double_t thresholdEne)
172 {
173  fThreshold = thresholdEne;
174  LOG(INFO) << "AtSeGADigitizer::SetDetectionThreshold to " << fThreshold << " GeV.";
175 }
176 
177 AtSeGACrystalCalData *AtSeGADigitizer::AddCrystalCal(Int_t ident, Double_t energy, ULong64_t time)
178 {
179  TClonesArray &clref = fSeGACryCalDataCA;
180  Int_t size = clref.GetEntriesFast();
181  if (fVerbose > 1)
182  LOG(INFO) << "-I- AtSeGADigitizer: Adding CrystalCalData "
183  << " with unique identifier " << ident << " entering with " << energy * 1e06 << " keV "
184  << " Time=" << time;
185 
186  return new (clref[size]) AtSeGACrystalCalData(ident, energy, time); // NOLINT
187 }
188 
189 void AtSeGADigitizer::SetExpEnergyRes(Double_t crystalResGe)
190 {
191  fResolutionGe = crystalResGe;
192 
193  LOG(INFO) << "AtSeGADigitizer::SetExpEnergyRes to " << fResolutionGe << "% @ 1 MeV for Ge";
194 }
195 
196 Double_t AtSeGADigitizer::NUSmearing(Double_t inputEnergy)
197 {
198  // Very simple preliminary scheme where the NU is introduced as a flat random
199  // distribution with limits fNonUniformity (%) of the energy value.
200  //
201  return gRandom->Uniform(inputEnergy - inputEnergy * fNonUniformity / 100,
202  inputEnergy + inputEnergy * fNonUniformity / 100);
203 }
204 
206 {
207  fNonUniformity = nonU;
208  LOG(INFO) << "AtSeGADigitizer::SetNonUniformity to " << fNonUniformity << " %";
209 }
210 
211 Double_t AtSeGADigitizer::ExpResSmearingGe(Double_t inputEnergy)
212 {
213  // Smears the energy according to some Experimental Resolution distribution
214  // Very simple scheme where the Experimental Resolution
215  // is introduced as a gaus random distribution with a width given by the
216  // parameter fResolution(in % @ MeV). Scales according to 1/sqrt(E)
217  //
218  // The formula is TF1("name","0.058*x/sqrt(x)",0,10) for 3% at 1MeV (3.687 @
219  // 662keV)
220  // ( % * energy ) / sqrt( energy )
221  // and then the % is given at 1 MeV!!
222  //
223  if (fResolutionGe == 0)
224  return inputEnergy;
225  else {
226  // Energy in MeV, that is the reason for the factor 1000...
227  Double_t randomIs = gRandom->Gaus(0, inputEnergy * fResolutionGe * 1000 / (235 * sqrt(inputEnergy * 1000)));
228  return inputEnergy + randomIs / 1000;
229  }
230 }
231 
232 Bool_t AtSeGADigitizer::isGe(Int_t id)
233 {
234  if (id > 0 && id < 16)
235  return kTRUE;
236  else
237  return kFALSE;
238 }
AtSeGADigitizer::SetParContainers
virtual void SetParContainers()
Definition: AtSeGADigitizer.cxx:44
AtSeGADigitizer::Exec
virtual void Exec(Option_t *opt)
Definition: AtSeGADigitizer.cxx:75
AtSeGADigitizer::Reset
virtual void Reset()
Definition: AtSeGADigitizer.cxx:160
AtSeGADigitizer::FinishEvent
virtual void FinishEvent()
Definition: AtSeGADigitizer.cxx:169
AtSeGADigitizer::Init
virtual InitStatus Init()
Definition: AtSeGADigitizer.cxx:55
AtSeGADigitizer::AddCrystalCal
AtSeGACrystalCalData * AddCrystalCal(Int_t ident, Double_t energy, ULong64_t time)
Definition: AtSeGADigitizer.cxx:177
AtSeGADigitizer::EndOfEvent
virtual void EndOfEvent()
Definition: AtSeGADigitizer.cxx:148
AtSeGACrystalCalData
Definition: AtSeGACrystalCalData.h:20
AtSeGADigitizer::SetExpEnergyRes
void SetExpEnergyRes(Double_t crystalResGe)
Definition: AtSeGADigitizer.cxx:189
AtSeGADigitizer::Register
virtual void Register()
Definition: AtSeGADigitizer.cxx:155
AtSeGADigitizer::~AtSeGADigitizer
~AtSeGADigitizer()
Definition: AtSeGADigitizer.cxx:37
AtSeGADigitizer.h
AtMCPoint.h
AtSeGACrystalCalData.h
AtSeGADigitizer::ResetParameters
void ResetParameters()
Definition: AtSeGADigitizer.h:88
ClassImp
ClassImp(AtSeGACrystalCalData)
AtSeGADigitizer::SetDetectionThreshold
void SetDetectionThreshold(Double_t thresholdEne)
Definition: AtSeGADigitizer.cxx:171
AtSeGADigitizer::SetNonUniformity
void SetNonUniformity(Double_t nonU)
Definition: AtSeGADigitizer.cxx:205
AtSeGADigitizer::AtSeGADigitizer
AtSeGADigitizer()
Definition: AtSeGADigitizer.cxx:32
AtMCPoint
Definition: AtMCPoint.h:26