Skip to content

Commit

Permalink
Merge branch 'l1t-muon-pass2-CMSSW_8_0_0_pre5' of github.com:cms-l1t-…
Browse files Browse the repository at this point in the history
…offline/cmssw into EMTF_Unpacker_dev_800pre5
  • Loading branch information
abrinke1 committed Jan 30, 2016
2 parents da18a97 + ae45fa8 commit 7c40315
Show file tree
Hide file tree
Showing 14 changed files with 159 additions and 44 deletions.
25 changes: 22 additions & 3 deletions CondFormats/L1TObjects/interface/L1TMuonGlobalParams.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,11 @@ class L1TMuonGlobalParams {
// string parameters indices
enum spIdx {fname=0};

// unsigned parameters indices
enum upIdx {ptFactor=0, qualFactor=1};

// double parameters indices
enum dpIdx {maxdr=0};
enum dpIdx {maxdr=0, maxdrEtaFine=1};

L1TMuonGlobalParams() { version_=Version; pnodes_.resize(NUM_GMTPARAMNODES); }
~L1TMuonGlobalParams() {}
Expand All @@ -88,6 +91,12 @@ class L1TMuonGlobalParams {
unsigned fwVersion() const { return fwVersion_; }
void setFwVersion(unsigned fwVersion) { fwVersion_ = fwVersion; }

// BX range
int bxMin() const { return bxMin_; }
int bxMax() const { return bxMax_; }
void setBxMin(int bxMin) { bxMin_ = bxMin; }
void setBxMax(int bxMax) { bxMax_ = bxMax; }

// LUTs
l1t::LUT* absIsoCheckMemLUT() { return &pnodes_[absIsoCheckMem].LUT_; }
l1t::LUT* relIsoCheckMemLUT() { return &pnodes_[relIsoCheckMem].LUT_; }
Expand Down Expand Up @@ -180,18 +189,25 @@ class L1TMuonGlobalParams {
double ovlNegSingleMatchQualLUTMaxDR() const { return pnodes_[ovlNegSingleMatchQual].dparams_.size() > dpIdx::maxdr ? pnodes_[ovlNegSingleMatchQual].dparams_[dpIdx::maxdr] : 0.; }
double bOPosMatchQualLUTMaxDR() const { return pnodes_[bOPosMatchQual].dparams_.size() > dpIdx::maxdr ? pnodes_[bOPosMatchQual].dparams_[dpIdx::maxdr] : 0.; }
double bONegMatchQualLUTMaxDR() const { return pnodes_[bONegMatchQual].dparams_.size() > dpIdx::maxdr ? pnodes_[bONegMatchQual].dparams_[dpIdx::maxdr] : 0.; }
double bOPosMatchQualLUTMaxDREtaFine() const { return pnodes_[bOPosMatchQual].dparams_.size() > dpIdx::maxdrEtaFine ? pnodes_[bOPosMatchQual].dparams_[dpIdx::maxdrEtaFine] : 0.; }
double bONegMatchQualLUTMaxDREtaFine() const { return pnodes_[bONegMatchQual].dparams_.size() > dpIdx::maxdrEtaFine ? pnodes_[bONegMatchQual].dparams_[dpIdx::maxdrEtaFine] : 0.; }
double fOPosMatchQualLUTMaxDR() const { return pnodes_[fOPosMatchQual].dparams_.size() > dpIdx::maxdr ? pnodes_[fOPosMatchQual].dparams_[dpIdx::maxdr] : 0.; }
double fONegMatchQualLUTMaxDR() const { return pnodes_[fONegMatchQual].dparams_.size() > dpIdx::maxdr ? pnodes_[fONegMatchQual].dparams_[dpIdx::maxdr] : 0.; }
//void setBrlSingleMatchQualLUTMaxDR (double maxDR) { pnodes_[brlSingleMatchQual].dparams_.push_back(maxDR); }
void setFwdPosSingleMatchQualLUTMaxDR (double maxDR) { pnodes_[fwdPosSingleMatchQual].dparams_.push_back(maxDR); }
void setFwdNegSingleMatchQualLUTMaxDR (double maxDR) { pnodes_[fwdNegSingleMatchQual].dparams_.push_back(maxDR); }
void setOvlPosSingleMatchQualLUTMaxDR (double maxDR) { pnodes_[ovlPosSingleMatchQual].dparams_.push_back(maxDR); }
void setOvlNegSingleMatchQualLUTMaxDR (double maxDR) { pnodes_[ovlNegSingleMatchQual].dparams_.push_back(maxDR); }
void setBOPosMatchQualLUTMaxDR (double maxDR) { pnodes_[bOPosMatchQual].dparams_.push_back(maxDR); }
void setBONegMatchQualLUTMaxDR (double maxDR) { pnodes_[bONegMatchQual].dparams_.push_back(maxDR); }
void setBOPosMatchQualLUTMaxDR (double maxDR, double maxDREtaFine) { pnodes_[bOPosMatchQual].dparams_.push_back(maxDR); pnodes_[bOPosMatchQual].dparams_.push_back(maxDREtaFine); }
void setBONegMatchQualLUTMaxDR (double maxDR, double maxDREtaFine) { pnodes_[bONegMatchQual].dparams_.push_back(maxDR); pnodes_[bONegMatchQual].dparams_.push_back(maxDREtaFine); }
void setFOPosMatchQualLUTMaxDR (double maxDR) { pnodes_[fOPosMatchQual].dparams_.push_back(maxDR); }
void setFONegMatchQualLUTMaxDR (double maxDR) { pnodes_[fONegMatchQual].dparams_.push_back(maxDR); }

// Sort rank LUT factors for pT and quality
unsigned sortRankLUTPtFactor() const { return pnodes_[sortRank].uparams_.size() > upIdx::ptFactor ? pnodes_[sortRank].uparams_[upIdx::ptFactor] : 0; }
unsigned sortRankLUTQualFactor() const { return pnodes_[sortRank].uparams_.size() > upIdx::qualFactor ? pnodes_[sortRank].uparams_[upIdx::qualFactor] : 0; }
void setSortRankLUTFactors(unsigned ptFactor, unsigned qualFactor) { pnodes_[sortRank].uparams_.push_back(ptFactor); pnodes_[sortRank].uparams_.push_back(qualFactor); }

// print parameters to stream:
void print(std::ostream&) const;
friend std::ostream& operator<<(std::ostream& o, const L1TMuonGlobalParams & p) { p.print(o); return o; }
Expand All @@ -200,6 +216,9 @@ class L1TMuonGlobalParams {
unsigned version_;
unsigned fwVersion_;

int bxMin_;
int bxMax_;

std::vector<Node> pnodes_;

COND_SERIALIZABLE;
Expand Down
8 changes: 5 additions & 3 deletions CondFormats/L1TObjects/src/L1TMuonGlobalParams.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ void L1TMuonGlobalParams::print(std::ostream& out) const {

out << "Firmware version: " << fwVersion_ << std::endl;

out << "Output BX range from " << bxMin_ << " to " << bxMax_ << std::endl;

out << "LUT paths (LUTs are generated analytically if path is empty)" << std::endl;
out << " Abs isolation checkMem LUT path: " << this->absIsoCheckMemLUTPath() << std::endl;
out << " Rel isolation checkMem LUT path: " << this->relIsoCheckMemLUTPath() << std::endl;
Expand All @@ -16,8 +18,8 @@ void L1TMuonGlobalParams::print(std::ostream& out) const {
out << " Forward neg MatchQual LUT path: " << this->fwdNegSingleMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->fwdNegSingleMatchQualLUTMaxDR() << std::endl;
out << " Overlap pos MatchQual LUT path: " << this->ovlPosSingleMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->ovlPosSingleMatchQualLUTMaxDR() << std::endl;
out << " Overlap neg MatchQual LUT path: " << this->ovlNegSingleMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->ovlNegSingleMatchQualLUTMaxDR() << std::endl;
out << " Barrel-Overlap pos MatchQual LUT path: " << this->bOPosMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->bOPosMatchQualLUTMaxDR() << std::endl;
out << " Barrel-Overlap neg MatchQual LUT path: " << this->bONegMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->bONegMatchQualLUTMaxDR() << std::endl;
out << " Barrel-Overlap pos MatchQual LUT path: " << this->bOPosMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->bOPosMatchQualLUTMaxDR() << ", max dR when eta-fine bit set: " << this->bOPosMatchQualLUTMaxDREtaFine() << std::endl;
out << " Barrel-Overlap neg MatchQual LUT path: " << this->bONegMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->bONegMatchQualLUTMaxDR() << ", max dR when eta-fine bit set: " << this->bONegMatchQualLUTMaxDREtaFine() << std::endl;
out << " Forward-Overlap pos MatchQual LUT path: " << this->fOPosMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->fOPosMatchQualLUTMaxDR() << std::endl;
out << " Forward-Overlap neg MatchQual LUT path: " << this->fONegMatchQualLUTPath() << ", max dR (Used when LUT path empty): " << this->fONegMatchQualLUTMaxDR() << std::endl;
out << " Barrel phi extrapolation LUT path: " << this->bPhiExtrapolationLUTPath() << std::endl;
Expand All @@ -26,5 +28,5 @@ void L1TMuonGlobalParams::print(std::ostream& out) const {
out << " Barrel eta extrapolation LUT path: " << this->bEtaExtrapolationLUTPath() << std::endl;
out << " Overlap eta extrapolation LUT path: " << this->oEtaExtrapolationLUTPath() << std::endl;
out << " Forward eta extrapolation LUT path: " << this->fEtaExtrapolationLUTPath() << std::endl;
out << " Sort rank LUT path: " << this->sortRankLUTPath() << std::endl;
out << " Sort rank LUT path: " << this->sortRankLUTPath() << ", pT and quality factors (Used when LUT path empty): pT factor: " << this->sortRankLUTPtFactor() << ", quality factor: " << this->sortRankLUTQualFactor() << std::endl;
}
5 changes: 5 additions & 0 deletions DataFormats/L1DTTrackFinder/interface/L1MuDTChambPhDigi.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ class L1MuDTChambPhDigi {
L1MuDTChambPhDigi( int ubx, int uwh, int usc, int ust,
int uphr, int uphb, int uqua, int utag, int ucnt );

L1MuDTChambPhDigi( int ubx, int uwh, int usc, int ust,
int uphr, int uphb, int uqua, int utag, int ucnt, int urpc);

// Destructor
~L1MuDTChambPhDigi();

Expand All @@ -54,6 +57,7 @@ class L1MuDTChambPhDigi {
int code() const;
int Ts2Tag() const;
int BxCnt() const;
int RpcBit() const;

private:

Expand All @@ -66,6 +70,7 @@ class L1MuDTChambPhDigi {
int qualityCode;
int Ts2TagCode;
int BxCntCode;
int rpcBit;
};

#endif
24 changes: 24 additions & 0 deletions DataFormats/L1DTTrackFinder/src/L1MuDTChambPhDigi.cc
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ L1MuDTChambPhDigi::L1MuDTChambPhDigi() {
qualityCode = 7;
Ts2TagCode = 0;
BxCntCode = 0;
rpcBit = -10;
}

L1MuDTChambPhDigi::L1MuDTChambPhDigi( int ubx, int uwh, int usc, int ust,
Expand All @@ -58,8 +59,27 @@ L1MuDTChambPhDigi::L1MuDTChambPhDigi( int ubx, int uwh, int usc, int ust,
qualityCode = uqua;
Ts2TagCode = utag;
BxCntCode = ucnt;
rpcBit = -10;
}


L1MuDTChambPhDigi::L1MuDTChambPhDigi( int ubx, int uwh, int usc, int ust,
int uphr, int uphb, int uqua, int utag, int ucnt, int urpc ) {

bx = ubx;
wheel = uwh;
sector = usc;
station = ust;
radialAngle = uphr;
bendingAngle = uphb;
qualityCode = uqua;
Ts2TagCode = utag;
BxCntCode = ucnt;
rpcBit = urpc;
}



//--------------
// Destructor --
//--------------
Expand Down Expand Up @@ -102,3 +122,7 @@ int L1MuDTChambPhDigi::Ts2Tag() const {
int L1MuDTChambPhDigi::BxCnt() const {
return BxCntCode;
}

int L1MuDTChambPhDigi::RpcBit() const {
return rpcBit;
}
3 changes: 2 additions & 1 deletion DataFormats/L1DTTrackFinder/src/classes_def.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@

<lcgdict>

<class name="L1MuDTChambPhDigi" ClassVersion="10">
<class name="L1MuDTChambPhDigi" ClassVersion="11">
<version ClassVersion="11" checksum="165624804"/>
<version ClassVersion="10" checksum="4002141935"/>
</class>
<class name="L1MuDTChambThDigi" ClassVersion="10">
Expand Down
2 changes: 1 addition & 1 deletion L1Trigger/L1TMuon/interface/MicroGMTLUTFactories.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ namespace l1t {

typedef std::shared_ptr<MicroGMTRankPtQualLUT> ReturnType;

static ReturnType create(const std::string& filename, const int fwVersion);
static ReturnType create(const std::string& filename, const int fwVersion, const unsigned ptFactor, const unsigned qualFactor);
};

class MicroGMTMatchQualLUTFactory {
Expand Down
5 changes: 4 additions & 1 deletion L1Trigger/L1TMuon/interface/MicroGMTRankPtQualLUT.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace l1t {
class MicroGMTRankPtQualLUT : public MicroGMTLUT {
public:
MicroGMTRankPtQualLUT() {};
explicit MicroGMTRankPtQualLUT(const std::string&);
explicit MicroGMTRankPtQualLUT(const std::string&, const unsigned, const unsigned);
virtual ~MicroGMTRankPtQualLUT() {};

int lookup(int pt, int qual) const;
Expand All @@ -26,6 +26,9 @@ namespace l1t {
int m_ptInWidth;
int m_qualInWidth;

// factor defining the weight of the two inputs when building the LUT
unsigned m_ptFactor;
unsigned m_qualFactor;
};
}

Expand Down
63 changes: 52 additions & 11 deletions L1Trigger/L1TMuon/plugins/L1TMicroGMTLUTDumper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@
#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "L1Trigger/L1TMuon/interface/MicroGMTRankPtQualLUT.h"
#include "L1Trigger/L1TMuon/interface/MicroGMTAbsoluteIsolationCheckLUT.h"
#include "L1Trigger/L1TMuon/interface/MicroGMTRelativeIsolationCheckLUT.h"
#include "L1Trigger/L1TMuon/interface/MicroGMTCaloIndexSelectionLUT.h"
#include "L1Trigger/L1TMuon/interface/MicroGMTExtrapolationLUT.h"
#include "L1Trigger/L1TMuon/interface/MicroGMTMatchQualLUT.h"
#include "L1Trigger/L1TMuon/interface/MicroGMTLUTFactories.h"

Expand All @@ -62,8 +66,22 @@ class L1TMicroGMTLUTDumper : public edm::EDAnalyzer {
// ----------member data ---------------------------
std::unique_ptr<L1TMuonGlobalParams> microGMTParams;
std::string m_foldername;

std::shared_ptr<MicroGMTRankPtQualLUT> m_rankLUT;

std::shared_ptr<MicroGMTAbsoluteIsolationCheckLUT> m_absIsoCheckMemLUT;
std::shared_ptr<MicroGMTRelativeIsolationCheckLUT> m_relIsoCheckMemLUT;

std::shared_ptr<MicroGMTCaloIndexSelectionLUT> m_idxSelMemPhiLUT;
std::shared_ptr<MicroGMTCaloIndexSelectionLUT> m_idxSelMemEtaLUT;

std::shared_ptr<MicroGMTExtrapolationLUT> m_bPhiExtrapolationLUT;
std::shared_ptr<MicroGMTExtrapolationLUT> m_oPhiExtrapolationLUT;
std::shared_ptr<MicroGMTExtrapolationLUT> m_fPhiExtrapolationLUT;
std::shared_ptr<MicroGMTExtrapolationLUT> m_bEtaExtrapolationLUT;
std::shared_ptr<MicroGMTExtrapolationLUT> m_oEtaExtrapolationLUT;
std::shared_ptr<MicroGMTExtrapolationLUT> m_fEtaExtrapolationLUT;

std::shared_ptr<MicroGMTMatchQualLUT> m_boPosMatchQualLUT;
std::shared_ptr<MicroGMTMatchQualLUT> m_boNegMatchQualLUT;
std::shared_ptr<MicroGMTMatchQualLUT> m_foPosMatchQualLUT;
Expand Down Expand Up @@ -120,16 +138,26 @@ void
L1TMicroGMTLUTDumper::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
{
using namespace edm;
dumpLut(m_rankLUT.get(), std::string("/rank_lut.json"));
dumpLut(m_boPosMatchQualLUT.get(), std::string("/boPosMatchQualLUT.json"));
dumpLut(m_boNegMatchQualLUT.get(), std::string("/boNegMatchQualLUT.json"));
dumpLut(m_foPosMatchQualLUT.get(), std::string("/foPosMatchQualLUT.json"));
dumpLut(m_foNegMatchQualLUT.get(), std::string("/foNegMatchQualLUT.json"));
//dumpLut(m_brlSingleMatchQualLUT.get(), std::string("/brlSingleMatchQualLUT.json"));
dumpLut(m_ovlPosSingleMatchQualLUT.get(), std::string("/ovlPosSingleMatchQualLUT.json"));
dumpLut(m_ovlNegSingleMatchQualLUT.get(), std::string("/ovlNegSingleMatchQualLUT.json"));
dumpLut(m_fwdPosSingleMatchQualLUT.get(), std::string("/fwdPosSingleMatchQualLUT.json"));
dumpLut(m_fwdNegSingleMatchQualLUT.get(), std::string("/fwdNegSingleMatchQualLUT.json"));
dumpLut(m_rankLUT.get(), std::string("/SortRank.txt"));
dumpLut(m_absIsoCheckMemLUT.get(), std::string("/AbsIsoCheckMem.txt"));
dumpLut(m_relIsoCheckMemLUT.get(), std::string("/RelIsoCheckMem.txt"));
dumpLut(m_idxSelMemPhiLUT.get(), std::string("/IdxSelMemPhi.txt"));
dumpLut(m_idxSelMemEtaLUT.get(), std::string("/IdxSelMemEta.txt"));
dumpLut(m_bPhiExtrapolationLUT.get(), std::string("/BPhiExtrapolation.txt"));
dumpLut(m_oPhiExtrapolationLUT.get(), std::string("/OPhiExtrapolation.txt"));
dumpLut(m_fPhiExtrapolationLUT.get(), std::string("/EPhiExtrapolation.txt"));
dumpLut(m_bEtaExtrapolationLUT.get(), std::string("/BEtaExtrapolation.txt"));
dumpLut(m_oEtaExtrapolationLUT.get(), std::string("/OEtaExtrapolation.txt"));
dumpLut(m_fEtaExtrapolationLUT.get(), std::string("/EEtaExtrapolation.txt"));
dumpLut(m_boPosMatchQualLUT.get(), std::string("/BOPosMatchQual.txt"));
dumpLut(m_boNegMatchQualLUT.get(), std::string("/BONegMatchQual.txt"));
dumpLut(m_foPosMatchQualLUT.get(), std::string("/EOPosMatchQual.txt"));
dumpLut(m_foNegMatchQualLUT.get(), std::string("/EONegMatchQual.txt"));
//dumpLut(m_brlSingleMatchQualLUT.get(), std::string("/BmtfSingleMatchQual.txt"));
dumpLut(m_ovlPosSingleMatchQualLUT.get(), std::string("/OmtfPosSingleMatchQual.txt"));
dumpLut(m_ovlNegSingleMatchQualLUT.get(), std::string("/OmtfNegSingleMatchQual.txt"));
dumpLut(m_fwdPosSingleMatchQualLUT.get(), std::string("/EmtfPosSingleMatchQual.txt"));
dumpLut(m_fwdNegSingleMatchQualLUT.get(), std::string("/EmtfNegSingleMatchQual.txt"));

}

Expand All @@ -147,7 +175,20 @@ L1TMicroGMTLUTDumper::beginRun(edm::Run const& run, edm::EventSetup const& iSetu
}

int fwVersion = microGMTParams->fwVersion();
m_rankLUT = MicroGMTRankPtQualLUTFactory::create(microGMTParams->sortRankLUTPath(), fwVersion);
m_rankLUT = MicroGMTRankPtQualLUTFactory::create(microGMTParams->sortRankLUTPath(), fwVersion, microGMTParams->sortRankLUTPtFactor(), microGMTParams->sortRankLUTQualFactor());

m_absIsoCheckMemLUT = MicroGMTAbsoluteIsolationCheckLUTFactory::create(microGMTParams->absIsoCheckMemLUTPath(), fwVersion);
m_relIsoCheckMemLUT = MicroGMTRelativeIsolationCheckLUTFactory::create(microGMTParams->relIsoCheckMemLUTPath(), fwVersion);
m_idxSelMemPhiLUT = MicroGMTCaloIndexSelectionLUTFactory::create(microGMTParams->idxSelMemPhiLUTPath(), l1t::MicroGMTConfiguration::PHI, fwVersion);
m_idxSelMemEtaLUT = MicroGMTCaloIndexSelectionLUTFactory::create(microGMTParams->idxSelMemEtaLUTPath(), l1t::MicroGMTConfiguration::ETA, fwVersion);

m_bPhiExtrapolationLUT = MicroGMTExtrapolationLUTFactory::create(microGMTParams->bPhiExtrapolationLUTPath(), l1t::MicroGMTConfiguration::PHI_OUT, fwVersion);
m_oPhiExtrapolationLUT = MicroGMTExtrapolationLUTFactory::create(microGMTParams->oPhiExtrapolationLUTPath(), l1t::MicroGMTConfiguration::PHI_OUT, fwVersion);
m_fPhiExtrapolationLUT = MicroGMTExtrapolationLUTFactory::create(microGMTParams->fPhiExtrapolationLUTPath(), l1t::MicroGMTConfiguration::PHI_OUT, fwVersion);
m_bEtaExtrapolationLUT = MicroGMTExtrapolationLUTFactory::create(microGMTParams->bEtaExtrapolationLUTPath(), l1t::MicroGMTConfiguration::ETA_OUT, fwVersion);
m_oEtaExtrapolationLUT = MicroGMTExtrapolationLUTFactory::create(microGMTParams->oEtaExtrapolationLUTPath(), l1t::MicroGMTConfiguration::ETA_OUT, fwVersion);
m_fEtaExtrapolationLUT = MicroGMTExtrapolationLUTFactory::create(microGMTParams->fEtaExtrapolationLUTPath(), l1t::MicroGMTConfiguration::ETA_OUT, fwVersion);

m_boPosMatchQualLUT = l1t::MicroGMTMatchQualLUTFactory::create(microGMTParams->bOPosMatchQualLUTPath(), microGMTParams->bOPosMatchQualLUTMaxDR(), cancel_t::omtf_bmtf_pos, fwVersion);
m_boNegMatchQualLUT = l1t::MicroGMTMatchQualLUTFactory::create(microGMTParams->bONegMatchQualLUTPath(), microGMTParams->bONegMatchQualLUTMaxDR(), cancel_t::omtf_bmtf_neg, fwVersion);
m_foPosMatchQualLUT = l1t::MicroGMTMatchQualLUTFactory::create(microGMTParams->fOPosMatchQualLUTPath(), microGMTParams->fOPosMatchQualLUTMaxDR(), cancel_t::omtf_emtf_pos, fwVersion);
Expand Down
Loading

0 comments on commit 7c40315

Please sign in to comment.