Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 ///
0002 /// \class l1t::Stage1Layer2DiTauAlgorithm
0003 ///
0004 /// \authors:
0005 ///           R. Alex Barbieri
0006 ///
0007 /// Description: DiTau Algorithm
0008 
0009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0010 #include "L1Trigger/L1TCalorimeter/interface/Stage1Layer2HFRingSumAlgorithmImp.h"
0011 //#include "L1Trigger/L1TCalorimeter/interface/PUSubtractionMethods.h"
0012 //#include "L1Trigger/L1TCalorimeter/interface/legacyGtHelper.h"
0013 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctHFRingEtSums.h"
0014 
0015 l1t::Stage1Layer2DiTauAlgorithm::Stage1Layer2DiTauAlgorithm(CaloParamsHelper const* params) : params_(params) {}
0016 
0017 void l1t::Stage1Layer2DiTauAlgorithm::processEvent(const std::vector<l1t::CaloRegion>& regions,
0018                                                    const std::vector<l1t::CaloEmCand>& EMCands,
0019                                                    const std::vector<l1t::Tau>* taus,
0020                                                    l1t::CaloSpare* spares) {
0021   std::vector<l1t::Tau> isoTaus;
0022   for (std::vector<l1t::Tau>::const_iterator itTau = taus->begin(); itTau != taus->end(); ++itTau) {
0023     if (!itTau->hwIso())
0024       continue;
0025     isoTaus.push_back(*itTau);
0026   }
0027 
0028   int isoPtMax = 0;
0029   int diIsoPtMax = 0;
0030   int triIsoPtMax = 0;
0031   int quadIsoPtMax = 0;
0032   if (!isoTaus.empty()) {
0033     isoPtMax = isoTaus[0].hwPt();
0034     if (isoTaus.size() > 1)
0035       diIsoPtMax = isoTaus[1].hwPt();
0036     if (isoTaus.size() > 2)
0037       triIsoPtMax = isoTaus[2].hwPt();
0038     if (isoTaus.size() > 3)
0039       quadIsoPtMax = isoTaus[3].hwPt();
0040   }
0041 
0042   int rankIso = 0;
0043   int rankDiIso = 0;
0044   int rankTriIso = 0;
0045   int rankQuadIso = 0;
0046 
0047   bool useLut = true;
0048   // encode the highest pt Iso and DiIso in the HF ET rings
0049   if (useLut) {
0050     unsigned int MAX_LUT_ADDRESS = params_->tauEtToHFRingEtLUT()->maxSize() - 1;
0051     unsigned int lutAddress = isoPtMax;
0052     if (lutAddress > MAX_LUT_ADDRESS)
0053       lutAddress = MAX_LUT_ADDRESS;
0054     rankIso = params_->tauEtToHFRingEtLUT()->data(lutAddress);
0055 
0056     lutAddress = diIsoPtMax;
0057     if (lutAddress > MAX_LUT_ADDRESS)
0058       lutAddress = MAX_LUT_ADDRESS;
0059     rankDiIso = params_->tauEtToHFRingEtLUT()->data(lutAddress);
0060 
0061     lutAddress = triIsoPtMax;
0062     if (lutAddress > MAX_LUT_ADDRESS)
0063       lutAddress = MAX_LUT_ADDRESS;
0064     rankTriIso = params_->tauEtToHFRingEtLUT()->data(lutAddress);
0065 
0066     lutAddress = quadIsoPtMax;
0067     if (lutAddress > MAX_LUT_ADDRESS)
0068       lutAddress = MAX_LUT_ADDRESS;
0069     rankQuadIso = params_->tauEtToHFRingEtLUT()->data(lutAddress);
0070 
0071   } else {
0072     double etIso = params_->jetScale().et(isoPtMax);  // convert from hwPt to Physical pT
0073     double etDiIso = params_->jetScale().et(diIsoPtMax);
0074     double etTriIso = params_->jetScale().et(triIsoPtMax);
0075     double etQuadIso = params_->jetScale().et(quadIsoPtMax);
0076     rankIso = params_->HfRingScale().rank(etIso);  //convert to HfRingScale Rank
0077     rankDiIso = params_->HfRingScale().rank(etDiIso);
0078     rankTriIso = params_->HfRingScale().rank(etTriIso);
0079     rankQuadIso = params_->HfRingScale().rank(etQuadIso);
0080   }
0081 
0082   // std::cout << "Max Iso Tau pT: " << isoPtMax << "\t" << etIso << "\t" << rankIso << std::endl;
0083 
0084   L1GctHFRingEtSums s;
0085   s.setEtSum(0, rankIso);
0086   s.setEtSum(1, rankDiIso);
0087   s.setEtSum(2, rankTriIso);
0088   s.setEtSum(3, rankQuadIso);
0089   uint16_t raw = s.raw();
0090   spares->setHwPt(raw);
0091 }