SiPM.cc
Go to the documentation of this file.
1 #include <mdet/SiPM.h>
2 
3 #include <mdet/MHierarchyInfo.h>
4 //
5 #include <utl/RandomEngine.h>
6 #include <utl/MathConstants.h>
7 //
8 #include <fwk/RandomEngineRegistry.h>
9 //
10 #include <cmath>
11 #include <CLHEP/Random/RandGauss.h>
12 //
13 //#include <CLHEP/RandomObjects/RandMultiGauss.h>
14 using CLHEP::RandGauss;
15 
16 namespace mdet {
17 
18  const char* const
20 
21  const char* const
23 
24 
26  (int pId, const det::VManager::IndexMap& parentMap, const SiPMArray& parent) :
27  MDetectorComponent<SiPM>::Type(pId, parentMap),
28  fSiPMArray(parent)
29  {
30  Register(fPulseAmplitude1Mean);
31  Register(fPulseAmplitude1StdDev);
32  Register(fPulseAmplitude2Mean);
33  Register(fPulseAmplitude2StdDev);
34  Register(fPulseAmplitude3Mean);
35  Register(fPulseAmplitude3StdDev);
36  Register(fPulseTime1Mean);
37  Register(fPulseTime1StdDev);
38  Register(fPulseTime2Mean);
39  Register(fPulseTime2StdDev);
40  Register(fPulseTime3Mean);
41  Register(fPulseTime3StdDev);
42  Register(fPulseTime4Mean);
43  Register(fPulseTime4StdDev);
44  Register(fPulseRelevantWidth);
45  }
46 
47 
48  const IdsContainer&
50  const
51  {
52  // see the other getters.
53  return GetData<IdsContainer,utl::ThrowOnZeroDereference,utl::ShadowPtr>(fChannelSiPMScintillatorFiberIds, "channelScintillatorFiberIds");
54  }
55 
56 
57  double
59  const
60  {
61  return GetData(fPulseAmplitude1Mean, "pulseAmplitude1Mean");
62  }
63 
64  double
66  const
67  {
68  return GetData(fPulseAmplitude1StdDev, "pulseAmplitude1StdDev");
69  }
70 
71  double
73  const
74  {
75  return GetData(fPulseAmplitude2Mean, "pulseAmplitude2Mean");
76  }
77 
78  double
80  const
81  {
82  return GetData(fPulseAmplitude2StdDev, "pulseAmplitude2StdDev");
83  }
84 
85  double
87  const
88  {
89  return GetData(fPulseAmplitude3Mean, "pulseAmplitude3Mean");
90  }
91 
92  double
94  const
95  {
96  return GetData(fPulseAmplitude3StdDev, "pulseAmplitude3StdDev");
97  }
98 
99  double
101  const
102  {
103  return GetData(fPulseTime1Mean, "pulseTime1Mean");
104  }
105 
106  double
108  const
109  {
110  return GetData(fPulseTime1StdDev, "pulseTime1StdDev");
111  }
112 
113  double
115  const
116  {
117  return GetData(fPulseTime2Mean, "pulseTime2Mean");
118  }
119 
120  double
122  const
123  {
124  return GetData(fPulseTime2StdDev, "pulseTime2StdDev");
125  }
126 
127  double
129  const
130  {
131  return GetData(fPulseTime3Mean, "pulseTime3Mean");
132  }
133 
134  double
136  const
137  {
138  return GetData(fPulseTime3StdDev, "pulseTime3StdDev");
139  }
140 
141  double
143  const
144  {
145  return GetData(fPulseTime4Mean, "pulseTime4Mean");
146  }
147 
148  double
150  const
151  {
152  return GetData(fPulseTime4StdDev, "pulseTime4StdDev");
153  }
154 
155  double
157  const
158  {
159  return GetData(fPulseRelevantWidth, "pulseRelevantWidth");
160  }
161 
162 
163  /*If correlation between parameters wants to be considered, it is necessary to load the parameters in PC space,
164  * sort the values and the anti transform to the parameters space
165  * (only the eigen vector of the covariance matrix are needed). Not rocket science, but a waste of resources,
166  * as it has been shown, considering the correlations or not, give the same description of data.
167  * */
168  SiPM::PE
169  SiPM::MakePEAt(double t)
170  const
171  {
172  utl::RandomEngine& rnd = fwk::RandomEngineRegistry::GetInstance().Get(fwk::RandomEngineRegistry::eDetector);
173 
174  double *parameterMeans = new double[7];
175  double *parameterSigmas = new double[7];
176 
177  parameterMeans[0] = GetPulseAmplitude1Mean(); //A1
178  parameterSigmas[0] = GetPulseAmplitude1StdDev();
179  parameterMeans[1] = GetPulseTime1Mean();// t1
180  parameterSigmas[1] = GetPulseTime1StdDev();
181  parameterMeans[2] = GetPulseAmplitude2Mean(); //A2
182  parameterSigmas[2] = GetPulseAmplitude2StdDev();
183  parameterMeans[3] = GetPulseTime2Mean();//t2
184  parameterSigmas[3] = GetPulseTime2StdDev();
185  parameterMeans[4] = GetPulseAmplitude3Mean(); //A3
186  parameterSigmas[4] = GetPulseAmplitude3StdDev();
187  parameterMeans[5] = GetPulseTime3Mean();//t3
188  parameterSigmas[5] = GetPulseTime3StdDev();
189  parameterMeans[6] = GetPulseTime4Mean();//t4
190  parameterSigmas[6] = GetPulseTime4StdDev();
191 
192  double *parameters = new double[7];
193  for (int i = 0; i < 7; i++){
194  if(parameterSigmas[i]!=0.0){
195  parameters[i] = CLHEP::RandGauss::shoot(& rnd.GetEngine(), parameterMeans[i], parameterSigmas[i]);
196  }else{
197  parameters[i] = parameterMeans[i];
198  }
199  }
200 
201  // P2X(principalComponents, parameters, 5); //get correlated parameters
202 
203 
204  return PE(*this, parameters[0], parameters[2], parameters[4], parameters[1], parameters[3], parameters[5], parameters[6], t);
205  }
206 
207  void
208  SiPM::Update(bool invalidateData, bool invalidateComponents)
209  {
210  MDetectorComponent<SiPM>::Type::Update(invalidateData, invalidateComponents);
211  }
212 
213 }
static const char *const kComponentName
Definition: SiPM.h:43
utl::Validated< double > fPulseAmplitude1Mean
Definition: SiPM.h:344
utl::Validated< double > fPulseTime4Mean
Definition: SiPM.h:368
utl::Validated< double > fPulseTime1StdDev
Definition: SiPM.h:358
utl::Validated< double > fPulseTime2Mean
Definition: SiPM.h:360
RandomEngineType & GetEngine()
Definition: RandomEngine.h:32
double GetPulseAmplitude2StdDev() const
Standard deviation of amplitude 2 in PE pulses in Parameter space.
Definition: SiPM.cc:79
static const char *const kComponentsNames[13]
det::DetectorComponent< C, MManagerProvider > Type
Type specializing det::DetectorComponent for Muon hierarchy.
double GetPulseRelevantWidth() const
Pulse relevant time width.
Definition: SiPM.cc:156
utl::Validated< double > fPulseTime3Mean
Definition: SiPM.h:364
void Update(std::vector< double > &init, const std::vector< double > &res)
Definition: Util.h:100
static const char *const kComponentsIds[13]
PE pulse.
Definition: SiPM.h:74
double GetPulseTime1Mean() const
Mean time 1 of PE pulses in Parameter space.
Definition: SiPM.cc:100
utl::Validated< double > fPulseAmplitude2StdDev
Definition: SiPM.h:350
utl::ShadowPtr< IdsContainer > fChannelSiPMScintillatorFiberIds
Container for indices of corresponding Channel, Scintillator, Fiber.
Definition: SiPM.h:342
const IdsContainer & GetChannelSiPMScintillatorFiberIds() const
Indices for Channel, Scintillator, Fiber of corrresponding Pixel.
Definition: SiPM.cc:49
T & GetData(P< T > &d, const std::string &p) const
Common utility function for configuration.
SiPM(int pId, const det::VManager::IndexMap &parentMap, const SiPMArray &parent)
Constructs the SiPM.
Definition: SiPM.cc:26
double GetPulseAmplitude2Mean() const
Mean amplitude 2 of PE pulses in Parameter space.
Definition: SiPM.cc:72
64 SiPM Array
Definition: SiPMArray.h:36
utl::Validated< double > fPulseAmplitude3StdDev
Definition: SiPM.h:354
Wraps the random number engine used to generate distributions.
Definition: RandomEngine.h:27
utl::Validated< double > fPulseTime2StdDev
Definition: SiPM.h:362
double GetPulseTime4Mean() const
Mean time 4 of PE pulses in Parameter space.
Definition: SiPM.cc:142
double GetPulseTime3Mean() const
Mean time 3 of PE pulses in Parameter space.
Definition: SiPM.cc:128
std::vector< int > IdsContainer
Typedef for container of corresponding Channel, Scintillator, Fiber indices.
utl::Validated< double > fPulseRelevantWidth
Definition: SiPM.h:372
utl::Validated< double > fPulseAmplitude3Mean
Definition: SiPM.h:352
double GetPulseAmplitude1StdDev() const
Standard deviation of amplitude 1 in PE pulses in Parameter space.
Definition: SiPM.cc:65
double GetPulseAmplitude1Mean() const
Mean amplitude 1 of PE pulses in Parameter space.
Definition: SiPM.cc:58
utl::Validated< double > fPulseAmplitude1StdDev
Definition: SiPM.h:346
double GetPulseTime2Mean() const
Mean time 2 of PE pulses in Parameter space.
Definition: SiPM.cc:114
double GetPulseTime4StdDev() const
Standard deviation of time 4 in PE pulses in Parameter space.
Definition: SiPM.cc:149
double GetPulseTime3StdDev() const
Standard deviation of time 3 in PE pulses in Parameter space.
Definition: SiPM.cc:135
utl::Validated< double > fPulseTime4StdDev
Definition: SiPM.h:370
std::map< std::string, std::string > IndexMap
Definition: VManager.h:133
utl::Validated< double > fPulseTime3StdDev
Definition: SiPM.h:366
static const char *const kComponentId
Definition: SiPM.h:45
PE MakePEAt(double t) const
Constructs an PE according to this SiPM characteristics.
Definition: SiPM.cc:169
double GetPulseTime2StdDev() const
Standard deviation of time 2 in PE pulses in Parameter space.
Definition: SiPM.cc:121
utl::Validated< double > fPulseTime1Mean
Definition: SiPM.h:356
utl::Validated< double > fPulseAmplitude2Mean
Definition: SiPM.h:348
double GetPulseAmplitude3Mean() const
Mean amplitude 3 of PE pulses in Parameter space.
Definition: SiPM.cc:86
double GetPulseAmplitude3StdDev() const
Standard deviation of amplitude 3 in PE pulses in Parameter space.
Definition: SiPM.cc:93
double GetPulseTime1StdDev() const
Standard deviation of time 1 in PE pulses in Parameter space.
Definition: SiPM.cc:107
void Update(bool invalidateData, bool invalidateComponents)
Definition: SiPM.cc:208

, generated on Tue Sep 26 2023.