Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:30:59

0001 #ifndef SiStripDigitizerAlgorithm_h
0002 #define SiStripDigitizerAlgorithm_h
0003 
0004 /** \class SiStripDigitizerAlgorithm
0005  *
0006  * SiStripDigitizerAlgorithm converts hits to digis
0007  *
0008  ************************************************************/
0009 
0010 #include <memory>
0011 #include <string>
0012 
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 
0015 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
0016 #include "SimDataFormats/PileupSummaryInfo/interface/PileupMixingContent.h"
0017 #include "DataFormats/DetId/interface/DetId.h"
0018 #include "DataFormats/Common/interface/DetSet.h"
0019 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
0020 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
0021 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
0022 #include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
0023 #include "CondFormats/SiStripObjects/interface/SiStripThreshold.h"
0024 #include "CondFormats/SiStripObjects/interface/SiStripBadStrip.h"
0025 #include "CondFormats/SiStripObjects/interface/SiStripApvSimulationParameters.h"
0026 #include "CalibFormats/SiStripObjects/interface/SiStripGain.h"
0027 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
0028 #include "SimTracker/SiStripDigitizer/interface/SiTrivialDigitalConverter.h"
0029 #include "SimTracker/SiStripDigitizer/interface/SiGaussianTailNoiseAdder.h"
0030 #include "SiHitDigitizer.h"
0031 #include "SimTracker/SiStripDigitizer/interface/SiPileUpSignals.h"
0032 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0033 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
0034 #include "Geometry/CommonTopologies/interface/StripTopology.h"
0035 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
0036 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
0037 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripFedZeroSuppression.h"
0038 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0039 #include "FWCore/Framework/interface/FrameworkfwdMostUsed.h"
0040 #include "FWCore/Utilities/interface/ESGetToken.h"
0041 
0042 #include "TH1F.h"
0043 
0044 #include <iostream>
0045 #include <fstream>
0046 
0047 class TrackerTopology;
0048 
0049 class SiStripLorentzAngle;
0050 class StripDigiSimLink;
0051 
0052 namespace CLHEP {
0053   class HepRandomEngine;
0054 }
0055 
0056 class SiStripDigitizerAlgorithm {
0057 public:
0058   typedef SiDigitalConverter::DigitalVecType DigitalVecType;
0059   typedef SiDigitalConverter::DigitalRawVecType DigitalRawVecType;
0060   typedef SiPileUpSignals::SignalMapType SignalMapType;
0061   typedef std::map<int, float, std::less<int>> hit_map_type;
0062   typedef float Amplitude;
0063 
0064   // Constructor
0065   SiStripDigitizerAlgorithm(const edm::ParameterSet& conf, edm::ConsumesCollector iC);
0066 
0067   // Destructor
0068   ~SiStripDigitizerAlgorithm();
0069 
0070   void initializeDetUnit(StripGeomDetUnit const* det, SiStripBadStrip const&);
0071 
0072   void initializeEvent(const edm::EventSetup& iSetup);
0073 
0074   //run the algorithm to digitize a single det
0075   void accumulateSimHits(const std::vector<PSimHit>::const_iterator inputBegin,
0076                          const std::vector<PSimHit>::const_iterator inputEnd,
0077                          size_t inputBeginGlobalIndex,
0078                          unsigned int tofBin,
0079                          const StripGeomDetUnit* stripdet,
0080                          const GlobalVector& bfield,
0081                          const TrackerTopology* tTopo,
0082                          CLHEP::HepRandomEngine*);
0083 
0084   void digitize(edm::DetSet<SiStripDigi>& outDigis,
0085                 edm::DetSet<SiStripRawDigi>& outRawDigis,
0086                 edm::DetSet<SiStripRawDigi>& outStripAmplitudes,
0087                 edm::DetSet<SiStripRawDigi>& outStripAmplitudesPostAPV,
0088                 edm::DetSet<SiStripRawDigi>& outStripAPVBaselines,
0089                 edm::DetSet<StripDigiSimLink>& outLink,
0090                 const StripGeomDetUnit* stripdet,
0091                 const SiStripGain&,
0092                 const SiStripThreshold&,
0093                 const SiStripNoises&,
0094                 const SiStripPedestals&,
0095                 bool simulateAPVInThisEvent,
0096                 const SiStripApvSimulationParameters*,
0097                 std::vector<std::pair<int, std::bitset<6>>>& theAffectedAPVvector,
0098                 CLHEP::HepRandomEngine*,
0099                 const TrackerTopology* tTopo);
0100 
0101   void calculateInstlumiScale(PileupMixingContent* puInfo);
0102 
0103   // ParticleDataTable
0104   void setParticleDataTable(const ParticleDataTable* pardt) {
0105     theSiHitDigitizer->setParticleDataTable(pardt);
0106     pdt = pardt;
0107   }
0108 
0109 private:
0110   const double theThreshold;
0111   const double cmnRMStib;
0112   const double cmnRMStob;
0113   const double cmnRMStid;
0114   const double cmnRMStec;
0115   const double APVSaturationProbScaling_;
0116   const bool
0117       makeDigiSimLinks_;  //< Whether or not to create the association to sim truth collection. Set in configuration.
0118   const bool peakMode;
0119   const bool noise;
0120   const bool RealPedestals;
0121   const bool SingleStripNoise;
0122   const bool CommonModeNoise;
0123   const bool BaselineShift;
0124   const bool APVSaturationFromHIP;
0125 
0126   const int theFedAlgo;
0127   const bool zeroSuppression;
0128   const double theElectronPerADC;
0129 
0130   const double theTOFCutForPeak;
0131   const double theTOFCutForDeconvolution;
0132   const double tofCut;
0133   const double cosmicShift;
0134   const double inefficiency;
0135   const double pedOffset;
0136   const bool PreMixing_;
0137   const edm::ESGetToken<HepPDT::ParticleDataTable, PDTRecord> pdtToken_;
0138   const edm::ESGetToken<SiStripLorentzAngle, SiStripLorentzAngleSimRcd> lorentzAngleToken_;
0139 
0140   const ParticleDataTable* pdt;
0141   const ParticleData* particle;
0142 
0143   double APVSaturationProb_;
0144   bool FirstLumiCalc_;
0145   bool FirstDigitize_;
0146 
0147   const std::unique_ptr<SiHitDigitizer> theSiHitDigitizer;
0148   const std::unique_ptr<SiPileUpSignals> theSiPileUpSignals;
0149   const std::unique_ptr<const SiGaussianTailNoiseAdder> theSiNoiseAdder;
0150   const std::unique_ptr<SiTrivialDigitalConverter> theSiDigitalConverter;
0151   const std::unique_ptr<SiStripFedZeroSuppression> theSiZeroSuppress;
0152 
0153   // bad channels for each detector ID
0154   std::map<unsigned int, std::vector<bool>> allBadChannels;
0155   std::map<unsigned int, std::vector<bool>> allHIPChannels;
0156   // first and last channel wit signal for each detector ID
0157   std::map<unsigned int, size_t> firstChannelsWithSignal;
0158   std::map<unsigned int, size_t> lastChannelsWithSignal;
0159 
0160   // ESHandles
0161   edm::ESHandle<SiStripLorentzAngle> lorentzAngleHandle;
0162 
0163   /** This structure is used to keep track of the SimTrack that contributed to each digi
0164       so that the truth association can be created.*/
0165   struct AssociationInfo {
0166     unsigned int trackID;
0167     EncodedEventId eventID;
0168     float contributionToADC;
0169     size_t simHitGlobalIndex;  ///< The array index of the sim hit, but in the array for all crossings
0170     unsigned int tofBin;  // Needed along with subDet to determine which PSimHit collection simHitGlobalIndex indexes
0171   };
0172 
0173   typedef std::map<int, std::vector<AssociationInfo>> AssociationInfoForChannel;
0174   typedef std::map<uint32_t, AssociationInfoForChannel> AssociationInfoForDetId;
0175   /// Structure that holds the information on the SimTrack contributions. Only filled if makeDigiSimLinks_ is true.
0176   AssociationInfoForDetId associationInfoForDetId_;
0177 
0178   edm::FileInPath APVProbabilityFile;
0179 
0180   std::ifstream APVProbaFile;
0181   std::map<int, float> mapOfAPVprobabilities;
0182   std::map<int, std::bitset<6>> SiStripTrackerAffectedAPVMap;
0183   int NumberOfBxBetweenHIPandEvent;
0184 
0185   bool includeAPVSimulation_;
0186   const double apv_maxResponse_;
0187   const double apv_rate_;
0188   const double apv_mVPerQ_;
0189   const double apv_fCPerElectron_;
0190   unsigned int nTruePU_;
0191 };
0192 
0193 #endif