File indexing completed on 2023-03-17 10:56:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <sstream>
0013 #include <fstream>
0014 #include <iostream>
0015 #include <memory>
0016 #include <list>
0017 #include <algorithm>
0018 #include <cassert>
0019
0020 #include "FWCore/Utilities/interface/EDGetToken.h"
0021 #include "FWCore/Framework/interface/Frameworkfwd.h"
0022 #include "FWCore/Framework/interface/one/EDFilter.h"
0023 #include "FWCore/Framework/interface/Event.h"
0024 #include "FWCore/Framework/interface/EventSetup.h"
0025 #include "FWCore/Framework/interface/ESWatcher.h"
0026 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0027 #include "FWCore/Utilities/interface/InputTag.h"
0028 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0029 #include "FWCore/ServiceRegistry/interface/Service.h"
0030 #include "FWCore/Utilities/interface/Exception.h"
0031
0032 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0033 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0034 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0035 #include "DataFormats/SiStripCommon/interface/SiStripFedKey.h"
0036 #include "DataFormats/DetId/interface/DetId.h"
0037
0038 #include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
0039 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
0040
0041 #include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h"
0042
0043 #include "DataFormats/Common/interface/DetSetVector.h"
0044 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
0045
0046 #include "DQM/SiStripCommon/interface/APVShotFinder.h"
0047 #include "DQM/SiStripCommon/interface/APVShot.h"
0048
0049
0050
0051
0052
0053 class SiStripShotFilter : public edm::one::EDFilter<> {
0054 public:
0055 explicit SiStripShotFilter(const edm::ParameterSet&);
0056 ~SiStripShotFilter() override;
0057
0058 private:
0059 void beginJob() override;
0060 bool filter(edm::Event&, const edm::EventSetup&) override;
0061 void endJob() override;
0062
0063
0064 void updateCabling(const SiStripFedCablingRcd& cablingRcd);
0065
0066
0067 std::ofstream fOut_;
0068 std::string fOutPath_;
0069
0070 const SiStripFedCabling* cabling_;
0071 edm::ESWatcher<SiStripFedCablingRcd> fedCablingWatcher_;
0072 edm::ESGetToken<SiStripFedCabling, SiStripFedCablingRcd> fedCablingToken_;
0073
0074 edm::InputTag digicollection_;
0075 edm::EDGetTokenT<edm::DetSetVector<SiStripDigi> > digiToken_;
0076 bool zs_;
0077 };
0078
0079
0080
0081
0082
0083 SiStripShotFilter::SiStripShotFilter(const edm::ParameterSet& iConfig)
0084 : fOutPath_(iConfig.getUntrackedParameter<std::string>("OutputFilePath", "shotChannels.dat")),
0085 fedCablingWatcher_(this, &SiStripShotFilter::updateCabling),
0086 fedCablingToken_(esConsumes<>()),
0087 digicollection_(iConfig.getParameter<edm::InputTag>("DigiCollection")),
0088 zs_(iConfig.getUntrackedParameter<bool>("ZeroSuppressed", true))
0089
0090 {
0091 digiToken_ = consumes<edm::DetSetVector<SiStripDigi> >(digicollection_);
0092 }
0093
0094 SiStripShotFilter::~SiStripShotFilter() {}
0095
0096
0097
0098
0099
0100
0101 bool SiStripShotFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0102 fedCablingWatcher_.check(iSetup);
0103
0104 edm::Handle<edm::DetSetVector<SiStripDigi> > digis;
0105 iEvent.getByToken(digiToken_, digis);
0106
0107
0108
0109 APVShotFinder apvsf(*digis, zs_);
0110 const std::vector<APVShot>& shots = apvsf.getShots();
0111
0112
0113
0114
0115
0116 unsigned int lShots = 0;
0117
0118 for (unsigned int fedId = FEDNumbering::MINSiStripFEDID; fedId <= FEDNumbering::MAXSiStripFEDID;
0119 fedId++) {
0120
0121 for (unsigned int iCh = 0; iCh < sistrip::FEDCH_PER_FED; iCh++) {
0122
0123 const FedChannelConnection& lConnection = cabling_->fedConnection(fedId, iCh);
0124
0125 uint32_t lDetId = lConnection.detId();
0126 short lAPVPair = lConnection.apvPairNumber();
0127
0128 for (std::vector<APVShot>::const_iterator shot = shots.begin(); shot != shots.end(); ++shot) {
0129
0130 if (shot->detId() == lDetId && static_cast<short>(shot->apvNumber() / 2.) == lAPVPair) {
0131 if (shot->isGenuine()) {
0132
0133 fOut_ << fedId << " " << iCh << " " << shot->detId() << " " << shot->apvNumber() << std::endl;
0134 lShots++;
0135 }
0136 if (shot->apvNumber() % 2 == 1)
0137 break;
0138 }
0139 }
0140 }
0141 }
0142
0143 if (lShots > 0)
0144 fOut_ << "### " << iEvent.id().event() << " " << lShots << std::endl;
0145
0146 return lShots;
0147
0148 }
0149
0150
0151 void SiStripShotFilter::beginJob() {
0152 fOut_.open(fOutPath_.c_str(), std::ios::out);
0153 if (!fOut_)
0154 std::cout << " WARNING ! Cannot open file " << fOutPath_
0155 << " for writting. List of shot channels will not be saved." << std::endl;
0156 }
0157
0158
0159 void SiStripShotFilter::endJob() { fOut_.close(); }
0160
0161 void SiStripShotFilter::updateCabling(const SiStripFedCablingRcd& cablingRcd) {
0162 cabling_ = &cablingRcd.get(fedCablingToken_);
0163 }
0164
0165 #include "FWCore/Framework/interface/MakerMacros.h"
0166 DEFINE_FWK_MODULE(SiStripShotFilter);