15 #include "GaudiKernel/SystemOfUnits.h"
17 #include "CLHEP/Random/RandFlat.h"
18 #include "CLHEP/Random/RandGaussZiggurat.h"
20 #include "CLHEP/Units/PhysicalConstants.h"
57 return StatusCode::FAILURE;
61 constexpr std::size_t numberOfLayers = 2;
64 return StatusCode::FAILURE;
68 ATH_MSG_INFO(
"Reading histogram: " <<
i <<
" for charge correction needed for Pixel radiation damage simulation");
69 std::unique_ptr<TH1>
h(
file->Get<TH1>(
i.c_str()));
71 ATH_MSG_ERROR(
"Cannot read histogram " <<
i <<
" needed for charge correction");
72 return StatusCode::FAILURE;
75 h->SetDirectory(
nullptr);
84 return StatusCode::SUCCESS;
92 return StatusCode::SUCCESS;
102 std::vector< std::pair<double, double> >& trfHitRecord,
103 std::vector<double>& initialConditions,
104 CLHEP::HepRandomEngine* rndmEngine,
105 const EventContext &ctx) {
109 if (!p_design.
is3D()) {
110 return StatusCode::SUCCESS;
114 if (Module.
isPLR()) {
115 return StatusCode::SUCCESS;
118 return StatusCode::SUCCESS;
122 return StatusCode::SUCCESS;
125 return StatusCode::SUCCESS;
128 return StatusCode::SUCCESS;
133 if (initialConditions.size() != 8) {
134 ATH_MSG_ERROR(
"Starting coordinates were not filled correctly in EnergyDepositionSvc.");
135 return StatusCode::FAILURE;
138 double eta_0 = initialConditions[0];
139 double phi_0 = initialConditions[1];
140 double depth_0 = initialConditions[2];
141 double dEta = initialConditions[3];
142 double dPhi = initialConditions[4];
143 double dDepth = initialConditions[5];
144 double ncharges = initialConditions[6];
145 double iTotalLength = initialConditions[7];
155 const double x_bin_size = 0.001;
156 const double y_bin_size = 0.001;
160 double pixel_size_x = Module.
width() / p_design.
rows();
162 double module_size_x = Module.
width();
163 double module_size_y = Module.
length();
166 const double pHitTime =
hitTime(phit);
168 const int layerIndex = Module.
isBarrel() ? 0 : 1;
196 std::vector<double> DtElectron (ncharges, 0.);
197 std::vector<double> DtHole (ncharges, 0.);
198 std::vector<double> rdifElectron (ncharges, 0.);
199 std::vector<double> rdifHole (ncharges, 0.);
201 for (
const auto & iHitRecord : trfHitRecord) {
202 double eta_i = eta_0;
203 double phi_i = phi_0;
204 double depth_i = depth_0;
207 eta_i += 1.0 * iHitRecord.first / iTotalLength *
dEta;
208 phi_i += 1.0 * iHitRecord.first / iTotalLength *
dPhi;
209 depth_i += 1.0 * iHitRecord.first / iTotalLength * dDepth;
212 const double energy_per_step = 1.0 * iHitRecord.second / 1.E+6 / ncharges;
213 ATH_MSG_DEBUG(
"es_current: " << energy_per_step <<
" split between " << ncharges <<
" charges");
215 double dist_electrode = 0.5 * sensorThickness - Module.
design().
readoutSide() * depth_i;
216 if (dist_electrode < 0) dist_electrode = 0;
218 CLHEP::Hep3Vector chargepos;
219 chargepos.setX(phi_i);
220 chargepos.setY(eta_i);
221 chargepos.setZ(dist_electrode);
226 "ismoduleframe " <<
coord <<
" -- startPosition (x,y,z) = " << chargepos.x() <<
", " << chargepos.y() <<
", " <<
230 double x_new = chargepos.x() + 0.5*module_size_x;
231 double y_new = chargepos.y() + 0.5*module_size_y;
234 int nPixX =
int(x_new / pixel_size_x);
235 int nPixY =
int(y_new / pixel_size_y);
236 ATH_MSG_DEBUG(
" -- nPixX = " << nPixX <<
" nPixY = " << nPixY);
239 double x_pix = x_new - pixel_size_x * (nPixX);
240 double y_pix = y_new - pixel_size_y * (nPixY);
242 double x_pix_center = x_pix - pixel_size_x / 2;
243 double y_pix_center = y_pix - pixel_size_y / 2;
244 ATH_MSG_DEBUG(
" -- current hit position w.r.t. pixel corner = " << x_pix <<
" " << y_pix);
245 ATH_MSG_DEBUG(
" -- current hit position w.r.t. pixel center = " << x_pix_center <<
" " << y_pix_center);
252 ATH_MSG_DEBUG(
"Skipping since efield = 0 for x_pix = " << x_pix <<
" y_pix = " << y_pix);
256 const double mobilityElectron =
getMobility(efield,
false);
257 const double mobilityHole =
getMobility(efield,
true);
258 auto driftTimeElectron =
getDriftTime(
false, ncharges, rndmEngine);
259 auto driftTimeHole =
getDriftTime(
true, ncharges, rndmEngine);
261 double chunk_size = energy_per_step * eleholePairEnergy;
263 if (chunk_size < 1) chunk_size = 1;
264 const double kappa = 1. / std::sqrt(chunk_size);
272 const auto prefactor_e = mobilityElectron*0.024*
m_temperature / 273.;
273 const auto prefactor_h = mobilityHole*0.024*
m_temperature / 273.;
275 for(
size_t i = 0;
i < ncharges; ++
i) {
276 DtElectron[
i] = prefactor_e *
std::min(driftTimeElectron[
i], timeToElectrodeElectron);
277 DtHole[
i] = prefactor_h *
std::min(driftTimeHole[
i], timeToElectrodeHole);
278 rdifElectron[
i] = 1
e-3*std::sqrt(DtElectron[
i]);
279 rdifHole[
i] = 1
e-3*std::sqrt(DtHole[
i]);
292 const std::size_t ramo_init_bin_y_pi = ramoPotentialMap.
getBinY(1000*(x_pix + pixel_size_x * 2));
293 const std::size_t ramo_init_bin_y_zi = ramoPotentialMap.
getBinY(1000*(x_pix + pixel_size_x * 3));
294 const std::size_t ramo_init_bin_y_mi = ramoPotentialMap.
getBinY(1000*(x_pix + pixel_size_x * 4));
297 const std::size_t ramo_init_bin_x_pj = ramoPotentialMap.
getBinX(1000*(y_pix - 0.5*pixel_size_y));
298 const std::size_t ramo_init_bin_x_zj = ramoPotentialMap.
getBinX(1000*(y_pix + 0.5*pixel_size_y));
299 const std::size_t ramo_init_bin_x_mj = ramoPotentialMap.
getBinX(1000*(y_pix + 1.5*pixel_size_y));
302 float ramoInit_pipj = ramoPotentialMap.
getContent(ramo_init_bin_x_pj, ramo_init_bin_y_pi);
303 float ramoInit_pizj = ramoPotentialMap.
getContent(ramo_init_bin_x_zj, ramo_init_bin_y_pi);
304 float ramoInit_pimj = ramoPotentialMap.
getContent(ramo_init_bin_x_mj, ramo_init_bin_y_pi);
305 float ramoInit_zipj = ramoPotentialMap.
getContent(ramo_init_bin_x_pj, ramo_init_bin_y_zi);
306 float ramoInit_zizj = ramoPotentialMap.
getContent(ramo_init_bin_x_zj, ramo_init_bin_y_zi);
307 float ramoInit_zimj = ramoPotentialMap.
getContent(ramo_init_bin_x_mj, ramo_init_bin_y_zi);
308 float ramoInit_mipj = ramoPotentialMap.
getContent(ramo_init_bin_x_pj, ramo_init_bin_y_mi);
309 float ramoInit_mizj = ramoPotentialMap.
getContent(ramo_init_bin_x_zj, ramo_init_bin_y_mi);
310 float ramoInit_mimj = ramoPotentialMap.
getContent(ramo_init_bin_x_mj, ramo_init_bin_y_mi);
312 const auto hit_time =
hitTime(phit);
315 for (
int j = 0; j < ncharges; j++) {
317 int extraNPixXElectron = nPixX;
318 int extraNPixYElectron = nPixY;
319 int extraNPixXHole = nPixX;
320 int extraNPixYHole = nPixY;
323 std::array<double, 4> randomNumbers{};
324 CLHEP::RandGaussZiggurat::shootArray(rndmEngine, 4, randomNumbers.data());
326 double xposDiffElectron = x_pix + rdifElectron[j] * randomNumbers[0];
327 double yposDiffElectron = y_pix + rdifElectron[j] * randomNumbers[1];
328 double xposDiffHole = x_pix + rdifHole[j] * randomNumbers[2];
329 double yposDiffHole = y_pix + rdifHole[j] * randomNumbers[3];
332 while (xposDiffElectron > pixel_size_x) {
333 extraNPixXElectron++;
334 xposDiffElectron -= pixel_size_x;
336 while (xposDiffElectron < 0) {
337 extraNPixXElectron--;
338 xposDiffElectron += pixel_size_x;
340 while (yposDiffElectron > pixel_size_y) {
341 extraNPixYElectron++;
342 yposDiffElectron -= pixel_size_y;
344 while (yposDiffElectron < 0) {
345 extraNPixYElectron--;
346 yposDiffElectron += pixel_size_y;
350 while (xposDiffHole > pixel_size_x) {
352 xposDiffHole -= pixel_size_x;
354 while (xposDiffHole < 0) {
356 xposDiffHole += pixel_size_x;
358 while (yposDiffHole > pixel_size_y) {
360 yposDiffHole -= pixel_size_y;
362 while (yposDiffHole < 0) {
364 yposDiffHole += pixel_size_y;
366 auto xposFinalElectron = yPositionMap_e.
getContent(
367 yPositionMap_e.
getBinX(1
e3*yposDiffElectron),
368 yPositionMap_e.
getBinY(1
e3*xposDiffElectron),
369 yPositionMap_e.
getBinZ(
std::min(driftTimeElectron[j],timeToElectrodeElectron))
371 auto yposFinalElectron = xPositionMap_e.
getContent(
372 xPositionMap_e.
getBinX(1
e3*yposDiffElectron),
373 xPositionMap_e.
getBinY(1
e3*xposDiffElectron),
374 xPositionMap_e.
getBinZ(
std::min(driftTimeElectron[j],timeToElectrodeElectron))
377 auto xposFinalHole = yPositionMap_h.
getContent(
378 yPositionMap_h.
getBinX(1
e3*yposDiffHole),
379 yPositionMap_h.
getBinY(1
e3*xposDiffHole),
382 auto yposFinalHole = xPositionMap_h.
getContent(
383 xPositionMap_h.
getBinX(1
e3*yposDiffHole),
384 xPositionMap_h.
getBinY(1
e3*xposDiffHole),
390 const std::size_t ramo_final_bin_y_pi_electrons = ramoPotentialMap.
getBinY(1000*(xposFinalElectron + pixel_size_x * 2));
391 const std::size_t ramo_final_bin_y_pi_holes = ramoPotentialMap.
getBinY(1000*(xposFinalHole + pixel_size_x * 2));
392 const std::size_t ramo_final_bin_y_zi_electrons = ramoPotentialMap.
getBinY(1000*(xposFinalElectron + pixel_size_x * 3));
393 const std::size_t ramo_final_bin_y_zi_holes = ramoPotentialMap.
getBinY(1000*(xposFinalHole + pixel_size_x * 3));
394 const std::size_t ramo_final_bin_y_mi_electrons = ramoPotentialMap.
getBinY(1000*(xposFinalElectron + pixel_size_x * 4));
395 const std::size_t ramo_final_bin_y_mi_holes = ramoPotentialMap.
getBinY(1000*(xposFinalHole + pixel_size_x * 4));
397 const std::size_t ramo_final_bin_x_pj_electrons = ramoPotentialMap.
getBinX(1000*(yposFinalElectron - 0.5*pixel_size_y));
398 const std::size_t ramo_final_bin_x_pj_holes = ramoPotentialMap.
getBinX(1000*(yposFinalHole - 0.5*pixel_size_y));
399 const std::size_t ramo_final_bin_x_zj_electrons = ramoPotentialMap.
getBinX(1000*(yposFinalElectron + 0.5*pixel_size_y));
400 const std::size_t ramo_final_bin_x_zj_holes = ramoPotentialMap.
getBinX(1000*(yposFinalHole + 0.5*pixel_size_y));
401 const std::size_t ramo_final_bin_x_mj_electrons = ramoPotentialMap.
getBinX(1000*(yposFinalElectron + 1.5*pixel_size_y));
402 const std::size_t ramo_final_bin_x_mj_holes = ramoPotentialMap.
getBinX(1000*(yposFinalHole + 1.5*pixel_size_y));
404 float ramoFinal_pipj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_pj_electrons, ramo_final_bin_y_pi_electrons);
405 float ramoFinal_pizj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_zj_electrons, ramo_final_bin_y_pi_electrons);
406 float ramoFinal_pimj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_mj_electrons, ramo_final_bin_y_pi_electrons);
407 float ramoFinal_zipj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_pj_electrons, ramo_final_bin_y_zi_electrons);
408 float ramoFinal_zizj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_zj_electrons, ramo_final_bin_y_zi_electrons);
409 float ramoFinal_zimj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_mj_electrons, ramo_final_bin_y_zi_electrons);
410 float ramoFinal_mipj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_pj_electrons, ramo_final_bin_y_mi_electrons);
411 float ramoFinal_mizj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_zj_electrons, ramo_final_bin_y_mi_electrons);
412 float ramoFinal_mimj_electrons = ramoPotentialMap.
getContent(ramo_final_bin_x_mj_electrons, ramo_final_bin_y_mi_electrons);
414 float ramoFinal_pipj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_pj_holes, ramo_final_bin_y_pi_holes);
415 float ramoFinal_pizj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_zj_holes, ramo_final_bin_y_pi_holes);
416 float ramoFinal_pimj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_mj_holes, ramo_final_bin_y_pi_holes);
417 float ramoFinal_zipj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_pj_holes, ramo_final_bin_y_zi_holes);
418 float ramoFinal_zizj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_zj_holes, ramo_final_bin_y_zi_holes);
419 float ramoFinal_zimj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_mj_holes, ramo_final_bin_y_zi_holes);
420 float ramoFinal_mipj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_pj_holes, ramo_final_bin_y_mi_holes);
421 float ramoFinal_mizj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_zj_holes, ramo_final_bin_y_mi_holes);
422 float ramoFinal_mimj_holes = ramoPotentialMap.
getContent(ramo_final_bin_x_mj_holes, ramo_final_bin_y_mi_holes);
425 double eHitRamo_pipj_electrons = energy_per_step * (ramoFinal_pipj_electrons - ramoInit_pipj);
426 double eHitRamo_pipj_holes = -1. * energy_per_step * (ramoFinal_pipj_holes - ramoInit_pipj);
427 double eHitRamo_pizj_electrons = energy_per_step * (ramoFinal_pizj_electrons - ramoInit_pizj);
428 double eHitRamo_pizj_holes = -1. * energy_per_step * (ramoFinal_pizj_holes - ramoInit_pizj);
429 double eHitRamo_pimj_electrons = energy_per_step * (ramoFinal_pimj_electrons - ramoInit_pimj);
430 double eHitRamo_pimj_holes = -1. * energy_per_step * (ramoFinal_pimj_holes - ramoInit_pimj);
431 double eHitRamo_zipj_electrons = energy_per_step * (ramoFinal_zipj_electrons - ramoInit_zipj);
432 double eHitRamo_zipj_holes = -1. * energy_per_step * (ramoFinal_zipj_holes - ramoInit_zipj);
433 double eHitRamo_zizj_electrons = energy_per_step * (ramoFinal_zizj_electrons - ramoInit_zizj);
434 double eHitRamo_zizj_holes = -1. * energy_per_step * (ramoFinal_zizj_holes - ramoInit_zizj);
435 double eHitRamo_zimj_electrons = energy_per_step * (ramoFinal_zimj_electrons - ramoInit_zimj);
436 double eHitRamo_zimj_holes = -1. * energy_per_step * (ramoFinal_zimj_holes - ramoInit_zimj);
437 double eHitRamo_mipj_electrons = energy_per_step * (ramoFinal_mipj_electrons - ramoInit_mipj);
438 double eHitRamo_mipj_holes = -1. * energy_per_step * (ramoFinal_mipj_holes - ramoInit_mipj);
439 double eHitRamo_mizj_electrons = energy_per_step * (ramoFinal_mizj_electrons - ramoInit_mizj);
440 double eHitRamo_mizj_holes = -1. * energy_per_step * (ramoFinal_mizj_holes - ramoInit_mizj);
441 double eHitRamo_mimj_electrons = energy_per_step * (ramoFinal_mimj_electrons - ramoInit_mimj);
442 double eHitRamo_mimj_holes = -1. * energy_per_step * (ramoFinal_mimj_holes - ramoInit_mimj);
444 if(doChunkCorrection) {
445 eHitRamo_pipj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_pipj_electrons - energy_per_step * average_chargeElectron);
446 eHitRamo_pipj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_pipj_holes - energy_per_step * average_chargeHole);
447 eHitRamo_pizj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_pizj_electrons - energy_per_step * average_chargeElectron);
448 eHitRamo_pizj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_pizj_holes - energy_per_step * average_chargeHole);
449 eHitRamo_pimj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_pimj_electrons - energy_per_step * average_chargeElectron);
450 eHitRamo_pimj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_pimj_holes - energy_per_step * average_chargeHole);
451 eHitRamo_zipj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_zipj_electrons - energy_per_step * average_chargeElectron);
452 eHitRamo_zipj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_zipj_holes - energy_per_step * average_chargeHole);
453 eHitRamo_zizj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_zizj_electrons - energy_per_step * average_chargeElectron);
454 eHitRamo_zizj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_zizj_holes - energy_per_step * average_chargeHole);
455 eHitRamo_zimj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_zimj_electrons - energy_per_step * average_chargeElectron);
456 eHitRamo_pimj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_pimj_holes - energy_per_step * average_chargeHole);
457 eHitRamo_mipj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_mipj_electrons - energy_per_step * average_chargeElectron);
458 eHitRamo_mipj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_mipj_holes - energy_per_step * average_chargeHole);
459 eHitRamo_mizj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_mizj_electrons - energy_per_step * average_chargeElectron);
460 eHitRamo_mizj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_mizj_holes - energy_per_step * average_chargeHole);
461 eHitRamo_mimj_electrons = energy_per_step * average_chargeElectron + kappa * (eHitRamo_mimj_electrons - energy_per_step * average_chargeElectron);
462 eHitRamo_mimj_holes = energy_per_step * average_chargeHole + kappa * (eHitRamo_mimj_holes - energy_per_step * average_chargeHole);
468 double x_mod_pi_electrons = x_pix + pixel_size_x * extraNPixXElectron - 0.5*module_size_x + pixel_size_x;
469 double y_mod_pj_electrons = y_pix + pixel_size_y * extraNPixYElectron - 0.5*module_size_y + pixel_size_y;
470 double x_mod_pi_holes = x_pix + pixel_size_x * extraNPixXHole - 0.5*module_size_x + pixel_size_x;
471 double y_mod_pj_holes = y_pix + pixel_size_y * extraNPixYHole - 0.5*module_size_y + pixel_size_y;
472 double x_mod_zi_electrons = x_pix + pixel_size_x * extraNPixXElectron - 0.5*module_size_x;
473 double y_mod_zj_electrons = y_pix + pixel_size_y * extraNPixYElectron - 0.5*module_size_y;
474 double x_mod_zi_holes = x_pix + pixel_size_x * extraNPixXHole - 0.5*module_size_x;
475 double y_mod_zj_holes = y_pix + pixel_size_y * extraNPixYHole - 0.5*module_size_y;
476 double x_mod_mi_electrons = x_pix + pixel_size_x * extraNPixXElectron - 0.5*module_size_x - pixel_size_x;
477 double y_mod_mj_electrons = y_pix + pixel_size_y * extraNPixYElectron - 0.5*module_size_y - pixel_size_y;
478 double x_mod_mi_holes = x_pix + pixel_size_x * extraNPixXHole - 0.5*module_size_x - pixel_size_x;
479 double y_mod_mj_holes = y_pix + pixel_size_y * extraNPixYHole - 0.5*module_size_y - pixel_size_y;
523 auto addCharge = [&Module, &chargedDiodes](
SiSurfaceCharge const & scharge) {
531 addCharge(scharge_pipj_electrons);
532 addCharge(scharge_pizj_electrons);
533 addCharge(scharge_pimj_electrons);
534 addCharge(scharge_zipj_electrons);
535 addCharge(scharge_zizj_electrons);
536 addCharge(scharge_zimj_electrons);
537 addCharge(scharge_mipj_electrons);
538 addCharge(scharge_mizj_electrons);
539 addCharge(scharge_mimj_electrons);
540 addCharge(scharge_pipj_holes);
541 addCharge(scharge_pizj_holes);
542 addCharge(scharge_pimj_holes);
543 addCharge(scharge_zipj_holes);
544 addCharge(scharge_zizj_holes);
545 addCharge(scharge_zimj_holes);
546 addCharge(scharge_mipj_holes);
547 addCharge(scharge_mizj_holes);
548 addCharge(scharge_mimj_holes);
554 for (
const auto& iHitRecord : trfHitRecord) {
555 double eta_i = eta_0;
556 double phi_i = phi_0;
557 double depth_i = depth_0;
560 eta_i += 1.0 * iHitRecord.first / iTotalLength *
dEta;
561 phi_i += 1.0 * iHitRecord.first / iTotalLength *
dPhi;
562 depth_i += 1.0 * iHitRecord.first / iTotalLength * dDepth;
565 double es_current = 1.0 * iHitRecord.second / 1.E+6;
567 double dist_electrode = 0.5 * sensorThickness - Module.
design().
readoutSide() * depth_i;
568 if (dist_electrode < 0) dist_electrode = 0;
570 CLHEP::Hep3Vector chargepos;
571 chargepos.setX(phi_i);
572 chargepos.setY(eta_i);
573 chargepos.setZ(dist_electrode);
578 "ismoduleframe " <<
coord <<
" -- startPosition (x,y,z) = " << chargepos.x() <<
", " << chargepos.y() <<
", " <<
582 const double x_new = chargepos.x() + 0.5*module_size_x;
583 const double y_new = chargepos.y() + 0.5*module_size_y;
586 const int nPixX =
int(x_new / pixel_size_x);
587 const int nPixY =
int(y_new / pixel_size_y);
588 ATH_MSG_DEBUG(
" -- nPixX = " << nPixX <<
" nPixY = " << nPixY);
589 const double x_pix = x_new - pixel_size_x * (nPixX);
590 const double y_pix = y_new - pixel_size_y * (nPixY);
592 const double x_pix_center = x_pix - pixel_size_x / 2;
593 const double y_pix_center = y_pix - pixel_size_y / 2;
594 ATH_MSG_DEBUG(
" -- current hit position w.r.t. pixel center = " << x_pix_center <<
" " << y_pix_center);
602 const double ed = es_current * eleholePairEnergy * chargeCorrection;
605 const double x_mod = x_pix_center + 0.5*pixel_size_x + pixel_size_x * nPixX - 0.5*module_size_x;
606 const double y_mod = y_pix_center + 0.5*pixel_size_y + pixel_size_y * nPixY - 0.5*module_size_y;
621 for (
const auto& iHitRecord : trfHitRecord) {
622 double eta_i = eta_0;
623 double phi_i = phi_0;
624 double depth_i = depth_0;
627 eta_i += 1.0 * iHitRecord.first / iTotalLength *
dEta;
628 phi_i += 1.0 * iHitRecord.first / iTotalLength *
dPhi;
629 depth_i += 1.0 * iHitRecord.first / iTotalLength * dDepth;
632 double es_current = 1.0 * iHitRecord.second / 1.E+6;
634 double dist_electrode = 0.5 * sensorThickness - Module.
design().
readoutSide() * depth_i;
635 if (dist_electrode < 0) dist_electrode = 0;
637 CLHEP::Hep3Vector chargepos;
638 chargepos.setX(phi_i);
639 chargepos.setY(eta_i);
640 chargepos.setZ(dist_electrode);
645 "ismoduleframe " <<
coord <<
" -- startPosition (x,y,z) = " << chargepos.x() <<
", " << chargepos.y() <<
", " <<
649 double x_new = chargepos.x() + 0.5*module_size_x;
650 double y_new = chargepos.y() + 0.5*module_size_y;
653 int nPixX =
int(x_new / pixel_size_x);
654 int nPixY =
int(y_new / pixel_size_y);
655 ATH_MSG_DEBUG(
" -- nPixX = " << nPixX <<
" nPixY = " << nPixY);
656 double x_pix = x_new - pixel_size_x * (nPixX);
657 double y_pix = y_new - pixel_size_y * (nPixY);
659 double x_pix_center = x_pix - pixel_size_x / 2;
660 double y_pix_center = y_pix - pixel_size_y / 2;
661 ATH_MSG_DEBUG(
" -- current hit position w.r.t. pixel center = " << x_pix_center <<
" " << y_pix_center);
665 CLHEP::Hep3Vector pos_neighbor;
668 for (
int i = -1;
i <= 1;
i++) {
669 x_neighbor = x_pix_center -
i * pixel_size_x;
671 for (
int j = -1; j <= 1; j++) {
672 y_neighbor = y_pix_center - j * pixel_size_y;
675 if ((std::abs(x_neighbor) < pixel_size_x) && (std::abs(y_neighbor) < pixel_size_y)) {
678 double x_neighbor_map = x_neighbor + pixel_size_x;
679 double y_neighbor_map = y_neighbor + pixel_size_y;
681 int x_bin_cc_map = x_neighbor_map / x_bin_size;
682 int y_bin_cc_map = y_neighbor_map / y_bin_size;
687 if (ccprob_neighbor == -1.)
return StatusCode::FAILURE;
689 double ed = es_current * eleholePairEnergy * ccprob_neighbor;
692 double x_mod = x_neighbor + 0.5*pixel_size_x + pixel_size_x * nPixX - 0.5*module_size_x;
693 double y_mod = y_neighbor + 0.5*pixel_size_y + pixel_size_y * nPixY - 0.5*module_size_y;
709 return StatusCode::SUCCESS;
715 const std::string&
fileName = fileE;
719 return StatusCode::FAILURE;
723 if (myfile.is_open()) {
725 while (myfile.good()) {
726 while (std::getline(myfile,
line)) {
727 std::istringstream sline(
line);
730 sline >> xpos >> ypos >>
prob;
731 if (
fileName.find(
"FEI4") != std::string::npos) {
733 ATH_MSG_DEBUG(
"FEI4 inside xpos " << xpos <<
" ypos " << ypos <<
" prob " <<
prob);
734 }
else if (
fileName.find(
"FEI3") != std::string::npos) {
736 ATH_MSG_DEBUG(
"FEI3 inside xpos " << xpos <<
" ypos " << ypos <<
" prob " <<
prob);
738 ATH_MSG_ERROR(
"Please check name of Charge Coll Prob Maps! (should contain FEI3 or FEI4) ");
739 return StatusCode::FAILURE;
745 return StatusCode::SUCCESS;
750 if (readout ==
"FEI4") {
753 "read full probMap FEI4 --- bin x " <<
it.first.first <<
" bin y " <<
it.first.second <<
" prob " <<
756 }
else if (readout ==
"FEI3") {
759 "read full probMap FEI3 --- bin x " <<
it.first.first <<
" bin y " <<
it.first.second <<
" prob " <<
763 ATH_MSG_ERROR(
"Error in printout Charge Coll Prob Maps! (readout should contain FEI3 or FEI4 strings) ");
764 return StatusCode::FAILURE;
766 return StatusCode::SUCCESS;
771 std::pair<int, int> doublekey(binx, biny);
774 std::multimap<std::pair<int, int>,
double>::const_iterator iter =
m_probMapFEI4.find(doublekey);
775 echarge = iter->second;
777 std::multimap<std::pair<int, int>,
double>::const_iterator iter =
m_probMapFEI3.find(doublekey);
778 echarge = iter->second;
780 ATH_MSG_ERROR(
"No Map Entry available for the requested readout");
813 CLHEP::HepRandomEngine* rndmEngine)
815 std::vector<double>
rand (
n, 0.);
816 std::vector<double>
result (
n, 0.);
817 CLHEP::RandFlat::shootArray(rndmEngine,
n,
rand.data(), 0., 1.);
818 for(
size_t i = 0;
i <
n;
i++) {