ATLAS Offline Software
Loading...
Searching...
No Matches
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"
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
33using namespace std;
34
35// Constructor with parameters:
36RadDamageUtil::RadDamageUtil(const std::string& type, const std::string& name, const IInterface* parent) :
37 AthAlgTool(type, name, parent) {}
38
40
41//=======================================
42// I N I T I A L I Z E
43//=======================================
45 ATH_CHECK(AthAlgTool::initialize());
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//=======================================
58const StatusCode RadDamageUtil::generateRamoMap(TH3F* ramoPotentialMap, InDetDD::PixelModuleDesign* module) {
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
146double 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
155double 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
195double 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//=========================================
214const StatusCode RadDamageUtil::generateEfieldMap(TH1F*& eFieldMap, InDetDD::PixelModuleDesign* module) {
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
237StatusCode RadDamageUtil::generateEfieldMap(TH1F*& eFieldMap, InDetDD::PixelModuleDesign* /*module*/, double fluence,
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
283const 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//=======================================
392const 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
424double 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//=======================================
439const 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
456
457//=======================================
458// F I N A L I Z E
459//=======================================
461 ATH_MSG_DEBUG("RadDamageUtil::finalize()");
462 return StatusCode::SUCCESS;
463}
const std::string r_e
#define M_PI
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
Instances of this class create a map (TH1D) describing the electric field profile along the pixeldept...
static Double_t a
This is an Identifier helper class for the Pixel subdetector.
#define y
#define x
#define z
constexpr int pow(int base, int exp) noexcept
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Class used to describe the design of a module (diode segmentation and readout scheme)
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
ToolHandle< EfieldInterpolator > m_EfieldInterpolator
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)
static double getTanLorentzAngle(double electricField, double temperature, double bField, bool isHole)
const StatusCode generateRamoMap(TH3F *ramPotentialMap, InDetDD::PixelModuleDesign *module)
virtual StatusCode initialize() override
Gaudi::Property< bool > m_saveDebugMaps
const std::pair< double, double > getTrappingTimes(double fluence) const
Gaudi::Property< double > m_fieldScale
static double alpha(int n, int Nrep, double a)
static double weighting2D(double x, double z, double Lx, double sensorThickness)
Gaudi::Property< double > m_betaElectrons
static double weighting3D(double x, double y, double z, int n, int m, int Nrep, double a, double b)
static const std::pair< double, double > getMobility(double electricField, double temperature)
const StatusCode generateEfieldMap(TH1F *&eFieldMap, InDetDD::PixelModuleDesign *module)
Gaudi::Property< int > m_defaultRamo
virtual StatusCode finalize() override
virtual ~RadDamageUtil()
Gaudi::Property< double > m_betaHoles
double xmax
Definition listroot.cxx:61
double ymin
Definition listroot.cxx:63
double xmin
Definition listroot.cxx:60
double ymax
Definition listroot.cxx:64
STL namespace.
std::string dirname(std::string name)
Definition utils.cxx:200