ATLAS Offline Software
RadDamageUtil.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 #include "RadDamageUtil.h"
6 
7 #include "TGraph.h"
8 #include "TString.h"
9 #include "TMath.h"
10 #include "TH3F.h"
11 #include "TH2F.h"
12 #include "TH1F.h"
15 #include "InDetSimEvent/SiHit.h"
18 #include "AtlasHepMC/GenEvent.h"
19 #include "AtlasHepMC/GenVertex.h"
20 #include "AtlasHepMC/GenParticle.h"
21 
23 
24 #include "CLHEP/Random/RandExpZiggurat.h"
25 #include "CLHEP/Random/RandFlat.h"
26 #include "TLorentzVector.h"
27 #include "CLHEP/Units/PhysicalConstants.h"
28 
29 #include "EfieldInterpolator.h"
30 #include <fstream>
31 #include <cmath>
32 
33 using namespace std;
34 
35 // Constructor with parameters:
36 RadDamageUtil::RadDamageUtil(const std::string& type, const std::string& name, const IInterface* parent) :
38 
40 
41 //=======================================
42 // I N I T I A L I Z E
43 //=======================================
46  ATH_CHECK(m_EfieldInterpolator.retrieve());
47  ATH_MSG_DEBUG("You are using RadDamageUtil for solid-state silicon detectors.");
48  return StatusCode::SUCCESS;
49 }
50 
51 //=======================================
52 // G E N E R A T E R A M O M A P
53 //=======================================
54 // The third of the 3 maps should be the most accurate.
55 // See doc/RadDamageDefaults.pdf in the Allpix repo for details.
56 // See ATL-COM-INDET-2018-011 for details.
57 //=======================================
59  //TODO: this needs to come from DB
60  double pitchX = 0.05;
61  double pitchY = 0.25;
62  //TODO: from PixelModuleDesign
63  double sensorThickness = module->thickness() * 1000.0;//default 200;
64 
65  //Ramo potential evaluated up to 2x pitch away
66  //from the center of the primary pixel.
67  double xmin = 0.;
68  double xmax = 2 * pitchX * 1000;
69  double ymin = 0.;
70  double ymax = 2 * pitchY * 1000;
71 
72  //One bin per 10 microns.
73  ramoPotentialMap = new TH3F("hramomap1", "hramomap1", ((xmax - xmin) / 10.), xmin, xmax, ((ymax - ymin) / 10.), ymin,
74  ymax, int(sensorThickness * 1000) / 10, 0., sensorThickness * 1000.);
75 
76  //******************
77  //*** Loop in z ***
78  //******************
79  for (int k = 1; k <= ramoPotentialMap->GetNbinsZ(); k++) {
80  //use the lower bin edge.
81  double z = ramoPotentialMap->GetZaxis()->GetBinCenter(k) - ramoPotentialMap->GetZaxis()->GetBinWidth(k) / 2.;
82 
83  //******************
84  //*** Loop in x,y ***
85  //******************
86  for (int i = 1; i <= ramoPotentialMap->GetNbinsX(); i++) { //Loop over x
87  for (int j = 1; j <= ramoPotentialMap->GetNbinsY(); j++) { //loop over y
88  double x = ramoPotentialMap->GetXaxis()->GetBinCenter(i) - ramoPotentialMap->GetXaxis()->GetBinWidth(i) / 2.;
89  double y = ramoPotentialMap->GetYaxis()->GetBinCenter(j) - ramoPotentialMap->GetYaxis()->GetBinWidth(j) / 2.;
90 
91  //*******************************
92  //*** Option A: 1D approx. in z
93  //*******************************
94  if (m_defaultRamo == -1) {
95  if (x > (pitchX * 1000.0 * 0.5) || y > (pitchY * 1000.0 * 0.5)) {
96  ramoPotentialMap->SetBinContent(i, j, k, 0.01); //outside of the primary pixel.
97  //TODO what is the last bin value? Is 0.01 the min?
98  } else {
99  //TODO make sure all of these eta/phi values make sense for non-barrel modules too
100  //The formula below parameterises the 1D Ramo potential. See ATL-COM-INDET-2018-011 for details.
101  double par_a = 3 * sensorThickness / pitchY;
102  double norm = exp(-par_a) + exp(-1.0);
103  double val = exp(-par_a * z / (1000.0 * sensorThickness)) + exp(-z / (1000 * sensorThickness));
104  val -= norm;
105  val /= (2.0 - norm);
106  ramoPotentialMap->SetBinContent(i, j, k, val);
107  }
108  }
109  //*******************************
110  //*** Option B: 2D approx. in xy
111  //*******************************
112  else if (m_defaultRamo == 0) {
113  double par_a = 10.0;
114  double norm = exp(-par_a) + exp(-1.);
115  double val = exp(-par_a * z / (1000 * sensorThickness)) + exp(-z / (1000 * sensorThickness));
116  val -= norm;
117  val /= (2. - norm);
118  //From equation 16 in the RadDamageDefaults support note, using solution for weighting potential in 2D
119  double productSolution = weighting2D(x, z, pitchX, sensorThickness) * weighting2D(y, z, pitchY,
120  sensorThickness) * val /
121  (weighting2D(0, z, pitchX,
122  sensorThickness) * weighting2D(0, z, pitchY, sensorThickness));
123  ramoPotentialMap->SetBinContent(i, j, k, productSolution);
124  }
125  //************************************************
126  //*** Option C: Poisson's eqn. w/ simple geometry
127  //************************************************
128  else if (m_defaultRamo > 0) {
129  double fullSolution = weighting3D(x / sensorThickness, y / sensorThickness, z / sensorThickness,
130  m_defaultRamo, m_defaultRamo, 4, pitchX / sensorThickness,
131  pitchY / sensorThickness); //N = 4 is arbitrary; just need something bigger
132  // than ~1
133  ramoPotentialMap->SetBinContent(i, j, k, fullSolution);
134  }//Ramo option > 0.
135  }//loop over y.
136  }//loop over x.
137  }//loop over z.
138  return StatusCode::SUCCESS;
139 } //TODO: What about debugging the ramo potential? I vaguely remember running into issues with this.
140 
141 //=======================================
142 // A L P H A
143 //=======================================
144 //Constituent of full poisson solution.
145 //Last terms in eqn. 18, 19 in support note
146 double RadDamageUtil::alpha(int n, int Nrep, double a) {
147  return((2 * M_PI * n) / (Nrep * a));
148 }
149 
150 //=======================================
151 // W E I G H T I N G 3 D
152 //=======================================
153 //Approx, solution to Poisson's eqn. with simplified geometry
154 //See section 1.3 in support note for details
155 double RadDamageUtil::weighting3D(double x, double y, double z, int n, int m, int Nrep, double a, double b) {
156  //TODO: talk to ben about this comment:
157  //be warned that there is numerical instability if n and m are too large! Suggest n ~ m ~ 10.
158  double potential = 0.;
159 
160  for (int i = -n; i <= n; i++) {
161  for (int j = -m; j <= m; j++) {
162  double X = 0.;
163  double Y = 0.;
164  double Z = 0.;
165  double factor_x = 0.;
166  double factor_y = 0.;
167  if (i == 0 && j == 0) {
168  factor_x = 1. / Nrep;
169  factor_y = factor_x;
170  Z = 1 - z;
171  } else {
172  //Equation 18 & 19 in support note
173  factor_x = std::sin(i * M_PI / Nrep) / (M_PI * i);
174  factor_y = std::sin(j * M_PI / Nrep) / (M_PI * j);
175  //Equation 17 in support note
176  double norm = std::sqrt(std::pow(alpha(i, Nrep, a), 2) + std::pow(alpha(j, Nrep, b), 2));
177  Z = std::sinh(norm * (1 - z)) / sinh(norm);
178  }
179  //Equation 18 & 19 in support note
180  X = factor_x * std::cos(alpha(i, Nrep, a) * x);
181  Y = factor_y * std::cos(alpha(j, Nrep, b) * y);
182 
183  //Equation 20 in support note
184  potential += Z * X * Y;
185  }
186  }
187  return potential;
188 }
189 
190 //=======================================
191 //W E I G H T I N G 2 D
192 //=======================================
193 //Solution to Poisson's equation for a 2D inf. strip
194 //i.e. weighting potential with 2D solution
195 double RadDamageUtil::weighting2D(double x, double z, double Lx, double sensorThickness) {
196  if (z == 0) z = 0.00001; //a pathology in the definition.M_PI
197 
198  //scale to binsize (inputs assumed to be in mm)
199  sensorThickness *= 1000.;
200  Lx *= 1000;
201 
202  //val is set according to equation 3 in the radDamageDefaults support note
203  double val =
204  (TMath::Sin(M_PI * z / sensorThickness) * TMath::SinH(0.5 * M_PI * Lx / sensorThickness) /
205  (TMath::CosH(M_PI * x / sensorThickness) - TMath::Cos(M_PI * z / sensorThickness) *
206  TMath::CosH(0.5 * M_PI * Lx / sensorThickness)));
207  if (val > 0) return TMath::ATan(val) / M_PI;
208  else return TMath::ATan(val) / M_PI + 1;
209 }
210 
211 //=========================================
212 // G E N E R A T E E - F I E L D M A P
213 //=========================================
215  //TODO: from DB
216  double biasVoltage = 600.;
217  double sensorThickness = module->thickness(); //default should be 0.2?
218  double fluence = 8.;//*e14 neq/cm^2
219 
220  eFieldMap = new TH1F("hefieldz", "hefieldz", 200, 0, sensorThickness * 1e3);
221 
222  std::string TCAD_list = PathResolver::find_file("ibl_TCAD_EfieldProfiles.txt", "DATAPATH"); //IBL layer
223  if (sensorThickness > 0.2) {
224  //is blayer
225  TCAD_list = PathResolver::find_file("blayer_TCAD_EfieldProfiles.txt", "DATAPATH"); //B layer
226  if (sensorThickness > 0.25) {
227  ATH_MSG_WARNING("Sensor thickness (" << sensorThickness << "mm) does not match geometry provided in samples");
228  return StatusCode::FAILURE;
229  }
230  }
231 
232  CHECK(m_EfieldInterpolator->loadTCADlist(TCAD_list));
233  eFieldMap = (TH1F*) m_EfieldInterpolator->getEfield(fluence, biasVoltage);
234  return StatusCode::SUCCESS;
235 }
236 
238  double biasVoltage, int layer, const std::string& TCAD_list, bool interpolate) {
239  TString id;
240  //TODO adapt saving location for documentation of E field interpolation
241  TString predirname = "";
242 
243  if (interpolate) {
244  id = "Interpolation";
245  } else {
246  id = "TCAD";
247  }
248  if (interpolate) {
249  CHECK(m_EfieldInterpolator->loadTCADlist(TCAD_list));
250  eFieldMap = (TH1F*) m_EfieldInterpolator->getEfield(fluence, biasVoltage);
251  } else {
252  //retrieve E field directly from file (needs to be .dat file with table)
253  CHECK(m_EfieldInterpolator->loadTCADlist(TCAD_list));
254  ATH_MSG_INFO("Load Efield map from " << TCAD_list);
255  }
256  if (!eFieldMap) {
257  ATH_MSG_ERROR("E field has not been created!");
258  return StatusCode::FAILURE;
259  }
260  //For debugging save map
261  //TCAD_list.ReplaceAll(".txt","_map.root");
262  TString dirname = "layer";
263  dirname += layer;
264  dirname += "_fl";
265  dirname += TString::Format("%.1f", fluence / (float) (1e14));
266  dirname += "e14_U";
267  dirname += TString::Format("%.0f", biasVoltage);
268  dirname += id;
269  dirname.ReplaceAll(".", "-");
270  dirname = predirname + dirname;
271  dirname += (".root");
272  eFieldMap->SaveAs(dirname.Data(), "");
273  return StatusCode::SUCCESS;
274 }
275 
276 //==================================================
277 // G E N E R A T E DISTANCE / TIME / LORENTZ MAP
278 //==================================================
279 //Currently, if one is missing, all 3 have to be regenerated.
280 //It IS possible to split them up but riht now that means lots of repeated code.
281 //Might be worth coming back in the future if it needs to be optimised or
282 //if
283 const StatusCode RadDamageUtil::generateDistanceTimeMap(TH2F*& distanceMap_e, TH2F*& distanceMap_h, TH1F*& timeMap_e,
284  TH1F*& timeMap_h, TH2F*& lorentzMap_e, TH2F*& lorentzMap_h,
285  TH1F*& eFieldMap, InDetDD::PixelModuleDesign* module) {
286  // Implementation for precomputed maps
287  //https://gitlab.cern.ch/radiationDamageDigitization/radDamage_athena_rel22/blob/rel22_radDamageDev_master/scripts/SaveMapsForAthena.C
288  //TODO: From DB call each time
289  double temperature = 300;
290  double bField = 2*m_fieldScale;//Tesla
291  //From PixelModuleDesign: TODO
292  //FIXME workaround, if PixelModuleDesign not available: retrieve sensor thickness from E field
293  //double sensorThickness = module->thickness() * 1000.0;//default is 200;
294  double sensorThickness = 0.2; //mm
295 
296  //Check if x axis (sensor depth) of E field larger than IBL sensors
297  if (eFieldMap->GetXaxis()->GetXmax() > 210) { //Efield in um
298  sensorThickness = 0.250;
299  }
300  if (module) {
301  sensorThickness = module->thickness() * 1000.0;//default is 200;
302  }
303 
304  //Y-axis is time charge carrier travelled for,
305  //X-axis is initial position of charge carrier,
306  //Z-axis is final position of charge carrier
307  distanceMap_e = new TH2F("edistance", "Electron Distance Map", 100, 0, sensorThickness, 1000, 0, 1000); //mm by ns
308  distanceMap_h = new TH2F("hdistance", "Holes Distance Map", 100, 0, sensorThickness, 1000, 0, 1000);
309  //Initalize distance maps
310  for (int i = 1; i <= distanceMap_e->GetNbinsX(); i++) {
311  for (int j = 1; j <= distanceMap_e->GetNbinsY(); j++) {
312  distanceMap_h->SetBinContent(i, j, sensorThickness); //if you travel long enough, you will reach the electrode.
313  distanceMap_e->SetBinContent(i, j, 0.); //if you travel long enough, you will reach the electrode.
314  }
315  }
316 
317  //From a given place in the sensor bulk, show time-to-electrode
318  timeMap_e = new TH1F("etimes", "Electron Time Map", 100, 0, sensorThickness); //mm
319  timeMap_h = new TH1F("htimes", "Hole Time Map", 100, 0, sensorThickness); //mm
320 
321  //X axis is initial position of charge carrier (in z)
322  //Y axis is distance travelled in z by charge carrier
323  //Z axis is tan( lorentz_angle )
324  lorentzMap_e = new TH2F("lorentz_map_e", "Lorentz Map e", 100, 0, sensorThickness, 100, 0, sensorThickness); //mm by mm
325  lorentzMap_h = new TH2F("lorentz_map_h", "Lorentz Map h", 100, 0, sensorThickness, 100, 0, sensorThickness); //mm by mm
326  ATH_MSG_DEBUG("Did not find time and/or distance maps. Will compute them from the E-field map..");
327 
328  for (int i = 1; i <= distanceMap_e->GetNbinsX(); i++) { //Loop over initial position of charge carrier (in z)
329  double time_e = 0.; //ns
330  double time_h = 0.; //ns
331  double distanceTravelled_e = 0; //mm
332  double distanceTravelled_h = 0; //mm
333  double drift_e = 0.; //mm
334  double drift_h = 0.; //mm
335 
336  for (int j = i; j >= 1; j--) { //Lower triangle
337  double dz = distanceMap_e->GetXaxis()->GetBinWidth(j); //mm
338  double z_j = distanceMap_e->GetXaxis()->GetBinCenter(j); //mm
339  //printf("\n \n distance map bin center i/j: %f/%f width %f (mm) \n sensor thickness: %f \n E field value: %f in
340  // bin %f \n ", z_i, z_j, dz, sensorThickness, Ez, z_i*1000);
341  //
342  double Ez = eFieldMap->GetBinContent(eFieldMap->GetXaxis()->FindBin(z_j * 1000)) / 1e7; // in MV/mm;
343  std::pair<double, double> mu = getMobility(Ez, temperature); //mm^2/MV*ns
344  if (Ez > 0) {
345  //Electrons
346  //double tanLorentzAngle = mu.first*bField*(1.0E-3); //rad, unit conversion; pixelPitch_eta-Field is in T =
347  // V*s/m^2
348  double tanLorentzAngle = getTanLorentzAngle(Ez, temperature, bField, false);
349  time_e += dz / (mu.first * Ez); //mm * 1/(mm/ns) = ns
350 
351  //Fill: time charge carrier travelled for, given staring position (i) and final position (z_j)
352  distanceMap_e->SetBinContent(i, distanceMap_e->GetYaxis()->FindBin(time_e), z_j);
353 
354  drift_e += dz * tanLorentzAngle; //Increment the total drift parallel to plane of sensor
355  distanceTravelled_e += dz; //mm (travelled in z)
356  lorentzMap_e->SetBinContent(i, j, drift_e / distanceTravelled_e);
357  }
358  timeMap_e->SetBinContent(i, time_e);
359  }
360  //Mainly copied from l416 ff changed naming k=>j
361  //https://gitlab.cern.ch/radiationDamageDigitization/radDamage_athena_rel22/blob/rel22_radDamageDev_master/scripts/SaveMapsForAthena.C
362  for (int j = i; j <= distanceMap_e->GetNbinsX(); j++) { //holes go the opposite direction as electrons.
363  double dz = distanceMap_e->GetXaxis()->GetBinWidth(j); //similar to _h
364  //double Ez = eFieldMap->GetBinContent(eFieldMap->GetXaxis()->FindBin(z_i*1000))/1e7; // in MV/mm;
365  double z_j = distanceMap_e->GetXaxis()->GetBinCenter(j); //mm //similar to _h
366  double Ez = eFieldMap->GetBinContent(eFieldMap->GetXaxis()->FindBin(z_j * 1000)) / 1e7; // in MV/mm;
367  std::pair<double, double> mu = getMobility(Ez, temperature); //mm^2/MV*ns
368  if (Ez > 0) {
369  //Holes
370  //std::pair<double, double> mu = getMobility(Ez, temperature); //mm^2/MV*ns
371  //double tanLorentzAngle = mu.second*bField*(1.0E-3); //rad
372  double tanLorentzAngle = getTanLorentzAngle(Ez, temperature, bField, true);
373  time_h += dz / (mu.second * Ez); //mm * 1/(mm/ns) = ns
374  distanceMap_h->SetBinContent(i, distanceMap_h->GetYaxis()->FindBin(time_h), z_j);
375 
376  drift_h += dz * tanLorentzAngle;
377  distanceTravelled_h += dz; //mm
378  lorentzMap_h->SetBinContent(i, j, drift_h / distanceTravelled_h);
379  }
380  timeMap_h->SetBinContent(i, time_h);
381  }
382  }
383 
384  return StatusCode::SUCCESS;
385  //Finally, we make maps of the average collected charge, in order to make charge chunking corrections later.
386  //TODO: talk to Ben about the above comment. Where is code?
387 }
388 
389 //=======================================
390 // G E T M O B I L I T Y
391 //=======================================
392 const std::pair<double, double> RadDamageUtil::getMobility(double electricField, double temperature) {
393  //Returns the electron/hole mobility *in the z direction*
394  //Note, this already includes the Hall scattering factor!
395  //These parameterizations come from C. Jacoboni et al., Solid-State Electronics 20 89. (1977) 77. (see also
396  // https://cds.cern.ch/record/684187/files/indet-2001-004.pdf).
397  //electrons
398  double vsat_e = 15.3 * pow(temperature, -0.87);// mm/ns
399  double ecrit_e = 1.01E-7 * pow(temperature, 1.55);// MV/mm
400  double beta_e = 2.57E-2 * pow(temperature, 0.66);//dimensionless
401  double r_e = 1.13 + 0.0008 * (temperature - 273.);//Hall scaling factor
402  //holes
403  double vsat_h = 1.62 * pow(temperature, -0.52);// mm/ns
404  double ecrit_h = 1.24E-7 * pow(temperature, 1.68);// MV/mm
405  double beta_h = 0.46 * pow(temperature, 0.17);
406  double r_h = 0.72 - 0.0005 * (temperature - 273.);
407 
408  double num_e = vsat_e / ecrit_e;
409  double den_e = pow(1 + pow((electricField / ecrit_e), beta_e), (1 / beta_e));
410  double mobility_e = r_e * num_e / den_e;
411 
412  double num_h = vsat_h / ecrit_h;
413  double den_h = pow(1 + pow((electricField / ecrit_h), beta_h), (1 / beta_h));
414  double mobility_h = r_h * num_h / den_h;
415 
416  return std::make_pair(mobility_e, mobility_h);
417 }
418 
419 //=======================================
420 // G E T L O R E N T Z A N G L E
421 //=======================================
422 //Taken from
423 // https://gitlab.cern.ch/radiationDamageDigitization/radDamage_athena_rel22/blob/rel22_radDamageDev_master/scripts/SaveMapsForAthena.C
424 double RadDamageUtil::getTanLorentzAngle(double electricField, double temperature, double bField, bool isHole) {
425  double hallEffect = 1.;//already in mobility//= 1.13 + 0.0008*(temperature - 273.0); //Hall Scattering Factor - taken
426  // from https://cds.cern.ch/record/684187/files/indet-2001-004.pdf
427 
428  if (isHole) hallEffect = 0.72 - 0.0005 * (temperature - 273.0);
429  std::pair<double, double> mobility = getMobility(electricField, temperature);
430  double mobility_object = mobility.first;
431  if (isHole) mobility_object = mobility.second;
432  double tanLorentz = hallEffect * mobility_object * bField * (1.0E-3); //unit conversion
433  return tanLorentz;
434 }
435 
436 //=======================================
437 // G E T T R A P P I N G T I M E
438 //=======================================
439 const std::pair<double, double> RadDamageUtil::getTrappingTimes(double fluence) const {
440  double trappingTimeElectrons(0.), trappingTimeHoles(0.);
441 
442  if (fluence != 0.0) {
443  trappingTimeElectrons = 1.0 / (m_betaElectrons * fluence); //Make memberVar
444  trappingTimeHoles = 1.0 / (m_betaHoles * fluence); //ns
445  } else {//fluence = 0 so do not trap!
446  trappingTimeElectrons = 1000; //~infinity
447  trappingTimeHoles = 1000;
448  }
449 
450  return std::make_pair(trappingTimeElectrons, trappingTimeHoles);
451 }
452 
454  return m_saveDebugMaps;
455 }
456 
457 //=======================================
458 // F I N A L I Z E
459 //=======================================
461  ATH_MSG_DEBUG("RadDamageUtil::finalize()");
462  return StatusCode::SUCCESS;
463 }
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
EfieldInterpolator.h
Instances of this class create a map (TH1D) describing the electric field profile along the pixeldept...
PlotCalibFromCool.norm
norm
Definition: PlotCalibFromCool.py:100
ymin
double ymin
Definition: listroot.cxx:63
GenEvent.h
RadDamageUtil::saveDebugMaps
bool saveDebugMaps()
Definition: RadDamageUtil.cxx:453
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
RadDamageUtil::generateRamoMap
const StatusCode generateRamoMap(TH3F *ramPotentialMap, InDetDD::PixelModuleDesign *module)
Definition: RadDamageUtil.cxx:58
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:48
RadDamageUtil::initialize
virtual StatusCode initialize() override
Definition: RadDamageUtil.cxx:44
SiHit.h
Monitored::Z
@ Z
Definition: HistogramFillerUtils.h:24
RadDamageUtil::getTanLorentzAngle
static double getTanLorentzAngle(double electricField, double temperature, double bField, bool isHole)
Definition: RadDamageUtil.cxx:424
initialize
void initialize()
Definition: run_EoverP.cxx:894
StateLessPT_NewConfig.Format
Format
Definition: StateLessPT_NewConfig.py:146
GenVertex.h
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
dirname
std::string dirname(std::string name)
Definition: utils.cxx:200
M_PI
#define M_PI
Definition: ActiveFraction.h:11
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
python.TrigEgammaMonitorHelper.TH2F
def TH2F(name, title, nxbins, bins_par2, bins_par3, bins_par4, bins_par5=None, bins_par6=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:45
x
#define x
GenParticle.h
RadDamageUtil::~RadDamageUtil
virtual ~RadDamageUtil()
Monitored::X
@ X
Definition: HistogramFillerUtils.h:24
python.PyAthena.module
module
Definition: PyAthena.py:134
RadDamageUtil::generateEfieldMap
const StatusCode generateEfieldMap(TH1F *&eFieldMap, InDetDD::PixelModuleDesign *module)
Definition: RadDamageUtil.cxx:214
RadDamageUtil::RadDamageUtil
RadDamageUtil()
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CheckAppliedSFs.e3
e3
Definition: CheckAppliedSFs.py:264
lumiFormat.i
int i
Definition: lumiFormat.py:92
xmin
double xmin
Definition: listroot.cxx:60
z
#define z
beamspotman.n
n
Definition: beamspotman.py:731
RadDamageUtil::getMobility
static const std::pair< double, double > getMobility(double electricField, double temperature)
Definition: RadDamageUtil.cxx:392
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
RadDamageUtil::m_fieldScale
Gaudi::Property< double > m_fieldScale
Definition: RadDamageUtil.h:77
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
RadDamageUtil::m_betaElectrons
Gaudi::Property< double > m_betaElectrons
Definition: RadDamageUtil.h:63
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
r_e
const std::string r_e
Definition: ASCIICondDbSvc.cxx:16
RadDamageUtil::m_defaultRamo
Gaudi::Property< int > m_defaultRamo
Definition: RadDamageUtil.h:58
RadDamageUtil::weighting2D
static double weighting2D(double x, double z, double Lx, double sensorThickness)
Definition: RadDamageUtil.cxx:195
Monitored::Y
@ Y
Definition: HistogramFillerUtils.h:24
RadDamageUtil::generateDistanceTimeMap
const StatusCode generateDistanceTimeMap(TH2F *&distanceMap_e, TH2F *&distanceMap_h, TH1F *&timeMap_e, TH1F *&timeMap_h, TH2F *&lorentzMap_e, TH2F *&lorentzMap_h, TH1F *&eFieldMap, InDetDD::PixelModuleDesign *module)
Definition: RadDamageUtil.cxx:283
PathResolver.h
RadDamageUtil::m_saveDebugMaps
Gaudi::Property< bool > m_saveDebugMaps
Definition: RadDamageUtil.h:73
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:191
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
RadDamageUtil::weighting3D
static double weighting3D(double x, double y, double z, int n, int m, int Nrep, double a, double b)
Definition: RadDamageUtil.cxx:155
RadDamageUtil::finalize
virtual StatusCode finalize() override
Definition: RadDamageUtil.cxx:460
SiDetectorElement.h
a
TList * a
Definition: liststreamerinfos.cxx:10
y
#define y
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PixelModuleDesign.h
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
CaloClusterCorr::interpolate
float interpolate(const CaloRec::Array< 2 > &a, float x, unsigned int degree, unsigned int ycol=1, const CaloRec::Array< 1 > &regions=CaloRec::Array< 1 >(), int n_points=-1, bool fixZero=false)
Polynomial interpolation in a table.
Definition: interpolate.cxx:75
xmax
double xmax
Definition: listroot.cxx:61
RadDamageUtil::alpha
static double alpha(int n, int Nrep, double a)
Definition: RadDamageUtil.cxx:146
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
RadDamageUtil::m_betaHoles
Gaudi::Property< double > m_betaHoles
Definition: RadDamageUtil.h:68
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
RadDamageUtil::m_EfieldInterpolator
ToolHandle< EfieldInterpolator > m_EfieldInterpolator
Definition: RadDamageUtil.h:84
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
RadDamageUtil.h
SiliconProperties.h
fitman.k
k
Definition: fitman.py:528
ymax
double ymax
Definition: listroot.cxx:64
RadDamageUtil::getTrappingTimes
const std::pair< double, double > getTrappingTimes(double fluence) const
Definition: RadDamageUtil.cxx:439