Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:06:35

0001 #ifndef DPGAnalysis_SiStripTools_MultiplicityAlgorithms_H
0002 #define DPGAnalysis_SiStripTools_MultiplicityAlgorithms_H
0003 
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/EventSetup.h"
0006 #include "FWCore/Framework/interface/ConsumesCollector.h"
0007 #include "CalibTracker/Records/interface/SiStripQualityRcd.h"
0008 
0009 #include "DataFormats/Common/interface/DetSetVector.h"
0010 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0011 #include "DataFormats/Common/interface/DetSet.h"
0012 
0013 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
0014 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0015 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0016 #include "DataFormats/TrackerCommon/interface/ClusterSummary.h"
0017 
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 
0020 #include "DataFormats/Common/interface/Handle.h"
0021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0022 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
0023 
0024 #include "DPGAnalysis/SiStripTools/interface/Multiplicities.h"
0025 
0026 namespace edm {
0027   class EventSetup;
0028 };
0029 
0030 #include <string>
0031 
0032 namespace sistriptools::algorithm {
0033   class ClusterSummarySingleMultiplicity {
0034   public:
0035     using value_t = values::Multiplicity;
0036     ClusterSummarySingleMultiplicity(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC);
0037     ClusterSummarySingleMultiplicity(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iC);
0038 
0039     value_t getEvent(const edm::Event& iEvent, const edm::EventSetup& iSetup) const;
0040 
0041   private:
0042     ClusterSummary::CMSTracker m_subdetenum;
0043     ClusterSummary::VariablePlacement m_varenum;
0044     edm::EDGetTokenT<ClusterSummary> m_collection;
0045   };
0046 
0047   template <class T>
0048   class SingleMultiplicity {
0049   public:
0050     using value_t = values::Multiplicity;
0051     SingleMultiplicity(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC);
0052     SingleMultiplicity(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iC);
0053 
0054     value_t getEvent(const edm::Event& iEvent, const edm::EventSetup& iSetup) const;
0055 
0056   private:
0057     int m_modthr;
0058     bool m_useQuality;
0059     edm::ESGetToken<SiStripQuality, SiStripQualityRcd> m_qualityToken;
0060     edm::EDGetTokenT<T> m_collection;
0061   };
0062 
0063   template <class T>
0064   SingleMultiplicity<T>::SingleMultiplicity(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC)
0065       : m_modthr(iConfig.getUntrackedParameter<int>("moduleThreshold")),
0066         m_useQuality(iConfig.getUntrackedParameter<bool>("useQuality", false)),
0067         m_qualityToken(m_useQuality
0068                            ? decltype(m_qualityToken){iC.esConsumes<SiStripQuality, SiStripQualityRcd>(
0069                                  edm::ESInputTag{"", iConfig.getUntrackedParameter<std::string>("qualityLabel", "")})}
0070                            : decltype(m_qualityToken){}),
0071         m_collection(iC.consumes<T>(iConfig.getParameter<edm::InputTag>("collectionName"))) {}
0072   template <class T>
0073   SingleMultiplicity<T>::SingleMultiplicity(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iC)
0074       : m_modthr(iConfig.getUntrackedParameter<int>("moduleThreshold")),
0075         m_useQuality(iConfig.getUntrackedParameter<bool>("useQuality", false)),
0076         m_qualityToken(m_useQuality
0077                            ? decltype(m_qualityToken){iC.esConsumes<SiStripQuality, SiStripQualityRcd>(
0078                                  edm::ESInputTag(iConfig.getUntrackedParameter<std::string>("qualityLabel", "")))}
0079                            : decltype(m_qualityToken){}),
0080         m_collection(iC.consumes<T>(iConfig.getParameter<edm::InputTag>("collectionName"))) {}
0081 
0082   template <class T>
0083   typename SingleMultiplicity<T>::value_t SingleMultiplicity<T>::getEvent(const edm::Event& iEvent,
0084                                                                           const edm::EventSetup& iSetup) const {
0085     int mult = 0;
0086 
0087     const SiStripQuality* quality = nullptr;
0088     if (m_useQuality) {
0089       quality = &iSetup.getData(m_qualityToken);
0090     }
0091 
0092     edm::Handle<T> digis;
0093     iEvent.getByToken(m_collection, digis);
0094 
0095     for (typename T::const_iterator it = digis->begin(); it != digis->end(); it++) {
0096       if (!m_useQuality || !quality->IsModuleBad(it->detId())) {
0097         if (m_modthr < 0 || int(it->size()) < m_modthr) {
0098           mult += it->size();
0099           //      mult += it->size();
0100         }
0101       }
0102     }
0103     return value_t(mult);
0104   }
0105 
0106   template <class T1, class T2>
0107   class MultiplicityPair {
0108   public:
0109     using value_t = values::MultiplicityPair<typename T1::value_t, typename T2::value_t>;
0110     MultiplicityPair();
0111     MultiplicityPair(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC);
0112     MultiplicityPair(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iC);
0113 
0114     value_t getEvent(const edm::Event& iEvent, const edm::EventSetup& iSetup) const;
0115 
0116   private:
0117     T1 m_multiplicity1;
0118     T2 m_multiplicity2;
0119   };
0120 
0121   template <class T1, class T2>
0122   MultiplicityPair<T1, T2>::MultiplicityPair() : m_multiplicity1(), m_multiplicity2() {}
0123 
0124   template <class T1, class T2>
0125   MultiplicityPair<T1, T2>::MultiplicityPair(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC)
0126       : m_multiplicity1(iConfig.getParameter<edm::ParameterSet>("firstMultiplicityConfig"), iC),
0127         m_multiplicity2(iConfig.getParameter<edm::ParameterSet>("secondMultiplicityConfig"), iC) {}
0128   template <class T1, class T2>
0129   MultiplicityPair<T1, T2>::MultiplicityPair(const edm::ParameterSet& iConfig, edm::ConsumesCollector& iC)
0130       : m_multiplicity1(iConfig.getParameter<edm::ParameterSet>("firstMultiplicityConfig"), iC),
0131         m_multiplicity2(iConfig.getParameter<edm::ParameterSet>("secondMultiplicityConfig"), iC) {}
0132 
0133   template <class T1, class T2>
0134   typename MultiplicityPair<T1, T2>::value_t MultiplicityPair<T1, T2>::getEvent(const edm::Event& iEvent,
0135                                                                                 const edm::EventSetup& iSetup) const {
0136     auto m1 = m_multiplicity1.getEvent(iEvent, iSetup);
0137     auto m2 = m_multiplicity2.getEvent(iEvent, iSetup);
0138     return value_t(m1, m2);
0139   }
0140 
0141   typedef SingleMultiplicity<edm::DetSetVector<SiStripDigi> > SingleSiStripDigiMultiplicity;
0142   typedef SingleMultiplicity<edmNew::DetSetVector<SiStripCluster> > SingleSiStripClusterMultiplicity;
0143   typedef SingleMultiplicity<edmNew::DetSetVector<SiPixelCluster> > SingleSiPixelClusterMultiplicity;
0144   typedef MultiplicityPair<SingleMultiplicity<edmNew::DetSetVector<SiPixelCluster> >,
0145                            SingleMultiplicity<edmNew::DetSetVector<SiStripCluster> > >
0146       SiPixelClusterSiStripClusterMultiplicityPair;
0147   typedef MultiplicityPair<ClusterSummarySingleMultiplicity, ClusterSummarySingleMultiplicity>
0148       ClusterSummaryMultiplicityPair;
0149 }  // namespace sistriptools::algorithm
0150 
0151 #endif  // DPGAnalysis_SiStripTools_Multiplicities_H