Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:20:25

0001 ///
0002 /// \class l1t::Stage2Layer2JetSumAlgorithmFirmwareImp1
0003 ///
0004 /// \author: Jim Brooke
0005 ///
0006 /// Description: first iteration of stage 2 jet algo
0007 
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "L1Trigger/L1TCalorimeter/interface/Stage2Layer2JetSumAlgorithmFirmware.h"
0010 #include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
0011 
0012 l1t::Stage2Layer2JetSumAlgorithmFirmwareImp1::Stage2Layer2JetSumAlgorithmFirmwareImp1(CaloParamsHelper const* params) {
0013   httJetThresholdHw_ = floor(params->etSumEtThreshold(1) / params->jetLsb());
0014   mhtJetThresholdHw_ = floor(params->etSumEtThreshold(3) / params->jetLsb());
0015 
0016   httEtaMax_ = params->etSumEtaMax(1);
0017   httEtaMaxHF_ = CaloTools::kHFEnd;
0018   mhtEtaMax_ = params->etSumEtaMax(3);
0019   mhtEtaMaxHF_ = CaloTools::kHFEnd;
0020 }
0021 
0022 void l1t::Stage2Layer2JetSumAlgorithmFirmwareImp1::processEvent(const std::vector<l1t::Jet>& alljets,
0023                                                                 std::vector<l1t::EtSum>& htsums) {
0024   // etaSide=1 is positive eta, etaSide=-1 is negative eta
0025   for (int etaSide = 1; etaSide >= -1; etaSide -= 2) {
0026     int hx(0), hy(0), ht(0);
0027     int hxHF(0), hyHF(0), htHF(0);
0028 
0029     bool satMht(false), satMhtHF(false), satHt(false), satHtHF(false);
0030 
0031     // loop over rings
0032     for (unsigned absieta = 1; absieta <= (unsigned int)CaloTools::mpEta(CaloTools::kHFEnd); absieta++) {
0033       int ieta = etaSide * absieta;
0034 
0035       int ringHx(0), ringHy(0), ringHt(0);
0036       int ringHxHF(0), ringHyHF(0), ringHtHF(0);
0037 
0038       // loop over phi
0039       for (int iphi = 1; iphi <= CaloTools::kHBHENrPhi; iphi++) {
0040         // find the jet at this (eta,phi)
0041         l1t::Jet thisJet;
0042         bool foundJet = false;
0043         for (unsigned jetIt = 0; jetIt < alljets.size(); jetIt++) {
0044           if (CaloTools::mpEta(alljets.at(jetIt).hwEta()) == ieta && alljets.at(jetIt).hwPhi() == iphi) {
0045             thisJet = alljets.at(jetIt);
0046             foundJet = true;
0047           }
0048         }
0049         if (!foundJet)
0050           continue;
0051 
0052         // x- and -y coefficients are truncated by after multiplication of Et by trig coefficient.
0053         // The trig coefficients themselves take values [-1023,1023] and so were scaled by
0054         // 2^10 = 1024, which requires bitwise shift to the right of the final value by 10 bits.
0055         // The 4 below account for part of that and the rest is accounted for at ouput of demux
0056         // (see Stage2Layer2DemuxSumsAlgoFirmwareImp1.cc)
0057 
0058         if (thisJet.hwPt() > mhtJetThresholdHw_ &&
0059             CaloTools::mpEta(abs(thisJet.hwEta())) <= CaloTools::mpEta(mhtEtaMax_)) {
0060           if (thisJet.hwPt() == CaloTools::kSatJet) {
0061             satMht = true;
0062             satMhtHF = true;
0063           } else {
0064             ringHx += (int)((thisJet.hwPt() * CaloTools::cos_coeff[iphi - 1]) >> 4);
0065             ringHy += (int)((thisJet.hwPt() * CaloTools::sin_coeff[iphi - 1]) >> 4);
0066           }
0067         }
0068         if (thisJet.hwPt() > mhtJetThresholdHw_ &&
0069             CaloTools::mpEta(abs(thisJet.hwEta())) <= CaloTools::mpEta(mhtEtaMaxHF_)) {
0070           if (thisJet.hwPt() == CaloTools::kSatJet)
0071             satMhtHF = true;
0072           else {
0073             ringHxHF += (int)((thisJet.hwPt() * CaloTools::cos_coeff[iphi - 1]) >> 4);
0074             ringHyHF += (int)((thisJet.hwPt() * CaloTools::sin_coeff[iphi - 1]) >> 4);
0075           }
0076         }
0077 
0078         if (thisJet.hwPt() > httJetThresholdHw_ &&
0079             CaloTools::mpEta(abs(thisJet.hwEta())) <= CaloTools::mpEta(httEtaMax_)) {
0080           if (thisJet.hwPt() == CaloTools::kSatJet) {
0081             satHt = true;
0082             satHtHF = true;
0083           } else
0084             ringHt += thisJet.hwPt();
0085         }
0086         if (thisJet.hwPt() > httJetThresholdHw_ &&
0087             CaloTools::mpEta(abs(thisJet.hwEta())) <= CaloTools::mpEta(httEtaMaxHF_)) {
0088           if (thisJet.hwPt() == CaloTools::kSatJet)
0089             satHtHF = true;
0090           else
0091             ringHtHF += thisJet.hwPt();
0092         }
0093       }
0094 
0095       hx += ringHx;
0096       hy += ringHy;
0097       ht += ringHt;
0098 
0099       hxHF += ringHxHF;
0100       hyHF += ringHyHF;
0101       htHF += ringHtHF;
0102     }
0103 
0104     if (satHt)
0105       ht = 0xffff;
0106     if (satHtHF)
0107       htHF = 0xffff;
0108 
0109     if (satMht) {
0110       hx = 0x7fffffff;
0111       hy = 0x7fffffff;
0112     }
0113     if (satMhtHF) {
0114       hxHF = 0x7fffffff;
0115       hyHF = 0x7fffffff;
0116     }
0117 
0118     math::XYZTLorentzVector p4;
0119 
0120     l1t::EtSum htSumHt(p4, l1t::EtSum::EtSumType::kTotalHt, ht, 0, 0, 0);
0121     l1t::EtSum htSumHx(p4, l1t::EtSum::EtSumType::kTotalHtx, hx, 0, 0, 0);
0122     l1t::EtSum htSumHy(p4, l1t::EtSum::EtSumType::kTotalHty, hy, 0, 0, 0);
0123 
0124     l1t::EtSum htSumHtHF(p4, l1t::EtSum::EtSumType::kTotalHtHF, htHF, 0, 0, 0);
0125     l1t::EtSum htSumHxHF(p4, l1t::EtSum::EtSumType::kTotalHtxHF, hxHF, 0, 0, 0);
0126     l1t::EtSum htSumHyHF(p4, l1t::EtSum::EtSumType::kTotalHtyHF, hyHF, 0, 0, 0);
0127 
0128     htsums.push_back(htSumHt);
0129     htsums.push_back(htSumHx);
0130     htsums.push_back(htSumHy);
0131 
0132     htsums.push_back(htSumHtHF);
0133     htsums.push_back(htSumHxHF);
0134     htsums.push_back(htSumHyHF);
0135   }
0136 }