File indexing completed on 2023-03-17 10:53:25
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
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 }
0150
0151 #endif