File indexing completed on 2023-05-10 03:53:09
0001 #ifndef _CSCCROSSTALKDBCONDITIONS_H
0002 #define _CSCCROSSTALKDBCONDITIONS_H
0003
0004 #include "FWCore/Framework/interface/ESHandle.h"
0005 #include "FWCore/Framework/interface/ESProducer.h"
0006 #include "FWCore/Framework/interface/Event.h"
0007 #include "FWCore/Framework/interface/EventSetup.h"
0008 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
0009 #include "FWCore/Framework/interface/Frameworkfwd.h"
0010 #include "FWCore/Framework/interface/MakerMacros.h"
0011 #include "FWCore/Framework/interface/SourceFactory.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 #include <cmath>
0014 #include <memory>
0015
0016 #include "CondFormats/CSCObjects/interface/CSCDBCrosstalk.h"
0017 #include "CondFormats/DataRecord/interface/CSCDBCrosstalkRcd.h"
0018 #include <DataFormats/MuonDetId/interface/CSCDetId.h>
0019
0020 class CSCCrosstalkDBConditions : public edm::ESProducer, public edm::EventSetupRecordIntervalFinder {
0021 public:
0022 CSCCrosstalkDBConditions(const edm::ParameterSet &);
0023 ~CSCCrosstalkDBConditions() override;
0024
0025 inline static CSCDBCrosstalk *prefillDBCrosstalk();
0026
0027 typedef std::unique_ptr<CSCDBCrosstalk> ReturnType;
0028
0029 ReturnType produceDBCrosstalk(const CSCDBCrosstalkRcd &);
0030
0031 private:
0032
0033 void setIntervalFor(const edm::eventsetup::EventSetupRecordKey &,
0034 const edm::IOVSyncValue &,
0035 edm::ValidityInterval &) override;
0036 };
0037
0038 #include <fstream>
0039 #include <iostream>
0040 #include <vector>
0041
0042
0043 inline CSCDBCrosstalk *CSCCrosstalkDBConditions::prefillDBCrosstalk() {
0044
0045 const int MAX_SIZE = 252288;
0046 const int SLOPE_FACTOR = 10000000;
0047 const int INTERCEPT_FACTOR = 100000;
0048 const int MAX_SHORT = 32767;
0049 CSCDBCrosstalk *cndbcrosstalk = new CSCDBCrosstalk();
0050
0051 int db_index, new_index;
0052 float db_slope_right, db_slope_left, db_intercept_right;
0053 float db_intercept_left;
0054 std::vector<int> db_index_id;
0055 std::vector<float> db_slope_r;
0056 std::vector<float> db_intercept_r;
0057 std::vector<float> db_slope_l;
0058 std::vector<float> db_intercept_l;
0059 float new_slope_right, new_slope_left, new_intercept_right;
0060 float new_intercept_left;
0061 std::vector<int> new_index_id;
0062 std::vector<float> new_slope_r;
0063 std::vector<float> new_intercept_r;
0064 std::vector<float> new_slope_l;
0065 std::vector<float> new_intercept_l;
0066
0067 int counter;
0068
0069 std::ifstream dbdata;
0070 dbdata.open("old_dbxtalk.dat", std::ios::in);
0071 if (!dbdata) {
0072 std::cerr << "Error: old_dbxtalk.dat -> no such file!" << std::endl;
0073 exit(1);
0074 }
0075
0076 while (!dbdata.eof()) {
0077 dbdata >> db_index >> db_slope_right >> db_intercept_right >> db_slope_left >> db_intercept_left;
0078 db_index_id.push_back(db_index);
0079 db_slope_r.push_back(db_slope_right);
0080 db_slope_l.push_back(db_slope_left);
0081 db_intercept_r.push_back(db_intercept_right);
0082 db_intercept_l.push_back(db_intercept_left);
0083 }
0084 dbdata.close();
0085
0086 std::ifstream newdata;
0087 newdata.open("xtalk.dat", std::ios::in);
0088 if (!newdata) {
0089 std::cerr << "Error: xtalk.dat -> no such file!" << std::endl;
0090 exit(1);
0091 }
0092
0093 while (!newdata.eof()) {
0094 newdata >> new_index >> new_slope_right >> new_intercept_right >> new_slope_left >> new_intercept_left;
0095 new_index_id.push_back(new_index);
0096 new_slope_r.push_back(new_slope_right);
0097 new_slope_l.push_back(new_slope_left);
0098 new_intercept_r.push_back(new_intercept_right);
0099 new_intercept_l.push_back(new_intercept_left);
0100 }
0101 newdata.close();
0102
0103 CSCDBCrosstalk::CrosstalkContainer &itemvector = cndbcrosstalk->crosstalk;
0104 itemvector.resize(MAX_SIZE);
0105 cndbcrosstalk->factor_slope = int(SLOPE_FACTOR);
0106 cndbcrosstalk->factor_intercept = int(INTERCEPT_FACTOR);
0107
0108 for (int i = 0; i < MAX_SIZE; ++i) {
0109 itemvector[i].xtalk_slope_right = (short int)(db_slope_r[i] * SLOPE_FACTOR + 0.5);
0110 itemvector[i].xtalk_intercept_right = (short int)(db_intercept_r[i] * INTERCEPT_FACTOR + 0.5);
0111 itemvector[i].xtalk_slope_left = (short int)(db_slope_l[i] * SLOPE_FACTOR + 0.5);
0112 itemvector[i].xtalk_intercept_left = (short int)(db_intercept_l[i] * INTERCEPT_FACTOR + 0.5);
0113 }
0114
0115 for (int i = 0; i < MAX_SIZE; ++i) {
0116 counter = db_index_id[i];
0117 for (unsigned int k = 0; k < new_index_id.size() - 1; k++) {
0118 if (counter == new_index_id[k]) {
0119 if ((short int)(fabs(new_slope_r[k] * SLOPE_FACTOR + 0.5)) < MAX_SHORT)
0120 itemvector[counter].xtalk_slope_right = int(new_slope_r[k] * SLOPE_FACTOR + 0.5);
0121 if ((short int)(fabs(new_intercept_r[k] * INTERCEPT_FACTOR + 0.5)) < MAX_SHORT)
0122 itemvector[counter].xtalk_intercept_right = int(new_intercept_r[k] * INTERCEPT_FACTOR + 0.5);
0123 if ((short int)(fabs(new_slope_l[k] * SLOPE_FACTOR + 0.5)) < MAX_SHORT)
0124 itemvector[counter].xtalk_slope_left = int(new_slope_l[k] * SLOPE_FACTOR + 0.5);
0125 if ((short int)(fabs(new_intercept_l[k] * INTERCEPT_FACTOR + 0.5)) < MAX_SHORT)
0126 itemvector[counter].xtalk_intercept_left = int(new_intercept_l[k] * INTERCEPT_FACTOR + 0.5);
0127 itemvector[i] = itemvector[counter];
0128
0129
0130 }
0131 }
0132
0133 if (counter > 223968) {
0134 itemvector[counter].xtalk_slope_right = int(db_slope_r[i]);
0135 itemvector[counter].xtalk_slope_left = int(db_slope_l[i]);
0136 itemvector[counter].xtalk_intercept_right = int(db_intercept_r[i]);
0137 itemvector[counter].xtalk_intercept_left = int(db_intercept_l[i]);
0138 }
0139 }
0140
0141 return cndbcrosstalk;
0142 }
0143
0144 #endif