File indexing completed on 2023-12-06 23:18:40
0001
0002
0003
0004
0005
0006
0007
0008 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Tools/DataROOTDumper2.h"
0009
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0012 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
0013 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
0014 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
0015
0016 #include "TFile.h"
0017 #include "TTree.h"
0018
0019 DataROOTDumper2::DataROOTDumper2(const edm::ParameterSet& edmCfg,
0020 const OMTFConfiguration* omtfConfig,
0021 std::string rootFileName)
0022 : EmulationObserverBase(edmCfg, omtfConfig) {
0023 edm::LogVerbatim("l1tOmtfEventPrint") << " omtfConfig->nTestRefHits() " << omtfConfig->nTestRefHits()
0024 << " event.omtfGpResultsPdfSum.num_elements() " << endl;
0025 initializeTTree(rootFileName);
0026
0027 edm::LogVerbatim("l1tOmtfEventPrint") << " DataROOTDumper2 created" << std::endl;
0028 }
0029
0030 DataROOTDumper2::~DataROOTDumper2() { saveTTree(); }
0031
0032 void DataROOTDumper2::initializeTTree(std::string rootFileName) {
0033 rootFile = new TFile(rootFileName.c_str(), "RECREATE");
0034 rootTree = new TTree("OMTFHitsTree", "");
0035
0036 rootTree->Branch("muonPt", &omtfEvent.muonPt);
0037 rootTree->Branch("muonEta", &omtfEvent.muonEta);
0038 rootTree->Branch("muonPhi", &omtfEvent.muonPhi);
0039 rootTree->Branch("muonCharge", &omtfEvent.muonCharge);
0040
0041 rootTree->Branch("omtfPt", &omtfEvent.omtfPt);
0042 rootTree->Branch("omtfEta", &omtfEvent.omtfEta);
0043 rootTree->Branch("omtfPhi", &omtfEvent.omtfPhi);
0044 rootTree->Branch("omtfCharge", &omtfEvent.omtfCharge);
0045
0046 rootTree->Branch("omtfScore", &omtfEvent.omtfScore);
0047 rootTree->Branch("omtfQuality", &omtfEvent.omtfQuality);
0048 rootTree->Branch("omtfRefLayer", &omtfEvent.omtfRefLayer);
0049 rootTree->Branch("omtfProcessor", &omtfEvent.omtfProcessor);
0050
0051 rootTree->Branch("omtfFiredLayers", &omtfEvent.omtfFiredLayers);
0052
0053 ptGenPos = new TH1I("ptGenPos", "ptGenPos", 400, 0, 200);
0054 ptGenNeg = new TH1I("ptGenNeg", "ptGenNeg", 400, 0, 200);
0055 }
0056
0057 void DataROOTDumper2::saveTTree() {
0058 rootFile->Write();
0059 ptGenPos->Write();
0060 ptGenNeg->Write();
0061
0062 delete rootFile;
0063 delete rootTree;
0064 }
0065
0066 void DataROOTDumper2::observeEventEnd(const edm::Event& iEvent,
0067 std::unique_ptr<l1t::RegionalMuonCandBxCollection>& finalCandidates) {
0068 int muonCharge = 0;
0069 if (simMuon) {
0070 if (abs(simMuon->momentum().eta()) < 0.8 || abs(simMuon->momentum().eta()) > 1.24)
0071 return;
0072
0073 muonCharge = (abs(simMuon->type()) == 13) ? simMuon->type() / -13 : 0;
0074 if (muonCharge > 0)
0075 ptGenPos->Fill(simMuon->momentum().pt());
0076 else
0077 ptGenNeg->Fill(simMuon->momentum().pt());
0078 }
0079
0080 if (simMuon == nullptr || !omtfCand->isValid())
0081 return;
0082
0083 omtfEvent.muonPt = simMuon->momentum().pt();
0084 omtfEvent.muonEta = simMuon->momentum().eta();
0085
0086
0087
0088
0089
0090 omtfEvent.muonPhi = simMuon->momentum().phi();
0091 omtfEvent.muonCharge = muonCharge;
0092
0093 if (omtfCand->getPt() > 0) {
0094 omtfEvent.omtfPt = omtfConfig->hwPtToGev(omtfCand->getPt());
0095 omtfEvent.omtfEta = omtfConfig->hwEtaToEta(omtfCand->getEtaHw());
0096 omtfEvent.omtfPhi = omtfCand->getPhi();
0097 omtfEvent.omtfCharge = std::pow(-1, regionalMuonCand.hwSign());
0098 omtfEvent.omtfScore = omtfCand->getPdfSum();
0099 omtfEvent.omtfQuality = regionalMuonCand.hwQual();
0100 omtfEvent.omtfFiredLayers = omtfCand->getFiredLayerBits();
0101 omtfEvent.omtfRefLayer = omtfCand->getRefLayer();
0102 omtfEvent.omtfProcessor = candProcIndx;
0103
0104 omtfEvent.hits.clear();
0105
0106 auto& gpResult = omtfCand->getGpResult();
0107
0108
0109
0110
0111
0112
0113
0114 for (unsigned int iLogicLayer = 0; iLogicLayer < gpResult.getStubResults().size(); ++iLogicLayer) {
0115 auto& stubResult = gpResult.getStubResults()[iLogicLayer];
0116 if (stubResult.getMuonStub()) {
0117 OmtfEvent::Hit hit;
0118 hit.layer = iLogicLayer;
0119 hit.quality = stubResult.getMuonStub()->qualityHw;
0120 hit.eta = stubResult.getMuonStub()->etaHw;
0121 hit.valid = stubResult.getValid();
0122
0123 int hitPhi = stubResult.getMuonStub()->phiHw;
0124 unsigned int refLayerLogicNum = omtfConfig->getRefToLogicNumber()[omtfCand->getRefLayer()];
0125 int phiRefHit = gpResult.getStubResults()[refLayerLogicNum].getMuonStub()->phiHw;
0126
0127 if (omtfConfig->isBendingLayer(iLogicLayer)) {
0128 hitPhi = stubResult.getMuonStub()->phiBHw;
0129 phiRefHit = 0;
0130 }
0131
0132
0133 hit.phiDist = hitPhi - phiRefHit;
0134
0135
0136
0137
0138
0139
0140
0141 if (hit.phiDist > 504 || hit.phiDist < -512) {
0142 edm::LogVerbatim("l1tOmtfEventPrint")
0143 << " muonPt " << omtfEvent.muonPt << " omtfPt " << omtfEvent.omtfPt << " RefLayer "
0144 << omtfEvent.omtfRefLayer << " layer " << int(hit.layer) << " hit.phiDist " << hit.phiDist << " valid "
0145 << stubResult.getValid() << " !!!!!!!!!!!!!!!!!!!!!!!!" << endl;
0146 }
0147
0148 DetId detId(stubResult.getMuonStub()->detId);
0149 if (detId.subdetId() == MuonSubdetId::CSC) {
0150 CSCDetId cscId(detId);
0151 hit.z = cscId.chamber() % 2;
0152 }
0153
0154 omtfEvent.hits.push_back(hit.rawData);
0155 }
0156 }
0157
0158
0159
0160
0161
0162
0163
0164 rootTree->Fill();
0165 evntCnt++;
0166 }
0167 }
0168
0169 void DataROOTDumper2::endJob() { edm::LogVerbatim("l1tOmtfEventPrint") << " evntCnt " << evntCnt << endl; }