63 double sensorThickness =
module->thickness() * 1000.0;
68 double xmax = 2 * pitchX * 1000;
70 double ymax = 2 * pitchY * 1000;
74 ymax,
int(sensorThickness * 1000) / 10, 0., sensorThickness * 1000.);
79 for (
int k = 1; k <= ramoPotentialMap->GetNbinsZ(); k++) {
81 double z = ramoPotentialMap->GetZaxis()->GetBinCenter(k) - ramoPotentialMap->GetZaxis()->GetBinWidth(k) / 2.;
86 for (
int i = 1; i <= ramoPotentialMap->GetNbinsX(); i++) {
87 for (
int j = 1; j <= ramoPotentialMap->GetNbinsY(); j++) {
88 double x = ramoPotentialMap->GetXaxis()->GetBinCenter(i) - ramoPotentialMap->GetXaxis()->GetBinWidth(i) / 2.;
89 double y = ramoPotentialMap->GetYaxis()->GetBinCenter(j) - ramoPotentialMap->GetYaxis()->GetBinWidth(j) / 2.;
95 if (
x > (pitchX * 1000.0 * 0.5) ||
y > (pitchY * 1000.0 * 0.5)) {
96 ramoPotentialMap->SetBinContent(i, j, k, 0.01);
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));
106 ramoPotentialMap->SetBinContent(i, j, k, val);
114 double norm = exp(-par_a) + exp(-1.);
115 double val = exp(-par_a *
z / (1000 * sensorThickness)) + exp(-
z / (1000 * sensorThickness));
120 sensorThickness) * val /
122 sensorThickness) *
weighting2D(0,
z, pitchY, sensorThickness));
123 ramoPotentialMap->SetBinContent(i, j, k, productSolution);
129 double fullSolution =
weighting3D(
x / sensorThickness,
y / sensorThickness,
z / sensorThickness,
131 pitchY / sensorThickness);
133 ramoPotentialMap->SetBinContent(i, j, k, fullSolution);
138 return StatusCode::SUCCESS;
284 TH1F*& timeMap_h, TH2F*& lorentzMap_e, TH2F*& lorentzMap_h,
289 double temperature = 300;
294 double sensorThickness = 0.2;
297 if (eFieldMap->GetXaxis()->GetXmax() > 210) {
298 sensorThickness = 0.250;
301 sensorThickness =
module->thickness() * 1000.0;
307 distanceMap_e =
new TH2F(
"edistance",
"Electron Distance Map", 100, 0, sensorThickness, 1000, 0, 1000);
308 distanceMap_h =
new TH2F(
"hdistance",
"Holes Distance Map", 100, 0, sensorThickness, 1000, 0, 1000);
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);
313 distanceMap_e->SetBinContent(i, j, 0.);
318 timeMap_e =
new TH1F(
"etimes",
"Electron Time Map", 100, 0, sensorThickness);
319 timeMap_h =
new TH1F(
"htimes",
"Hole Time Map", 100, 0, sensorThickness);
324 lorentzMap_e =
new TH2F(
"lorentz_map_e",
"Lorentz Map e", 100, 0, sensorThickness, 100, 0, sensorThickness);
325 lorentzMap_h =
new TH2F(
"lorentz_map_h",
"Lorentz Map h", 100, 0, sensorThickness, 100, 0, sensorThickness);
326 ATH_MSG_DEBUG(
"Did not find time and/or distance maps. Will compute them from the E-field map..");
328 for (
int i = 1; i <= distanceMap_e->GetNbinsX(); i++) {
331 double distanceTravelled_e = 0;
332 double distanceTravelled_h = 0;
336 for (
int j = i; j >= 1; j--) {
337 double dz = distanceMap_e->GetXaxis()->GetBinWidth(j);
338 double z_j = distanceMap_e->GetXaxis()->GetBinCenter(j);
342 double Ez = eFieldMap->GetBinContent(eFieldMap->GetXaxis()->FindBin(z_j * 1000)) / 1e7;
343 std::pair<double, double> mu =
getMobility(Ez, temperature);
349 time_e += dz / (mu.first * Ez);
352 distanceMap_e->SetBinContent(i, distanceMap_e->GetYaxis()->FindBin(time_e), z_j);
354 drift_e += dz * tanLorentzAngle;
355 distanceTravelled_e += dz;
356 lorentzMap_e->SetBinContent(i, j, drift_e / distanceTravelled_e);
358 timeMap_e->SetBinContent(i, time_e);
362 for (
int j = i; j <= distanceMap_e->GetNbinsX(); j++) {
363 double dz = distanceMap_e->GetXaxis()->GetBinWidth(j);
365 double z_j = distanceMap_e->GetXaxis()->GetBinCenter(j);
366 double Ez = eFieldMap->GetBinContent(eFieldMap->GetXaxis()->FindBin(z_j * 1000)) / 1e7;
367 std::pair<double, double> mu =
getMobility(Ez, temperature);
373 time_h += dz / (mu.second * Ez);
374 distanceMap_h->SetBinContent(i, distanceMap_h->GetYaxis()->FindBin(time_h), z_j);
376 drift_h += dz * tanLorentzAngle;
377 distanceTravelled_h += dz;
378 lorentzMap_h->SetBinContent(i, j, drift_h / distanceTravelled_h);
380 timeMap_h->SetBinContent(i, time_h);
384 return StatusCode::SUCCESS;
398 double vsat_e = 15.3 *
pow(temperature, -0.87);
399 double ecrit_e = 1.01E-7 *
pow(temperature, 1.55);
400 double beta_e = 2.57E-2 *
pow(temperature, 0.66);
401 double r_e = 1.13 + 0.0008 * (temperature - 273.);
403 double vsat_h = 1.62 *
pow(temperature, -0.52);
404 double ecrit_h = 1.24E-7 *
pow(temperature, 1.68);
405 double beta_h = 0.46 *
pow(temperature, 0.17);
406 double r_h = 0.72 - 0.0005 * (temperature - 273.);
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;
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;
416 return std::make_pair(mobility_e, mobility_h);