File indexing completed on 2024-04-06 12:29:22
0001 #ifndef SimCalorimetry_EcalEBTrigPrimAlgos_EcalEBPhase2TrigPrimAlgo_h
0002 #define SimCalorimetry_EcalEBTrigPrimAlgos_EcalEBPhase2TrigPrimAlgo_h
0003
0004
0005
0006
0007
0008
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
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
0086
0087
0088
0089
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_;
0100 static const unsigned int maxNrTowers_;
0101 static const unsigned int nrSamples_;
0102
0103
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
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
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
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
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