Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:27

0001 #ifndef SISTRIPCLUSTERIZER_SISTRIPCLUSTERINFO_H
0002 #define SISTRIPCLUSTERIZER_SISTRIPCLUSTERINFO_H
0003 
0004 #include "CalibFormats/SiStripObjects/interface/SiStripGain.h"
0005 #include "CalibTracker/Records/interface/SiStripGainRcd.h"
0006 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
0007 #include "CalibTracker/Records/interface/SiStripQualityRcd.h"
0008 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
0009 #include "CondFormats/DataRecord/interface/SiStripNoisesRcd.h"
0010 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0011 #include "FWCore/Framework/interface/ConsumesCollector.h"
0012 #include "FWCore/Framework/interface/EventSetup.h"
0013 #include "FWCore/Utilities/interface/ESGetToken.h"
0014 
0015 #include <algorithm>
0016 #include <cstdint>
0017 #include <numeric>
0018 #include <utility>
0019 #include <vector>
0020 
0021 class SiStripClusterInfo {
0022 public:
0023   SiStripClusterInfo(edm::ConsumesCollector&&, const std::string& qualityLabel = "");
0024 
0025   void initEvent(const edm::EventSetup& iSetup);
0026   void setCluster(const SiStripCluster& cluster, int detId);
0027 
0028   const SiStripCluster* cluster() const { return cluster_ptr; }
0029 
0030   uint32_t detId() const { return detId_; }
0031   uint16_t width() const { return cluster()->amplitudes().size(); }
0032   uint16_t firstStrip() const { return cluster()->firstStrip(); }
0033   float baryStrip() const { return cluster()->barycenter(); }
0034   uint16_t maxStrip() const { return firstStrip() + maxIndex(); }
0035   float variance() const;
0036 
0037   auto stripCharges() const -> decltype(cluster()->amplitudes()) { return cluster()->amplitudes(); }
0038   std::vector<float> stripGains() const;
0039   std::vector<float> stripNoises() const;
0040   std::vector<float> stripNoisesRescaledByGain() const;
0041   std::vector<bool> stripQualitiesBad() const;
0042 
0043   uint16_t charge() const { return std::accumulate(stripCharges().begin(), stripCharges().end(), uint16_t(0)); }
0044   uint8_t maxCharge() const { return *std::max_element(stripCharges().begin(), stripCharges().end()); }
0045   uint16_t maxIndex() const {
0046     return std::max_element(stripCharges().begin(), stripCharges().end()) - stripCharges().begin();
0047   }
0048   std::pair<uint16_t, uint16_t> chargeLR() const;
0049 
0050   float noise() const { return calculate_noise(stripNoises()); }
0051   float noiseRescaledByGain() const { return calculate_noise(stripNoisesRescaledByGain()); }
0052 
0053   float signalOverNoise() const { return charge() / noiseRescaledByGain(); }
0054 
0055   bool IsAnythingBad() const;
0056   bool IsApvBad() const;
0057   bool IsFiberBad() const;
0058   bool IsModuleBad() const;
0059   bool IsModuleUsable() const;
0060 
0061   const SiStripGain* siStripGain() const { return siStripGain_; }
0062   const SiStripQuality* siStripQuality() const { return siStripQuality_; }
0063 
0064 private:
0065   float calculate_noise(const std::vector<float>&) const;
0066 
0067   const SiStripCluster* cluster_ptr = nullptr;
0068 
0069   edm::ESGetToken<SiStripNoises, SiStripNoisesRcd> siStripNoisesToken_;
0070   edm::ESGetToken<SiStripGain, SiStripGainRcd> siStripGainToken_;
0071   edm::ESGetToken<SiStripQuality, SiStripQualityRcd> siStripQualityToken_;
0072 
0073   const SiStripNoises* siStripNoises_ = nullptr;
0074   const SiStripGain* siStripGain_ = nullptr;
0075   const SiStripQuality* siStripQuality_ = nullptr;
0076 
0077   uint32_t detId_ = 0;
0078 };
0079 
0080 #endif