diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx index 1bbb33b98eef2bba39409a7ad941e487700718a0..7b0a36dcd162fa33896da8c6032c5f34375f7593 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx @@ -240,8 +240,6 @@ StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit>& phit, const double x_bin_size = 0.001; const double y_bin_size = 0.001; - std::string readout; - // determine which readout is used // FEI4 : 50 X 250 microns double pixel_size_x = Module.width() / p_design.rows(); @@ -316,6 +314,9 @@ StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit>& phit, continue; } + const double mobilityElectron = getMobility(efield, false); + const double mobilityHole = getMobility(efield, true); + //Loop over charge-carrier pairs for (int j = 0; j < ncharges; j++) { if (m_doRadDamage && m_fluence > 0) { @@ -329,25 +330,23 @@ StatusCode SensorSim3DTool::induceCharge(const TimedHitPtr<SiHit>& phit, // Loop over everything twice: once for electrons and once for holes for (int eholes = 0; eholes < 2; eholes++) { - bool isHole = false; // Set a condition to keep track of electron/hole-specific functions - if (eholes == 1) isHole = true; + const bool isHole = (eholes == 1); // Set a condition to keep track of electron/hole-specific functions // Reset extraPixel coordinates each time through loop extraNPixX = nPixX; extraNPixY = nPixY; - double timeToElectrode = getTimeToElectrode(y_pix, x_pix, isHole); - double driftTime = getDriftTime(isHole); + const double timeToElectrode = getTimeToElectrode(y_pix, x_pix, isHole); + const double driftTime = getDriftTime(isHole); //Apply drift due to diffusion - double phiRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); + const double phiRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); //Apply diffusion. rdif is teh max. diffusion - double Dt = - getMobility(efield, isHole) * (0.024) * std::min(driftTime, timeToElectrode) * m_temperature / 273.; - double rdif = 1e-3*std::sqrt(Dt); //in mm + const double Dt = (isHole ? mobilityHole : mobilityElectron) * (0.024) * std::min(driftTime, timeToElectrode) * m_temperature / 273.; + const double rdif = 1e-3*std::sqrt(Dt); //in mm double xposDiff = x_pix + rdif * phiRand; - double etaRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); + const double etaRand = CLHEP::RandGaussZiggurat::shoot(rndmEngine); double yposDiff = y_pix + rdif * etaRand; // Account for drifting into another pixel @@ -608,15 +607,14 @@ double SensorSim3DTool::getMobility(double electricField, bool isHoleBit) { //These parameterizations come from C. Jacoboni et al., Solid-State Electronics 20 (1977) 77-89. (see also // https://cds.cern.ch/record/684187/files/indet-2001-004.pdf). - if (!isHoleBit) { - vsat = 15.3 * std::pow(m_temperature, -0.87); // mm/ns - ecrit = 1.01E-7 * std::pow(m_temperature, 1.55); // MV/mm - beta = 2.57E-2 * std::pow(m_temperature, 0.66); - } if (isHoleBit) { vsat = 1.62 * std::pow(m_temperature, -0.52); // mm/ns ecrit = 1.24E-7 * std::pow(m_temperature, 1.68); // MV/mm beta = 0.46 * std::pow(m_temperature, 0.17); + } else { + vsat = 15.3 * std::pow(m_temperature, -0.87); // mm/ns + ecrit = 1.01E-7 * std::pow(m_temperature, 1.55); // MV/mm + beta = 2.57E-2 * std::pow(m_temperature, 0.66); } double mobility = (vsat / ecrit) / std::pow(1 + std::pow((electricField / ecrit), beta), (1 / beta)); @@ -627,8 +625,11 @@ double SensorSim3DTool::getDriftTime(bool isHoleBit) { double u = CLHEP::RandFlat::shoot(0., 1.); // double driftTime = 0; - if (!isHoleBit) driftTime = (-1.) * m_trappingTimeElectrons * TMath::Log(u); // ns - if (isHoleBit) driftTime = (-1.) * m_trappingTimeHoles * TMath::Log(u); // ns + if (isHoleBit) { + driftTime = (-1.) * m_trappingTimeHoles * std::log(u); // ns + } else { + driftTime = (-1.) * m_trappingTimeElectrons * std::log(u); // ns + } return driftTime; } @@ -645,7 +646,7 @@ double SensorSim3DTool::getTimeToElectrode(double x, double y, bool isHoleBit) { double SensorSim3DTool::getTrappingPositionX(double initX, double initY, double driftTime, bool isHoleBit) { std::size_t index = 0; - double finalX = initX; + double finalX(0); if (!isHoleBit) { finalX = m_xPositionMap_e[index].getContent(m_xPositionMap_e[index].getBinX(1e3*initX), m_xPositionMap_e[index].getBinY(1e3*initY), m_xPositionMap_e[index].getBinZ(driftTime)); } else { @@ -657,7 +658,7 @@ double SensorSim3DTool::getTrappingPositionX(double initX, double initY, double double SensorSim3DTool::getTrappingPositionY(double initX, double initY, double driftTime, bool isHoleBit) { std::size_t index = 0; - double finalY = initY; + double finalY(0); if (!isHoleBit) { finalY = m_yPositionMap_e[index].getContent(m_yPositionMap_e[index].getBinX(1e3*initX), m_yPositionMap_e[index].getBinY(1e3*initY), m_yPositionMap_e[index].getBinZ(driftTime)); } else { diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx index bd72e4a0130c8b6e6d77a68ed2e2425863a4bab1..e40892136fd89c18291500d021aea3937ff0cc11 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx @@ -385,8 +385,8 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit>& phit, for (int q = nnLoop_pixelPhiMin; q <= nnLoop_pixelPhiMax; q++) { //Since both e-h charge carriers start in the same place, they have the same initial ramo value //Centre of nearest neighbour (nn) pixel - SiLocalPosition centreOfPixel_nn = p_design.positionFromColumnRow(pixel_i.etaIndex() - p, - pixel_i.phiIndex() - q); + const SiLocalPosition& centreOfPixel_nn = p_design.positionFromColumnRow(pixel_i.etaIndex() - p, + pixel_i.phiIndex() - q); //What is the displacement of the nn pixel from the primary pixel. //This is to index the correct entry in the Ramo weighting potential map @@ -415,24 +415,21 @@ StatusCode SensorSimPlanarTool::induceCharge(const TimedHitPtr<SiHit>& phit, double ramo_f_e = 0.0; double ramo_f_h = 0.0; - if (!isFirstZ_e) { - ramo_f_e = ramoPotentialMap.getContent(ramoPotentialMap.getBinX(1e3*dPhi_f_e), ramoPotentialMap.getBinY(1e3*dEta_f_e), ramo_f_e_bin_z); - } - - if (!isOverflowZ_h) { - ramo_f_h = ramoPotentialMap.getContent(ramoPotentialMap.getBinX(dPhi_f_h), ramoPotentialMap.getBinY(dEta_f_h), ramo_f_h_bin_z); - } - //Account for the imperfect binning that would cause charge to be double-counted - if (isOverflowZ_h) { - ramo_f_h = 0; - } - if (isFirstZ_e) { if (dEta_f_e >= 0.5*Module.etaPitch() || dPhi_f_e >= 0.5*Module.phiPitch()) { ramo_f_e = 0.0; } else if (dEta_f_e < 0.5*Module.etaPitch() && dPhi_f_e < 0.5*Module.phiPitch()) { ramo_f_e = 1.0; } + } else { + ramo_f_e = ramoPotentialMap.getContent(ramoPotentialMap.getBinX(1e3*dPhi_f_e), ramoPotentialMap.getBinY(1e3*dEta_f_e), ramo_f_e_bin_z); + } + + //Account for the imperfect binning that would cause charge to be double-counted + if (isOverflowZ_h) { + ramo_f_h = 0; + } else { + ramo_f_h = ramoPotentialMap.getContent(ramoPotentialMap.getBinX(dPhi_f_h), ramoPotentialMap.getBinY(dEta_f_h), ramo_f_h_bin_z); } //Given final position of charge carrier, find induced charge. The difference in Ramo weighting potential