File indexing completed on 2025-02-05 23:51:51
0001 #ifndef SimTracker_SiPixelDigitizer_SiPixelDigitizerAlgorithm_h
0002 #define SimTracker_SiPixelDigitizer_SiPixelDigitizerAlgorithm_h
0003
0004 #include <map>
0005 #include <memory>
0006 #include <vector>
0007 #include <iostream>
0008 #include "DataFormats/GeometrySurface/interface/GloballyPositioned.h"
0009 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
0010 #include "SimDataFormats/EncodedEventId/interface/EncodedEventId.h"
0011 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
0012 #include "SimTracker/Common/interface/DigitizerUtility.h"
0013 #include "SimTracker/SiPixelDigitizer/plugins/PixelDigiAddTempInfo.h"
0014 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelSimHitExtraInfo.h"
0015 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelSimHitExtraInfoLite.h"
0016 #include "DataFormats/Math/interface/approx_exp.h"
0017 #include "SimDataFormats/PileupSummaryInfo/interface/PileupMixingContent.h"
0018 #include "SimDataFormats/PileupSummaryInfo/interface/PileupSummaryInfo.h"
0019 #include "Geometry/CommonTopologies/interface/PixelTopology.h"
0020 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0021 #include "CondFormats/SiPixelTransient/interface/SiPixelTemplate2D.h"
0022 #include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h"
0023 #include "CalibTracker/Records/interface/SiPixelFEDChannelContainerESProducerRcd.h"
0024 #include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h"
0025 #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
0026 #include "CondFormats/DataRecord/interface/SiPixelLorentzAngleSimRcd.h"
0027 #include "CondFormats/DataRecord/interface/SiPixelDynamicInefficiencyRcd.h"
0028 #include "CondFormats/DataRecord/interface/SiPixelStatusScenarioProbabilityRcd.h"
0029 #include "CondFormats/DataRecord/interface/SiPixelStatusScenariosRcd.h"
0030 #include "FWCore/Framework/interface/FrameworkfwdMostUsed.h"
0031 #include "boost/multi_array.hpp"
0032
0033 typedef boost::multi_array<float, 2> array_2d;
0034
0035
0036
0037
0038 namespace CLHEP {
0039 class HepRandomEngine;
0040 }
0041
0042 class DetId;
0043 class GaussianTailNoiseGenerator;
0044 class PixelDigi;
0045 class PixelDigiSimLink;
0046 class PixelGeomDetUnit;
0047 class SiG4UniversalFluctuation;
0048 class SiPixelFedCablingMap;
0049 class SiPixelGainCalibrationOfflineSimService;
0050 class SiPixelLorentzAngle;
0051 class SiPixelQuality;
0052 class SiPixelDynamicInefficiency;
0053 class TrackerGeometry;
0054 class TrackerTopology;
0055 class SiPixelFEDChannelContainer;
0056 class SiPixelQualityProbabilities;
0057 class SiPixelChargeReweightingAlgorithm;
0058
0059 class SiPixelDigitizerAlgorithm {
0060 public:
0061 SiPixelDigitizerAlgorithm(const edm::ParameterSet& conf, edm::ConsumesCollector iC);
0062 ~SiPixelDigitizerAlgorithm();
0063
0064
0065 void init(const edm::EventSetup& es);
0066
0067 void initializeEvent() { _signal.clear(); }
0068
0069
0070 void accumulateSimHits(const std::vector<PSimHit>::const_iterator inputBegin,
0071 const std::vector<PSimHit>::const_iterator inputEnd,
0072 const size_t inputBeginGlobalIndex,
0073 const unsigned int tofBin,
0074 const PixelGeomDetUnit* pixdet,
0075 const GlobalVector& bfield,
0076 const TrackerTopology* tTopo,
0077 CLHEP::HepRandomEngine*);
0078 void digitize(const PixelGeomDetUnit* pixdet,
0079 std::vector<PixelDigi>& digis,
0080 std::vector<PixelDigiSimLink>& simlinks,
0081 std::vector<PixelDigiAddTempInfo>& newClass_Digi_extra,
0082 const TrackerTopology* tTopo,
0083 CLHEP::HepRandomEngine*);
0084 void calculateInstlumiFactor(PileupMixingContent* puInfo);
0085 void fillSimHitMaps(std::vector<PSimHit> simHits, const unsigned int tofBin);
0086 void resetSimHitMaps();
0087 void init_DynIneffDB(const edm::EventSetup&);
0088 std::unique_ptr<PixelFEDChannelCollection> chooseScenario(PileupMixingContent* puInfo, CLHEP::HepRandomEngine*);
0089
0090 void lateSignalReweight(const PixelGeomDetUnit* pixdet,
0091 std::vector<PixelDigi>& digis,
0092 std::vector<PixelSimHitExtraInfo>& newClass_Sim_extra,
0093 const TrackerTopology* tTopo,
0094 CLHEP::HepRandomEngine* engine);
0095 void lateSignalReweight(const PixelGeomDetUnit* pixdet,
0096 std::vector<PixelDigi>& digis,
0097 std::vector<PixelSimHitExtraInfoLite>& newClass_Sim_extra,
0098 const TrackerTopology* tTopo,
0099 CLHEP::HepRandomEngine* engine);
0100
0101
0102 void calculateInstlumiFactor(const std::vector<PileupSummaryInfo>& ps,
0103 int bunchSpacing);
0104 void setSimAccumulator(const std::map<uint32_t, std::map<int, int> >& signalMap);
0105 std::unique_ptr<PixelFEDChannelCollection> chooseScenario(const std::vector<PileupSummaryInfo>& ps,
0106 CLHEP::HepRandomEngine* engine);
0107
0108 bool killBadFEDChannels() const;
0109 typedef std::unordered_map<std::string, PixelFEDChannelCollection> PixelFEDChannelCollectionMap;
0110 const PixelFEDChannelCollectionMap* quality_map;
0111
0112 private:
0113
0114 edm::ESGetToken<SiPixelLorentzAngle, SiPixelLorentzAngleSimRcd> SiPixelLorentzAngleToken_;
0115 const SiPixelLorentzAngle* SiPixelLorentzAngle_ = nullptr;
0116
0117
0118 edm::ESGetToken<SiPixelQuality, SiPixelQualityRcd> SiPixelBadModuleToken_;
0119 const SiPixelQuality* SiPixelBadModule_ = nullptr;
0120
0121
0122 const edm::ESGetToken<SiPixelFedCablingMap, SiPixelFedCablingMapRcd> mapToken_;
0123 const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0124 const SiPixelFedCablingMap* map_ = nullptr;
0125 const TrackerGeometry* geom_ = nullptr;
0126
0127
0128 edm::ESGetToken<SiPixelDynamicInefficiency, SiPixelDynamicInefficiencyRcd> SiPixelDynamicInefficiencyToken_;
0129 const SiPixelDynamicInefficiency* SiPixelDynamicInefficiency_ = nullptr;
0130
0131
0132 edm::ESGetToken<SiPixelQualityProbabilities, SiPixelStatusScenarioProbabilityRcd> scenarioProbabilityToken_;
0133 edm::ESGetToken<PixelFEDChannelCollectionMap, SiPixelFEDChannelContainerESProducerRcd>
0134 PixelFEDChannelCollectionMapToken_;
0135 const SiPixelQualityProbabilities* scenarioProbability_ = nullptr;
0136
0137
0138
0139
0140
0141
0142
0143 class CalParameters {
0144 public:
0145 float p0;
0146 float p1;
0147 float p2;
0148 float p3;
0149 };
0150
0151
0152
0153
0154
0155
0156 class EnergyDepositUnit {
0157 public:
0158 EnergyDepositUnit() : _energy(0), _position(0, 0, 0) {}
0159 EnergyDepositUnit(float energy, float x, float y, float z) : _energy(energy), _position(x, y, z) {}
0160 EnergyDepositUnit(float energy, Local3DPoint position) : _energy(energy), _position(position) {}
0161 float x() const { return _position.x(); }
0162 float y() const { return _position.y(); }
0163 float z() const { return _position.z(); }
0164 float energy() const { return _energy; }
0165
0166 private:
0167 float _energy;
0168 Local3DPoint _position;
0169 };
0170
0171
0172
0173
0174
0175
0176
0177
0178 class SignalPoint {
0179 public:
0180 SignalPoint() : _pos(0, 0), _time(0), _amplitude(0), _sigma_x(1.), _sigma_y(1.), _hitp(nullptr) {}
0181
0182 SignalPoint(float x, float y, float sigma_x, float sigma_y, float t, float a = 1.0)
0183 : _pos(x, y), _time(t), _amplitude(a), _sigma_x(sigma_x), _sigma_y(sigma_y), _hitp(nullptr) {}
0184
0185 SignalPoint(float x, float y, float sigma_x, float sigma_y, float t, const PSimHit& hit, float a = 1.0)
0186 : _pos(x, y), _time(t), _amplitude(a), _sigma_x(sigma_x), _sigma_y(sigma_y), _hitp(&hit) {}
0187
0188 const LocalPoint& position() const { return _pos; }
0189 float x() const { return _pos.x(); }
0190 float y() const { return _pos.y(); }
0191 float sigma_x() const { return _sigma_x; }
0192 float sigma_y() const { return _sigma_y; }
0193 float time() const { return _time; }
0194 float amplitude() const { return _amplitude; }
0195 const PSimHit& hit() { return *_hitp; }
0196 SignalPoint& set_amplitude(float amp) {
0197 _amplitude = amp;
0198 return *this;
0199 }
0200
0201 private:
0202 LocalPoint _pos;
0203 float _time;
0204 float _amplitude;
0205 float _sigma_x;
0206 float _sigma_y;
0207 const PSimHit* _hitp;
0208 };
0209
0210
0211
0212
0213
0214
0215
0216 struct PixelEfficiencies {
0217 PixelEfficiencies(const edm::ParameterSet& conf,
0218 bool AddPixelInefficiency,
0219 int NumberOfBarrelLayers,
0220 int NumberOfEndcapDisks);
0221 bool FromConfig;
0222
0223 double theInstLumiScaleFactor;
0224 std::vector<double> pu_scale;
0225 std::vector<std::vector<double> > thePUEfficiency;
0226
0227
0228 double thePixelEfficiency[20];
0229 double thePixelColEfficiency[20];
0230 double thePixelChipEfficiency[20];
0231 std::vector<double> theLadderEfficiency_BPix[20];
0232 std::vector<double> theModuleEfficiency_BPix[20];
0233 double theInnerEfficiency_FPix[20];
0234 double theOuterEfficiency_FPix[20];
0235 unsigned int FPixIndex;
0236
0237
0238 std::map<uint32_t, double> PixelGeomFactors;
0239 std::map<uint32_t, std::vector<double> > PixelGeomFactorsROCStdPixels;
0240 std::map<uint32_t, std::vector<double> > PixelGeomFactorsROCBigPixels;
0241 std::map<uint32_t, double> ColGeomFactors;
0242 std::map<uint32_t, double> ChipGeomFactors;
0243 std::map<uint32_t, size_t> iPU;
0244
0245
0246 enum shiftEnumerator { FPixRocIdShift = 3, BPixRocIdShift = 6 };
0247 static const int rocIdMaskBits = 0x1F;
0248 void init_from_db(const TrackerGeometry*, const SiPixelDynamicInefficiency*);
0249 bool matches(const DetId&, const DetId&, const std::vector<uint32_t>&);
0250 std::unique_ptr<PixelFEDChannelCollection> PixelFEDChannelCollection_;
0251 };
0252
0253
0254
0255
0256
0257
0258
0259 struct PixelAging {
0260 PixelAging(const edm::ParameterSet& conf, bool AddPixelAging, int NumberOfBarrelLayers, int NumberOfEndcapDisks);
0261 float thePixelPseudoRadDamage[20];
0262 unsigned int FPixIndex;
0263 };
0264
0265 private:
0266
0267 typedef std::map<int, digitizerUtility::Amplitude, std::less<int> > signal_map_type;
0268 typedef signal_map_type::iterator signal_map_iterator;
0269 typedef signal_map_type::const_iterator signal_map_const_iterator;
0270 typedef std::map<uint32_t, signal_map_type> signalMaps;
0271 typedef GloballyPositioned<double> Frame;
0272 typedef std::vector<edm::ParameterSet> Parameters;
0273 typedef boost::multi_array<float, 2> array_2d;
0274
0275 typedef std::pair<unsigned int, unsigned int> subDetTofBin;
0276 typedef std::map<unsigned int, std::vector<PSimHit> > simhit_map;
0277 simhit_map SimHitMap;
0278 typedef std::map<subDetTofBin, unsigned int> simhit_collectionMap;
0279 simhit_collectionMap SimHitCollMap;
0280
0281
0282 signalMaps _signal;
0283
0284 const bool makeDigiSimLinks_;
0285 const bool store_SimHitEntryExitPoints_;
0286 const bool store_SimHitEntryExitPointsLite_;
0287
0288 const bool use_ineff_from_db_;
0289 const bool use_module_killing_;
0290 const bool use_deadmodule_DB_;
0291 const bool use_LorentzAngle_DB_;
0292
0293 const Parameters DeadModules;
0294
0295 std::unique_ptr<SiPixelChargeReweightingAlgorithm> TheNewSiPixelChargeReweightingAlgorithmClass;
0296
0297 private:
0298
0299
0300
0301 const float GeVperElectron;
0302
0303
0304 const float Sigma0;
0305 const float Dist300;
0306 const bool alpha2Order;
0307
0308
0309 const float ClusterWidth;
0310
0311 const int NumberOfBarrelLayers;
0312 const int NumberOfEndcapDisks;
0313
0314
0315 const float theElectronPerADC;
0316 const int theAdcFullScale;
0317 const int theAdcFullScLateCR;
0318 const float theNoiseInElectrons;
0319 const float theReadoutNoise;
0320
0321
0322 const float theThresholdInE_FPix;
0323 const float theThresholdInE_BPix;
0324 const float theThresholdInE_BPix_L1;
0325 const float theThresholdInE_BPix_L2;
0326
0327 const double theThresholdSmearing_FPix;
0328 const double theThresholdSmearing_BPix;
0329 const double theThresholdSmearing_BPix_L1;
0330 const double theThresholdSmearing_BPix_L2;
0331
0332 const float electronsPerVCAL;
0333 const float electronsPerVCAL_Offset;
0334 const float electronsPerVCAL_L1;
0335 const float electronsPerVCAL_L1_Offset;
0336
0337 const float theTofLowerCut;
0338 const float theTofUpperCut;
0339 const float tanLorentzAnglePerTesla_FPix;
0340 const float tanLorentzAnglePerTesla_BPix;
0341
0342 const float FPix_p0;
0343 const float FPix_p1;
0344 const float FPix_p2;
0345 const float FPix_p3;
0346 const float BPix_p0;
0347 const float BPix_p1;
0348 const float BPix_p2;
0349 const float BPix_p3;
0350
0351
0352 const bool addNoise;
0353 const bool addChargeVCALSmearing;
0354 const bool addNoisyPixels;
0355 const bool fluctuateCharge;
0356
0357
0358 const bool AddPixelInefficiency;
0359 const bool KillBadFEDChannels;
0360 const bool addThresholdSmearing;
0361
0362
0363 const bool doMissCalibrate;
0364 const bool doMissCalInLateCR;
0365 const float theGainSmearing;
0366 const float theOffsetSmearing;
0367
0368
0369 const bool AddPixelAging;
0370 const bool UseReweighting;
0371
0372
0373
0374
0375
0376
0377 const double tMax;
0378
0379
0380
0381 const std::unique_ptr<SiG4UniversalFluctuation> fluctuate;
0382 const std::unique_ptr<GaussianTailNoiseGenerator> theNoiser;
0383
0384
0385 const std::map<int, CalParameters, std::less<int> > calmap;
0386
0387
0388
0389 std::map<int, CalParameters, std::less<int> > initCal() const;
0390 void primary_ionization(const PSimHit& hit,
0391 std::vector<EnergyDepositUnit>& ionization_points,
0392 CLHEP::HepRandomEngine*) const;
0393 void drift(const PSimHit& hit,
0394 const PixelGeomDetUnit* pixdet,
0395 const GlobalVector& bfield,
0396 const TrackerTopology* tTopo,
0397 const std::vector<EnergyDepositUnit>& ionization_points,
0398 std::vector<SignalPoint>& collection_points) const;
0399 void induce_signal(std::vector<PSimHit>::const_iterator inputBegin,
0400 std::vector<PSimHit>::const_iterator inputEnd,
0401 const PSimHit& hit,
0402 const size_t hitIndex,
0403 const size_t FirstHitIndex,
0404 const unsigned int tofBin,
0405 const PixelGeomDetUnit* pixdet,
0406 const std::vector<SignalPoint>& collection_points);
0407 void fluctuateEloss(int particleId,
0408 float momentum,
0409 float eloss,
0410 float length,
0411 int NumberOfSegments,
0412 float elossVector[],
0413 CLHEP::HepRandomEngine*) const;
0414 void add_noise(const PixelGeomDetUnit* pixdet, float thePixelThreshold, CLHEP::HepRandomEngine*);
0415 void make_digis(float thePixelThresholdInE,
0416 uint32_t detID,
0417 const PixelGeomDetUnit* pixdet,
0418 std::vector<PixelDigi>& digis,
0419 std::vector<PixelDigiSimLink>& simlinks,
0420 std::vector<PixelDigiAddTempInfo>& newClass_Digi_extra,
0421 const TrackerTopology* tTopo) const;
0422 void pixel_inefficiency(const PixelEfficiencies& eff,
0423 const PixelGeomDetUnit* pixdet,
0424 const TrackerTopology* tTopo,
0425 CLHEP::HepRandomEngine*);
0426
0427 void pixel_inefficiency_db(uint32_t detID);
0428
0429 float pixel_aging(const PixelAging& aging, const PixelGeomDetUnit* pixdet, const TrackerTopology* tTopo) const;
0430
0431
0432 const std::unique_ptr<SiPixelGainCalibrationOfflineSimService> theSiPixelGainCalibrationService_;
0433 float missCalibrate(
0434 uint32_t detID, const TrackerTopology* tTopo, const PixelGeomDetUnit* pixdet, int col, int row, float amp) const;
0435 LocalVector DriftDirection(const PixelGeomDetUnit* pixdet, const GlobalVector& bfield, const DetId& detId) const;
0436
0437 void module_killing_conf(
0438 uint32_t detID);
0439 void module_killing_DB(uint32_t detID);
0440
0441 PixelEfficiencies pixelEfficiencies_;
0442 const PixelAging pixelAging_;
0443
0444 double calcQ(float x) const {
0445
0446
0447
0448
0449
0450
0451
0452 auto xx = std::min(0.5f * x * x, 12.5f);
0453 return 0.5 * (1.0 - std::copysign(std::sqrt(1.f - unsafe_expf<4>(-xx * (1.f + 0.2733f / (1.f + 0.147f * xx)))), x));
0454 }
0455 };
0456
0457 #endif