CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
Pixel3DDigitizerAlgorithm Class Reference

#include <Pixel3DDigitizerAlgorithm.h>

Inheritance diagram for Pixel3DDigitizerAlgorithm:
Phase2TrackerDigitizerAlgorithm

Public Member Functions

std::vector
< DigitizerUtility::EnergyDepositUnit
diffusion (const LocalPoint &pos, const float &ncarriers, const std::function< LocalVector(float, float)> &u_drift, const std::pair< float, float > pitches, const float &thickness) const
 
std::vector
< DigitizerUtility::SignalPoint
drift (const PSimHit &hit, const Phase2TrackerGeomDetUnit *pixdet, const GlobalVector &bfield, const std::vector< DigitizerUtility::EnergyDepositUnit > &ionization_points) const override
 
std::vector
< DigitizerUtility::SignalPoint
drift (const PSimHit &hit, const Phase2TrackerGeomDetUnit *pixdet, const GlobalVector &bfield, const std::vector< DigitizerUtility::EnergyDepositUnit > &ionization_points, bool diffusion_activated) const
 
void induce_signal (const PSimHit &hit, const size_t hitIndex, const uint32_t tofBin, const Phase2TrackerGeomDetUnit *pixdet, const std::vector< DigitizerUtility::SignalPoint > &collection_points) override
 
void init (const edm::EventSetup &es) override
 
 Pixel3DDigitizerAlgorithm (const edm::ParameterSet &conf, edm::ConsumesCollector iC)
 
bool select_hit (const PSimHit &hit, double tCorr, double &sigScale) const override
 
 ~Pixel3DDigitizerAlgorithm () override
 
- Public Member Functions inherited from Phase2TrackerDigitizerAlgorithm
virtual void accumulateSimHits (const std::vector< PSimHit >::const_iterator inputBegin, const std::vector< PSimHit >::const_iterator inputEnd, const size_t inputBeginGlobalIndex, const uint32_t tofBin, const Phase2TrackerGeomDetUnit *pixdet, const GlobalVector &bfield)
 
virtual void digitize (const Phase2TrackerGeomDetUnit *pixdet, std::map< int, DigitizerUtility::DigiSimInfo > &digi_map, const TrackerTopology *tTopo)
 
virtual void initializeEvent (CLHEP::HepRandomEngine &eng)
 
virtual bool isAboveThreshold (const DigitizerUtility::SimHitInfo *hitInfo, float charge, float thr) const
 
void loadAccumulator (uint32_t detId, const std::map< int, float > &accumulator)
 
 Phase2TrackerDigitizerAlgorithm (const edm::ParameterSet &conf_common, const edm::ParameterSet &conf_specific, edm::ConsumesCollector iC)
 
virtual ~Phase2TrackerDigitizerAlgorithm ()
 

Private Member Functions

const bool is_inside_n_column_ (const LocalPoint &p, const float &sensor_thickness) const
 
const bool is_inside_ohmic_column_ (const LocalPoint &p, const std::pair< float, float > &pitch) const
 

Private Attributes

const edm::ESGetToken
< SiPixelFedCablingMap,
SiPixelFedCablingMapRcd
fedCablingMapToken_
 
const edm::ESGetToken
< TrackerGeometry,
TrackerDigiGeometryRecord
geomToken_
 
const float np_column_gap_
 
const float np_column_radius_
 
const float ohm_column_radius_
 
edm::ESGetToken
< SiPixelQuality,
SiPixelQualityRcd
siPixelBadModuleToken_
 
edm::ESGetToken
< SiPixelLorentzAngle,
SiPixelLorentzAngleSimRcd
siPixelLorentzAngleToken_
 

Additional Inherited Members

- Protected Types inherited from Phase2TrackerDigitizerAlgorithm
using Frame = GloballyPositioned< double >
 
using Parameters = std::vector< edm::ParameterSet >
 
using signal_map_type = std::map< int, DigitizerUtility::Amplitude, std::less< int > >
 
using signalMaps = std::map< uint32_t, signal_map_type >
 
- Protected Member Functions inherited from Phase2TrackerDigitizerAlgorithm
virtual void add_cross_talk (const Phase2TrackerGeomDetUnit *pixdet)
 
virtual void add_noise (const Phase2TrackerGeomDetUnit *pixdet)
 
virtual void add_noisy_cells (const Phase2TrackerGeomDetUnit *pixdet, float thePixelThreshold)
 
float calcQ (float x)
 
int convertSignalToAdc (uint32_t detID, float signal_in_elec, float threshold)
 
LocalVector DriftDirection (const Phase2TrackerGeomDetUnit *pixdet, const GlobalVector &bfield, const DetId &detId) const
 
virtual std::vector< float > fluctuateEloss (int particleId, float momentum, float eloss, float length, int NumberOfSegments) const
 
virtual void module_killing_conf (uint32_t detID)
 
virtual void module_killing_DB (const Phase2TrackerGeomDetUnit *pixdet)
 
virtual void pixel_inefficiency (const SubdetEfficiencies &eff, const Phase2TrackerGeomDetUnit *pixdet, const TrackerTopology *tTopo)
 
virtual void pixel_inefficiency_db (uint32_t detID)
 
virtual std::vector
< DigitizerUtility::EnergyDepositUnit
primary_ionization (const PSimHit &hit) const
 
- Protected Attributes inherited from Phase2TrackerDigitizerAlgorithm
signalMaps _signal
 
const bool addNoise_
 
const bool addNoisyPixels_
 
const bool addPixelInefficiency_
 
const bool addThresholdSmearing_
 
const bool addXtalk_
 
const bool alpha2Order_
 
Parameters badPixels_
 
const float clusterWidth_
 
const Parameters deadModules_
 
const SiPixelFedCablingMapfedCablingMap_
 
const std::unique_ptr
< SiG4UniversalFluctuation
fluctuate_
 
const bool fluctuateCharge_
 
std::unique_ptr
< CLHEP::RandGaussQ > 
gaussDistribution_
 
const TrackerGeometrygeom_
 
const float GeVperElectron_
 
const float interstripCoupling_
 
const bool makeDigiSimLinks_
 
bool pixelFlag_
 
const double pseudoRadDamage_
 
const double pseudoRadDamageRadius_
 
CLHEP::HepRandomEngine * rengine_
 
const float Sigma0_
 
const float SigmaCoeff_
 
const
SiPhase2OuterTrackerLorentzAngle
siPhase2OTLorentzAngle_
 
const SiPixelQualitysiPixelBadModule_
 
const SiPixelLorentzAnglesiPixelLorentzAngle_
 
std::unique_ptr
< CLHEP::RandGaussQ > 
smearedThreshold_Barrel_
 
std::unique_ptr
< CLHEP::RandGaussQ > 
smearedThreshold_Endcap_
 
const SubdetEfficiencies subdetEfficiencies_
 
const float tanLorentzAnglePerTesla_Barrel_
 
const float tanLorentzAnglePerTesla_Endcap_
 
const int theAdcFullScale_
 
const float theElectronPerADC_
 
const double theHIPThresholdInE_Barrel_
 
const double theHIPThresholdInE_Endcap_
 
const float theNoiseInElectrons_
 
const std::unique_ptr
< GaussianTailNoiseGenerator
theNoiser_
 
const int thePhase2ReadoutMode_
 
const float theReadoutNoise_
 
const std::unique_ptr
< SiPixelGainCalibrationOfflineSimService
theSiPixelGainCalibrationService_
 
const float theThresholdInE_Barrel_
 
const float theThresholdInE_Endcap_
 
const double theThresholdSmearing_Barrel_
 
const double theThresholdSmearing_Endcap_
 
const float theTofLowerCut_
 
const float theTofUpperCut_
 
const double tMax_
 
const bool use_deadmodule_DB_
 
const bool use_ineff_from_db_
 
const bool use_LorentzAngle_DB_
 
const bool use_module_killing_
 

Detailed Description

Definition at line 29 of file Pixel3DDigitizerAlgorithm.h.

Constructor & Destructor Documentation

Pixel3DDigitizerAlgorithm::Pixel3DDigitizerAlgorithm ( const edm::ParameterSet conf,
edm::ConsumesCollector  iC 
)

Definition at line 50 of file Pixel3DDigitizerAlgorithm.cc.

References Phase2TrackerDigitizerAlgorithm::addPixelInefficiency_, edm::ConsumesCollector::esConsumes(), Phase2TrackerDigitizerAlgorithm::pixelFlag_, siPixelBadModuleToken_, siPixelLorentzAngleToken_, Phase2TrackerDigitizerAlgorithm::theAdcFullScale_, Phase2TrackerDigitizerAlgorithm::theElectronPerADC_, Phase2TrackerDigitizerAlgorithm::theThresholdInE_Barrel_, Phase2TrackerDigitizerAlgorithm::theThresholdInE_Endcap_, Phase2TrackerDigitizerAlgorithm::tMax_, Phase2TrackerDigitizerAlgorithm::use_deadmodule_DB_, and Phase2TrackerDigitizerAlgorithm::use_LorentzAngle_DB_.

52  conf.getParameter<edm::ParameterSet>("Pixel3DDigitizerAlgorithm"),
53  iC),
55  (conf.getParameter<edm::ParameterSet>("Pixel3DDigitizerAlgorithm").getParameter<double>("NPColumnRadius")) *
56  1.0_um),
58  (conf.getParameter<edm::ParameterSet>("Pixel3DDigitizerAlgorithm").getParameter<double>("OhmicColumnRadius")) *
59  1.0_um),
61  (conf.getParameter<edm::ParameterSet>("Pixel3DDigitizerAlgorithm").getParameter<double>("NPColumnGap")) *
62  1.0_um),
64  geomToken_(iC.esConsumes()) {
65  // XXX - NEEDED?
66  pixelFlag_ = true;
67 
72 
73  edm::LogInfo("Pixel3DDigitizerAlgorithm")
74  << "Algorithm constructed \n"
75  << "Configuration parameters:\n"
76  << "\n*** Threshold"
77  << "\n Endcap = " << theThresholdInE_Endcap_ << " electrons"
78  << "\n Barrel = " << theThresholdInE_Barrel_ << " electrons"
79  << "\n*** Gain"
80  << "\n Electrons per ADC:" << theElectronPerADC_ << "\n ADC Full Scale: " << theAdcFullScale_
81  << "\n*** The delta cut-off is set to " << tMax_ << "\n*** Pixel-inefficiency: " << addPixelInefficiency_;
82 }
const edm::ESGetToken< SiPixelFedCablingMap, SiPixelFedCablingMapRcd > fedCablingMapToken_
edm::ESGetToken< SiPixelLorentzAngle, SiPixelLorentzAngleSimRcd > siPixelLorentzAngleToken_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
Phase2TrackerDigitizerAlgorithm(const edm::ParameterSet &conf_common, const edm::ParameterSet &conf_specific, edm::ConsumesCollector iC)
Log< level::Info, false > LogInfo
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::ESGetToken< SiPixelQuality, SiPixelQualityRcd > siPixelBadModuleToken_
Pixel3DDigitizerAlgorithm::~Pixel3DDigitizerAlgorithm ( )
override

Definition at line 84 of file Pixel3DDigitizerAlgorithm.cc.

84 {}

Member Function Documentation

std::vector< DigitizerUtility::EnergyDepositUnit > Pixel3DDigitizerAlgorithm::diffusion ( const LocalPoint pos,
const float &  ncarriers,
const std::function< LocalVector(float, float)> &  u_drift,
const std::pair< float, float >  pitches,
const float &  thickness 
) const

Definition at line 117 of file Pixel3DDigitizerAlgorithm.cc.

References funct::abs(), createTree::dd, mps_fire::i, LogDebug, hcaltb::N_SIGMA, mathSSE::sqrt(), HcalDetIdTransform::transform(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by drift().

122  {
123  // FIXME -- DM : Note that with a 0.3 will be enough (if using current sigma formulae)
124  // With the current sigma, this value is dependent of the thickness,
125  // Note that this formulae is coming from planar sensors, a similar
126  // study with data will be needed to extract the sigma for 3D
127  const float max_migration_radius = 0.4_um;
128  // Need to know which axis is the relevant one
129  int displ_ind = -1;
130  float pitch = 0.0;
131 
132  // Check the group is near the edge of the pixel, so diffusion will
133  // be relevant in order to migrate between pixel cells
134  if (hpitches.first - std::abs(pos.x()) < max_migration_radius) {
135  displ_ind = 0;
136  pitch = hpitches.first;
137  } else if (hpitches.second - std::abs(pos.y()) < max_migration_radius) {
138  displ_ind = 1;
139  pitch = hpitches.second;
140  } else {
141  // Nothing to do, too far away
142  return std::vector<DigitizerUtility::EnergyDepositUnit>();
143  }
144 
145  // The new EnergyDeposits in the neighbour pixels
146  // (defined by +1 to the right (first axis) and +1 to the up (second axis)) <-- XXX
147  std::vector<DigitizerUtility::EnergyDepositUnit> migrated_charge;
148 
149  // FIXME -- DM
150  const float diffusion_step = 0.1_um;
151 
152  // The position while drifting
153  std::vector<float> pos_moving({pos.x(), pos.y(), pos.z()});
154  // The drifting: drift field and steps
155  std::function<std::vector<float>(int)> do_step =
156  [&pos_moving, &u_drift, diffusion_step](int i) -> std::vector<float> {
157  auto dd = u_drift(pos_moving[0], pos_moving[1]);
158  return std::vector<float>({i * diffusion_step * dd.x(), i * diffusion_step * dd.y(), i * diffusion_step * dd.z()});
159  };
160 
161  LogDebug("Pixel3DDigitizerAlgorithm::diffusion")
162  << "\nMax. radius from the pixel edge to migrate charge: " << max_migration_radius * 1.0_um_inv << " [um]"
163  << "\nMigration axis: " << displ_ind
164  << "\n(super-)Charge distance to the pixel edge: " << (pitch - pos_moving[displ_ind]) * 1.0_um_inv << " [um]";
165 
166  // How many sigmas (probably a configurable, to be decided not now)
167  const float N_SIGMA = 3.0;
168 
169  // Start the drift and check every step
170  // Some variables needed
171  float current_carriers = ncarriers;
172  std::vector<float> newpos({pos_moving[0], pos_moving[1], pos_moving[2]});
173  float distance_edge = 0.0_um;
174  // Current diffusion value
175  const float sigma = 0.4_um;
176  for (int i = 1;; ++i) {
177  std::transform(pos_moving.begin(), pos_moving.end(), do_step(i).begin(), pos_moving.begin(), std::plus<float>());
178  distance_edge = pitch - std::abs(pos_moving[displ_ind]);
179  // Get the amount of charge on the neighbor pixel: note the
180  // transformation to a Normal
181  float migrated_e = current_carriers * 0.5 * (1.0 - std::erf(distance_edge / (sigma * std::sqrt(2.0))));
182 
183  LogDebug("(super-)charge diffusion") << "step-" << i << ", Current carriers Ne= " << current_carriers << ","
184  << "r=(" << pos_moving[0] * 1.0_um_inv << ", " << pos_moving[1] * 1.0_um_inv
185  << ", " << pos_moving[2] * 1.0_um_inv << ") [um], "
186  << "Migrated charge: " << migrated_e;
187 
188  // Move the migrated charge
189  current_carriers -= migrated_e;
190 
191  // Either far away from the edge or almost half of the carriers already migrated
192  if (std::abs(distance_edge) >= max_migration_radius || current_carriers <= 0.5 * ncarriers) {
193  break;
194  }
195 
196  // Create the ionization point:
197  // First update the newpos vector: the new charge position at the neighbouring pixel
198  // is created in the same position as its "parent carriers"
199  // except the direction of migration
200  std::vector<float> newpos(pos_moving);
201  // Let's create the new charge carriers around 3 sigmas away
202  newpos[displ_ind] += std::copysign(N_SIGMA * sigma, newpos[displ_ind]);
203  migrated_charge.push_back(DigitizerUtility::EnergyDepositUnit(migrated_e, newpos[0], newpos[1], newpos[2]));
204  }
205  return migrated_charge;
206 }
T y() const
Definition: PV3DBase.h:60
T sqrt(T t)
Definition: SSEVec.h:19
T z() const
Definition: PV3DBase.h:61
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static const double N_SIGMA
T x() const
Definition: PV3DBase.h:59
#define LogDebug(id)
unsigned transform(const HcalDetId &id, unsigned transformCode)
std::vector< DigitizerUtility::SignalPoint > Pixel3DDigitizerAlgorithm::drift ( const PSimHit hit,
const Phase2TrackerGeomDetUnit pixdet,
const GlobalVector bfield,
const std::vector< DigitizerUtility::EnergyDepositUnit > &  ionization_points 
) const
overridevirtual

Reimplemented from Phase2TrackerDigitizerAlgorithm.

Definition at line 214 of file Pixel3DDigitizerAlgorithm.cc.

Referenced by drift().

218  {
219  return drift(hit, pixdet, bfield, ionization_points, true);
220 }
std::vector< DigitizerUtility::SignalPoint > drift(const PSimHit &hit, const Phase2TrackerGeomDetUnit *pixdet, const GlobalVector &bfield, const std::vector< DigitizerUtility::EnergyDepositUnit > &ionization_points) const override
std::vector< DigitizerUtility::SignalPoint > Pixel3DDigitizerAlgorithm::drift ( const PSimHit hit,
const Phase2TrackerGeomDetUnit pixdet,
const GlobalVector bfield,
const std::vector< DigitizerUtility::EnergyDepositUnit > &  ionization_points,
bool  diffusion_activated 
) const

Definition at line 221 of file Pixel3DDigitizerAlgorithm.cc.

References Surface::bounds(), funct::cos(), diffusion(), drift(), dataset::end, funct::exp(), is_inside_n_column_(), is_inside_ohmic_column_(), Topology::localPosition(), LogDebug, PixelTopology::ncolumns(), np_column_radius_, PixelTopology::nrows(), PV3DBase< T, PVType, FrameType >::perp(), PixelTopology::pitch(), PixelTopology::pixel(), GloballyPositioned< T >::position(), Phase2TrackerDigitizerAlgorithm::pseudoRadDamage_, Phase2TrackerDigitizerAlgorithm::pseudoRadDamageRadius_, funct::sin(), GeomDet::specificSurface(), PixelGeomDetUnit::specificTopology(), mathSSE::sqrt(), GeomDet::surface(), theta(), Bounds::thickness(), TrackerMaterial_cfi::thickness, PSimHit::tof(), x, PV3DBase< T, PVType, FrameType >::x(), y, PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

226  {
227  // -- Current reference system is placed in the center of the module
228  // -- The natural reference frame should be discribed taking advantatge of
229  // -- the cylindrical nature of the pixel geometry -->
230  // -- the new reference frame should be placed in the center of the n-column, and in the
231  // -- surface of the ROC using cylindrical coordinates
232 
233  // Get ROC pitch, half_pitch and sensor thickness to be used to create the
234  // proxy pixel cell reference frame
235  const auto pitch = pixdet->specificTopology().pitch();
236  const auto half_pitch = std::make_pair<float, float>(pitch.first * 0.5, pitch.second * 0.5);
237  const float thickness = pixdet->specificSurface().bounds().thickness();
238  const int nrows = pixdet->specificTopology().nrows();
239  const int ncolumns = pixdet->specificTopology().ncolumns();
240  const float pix_rounding = 0.99;
241 
242  // The maximum radial distance is going to be used to evaluate radiation damage XXX?
243  const float max_radial_distance =
244  std::sqrt(half_pitch.first * half_pitch.first + half_pitch.second * half_pitch.second);
245 
246  // All pixels are going to be translated to a proxy pixel cell (all pixels should behave
247  // equally no matter their position w.r.t. the module) and describe the movements there
248  // Define the center of the pixel local reference frame: the current cartesian local reference
249  // frame is centered at half_width_x,half_width_y,half_thickness
250  // XXX -- This info could be obtained at init/construction time?
251  LocalPoint center_proxy_cell(half_pitch.first, half_pitch.second, -0.5 * thickness);
252 
253  LogDebug("Pixel3DDigitizerAlgorithm::drift")
254  << "Pixel pitch:" << pitch.first * 1.0_um_inv << ", " << pitch.second * 1.0_um_inv << " [um]";
255 
256  // And the drift direction (assumed same for all the sensor)
257  // XXX call the function which will return a functional
258  std::function<LocalVector(float, float)> drift_direction = [](float x, float y) -> LocalVector {
259  const float theta = std::atan2(y, x);
260  return LocalVector(-std::cos(theta), -std::sin(theta), 0.0);
261  };
262  // The output
263  std::vector<DigitizerUtility::SignalPoint> collection_points;
264  //collection_points.resize(ionization_points.size());
265  collection_points.reserve(ionization_points.size());
266 
267  // Radiation damage limit of application
268  // (XXX: No sense for 3D, let this be until decided what algorithm to use)
269  const float RAD_DAMAGE = 0.001;
270 
271  for (const auto& super_charge : ionization_points) {
272  // Extract the pixel cell
273  auto current_pixel = pixdet->specificTopology().pixel(LocalPoint(super_charge.x(), super_charge.y()));
274  // `pixel` function does not check to be in the ROC bounds,
275  // so check it here and fix potential rounding problems.
276  // Careful, this is assuming a rounding problem (1 unit), more than 1 pixel
277  // away is probably showing some backward problem worth it to track.
278  // This is also correcting out of bounds migrated charge from diffusion.
279  // The charge will be moved to the edge of the row/column.
280  current_pixel.first = std::clamp(current_pixel.first, float(0.0), (nrows - 1) + pix_rounding);
281  current_pixel.second = std::clamp(current_pixel.second, float(0.0), (ncolumns - 1) + pix_rounding);
282 
283  const auto current_pixel_int = std::make_pair(std::floor(current_pixel.first), std::floor(current_pixel.second));
284 
285  // Convert to the 1x1 proxy pixel cell (pc), where all calculations are going to be
286  // performed. The pixel is scaled to the actual pitch
287  const auto relative_position_at_pc =
288  std::make_pair((current_pixel.first - current_pixel_int.first) * pitch.first,
289  (current_pixel.second - current_pixel_int.second) * pitch.second);
290 
291  // Changing the reference frame to the proxy pixel cell
292  LocalPoint position_at_pc(relative_position_at_pc.first - center_proxy_cell.x(),
293  relative_position_at_pc.second - center_proxy_cell.y(),
294  super_charge.z() - center_proxy_cell.z());
295 
296  LogDebug("Pixel3DDigitizerAlgorithm::drift")
297  << "(super-)Charge\nlocal position: (" << super_charge.x() * 1.0_um_inv << ", " << super_charge.y() * 1.0_um_inv
298  << ", " << super_charge.z() * 1.0_um_inv << ") [um]"
299  << "\nMeasurement Point (row,column) (" << current_pixel.first << ", " << current_pixel.second << ")"
300  << "\nProxy pixel-cell frame (centered at left-back corner): (" << relative_position_at_pc.first * 1.0_um_inv
301  << ", " << relative_position_at_pc.second * 1.0_um_inv << ") [um]"
302  << "\nProxy pixel-cell frame (centered at n-column): (" << position_at_pc.x() * 1.0_um_inv << ", "
303  << position_at_pc.y() * 1.0_um_inv << ") [um] "
304  << "\nNe=" << super_charge.energy() << " electrons";
305 
306  // Check if the point is inside any of the column --> no charge was actually created then
307  if (is_inside_n_column_(position_at_pc, thickness) || is_inside_ohmic_column_(position_at_pc, half_pitch)) {
308  LogDebug("Pixel3DDigitizerAlgorithm::drift") << "Remove charge, inside the n-column or p-column!!";
309  continue;
310  }
311 
312  float nelectrons = super_charge.energy();
313  // XXX -- Diffusion: using the center frame
314  if (diffusion_activated) {
315  auto migrated_charges = diffusion(position_at_pc, super_charge.energy(), drift_direction, half_pitch, thickness);
316  for (auto& mc : migrated_charges) {
317  // Remove the migrated charges
318  nelectrons -= mc.energy();
319  // and convert back to the pixel ref. system
320  // Low-left origin/pitch -> relative within the pixel (a)
321  // Adding the pixel
322  const float pixel_x = current_pixel_int.first + (mc.x() + center_proxy_cell.x()) / pitch.first;
323  const float pixel_y = current_pixel_int.second + (mc.y() + center_proxy_cell.y()) / pitch.second;
324  const auto lp = pixdet->specificTopology().localPosition(MeasurementPoint(pixel_x, pixel_y));
325  // Remember: the drift function will move the reference system to the top. We need to subtract
326  // (center_proxy_cell.z() is a constant negative value) what we previously added in order to
327  // avoid a double translation when calling the drift function below the drift function
328  // initially considers the reference system centered in the module at half thickness)
329  mc.migrate_position(LocalPoint(lp.x(), lp.y(), mc.z() + center_proxy_cell.z()));
330  }
331  if (!migrated_charges.empty()) {
332  LogDebug("Pixel3DDigitizerAlgorithm::drift") << "****************"
333  << "MIGRATING (super-)charges"
334  << "****************";
335  // Drift this charges on the other pixel
336  auto mig_colpoints = drift(hit, pixdet, bfield, migrated_charges, false);
337  collection_points.insert(std::end(collection_points), mig_colpoints.begin(), mig_colpoints.end());
338  LogDebug("Pixel3DDigitizerAlgorithm::drift") << "*****************"
339  << "DOME MIGRATION"
340  << "****************";
341  }
342  }
343 
344  // Perform the drift, and check a potential lost of carriers because
345  // they reach the pasivation region (-z < thickness/2)
346  // XXX: not doing nothing, the carriers reach the electrode surface,
347  const float drift_distance = position_at_pc.perp() - np_column_radius_;
348 
349  // Insert a charge loss due to Rad Damage here
350  // XXX: ??
351  float energyOnCollector = nelectrons;
352  // FIXME: is this correct? Not for 3D...
353 
354  if (pseudoRadDamage_ >= RAD_DAMAGE) {
355  const float module_radius = pixdet->surface().position().perp();
356  if (module_radius <= pseudoRadDamageRadius_) {
357  const float kValue = pseudoRadDamage_ / (module_radius * module_radius);
358  energyOnCollector = energyOnCollector * std::exp(-1.0 * kValue * drift_distance / max_radial_distance);
359  }
360  }
361  LogDebug("Pixel3DDigitizerAlgorithm::drift")
362  << "Drift distance = " << drift_distance * 1.0_um_inv << " [um], "
363  << "Initial electrons = " << super_charge.energy()
364  << " [electrons], Electrons after loss/diff= " << energyOnCollector << " [electrons] ";
365  // Load the Charge distribution parameters
366  // XXX -- probably makes no sense the SignalPoint anymore...
367  collection_points.push_back(DigitizerUtility::SignalPoint(
368  current_pixel_int.first, current_pixel_int.second, 0.0, 0.0, hit.tof(), energyOnCollector));
369  }
370 
371  return collection_points;
372 }
Local3DVector LocalVector
Definition: LocalVector.h:12
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:76
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
T perp() const
Definition: PV3DBase.h:69
virtual std::pair< float, float > pixel(const LocalPoint &p) const =0
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
virtual int ncolumns() const =0
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Theta< T > theta() const
virtual int nrows() const =0
const Bounds & bounds() const
Definition: Surface.h:87
Exp< T >::type exp(const T &t)
Definition: Exp.h:22
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
virtual float thickness() const =0
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
const bool is_inside_ohmic_column_(const LocalPoint &p, const std::pair< float, float > &pitch) const
T sqrt(T t)
Definition: SSEVec.h:19
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
std::vector< DigitizerUtility::EnergyDepositUnit > diffusion(const LocalPoint &pos, const float &ncarriers, const std::function< LocalVector(float, float)> &u_drift, const std::pair< float, float > pitches, const float &thickness) const
string end
Definition: dataset.py:937
virtual std::pair< float, float > pitch() const =0
const PositionType & position() const
const bool is_inside_n_column_(const LocalPoint &p, const float &sensor_thickness) const
const Plane & specificSurface() const
Same as surface(), kept for backward compatibility.
Definition: GeomDet.h:40
#define LogDebug(id)
std::vector< DigitizerUtility::SignalPoint > drift(const PSimHit &hit, const Phase2TrackerGeomDetUnit *pixdet, const GlobalVector &bfield, const std::vector< DigitizerUtility::EnergyDepositUnit > &ionization_points) const override
void Pixel3DDigitizerAlgorithm::induce_signal ( const PSimHit hit,
const size_t  hitIndex,
const uint32_t  tofBin,
const Phase2TrackerGeomDetUnit pixdet,
const std::vector< DigitizerUtility::SignalPoint > &  collection_points 
)
overridevirtual

Reimplemented from Phase2TrackerDigitizerAlgorithm.

Definition at line 378 of file Pixel3DDigitizerAlgorithm.cc.

References Phase2TrackerDigitizerAlgorithm::_signal, c_inv, GeomDet::geographicalId(), PSimHit::localPosition(), LogDebug, mag(), Phase2TrackerDigitizerAlgorithm::makeDigiSimLinks_, Phase2TrackerDigitizerAlgorithm::pixelFlag_, Phase2TrackerDigi::pixelToChannel(), pixelgpudetails::pixelToChannel(), PixelDigi::pixelToChannel(), DiDispStaMuonMonitor_cfi::pt, DetId::rawId(), GeomDet::surface(), PSimHit::tof(), and Surface::toGlobal().

382  {
383  // X - Rows, Left-Right
384  // Y - Columns, Down-Up
385  const uint32_t detId = pixdet->geographicalId().rawId();
386  // Accumulated signal at each channel of this detector
387  signal_map_type& the_signal = _signal[detId];
388 
389  // Choose the proper pixel-to-channel converter
390  std::function<int(int, int)> pixelToChannel =
392  : static_cast<std::function<int(int, int)> >(Phase2TrackerDigi::pixelToChannel);
393 
394  // Iterate over collection points on the collection plane
395  for (const auto& pt : collection_points) {
396  // Extract corresponding channel (position is already given in pixel indices)
397  const int channel = pixelToChannel(pt.position().x(), pt.position().y());
398 
399  float corr_time = hit.tof() - pixdet->surface().toGlobal(hit.localPosition()).mag() * c_inv;
400  if (makeDigiSimLinks_) {
401  the_signal[channel] +=
402  DigitizerUtility::Amplitude(pt.amplitude(), &hit, pt.amplitude(), corr_time, hitIndex, tofBin);
403  } else {
404  the_signal[channel] += DigitizerUtility::Amplitude(pt.amplitude(), nullptr, pt.amplitude());
405  }
406 
407  LogDebug("Pixel3DDigitizerAlgorithm::induce_signal")
408  << " Induce charge at row,col:" << pt.position() << " N_electrons:" << pt.amplitude() << " [Channel:" << channel
409  << "]\n [Accumulated signal in this channel:" << the_signal[channel].ampl() << "] "
410  << " Global index linked PSimHit:" << hitIndex;
411  }
412 }
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:79
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:76
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
static int pixelToChannel(int row, int col)
Definition: PixelDigi.h:75
Local3DPoint localPosition() const
Definition: PSimHit.h:52
static PackedDigiType pixelToChannel(unsigned int row, unsigned int col)
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:64
std::map< int, DigitizerUtility::Amplitude, std::less< int > > signal_map_type
constexpr double c_inv
constexpr uint32_t pixelToChannel(int row, int col)
#define LogDebug(id)
void Pixel3DDigitizerAlgorithm::init ( const edm::EventSetup es)
overridevirtual

Implements Phase2TrackerDigitizerAlgorithm.

Definition at line 27 of file Pixel3DDigitizerAlgorithm.cc.

References edm::EventSetup::getData().

27  {
28  // XXX: Just copied from PixelDigitizer Algorithm
29  // CHECK if all these is needed
30 
31  if (use_ineff_from_db_) {
32  // load gain calibration service fromdb...
33  theSiPixelGainCalibrationService_->setESObjects(es);
34  }
35 
36  if (use_deadmodule_DB_) {
38  }
39 
41  // Get Lorentz angle from DB record
43  }
44 
45  // gets the map and geometry from the DB (to kill ROCs)
47  geom_ = &es.getData(geomToken_);
48 }
const edm::ESGetToken< SiPixelFedCablingMap, SiPixelFedCablingMapRcd > fedCablingMapToken_
const SiPixelLorentzAngle * siPixelLorentzAngle_
edm::ESGetToken< SiPixelLorentzAngle, SiPixelLorentzAngleSimRcd > siPixelLorentzAngleToken_
bool getData(T &iHolder) const
Definition: EventSetup.h:122
const std::unique_ptr< SiPixelGainCalibrationOfflineSimService > theSiPixelGainCalibrationService_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
edm::ESGetToken< SiPixelQuality, SiPixelQualityRcd > siPixelBadModuleToken_
const bool Pixel3DDigitizerAlgorithm::is_inside_n_column_ ( const LocalPoint p,
const float &  sensor_thickness 
) const
private

Definition at line 94 of file Pixel3DDigitizerAlgorithm.cc.

References np_column_gap_, np_column_radius_, PV3DBase< T, PVType, FrameType >::perp(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by drift().

94  {
95  // The insensitive volume of the column: sensor thickness - column gap distance
96  return (p.perp() <= np_column_radius_ && p.z() <= (sensor_thickness - np_column_gap_));
97 }
T perp() const
Definition: PV3DBase.h:69
T z() const
Definition: PV3DBase.h:61
const bool Pixel3DDigitizerAlgorithm::is_inside_ohmic_column_ ( const LocalPoint p,
const std::pair< float, float > &  pitch 
) const
private

Definition at line 99 of file Pixel3DDigitizerAlgorithm.cc.

References ohm_column_radius_.

Referenced by drift().

100  {
101  // The four corners of the cell
102  return ((p - LocalVector(half_pitch.first, half_pitch.second, 0)).perp() <= ohm_column_radius_) ||
103  ((p - LocalVector(-half_pitch.first, half_pitch.second, 0)).perp() <= ohm_column_radius_) ||
104  ((p - LocalVector(half_pitch.first, -half_pitch.second, 0)).perp() <= ohm_column_radius_) ||
105  ((p - LocalVector(-half_pitch.first, -half_pitch.second, 0)).perp() <= ohm_column_radius_);
106 }
Local3DVector LocalVector
Definition: LocalVector.h:12
bool Pixel3DDigitizerAlgorithm::select_hit ( const PSimHit hit,
double  tCorr,
double &  sigScale 
) const
overridevirtual

Reimplemented from Phase2TrackerDigitizerAlgorithm.

Definition at line 89 of file Pixel3DDigitizerAlgorithm.cc.

References Phase2TrackerDigitizerAlgorithm::theTofLowerCut_, Phase2TrackerDigitizerAlgorithm::theTofUpperCut_, and PSimHit::tof().

89  {
90  double time = hit.tof() - tCorr;
91  return (time >= theTofLowerCut_ && time < theTofUpperCut_);
92 }
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:76

Member Data Documentation

const edm::ESGetToken<SiPixelFedCablingMap, SiPixelFedCablingMapRcd> Pixel3DDigitizerAlgorithm::fedCablingMapToken_
private

Definition at line 72 of file Pixel3DDigitizerAlgorithm.h.

const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> Pixel3DDigitizerAlgorithm::geomToken_
private

Definition at line 73 of file Pixel3DDigitizerAlgorithm.h.

const float Pixel3DDigitizerAlgorithm::np_column_gap_
private

Definition at line 68 of file Pixel3DDigitizerAlgorithm.h.

Referenced by is_inside_n_column_().

const float Pixel3DDigitizerAlgorithm::np_column_radius_
private

Definition at line 65 of file Pixel3DDigitizerAlgorithm.h.

Referenced by drift(), and is_inside_n_column_().

const float Pixel3DDigitizerAlgorithm::ohm_column_radius_
private

Definition at line 66 of file Pixel3DDigitizerAlgorithm.h.

Referenced by is_inside_ohmic_column_().

edm::ESGetToken<SiPixelQuality, SiPixelQualityRcd> Pixel3DDigitizerAlgorithm::siPixelBadModuleToken_
private

Definition at line 70 of file Pixel3DDigitizerAlgorithm.h.

Referenced by Pixel3DDigitizerAlgorithm().

edm::ESGetToken<SiPixelLorentzAngle, SiPixelLorentzAngleSimRcd> Pixel3DDigitizerAlgorithm::siPixelLorentzAngleToken_
private

Definition at line 71 of file Pixel3DDigitizerAlgorithm.h.

Referenced by Pixel3DDigitizerAlgorithm().