File indexing completed on 2024-04-06 12:29:23
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <string>
0010 #include <algorithm>
0011 #include <numeric>
0012 #include <functional>
0013
0014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0015
0016
0017
0018 #include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
0019 #include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
0020
0021 #include "SimCalorimetry/EcalEBTrigPrimAlgos/interface/EcalEBTrigPrimTestAlgo.h"
0022
0023 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
0024 #include "DataFormats/EcalDigi/interface/EBDataFrame.h"
0025 #include "DataFormats/EcalDigi/interface/EEDataFrame.h"
0026 #include "DataFormats/EcalDetId/interface/EcalTrigTowerDetId.h"
0027 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0028 #include "DataFormats/EcalDetId/interface/EcalTriggerElectronicsId.h"
0029
0030 #include "CondFormats/EcalObjects/interface/EcalTPGPedestals.h"
0031 #include "CondFormats/DataRecord/interface/EcalTPGPedestalsRcd.h"
0032
0033 #include <TTree.h>
0034 #include <TMath.h>
0035
0036
0037
0038 const unsigned int EcalEBTrigPrimTestAlgo::nrSamples_ = 5;
0039 const unsigned int EcalEBTrigPrimTestAlgo::maxNrTowers_ = 2448;
0040 const unsigned int EcalEBTrigPrimTestAlgo::maxNrSamplesOut_ = 10;
0041
0042
0043 EcalEBTrigPrimTestAlgo::EcalEBTrigPrimTestAlgo(const EcalTrigTowerConstituentsMap *eTTmap,
0044 const CaloGeometry *theGeometry,
0045 int nSam,
0046 int binofmax,
0047 bool tcpFormat,
0048 bool debug,
0049 bool famos)
0050 : eTTmap_(eTTmap),
0051 theGeometry_(theGeometry),
0052 nSamples_(nSam),
0053 binOfMaximum_(binofmax),
0054 tcpFormat_(tcpFormat),
0055 barrelOnly_(false),
0056 debug_(debug),
0057 famos_(famos) {
0058 maxNrSamples_ = 10;
0059 this->init();
0060 }
0061
0062
0063 EcalEBTrigPrimTestAlgo::EcalEBTrigPrimTestAlgo(int nSam, int binofmax, bool tcpFormat, bool debug, bool famos)
0064 : nSamples_(nSam),
0065 binOfMaximum_(binofmax),
0066 tcpFormat_(tcpFormat),
0067 barrelOnly_(true),
0068 debug_(debug),
0069 famos_(famos)
0070
0071 {
0072 maxNrSamples_ = 10;
0073 this->init();
0074 }
0075
0076
0077 void EcalEBTrigPrimTestAlgo::init() {
0078
0079 theMapping_ = new EcalElectronicsMapping();
0080 initStructures(towerMapEB_);
0081 hitTowers_.resize(maxNrTowers_);
0082
0083 linearizer_.resize(nbMaxXtals_);
0084 for (int i = 0; i < nbMaxXtals_; i++)
0085 linearizer_[i] = new EcalEBFenixLinearizer(famos_);
0086
0087
0088 std::vector<int> v;
0089 v.resize(maxNrSamples_);
0090 lin_out_.resize(nbMaxXtals_);
0091 for (int i = 0; i < 5; i++)
0092 lin_out_[i] = v;
0093
0094 amplitude_filter_ = new EcalEBFenixAmplitudeFilter();
0095 filt_out_.resize(maxNrSamples_);
0096 peak_out_.resize(maxNrSamples_);
0097
0098 fgvb_out_.resize(maxNrSamples_);
0099 fgvb_out_temp_.resize(maxNrSamples_);
0100
0101 peak_finder_ = new EcalEBFenixPeakFinder();
0102 fenixFormatterEB_ = new EcalEBFenixStripFormatEB();
0103 format_out_.resize(maxNrSamples_);
0104
0105 fenixTcpFormat_ = new EcalEBFenixTcpFormat(tcpFormat_, debug_, famos_, binOfMaximum_);
0106 tcpformat_out_.resize(maxNrSamples_);
0107 }
0108
0109
0110 EcalEBTrigPrimTestAlgo::~EcalEBTrigPrimTestAlgo() {
0111 for (int i = 0; i < nbMaxXtals_; i++)
0112 delete linearizer_[i];
0113 delete amplitude_filter_;
0114 delete peak_finder_;
0115 delete fenixFormatterEB_;
0116 delete fenixTcpFormat_;
0117 delete theMapping_;
0118 }
0119
0120 void EcalEBTrigPrimTestAlgo::run(EBDigiCollection const *digi,
0121 EcalEBTrigPrimDigiCollection &result,
0122 EcalEBTrigPrimDigiCollection &resultTcp) {
0123
0124 if (debug_) {
0125 std::cout << " EcalEBTrigPrimTestAlgo: Testing that the algorythm with digis is well plugged " << std::endl;
0126 std::cout << " EcalEBTrigPrimTestAlgo: digi size " << digi->size() << std::endl;
0127 }
0128
0129 uint16_t etInADC;
0130 EcalEBTriggerPrimitiveDigi tp;
0131 int firstSample = binOfMaximum_ - 1 - nrSamples_ / 2;
0132 int lastSample = binOfMaximum_ - 1 + nrSamples_ / 2;
0133
0134 if (debug_) {
0135 std::cout << " binOfMaximum_ " << binOfMaximum_ << " nrSamples_" << nrSamples_ << std::endl;
0136 std::cout << " first sample " << firstSample << " last " << lastSample << std::endl;
0137 }
0138
0139 clean(towerMapEB_);
0140 fillMap(digi, towerMapEB_);
0141
0142 for (int itow = 0; itow < nrTowers_; ++itow) {
0143 int index = hitTowers_[itow].first;
0144 const EcalTrigTowerDetId &thisTower = hitTowers_[itow].second;
0145 if (debug_)
0146 std::cout << " Data for TOWER num " << itow << " index " << index << " TowerId " << thisTower << " size "
0147 << towerMapEB_[itow].size() << std::endl;
0148
0149 int nxstals = 0;
0150 for (unsigned int iStrip = 0; iStrip < towerMapEB_[itow].size(); ++iStrip) {
0151 if (debug_)
0152 std::cout << " Data for STRIP num " << iStrip << std::endl;
0153 std::vector<EBDataFrame> &dataFrames =
0154 (towerMapEB_[index])[iStrip].second;
0155
0156 nxstals = (towerMapEB_[index])[iStrip].first;
0157 if (nxstals <= 0)
0158 continue;
0159 if (debug_)
0160 std::cout << " Number of xTals " << nxstals << std::endl;
0161
0162 const EcalTriggerElectronicsId elId = theMapping_->getTriggerElectronicsId(dataFrames[0].id());
0163 uint32_t stripid = elId.rawId() & 0xfffffff8;
0164
0165
0166 for (int iXstal = 0; iXstal < nxstals; iXstal++) {
0167 const EBDetId &myid = dataFrames[iXstal].id();
0168 tp = EcalEBTriggerPrimitiveDigi(myid);
0169 tp.setSize(nrSamples_);
0170
0171 if (debug_) {
0172 std::cout << std::endl;
0173 std::cout << "iXstal= " << iXstal << " id " << dataFrames[iXstal].id() << " EBDataFrame is: " << std::endl;
0174 for (int i = 0; i < dataFrames[iXstal].size(); i++) {
0175 std::cout << " " << std::dec << dataFrames[iXstal][i].adc();
0176 }
0177 std::cout << std::endl;
0178 }
0179
0180 this->getLinearizer(iXstal)->setParameters(
0181 dataFrames[iXstal].id().rawId(), ecaltpPed_, ecaltpLin_, ecaltpgBadX_);
0182 this->getLinearizer(iXstal)->process(dataFrames[iXstal], lin_out_[iXstal]);
0183
0184 for (unsigned int i = 0; i < lin_out_[iXstal].size(); i++) {
0185 if ((lin_out_[iXstal])[i] > 0X3FFFF)
0186 (lin_out_[iXstal])[i] = 0X3FFFF;
0187 }
0188
0189 if (debug_) {
0190 std::cout << "output of linearizer for channel " << iXstal << std::endl;
0191 std::cout << " lin_out[iXstal].size()= " << std::dec << lin_out_[iXstal].size() << std::endl;
0192 for (unsigned int i = 0; i < lin_out_[iXstal].size(); i++) {
0193 std::cout << " " << std::dec << (lin_out_[iXstal])[i];
0194 }
0195 std::cout << std::endl;
0196 }
0197
0198
0199 this->getFilter()->setParameters(stripid, ecaltpgWeightMap_, ecaltpgWeightGroup_);
0200 this->getFilter()->process(lin_out_[iXstal], filt_out_, fgvb_out_temp_, fgvb_out_);
0201
0202 if (debug_) {
0203 std::cout << "output of filter is a vector of size: " << std::dec << filt_out_.size() << std::endl;
0204 for (unsigned int ix = 0; ix < filt_out_.size(); ix++) {
0205 std::cout << std::dec << filt_out_[ix] << " ";
0206 }
0207 std::cout << std::endl;
0208 }
0209
0210
0211 this->getPeakFinder()->process(filt_out_, peak_out_);
0212
0213 if (debug_) {
0214 std::cout << "output of peakfinder is a vector of size: " << std::dec << peak_out_.size() << std::endl;
0215 for (unsigned int ix = 0; ix < peak_out_.size(); ix++) {
0216 std::cout << std::dec << peak_out_[ix] << " ";
0217 }
0218 std::cout << std::endl;
0219 }
0220
0221
0222 this->getFormatterEB()->setParameters(stripid, ecaltpgSlidW_);
0223 this->getFormatterEB()->process(fgvb_out_, peak_out_, filt_out_, format_out_);
0224
0225 if (debug_) {
0226 std::cout << "output of formatter is a vector of size: " << format_out_.size() << std::endl;
0227 for (unsigned int i = 0; i < format_out_.size(); i++) {
0228 std::cout << " " << std::dec << format_out_[i] << " ";
0229 }
0230 std::cout << std::endl;
0231 }
0232
0233
0234 this->getFormatter()->setParameters(
0235 thisTower.rawId(), ecaltpgLutGroup_, ecaltpgLut_, ecaltpgBadTT_, ecaltpgSpike_);
0236 this->getFormatter()->process(format_out_, tcpformat_out_);
0237
0238 int nSam = 0;
0239 for (int iSample = firstSample; iSample <= lastSample; ++iSample) {
0240 etInADC = tcpformat_out_[iSample];
0241 if (debug_)
0242 std::cout << " format_out " << tcpformat_out_[iSample] << " etInADC " << etInADC << std::endl;
0243
0244 bool isASpike = false;
0245 int timing = 0;
0246 tp.setSample(nSam, EcalEBTriggerPrimitiveSample(etInADC, isASpike, timing));
0247
0248 nSam++;
0249 if (debug_)
0250 std::cout << "in TestAlgo"
0251 << " tp size " << tp.size() << std::endl;
0252 }
0253
0254 if (!tcpFormat_)
0255 result.push_back(tp);
0256 else
0257 resultTcp.push_back(tp);
0258
0259 }
0260
0261 }
0262 }
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315 }
0316
0317
0318
0319 int EcalEBTrigPrimTestAlgo::findStripNr(const EBDetId &id) {
0320 int stripnr;
0321 int n = ((id.ic() - 1) % 100) / 20;
0322 if (id.ieta() < 0)
0323 stripnr = n + 1;
0324 else
0325 stripnr = nbMaxStrips_ - n;
0326 return stripnr;
0327 }