Project
Loading...
Searching...
No Matches
ModelGEM.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#include <cmath>
17
18#include "TPCBase/ModelGEM.h"
19
20using namespace o2::tpc;
21
22ModelGEM::ModelGEM() : // We allow a scaling factor of the gain curves for tuning (by default this factor is set to 1.0)
23 mAbsGainScaling(1.0),
24
25 // By default we do not assume any attachment (in units 1/cm)
26 mAttachment(0.0),
27
28 // Has the stack energy resolution already been calculated?
29 mStackEnergyCalculated(0),
30
31 // Definition of GEM geometry
32 mFitElecEffPitch{{140.0f, 200.0f, 280.0f}},
33 mFitElecEffWidth{{2.0f * mFitElecEffPitch[0] - mFitElecEffHoleDiameter, 2.0f * mFitElecEffPitch[1] - mFitElecEffHoleDiameter, 2.0f * mFitElecEffPitch[2] - mFitElecEffHoleDiameter}},
34
35 // Tuning parameters for GEM efficiency calculations (direct fit results)
36 mFitElecEffTuneEta1{{6.78972f, 11.5214f, 18.788f}},
37 mFitElecEffTuneEta2{{6.88737f, 8.98337f, 9.90459f}},
38 mFitElecEffTuneDiffusion{{1.30061f, 1.30285f, 1.30125f}},
39
40 // Absolute gain curves (multiplication)
41 mFitAbsGainConstant{{-1.91668f, -1.95479f, -1.98842f}},
42 mFitAbsGainSlope{{0.0183423f, 0.0185194f, 0.0186415f}},
43
44 // Single gain fluctuation curves
45 mFitSingleGainF0{{0.541429f, 0.549837f, 0.554301f}},
46 mFitSingleGainU0{{230.0f, 230.0f, 230.0f}},
47 mFitSingleGainQ{{0.03f, 0.03f, 0.03f}}
48{
49
50 //Calculate constant GEM parameters (0 standard, 1 medium, 2 large)
51 for (int i = 0; i <= 2; ++i) {
52 mParamC1[i] = getParameterC1(i);
53 mParamC2[i] = getParameterC2(i);
54 mParamC3[i] = getParameterC3(i);
55 mParamC4[i] = getParameterC4(i);
56 mParamC5[i] = getParameterC5(i);
57 mParamC6[i] = getParameterC6();
58 }
59}
60
61float ModelGEM::getElectronCollectionEfficiency(float elecFieldAbove, float gemPotential, int geom)
62{
63 // Fit model: CollTop 6.0 (fitted in a range of 0.0 <= ElecFieldRatioAbove <= 0.16)
64 float ElecFieldGEM = (0.001 * gemPotential) / (0.0001 * mFitElecEffThickness); //in kV/cm
65 float ElecFieldRatioAbove = elecFieldAbove / ElecFieldGEM;
66
67 float eta1 = mFitElecEffTuneEta1[geom] * ElecFieldRatioAbove;
68 float eta2 = mFitElecEffFieldBelow / mFitElecEffFieldGEM;
69
70 float paramC7Bar = getParameterC7Bar(eta1, eta2, geom);
71 float paramC8Bar = getParameterC8Bar(eta1, eta2, geom);
72 float paramC9Bar = getParameterC9Bar(eta1, eta2, geom);
73
74 return 2.0 * Pi * (paramC7Bar + paramC9Bar * eta1 + paramC8Bar * eta2) /
75 (mParamC1[geom] + mParamC3[geom] * eta1 + mParamC2[geom] * eta2);
76}
77
78float ModelGEM::getElectronExtractionEfficiency(float elecFieldBelow, float gemPotential, int geom)
79{
80 // Fit model: ExtrBot 6.1 (fitted in a range of 0.0 <= ElecFieldRatioBelow <= 0.16)
81 float ElecFieldGEM = (0.001 * gemPotential) / (0.0001 * mFitElecEffThickness); //in kV/cm
82 float ElecFieldRatioBelow = elecFieldBelow / ElecFieldGEM;
83
84 float eta1 = mFitElecEffFieldAbove / mFitElecEffFieldGEM;
85 float eta2 = mFitElecEffTuneEta2[geom] * ElecFieldRatioBelow;
86
87 float paramC7 = getParameterC7(eta1, eta2, geom);
88 float paramC8 = getParameterC8(eta1, eta2, geom);
89 float paramC9 = getParameterC9(eta1, eta2, geom);
90
91 return 2.0 * Pi * (paramC7 + paramC8 * eta1 + paramC9 * eta2) /
92 (std::pow(mFitElecEffTuneDiffusion[geom], 3.5) * mParamC4[geom] + mParamC5[geom] * eta1 + 1.0 / mFitElecEffTuneDiffusion[geom] * mParamC6[geom] * eta2);
93}
94
95float ModelGEM::getAbsoluteGain(float gemPotential, int geom)
96{
97 //We assume exponential curves (fitted in a range of 200V <= gemPotential <= 400V)
98 return mAbsGainScaling * std::exp(mFitAbsGainConstant[geom] + mFitAbsGainSlope[geom] * gemPotential);
99}
100
101float ModelGEM::getSingleGainFluctuation(float gemPotential, int geom)
102{
103 return mFitSingleGainF0[geom] + std::exp(-(gemPotential - mFitSingleGainU0[geom]) * mFitSingleGainQ[geom]);
104}
105
106void ModelGEM::setStackProperties(const std::array<int, 4>& geometry, const std::array<float, 5>& distance, const std::array<float, 4>& potential, const std::array<float, 5>& electricField)
107{
108 mGeometry = geometry;
109 mDistance = distance;
110 mPotential = potential;
111 mElectricField = electricField;
112}
113
115{
116 float PrimaryCharges = PhotonEnergy / Wi;
117
118 // Number of electrons which are collected at each GEM stage
119 std::array<float, 4> NumElectrons;
120
121 const int NumOfGEMs = NumElectrons.size();
122
123 for (int n = 0; n < NumElectrons.size(); ++n) {
124 float Attachment = 1.0 - mAttachment * mDistance[n]; //1.0 - 1/cm * cm => unitless
125
126 if (n == 0) {
127 NumElectrons[n] = PrimaryCharges * getElectronCollectionEfficiency(mElectricField[n], mPotential[n], mGeometry[n]) * Attachment;
128
129 } else {
130 NumElectrons[n] = NumElectrons[n - 1] * getAbsoluteGain(mPotential[n - 1], mGeometry[n - 1]) * getElectronExtractionEfficiency(mElectricField[n], mPotential[n - 1], mGeometry[n - 1]) * getElectronCollectionEfficiency(mElectricField[n], mPotential[n], mGeometry[n]) * Attachment;
131 }
132 }
133
134 // Number of charges after extraction from last amplification stage
135 float Attachment = 1.0 - mAttachment * mDistance[NumOfGEMs];
136 NumElectrons[NumOfGEMs] = NumElectrons[NumOfGEMs - 1] * getAbsoluteGain(mPotential[NumOfGEMs - 1], mGeometry[NumOfGEMs - 1]) * getElectronExtractionEfficiency(mElectricField[NumOfGEMs], mPotential[NumOfGEMs - 1], mGeometry[NumOfGEMs - 1]) * Attachment;
137
138 float SigmaOverMuSquare = 0.0;
139
140 for (int n = 0; n <= NumOfGEMs - 1; ++n) {
141 float SingleGainFluctuation = getSingleGainFluctuation(mPotential[n], mGeometry[n]);
142
143 if (n == 0) {
144 SigmaOverMuSquare += (Fano + SingleGainFluctuation) / NumElectrons[n];
145 } else {
146 SigmaOverMuSquare += SingleGainFluctuation / NumElectrons[n];
147 }
148 }
149
150 mStackEnergyCalculated = 1;
151 mStackEffectiveGain = NumElectrons[NumOfGEMs] / PrimaryCharges;
152
153 return std::sqrt(SigmaOverMuSquare);
154}
155
157{
158 if (!mStackEnergyCalculated) {
160 }
161
162 return mStackEffectiveGain;
163}
164
165float ModelGEM::getParameterC1(int geom)
166{
167 return -getLambdaCathode(geom);
168}
169
170float ModelGEM::getParameterC2(int geom)
171{
172 return -getMu2Cathode(geom);
173}
174
175float ModelGEM::getParameterC3(int geom)
176{
177 return -getMu1Cathode(geom);
178}
179
180float ModelGEM::getParameterC4(int geom)
181{
182 return (getMu2Top(-mFitElecEffHoleDiameter / 2.0, mFitElecEffHoleDiameter / 2.0, geom) + Pi * mFitElecEffHoleDiameter);
183}
184
185float ModelGEM::getParameterC5(int geom)
186{
187 return -getMu2Top(-mFitElecEffHoleDiameter / 2.0, mFitElecEffHoleDiameter / 2.0, geom);
188}
189
190float ModelGEM::getParameterC6()
191{
192 return Pi * mFitElecEffHoleDiameter;
193}
194
195float ModelGEM::getParameterC7(float eta1, float eta2, int geom)
196{
197 float intXStart = -(mFitElecEffWidth[geom] + mFitElecEffHoleDiameter) / 4.0;
198 float intXEnd = getIntXEndBot(eta1, eta2, geom);
199
200 // Flip g1 <-> g2 for calculation since c7bar(g1->g2) = c7
201 flipDistanceNextPrevStage();
202 float result = getParameterC7BarFromX(intXStart, intXEnd, geom);
203 // Flip back g1<->g2 to initial condition
204 flipDistanceNextPrevStage();
205
206 return result;
207}
208
209float ModelGEM::getParameterC8(float eta1, float eta2, int geom)
210{
211 float intXStart = -(mFitElecEffWidth[geom] + mFitElecEffHoleDiameter) / 4.0;
212 float intXEnd = getIntXEndBot(eta1, eta2, geom);
213
214 flipDistanceNextPrevStage();
215 float result = getParameterC8BarFromX(intXStart, intXEnd, geom);
216 flipDistanceNextPrevStage();
217
218 return result;
219}
220
221float ModelGEM::getParameterC9(float eta1, float eta2, int geom)
222{
223 float intXStart = -(mFitElecEffWidth[geom] + mFitElecEffHoleDiameter) / 4.0;
224 float intXEnd = getIntXEndBot(eta1, eta2, geom);
225
226 flipDistanceNextPrevStage();
227 float result = getParameterC9BarFromX(intXStart, intXEnd, geom);
228 flipDistanceNextPrevStage();
229
230 return result;
231}
232
233float ModelGEM::getParameterC7Bar(float eta1, float eta2, int geom)
234{
235 float intXStart = -(mFitElecEffWidth[geom] + mFitElecEffHoleDiameter) / 4.0;
236 float intXEnd = getIntXEndTop(eta1, eta2, geom);
237
238 return getParameterC7BarFromX(intXStart, intXEnd, geom);
239}
240
241float ModelGEM::getParameterC8Bar(float eta1, float eta2, int geom)
242{
243 float intXStart = -(mFitElecEffWidth[geom] + mFitElecEffHoleDiameter) / 4.0;
244 float intXEnd = getIntXEndTop(eta1, eta2, geom);
245
246 return getParameterC8BarFromX(intXStart, intXEnd, geom);
247}
248
249float ModelGEM::getParameterC9Bar(float eta1, float eta2, int geom)
250{
251 float intXStart = -(mFitElecEffWidth[geom] + mFitElecEffHoleDiameter) / 4.0;
252 float intXEnd = getIntXEndTop(eta1, eta2, geom);
253
254 return getParameterC9BarFromX(intXStart, intXEnd, geom);
255}
256
257float ModelGEM::getParameterC7BarFromX(float intXStart, float intXEnd, int geom)
258{
259 return (-1.0 / (2.0 * Pi)) * (getLambdaCathode(geom) + 2.0 * getMu2Top(intXStart, intXEnd, geom));
260}
261
262float ModelGEM::getParameterC8BarFromX(float intXStart, float intXEnd, int geom)
263{
264 return (-1.0 / (2.0 * Pi)) * (getMu2Cathode(geom) - 2.0 * getMu2Top(intXStart, intXEnd, geom));
265}
266
267float ModelGEM::getParameterC9BarFromX(float intXStart, float intXEnd, int geom)
268{
269 return (-1.0 / (2.0 * Pi)) * (getMu1Cathode(geom) + 4.0 * Pi * (intXEnd - intXStart));
270}
271
272void ModelGEM::flipDistanceNextPrevStage()
273{
274 float mFitElecEffDistancePrevStageOld = mFitElecEffDistancePrevStage;
275 mFitElecEffDistancePrevStage = mFitElecEffDistanceNextStage;
276 mFitElecEffDistanceNextStage = mFitElecEffDistancePrevStageOld;
277}
278
279float ModelGEM::getIntXEndBot(float eta1, float eta2, int geom)
280{
281 float result;
282
283 if (eta2 <= getEta2Kink1(eta1, geom)) {
284 result = -(mFitElecEffHoleDiameter + mFitElecEffWidth[geom]) / 4.0;
285 } else if (getEta2Kink1(eta1, geom) < eta2 && eta2 < getEta2Kink2(eta1, geom)) {
286 result = -mFitElecEffPitch[geom] / 2.0 + sqrt(getHtop2(geom) * (eta1 - 1.0) * (2.0 * Pi * eta2 + getHtop0(geom) * (1.0 - eta1))) /
287 (getHtop2(geom) * (eta1 - 1.0));
288 } else {
289 result = -mFitElecEffHoleDiameter / 2.0;
290 }
291
292 return result;
293}
294
295float ModelGEM::getIntXEndTop(float eta1, float eta2, int geom)
296{
297 float result;
298
299 if (eta1 <= getEta1Kink1(eta2, geom)) {
300 result = -(mFitElecEffHoleDiameter + mFitElecEffWidth[geom]) / 4.0;
301 } else if (getEta1Kink1(eta2, geom) < eta1 && eta1 < getEta1Kink2(eta2, geom)) {
302 result = -mFitElecEffPitch[geom] / 2.0 + sqrt(getHtop2(geom) * (eta2 - 1.0) * (2.0 * Pi * eta1 + getHtop0(geom) * (1.0 - eta2))) /
303 (getHtop2(geom) * (eta2 - 1.0));
304 } else {
305 result = -mFitElecEffHoleDiameter / 2.0;
306 }
307
308 return result;
309}
310
311float ModelGEM::getEta1Kink2(float eta2, int geom)
312{
313 return 1.0 / (2.0 * Pi) *
314 ((mFitElecEffHoleDiameter - mFitElecEffPitch[geom]) * (mFitElecEffHoleDiameter - mFitElecEffPitch[geom]) / 4.0 * getHtop2(geom) +
315 getHtop0(geom)) *
316 (eta2 - 1.0);
317}
318
319float ModelGEM::getEta1Kink1(float eta2, int geom)
320{
321 return -1.0 / (2.0 * Pi) * getHtop0(geom) * (1.0 - eta2);
322}
323
324float ModelGEM::getEta2Kink2(float eta1, int geom)
325{
326 return 1.0 / (2.0 * Pi) *
327 ((mFitElecEffHoleDiameter - mFitElecEffPitch[geom]) * (mFitElecEffHoleDiameter - mFitElecEffPitch[geom]) / 4.0 * getHtop2(geom) +
328 getHtop0(geom)) *
329 (eta1 - 1.0);
330}
331
332float ModelGEM::getEta2Kink1(float eta1, int geom)
333{
334 return -1.0 / (2.0 * Pi) * getHtop0(geom) * (1.0 - eta1);
335}
336
337float ModelGEM::getHtop0(int geom)
338{
339 float result = 0.0;
340
341 for (int n = 2; n <= mFitElecEffNumberHoles; ++n) {
342 result += getMu2TopFTaylorTerm0(n, geom);
343 }
344
345 result += getMu2TopfTaylorTerm0(geom);
346
347 return result;
348}
349
350float ModelGEM::getHtop2(int geom)
351{
352 float result = 0.0;
353
354 for (int n = 2; n <= mFitElecEffNumberHoles; ++n) {
355 result += getMu2TopFTaylorTerm2(n, geom);
356 }
357
358 result += getMu2TopfTaylorTerm2(geom);
359
360 return result;
361}
362
363float ModelGEM::getMu2TopfTaylorTerm2(int geom)
364{
365 float d = mFitElecEffThickness;
366 float L = mFitElecEffHoleDiameter;
367 float w = mFitElecEffWidth[geom];
368
369 return (12 * L + 4 * w) / d / ((9 * std::pow(L, 2)) + (6 * L * w) + 0.16e2 * std::pow(d, 0.2e1) + std::pow(w, 2)) /
370 (std::pow(0.3e1 / 0.2e1 * L + w / 0.2e1, 0.2e1) * std::pow(d, -0.2e1) / 0.4e1 + 0.1e1) +
371 (4 * L - 4 * w) / d / (std::pow(L, 2) - (2 * L * w) + 0.16e2 * std::pow(d, 0.2e1) + std::pow(w, 2)) /
372 (std::pow(L / 0.2e1 - w / 0.2e1, 0.2e1) * std::pow(d, -0.2e1) / 0.4e1 + 0.1e1);
373}
374
375float ModelGEM::getMu2TopFTaylorTerm2(int n, int geom)
376{
377 float d = mFitElecEffThickness;
378 float L = mFitElecEffHoleDiameter;
379 float w = mFitElecEffWidth[geom];
380
381 return -(8 * (n - 2) * L + 8 * (n - 1) * w - 4 * w - 4 * L) / d /
382 ((4 * std::pow(L, 2) * std::pow(n, 2)) + (8 * L * std::pow(n, 2) * w) +
383 (4 * std::pow(n, 2) * std::pow(w, 2)) - (20 * std::pow(L, 2) * n) - (32 * n * L * w) -
384 (12 * n * std::pow(w, 2)) + (25 * std::pow(L, 2)) + (30 * L * w) + 0.16e2 * std::pow(d, 0.2e1) +
385 (9 * std::pow(w, 2))) /
386 (std::pow(((n - 2) * L) + ((n - 1) * w) - w / 0.2e1 - L / 0.2e1, 0.2e1) * std::pow(d, -0.2e1) / 0.4e1 +
387 0.1e1) -
388 (8 * (n - 2) * L + 8 * (n - 1) * w + 4 * w + 4 * L) / d /
389 ((4 * std::pow(L, 2) * std::pow(n, 2)) + (8 * L * std::pow(n, 2) * w) +
390 (4 * std::pow(n, 2) * std::pow(w, 2)) - (12 * std::pow(L, 2) * n) - (16 * n * L * w) -
391 (4 * n * std::pow(w, 2)) + (9 * std::pow(L, 2)) + (6 * L * w) + 0.16e2 * std::pow(d, 0.2e1) +
392 std::pow(w, 2)) /
393 (std::pow(((n - 2) * L) + ((n - 1) * w) + w / 0.2e1 + L / 0.2e1, 0.2e1) * std::pow(d, -0.2e1) / 0.4e1 +
394 0.1e1) +
395 (8 * n * L + 8 * (n - 1) * w - 4 * w - 4 * L) / d /
396 ((4 * std::pow(L, 2) * std::pow(n, 2)) + (8 * L * std::pow(n, 2) * w) +
397 (4 * std::pow(n, 2) * std::pow(w, 2)) - (4 * std::pow(L, 2) * n) - (16 * n * L * w) -
398 (12 * n * std::pow(w, 2)) + std::pow(L, 2) + (6 * L * w) + 0.16e2 * std::pow(d, 0.2e1) +
399 (9 * std::pow(w, 2))) /
400 (std::pow((n * L) + ((n - 1) * w) - w / 0.2e1 - L / 0.2e1, 0.2e1) * std::pow(d, -0.2e1) / 0.4e1 + 0.1e1) +
401 (8 * n * L + 8 * (n - 1) * w + 4 * w + 4 * L) / d /
402 ((4 * std::pow(L, 2) * std::pow(n, 2)) + (8 * L * std::pow(n, 2) * w) +
403 (4 * std::pow(n, 2) * std::pow(w, 2)) + (4 * std::pow(L, 2) * n) - (4 * n * std::pow(w, 2)) +
404 std::pow(L, 2) - (2 * L * w) + 0.16e2 * std::pow(d, 0.2e1) + std::pow(w, 2)) /
405 (std::pow((n * L) + ((n - 1) * w) + w / 0.2e1 + L / 0.2e1, 0.2e1) * std::pow(d, -0.2e1) / 0.4e1 + 0.1e1);
406}
407
408float ModelGEM::getMu2TopFTaylorTerm0(int n, int geom)
409{
410 float d = mFitElecEffThickness;
411 float L = mFitElecEffHoleDiameter;
412 float w = mFitElecEffWidth[geom];
413
414 return std::atan((((n - 2) * L) + ((n - 1) * w) - w / 0.2e1 - L / 0.2e1) / d / 0.2e1) +
415 std::atan((((n - 2) * L) + ((n - 1) * w) + w / 0.2e1 + L / 0.2e1) / d / 0.2e1) -
416 std::atan(((n * L) + ((n - 1) * w) - w / 0.2e1 - L / 0.2e1) / d / 0.2e1) -
417 std::atan(((n * L) + ((n - 1) * w) + w / 0.2e1 + L / 0.2e1) / d / 0.2e1);
418}
419
420float ModelGEM::getMu2TopfTaylorTerm0(int geom)
421{
422 float d = mFitElecEffThickness;
423 float L = mFitElecEffHoleDiameter;
424 float w = mFitElecEffWidth[geom];
425
426 return -std::atan((0.3e1 / 0.2e1 * L + w / 0.2e1) / d / 0.2e1) - std::atan((L / 0.2e1 - w / 0.2e1) / d / 0.2e1);
427}
428
429float ModelGEM::getMu2Top(float intXStart, float intXEnd, int geom)
430{
431 float result = 0.0;
432
433 for (int n = 2; n <= mFitElecEffNumberHoles; ++n) {
434 result += getMu2TopF2(n, intXStart, intXEnd, geom);
435 }
436
437 result += getMu2Topf2(intXStart, intXEnd);
438
439 return result;
440}
441
442float ModelGEM::getMu2Topf2(float intXStart, float intXEnd)
443{
444 float d = mFitElecEffThickness;
445 float L = mFitElecEffHoleDiameter;
446
447 return std::atan(((L - 2 * intXStart) / d) / 0.2e1) * intXStart -
448 std::atan(((L - 2 * intXStart) / d) / 0.2e1) * L / 0.2e1 +
449 d * std::log((std::pow(L, 2) - 4 * L * intXStart + 4 * std::pow(d, 2) + 4 * intXStart * intXStart)) / 0.2e1 +
450 std::atan(((L + 2 * intXStart) / d) / 0.2e1) * intXStart +
451 std::atan(((L + 2 * intXStart) / d) / 0.2e1) * L / 0.2e1 -
452 d * std::log((std::pow(L, 2) + 4 * L * intXStart + 4 * std::pow(d, 2) + 4 * intXStart * intXStart)) / 0.2e1 -
453 std::atan(((-2 * intXEnd + L) / d) / 0.2e1) * intXEnd +
454 std::atan(((-2 * intXEnd + L) / d) / 0.2e1) * L / 0.2e1 -
455 d * std::log((std::pow(L, 2) - 4 * L * intXEnd + 4 * std::pow(d, 2) + 4 * intXEnd * intXEnd)) / 0.2e1 -
456 std::atan(((2 * intXEnd + L) / d) / 0.2e1) * intXEnd - std::atan(((2 * intXEnd + L) / d) / 0.2e1) * L / 0.2e1 +
457 d * std::log((std::pow(L, 2) + 4 * L * intXEnd + 4 * std::pow(d, 2) + 4 * intXEnd * intXEnd)) / 0.2e1;
458}
459
460float ModelGEM::getMu2TopF2(int n, float intXStart, float intXEnd, int geom)
461{
462 float d = mFitElecEffThickness;
463 float L = mFitElecEffHoleDiameter;
464 float w = mFitElecEffWidth[geom];
465
466 return std::atan(((n * L + n * w - w + 2 * intXStart) / d) / 0.2e1) * intXStart -
467 std::atan(((n * L + n * w - w + 2 * intXStart) / d) / 0.2e1) * w / 0.2e1 +
468 std::atan(((n * L + n * w - w - 2 * intXStart) / d) / 0.2e1) * intXStart +
469 std::atan(((n * L + n * w - w - 2 * intXStart) / d) / 0.2e1) * w / 0.2e1 +
470 std::atan(((n * L + n * w - 2 * L - w + 2 * intXEnd) / d) / 0.2e1) * intXEnd -
471 std::atan(((n * L + n * w - 2 * L - w + 2 * intXEnd) / d) / 0.2e1) * L -
472 std::atan(((n * L + n * w - 2 * L - w + 2 * intXEnd) / d) / 0.2e1) * w / 0.2e1 +
473 std::atan(((n * L + n * w - 2 * L - w - 2 * intXEnd) / d) / 0.2e1) * intXEnd +
474 std::atan(((n * L + n * w - 2 * L - w - 2 * intXEnd) / d) / 0.2e1) * L +
475 std::atan(((n * L + n * w - 2 * L - w - 2 * intXEnd) / d) / 0.2e1) * w / 0.2e1 -
476 std::atan(((n * L + n * w - w + 2 * intXEnd) / d) / 0.2e1) * intXEnd +
477 std::atan(((n * L + n * w - w + 2 * intXEnd) / d) / 0.2e1) * w / 0.2e1 -
478 std::atan(((n * L + n * w - w - 2 * intXEnd) / d) / 0.2e1) * intXEnd -
479 std::atan(((n * L + n * w - w - 2 * intXEnd) / d) / 0.2e1) * w / 0.2e1 -
480 std::atan(((n * L + n * w - 2 * L - w + 2 * intXStart) / d) / 0.2e1) * intXStart +
481 std::atan(((n * L + n * w - 2 * L - w + 2 * intXStart) / d) / 0.2e1) * L +
482 std::atan(((n * L + n * w - 2 * L - w + 2 * intXStart) / d) / 0.2e1) * w / 0.2e1 -
483 std::atan(((n * L + n * w - 2 * L - w - 2 * intXStart) / d) / 0.2e1) * intXStart -
484 std::atan(((n * L + n * w - 2 * L - w - 2 * intXStart) / d) / 0.2e1) * L -
485 std::atan(((n * L + n * w - 2 * L - w - 2 * intXStart) / d) / 0.2e1) * w / 0.2e1 +
486 std::atan(((n * L + n * w - 2 * L - w - 2 * intXStart) / d) / 0.2e1) * n * L / 0.2e1 +
487 std::atan(((n * L + n * w - 2 * L - w - 2 * intXStart) / d) / 0.2e1) * n * w / 0.2e1 +
488 std::atan(((n * L + n * w - w + 2 * intXStart) / d) / 0.2e1) * n * w / 0.2e1 +
489 std::atan(((n * L + n * w - w + 2 * intXStart) / d) / 0.2e1) * n * L / 0.2e1 -
490 std::atan(((n * L + n * w - w - 2 * intXStart) / d) / 0.2e1) * n * L / 0.2e1 -
491 std::atan(((n * L + n * w - w - 2 * intXStart) / d) / 0.2e1) * n * w / 0.2e1 +
492 std::atan(((n * L + n * w - 2 * L - w + 2 * intXEnd) / d) / 0.2e1) * n * L / 0.2e1 +
493 std::atan(((n * L + n * w - 2 * L - w + 2 * intXEnd) / d) / 0.2e1) * n * w / 0.2e1 -
494 std::atan(((n * L + n * w - 2 * L - w - 2 * intXEnd) / d) / 0.2e1) * n * L / 0.2e1 -
495 std::atan(((n * L + n * w - 2 * L - w - 2 * intXEnd) / d) / 0.2e1) * n * w / 0.2e1 -
496 std::atan(((n * L + n * w - w + 2 * intXEnd) / d) / 0.2e1) * n * L / 0.2e1 -
497 std::atan(((n * L + n * w - w + 2 * intXEnd) / d) / 0.2e1) * n * w / 0.2e1 +
498 std::atan(((n * L + n * w - w - 2 * intXEnd) / d) / 0.2e1) * n * L / 0.2e1 +
499 std::atan(((n * L + n * w - w - 2 * intXEnd) / d) / 0.2e1) * n * w / 0.2e1 -
500 std::atan(((n * L + n * w - 2 * L - w + 2 * intXStart) / d) / 0.2e1) * n * L / 0.2e1 -
501 std::atan(((n * L + n * w - 2 * L - w + 2 * intXStart) / d) / 0.2e1) * n * w / 0.2e1 +
502 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 6 * n * L * w - 4 * n * L * intXEnd - 2 * n * std::pow(w, 2) - 4 * intXEnd * w * n + 4 * std::pow(L, 2) + 4 * L * w + 8 * L * intXEnd + 4 * std::pow(d, 2) + std::pow(w, 2) + 4 * intXEnd * w + 4 * intXEnd * intXEnd)) /
503 0.2e1 -
504 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 2 * n * L * w + 4 * n * L * intXStart - 2 * n * std::pow(w, 2) + 4 * w * intXStart * n + 4 * std::pow(d, 2) + std::pow(w, 2) - 4 * w * intXStart + 4 * intXStart * intXStart)) /
505 0.2e1 -
506 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 2 * n * L * w - 4 * n * L * intXEnd - 2 * n * std::pow(w, 2) - 4 * intXEnd * w * n + 4 * std::pow(d, 2) + std::pow(w, 2) + 4 * intXEnd * w + 4 * intXEnd * intXEnd)) /
507 0.2e1 -
508 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 6 * n * L * w - 4 * n * L * intXStart - 2 * n * std::pow(w, 2) - 4 * w * intXStart * n + 4 * std::pow(L, 2) + 4 * L * w + 8 * L * intXStart + 4 * std::pow(d, 2) + std::pow(w, 2) + 4 * w * intXStart + 4 * intXStart * intXStart)) /
509 0.2e1 +
510 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 6 * n * L * w + 4 * n * L * intXStart - 2 * n * std::pow(w, 2) + 4 * w * intXStart * n + 4 * std::pow(L, 2) + 4 * L * w - 8 * L * intXStart + 4 * std::pow(d, 2) + std::pow(w, 2) - 4 * w * intXStart + 4 * intXStart * intXStart)) /
511 0.2e1 -
512 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 6 * n * L * w + 4 * n * L * intXEnd - 2 * n * std::pow(w, 2) + 4 * intXEnd * w * n + 4 * std::pow(L, 2) + 4 * L * w - 8 * L * intXEnd + 4 * std::pow(d, 2) + std::pow(w, 2) - 4 * intXEnd * w + 4 * intXEnd * intXEnd)) /
513 0.2e1 +
514 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 2 * n * L * w - 4 * n * L * intXStart - 2 * n * std::pow(w, 2) - 4 * w * intXStart * n + 4 * std::pow(d, 2) + std::pow(w, 2) + 4 * w * intXStart + 4 * intXStart * intXStart)) /
515 0.2e1 +
516 d * std::log((std::pow(L, 2) * std::pow(n, 2) + 2 * L * std::pow(n, 2) * w + std::pow(n, 2) * std::pow(w, 2) - 2 * n * L * w + 4 * n * L * intXEnd - 2 * n * std::pow(w, 2) + 4 * intXEnd * w * n + 4 * std::pow(d, 2) + std::pow(w, 2) - 4 * intXEnd * w + 4 * intXEnd * intXEnd)) /
517 0.2e1;
518}
519
520float ModelGEM::getMu1Cathode(int geom)
521{
522 float result = 0.0;
523
524 for (int n = 2; n <= mFitElecEffNumberHoles; ++n) {
525 result += getMu1CathodeF2(n, geom);
526 }
527
528 result += getMu1Cathodef2(geom);
529
530 return result;
531}
532
533float ModelGEM::getMu1Cathodef2(int geom)
534{
535 float d = mFitElecEffThickness;
536 float L = mFitElecEffHoleDiameter;
537 float w = mFitElecEffWidth[geom];
538 float g1 = mFitElecEffDistancePrevStage;
539
540 return -0.3e1 / 0.2e1 * L * std::atan(((3 * L + w) / (-g1 + d)) / 0.2e1) +
541 L * std::atan(((-w + L) / (-g1 + d)) / 0.2e1) / 0.2e1 - L * 0.3141592654e1 -
542 std::atan(((3 * L + w) / (-g1 + d)) / 0.2e1) * w / 0.2e1 +
543 d * std::log((9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
544 0.2e1 -
545 g1 * std::log((9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
546 0.2e1 -
547 std::atan(((-w + L) / (-g1 + d)) / 0.2e1) * w / 0.2e1 -
548 d * std::log((std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
549 0.2e1 +
550 g1 * std::log((std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
551 0.2e1 -
552 0.3141592654e1 * w;
553}
554
555float ModelGEM::getMu1CathodeF2(int n, int geom)
556{
557 float d = mFitElecEffThickness;
558 float L = mFitElecEffHoleDiameter;
559 float w = mFitElecEffWidth[geom];
560 float g1 = mFitElecEffDistancePrevStage;
561
562 return -0.3e1 / 0.2e1 * L * std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (-g1 + d)) / 0.2e1) +
563 L * std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (-g1 + d)) / 0.2e1) * n +
564 L * std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (-g1 + d)) / 0.2e1) * n -
565 std::atan(((2 * n * L + 2 * n * w + L - w) / (-g1 + d)) / 0.2e1) * n * w -
566 std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (-g1 + d)) / 0.2e1) * n * w +
567 std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (-g1 + d)) / 0.2e1) * n * w +
568 std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (-g1 + d)) / 0.2e1) * n * w -
569 L * std::atan(((2 * n * L + 2 * n * w + L - w) / (-g1 + d)) / 0.2e1) * n +
570 0.5e1 / 0.2e1 * L * std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (-g1 + d)) / 0.2e1) -
571 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 20 * std::pow(L, 2) * n - 32 * n * L * w - 12 * n * std::pow(w, 2) + 25 * std::pow(L, 2) + 30 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
572 0.2e1 +
573 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 20 * std::pow(L, 2) * n - 32 * n * L * w - 12 * n * std::pow(w, 2) + 25 * std::pow(L, 2) + 30 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
574 0.2e1 -
575 L * std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (-g1 + d)) / 0.2e1) / 0.2e1 +
576 std::atan(((2 * n * L + 2 * n * w + L - w) / (-g1 + d)) / 0.2e1) * w / 0.2e1 +
577 0.3e1 / 0.2e1 * std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (-g1 + d)) / 0.2e1) * w -
578 std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (-g1 + d)) / 0.2e1) * w / 0.2e1 -
579 0.3e1 / 0.2e1 * std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (-g1 + d)) / 0.2e1) * w +
580 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 16 * n * L * w - 12 * n * std::pow(w, 2) + std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
581 0.2e1 -
582 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 16 * n * L * w - 12 * n * std::pow(w, 2) + std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
583 0.2e1 -
584 L * std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (-g1 + d)) / 0.2e1) * n -
585 L * std::atan(((2 * n * L + 2 * n * w + L - w) / (-g1 + d)) / 0.2e1) / 0.2e1 -
586 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) + 4 * std::pow(L, 2) * n - 4 * n * std::pow(w, 2) + std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
587 0.2e1 +
588 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) + 4 * std::pow(L, 2) * n - 4 * n * std::pow(w, 2) + std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
589 0.2e1 +
590 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 12 * std::pow(L, 2) * n - 16 * n * L * w - 4 * n * std::pow(w, 2) + 9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
591 0.2e1 -
592 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 12 * std::pow(L, 2) * n - 16 * n * L * w - 4 * n * std::pow(w, 2) + 9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) - 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
593 0.2e1;
594}
595
596float ModelGEM::getMu2Cathode(int geom)
597{
598 float result = 0.0;
599
600 for (int n = 2; n <= mFitElecEffNumberHoles; ++n) {
601 result += getMu2CathodeF2(n, geom);
602 }
603
604 result += getMu2Cathodef2(geom);
605
606 return result;
607}
608
609float ModelGEM::getMu2Cathodef2(int geom)
610{
611 float d = mFitElecEffThickness;
612 float L = mFitElecEffHoleDiameter;
613 float w = mFitElecEffWidth[geom];
614 float g1 = mFitElecEffDistancePrevStage;
615
616 return -0.3e1 / 0.2e1 * L * std::atan(((3 * L + w) / (d + g1)) / 0.2e1) +
617 L * std::atan(((-w + L) / (d + g1)) / 0.2e1) / 0.2e1 -
618 std::atan(((3 * L + w) / (d + g1)) / 0.2e1) * w / 0.2e1 +
619 d * std::log((9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
620 0.2e1 +
621 g1 * std::log((9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
622 0.2e1 -
623 std::atan(((-w + L) / (d + g1)) / 0.2e1) * w / 0.2e1 -
624 d * std::log((std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
625 0.2e1 -
626 g1 * std::log((std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
627 0.2e1;
628}
629
630float ModelGEM::getMu2CathodeF2(int n, int geom)
631{
632 float d = mFitElecEffThickness;
633 float L = mFitElecEffHoleDiameter;
634 float w = mFitElecEffWidth[geom];
635 float g1 = mFitElecEffDistancePrevStage;
636
637 return -L * std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (d + g1)) / 0.2e1) * n +
638 L * std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (d + g1)) / 0.2e1) * n -
639 std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (d + g1)) / 0.2e1) * n * w +
640 std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (d + g1)) / 0.2e1) * n * w -
641 std::atan(((2 * n * L + 2 * n * w + L - w) / (d + g1)) / 0.2e1) * n * w +
642 std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (d + g1)) / 0.2e1) * n * w +
643 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) + 4 * std::pow(L, 2) * n - 4 * n * std::pow(w, 2) + std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
644 0.2e1 +
645 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) + 4 * std::pow(L, 2) * n - 4 * n * std::pow(w, 2) + std::pow(L, 2) - 2 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
646 0.2e1 -
647 L * std::atan(((2 * n * L + 2 * n * w + L - w) / (d + g1)) / 0.2e1) * n -
648 L * std::atan(((2 * n * L + 2 * n * w + L - w) / (d + g1)) / 0.2e1) / 0.2e1 +
649 0.3e1 / 0.2e1 * std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (d + g1)) / 0.2e1) * w -
650 std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (d + g1)) / 0.2e1) * w / 0.2e1 +
651 std::atan(((2 * n * L + 2 * n * w + L - w) / (d + g1)) / 0.2e1) * w / 0.2e1 -
652 0.3e1 / 0.2e1 * std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (d + g1)) / 0.2e1) * w +
653 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 20 * std::pow(L, 2) * n - 32 * n * L * w - 12 * n * std::pow(w, 2) + 25 * std::pow(L, 2) + 30 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
654 0.2e1 +
655 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 20 * std::pow(L, 2) * n - 32 * n * L * w - 12 * n * std::pow(w, 2) + 25 * std::pow(L, 2) + 30 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
656 0.2e1 -
657 L * std::atan(((2 * n * L + 2 * n * w - L - 3 * w) / (d + g1)) / 0.2e1) / 0.2e1 +
658 0.5e1 / 0.2e1 * L * std::atan(((2 * n * L + 2 * n * w - 5 * L - 3 * w) / (d + g1)) / 0.2e1) -
659 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 16 * n * L * w - 12 * n * std::pow(w, 2) + std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
660 0.2e1 +
661 L * std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (d + g1)) / 0.2e1) * n -
662 0.3e1 / 0.2e1 * L * std::atan(((2 * n * L + 2 * n * w - 3 * L - w) / (d + g1)) / 0.2e1) -
663 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 4 * std::pow(L, 2) * n - 16 * n * L * w - 12 * n * std::pow(w, 2) + std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + 9 * std::pow(w, 2))) /
664 0.2e1 -
665 d * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 12 * std::pow(L, 2) * n - 16 * n * L * w - 4 * n * std::pow(w, 2) + 9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
666 0.2e1 -
667 g1 * std::log((4 * std::pow(L, 2) * std::pow(n, 2) + 8 * L * std::pow(n, 2) * w + 4 * std::pow(n, 2) * std::pow(w, 2) - 12 * std::pow(L, 2) * n - 16 * n * L * w - 4 * n * std::pow(w, 2) + 9 * std::pow(L, 2) + 6 * L * w + 4 * std::pow(d, 2) + 8 * g1 * d + 4 * std::pow(g1, 2) + std::pow(w, 2))) /
668 0.2e1;
669}
670
671float ModelGEM::getLambdaCathode(int geom)
672{
673 float result = 0.0;
674
675 for (int n = 2; n <= mFitElecEffNumberHoles; ++n) {
676 result += getLambdaCathodeF2(n, geom);
677 }
678
679 result += getLambdaCathodef2(geom);
680
681 return result;
682}
683
684float ModelGEM::getLambdaCathodef2(int geom)
685{
686 float d = mFitElecEffThickness;
687 float L = mFitElecEffHoleDiameter;
688 float w = mFitElecEffWidth[geom];
689 float g1 = mFitElecEffDistancePrevStage;
690
691 return -d * std::log(0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
692 0.2e1 +
693 g1 * std::log(0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
694 0.2e1 +
695 std::atan((-w + L) / (-g1 + d) / 0.2e1) * w / 0.2e1 +
696 0.3e1 / 0.2e1 * L * std::atan((0.3e1 * L + w) / (d + g1) / 0.2e1) +
697 0.3e1 / 0.2e1 * L * std::atan((0.3e1 * L + w) / (-g1 + d) / 0.2e1) -
698 d * std::log(0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
699 0.2e1 -
700 g1 * std::log(0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
701 0.2e1 -
702 L * std::atan((-w + L) / (d + g1) / 0.2e1) / 0.2e1 +
703 std::atan((0.3e1 * L + w) / (d + g1) / 0.2e1) * w / 0.2e1 -
704 L * std::atan((-w + L) / (-g1 + d) / 0.2e1) / 0.2e1 +
705 d * std::log(std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
706 0.2e1 -
707 g1 * std::log(std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
708 0.2e1 +
709 std::atan((0.3e1 * L + w) / (-g1 + d) / 0.2e1) * w / 0.2e1 +
710 std::atan((-w + L) / (d + g1) / 0.2e1) * w / 0.2e1 +
711 d * std::log(std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
712 0.2e1 +
713 g1 * std::log(std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
714 0.2e1;
715}
716
717float ModelGEM::getLambdaCathodeF2(int n, int geom)
718{
719 float d = mFitElecEffThickness;
720 float L = mFitElecEffHoleDiameter;
721 float w = mFitElecEffWidth[geom];
722 float g1 = mFitElecEffDistancePrevStage;
723
724 return -d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) + 0.4e1 * std::pow(L, 0.2e1) * n - 0.4e1 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
725 0.2e1 -
726 g1 * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) + 0.4e1 * std::pow(L, 0.2e1) * n - 0.4e1 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
727 0.2e1 -
728 0.3e1 / 0.2e1 * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (d + g1) / 0.2e1) * w +
729 std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (d + g1) / 0.2e1) * w / 0.2e1 -
730 std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (d + g1) / 0.2e1) * w / 0.2e1 +
731 0.3e1 / 0.2e1 * std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (d + g1) / 0.2e1) * w -
732 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.20e2 * std::pow(L, 0.2e1) * n - 0.32e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + 0.25e2 * std::pow(L, 0.2e1) + 0.30e2 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
733 0.2e1 -
734 g1 * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.20e2 * std::pow(L, 0.2e1) * n - 0.32e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + 0.25e2 * std::pow(L, 0.2e1) + 0.30e2 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
735 0.2e1 +
736 g1 * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.4e1 * std::pow(L, 0.2e1) * n - 0.16e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
737 0.2e1 +
738 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.4e1 * std::pow(L, 0.2e1) * n - 0.16e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
739 0.2e1 +
740 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.12e2 * std::pow(L, 0.2e1) * n - 0.16e2 * n * L * w - 0.4e1 * n * std::pow(w, 0.2e1) + 0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
741 0.2e1 +
742 g1 *
743 std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w +
744 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.12e2 * std::pow(L, 0.2e1) * n -
745 0.16e2 * n * L * w - 0.4e1 * n * std::pow(w, 0.2e1) + 0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w +
746 0.4e1 * std::pow(d, 0.2e1) + 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
747 0.2e1 +
748 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (-g1 + d) / 0.2e1) / 0.2e1 +
749 0.3e1 / 0.2e1 * L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (-g1 + d) / 0.2e1) -
750 0.5e1 / 0.2e1 * L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (-g1 + d) / 0.2e1) +
751 g1 * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.20e2 * std::pow(L, 0.2e1) * n - 0.32e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + 0.25e2 * std::pow(L, 0.2e1) + 0.30e2 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
752 0.2e1 -
753 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.20e2 * std::pow(L, 0.2e1) * n - 0.32e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + 0.25e2 * std::pow(L, 0.2e1) + 0.30e2 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
754 0.2e1 -
755 std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (-g1 + d) / 0.2e1) * w / 0.2e1 -
756 0.3e1 / 0.2e1 * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (-g1 + d) / 0.2e1) * w +
757 std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (-g1 + d) / 0.2e1) * w / 0.2e1 +
758 0.3e1 / 0.2e1 * std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (-g1 + d) / 0.2e1) * w -
759 g1 * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.4e1 * std::pow(L, 0.2e1) * n - 0.16e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
760 0.2e1 +
761 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.4e1 * std::pow(L, 0.2e1) * n - 0.16e2 * n * L * w - 0.12e2 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + 0.9e1 * std::pow(w, 0.2e1)) /
762 0.2e1 +
763 g1 * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) + 0.4e1 * std::pow(L, 0.2e1) * n - 0.4e1 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
764 0.2e1 -
765 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) + 0.4e1 * std::pow(L, 0.2e1) * n - 0.4e1 * n * std::pow(w, 0.2e1) + std::pow(L, 0.2e1) - 0.2e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
766 0.2e1 -
767 g1 *
768 std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w +
769 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.12e2 * std::pow(L, 0.2e1) * n -
770 0.16e2 * n * L * w - 0.4e1 * n * std::pow(w, 0.2e1) + 0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w +
771 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
772 0.2e1 +
773 d * std::log(0.4e1 * std::pow(L, 0.2e1) * std::pow(n, 0.2e1) + 0.8e1 * L * std::pow(n, 0.2e1) * w + 0.4e1 * std::pow(n, 0.2e1) * std::pow(w, 0.2e1) - 0.12e2 * std::pow(L, 0.2e1) * n - 0.16e2 * n * L * w - 0.4e1 * n * std::pow(w, 0.2e1) + 0.9e1 * std::pow(L, 0.2e1) + 0.6e1 * L * w + 0.4e1 * std::pow(d, 0.2e1) - 0.8e1 * g1 * d + 0.4e1 * std::pow(g1, 0.2e1) + std::pow(w, 0.2e1)) /
774 0.2e1 -
775 0.5e1 / 0.2e1 * L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (d + g1) / 0.2e1) +
776 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (d + g1) / 0.2e1) / 0.2e1 +
777 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (d + g1) / 0.2e1) / 0.2e1 +
778 0.3e1 / 0.2e1 * L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (d + g1) / 0.2e1) +
779 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (-g1 + d) / 0.2e1) / 0.2e1 +
780 std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (-g1 + d) / 0.2e1) * n * w -
781 std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (d + g1) / 0.2e1) * n * w +
782 std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (-g1 + d) / 0.2e1) * n * w -
783 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (-g1 + d) / 0.2e1) * n -
784 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (d + g1) / 0.2e1) * n +
785 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (-g1 + d) / 0.2e1) * n +
786 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (-g1 + d) / 0.2e1) * n -
787 std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (-g1 + d) / 0.2e1) * n * w +
788 std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (d + g1) / 0.2e1) * n * w -
789 std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (-g1 + d) / 0.2e1) * n * w -
790 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (-g1 + d) / 0.2e1) * n -
791 std::atan((0.2e1 * n * L + 0.2e1 * n * w - L - 0.3e1 * w) / (d + g1) / 0.2e1) * n * w +
792 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (d + g1) / 0.2e1) * n +
793 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.5e1 * L - 0.3e1 * w) / (d + g1) / 0.2e1) * n +
794 std::atan((0.2e1 * n * L + 0.2e1 * n * w + L - w) / (d + g1) / 0.2e1) * n * w -
795 L * std::atan((0.2e1 * n * L + 0.2e1 * n * w - 0.3e1 * L - w) / (d + g1) / 0.2e1) * n;
796}
int32_t i
Definition for the model calculations + simulations of the GEM efficiencies.
void setStackProperties(const std::array< int, 4 > &geometry, const std::array< float, 5 > &distance, const std::array< float, 4 > &potential, const std::array< float, 5 > &electricField)
Definition ModelGEM.cxx:106
float getStackEffectiveGain()
Calculate the total effective gain for a given GEM stack (defined with setStackProperties)
Definition ModelGEM.cxx:156
float getSingleGainFluctuation(float gemPotential, int geom)
Definition ModelGEM.cxx:101
float getAbsoluteGain(float gemPotential, int geom)
Definition ModelGEM.cxx:95
ModelGEM()
Constructor.
Definition ModelGEM.cxx:22
float getStackEnergyResolution()
Calculate the energy resolution for a given GEM stack (defined with setStackProperties)
Definition ModelGEM.cxx:114
float getElectronExtractionEfficiency(float elecFieldBelow, float gemPotential, int geom)
Definition ModelGEM.cxx:78
float getElectronCollectionEfficiency(float elecFieldAbove, float gemPotential, int geom)
Definition ModelGEM.cxx:61
GLdouble n
Definition glcorearb.h:1982
GLsizei GLsizei GLfloat distance
Definition glcorearb.h:5506
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
Global TPC definitions and constants.
Definition SimTraits.h:167