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