Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:58:20

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   // ----------member data ---------------------------
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 // to workaround plugin library
0043 inline CSCDBCrosstalk *CSCCrosstalkDBConditions::prefillDBCrosstalk() {
0044   // const int MAX_SIZE = 273024; //for ME1a unganged
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         // std::cout<<" counter "<<counter <<" dbindex "<<new_index_id[k]<<"
0129         // dbslope " <<db_slope_r[k]<<" new slope "<<new_slope_r[k]<<std::endl;
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