File indexing completed on 2024-09-07 04:37:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021 #include <vector>
0022 #include <iostream>
0023 #include <TMath.h>
0024 #include <TRandom3.h>
0025
0026
0027 #include "FWCore/Framework/interface/Frameworkfwd.h"
0028 #include "FWCore/Framework/interface/stream/EDProducer.h"
0029 #include "FWCore/Framework/interface/Event.h"
0030 #include "FWCore/Framework/interface/MakerMacros.h"
0031 #include "FWCore/Framework/interface/ESHandle.h"
0032 #include "FWCore/Framework/interface/EventSetup.h"
0033 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0034 #include "FWCore/Utilities/interface/ESGetToken.h"
0035 #include "DataFormats/Math/interface/Point3D.h"
0036
0037
0038 #include "DataFormats/HcalRecHit/interface/CastorRecHit.h"
0039 #include "DataFormats/HcalDetId/interface/HcalCastorDetId.h"
0040 #include "DataFormats/CastorReco/interface/CastorTower.h"
0041
0042
0043 #include "CondFormats/CastorObjects/interface/CastorChannelQuality.h"
0044 #include "CondFormats/CastorObjects/interface/CastorChannelStatus.h"
0045 #include "CondFormats/DataRecord/interface/CastorChannelQualityRcd.h"
0046
0047
0048
0049
0050
0051 class CastorTowerProducer : public edm::stream::EDProducer<> {
0052 public:
0053 explicit CastorTowerProducer(const edm::ParameterSet&);
0054 ~CastorTowerProducer() override;
0055
0056 private:
0057 void produce(edm::Event&, const edm::EventSetup&) override;
0058 virtual void ComputeTowerVariable(const edm::RefVector<edm::SortedCollection<CastorRecHit> >& usedRecHits,
0059 double& Ehot,
0060 double& depth);
0061
0062
0063 typedef math::XYZPointD Point;
0064 typedef ROOT::Math::RhoEtaPhiPoint TowerPoint;
0065 typedef ROOT::Math::RhoZPhiPoint CellPoint;
0066 typedef edm::SortedCollection<CastorRecHit> CastorRecHitCollection;
0067 typedef std::vector<reco::CastorTower> CastorTowerCollection;
0068 typedef edm::RefVector<CastorRecHitCollection> CastorRecHitRefVector;
0069 edm::EDGetTokenT<CastorRecHitCollection> tok_input_;
0070 edm::ESGetToken<CastorChannelQuality, CastorChannelQualityRcd> tok_channelQuality_;
0071 double towercut_;
0072 double mintime_;
0073 double maxtime_;
0074 };
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088 CastorTowerProducer::CastorTowerProducer(const edm::ParameterSet& iConfig)
0089 : towercut_(iConfig.getParameter<double>("towercut")),
0090 mintime_(iConfig.getParameter<double>("mintime")),
0091 maxtime_(iConfig.getParameter<double>("maxtime")) {
0092 tok_input_ = consumes<CastorRecHitCollection>(iConfig.getParameter<std::string>("inputprocess"));
0093 tok_channelQuality_ = esConsumes<CastorChannelQuality, CastorChannelQualityRcd>();
0094
0095 produces<CastorTowerCollection>();
0096
0097 }
0098
0099 CastorTowerProducer::~CastorTowerProducer() {
0100
0101
0102 }
0103
0104
0105
0106
0107
0108
0109 void CastorTowerProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0110 using namespace edm;
0111 using namespace reco;
0112 using namespace TMath;
0113
0114
0115
0116 edm::Handle<CastorRecHitCollection> InputRecHits;
0117 iEvent.getByToken(tok_input_, InputRecHits);
0118
0119 auto OutputTowers = std::make_unique<CastorTowerCollection>();
0120
0121
0122 int nRecHits = InputRecHits->size();
0123
0124 LogDebug("CastorTowerProducer") << "2. entering CastorTowerProducer" << std::endl;
0125
0126 if (nRecHits == 0)
0127 LogDebug("CastorTowerProducer") << "Warning: You are trying to run the Tower algorithm with 0 input rechits.";
0128
0129
0130
0131
0132 double poscastortowerarray[4][16];
0133 double negcastortowerarray[4][16];
0134
0135 CastorRecHitRefVector poscastorusedrechits[16];
0136 CastorRecHitRefVector negcastorusedrechits[16];
0137
0138
0139 for (int j = 0; j < 16; j++) {
0140 poscastortowerarray[3][j] = -2.94524 + j * 0.3927;
0141 poscastortowerarray[0][j] = 0.;
0142 poscastortowerarray[1][j] = 0.;
0143 poscastortowerarray[2][j] = 0.;
0144
0145 negcastortowerarray[3][j] = -2.94524 + j * 0.3927;
0146 negcastortowerarray[0][j] = 0.;
0147 negcastortowerarray[1][j] = 0.;
0148 negcastortowerarray[2][j] = 0.;
0149 }
0150
0151
0152 edm::ESHandle<CastorChannelQuality> p = iSetup.getHandle(tok_channelQuality_);
0153 std::vector<DetId> channels = p->getAllChannels();
0154
0155
0156 for (unsigned int i = 0; i < InputRecHits->size(); i++) {
0157 edm::Ref<CastorRecHitCollection> rechit_p = edm::Ref<CastorRecHitCollection>(InputRecHits, i);
0158
0159 HcalCastorDetId id = rechit_p->id();
0160 DetId genericID = (DetId)id;
0161
0162
0163 bool bad = false;
0164 for (std::vector<DetId>::iterator channel = channels.begin(); channel != channels.end(); channel++) {
0165 if (channel->rawId() == genericID.rawId()) {
0166
0167 bad = true;
0168 break;
0169 }
0170 }
0171
0172 if (bad)
0173 continue;
0174
0175 double Erechit = rechit_p->energy();
0176 int module = id.module();
0177 int sector = id.sector();
0178 double zrechit = 0;
0179 if (module < 3)
0180 zrechit = -14390 - 24.75 - 49.5 * (module - 1);
0181 if (module > 2)
0182 zrechit = -14390 - 99 - 49.5 - 99 * (module - 3);
0183 double phirechit = -100;
0184 if (sector < 9)
0185 phirechit = 0.19635 + (sector - 1) * 0.3927;
0186 if (sector > 8)
0187 phirechit = -2.94524 + (sector - 9) * 0.3927;
0188
0189
0190 if (rechit_p->time() > mintime_ && rechit_p->time() < maxtime_) {
0191
0192 for (int j = 0; j < 16; j++) {
0193
0194 if (TMath::Abs(phirechit - poscastortowerarray[3][j]) < 0.0001) {
0195
0196 if (zrechit > 0.) {
0197 poscastortowerarray[0][j] += Erechit;
0198 if (module < 3) {
0199 poscastortowerarray[1][j] += Erechit;
0200 } else {
0201 poscastortowerarray[2][j] += Erechit;
0202 }
0203 poscastorusedrechits[j].push_back(rechit_p);
0204 } else {
0205 negcastortowerarray[0][j] += Erechit;
0206 if (module < 3) {
0207 negcastortowerarray[1][j] += Erechit;
0208 } else {
0209 negcastortowerarray[2][j] += Erechit;
0210 }
0211 negcastorusedrechits[j].push_back(rechit_p);
0212 }
0213 }
0214 }
0215 }
0216
0217 }
0218
0219
0220
0221 double fem, Ehot, depth;
0222 double rhoTower = 88.5;
0223
0224
0225 for (int k = 0; k < 16; k++) {
0226 Ehot = 0;
0227 depth = 0;
0228
0229
0230 if (poscastortowerarray[0][k] > sqrt(poscastorusedrechits[k].size()) * towercut_) {
0231 fem = poscastortowerarray[1][k] / poscastortowerarray[0][k];
0232 CastorRecHitRefVector usedRecHits = poscastorusedrechits[k];
0233 ComputeTowerVariable(usedRecHits, Ehot, depth);
0234
0235 LogDebug("CastorTowerProducer") << "tower " << k + 1 << ": fem = " << fem << " ,depth = " << depth
0236 << " ,Ehot = " << Ehot << std::endl;
0237
0238 TowerPoint temptowerposition(rhoTower, 5.9, poscastortowerarray[3][k]);
0239 Point towerposition(temptowerposition);
0240
0241 CastorTower newtower(poscastortowerarray[0][k],
0242 towerposition,
0243 poscastortowerarray[1][k],
0244 poscastortowerarray[2][k],
0245 fem,
0246 depth,
0247 Ehot,
0248 poscastorusedrechits[k]);
0249 OutputTowers->push_back(newtower);
0250 }
0251
0252
0253 if (negcastortowerarray[0][k] > sqrt(negcastorusedrechits[k].size()) * towercut_) {
0254 fem = negcastortowerarray[1][k] / negcastortowerarray[0][k];
0255 CastorRecHitRefVector usedRecHits = negcastorusedrechits[k];
0256 ComputeTowerVariable(usedRecHits, Ehot, depth);
0257
0258 LogDebug("CastorTowerProducer") << "tower " << k + 1 << " energy = " << negcastortowerarray[0][k]
0259 << "EM = " << negcastortowerarray[1][k] << "HAD = " << negcastortowerarray[2][k]
0260 << "phi = " << negcastortowerarray[3][k] << ": fem = " << fem
0261 << " ,depth = " << depth << " ,Ehot = " << Ehot << std::endl;
0262
0263 TowerPoint temptowerposition(rhoTower, -5.9, negcastortowerarray[3][k]);
0264 Point towerposition(temptowerposition);
0265
0266 CastorTower newtower(negcastortowerarray[0][k],
0267 towerposition,
0268 negcastortowerarray[1][k],
0269 negcastortowerarray[2][k],
0270 fem,
0271 depth,
0272 Ehot,
0273 negcastorusedrechits[k]);
0274 OutputTowers->push_back(newtower);
0275 }
0276
0277 }
0278
0279 iEvent.put(std::move(OutputTowers));
0280 }
0281
0282 void CastorTowerProducer::ComputeTowerVariable(const edm::RefVector<edm::SortedCollection<CastorRecHit> >& usedRecHits,
0283 double& Ehot,
0284 double& depth) {
0285 using namespace reco;
0286
0287 double Etot = 0;
0288
0289
0290 for (CastorRecHitRefVector::iterator it = usedRecHits.begin(); it != usedRecHits.end(); it++) {
0291 edm::Ref<CastorRecHitCollection> rechit_p = *it;
0292
0293 double Erechit = rechit_p->energy();
0294 HcalCastorDetId id = rechit_p->id();
0295 int module = id.module();
0296 double zrechit = 0;
0297 if (module < 3)
0298 zrechit = -14390 - 24.75 - 49.5 * (module - 1);
0299 if (module > 2)
0300 zrechit = -14390 - 99 - 49.5 - 99 * (module - 3);
0301
0302 if (Erechit > Ehot)
0303 Ehot = Erechit;
0304 depth += Erechit * zrechit;
0305 Etot += Erechit;
0306 }
0307
0308 depth /= Etot;
0309 Ehot /= Etot;
0310 }
0311
0312
0313 DEFINE_FWK_MODULE(CastorTowerProducer);