Skip to content

Commit

Permalink
Merge pull request #2 from gem-sw/master
Browse files Browse the repository at this point in the history
2014-01-06 merge
  • Loading branch information
aysent committed Jan 6, 2014
2 parents b117ff6 + 02f7146 commit 5f4cd7f
Show file tree
Hide file tree
Showing 9 changed files with 352 additions and 151 deletions.
166 changes: 64 additions & 102 deletions GEMValidation/plugins/GEMRecHitAnalyzer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class GEMRecHitAnalyzer : public edm::EDAnalyzer
void bookGEMSimHitsTree();
void bookSimTracksTree();
bool isSimTrackGood(const SimTrack &);
MyGEMSimHit isGEMRecHitMatched(MyGEMRecHit gem_recHit_, const edm::Event& iEvent);
bool isGEMRecHitMatched(MyGEMRecHit gem_recHit_, MyGEMSimHit gem_sh);
void analyzeGEM(const edm::Event& iEvent);
void analyzeTracks(edm::ParameterSet, const edm::Event&, const edm::EventSetup&);
void buildLUT();
Expand Down Expand Up @@ -296,75 +296,39 @@ void GEMRecHitAnalyzer::bookSimTracksTree()
track_tree_->Branch("has_gem_rh_l2",&track_.has_gem_rh_l2);
}

MyGEMSimHit GEMRecHitAnalyzer::isGEMRecHitMatched(MyGEMRecHit gem_recHit_, const edm::Event& iEvent)
bool GEMRecHitAnalyzer::isGEMRecHitMatched(MyGEMRecHit gem_recHit_, MyGEMSimHit gem_sh)
{

MyGEMSimHit result;
MyGEMSimHit gem_sh_temp;

Float_t gem_region = gem_recHit_.region;
Float_t gem_layer = gem_recHit_.layer;

Float_t recPhi = gem_recHit_.globalPhi;
Float_t recEta = gem_recHit_.globalEta;

for (edm::PSimHitContainer::const_iterator itHit = GEMHits->begin(); itHit != GEMHits->end(); ++itHit)
{

if(abs(itHit->particleType()) != 13) continue;

gem_sh_temp.eventNumber = iEvent.id().event();
gem_sh_temp.detUnitId = itHit->detUnitId();
gem_sh_temp.particleType = itHit->particleType();
gem_sh_temp.x = itHit->localPosition().x();
gem_sh_temp.y = itHit->localPosition().y();
gem_sh_temp.energyLoss = itHit->energyLoss();
gem_sh_temp.pabs = itHit->pabs();
gem_sh_temp.timeOfFlight = itHit->timeOfFlight();

const GEMDetId idSim(itHit->detUnitId());
Int_t gem_region = gem_recHit_.region;
Int_t gem_layer = gem_recHit_.layer;
Int_t gem_chamber = gem_recHit_.chamber;
Int_t gem_roll = gem_recHit_.roll;
Int_t gem_firstStrip = gem_recHit_.firstClusterStrip;
Int_t gem_cls = gem_recHit_.clusterSize;

gem_sh_temp.region = idSim.region();
gem_sh_temp.ring = idSim.ring();
gem_sh_temp.station = idSim.station();
gem_sh_temp.layer = idSim.layer();
gem_sh_temp.chamber = idSim.chamber();
gem_sh_temp.roll = idSim.roll();
Int_t gem_sh_region = gem_sh.region;
Int_t gem_sh_layer = gem_sh.layer;
Int_t gem_sh_chamber = gem_sh.chamber;
Int_t gem_sh_roll = gem_sh.roll;
Int_t gem_sh_strip = gem_sh.strip;

const LocalPoint p0(0., 0., 0.);
const GlobalPoint Gp0(gem_geometry_->idToDet(itHit->detUnitId())->surface().toGlobal(p0));
std::vector<int> stripsFired;
for(int i = gem_firstStrip; i < (gem_firstStrip + gem_cls); i++){

gem_sh_temp.Phi_0 = Gp0.phi();
gem_sh_temp.R_0 = Gp0.perp();
gem_sh_temp.DeltaPhi = atan(-1*idSim.region()*pow(-1,idSim.chamber())*itHit->localPosition().x()/(Gp0.perp() + itHit->localPosition().y()));

const LocalPoint hitLPSim(itHit->localPosition());
const GlobalPoint hitGPSim(gem_geometry_->idToDet(itHit->detUnitId())->surface().toGlobal(hitLPSim));
gem_sh_temp.globalR = hitGPSim.perp();
gem_sh_temp.globalEta = hitGPSim.eta();
gem_sh_temp.globalPhi = hitGPSim.phi();
gem_sh_temp.globalX = hitGPSim.x();
gem_sh_temp.globalY = hitGPSim.y();
gem_sh_temp.globalZ = hitGPSim.z();

// Now filling strip info using entry point rather than local position to be
// consistent with digi strips. To change back, just switch the comments - WHF
// gem_sh_temp.strip=gem_geometry_->etaPartition(itHit->detUnitId())->strip(hitLP);
const LocalPoint hitEP(itHit->entryPoint());
gem_sh_temp.strip=gem_geometry_->etaPartition(itHit->detUnitId())->strip(hitEP);

Float_t gem_sh_region = gem_sh_temp.region;
Float_t gem_sh_layer = gem_sh_temp.layer;

Float_t simPhi = gem_sh_temp.globalPhi;
Float_t simEta = gem_sh_temp.globalEta;
Float_t dR = deltaR(simEta, simPhi, recEta, recPhi);

if(gem_sh_region == gem_region && gem_sh_layer == gem_layer && dR < 0.1) result = gem_sh_temp;
stripsFired.push_back(i);

}

bool cond1, cond2, cond3;

if(gem_sh_region == gem_region && gem_sh_layer == gem_layer) cond1 = true;
else cond1 = false;
if(gem_sh_chamber == gem_chamber && gem_sh_roll == gem_roll) cond2 = true;
else cond2 = false;
if(std::find(stripsFired.begin(), stripsFired.end(), (gem_sh_strip + 1)) != stripsFired.end()) cond3 = true;
else cond3 = false;

return result;
return (cond1 & cond2 & cond3);

}

Expand Down Expand Up @@ -415,54 +379,52 @@ void GEMRecHitAnalyzer::analyzeGEM(const edm::Event& iEvent)
// consistent with digi strips. To change back, just switch the comments - WHF
// gem_sh.strip=gem_geometry_->etaPartition(itHit->detUnitId())->strip(hitLP);
const LocalPoint hitEP(itHit->entryPoint());
gem_sh.strip=gem_geometry_->etaPartition(itHit->detUnitId())->strip(hitEP);
gem_sh.strip = gem_geometry_->etaPartition(itHit->detUnitId())->strip(hitEP);

gem_sh_tree_->Fill();

}

for (GEMRecHitCollection::const_iterator recHit = gemRecHits_->begin(); recHit != gemRecHits_->end(); ++recHit)
{
for (GEMRecHitCollection::const_iterator recHit = gemRecHits_->begin(); recHit != gemRecHits_->end(); ++recHit)
{

gem_recHit_.x = recHit->localPosition().x();
gem_recHit_.xErr = recHit->localPositionError().xx();
gem_recHit_.y = recHit->localPosition().y();
gem_recHit_.detId = (Short_t) (*recHit).gemId();
gem_recHit_.bx = recHit->BunchX();
gem_recHit_.clusterSize = recHit->clusterSize();
gem_recHit_.firstClusterStrip = recHit->firstClusterStrip();
gem_recHit_.x = recHit->localPosition().x();
gem_recHit_.xErr = recHit->localPositionError().xx();
gem_recHit_.y = recHit->localPosition().y();
gem_recHit_.detId = (Short_t) (*recHit).gemId();
gem_recHit_.bx = recHit->BunchX();
gem_recHit_.clusterSize = recHit->clusterSize();
gem_recHit_.firstClusterStrip = recHit->firstClusterStrip();

GEMDetId id((*recHit).gemId());
GEMDetId id((*recHit).gemId());

gem_recHit_.region = (Short_t) id.region();
gem_recHit_.ring = (Short_t) id.ring();
gem_recHit_.station = (Short_t) id.station();
gem_recHit_.layer = (Short_t) id.layer();
gem_recHit_.chamber = (Short_t) id.chamber();
gem_recHit_.roll = (Short_t) id.roll();
gem_recHit_.region = (Short_t) id.region();
gem_recHit_.ring = (Short_t) id.ring();
gem_recHit_.station = (Short_t) id.station();
gem_recHit_.layer = (Short_t) id.layer();
gem_recHit_.chamber = (Short_t) id.chamber();
gem_recHit_.roll = (Short_t) id.roll();

LocalPoint hitLP = recHit->localPosition();
GlobalPoint hitGP = gem_geometry_->idToDet((*recHit).gemId())->surface().toGlobal(hitLP);
LocalPoint hitLP = recHit->localPosition();
GlobalPoint hitGP = gem_geometry_->idToDet((*recHit).gemId())->surface().toGlobal(hitLP);

gem_recHit_.globalR = hitGP.perp();
gem_recHit_.globalEta = hitGP.eta();
gem_recHit_.globalPhi = hitGP.phi();
gem_recHit_.globalX = hitGP.x();
gem_recHit_.globalY = hitGP.y();
gem_recHit_.globalZ = hitGP.z();

MyGEMSimHit gem_sh_temp = isGEMRecHitMatched(gem_recHit_, iEvent);

gem_recHit_.x_sim = gem_sh_temp.x;
gem_recHit_.y_sim = gem_sh_temp.y;
gem_recHit_.globalEta_sim = gem_sh_temp.globalEta;
gem_recHit_.globalPhi_sim = gem_sh_temp.globalPhi;
gem_recHit_.globalX_sim = gem_sh_temp.globalX;
gem_recHit_.globalY_sim = gem_sh_temp.globalY;
gem_recHit_.globalZ_sim = gem_sh_temp.globalZ;
gem_recHit_.pull = (gem_sh_temp.x - gem_recHit_.x) / gem_recHit_.xErr;

gem_tree_->Fill();
gem_recHit_.globalR = hitGP.perp();
gem_recHit_.globalEta = hitGP.eta();
gem_recHit_.globalPhi = hitGP.phi();
gem_recHit_.globalX = hitGP.x();
gem_recHit_.globalY = hitGP.y();
gem_recHit_.globalZ = hitGP.z();

gem_recHit_.x_sim = gem_sh.x;
gem_recHit_.y_sim = gem_sh.y;
gem_recHit_.globalEta_sim = gem_sh.globalEta;
gem_recHit_.globalPhi_sim = gem_sh.globalPhi;
gem_recHit_.globalX_sim = gem_sh.globalX;
gem_recHit_.globalY_sim = gem_sh.globalY;
gem_recHit_.globalZ_sim = gem_sh.globalZ;
gem_recHit_.pull = (gem_sh.x - gem_recHit_.x) / gem_recHit_.xErr;

if(isGEMRecHitMatched(gem_recHit_, gem_sh)) gem_tree_->Fill();

}

}

Expand Down
50 changes: 50 additions & 0 deletions GEMValidation/scripts/drawPlots.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,56 @@ def draw_1D(target_dir, c_title, ext, t, title, h_name, h_bins, to_draw, cut, op
h.Draw(opt)
h.SetMinimum(0.)
c.SaveAs(target_dir + c_title + ext)

def fill_hist(hist, array):
[hist.Fill(_) for _ in array]

def draw_1D_adv(target_dir, c_title, ext, t, title, h_name, h_bins, to_draw, cut, opt = ""):
gStyle.SetStatStyle(0)
gStyle.SetOptStat(1110)
c = TCanvas("c","c",600,600)
c.Clear()
t.Draw(to_draw + ">>" + h_name + h_bins, cut)
h = TH1F(gDirectory.Get(h_name).Clone(h_name))
h.Reset()
if not h:
sys.exit('h does not exist')
cutString = cut.GetTitle()
t1 = t.CopyTree(Form(cutString))
for entry in t1:
vector = range(entry.firstClusterStrip, entry.firstClusterStrip + entry.clusterSize)
fill_hist(h, vector)
h.SetTitle(title)
h.SetLineWidth(2)
h.SetLineColor(kBlue)
h.Draw(opt)
h.SetMinimum(0.)
c.SaveAs(target_dir + c_title + ext)

def fill_hist2(hist, array, arg):
[hist.Fill(_, arg) for _ in array]

def draw_2D_adv(target_dir, c_title, ext, t, title, h_name, h_bins, to_draw, cut, opt = ""):
gStyle.SetStatStyle(0)
gStyle.SetOptStat(1110)
c = TCanvas("c","c",600,600)
c.Clear()
t.Draw(to_draw + ">>" + h_name + h_bins, cut)
h = TH2F(gDirectory.Get(h_name).Clone(h_name))
h.Reset()
if not h:
sys.exit('h does not exist')
cutString = cut.GetTitle()
t1 = t.CopyTree(Form(cutString))
for entry in t1:
vector = range(entry.firstClusterStrip, entry.firstClusterStrip + entry.clusterSize)
fill_hist2(h, vector, t.roll)
h.SetTitle(title)
h.SetLineWidth(2)
h.SetLineColor(kBlue)
h.Draw(opt)
h.SetMinimum(0.)
c.SaveAs(target_dir + c_title + ext)

def draw_geff(target_dir, c_title, ext, t, title, h_name, h_bins, to_draw,
denom_cut, extra_num_cut, opt, color, marker_st = 1, marker_sz = 1):
Expand Down
60 changes: 59 additions & 1 deletion GEMValidation/scripts/produceRecHitValidationPlots.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

if __name__ == "__main__":

inputFile = '/cmshome/calabria/ValidationPlots2/CMSSW_6_1_2_SLHC6_patch1/src/GEMCode/GEMValidation/test/gem_localrec_ana.root'
inputFile = 'gem_localrec_ana.root'
outputFile = 'gem_localrec_ana_tmp.root'
targetDir = './'

## extension for figures - add more?
Expand Down Expand Up @@ -51,10 +52,28 @@
if not treeSimHits:
sys.exit('Tree %s does not exist.' %(treeSimHits))

fileOut = TFile.Open(outputFile, "RECREATE")

draw_geff2(targetDir, "recHitEfficiencyPerChamber", ext, treeHits, treeSimHits, "Local Reco Efficiency vs. chamber;chamber",
"h_", "(38,0,38)", "chamber", TCut(""), TCut(""), "P", kBlue);
draw_geff2(targetDir, "recHitEfficiencyGlobalPhi", ext, treeHits, treeSimHits, "Local Reco Efficiency vs. phi;#phi",
"h_", "(100,-TMath::Pi,+TMath::Pi)", "globalPhi", TCut(""), TCut(""), "P", kBlue);

draw_1D(targetDir, "clsDistribution", ext, treeHits, "CLS; CLS; entries",
"h_", "(11,-0.5,10.5)", "clusterSize", TCut(""), "");

draw_1D(targetDir, "clsDistribution_rm1_l1", ext, treeHits, "CLS region-1, layer1; CLS; entries",
"h_", "(11,-0.5,10.5)", "clusterSize", AND(rm1,l1), "");
draw_1D(targetDir, "clsDistribution_rm1_l2", ext, treeHits, "CLS region-1, layer2; CLS; entries",
"h_", "(11,-0.5,10.5)", "clusterSize", AND(rp1,l2), "");
draw_1D(targetDir, "clsDistribution_rp1_l1", ext, treeHits, "CLS region1, layer1; CLS; entries",
"h_", "(11,-0.5,10.5)", "clusterSize", AND(rm1,l1), "");
draw_1D(targetDir, "clsDistribution_rp1_l2", ext, treeHits, "CLS region1, layer2; CLS; entries",
"h_", "(11,-0.5,10.5)", "clusterSize", AND(rp1,l2), "");

draw_1D(targetDir, "bxDistribution", ext, treeHits, "BX; BX; entries",
"h_", "(11,-5.5,5.5)", "bx", TCut(""), "");

draw_1D(targetDir, "recHitPullX", ext, treeHits, "(x_{sim} - x_{rec}) / #sigma_{rec}; (x_{sim} - x_{rec}) / #sigma_{rec}; entries",
"h_", "(100,-50,+50)", "pull", TCut(""), "");

Expand All @@ -67,6 +86,18 @@
draw_1D(targetDir, "recHitPullX_rp1_l2", ext, treeHits, "(x_{sim} - x_{rec}) / #sigma_{rec} region'1, layer2; (x_{sim} - x_{rec}) / #sigma_{rec}; entries",
"h_", "(100,-50,+50)", "pull", AND(rp1,l2), "");

draw_1D(targetDir, "recHitDPhi", ext, treeHits, "#phi_{rec} - #phi_{sim}; #phi_{rec} - #phi_{sim} [rad]; entries",
"h_", "(100,-0.001,+0.001)", "(globalPhi - globalPhi_sim)", TCut(""), "");

draw_1D(targetDir, "recHitDPhi_rm1_l1", ext, treeHits, "#phi_{rec} - #phi_{sim} region-1, layer1; #phi_{rec} - #phi_{sim} [rad]; entries",
"h_", "(100,-0.001,+0.001)", "(globalPhi - globalPhi_sim)", AND(rm1,l1), "");
draw_1D(targetDir, "recHitDPhi_rm1_l2", ext, treeHits, "#phi_{rec} - #phi_{sim} region-1, layer2; #phi_{rec} - #phi_{sim} [rad]; entries",
"h_", "(100,-0.001,+0.001)", "(globalPhi - globalPhi_sim)", AND(rm1,l2), "");
draw_1D(targetDir, "recHitDPhi_rp1_l1", ext, treeHits, "#phi_{rec} - #phi_{sim} region1, layer1; #phi_{rec} - #phi_{sim} [rad]; entries",
"h_", "(100,-0.001,+0.001)", "(globalPhi - globalPhi_sim)", AND(rp1,l1), "");
draw_1D(targetDir, "recHitDPhi_rp1_l2", ext, treeHits, "#phi_{rec} - #phi_{sim} region1, layer2; #phi_{rec} - #phi_{sim} [rad]; entries",
"h_", "(100,-0.001,+0.001)", "(globalPhi - globalPhi_sim)", AND(rp1,l2), "");

draw_geff2(targetDir, "recHitEfficiencyPerChamber_rm1_l1", ext, treeHits, treeSimHits, "Local Reco Efficiency vs. chamber : region-1, layer1;chamber",
"h_", "(38,0,38)", "chamber", AND(rm1,l1),AND(rm1,l1), "P", kBlue);
draw_geff2(targetDir, "recHitEfficiencyPerChamber_rm1_l2", ext, treeHits, treeSimHits, "Local Reco Efficiency vs. chamber : region-1, layer2;chamber",
Expand Down Expand Up @@ -98,6 +129,30 @@
"h_", "(280,-3.141592654,3.141592654,192,0,384)", "firstClusterStrip:globalPhi", AND(rp1,l1), "COLZ")
draw_occ(targetDir, "strip_rh_phistrip_rp1_l2", ext, treeHits, "GEM RecHit occupancy: region1 layer2; #phi [rad]; strip",
"h_", "(280,-3.141592654,3.141592654,192,0,384)", "firstClusterStrip:globalPhi", AND(rp1,l2), "COLZ")

draw_1D_adv(targetDir, "strip_rh_tot", ext, treeHits, "GEM RecHit occupancy per strip number;strip number;entries",
"h_", "(384,0.5,384.5)", "firstClusterStrip", TCut(""))

draw_1D_adv(targetDir, "strip_rh_rm1_l1_tot", ext, treeHits, "GEM RecHit occupancy per strip number, region-1 layer1;strip number;entries",
"h_", "(384,0.5,384.5)", "firstClusterStrip", AND(rm1,l1))
draw_1D_adv(targetDir, "strip_rh_rm1_l2_tot", ext, treeHits, "GEM RecHit occupancy per strip number, region-1 layer2;strip number;entries",
"h_", "(384,0.5,384.5)", "firstClusterStrip", AND(rm1,l2))
draw_1D_adv(targetDir, "strip_rh_rp1_l1_tot", ext, treeHits, "GEM RecHit occupancy per strip number, region1 layer1;strip number;entries",
"h_", "(384,0.5,384.5)", "firstClusterStrip", AND(rp1,l1))
draw_1D_adv(targetDir, "strip_rh_rp1_l2_tot", ext, treeHits, "GEM RecHit occupancy per strip number, region1 layer2;strip number;entries",
"h_", "(384,0.5,384.5)", "firstClusterStrip", AND(rp1,l2))

draw_2D_adv(targetDir, "roll_vs_strip_rh", ext, treeHits, "GEM RecHit occupancy per roll and strip number;strip number;roll",
"h_", "(384,0.5,384.5,8,0.5,8.5)", "firstClusterStrip:roll", TCut(""), "COLZ")

draw_2D_adv(targetDir, "roll_vs_strip_rh_rm1_l1", ext, treeHits, "GEM RecHit occupancy per roll and strip number, region-1 layer1;strip number;roll",
"h_", "(384,0.5,384.5,8,0.5,8.5)", "firstClusterStrip:roll", AND(rm1,l1), "COLZ")
draw_2D_adv(targetDir, "roll_vs_strip_rh_rm1_l2", ext, treeHits, "GEM RecHit occupancy per roll and strip number, region-1 layer2;strip number;roll",
"h_", "(384,0.5,384.5,8,0.5,8.5)", "firstClusterStrip:roll", AND(rm1,l2), "COLZ")
draw_2D_adv(targetDir, "roll_vs_strip_rh_rp1_l1", ext, treeHits, "GEM RecHit occupancy per roll and strip number, region1 layer1;strip number;roll",
"h_", "(384,0.5,384.5,8,0.5,8.5)", "firstClusterStrip:roll", AND(rp1,l1), "COLZ")
draw_2D_adv(targetDir, "roll_vs_strip_rh_rp1_l2", ext, treeHits, "GEM RecHit occupancy per roll and strip number, region1 layer2;strip number;roll",
"h_", "(384,0.5,384.5,8,0.5,8.5)", "firstClusterStrip:roll", AND(rp1,l2), "COLZ")

draw_1D(targetDir, "strip_rh_rm1_l1", ext, treeHits, "GEM RecHit occupancy per strip number, region-1 layer1;strip number;entries",
"h_", "(384,0.5,384.5)", "firstClusterStrip", AND(rm1,l1))
Expand Down Expand Up @@ -170,4 +225,7 @@
"Eff. for a SimTrack to have an associated GEM RecHit in l1 and l2 with a matched SimHit;SimTrack #phi [rad];Eff.",
"h_", "(100,-3.141592654,3.141592654)", "phi", AND(ok_eta,AND(ok_gL1sh,ok_gL2sh)),
AND(ok_gL2rh,ok_gL1rh), "P", kBlue)

file.Close()
fileOut.Close()

16 changes: 14 additions & 2 deletions GEMValidation/src/GEMRecHitMatcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,22 @@ GEMRecHitMatcher::matchRecHitsToSimTrack(const GEMRecHitCollection& rechits)
// check that the rechit is within BX range
if (d->BunchX() < minBXGEM_ || d->BunchX() > maxBXGEM_) continue;
// check that it matches a strip that was hit by SimHits from our track
if (hit_strips.find(d->firstClusterStrip()) == hit_strips.end()) continue;

int firstStrip = d->firstClusterStrip();
int cls = d->clusterSize();
bool stripFound = false;

for(int i = firstStrip; i < (firstStrip + cls); i++){

if (hit_strips.find(i) != hit_strips.end()) stripFound = true;
//std::cout<<i<<" "<<firstStrip<<" "<<cls<<" "<<stripFound<<std::endl;

}

if (!stripFound) continue;
if (verbose()) cout<<"oki"<<endl;

auto myrechit = make_digi(id, d->firstClusterStrip(), d->BunchX(), GEM_STRIP);
auto myrechit = make_digi(id, d->firstClusterStrip(), d->BunchX(), GEM_STRIP, d->clusterSize());
detid_to_recHits_[id].push_back(myrechit);
chamber_to_recHits_[ p_id.chamberId().rawId() ].push_back(myrechit);
superchamber_to_recHits_[ superch_id() ].push_back(myrechit);
Expand Down
5 changes: 4 additions & 1 deletion SimMuL1/interface/MatchCSCMuL1.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,10 @@ class MatchCSCMuL1
int numberOfLayersWithHitsInChamber( int detId );
std::pair<int,int> wireGroupAndStripInChamber( int detId );

bool hasHitsInStation(int st, unsigned minNHits=4); // st=0 - any, st=1,2,3,4 - ME1-4
// does simtrack has at least 4 simhits in a particular station and ring?
// st=0 - any, st=1,2,3,4 - ME1-4
// ri=0 - any, ri=1,2,3 - MEX/1-MEX/3
bool hasHitsInStation(int st, int ri=0, unsigned minNHits=4);
unsigned nStationsWithHits(bool me1=1, bool me2=1, bool me3=1, bool me4=1, unsigned minNHits=4);

//
Expand Down
Loading

0 comments on commit 5f4cd7f

Please sign in to comment.