Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:29:22

0001 #ifndef SimCalorimetry_EcalEBTrigPrimAlgos_EcalEBPhase2TrigPrimAlgo_h
0002 #define SimCalorimetry_EcalEBTrigPrimAlgos_EcalEBPhase2TrigPrimAlgo_h
0003 /** \class EcalEBPhase2TrigPrimAlgo
0004 \author L. Lutton, N. Marinelli - Univ. of Notre Dame
0005   Description: forPhase II                                                       
0006   It uses the new Phase2 digis based onthe new EB electronics                                                                                                                                       
0007  This is the main algo which plugs in all the subcomponents for the
0008  amplitude and time measurement and the spike flagging
0009 */
0010 
0011 #include <sys/time.h>
0012 #include <iostream>
0013 #include <vector>
0014 
0015 #include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
0016 #include "Geometry/CaloTopology/interface/EcalTrigTowerConstituentsMap.h"
0017 #include "DataFormats/EcalDetId/interface/EcalTriggerElectronicsId.h"
0018 #include "DataFormats/Common/interface/SortedCollection.h"
0019 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0020 
0021 #include "FWCore/Framework/interface/EventSetup.h"
0022 #include "FWCore/Framework/interface/ESHandle.h"
0023 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0024 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0025 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0026 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0027 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
0028 #include "DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h"
0029 #include "CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h"
0030 
0031 #include "SimCalorimetry/EcalEBTrigPrimAlgos/interface/EcalEBPhase2Linearizer.h"
0032 #include "SimCalorimetry/EcalEBTrigPrimAlgos/interface/EcalEBPhase2AmplitudeReconstructor.h"
0033 #include "SimCalorimetry/EcalEBTrigPrimAlgos/interface/EcalEBPhase2TimeReconstructor.h"
0034 #include "SimCalorimetry/EcalEBTrigPrimAlgos/interface/EcalEBPhase2SpikeTagger.h"
0035 #include "SimCalorimetry/EcalEBTrigPrimAlgos/interface/EcalEBPhase2TPFormatter.h"
0036 
0037 #include <map>
0038 #include <utility>
0039 
0040 class EcalTrigTowerDetId;
0041 class ETPCoherenceTest;
0042 class EcalEBPhase2TriggerPrimitiveSample;
0043 class CaloSubdetectorGeometry;
0044 class EBDataFrame_Ph2;
0045 
0046 class EcalEBPhase2TrigPrimAlgo {
0047 public:
0048   explicit EcalEBPhase2TrigPrimAlgo(const EcalTrigTowerConstituentsMap *eTTmap,
0049                                     const CaloGeometry *theGeometry,
0050                                     int binofmax,
0051                                     bool debug);
0052 
0053   virtual ~EcalEBPhase2TrigPrimAlgo();
0054 
0055   void run(const EBDigiCollectionPh2 *col, EcalEBPhase2TrigPrimDigiCollection &result);
0056 
0057   void setPointers(const EcalLiteDTUPedestalsMap *ecaltpPed,
0058                    const EcalEBPhase2TPGLinearizationConstMap *ecaltpLin,
0059                    const EcalTPGCrystalStatus *ecaltpgBadX,
0060                    const EcalEBPhase2TPGAmplWeightIdMap *ecaltpgAmplWeightMap,
0061                    const EcalEBPhase2TPGTimeWeightIdMap *ecaltpgTimeWeightMap,
0062                    const EcalTPGWeightGroup *ecaltpgWeightGroup) {
0063     ecaltpPed_ = ecaltpPed;
0064     ecaltpgBadX_ = ecaltpgBadX;
0065     ecaltpLin_ = ecaltpLin;
0066     ecaltpgAmplWeightMap_ = ecaltpgAmplWeightMap;
0067     ecaltpgTimeWeightMap_ = ecaltpgTimeWeightMap;
0068     ecaltpgWeightGroup_ = ecaltpgWeightGroup;
0069   }
0070 
0071 private:
0072   //old void init(const edm::EventSetup & setup);
0073   void init();
0074   template <class T>
0075   void initStructures(std::vector<std::vector<std::pair<int, std::vector<T> > > > &towMap);
0076   template <class T>
0077   void clean(std::vector<std::vector<std::pair<int, std::vector<T> > > > &towerMap);
0078 
0079   void fillMap(EBDigiCollectionPh2 const *col,
0080                std::vector<std::vector<std::pair<int, std::vector<EBDataFrame_Ph2> > > > &towerMap);
0081 
0082   int findStripNr(const EBDetId &id);
0083 
0084   int getIndex(const EBDigiCollectionPh2 *, EcalTrigTowerDetId &id) { return id.hashedIndex(); }
0085   // mind that eta is continuous between barrel+endcap
0086   //  int getIndex(const  EEDigiCollectionPh2 *, EcalTrigTowerDetId& id) {
0087   // int ind=(id.ietaAbs()-18)*72 + id.iphi();
0088   // if (id.zside()<0) ind+=792;
0089   // return ind;
0090   // }
0091 
0092   const EcalTrigTowerConstituentsMap *eTTmap_ = nullptr;
0093   const CaloGeometry *theGeometry_ = nullptr;
0094 
0095   int binOfMaximum_;
0096   int maxNrSamples_;
0097   bool debug_;
0098 
0099   int nrTowers_;  // nr of towers found by fillmap method
0100   static const unsigned int maxNrTowers_;
0101   static const unsigned int nrSamples_;
0102 
0103   // data structures kept during the whole run
0104   std::vector<std::vector<int> > striptp_;
0105   std::vector<std::vector<std::pair<int, std::vector<EBDataFrame_Ph2> > > > towerMapEB_;
0106   std::vector<std::pair<int, EcalTrigTowerDetId> > hitTowers_;
0107   std::vector<EcalEBPhase2TriggerPrimitiveSample> towtp_;
0108   std::vector<EcalEBPhase2TriggerPrimitiveSample> towtp2_;
0109 
0110   enum { nbMaxStrips_ = 5 };
0111   enum { nbMaxXtals_ = 5 };
0112 
0113   const EcalElectronicsMapping *theMapping_;
0114 
0115   EcalEBPhase2Linearizer *linearizer_;
0116 
0117   EcalEBPhase2AmplitudeReconstructor *amplitude_reconstructor_;
0118   EcalEBPhase2TimeReconstructor *time_reconstructor_;
0119   EcalEBPhase2SpikeTagger *spike_tagger_;
0120   EcalEBPhase2TPFormatter *tpFormatter_;
0121 
0122   //
0123 
0124   const EcalLiteDTUPedestalsMap *ecaltpPed_;
0125   const EcalTPGCrystalStatus *ecaltpgBadX_;
0126 
0127   const EcalTPGWeightGroup *ecaltpgWeightGroup_;
0128   const EcalEBPhase2TPGLinearizationConstMap *ecaltpLin_;
0129   const EcalEBPhase2TPGAmplWeightIdMap *ecaltpgAmplWeightMap_;
0130   const EcalEBPhase2TPGTimeWeightIdMap *ecaltpgTimeWeightMap_;
0131 
0132   EcalEBPhase2Linearizer *getLinearizer() const { return linearizer_; }
0133   std::vector<int> lin_out_;
0134   //
0135   EcalEBPhase2AmplitudeReconstructor *getAmplitudeFinder() const { return amplitude_reconstructor_; }
0136   std::vector<int> filt_out_;
0137   std::vector<int64_t> time_out_;
0138   std::vector<int> amp_out_;
0139   std::vector<int> outEt_;
0140   std::vector<int64_t> outTime_;
0141 
0142   EcalEBPhase2TimeReconstructor *getTimeFinder() const { return time_reconstructor_; }
0143   EcalEBPhase2SpikeTagger *getSpikeTagger() const { return spike_tagger_; }
0144   EcalEBPhase2TPFormatter *getTPFormatter() const { return tpFormatter_; }
0145 
0146   //
0147 };
0148 
0149 template <class T>
0150 void EcalEBPhase2TrigPrimAlgo::clean(std::vector<std::vector<std::pair<int, std::vector<T> > > > &towMap) {
0151   // clean internal data structures
0152   for (unsigned int i = 0; i < maxNrTowers_; ++i)
0153     for (int j = 0; j < nbMaxStrips_; ++j)
0154       (towMap[i])[j].first = 0;
0155   return;
0156 }
0157 
0158 inline void EcalEBPhase2TrigPrimAlgo::fillMap(
0159     EBDigiCollectionPh2 const *col, std::vector<std::vector<std::pair<int, std::vector<EBDataFrame_Ph2> > > > &towerMap)
0160 
0161 {
0162   // implementation for Barrel
0163   if (col) {
0164     nrTowers_ = 0;
0165     for (unsigned int i = 0; i < col->size(); ++i) {
0166       EBDigiCollectionPh2::Digi samples((*col)[i]);
0167       EcalTrigTowerDetId coarser = (*eTTmap_).towerOf(samples.id());
0168       int index = getIndex(col, coarser);
0169       EBDetId id = samples.id();
0170       int stripnr = findStripNr(id);
0171 
0172       int filled = 0;
0173       for (unsigned int ij = 0; ij < towerMap[index].size(); ++ij)
0174         filled += towerMap[index][ij].first;
0175       if (!filled) {
0176         hitTowers_[nrTowers_++] = std::pair<int, EcalTrigTowerDetId>(index, coarser);
0177       }
0178 
0179       //FIXME: temporary protection
0180       int ncryst = towerMap[index][stripnr - 1].first;
0181       if (ncryst >= nbMaxXtals_) {
0182         continue;
0183       }
0184       ((towerMap[index])[stripnr - 1].second)[ncryst] = samples;
0185       (towerMap[index])[stripnr - 1].first++;
0186     }
0187 
0188     if (debug_)
0189       LogDebug("") << "fillMap"
0190                    << "[EcalEBPhase2TrigPrimAlgo] (found " << col->size() << " frames in " << towerMap.size()
0191                    << " towers) " << std::endl;
0192   } else {
0193     if (debug_)
0194       LogDebug("EcalEBPhase2TrigPrimAlgo") << "FillMap - FillMap Collection size=0 !!!!" << std::endl;
0195     ;
0196   }
0197 }
0198 
0199 template <class T>
0200 void EcalEBPhase2TrigPrimAlgo::initStructures(std::vector<std::vector<std::pair<int, std::vector<T> > > > &towMap) {
0201   //initialise internal data structures
0202 
0203   std::vector<T> vec0(nbMaxXtals_);
0204   std::vector<std::pair<int, std::vector<T> > > vec1(nbMaxStrips_);
0205   for (int i = 0; i < nbMaxStrips_; ++i)
0206     vec1[i] = std::pair<int, std::vector<T> >(0, vec0);
0207   towMap.resize(maxNrTowers_);
0208   for (unsigned int i = 0; i < maxNrTowers_; ++i)
0209     towMap[i] = vec1;
0210 
0211   std::vector<int> vecint(maxNrSamples_);
0212   striptp_.resize(nbMaxStrips_);
0213   for (int i = 0; i < nbMaxStrips_; ++i)
0214     striptp_[i] = vecint;
0215 }
0216 
0217 #endif