Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport PR 25275 to 102X: Fix RPCtoDTTranslator #25315

Merged
merged 1 commit into from
Nov 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 3 additions & 4 deletions L1Trigger/L1TTwinMux/interface/DTLowQMatching.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@

class DTLowQMatching {
public:
DTLowQMatching(L1MuDTChambPhContainer* , L1MuDTChambPhContainer );
~DTLowQMatching() {};
DTLowQMatching(L1MuDTChambPhContainer const* , L1MuDTChambPhContainer const& );

void run(const edm::EventSetup& c);

Expand All @@ -45,8 +44,8 @@ class DTLowQMatching {

void Matching(int track_seg);

L1MuDTChambPhContainer* m_phiDTDigis;
L1MuDTChambPhContainer m_phiRPCDigis;
L1MuDTChambPhContainer const* m_phiDTDigis;
L1MuDTChambPhContainer const& m_phiRPCDigis;
// L1MuDTChambPhContainer m_phiRPCDigis2;


Expand Down
2 changes: 1 addition & 1 deletion L1Trigger/L1TTwinMux/interface/IOPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class IOPrinter{
~IOPrinter() {};
void run(edm::Handle<L1MuDTChambPhContainer>, const L1MuDTChambPhContainer &, edm::Handle<RPCDigiCollection>,
const edm::EventSetup& );
void run(L1MuDTChambPhContainer*, const L1MuDTChambPhContainer & , RPCDigiCollection*,
void run(L1MuDTChambPhContainer const*, const L1MuDTChambPhContainer & , RPCDigiCollection const*,
const edm::EventSetup& );

};
Expand Down
7 changes: 3 additions & 4 deletions L1Trigger/L1TTwinMux/interface/RPCHitCleaner.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,12 @@

class RPCHitCleaner {
public:
RPCHitCleaner(RPCDigiCollection inrpcDigis);
~RPCHitCleaner() {};
RPCHitCleaner(RPCDigiCollection const& inrpcDigis);

void run(const edm::EventSetup& c);

///Return Output RPCCollection
RPCDigiCollection getRPCCollection(){ return m_outrpcDigis;}
RPCDigiCollection const& getRPCCollection(){ return m_outrpcDigis;}

struct detId_Ext{
RPCDetId detid;
Expand All @@ -49,7 +48,7 @@ class RPCHitCleaner {
private:

///Input
RPCDigiCollection m_inrpcDigis;
RPCDigiCollection const& m_inrpcDigis;
///Output
RPCDigiCollection m_outrpcDigis;

Expand Down
23 changes: 4 additions & 19 deletions L1Trigger/L1TTwinMux/interface/RPCtoDTTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,13 @@

class RPCtoDTTranslator {
public:
RPCtoDTTranslator(RPCDigiCollection inrpcDigis);
~RPCtoDTTranslator() {};
RPCtoDTTranslator(const RPCDigiCollection& inrpcDigis);

void run(const edm::EventSetup& c);

///Return Output PhContainer
L1MuDTChambPhContainer getDTContainer(){ return m_rpcdt_translated;}
L1MuDTChambPhContainer getDTRPCHitsContainer(){ return m_rpchitsdt_translated;}
L1MuDTChambPhContainer const& getDTContainer() const { return m_rpcdt_translated;}
L1MuDTChambPhContainer const& getDTRPCHitsContainer() const { return m_rpchitsdt_translated;}

static int radialAngle(RPCDetId , const edm::EventSetup& , int);
static int bendingAngle(int, int, int);
Expand All @@ -52,21 +51,7 @@ class RPCtoDTTranslator {
L1MuDTChambPhContainer m_rpcdt_translated;
L1MuDTChambPhContainer m_rpchitsdt_translated;

RPCDigiCollection m_rpcDigis;

struct rpc_hit
{
int bx;
int station;
int sector;
int wheel;
RPCDetId detid;
int strip;
int roll;
int layer;
//rpc_hit(int pbx, int pstation,int psector, int pwheel, RPCDetId pdet, int pstrip, int proll, int player) : bx(pbx),station(pstation),sector(psector),wheel(pwheel, detid(pdet),strip(pstrip),roll(proll),layer(player) {}
};

const RPCDigiCollection& m_rpcDigis;

};
#endif
14 changes: 7 additions & 7 deletions L1Trigger/L1TTwinMux/src/DTLowQMatching.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

using namespace std;

DTLowQMatching::DTLowQMatching(L1MuDTChambPhContainer* inphiDTDigis, L1MuDTChambPhContainer inphiRPCDigis): m_phiDTDigis(inphiDTDigis),m_phiRPCDigis(inphiRPCDigis) {
DTLowQMatching::DTLowQMatching(L1MuDTChambPhContainer const* inphiDTDigis, L1MuDTChambPhContainer const& inphiRPCDigis): m_phiDTDigis(inphiDTDigis),m_phiRPCDigis(inphiRPCDigis) {
// m_phiDTDigis=inphiDTDigis;
// m_phiRPCDigis=inphiRPCDigis;
};
Expand All @@ -41,15 +41,15 @@ void DTLowQMatching::Matching(int track_seg){

L1MuDTChambPhDigi * dtts=nullptr;
L1MuDTChambPhDigi * rpcts1=nullptr;
auto m_phiRPCDigis_tm=std::make_shared<L1MuTMChambPhContainer>();
L1MuTMChambPhContainer m_phiRPCDigis_tm;
const std::vector<L1MuDTChambPhDigi> *phiChambVector;
phiChambVector=m_phiRPCDigis.getContainer();
m_phiRPCDigis_tm->setContainer(*phiChambVector );
m_phiRPCDigis_tm.setContainer(*phiChambVector );

auto m_phiDTDigis_tm=std::make_shared<L1MuTMChambPhContainer>();
L1MuTMChambPhContainer m_phiDTDigis_tm;
const std::vector<L1MuDTChambPhDigi> *phiChambVectorDT;
phiChambVectorDT=m_phiDTDigis->getContainer();
m_phiDTDigis_tm->setContainer(*phiChambVectorDT );
m_phiDTDigis_tm.setContainer(*phiChambVectorDT );

int bx=0, wheel=0, sector=0, station=1;
//cout<<"LowQ Matching "<<track_seg<<endl;
Expand All @@ -60,12 +60,12 @@ void DTLowQMatching::Matching(int track_seg){
int matched = 0;
for(int rpcbx=bx-1; rpcbx<=bx+1; rpcbx++){
dtts=nullptr; rpcts1=nullptr;
dtts = m_phiDTDigis_tm->chPhiSegm(wheel,station,sector,bx ,track_seg);
dtts = m_phiDTDigis_tm.chPhiSegm(wheel,station,sector,bx ,track_seg);
if(!dtts || dtts->code()>=2) continue;
int nhits = 0;
nhits = DTRPCBxCorrection::nRPCHits(m_phiRPCDigis, rpcbx, wheel, sector, station);
for(int hit=0; hit<nhits; hit++){
rpcts1 = m_phiRPCDigis_tm->chPhiSegm(wheel, station, sector, rpcbx,hit);
rpcts1 = m_phiRPCDigis_tm.chPhiSegm(wheel, station, sector, rpcbx,hit);
//If DT primitives with q<2 match with rpc hits do nothing else
//'remove' the primitive by setting is quality to 7
if(rpcts1 && DTRPCBxCorrection::deltaPhi(dtts->phi(),rpcts1->phi()) < m_DphiWindow) {
Expand Down
22 changes: 11 additions & 11 deletions L1Trigger/L1TTwinMux/src/DTRPCBxCorrection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,16 @@ void DTRPCBxCorrection::run( const edm::EventSetup& c) {

void DTRPCBxCorrection::BxCorrection(int track_seg){

auto m_phiDTDigis_tm=std::make_shared<L1MuTMChambPhContainer>();
L1MuTMChambPhContainer m_phiDTDigis_tm;
//std::shared_ptr<L1MuTMChambPhContainer> m_phiDTDigis_tm (new L1MuTMChambPhContainer);
const std::vector<L1MuDTChambPhDigi> *phiChambVectorDT;
phiChambVectorDT= m_phiDTDigis.getContainer();
m_phiDTDigis_tm->setContainer(*phiChambVectorDT);
auto m_phiRPCDigis_tm=std::make_shared<L1MuTMChambPhContainer>();
m_phiDTDigis_tm.setContainer(*phiChambVectorDT);
L1MuTMChambPhContainer m_phiRPCDigis_tm;
//std::shared_ptr<L1MuTMChambPhContainer> m_phiRPCDigis_tm (new L1MuTMChambPhContainer);
const std::vector<L1MuDTChambPhDigi> *phiChambVectorRPC;
phiChambVectorRPC= m_phiRPCDigis.getContainer();
m_phiRPCDigis_tm->setContainer(*phiChambVectorRPC);
m_phiRPCDigis_tm.setContainer(*phiChambVectorRPC);

int ibx_dtm = 0, fbx_dtm = 0;
int ibx_dtp = 0, fbx_dtp = 0;
Expand All @@ -68,12 +68,12 @@ void DTRPCBxCorrection::BxCorrection(int track_seg){
for(int rpcbx=bx-1; rpcbx<=bx+1; rpcbx++){
L1MuDTChambPhDigi * dtts=nullptr;
L1MuDTChambPhDigi * rpcts1=nullptr;
dtts = m_phiDTDigis_tm->chPhiSegm(wheel,station,sector,bx ,track_seg);
dtts = m_phiDTDigis_tm.chPhiSegm(wheel,station,sector,bx ,track_seg);

if(!dtts ) continue;
int nhits = nRPCHits(*m_phiRPCDigis_tm, rpcbx, wheel, sector, station);
int nhits = nRPCHits(m_phiRPCDigis_tm, rpcbx, wheel, sector, station);
for(int hit=0; hit<nhits; hit++){
rpcts1 = m_phiRPCDigis_tm->chPhiSegm(wheel, station, sector, rpcbx,hit);
rpcts1 = m_phiRPCDigis_tm.chPhiSegm(wheel, station, sector, rpcbx,hit);
//Store in vectors the dphi of matched dt/rpc
if(rpcts1 && dtts && dtts->code()<m_QualityLimit && deltaPhi(dtts->phi(),rpcts1->phi()) < m_DphiWindow){
if((dtts->bxNum()-rpcbx)==-1 ) {
Expand Down Expand Up @@ -118,8 +118,8 @@ void DTRPCBxCorrection::BxCorrection(int track_seg){
}
else continue;
//Primitve to be shifted in place of dttsnew
dtts = m_phiDTDigis_tm->chPhiSegm(wheel,station,sector,init_bx,track_seg);
dttsnew = m_phiDTDigis_tm->chPhiSegm(wheel,station,sector,final_bx,track_seg);
dtts = m_phiDTDigis_tm.chPhiSegm(wheel,station,sector,init_bx,track_seg);
dttsnew = m_phiDTDigis_tm.chPhiSegm(wheel,station,sector,final_bx,track_seg);
bool shift_1 = false;
if(dtts && dtts->code()<m_QualityLimit && (!dttsnew || shifted[final_bx+3] || dups[final_bx+3])) {
dtts_sh = new L1MuDTChambPhDigi( final_bx , dtts->whNum(), dtts->scNum(), dtts->stNum(),dtts->phi(), dtts->phiB(), dtts->code(), dtts->Ts2Tag(), dtts->BxCnt(),1);
Expand All @@ -129,7 +129,7 @@ void DTRPCBxCorrection::BxCorrection(int track_seg){
if(dtts && dtts->code()<m_QualityLimit && dttsnew) dups[init_bx+3] = true;

//dtts exists and qual lt m_QualityLimit and dttsnew exists and the previous (shift_1) prim was not shifted and there is empty space in second TS
if(dtts && dtts->code()<m_QualityLimit && dttsnew && !shift_1 && !m_phiDTDigis_tm->chPhiSegm(wheel,station,sector,final_bx,flipBit(track_seg)) ) {
if(dtts && dtts->code()<m_QualityLimit && dttsnew && !shift_1 && !m_phiDTDigis_tm.chPhiSegm(wheel,station,sector,final_bx,flipBit(track_seg)) ) {
///XXX: Source of discrepancies
///in order to send as second TS the two prims must come from different halves of the station
///this information does not exist in data
Expand All @@ -154,7 +154,7 @@ void DTRPCBxCorrection::BxCorrection(int track_seg){
continue;}
if(dups[bx+3]) continue;
///if there is no shift then put the original primitive
dtts = m_phiDTDigis_tm->chPhiSegm(wheel,station,sector,bx,track_seg);
dtts = m_phiDTDigis_tm.chPhiSegm(wheel,station,sector,bx,track_seg);
if(!shifted[bx+3] && dtts) {
m_l1ttma_out.push_back(*dtts);
}
Expand Down
34 changes: 10 additions & 24 deletions L1Trigger/L1TTwinMux/src/IOPrinter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ void IOPrinter::run(edm::Handle<L1MuDTChambPhContainer> inphiDigis, const L1MuDT

cout<<"======================================================"<<endl;
int bx=0, wheel=0, sector=0, station=1;
L1MuDTChambPhDigi const* dtts1=nullptr;
L1MuDTChambPhDigi const* dtts2=nullptr;

///Align track segments that are coming in bx-1.
cout<<"DT Inputs/RPCDT Inputs"<<endl;
Expand All @@ -30,9 +28,8 @@ void IOPrinter::run(edm::Handle<L1MuDTChambPhContainer> inphiDigis, const L1MuDT
for (sector=0;sector<12; sector++ ){
for (station=1; station<=4; station++){

dtts1=nullptr; dtts2=nullptr;
dtts1 = inphiDigis->chPhiSegm1(wheel,station,sector,bx);
dtts2 = inphiDigis->chPhiSegm2(wheel,station,sector,bx - 1 );
auto dtts1 = inphiDigis->chPhiSegm1(wheel,station,sector,bx);
auto dtts2 = inphiDigis->chPhiSegm2(wheel,station,sector,bx - 1 );
if(dtts1 && dtts1->code()!=7) {
L1MuDTChambPhDigi dt_ts1 = *dtts1;
cout<<dtts1->bxNum()<<"\t"<<dtts1->whNum()<<"\t"<<dtts1->scNum()<<"\t"<<dtts1->stNum()<<"\t"<<dtts1->phi()<<"\t"<<dtts1->phiB()<<"\t"<<dtts1->code()<<"\t"<<dtts1->Ts2Tag()<<"\t"<<dtts1->BxCnt()<<"\t0"<<endl;
Expand Down Expand Up @@ -68,19 +65,15 @@ void IOPrinter::run(edm::Handle<L1MuDTChambPhContainer> inphiDigis, const L1MuDT

cout<<"TwinMux Output"<<endl;
cout<<"bx\twheel\tsector\tstation\tphi\tphib\tcode\tts2tag\tbxcnt\trpcbit"<<endl;
dtts1=nullptr;
dtts2=nullptr;


for(bx=-2; bx<=2; bx++){
for (wheel=-2;wheel<=2; wheel++ ){
for (sector=0;sector<12; sector++ ){
for (station=1; station<=4; station++){

dtts1=nullptr; dtts2=nullptr;

dtts1 = outphiDigis.chPhiSegm1(wheel,station,sector,bx);
dtts2 = outphiDigis.chPhiSegm2(wheel,station,sector,bx - 1 );
auto dtts1 = outphiDigis.chPhiSegm1(wheel,station,sector,bx);
auto dtts2 = outphiDigis.chPhiSegm2(wheel,station,sector,bx - 1 );
if(dtts1&& dtts1->code()!=7) {
L1MuDTChambPhDigi dt_ts1 = *dtts1;
cout<<dtts1->bxNum()<<"\t"<<dtts1->whNum()<<"\t"<<dtts1->scNum()<<"\t"<<dtts1->stNum()<<"\t"<<dtts1->phi()<<"\t"<<dtts1->phiB()<<"\t"<<dtts1->code()<<"\t"<<dtts1->Ts2Tag()<<"\t"<<dtts1->BxCnt()<<"\t"<<dtts1->RpcBit()<<endl;
Expand All @@ -99,15 +92,13 @@ cout<<"======================================================"<<endl;
}


void IOPrinter::run(L1MuDTChambPhContainer* inphiDigis,const L1MuDTChambPhContainer & outphiDigis,RPCDigiCollection* rpcDigis,const edm::EventSetup& c) {
void IOPrinter::run(L1MuDTChambPhContainer const* inphiDigis,const L1MuDTChambPhContainer & outphiDigis,RPCDigiCollection const* rpcDigis,const edm::EventSetup& c) {

cout<<"======================================================"<<endl;
int bx=0, wheel=0, sector=0, station=1;
L1MuDTChambPhDigi const* dtts1=nullptr;
L1MuDTChambPhDigi const* dtts2=nullptr;
L1MuTMChambPhContainer * inphiDigis_tm=nullptr;
L1MuTMChambPhContainer inphiDigis_tm;
const std::vector<L1MuDTChambPhDigi> * vInCon=inphiDigis->getContainer();
inphiDigis_tm->setContainer(*vInCon);
inphiDigis_tm.setContainer(*vInCon);


///Align track segments that are coming in bx-1.
Expand All @@ -120,8 +111,7 @@ void IOPrinter::run(L1MuDTChambPhContainer* inphiDigis,const L1MuDTChambPhContai
for (station=1; station<=4; station++){
int nhits = DTRPCBxCorrection::nRPCHits(*inphiDigis, bx, wheel, sector, station);
for(int hit=0; hit<nhits; hit++){
dtts1=nullptr;
dtts1 = inphiDigis_tm->chPhiSegm(wheel,station,sector,bx,hit);
auto dtts1 = inphiDigis_tm.chPhiSegm(wheel,station,sector,bx,hit);
if(dtts1) {
cout<<dtts1->bxNum()<<"\t"<<dtts1->whNum()<<"\t"<<dtts1->scNum()<<"\t"<<dtts1->stNum()<<"\t"<<dtts1->phi()<<"\t"<<dtts1->phiB()<<"\t"<<dtts1->code()<<"\t"<<dtts1->Ts2Tag()<<"\t"<<dtts1->BxCnt()<<"\t0"<<endl;
}
Expand Down Expand Up @@ -153,19 +143,15 @@ void IOPrinter::run(L1MuDTChambPhContainer* inphiDigis,const L1MuDTChambPhContai

cout<<"TwinMux Output"<<endl;
cout<<"bx\twheel\tsector\tstation\tphi\tphib\tcode\tts2tag\tbxcnt\trpcbit"<<endl;
dtts1=nullptr;
dtts2=nullptr;


for(bx=-2; bx<=2; bx++){
for (wheel=-2;wheel<=2; wheel++ ){
for (sector=0;sector<12; sector++ ){
for (station=1; station<=4; station++){

dtts1=nullptr; dtts2=nullptr;

dtts1 = outphiDigis.chPhiSegm1(wheel,station,sector,bx);
dtts2 = outphiDigis.chPhiSegm2(wheel,station,sector,bx - 1 );
auto dtts1 = outphiDigis.chPhiSegm1(wheel,station,sector,bx);
auto dtts2 = outphiDigis.chPhiSegm2(wheel,station,sector,bx - 1 );
if(dtts1&& dtts1->code()!=7) {
L1MuDTChambPhDigi dt_ts1 = *dtts1;
cout<<dtts1->bxNum()<<"\t"<<dtts1->whNum()<<"\t"<<dtts1->scNum()<<"\t"<<dtts1->stNum()<<"\t"<<dtts1->phi()<<"\t"<<dtts1->phiB()<<"\t"<<dtts1->code()<<"\t"<<dtts1->Ts2Tag()<<"\t"<<dtts1->BxCnt()<<"\t"<<dtts1->RpcBit()<<endl;
Expand Down
30 changes: 15 additions & 15 deletions L1Trigger/L1TTwinMux/src/L1TTwinMuxAlgorithm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -47,29 +47,29 @@ edm::Handle<L1MuDTChambThContainer> thetaDigis, edm::Handle<RPCDigiCollection> r


///Align track segments that are coming in bx-1.
auto alignedDTs=std::make_shared<AlignTrackSegments>(*inphiDigis);
alignedDTs->run(c);
L1MuDTChambPhContainer phiDigis = alignedDTs->getDTContainer();
AlignTrackSegments alignedDTs{*inphiDigis};
alignedDTs.run(c);
L1MuDTChambPhContainer const& phiDigis = alignedDTs.getDTContainer();
//if only DTs are required without bx correction
//return the aligned track segments
if(onlyDT && !correctBX && !useLowQDT) {
m_tm_phi_output = phiDigis;
return;
}
///Clean RPC hits
auto rpcHitCl=std::make_shared<RPCHitCleaner>(*rpcDigis);
rpcHitCl->run(c);
RPCDigiCollection rpcDigisCleaned = rpcHitCl->getRPCCollection();
RPCHitCleaner rpcHitCl{*rpcDigis};
rpcHitCl.run(c);
RPCDigiCollection const& rpcDigisCleaned = rpcHitCl.getRPCCollection();

///Translate RPC digis to DT primitives.
auto dt_from_rpc= std::make_shared<RPCtoDTTranslator>(rpcDigisCleaned);
dt_from_rpc->run(c);
L1MuDTChambPhContainer rpcPhiDigis = dt_from_rpc->getDTContainer(); //Primitves used for RPC->DT (only station 1 and 2)
L1MuDTChambPhContainer rpcHitsPhiDigis = dt_from_rpc->getDTRPCHitsContainer(); //Primitves used for bx correction
RPCtoDTTranslator dt_from_rpc{rpcDigisCleaned};
dt_from_rpc.run(c);
L1MuDTChambPhContainer const& rpcPhiDigis = dt_from_rpc.getDTContainer(); //Primitves used for RPC->DT (only station 1 and 2)
L1MuDTChambPhContainer const& rpcHitsPhiDigis = dt_from_rpc.getDTRPCHitsContainer(); //Primitves used for bx correction

///Match low q DT primitives with RPC hits in dphiWindow
auto dtlowq= std::make_shared<DTLowQMatching>(&phiDigis, rpcHitsPhiDigis);
dtlowq->run(c);
DTLowQMatching dtlowq{&phiDigis, rpcHitsPhiDigis};
dtlowq.run(c);

if(onlyDT && !correctBX && useLowQDT) {
m_tm_phi_output = phiDigis;
Expand All @@ -88,10 +88,10 @@ edm::Handle<L1MuDTChambThContainer> thetaDigis, edm::Handle<RPCDigiCollection> r

///Correct(in bx) DT primitives by comparing them to RPC.
// DTRPCBxCorrection *rpc_dt_bx = new DTRPCBxCorrection(phiDigis,rpcHitsPhiDigis);
auto rpc_dt_bx=std::make_shared<DTRPCBxCorrection>(phiDigis,rpcHitsPhiDigis);
rpc_dt_bx->run(c);
DTRPCBxCorrection rpc_dt_bx{phiDigis,rpcHitsPhiDigis};
rpc_dt_bx.run(c);

L1MuDTChambPhContainer phiDigiscp = rpc_dt_bx->getDTContainer();
L1MuDTChambPhContainer const& phiDigiscp = rpc_dt_bx.getDTContainer();

///Add RPC primitives in case that there are no DT primitives.
std::vector<L1MuDTChambPhDigi> l1ttma_out;
Expand Down
5 changes: 3 additions & 2 deletions L1Trigger/L1TTwinMux/src/RPCHitCleaner.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@
using namespace std;


RPCHitCleaner::RPCHitCleaner(RPCDigiCollection inrpcDigis){
m_inrpcDigis = inrpcDigis;
RPCHitCleaner::RPCHitCleaner(RPCDigiCollection const& inrpcDigis):
m_inrpcDigis {inrpcDigis}
{
}

namespace {
Expand Down