File indexing completed on 2024-05-15 04:21:52
0001
0002
0003
0004
0005
0006
0007
0008 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Tools/DataROOTDumper2.h"
0009
0010 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0011 #include "FWCore/ServiceRegistry/interface/Service.h"
0012
0013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0014 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0015 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
0016 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
0017 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
0018
0019 #include "TFile.h"
0020 #include "TTree.h"
0021
0022 DataROOTDumper2::DataROOTDumper2(const edm::ParameterSet& edmCfg,
0023 const OMTFConfiguration* omtfConfig,
0024 CandidateSimMuonMatcher* candidateSimMuonMatcher)
0025 : EmulationObserverBase(edmCfg, omtfConfig), candidateSimMuonMatcher(candidateSimMuonMatcher) {
0026 edm::LogVerbatim("l1tOmtfEventPrint") << " omtfConfig->nTestRefHits() " << omtfConfig->nTestRefHits()
0027 << " event.omtfGpResultsPdfSum.num_elements() " << endl;
0028 initializeTTree();
0029
0030 if (edmCfg.exists("dumpKilledOmtfCands"))
0031 if (edmCfg.getParameter<bool>("dumpKilledOmtfCands"))
0032 dumpKilledOmtfCands = true;
0033
0034 if (edmCfg.exists("candidateSimMuonMatcherType")) {
0035 if (edmCfg.getParameter<std::string>("candidateSimMuonMatcherType") == "propagation")
0036 usePropagation = true;
0037 else if (edmCfg.getParameter<std::string>("candidateSimMuonMatcherType") == "matchSimple")
0038 usePropagation = false;
0039
0040 edm::LogImportant("l1tOmtfEventPrint")
0041 << " CandidateSimMuonMatcher: candidateSimMuonMatcherType "
0042 << edmCfg.getParameter<std::string>("candidateSimMuonMatcherType") << std::endl;
0043 }
0044
0045 edm::LogVerbatim("l1tOmtfEventPrint") << " DataROOTDumper2 created. dumpKilledOmtfCands " << dumpKilledOmtfCands
0046 << std::endl;
0047 }
0048
0049 DataROOTDumper2::~DataROOTDumper2() {}
0050
0051 void DataROOTDumper2::initializeTTree() {
0052 edm::Service<TFileService> fs;
0053
0054 rootTree = fs->make<TTree>("OMTFHitsTree", "");
0055
0056 rootTree->Branch("eventNum", &omtfEvent.eventNum);
0057 rootTree->Branch("muonEvent", &omtfEvent.muonEvent);
0058
0059 rootTree->Branch("muonPt", &omtfEvent.muonPt);
0060 rootTree->Branch("muonEta", &omtfEvent.muonEta);
0061 rootTree->Branch("muonPhi", &omtfEvent.muonPhi);
0062 rootTree->Branch("muonPropEta", &omtfEvent.muonPropEta);
0063 rootTree->Branch("muonPropPhi", &omtfEvent.muonPropPhi);
0064 rootTree->Branch("muonCharge", &omtfEvent.muonCharge);
0065
0066 rootTree->Branch("muonDxy", &omtfEvent.muonDxy);
0067 rootTree->Branch("muonRho", &omtfEvent.muonRho);
0068
0069 rootTree->Branch("omtfPt", &omtfEvent.omtfPt);
0070 rootTree->Branch("omtfUPt", &omtfEvent.omtfUPt);
0071 rootTree->Branch("omtfEta", &omtfEvent.omtfEta);
0072 rootTree->Branch("omtfPhi", &omtfEvent.omtfPhi);
0073 rootTree->Branch("omtfCharge", &omtfEvent.omtfCharge);
0074
0075 rootTree->Branch("omtfHwEta", &omtfEvent.omtfHwEta);
0076
0077 rootTree->Branch("omtfProcessor", &omtfEvent.omtfProcessor);
0078 rootTree->Branch("omtfScore", &omtfEvent.omtfScore);
0079 rootTree->Branch("omtfQuality", &omtfEvent.omtfQuality);
0080 rootTree->Branch("omtfRefLayer", &omtfEvent.omtfRefLayer);
0081 rootTree->Branch("omtfRefHitNum", &omtfEvent.omtfRefHitNum);
0082
0083 rootTree->Branch("omtfFiredLayers", &omtfEvent.omtfFiredLayers);
0084
0085 rootTree->Branch("killed", &omtfEvent.killed);
0086
0087 rootTree->Branch("hits", &omtfEvent.hits);
0088
0089 rootTree->Branch("deltaEta", &omtfEvent.deltaEta);
0090 rootTree->Branch("deltaPhi", &omtfEvent.deltaPhi);
0091
0092 ptGenPos = fs->make<TH1I>("ptGenPos", "ptGenPos, eta at vertex 0.8 - 1.24", 400, 0, 200);
0093 ptGenNeg = fs->make<TH1I>("ptGenNeg", "ptGenNeg, eta at vertex 0.8 - 1.24", 400, 0, 200);
0094 }
0095
0096 void DataROOTDumper2::observeProcesorEmulation(unsigned int iProcessor,
0097 l1t::tftype mtfType,
0098 const std::shared_ptr<OMTFinput>&,
0099 const AlgoMuons& algoCandidates,
0100 const AlgoMuons& gbCandidates,
0101 const std::vector<l1t::RegionalMuonCand>& candMuons) {}
0102
0103 void DataROOTDumper2::observeEventEnd(const edm::Event& iEvent,
0104 std::unique_ptr<l1t::RegionalMuonCandBxCollection>& finalCandidates) {
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132 std::vector<MatchingResult> matchingResults = candidateSimMuonMatcher->getMatchingResults();
0133 LogTrace("l1tOmtfEventPrint") << "\nDataROOTDumper2::observeEventEnd matchingResults.size() "
0134 << matchingResults.size() << std::endl;
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 if (!usePropagation && matchingResults.size() > 1) {
0145 edm::LogVerbatim("l1tOmtfEventPrint")
0146 << "\nDataROOTDumper2::observeEventEnd matchingResults.size() " << matchingResults.size() << std::endl;
0147
0148 for (auto& matchingResult : matchingResults) {
0149 edm::LogVerbatim("l1tOmtfEventPrint") << "matchingResult: genPt " << matchingResult.genPt;
0150 if (matchingResult.procMuon)
0151 edm::LogVerbatim("l1tOmtfEventPrint") << " procMuon.PtConstr " << matchingResult.procMuon->getPtConstr();
0152 else
0153 edm::LogVerbatim("l1tOmtfEventPrint") << " no procMuon" << std::endl;
0154 }
0155 edm::LogVerbatim("l1tOmtfEventPrint") << "dropping the event!!!\n" << std::endl;
0156 return;
0157 }
0158
0159 for (auto& matchingResult : matchingResults) {
0160 omtfEvent.eventNum = iEvent.id().event();
0161
0162 if (matchingResult.trackingParticle) {
0163 auto trackingParticle = matchingResult.trackingParticle;
0164
0165 omtfEvent.muonEvent = trackingParticle->eventId().event();
0166
0167 omtfEvent.muonPt = trackingParticle->pt();
0168 omtfEvent.muonEta = trackingParticle->momentum().eta();
0169 omtfEvent.muonPhi = trackingParticle->momentum().phi();
0170 omtfEvent.muonPropEta = matchingResult.propagatedEta;
0171 omtfEvent.muonPropPhi = matchingResult.propagatedPhi;
0172 omtfEvent.muonCharge = (std::abs(trackingParticle->pdgId()) == 13) ? trackingParticle->pdgId() / -13 : 0;
0173
0174 if (trackingParticle->parentVertex().isNonnull()) {
0175 omtfEvent.muonDxy = trackingParticle->dxy();
0176 omtfEvent.muonRho = trackingParticle->parentVertex()->position().Rho();
0177 }
0178
0179 omtfEvent.deltaEta = matchingResult.deltaEta;
0180 omtfEvent.deltaPhi = matchingResult.deltaPhi;
0181
0182 LogTrace("l1tOmtfEventPrint") << "DataROOTDumper2::observeEventEnd trackingParticle: eventId "
0183 << trackingParticle->eventId().event() << " pdgId " << std::setw(3)
0184 << trackingParticle->pdgId() << " trackId "
0185 << trackingParticle->g4Tracks().at(0).trackId() << " pt " << std::setw(9)
0186 << trackingParticle->pt()
0187 << " eta " << std::setw(9) << trackingParticle->momentum().eta() << " phi "
0188 << std::setw(9) << trackingParticle->momentum().phi() << std::endl;
0189
0190 if (std::abs(omtfEvent.muonEta) > 0.8 && std::abs(omtfEvent.muonEta) < 1.24) {
0191 if (omtfEvent.muonCharge > 0)
0192 ptGenPos->Fill(omtfEvent.muonPt);
0193 else
0194 ptGenNeg->Fill(omtfEvent.muonPt);
0195 }
0196 } else if (matchingResult.simTrack) {
0197 auto simTrack = matchingResult.simTrack;
0198
0199 omtfEvent.muonEvent = simTrack->eventId().event();
0200
0201 omtfEvent.muonPt = simTrack->momentum().pt();
0202 omtfEvent.muonEta = simTrack->momentum().eta();
0203 omtfEvent.muonPhi = simTrack->momentum().phi();
0204 omtfEvent.muonPropEta = matchingResult.propagatedEta;
0205 omtfEvent.muonPropPhi = matchingResult.propagatedPhi;
0206 omtfEvent.muonCharge = simTrack->charge();
0207
0208 if (!simTrack->noVertex() && matchingResult.simVertex) {
0209 const math::XYZTLorentzVectorD& vtxPos = matchingResult.simVertex->position();
0210 omtfEvent.muonDxy = (-vtxPos.X() * simTrack->momentum().py() + vtxPos.Y() * simTrack->momentum().px()) /
0211 simTrack->momentum().pt();
0212 omtfEvent.muonRho = vtxPos.Rho();
0213 }
0214
0215 omtfEvent.deltaEta = matchingResult.deltaEta;
0216 omtfEvent.deltaPhi = matchingResult.deltaPhi;
0217
0218 LogTrace("l1tOmtfEventPrint") << "DataROOTDumper2::observeEventEnd simTrack: eventId "
0219 << simTrack->eventId().event() << " pdgId " << std::setw(3)
0220 << simTrack->type()
0221 << " pt " << std::setw(9)
0222 << simTrack->momentum().pt()
0223 << " eta " << std::setw(9) << simTrack->momentum().eta() << " phi " << std::setw(9)
0224 << simTrack->momentum().phi() << std::endl;
0225
0226 if (std::abs(omtfEvent.muonEta) > 0.8 && std::abs(omtfEvent.muonEta) < 1.24) {
0227 if (omtfEvent.muonCharge > 0)
0228 ptGenPos->Fill(omtfEvent.muonPt);
0229 else
0230 ptGenNeg->Fill(omtfEvent.muonPt);
0231 }
0232 } else {
0233 omtfEvent.muonEvent = -1;
0234
0235 omtfEvent.muonPt = 0;
0236
0237 omtfEvent.muonEta = 0;
0238 omtfEvent.muonPhi = 0;
0239
0240 omtfEvent.muonPropEta = 0;
0241 omtfEvent.muonPropPhi = 0;
0242
0243 omtfEvent.muonCharge = 0;
0244
0245 omtfEvent.muonDxy = 0;
0246 omtfEvent.muonRho = 0;
0247 }
0248
0249 auto addOmtfCand = [&](AlgoMuonPtr& procMuon) {
0250 omtfEvent.omtfPt = omtfConfig->hwPtToGev(procMuon->getPtConstr());
0251 omtfEvent.omtfUPt = omtfConfig->hwUPtToGev(procMuon->getPtUnconstr());
0252 omtfEvent.omtfEta = omtfConfig->hwEtaToEta(procMuon->getEtaHw());
0253 omtfEvent.omtfPhi = procMuon->getPhi();
0254 omtfEvent.omtfCharge = procMuon->getChargeConstr();
0255 omtfEvent.omtfScore = procMuon->getPdfSum();
0256
0257 omtfEvent.omtfHwEta = procMuon->getEtaHw();
0258
0259 omtfEvent.omtfFiredLayers = procMuon->getFiredLayerBits();
0260 omtfEvent.omtfRefLayer = procMuon->getRefLayer();
0261 omtfEvent.omtfRefHitNum = procMuon->getRefHitNumber();
0262
0263 omtfEvent.hits.clear();
0264
0265
0266
0267 auto& gpResult = (procMuon->getGpResultUnconstr().getPdfSumUnconstr() > procMuon->getGpResultConstr().getPdfSum())
0268 ? procMuon->getGpResultUnconstr()
0269 : procMuon->getGpResultConstr();
0270
0271
0272
0273
0274
0275
0276 for (unsigned int iLogicLayer = 0; iLogicLayer < gpResult.getStubResults().size(); ++iLogicLayer) {
0277 auto& stubResult = gpResult.getStubResults()[iLogicLayer];
0278
0279
0280
0281
0282
0283
0284 if (stubResult.getMuonStub()) {
0285 OmtfEvent::Hit hit;
0286 hit.layer = iLogicLayer;
0287 hit.quality = stubResult.getMuonStub()->qualityHw;
0288 hit.eta = stubResult.getMuonStub()->etaHw;
0289 hit.valid = stubResult.getValid();
0290
0291 int hitPhi = stubResult.getMuonStub()->phiHw;
0292 unsigned int refLayerLogicNum = omtfConfig->getRefToLogicNumber()[procMuon->getRefLayer()];
0293 int phiRefHit = gpResult.getStubResults()[refLayerLogicNum].getMuonStub()->phiHw;
0294
0295 if (omtfConfig->isBendingLayer(iLogicLayer)) {
0296 hitPhi = stubResult.getMuonStub()->phiBHw;
0297 phiRefHit = 0;
0298 }
0299
0300
0301 hit.phiDist = hitPhi - phiRefHit;
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316 DetId detId(stubResult.getMuonStub()->detId);
0317 if (detId.subdetId() == MuonSubdetId::CSC) {
0318 CSCDetId cscId(detId);
0319 hit.z = cscId.chamber() % 2;
0320 }
0321
0322 omtfEvent.hits.push_back(hit.rawData);
0323 }
0324 }
0325
0326 LogTrace("l1tOmtfEventPrint") << "DataROOTDumper2::observeEventEnd adding omtfCand : " << std::endl;
0327 auto finalCandidate = matchingResult.muonCand;
0328 LogTrace("l1tOmtfEventPrint") << " hwPt " << finalCandidate->hwPt() << " hwSign " << finalCandidate->hwSign()
0329 << " hwQual " << finalCandidate->hwQual() << " hwEta " << std::setw(4)
0330 << finalCandidate->hwEta() << std::setw(4) << " hwPhi " << finalCandidate->hwPhi()
0331 << " eta " << std::setw(9) << (finalCandidate->hwEta() * 0.010875)
0332 << " isKilled " << procMuon->isKilled() << " tRefLayer " << procMuon->getRefLayer()
0333 << " RefHitNumber " << procMuon->getRefHitNumber() << std::endl;
0334 };
0335
0336 if (matchingResult.muonCand && matchingResult.procMuon->getPtConstr() > 0 &&
0337 matchingResult.muonCand->hwQual() >= 1) {
0338
0339
0340
0341 omtfEvent.omtfQuality = matchingResult.muonCand->hwQual();
0342 omtfEvent.killed = false;
0343 omtfEvent.omtfProcessor = matchingResult.muonCand->processor();
0344
0345 if (matchingResult.muonCand->trackFinderType() == l1t::omtf_neg) {
0346 omtfEvent.omtfProcessor *= -1;
0347 }
0348
0349 addOmtfCand(matchingResult.procMuon);
0350 rootTree->Fill();
0351
0352 if (dumpKilledOmtfCands) {
0353 for (auto& killedCand : matchingResult.procMuon->getKilledMuons()) {
0354 omtfEvent.omtfQuality = 0;
0355 omtfEvent.killed = true;
0356 if (killedCand->isKilled() == false) {
0357 edm::LogVerbatim("l1tOmtfEventPrint") << " killedCand->isKilled() == false !!!!!!!!";
0358 }
0359 addOmtfCand(killedCand);
0360 rootTree->Fill();
0361 }
0362 }
0363 } else if (omtfEvent.muonPt > 0) {
0364 LogTrace("l1tOmtfEventPrint") << "DataROOTDumper2::observeEventEnd no matching omtfCand" << std::endl;
0365
0366 omtfEvent.omtfPt = 0;
0367 omtfEvent.omtfUPt = 0;
0368 omtfEvent.omtfEta = 0;
0369 omtfEvent.omtfPhi = 0;
0370 omtfEvent.omtfCharge = 0;
0371 omtfEvent.omtfScore = 0;
0372
0373 omtfEvent.omtfHwEta = 0;
0374
0375 omtfEvent.omtfFiredLayers = 0;
0376 omtfEvent.omtfRefLayer = 0;
0377 omtfEvent.omtfRefHitNum = 0;
0378 omtfEvent.omtfProcessor = 10;
0379
0380 omtfEvent.omtfQuality = 0;
0381 omtfEvent.killed = false;
0382
0383 omtfEvent.hits.clear();
0384
0385 rootTree->Fill();
0386 }
0387 }
0388 evntCnt++;
0389 }
0390
0391 void DataROOTDumper2::endJob() { edm::LogVerbatim("l1tOmtfEventPrint") << " evntCnt " << evntCnt << endl; }