File indexing completed on 2023-03-17 10:44:13
0001
0002
0003
0004
0005
0006
0007 #include "CalibTracker/SiStripChannelGain/plugins/SiStripGainRandomCalculator.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010
0011 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0012 #include "Geometry/CommonTopologies/interface/StripTopology.h"
0013 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
0014
0015 #include "CLHEP/Random/RandGauss.h"
0016
0017 using namespace cms;
0018 using namespace std;
0019
0020 SiStripGainRandomCalculator::SiStripGainRandomCalculator(const edm::ParameterSet& iConfig)
0021 : ConditionDBWriter<SiStripApvGain>(iConfig) {
0022 edm::LogInfo("SiStripGainRandomCalculator::SiStripGainRandomCalculator");
0023
0024
0025
0026
0027
0028
0029 detid_apvs_.clear();
0030
0031 meanGain_ = iConfig.getParameter<double>("MeanGain");
0032 sigmaGain_ = iConfig.getParameter<double>("SigmaGain");
0033 minimumPosValue_ = iConfig.getParameter<double>("MinPositiveGain");
0034 printdebug_ = iConfig.getUntrackedParameter<bool>("printDebug", false);
0035
0036 tkGeomToken_ = esConsumes();
0037 }
0038
0039 SiStripGainRandomCalculator::~SiStripGainRandomCalculator() {
0040 edm::LogInfo("SiStripGainRandomCalculator::~SiStripGainRandomCalculator");
0041 }
0042
0043 void SiStripGainRandomCalculator::algoAnalyze(const edm::Event& event, const edm::EventSetup& iSetup) {
0044 if (tkDigiGeomRcdWatcher_.check(iSetup)) {
0045 const auto& dd = iSetup.getData(tkGeomToken_);
0046 edm::LogInfo("SiStripGainRandomCalculator::algoAnalyze - got new geometry ") << std::endl;
0047
0048 detid_apvs_.clear();
0049
0050 edm::LogInfo("SiStripGainCalculator") << " There are " << dd.detUnits().size() << " detectors" << std::endl;
0051
0052 for (const auto& it : dd.detUnits()) {
0053 if (dynamic_cast<const StripGeomDetUnit*>(it) != nullptr) {
0054 uint32_t detid = (it->geographicalId()).rawId();
0055 const StripTopology& p = dynamic_cast<const StripGeomDetUnit*>(it)->specificTopology();
0056 unsigned short NAPVs = p.nstrips() / 128;
0057 if (NAPVs < 1 || NAPVs > 6) {
0058 edm::LogError("SiStripGainCalculator")
0059 << " Problem with Number of strips in detector.. " << p.nstrips() << " Exiting program" << endl;
0060 exit(1);
0061 }
0062 detid_apvs_.push_back(pair<uint32_t, unsigned short>(detid, NAPVs));
0063 if (printdebug_)
0064 edm::LogInfo("SiStripGainCalculator") << "detid " << detid << " apvs " << NAPVs;
0065 }
0066 }
0067 }
0068 }
0069
0070 std::unique_ptr<SiStripApvGain> SiStripGainRandomCalculator::getNewObject() {
0071 std::cout << "SiStripGainRandomCalculator::getNewObject called" << std::endl;
0072
0073 auto obj = std::make_unique<SiStripApvGain>();
0074
0075 for (std::vector<pair<uint32_t, unsigned short> >::const_iterator it = detid_apvs_.begin(); it != detid_apvs_.end();
0076 it++) {
0077
0078 std::vector<float> theSiStripVector;
0079 for (unsigned short j = 0; j < it->second; j++) {
0080 float gain;
0081
0082
0083
0084 gain = CLHEP::RandGauss::shoot(meanGain_, sigmaGain_);
0085 if (gain <= minimumPosValue_)
0086 gain = minimumPosValue_;
0087
0088
0089 if (printdebug_)
0090 edm::LogInfo("SiStripGainCalculator") << "detid " << it->first << " \t"
0091 << " apv " << j << " \t" << gain << " \t" << std::endl;
0092 theSiStripVector.push_back(gain);
0093 }
0094
0095 SiStripApvGain::Range range(theSiStripVector.begin(), theSiStripVector.end());
0096 if (!obj->put(it->first, range))
0097 edm::LogError("SiStripGainCalculator") << "[SiStripGainCalculator::beginJob] detid already exists" << std::endl;
0098 }
0099
0100 return obj;
0101 }