Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-12-06 23:18:40

0001 /*
0002  * DataROOTDumper2.cc
0003  *
0004  *  Created on: Dec 11, 2019
0005  *      Author: kbunkow
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);  //<<<<<<<<<<<<<<<<<<<<<<!!!!TODOO
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())  //no sim muon or empty candidate
0081     return;
0082 
0083   omtfEvent.muonPt = simMuon->momentum().pt();
0084   omtfEvent.muonEta = simMuon->momentum().eta();
0085 
0086   //TODO add cut on ete if needed
0087   /*  if(abs(event.muonEta) < 0.8 || abs(event.muonEta) > 1.24)
0088     return;*/
0089 
0090   omtfEvent.muonPhi = simMuon->momentum().phi();
0091   omtfEvent.muonCharge = muonCharge;  //TODO
0092 
0093   if (omtfCand->getPt() > 0) {  //&& omtfCand->getFiredLayerCnt() > 3 TODO add to the if needed
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();  //omtfCand->getQ();
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     edm::LogVerbatim("l1tOmtfEventPrint")<<"DataROOTDumper2:;observeEventEnd muonPt "<<event.muonPt<<" muonCharge "<<event.muonCharge
0110         <<" omtfPt "<<event.omtfPt<<" RefLayer "<<event.omtfRefLayer<<" omtfPtCont "<<event.omtfPtCont
0111         <<std::endl;
0112 */
0113 
0114     for (unsigned int iLogicLayer = 0; iLogicLayer < gpResult.getStubResults().size(); ++iLogicLayer) {
0115       auto& stubResult = gpResult.getStubResults()[iLogicLayer];
0116       if (stubResult.getMuonStub()) {  //&& stubResult.getValid() //TODO!!!!!!!!!!!!!!!!1
0117         OmtfEvent::Hit hit;
0118         hit.layer = iLogicLayer;
0119         hit.quality = stubResult.getMuonStub()->qualityHw;
0120         hit.eta = stubResult.getMuonStub()->etaHw;  //in which scale?
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;  //phi ref hit for the bending layer set to 0, since it should not be included in the phiDist
0130         }
0131 
0132         //phiDist = hitPhi - phiRefHit;
0133         hit.phiDist = hitPhi - phiRefHit;
0134 
0135         /* LogTrace("l1tOmtfEventPrint")<<" muonPt "<<event.muonPt<<" omtfPt "<<event.omtfPt<<" RefLayer "<<event.omtfRefLayer
0136             <<" layer "<<int(hit.layer)<<" PdfBin "<<stubResult.getPdfBin()<<" hit.phiDist "<<hit.phiDist<<" valid "<<stubResult.getValid()<<" " //<<" phiDist "<<phiDist
0137             <<" getDistPhiBitShift "<<omtfCand->getGoldenPatern()->getDistPhiBitShift(iLogicLayer, omtfCand->getRefLayer())
0138             <<" meanDistPhiValue   "<<omtfCand->getGoldenPatern()->meanDistPhiValue(iLogicLayer, omtfCand->getRefLayer())//<<(phiDist != hit.phiDist? "!!!!!!!<<<<<" : "")
0139             <<endl;*/
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     //debug
0159     /*if( (int)event.hits.size() != omtfCand->getQ()) {
0160       LogTrace("l1tOmtfEventPrint")<<" muonPt "<<event.muonPt<<" omtfPt "<<event.omtfPt<<" RefLayer "<<event.omtfRefLayer
0161                     <<" hits.size "<<event.hits.size()<<" omtfCand->getQ "<<omtfCand->getQ()<<" !!!!!!!!!!!!!!!!!!aaa!!!!!!"<<endl;
0162     }*/
0163 
0164     rootTree->Fill();
0165     evntCnt++;
0166   }
0167 }
0168 
0169 void DataROOTDumper2::endJob() { edm::LogVerbatim("l1tOmtfEventPrint") << " evntCnt " << evntCnt << endl; }