Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-07-16 02:43:03

0001 #ifndef L1Trigger_Phase2L1GMT_KMTFLUTS_h
0002 #define L1Trigger_Phase2L1GMT_KMTFLUTS_h
0003 #include <cstdlib>
0004 #include "TH1.h"
0005 #include "TFile.h"
0006 #include <map>
0007 #include "FWCore/ParameterSet/interface/FileInPath.h"
0008 
0009 namespace Phase2L1GMT {
0010 
0011   class KMTFLUTs {
0012   public:
0013     KMTFLUTs(const std::string &filename) {
0014       edm::FileInPath path(filename);
0015       lutFile_ = new TFile(path.fullPath().c_str());
0016       lut_[3 * 64 + 8] = (TH1 *)lutFile_->Get("gain_8_3");
0017       lut_[2 * 64 + 8] = (TH1 *)lutFile_->Get("gain_8_2");
0018       lut_[2 * 64 + 12] = (TH1 *)lutFile_->Get("gain_12_2");
0019       lut_[2 * 64 + 4] = (TH1 *)lutFile_->Get("gain_4_2");
0020       lut_[1 * 64 + 12] = (TH1 *)lutFile_->Get("gain_12_1");
0021       lut_[1 * 64 + 10] = (TH1 *)lutFile_->Get("gain_10_1");
0022       lut_[1 * 64 + 6] = (TH1 *)lutFile_->Get("gain_6_1");
0023       lut_[1 * 64 + 14] = (TH1 *)lutFile_->Get("gain_14_1");
0024       lut_[3] = (TH1 *)lutFile_->Get("gain_3_0");
0025       lut_[5] = (TH1 *)lutFile_->Get("gain_5_0");
0026       lut_[6] = (TH1 *)lutFile_->Get("gain_6_0");
0027       lut_[7] = (TH1 *)lutFile_->Get("gain_7_0");
0028       lut_[9] = (TH1 *)lutFile_->Get("gain_9_0");
0029       lut_[10] = (TH1 *)lutFile_->Get("gain_10_0");
0030       lut_[11] = (TH1 *)lutFile_->Get("gain_11_0");
0031       lut_[12] = (TH1 *)lutFile_->Get("gain_12_0");
0032       lut_[13] = (TH1 *)lutFile_->Get("gain_13_0");
0033       lut_[14] = (TH1 *)lutFile_->Get("gain_14_0");
0034       lut_[15] = (TH1 *)lutFile_->Get("gain_15_0");
0035 
0036       lut2HH_[3 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_3_HH");
0037       lut2HH_[2 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_2_HH");
0038       lut2HH_[2 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_2_HH");
0039       lut2HH_[1 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_1_HH");
0040       lut2HH_[1 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_1_HH");
0041       lut2HH_[1 * 64 + 2] = (TH1 *)lutFile_->Get("gain2_2_1_HH");
0042 
0043       lut2LH_[3 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_3_LH");
0044       lut2LH_[2 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_2_LH");
0045       lut2LH_[2 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_2_LH");
0046       lut2LH_[1 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_1_LH");
0047       lut2LH_[1 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_1_LH");
0048       lut2LH_[1 * 64 + 2] = (TH1 *)lutFile_->Get("gain2_2_1_LH");
0049 
0050       lut2HL_[3 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_3_HL");
0051       lut2HL_[2 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_2_HL");
0052       lut2HL_[2 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_2_HL");
0053       lut2HL_[1 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_1_HL");
0054       lut2HL_[1 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_1_HL");
0055       lut2HL_[1 * 64 + 2] = (TH1 *)lutFile_->Get("gain2_2_1_HL");
0056 
0057       lut2LL_[3 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_3_LL");
0058       lut2LL_[2 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_2_LL");
0059       lut2LL_[2 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_2_LL");
0060       lut2LL_[1 * 64 + 8] = (TH1 *)lutFile_->Get("gain2_8_1_LL");
0061       lut2LL_[1 * 64 + 4] = (TH1 *)lutFile_->Get("gain2_4_1_LL");
0062       lut2LL_[1 * 64 + 2] = (TH1 *)lutFile_->Get("gain2_2_1_LL");
0063 
0064       coarseEta_ = (TH1 *)lutFile_->Get("coarseETALUT");
0065     }
0066 
0067     ~KMTFLUTs() {
0068       lutFile_->Close();
0069       if (lutFile_ != nullptr)
0070         delete lutFile_;
0071     }
0072 
0073     std::vector<float> trackGain(uint step, uint bitmask, uint K) {
0074       std::vector<float> gain(4, 0.0);
0075       const TH1 *h = lut_[64 * step + bitmask];
0076       gain[0] = h->GetBinContent(K + 1);
0077       gain[2] = h->GetBinContent(1024 + K + 1);
0078       return gain;
0079     }
0080 
0081     std::vector<float> trackGain2(uint step, uint bitmask, uint K, uint qual1, uint qual2) {
0082       std::vector<float> gain(4, 0.0);
0083       const TH1 *h;
0084       if (qual1 < 6) {
0085         if (qual2 < 6)
0086           h = lut2LL_[64 * step + bitmask];
0087         else
0088           h = lut2LH_[64 * step + bitmask];
0089       } else {
0090         if (qual2 < 6)
0091           h = lut2HL_[64 * step + bitmask];
0092         else
0093           h = lut2HH_[64 * step + bitmask];
0094       }
0095       gain[0] = h->GetBinContent(K + 1);
0096       gain[1] = h->GetBinContent(512 + K + 1);
0097       gain[2] = h->GetBinContent(2 * 512 + K + 1);
0098       gain[3] = h->GetBinContent(3 * 512 + K + 1);
0099       return gain;
0100     }
0101 
0102     std::pair<float, float> vertexGain(uint bitmask, uint K) {
0103       const TH1 *h = lut_[bitmask];
0104       std::pair<float, float> gain(-h->GetBinContent(K + 1), -h->GetBinContent(1024 + K + 1));
0105       return gain;
0106     }
0107 
0108     uint coarseEta(uint mask) {
0109       return uint((1 << 12) * coarseEta_->GetBinContent(coarseEta_->GetXaxis()->FindBin(mask)) / M_PI);
0110     }
0111 
0112     TFile *lutFile_;
0113     std::map<uint, const TH1 *> lut_;
0114     std::map<uint, const TH1 *> lut2HH_;
0115     std::map<uint, const TH1 *> lut2LH_;
0116     std::map<uint, const TH1 *> lut2HL_;
0117     std::map<uint, const TH1 *> lut2LL_;
0118     const TH1 *coarseEta_;
0119   };
0120 
0121 }  // namespace Phase2L1GMT
0122 #endif