File indexing completed on 2023-09-15 03:19:16
0001 #ifndef SimTracker_SiPhase2Digitizer_Phase2TrackerDigitizerAlgorithm_h
0002 #define SimTracker_SiPhase2Digitizer_Phase2TrackerDigitizerAlgorithm_h
0003
0004 #include <map>
0005 #include <memory>
0006 #include <vector>
0007
0008 #include "DataFormats/GeometrySurface/interface/GloballyPositioned.h"
0009 #include "FWCore/Framework/interface/FrameworkfwdMostUsed.h"
0010 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
0011 #include "DataFormats/Math/interface/approx_exp.h"
0012 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelDigiSimLink.h"
0013 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
0014 #include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h"
0015
0016 #include "SimTracker/Common/interface/DigitizerUtility.h"
0017 #include "SimTracker/Common/interface/SiPixelChargeReweightingAlgorithm.h"
0018 #include "SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerFwd.h"
0019
0020
0021 #include "DataFormats/Math/interface/CMSUnits.h"
0022 #include "CLHEP/Units/GlobalPhysicalConstants.h"
0023 #include "CLHEP/Units/GlobalSystemOfUnits.h"
0024
0025
0026
0027 namespace CLHEP {
0028 class HepRandomEngine;
0029 class RandGaussQ;
0030 class RandFlat;
0031 }
0032
0033 class DetId;
0034 class GaussianTailNoiseGenerator;
0035 class SiG4UniversalFluctuation;
0036 class SiPixelGainCalibrationOfflineSimService;
0037 class SiPixelLorentzAngle;
0038 class SiPixelQuality;
0039 class SiPhase2OuterTrackerLorentzAngle;
0040 class TrackerGeometry;
0041 class TrackerTopology;
0042 class SiPixelChargeReweightingAlgorithm;
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 constexpr double c_cm_ns = CLHEP::c_light * CLHEP::ns / CLHEP::cm;
0053 constexpr double c_inv = 1.0 / c_cm_ns;
0054
0055 class Phase2TrackerDigitizerAlgorithm {
0056 public:
0057 Phase2TrackerDigitizerAlgorithm(const edm::ParameterSet& conf_common,
0058 const edm::ParameterSet& conf_specific,
0059 edm::ConsumesCollector iC);
0060 virtual ~Phase2TrackerDigitizerAlgorithm();
0061
0062
0063 virtual void init(const edm::EventSetup& es) = 0;
0064 virtual void initializeEvent(CLHEP::HepRandomEngine& eng);
0065
0066
0067 virtual void accumulateSimHits(const std::vector<PSimHit>::const_iterator inputBegin,
0068 const std::vector<PSimHit>::const_iterator inputEnd,
0069 const size_t inputBeginGlobalIndex,
0070 const uint32_t tofBin,
0071 const Phase2TrackerGeomDetUnit* pixdet,
0072 const GlobalVector& bfield);
0073 virtual void digitize(const Phase2TrackerGeomDetUnit* pixdet,
0074 std::map<int, digitizerUtility::DigiSimInfo>& digi_map,
0075 const TrackerTopology* tTopo);
0076 virtual bool select_hit(const PSimHit& hit, double tCorr, double& sigScale) const { return true; }
0077 virtual bool isAboveThreshold(const digitizerUtility::SimHitInfo* hitInfo, float charge, float thr) const {
0078 return true;
0079 }
0080
0081
0082 void loadAccumulator(uint32_t detId, const std::map<int, float>& accumulator);
0083
0084 protected:
0085
0086 const SiPixelLorentzAngle* siPixelLorentzAngle_;
0087
0088
0089 const SiPhase2OuterTrackerLorentzAngle* siPhase2OTLorentzAngle_;
0090
0091
0092 const SiPixelQuality* siPixelBadModule_;
0093
0094
0095 const TrackerGeometry* geom_;
0096 struct SubdetEfficiencies {
0097 SubdetEfficiencies(const edm::ParameterSet& conf);
0098 std::vector<double> barrel_efficiencies;
0099 std::vector<double> endcap_efficiencies;
0100 };
0101
0102
0103 using signal_map_type = std::map<int, digitizerUtility::Ph2Amplitude, std::less<int> >;
0104 using signalMaps = std::map<uint32_t, signal_map_type>;
0105 using Frame = GloballyPositioned<double>;
0106 using Parameters = std::vector<edm::ParameterSet>;
0107
0108
0109 signalMaps _signal;
0110
0111 const bool makeDigiSimLinks_;
0112
0113 const bool use_ineff_from_db_;
0114 const bool use_module_killing_;
0115 const bool use_deadmodule_DB_;
0116 const bool use_LorentzAngle_DB_;
0117
0118 const Parameters deadModules_;
0119
0120
0121
0122
0123 const float GeVperElectron_;
0124
0125
0126 const bool alpha2Order_;
0127 const bool addXtalk_;
0128 const float interstripCoupling_;
0129 const float Sigma0_;
0130 const float SigmaCoeff_;
0131
0132
0133 const float clusterWidth_;
0134
0135
0136 const int thePhase2ReadoutMode_;
0137 const float theElectronPerADC_;
0138 const int theAdcFullScale_;
0139 const float theNoiseInElectrons_;
0140 const float theReadoutNoise_;
0141
0142
0143 const float theThresholdInE_Endcap_;
0144 const float theThresholdInE_Barrel_;
0145
0146 const double theThresholdSmearing_Endcap_;
0147 const double theThresholdSmearing_Barrel_;
0148
0149 const double theHIPThresholdInE_Endcap_;
0150 const double theHIPThresholdInE_Barrel_;
0151
0152 const float theTofLowerCut_;
0153 const float theTofUpperCut_;
0154 const float tanLorentzAnglePerTesla_Endcap_;
0155 const float tanLorentzAnglePerTesla_Barrel_;
0156
0157
0158 const bool addNoise_;
0159 const bool addNoisyPixels_;
0160 const bool fluctuateCharge_;
0161
0162
0163 const bool addPixelInefficiency_;
0164
0165 const bool addThresholdSmearing_;
0166
0167
0168 const double pseudoRadDamage_;
0169 const double pseudoRadDamageRadius_;
0170
0171
0172 const bool useChargeReweighting_;
0173
0174 const std::unique_ptr<SiPixelChargeReweightingAlgorithm> theSiPixelChargeReweightingAlgorithm_;
0175
0176
0177
0178
0179
0180
0181 const double tMax_;
0182
0183
0184 Parameters badPixels_;
0185
0186
0187 const std::unique_ptr<SiG4UniversalFluctuation> fluctuate_;
0188 const std::unique_ptr<GaussianTailNoiseGenerator> theNoiser_;
0189
0190
0191
0192 virtual std::vector<digitizerUtility::EnergyDepositUnit> primary_ionization(const PSimHit& hit) const;
0193 virtual std::vector<digitizerUtility::SignalPoint> drift(
0194 const PSimHit& hit,
0195 const Phase2TrackerGeomDetUnit* pixdet,
0196 const GlobalVector& bfield,
0197 const std::vector<digitizerUtility::EnergyDepositUnit>& ionization_points) const;
0198 virtual void induce_signal(std::vector<PSimHit>::const_iterator inputBegin,
0199 const PSimHit& hit,
0200 const size_t hitIndex,
0201 const size_t firstHitIndex,
0202 const uint32_t tofBin,
0203 const Phase2TrackerGeomDetUnit* pixdet,
0204 const std::vector<digitizerUtility::SignalPoint>& collection_points);
0205 virtual std::vector<float> fluctuateEloss(
0206 int particleId, float momentum, float eloss, float length, int NumberOfSegments) const;
0207 virtual void add_noise(const Phase2TrackerGeomDetUnit* pixdet);
0208 virtual void add_cross_talk(const Phase2TrackerGeomDetUnit* pixdet);
0209 virtual void add_noisy_cells(const Phase2TrackerGeomDetUnit* pixdet, float thePixelThreshold);
0210 virtual void pixel_inefficiency(const SubdetEfficiencies& eff,
0211 const Phase2TrackerGeomDetUnit* pixdet,
0212 const TrackerTopology* tTopo);
0213
0214 virtual void pixel_inefficiency_db(uint32_t detID);
0215
0216
0217 const std::unique_ptr<SiPixelGainCalibrationOfflineSimService> theSiPixelGainCalibrationService_;
0218
0219 LocalVector driftDirection(const Phase2TrackerGeomDetUnit* pixdet,
0220 const GlobalVector& bfield,
0221 const DetId& detId) const;
0222
0223
0224 virtual void module_killing_conf(uint32_t detID);
0225
0226 virtual void module_killing_DB(const Phase2TrackerGeomDetUnit* pixdet) = 0;
0227
0228 const SubdetEfficiencies subdetEfficiencies_;
0229 float calcQ(float x);
0230
0231
0232 std::unique_ptr<CLHEP::RandGaussQ> gaussDistribution_;
0233
0234
0235 std::unique_ptr<CLHEP::RandGaussQ> smearedThreshold_Endcap_;
0236 std::unique_ptr<CLHEP::RandGaussQ> smearedThreshold_Barrel_;
0237
0238
0239 CLHEP::HepRandomEngine* rengine_;
0240
0241
0242 int convertSignalToAdc(uint32_t detID, float signal_in_elec, float threshold);
0243
0244 bool pixelFlag_;
0245 };
0246 #endif