27 : omtfConfig(omtfConfig),
29 candidateSimMuonMatcher(candidateSimMuonMatcher),
30 inputInProcs(omtfConfig->processorCnt()),
31 algoMuonsInProcs(omtfConfig->processorCnt()),
32 gbCandidatesInProcs(omtfConfig->processorCnt()) {
33 if (edmCfg.
exists(
"simTracksTag"))
37 <<
"EventCapture::EventCapture: no InputTag simTracksTag found" << std::endl;
40 if (this->candidateSimMuonMatcher && edmCfg.
exists(
"trackingParticleTag"))
60 for (
unsigned int iSimTrack = 0; iSimTrack != simTraksHandle->size(); iSimTrack++) {
62 simMuons.emplace_back(simTraksHandle, iSimTrack);
70 algoMuonsInProc.clear();
73 gbCandidatesInProc.clear();
78 const std::shared_ptr<OMTFinput>&
input,
81 const std::vector<l1t::RegionalMuonCand>& candMuons) {
91 std::unique_ptr<l1t::RegionalMuonCandBxCollection>& finalCandidates) {
92 std::ostringstream ostr;
99 LogTrace(
"l1tOmtfEventPrint") <<
"matchingResults.size() " << matchingResults.size() << std::endl;
102 for (
auto& matchingResult : matchingResults) {
104 if (matchingResult.muonCand) {
107 bool runStubsSimHitsMatcher =
false;
108 if (matchingResult.trackingParticle) {
109 auto trackingParticle = matchingResult.trackingParticle;
110 ostr <<
"trackingParticle: eventId " << trackingParticle->eventId().event() <<
" pdgId " << std::setw(3)
111 << trackingParticle->pdgId() <<
" trackId " << trackingParticle->g4Tracks().at(0).trackId() <<
" pt " 112 << std::setw(9) << trackingParticle->pt()
113 <<
" eta " << std::setw(9) << trackingParticle->momentum().eta() <<
" phi " << std::setw(9)
114 << trackingParticle->momentum().phi() << std::endl;
115 }
else if (matchingResult.simTrack) {
116 runStubsSimHitsMatcher =
true;
117 ostr <<
"SimMuon: eventId " << matchingResult.simTrack->eventId().event() <<
" pdgId " << std::setw(3)
118 << matchingResult.simTrack->type() <<
" pt " << std::setw(9)
119 << matchingResult.simTrack->momentum().pt()
120 <<
" eta " << std::setw(9) << matchingResult.simTrack->momentum().eta() <<
" phi " << std::setw(9)
121 << matchingResult.simTrack->momentum().phi() << std::endl;
123 ostr <<
"no simMuon ";
124 runStubsSimHitsMatcher =
true;
126 ostr <<
"matched to: " << std::endl;
127 auto finalCandidate = matchingResult.muonCand;
128 ostr <<
" hwPt " << finalCandidate->hwPt() <<
" hwUPt " << finalCandidate->hwPtUnconstrained() <<
" hwSign " 129 << finalCandidate->hwSign() <<
" hwQual " << finalCandidate->hwQual() <<
" hwEta " << std::setw(4)
130 << finalCandidate->hwEta() << std::setw(4) <<
" hwPhi " << finalCandidate->hwPhi() <<
" eta " 131 << std::setw(9) << (finalCandidate->hwEta() * 0.010875) <<
" phi " << std::endl;
139 bool wasSimMuInOmtfPos =
false;
140 bool wasSimMuInOmtfNeg =
false;
143 if (simMuon->eventId().event() == 0 &&
std::abs(simMuon->momentum().eta()) > 0.82 &&
144 std::abs(simMuon->momentum().eta()) < 1.24 && simMuon->momentum().pt() >= 3.) {
145 ostr <<
"SimMuon: eventId " << simMuon->eventId().event() <<
" pdgId " << std::setw(3) << simMuon->type()
146 <<
" pt " << std::setw(9) << simMuon->momentum().pt()
147 <<
" eta " << std::setw(9) << simMuon->momentum().eta() <<
" phi " << std::setw(9)
148 << simMuon->momentum().phi() << std::endl;
150 if (simMuon->momentum().eta() > 0)
151 wasSimMuInOmtfPos =
true;
153 wasSimMuInOmtfNeg =
true;
157 bool wasCandInNeg =
false;
158 bool wasCandInPos =
false;
160 for (
auto& finalCandidate : *finalCandidates) {
163 finalCandidate.hwPt() > 20)
167 finalCandidate.hwPt() > 20)
171 if ((wasSimMuInOmtfNeg && wasCandInNeg))
174 if ((wasSimMuInOmtfPos && wasCandInPos))
194 edm::LogVerbatim(
"l1tOmtfEventPrint") <<
"##################### EventCapture::observeEventEnd - dump of event " 195 <<
iEvent.id() <<
" #####################################################" 201 for (
int bx = finalCandidates->getFirstBX();
bx <= finalCandidates->getLastBX();
bx++) {
202 for (
auto finalCandidateIt = finalCandidates->begin(
bx); finalCandidateIt != finalCandidates->end(
bx);
203 finalCandidateIt++) {
204 auto& finalCandidate = *finalCandidateIt;
205 int globHwPhi = (finalCandidate.processor()) * 96 + finalCandidate.hwPhi();
207 globHwPhi = (globHwPhi + 600) % 576;
209 double globalPhi = globHwPhi * 2. *
M_PI / 576;
210 if (globalPhi >
M_PI)
211 globalPhi = globalPhi - (2. *
M_PI);
213 int layerHits = (
int)finalCandidate.trackAddress().at(0);
214 std::bitset<18> layerHitBits(layerHits);
217 <<
" bx " <<
bx <<
" hwPt " << finalCandidate.hwPt() <<
" hwUPt " << finalCandidate.hwPtUnconstrained()
218 <<
" hwSign " << finalCandidate.hwSign() <<
" hwQual " << finalCandidate.hwQual() <<
" hwEta " << std::setw(4)
219 << finalCandidate.hwEta() << std::setw(4) <<
" hwPhi " << finalCandidate.hwPhi() <<
" eta " << std::setw(9)
220 << (finalCandidate.hwEta() * 0.010875) <<
" phi " << std::setw(9) << globalPhi <<
" " << layerHitBits
221 <<
" processor " <<
OmtfName(finalCandidate.processor(), finalCandidate.trackFinderType(),
omtfConfig)
224 for (
auto& trackAddr : finalCandidate.trackAddress()) {
225 if (trackAddr.first >= 10)
227 <<
"trackAddr first " << trackAddr.first <<
" second " << trackAddr.second <<
" ptGeV " 234 for (
unsigned int iProc = 0; iProc <
inputInProcs.size(); iProc++) {
237 std::ostringstream ostrInput;
240 int layersWithStubs = 0;
242 for (
auto& stub :
layer) {
243 bool layerFired =
false;
244 if (stub && (stub->type != MuonStub::Type::EMPTY)) {
249 ostrInput << (*stub) <<
" globalPhiRad " << globalPhiRad << std::endl;
256 if (layersWithStubs != 0) {
258 <<
" **************************************************" << std::endl;
262 if (layersWithStubs < 2)
270 if (algoMuon->isValid()) {
272 << board.
name() <<
" " << *algoMuon <<
" RefHitNum " << algoMuon->getRefHitNumber() << std::endl;
274 if (algoMuon->getGpResultUnconstr().isValid())
276 <<
"GpResultUnconstr " << algoMuon->getGoldenPaternUnconstr()->key() <<
"\n" 277 << algoMuon->getGpResultUnconstr() << std::endl;
281 if (
gp->key().thePt == 0)
298 if (gbCandidate->isValid())
302 edm::LogVerbatim(
"l1tOmtfEventPrint") << std::endl << std::endl <<
"\ngb_test " << board.
name() << std::endl;
305 <<
" (" << std::setw(5) << algoMuon->getHwPatternNumConstr() <<
"," << std::setw(5)
306 << algoMuon->getHwPatternNumUnconstr() <<
"," 308 << std::setw(5) << algoMuon->getGpResultConstr().getFiredLayerCnt() <<
"," << std::setw(5)
309 << algoMuon->getGpResultUnconstr().getFiredLayerCnt()
313 << std::setw(6) << algoMuon->getGpResultConstr().getFiredLayerBits() * 2 <<
"," << std::setw(6)
314 << algoMuon->getGpResultUnconstr().getFiredLayerBits() * 2 <<
"," 316 << std::setw(5) << algoMuon->getGpResultConstr().getPdfSum() <<
"," << std::setw(5)
317 << algoMuon->getGpResultUnconstr().getPdfSumUnconstr() <<
"," 319 << std::setw(5) << algoMuon->getGpResultConstr().getPhi() <<
"," << std::setw(5)
320 << algoMuon->getGpResultUnconstr().getPhi()
324 << std::setw(5) << algoMuon->getEtaHw()
328 << std::setw(5) << algoMuon->getRefLayer() <<
"" 330 <<
"), " << std::endl;
335 <<
" (" << std::setw(5) << gbCandidate->getPtConstr() <<
"," << std::setw(5)
336 << gbCandidate->getPtUnconstr() <<
"," 338 << std::setw(5) << gbCandidate->getGpResultConstr().getFiredLayerCnt() <<
"," << std::setw(5)
339 << gbCandidate->getGpResultUnconstr().getFiredLayerCnt()
343 << std::setw(6) << gbCandidate->getGpResultConstr().getFiredLayerBits() * 2 <<
"," << std::setw(6)
344 << gbCandidate->getGpResultUnconstr().getFiredLayerBits() * 2 <<
"," 346 << std::setw(5) << gbCandidate->getGpResultConstr().getPdfSum() <<
"," << std::setw(5)
347 << gbCandidate->getGpResultUnconstr().getPdfSumUnconstr() <<
"," 349 << std::setw(5) << gbCandidate->getGpResultConstr().getPhi() <<
"," << std::setw(5)
350 << gbCandidate->getGpResultUnconstr().getPhi()
354 << std::setw(5) << gbCandidate->getEtaHw()
358 << std::setw(5) << gbCandidate->getRefLayer() <<
"" 361 <<
" -- getFiredLayerBits " << std::setw(5) << gbCandidate->getGpResultConstr().getFiredLayerBits()
366 std::ostringstream ostr;
367 if (finalCandidates->size(0) > 0) {
369 for (
auto finalCandidateIt = finalCandidates->begin(0); finalCandidateIt != finalCandidates->end(0);
370 finalCandidateIt++) {
371 auto& finalCandidate = *finalCandidateIt;
373 auto omtfName =
OmtfName(finalCandidate.processor(), finalCandidate.trackFinderType(),
omtfConfig);
375 if (omtfName == board.
name()) {
376 int layerHits = (
int)finalCandidate.trackAddress().at(0);
377 std::bitset<18> layerHitBits(layerHits);
379 unsigned int trackAddr = finalCandidate.trackAddress().at(0);
380 unsigned int uPt = finalCandidate.hwPtUnconstrained();
382 trackAddr = (uPt << 18) + trackAddr;
384 ostr <<
"M" << iMu <<
":" << std::setw(4) << finalCandidate.hwPt() <<
"," << std::setw(4)
385 << finalCandidate.hwQual() <<
"," << std::setw(4) << finalCandidate.hwPhi() <<
"," << std::setw(4)
389 << std::setw(10) << trackAddr <<
"," << std::setw(4) << 0 <<
"," 390 << std::setw(4) << finalCandidate.hwSign() <<
"," << std::setw(4) << 1 <<
"; ";
400 for (; iMu <= 3; iMu++)
401 ostr <<
"M" << iMu <<
": 0, 0, 0, 0, 0, 0, 0, 0; ";
Log< level::Info, true > LogVerbatim
CandidateSimMuonMatcher * candidateSimMuonMatcher
T getParameter(std::string const &) const
std::vector< AlgoMuons > gbCandidatesInProcs
void observeEventBegin(const edm::Event &event) override
void observeProcesorEmulation(unsigned int iProcessor, l1t::tftype mtfType, const std::shared_ptr< OMTFinput > &, const AlgoMuons &algoCandidates, const AlgoMuons &gbCandidates, const std::vector< l1t::RegionalMuonCand > &candMuons) override
bool exists(std::string const ¶meterName) const
checks if a parameter exists
T const * product() const
const OMTFConfiguration * omtfConfig
double procHwPhiToGlobalPhi(int procHwPhi, int procHwPhi0) const
static std::string const input
std::unique_ptr< StubsSimHitsMatcher > stubsSimHitsMatcher
edm::InputTag simTracksTag
std::vector< edm::Ptr< SimTrack > > simMuons
void beginRun(edm::EventSetup const &eventSetup) override
Abs< T >::type abs(const T &t)
Log< level::Error, true > LogImportant
double hwPtToGev(int hwPt) const override
uGMT pt scale conversion
const GoldenPatternVec< GoldenPattern > * goldenPatterns
std::vector< MatchingResult > getMatchingResults()
void observeEventEnd(const edm::Event &event, std::unique_ptr< l1t::RegionalMuonCandBxCollection > &finalCandidates) override
EventCapture(const edm::ParameterSet &edmCfg, const OMTFConfiguration *omtfConfig, CandidateSimMuonMatcher *candidateSimMuonMatcher, const MuonGeometryTokens &muonGeometryTokens, const GoldenPatternVec< GoldenPattern > *gps=nullptr)
std::vector< std::shared_ptr< OMTFinput > > inputInProcs
std::vector< std::unique_ptr< GoldenPatternType > > GoldenPatternVec
std::vector< AlgoMuonPtr > AlgoMuons
unsigned int getProcIndx(unsigned int iProcessor, l1t::tftype mtfType) const
input phi should be in the hardware scale (nPhiBins units for 2pi), can be in range -nPhiBins ...
unsigned int nProcessors() const
std::vector< AlgoMuons > algoMuonsInProcs