00001 #include "Validation/RPCRecHits/interface/RPCRecHitValid.h"
00002 #include "FWCore/Framework/interface/MakerMacros.h"
00003
00004 #include "FWCore/Framework/interface/ESHandle.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
00008 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
00009 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
00010 #include "DataFormats/TrackReco/interface/Track.h"
00011 #include "DataFormats/MuonReco/interface/Muon.h"
00012 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00013 #include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h"
00014 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00015 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
00016 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00017 #include "Geometry/RPCGeometry/interface/RPCRoll.h"
00018 #include "Geometry/RPCGeometry/interface/RPCRollSpecs.h"
00019 #include "Geometry/RPCGeometry/interface/RPCGeometry.h"
00020 #include "Geometry/RPCGeometry/interface/RPCGeomServ.h"
00021 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00022
00023 using namespace std;
00024
00025 typedef MonitorElement* MEP;
00026
00027 RPCRecHitValid::RPCRecHitValid(const edm::ParameterSet& pset)
00028 {
00029 simHitLabel_ = pset.getParameter<edm::InputTag>("simHit");
00030 recHitLabel_ = pset.getParameter<edm::InputTag>("recHit");
00031 simTrackLabel_ = pset.getParameter<edm::InputTag>("simTrack");
00032 muonLabel_ = pset.getParameter<edm::InputTag>("muon");
00033
00034 dbe_ = edm::Service<DQMStore>().operator->();
00035 if ( !dbe_ )
00036 {
00037 edm::LogError("RPCRecHitValid") << "No DQMStore instance\n";
00038 return;
00039 }
00040
00041
00042 subDir_ = pset.getParameter<std::string>("subDir");
00043 h_.bookHistograms(dbe_, subDir_);
00044
00045
00046 dbe_->setCurrentFolder(subDir_+"/HitProperty");
00047 h_simTrackPType = dbe_->book1D("SimHitPType", "SimHit particle type", 11, 0, 11);
00048 if ( TH1* h = h_simTrackPType->getTH1() )
00049 {
00050 h->GetXaxis()->SetBinLabel(1 , "#mu^{-}");
00051 h->GetXaxis()->SetBinLabel(2 , "#mu^{+}");
00052 h->GetXaxis()->SetBinLabel(3 , "e^{-}" );
00053 h->GetXaxis()->SetBinLabel(4 , "e^{+}" );
00054 h->GetXaxis()->SetBinLabel(5 , "#pi^{+}");
00055 h->GetXaxis()->SetBinLabel(6 , "#pi^{-}");
00056 h->GetXaxis()->SetBinLabel(7 , "K^{+}" );
00057 h->GetXaxis()->SetBinLabel(8 , "K^{-}" );
00058 h->GetXaxis()->SetBinLabel(9 , "p^{+}" );
00059 h->GetXaxis()->SetBinLabel(10, "p^{-}" );
00060 h->GetXaxis()->SetBinLabel(11, "Other" );
00061 }
00062
00063 dbe_->setCurrentFolder(subDir_+"/Track");
00064
00065 h_nRPCHitPerSimMuon = dbe_->book1D("NRPCHitPerSimMuon" , "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
00066 h_nRPCHitPerSimMuonBarrel = dbe_->book1D("NRPCHitPerSimMuonBarrel" , "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
00067 h_nRPCHitPerSimMuonOverlap = dbe_->book1D("NRPCHitPerSimMuonOverlap", "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
00068 h_nRPCHitPerSimMuonEndcap = dbe_->book1D("NRPCHitPerSimMuonEndcap" , "Number of RPC SimHit per SimMuon", 11, -0.5, 10.5);
00069
00070 h_nRPCHitPerRecoMuon = dbe_->book1D("NRPCHitPerRecoMuon" , "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
00071 h_nRPCHitPerRecoMuonBarrel = dbe_->book1D("NRPCHitPerRecoMuonBarrel" , "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
00072 h_nRPCHitPerRecoMuonOverlap = dbe_->book1D("NRPCHitPerRecoMuonOverlap", "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
00073 h_nRPCHitPerRecoMuonEndcap = dbe_->book1D("NRPCHitPerRecoMuonEndcap" , "Number of RPC RecHit per RecoMuon", 11, -0.5, 10.5);
00074
00075 float ptBins[] = {0, 1, 2, 5, 10, 20, 30, 50, 100, 200, 300, 500};
00076 const int nPtBins = sizeof(ptBins)/sizeof(float)-1;
00077 h_simMuonBarrel_pt = dbe_->book1D("SimMuonBarrel_pt" , "SimMuon RPCHit in Barrel p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00078 h_simMuonOverlap_pt = dbe_->book1D("SimMuonOverlap_pt" , "SimMuon RPCHit in Overlap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00079 h_simMuonEndcap_pt = dbe_->book1D("SimMuonEndcap_pt" , "SimMuon RPCHit in Endcap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00080 h_simMuonNoRPC_pt = dbe_->book1D("SimMuonNoRPC_pt" , "SimMuon without RPCHit p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00081 h_simMuonBarrel_eta = dbe_->book1D("SimMuonBarrel_eta" , "SimMuon RPCHit in Barrel #eta;#eta", 50, -2.5, 2.5);
00082 h_simMuonOverlap_eta = dbe_->book1D("SimMuonOverlap_eta", "SimMuon RPCHit in Overlap #eta;#eta", 50, -2.5, 2.5);
00083 h_simMuonEndcap_eta = dbe_->book1D("SimMuonEndcap_eta" , "SimMuon RPCHit in Endcap #eta;#eta", 50, -2.5, 2.5);
00084 h_simMuonNoRPC_eta = dbe_->book1D("SimMuonNoRPC_eta", "SimMuon without RPCHit #eta;#eta", 50, -2.5, 2.5);
00085 h_simMuonBarrel_phi = dbe_->book1D("SimMuonBarrel_phi" , "SimMuon RPCHit in Barrel #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00086 h_simMuonOverlap_phi = dbe_->book1D("SimMuonOverlap_phi", "SimMuon RPCHit in Overlap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00087 h_simMuonEndcap_phi = dbe_->book1D("SimMuonEndcap_phi" , "SimMuon RPCHit in Endcap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00088 h_simMuonNoRPC_phi = dbe_->book1D("SimMuonNoRPC_phi", "SimMuon without RPCHit #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00089
00090 h_recoMuonBarrel_pt = dbe_->book1D("RecoMuonBarrel_pt" , "RecoMuon RPCHit in Barrel p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00091 h_recoMuonOverlap_pt = dbe_->book1D("RecoMuonOverlap_pt" , "RecoMuon RPCHit in Overlap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00092 h_recoMuonEndcap_pt = dbe_->book1D("RecoMuonEndcap_pt" , "RecoMuon RPCHit in Endcap p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00093 h_recoMuonNoRPC_pt = dbe_->book1D("RecoMuonNoRPC_pt" , "RecoMuon without RPCHit p_{T};p_{T} [GeV/c^{2}]", nPtBins, ptBins);
00094 h_recoMuonBarrel_eta = dbe_->book1D("RecoMuonBarrel_eta" , "RecoMuon RPCHit in Barrel #eta;#eta", 50, -2.5, 2.5);
00095 h_recoMuonOverlap_eta = dbe_->book1D("RecoMuonOverlap_eta", "RecoMuon RPCHit in Overlap #eta;#eta", 50, -2.5, 2.5);
00096 h_recoMuonEndcap_eta = dbe_->book1D("RecoMuonEndcap_eta" , "RecoMuon RPCHit in Endcap #eta;#eta", 50, -2.5, 2.5);
00097 h_recoMuonNoRPC_eta = dbe_->book1D("RecoMuonNoRPC_eta", "RecoMuon without RPCHit #eta;#eta", 50, -2.5, 2.5);
00098 h_recoMuonBarrel_phi = dbe_->book1D("RecoMuonBarrel_phi" , "RecoMuon RPCHit in Barrel #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00099 h_recoMuonOverlap_phi = dbe_->book1D("RecoMuonOverlap_phi", "RecoMuon RPCHit in Overlap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00100 h_recoMuonEndcap_phi = dbe_->book1D("RecoMuonEndcap_phi" , "RecoMuon RPCHit in Endcap #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00101 h_recoMuonNoRPC_phi = dbe_->book1D("RecoMuonNoRPC_phi", "RecoMuon without RPCHit #phi;#phi", 36, -TMath::Pi(), TMath::Pi());
00102
00103 dbe_->setCurrentFolder(subDir_+"/Occupancy");
00104
00105 h_eventCount = dbe_->book1D("EventCount", "Event count", 3, 1, 4);
00106 if ( h_eventCount )
00107 {
00108 TH1* h = h_eventCount->getTH1();
00109 h->GetXaxis()->SetBinLabel(1, "eventBegin");
00110 h->GetXaxis()->SetBinLabel(2, "eventEnd");
00111 h->GetXaxis()->SetBinLabel(3, "run");
00112 }
00113
00114 h_refPunchOccupancyBarrel_wheel = dbe_->book1D("RefPunchOccupancyBarrel_wheel" , "RefPunchthrough occupancy", 5, -2.5, 2.5);
00115 h_refPunchOccupancyEndcap_disk = dbe_->book1D("RefPunchOccupancyEndcap_disk" , "RefPunchthrough occupancy", 7, -3.5, 3.5);
00116 h_refPunchOccupancyBarrel_station = dbe_->book1D("RefPunchOccupancyBarrel_station", "RefPunchthrough occupancy", 4, 0.5, 4.5);
00117 h_recPunchOccupancyBarrel_wheel = dbe_->book1D("RecPunchOccupancyBarrel_wheel" , "Punchthrough recHit occupancy", 5, -2.5, 2.5);
00118 h_recPunchOccupancyEndcap_disk = dbe_->book1D("RecPunchOccupancyEndcap_disk" , "Punchthrough recHit occupancy", 7, -3.5, 3.5);
00119 h_recPunchOccupancyBarrel_station = dbe_->book1D("RecPunchOccupancyBarrel_station", "Punchthrough recHit occupancy", 4, 0.5, 4.5);
00120
00121 h_refPunchOccupancyBarrel_wheel_station = dbe_->book2D("RefPunchOccupancyBarrel_wheel_station", "RefPunchthrough occupancy", 5, -2.5, 2.5, 4, 0.5, 4.5);
00122 h_refPunchOccupancyEndcap_disk_ring = dbe_->book2D("RefPunchOccupancyEndcap_disk_ring" , "RefPunchthrough occupancy", 7, -3.5, 3.5, 4, 0.5, 4.5);
00123 h_recPunchOccupancyBarrel_wheel_station = dbe_->book2D("RecPunchOccupancyBarrel_wheel_station", "Punchthrough recHit occupancy", 5, -2.5, 2.5, 4, 0.5, 4.5);
00124 h_recPunchOccupancyEndcap_disk_ring = dbe_->book2D("RecPunchOccupancyEndcap_disk_ring" , "Punchthrough recHit occupancy", 7, -3.5, 3.5, 4, 0.5, 4.5);
00125
00126 h_refPunchOccupancyBarrel_wheel_station->getTH2F()->SetOption("COLZ");
00127 h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->SetOption("COLZ");
00128 h_recPunchOccupancyBarrel_wheel_station->getTH2F()->SetOption("COLZ");
00129 h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->SetOption("COLZ");
00130
00131 for ( int i=1; i<=5; ++i )
00132 {
00133 TString binLabel = Form("Wheel %d", i-3);
00134 h_refPunchOccupancyBarrel_wheel->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
00135 h_refPunchOccupancyBarrel_wheel_station->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
00136 h_recPunchOccupancyBarrel_wheel->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
00137 h_recPunchOccupancyBarrel_wheel_station->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
00138 }
00139
00140 for ( int i=1; i<=7; ++i )
00141 {
00142 TString binLabel = Form("Disk %d", i-4);
00143 h_refPunchOccupancyEndcap_disk ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
00144 h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
00145 h_recPunchOccupancyEndcap_disk ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
00146 h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->GetXaxis()->SetBinLabel(i, binLabel);
00147 }
00148
00149 for ( int i=1; i<=4; ++i )
00150 {
00151 TString binLabel = Form("Station %d", i);
00152 h_refPunchOccupancyBarrel_station ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
00153 h_refPunchOccupancyBarrel_wheel_station ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
00154 h_recPunchOccupancyBarrel_station ->getTH1()->GetXaxis()->SetBinLabel(i, binLabel);
00155 h_recPunchOccupancyBarrel_wheel_station ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
00156 }
00157
00158 for ( int i=1; i<=4; ++i )
00159 {
00160 TString binLabel = Form("Ring %d", i);
00161 h_refPunchOccupancyEndcap_disk_ring ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
00162 h_recPunchOccupancyEndcap_disk_ring ->getTH2F()->GetYaxis()->SetBinLabel(i, binLabel);
00163 }
00164 }
00165
00166 RPCRecHitValid::~RPCRecHitValid()
00167 {
00168 }
00169
00170 void RPCRecHitValid::beginJob()
00171 {
00172 }
00173
00174 void RPCRecHitValid::endJob()
00175 {
00176 }
00177
00178 void RPCRecHitValid::beginRun(const edm::Run& run, const edm::EventSetup& eventSetup)
00179 {
00180 if ( !dbe_ ) return;
00181 h_eventCount->Fill(3);
00182
00183
00184 edm::ESHandle<RPCGeometry> rpcGeom;
00185 eventSetup.get<MuonGeometryRecord>().get(rpcGeom);
00186
00187 int nRPCRollBarrel = 0, nRPCRollEndcap = 0;
00188
00189 TrackingGeometry::DetContainer rpcDets = rpcGeom->dets();
00190 for ( TrackingGeometry::DetContainer::const_iterator detIter = rpcDets.begin();
00191 detIter != rpcDets.end(); ++detIter )
00192 {
00193 RPCChamber* rpcCh = dynamic_cast<RPCChamber*>(*detIter);
00194 if ( !rpcCh ) continue;
00195
00196 std::vector<const RPCRoll*> rolls = rpcCh->rolls();
00197 for ( std::vector<const RPCRoll*>::const_iterator rollIter = rolls.begin();
00198 rollIter != rolls.end(); ++rollIter )
00199 {
00200 const RPCRoll* roll = *rollIter;
00201 if ( !roll ) continue;
00202
00203
00204 const int rawId = roll->geographicalId().rawId();
00205
00206
00207 if ( roll->isBarrel() )
00208 {
00209 detIdToIndexMapBarrel_[rawId] = nRPCRollBarrel;
00210
00211 ++nRPCRollBarrel;
00212 }
00213 else
00214 {
00215 detIdToIndexMapEndcap_[rawId] = nRPCRollEndcap;
00216
00217 ++nRPCRollEndcap;
00218 }
00219 }
00220 }
00221
00222 dbe_->setCurrentFolder(subDir_+"/Occupancy");
00223 h_matchOccupancyBarrel_detId = dbe_->book1D("MatchOccupancyBarrel_detId", "Matched hit occupancy;roll index (can be arbitrary)", nRPCRollBarrel, 0, nRPCRollBarrel);
00224 h_matchOccupancyEndcap_detId = dbe_->book1D("MatchOccupancyEndcap_detId", "Matched hit occupancy;roll index (can be arbitrary)", nRPCRollEndcap, 0, nRPCRollEndcap);
00225 h_refOccupancyBarrel_detId = dbe_->book1D("RefOccupancyBarrel_detId", "Reference hit occupancy;roll index (can be arbitrary)", nRPCRollBarrel, 0, nRPCRollBarrel);
00226 h_refOccupancyEndcap_detId = dbe_->book1D("RefOccupancyEndcap_detId", "Reference hit occupancy;roll index (can be arbitrary)", nRPCRollEndcap, 0, nRPCRollEndcap);
00227 h_noiseOccupancyBarrel_detId = dbe_->book1D("NoiseOccupancyBarrel_detId", "Noise occupancy;roll index (can be arbitrary)", nRPCRollBarrel, 0, nRPCRollBarrel);
00228 h_noiseOccupancyEndcap_detId = dbe_->book1D("NoiseOccupancyEndcap_detId", "Noise occupancy;roll index (can be arbitrary)", nRPCRollEndcap, 0, nRPCRollEndcap);
00229
00230 }
00231
00232 void RPCRecHitValid::endRun(const edm::Run& run, const edm::EventSetup& eventSetup)
00233 {
00234 if ( !dbe_ ) return;
00235
00236 const int nRPCRollBarrel = detIdToIndexMapBarrel_.size();
00237 const int nRPCRollEndcap = detIdToIndexMapEndcap_.size();
00238
00239 h_rollAreaBarrel_detId = dbe_->bookProfile("RollAreaBarrel_detId", "Roll area;roll index;Area", nRPCRollBarrel, 0., 1.*nRPCRollBarrel, 0., 1e5);
00240 h_rollAreaEndcap_detId = dbe_->bookProfile("RollAreaEndcap_detId", "Roll area;roll index;Area", nRPCRollEndcap, 0., 1.*nRPCRollEndcap, 0., 1e5);
00241
00242 edm::ESHandle<RPCGeometry> rpcGeom;
00243 eventSetup.get<MuonGeometryRecord>().get(rpcGeom);
00244
00245 for ( map<int, int>::const_iterator iter = detIdToIndexMapBarrel_.begin();
00246 iter != detIdToIndexMapBarrel_.end(); ++iter )
00247 {
00248 const int rawId = iter->first;
00249 const int index = iter->second;
00250
00251 const RPCDetId rpcDetId = static_cast<const RPCDetId>(rawId);
00252 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId));
00253
00254
00255
00256
00257 const StripTopology& topol = roll->specificTopology();
00258 const double area = topol.stripLength()*topol.nstrips()*topol.pitch();
00259
00260 h_rollAreaBarrel_detId->Fill(index, area);
00261 }
00262
00263 for ( map<int, int>::const_iterator iter = detIdToIndexMapEndcap_.begin();
00264 iter != detIdToIndexMapEndcap_.end(); ++iter )
00265 {
00266 const int rawId = iter->first;
00267 const int index = iter->second;
00268
00269 const RPCDetId rpcDetId = static_cast<const RPCDetId>(rawId);
00270 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId));
00271
00272
00273
00274
00275 const StripTopology& topol = roll->specificTopology();
00276 const double area = topol.stripLength()*topol.nstrips()*topol.pitch();
00277
00278 h_rollAreaEndcap_detId->Fill(index, area);
00279 }
00280 }
00281
00282 void RPCRecHitValid::analyze(const edm::Event& event, const edm::EventSetup& eventSetup)
00283 {
00284 if ( !dbe_ ) return;
00285 h_eventCount->Fill(1);
00286
00287
00288 edm::ESHandle<RPCGeometry> rpcGeom;
00289 eventSetup.get<MuonGeometryRecord>().get(rpcGeom);
00290
00291
00292 edm::Handle<edm::PSimHitContainer> simHitHandle;
00293 if ( !event.getByLabel(simHitLabel_, simHitHandle) )
00294 {
00295 edm::LogInfo("RPCRecHitValid") << "Cannot find simHit collection\n";
00296 return;
00297 }
00298
00299
00300 edm::Handle<RPCRecHitCollection> recHitHandle;
00301 if ( !event.getByLabel(recHitLabel_, recHitHandle) )
00302 {
00303 edm::LogInfo("RPCRecHitValid") << "Cannot find recHit collection\n";
00304 return;
00305 }
00306
00307
00308 edm::Handle<edm::View<TrackingParticle> > simTrackHandle;
00309 if ( !event.getByLabel(simTrackLabel_, simTrackHandle) )
00310 {
00311 edm::LogInfo("RPCRecHitValid") << "Cannot find simTrack collection\n";
00312 return;
00313 }
00314
00315
00316 edm::Handle<edm::View<reco::Muon> > muonHandle;
00317 if ( !event.getByLabel(muonLabel_, muonHandle) )
00318 {
00319 edm::LogInfo("RPCRecHitValid") << "Cannot find muon collection\n";
00320 return;
00321 }
00322
00323 typedef edm::PSimHitContainer::const_iterator SimHitIter;
00324 typedef RPCRecHitCollection::const_iterator RecHitIter;
00325
00326 std::vector<const PSimHit*> muonSimHits;
00327 std::vector<const PSimHit*> pthrSimHits;
00328 for ( edm::View<TrackingParticle>::const_iterator simTrack = simTrackHandle->begin();
00329 simTrack != simTrackHandle->end(); ++simTrack )
00330 {
00331 if ( simTrack->pt() < 1.0 or simTrack->p() < 2.5 ) continue;
00332
00333 bool hasRPCHit = false;
00334 if ( abs(simTrack->pdgId()) == 13 )
00335 {
00336 int nRPCHitBarrel = 0;
00337 int nRPCHitEndcap = 0;
00338
00339 for ( SimHitIter simHit = simTrack->pSimHit_begin();
00340 simHit != simTrack->pSimHit_end(); ++simHit )
00341 {
00342 const DetId detId(simHit->detUnitId());
00343 if ( detId.det() != DetId::Muon or detId.subdetId() != MuonSubdetId::RPC ) continue;
00344 const RPCDetId rpcDetId = static_cast<const RPCDetId>(simHit->detUnitId());
00345 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId));
00346 if ( !roll ) continue;
00347
00348 if ( rpcDetId.region() == 0 ) ++nRPCHitBarrel;
00349 else ++nRPCHitEndcap;
00350
00351 muonSimHits.push_back(&*simHit);
00352 }
00353
00354 const int nRPCHit = nRPCHitBarrel+nRPCHitEndcap;
00355 hasRPCHit = nRPCHit > 0;
00356 h_nRPCHitPerSimMuon->Fill(nRPCHit);
00357 if ( nRPCHitBarrel and nRPCHitEndcap )
00358 {
00359 h_nRPCHitPerSimMuonOverlap->Fill(nRPCHit);
00360 h_simMuonOverlap_pt->Fill(simTrack->pt());
00361 h_simMuonOverlap_eta->Fill(simTrack->eta());
00362 h_simMuonOverlap_phi->Fill(simTrack->phi());
00363 }
00364 else if ( nRPCHitBarrel )
00365 {
00366 h_nRPCHitPerSimMuonBarrel->Fill(nRPCHit);
00367 h_simMuonBarrel_pt->Fill(simTrack->pt());
00368 h_simMuonBarrel_eta->Fill(simTrack->eta());
00369 h_simMuonBarrel_phi->Fill(simTrack->phi());
00370 }
00371 else if ( nRPCHitEndcap )
00372 {
00373 h_nRPCHitPerSimMuonEndcap->Fill(nRPCHit);
00374 h_simMuonEndcap_pt->Fill(simTrack->pt());
00375 h_simMuonEndcap_eta->Fill(simTrack->eta());
00376 h_simMuonEndcap_phi->Fill(simTrack->phi());
00377 }
00378 else
00379 {
00380 h_simMuonNoRPC_pt->Fill(simTrack->pt());
00381 h_simMuonNoRPC_eta->Fill(simTrack->eta());
00382 h_simMuonNoRPC_phi->Fill(simTrack->phi());
00383 }
00384 }
00385 else
00386 {
00387 int nRPCHit = 0;
00388 for ( SimHitIter simHit = simTrack->pSimHit_begin();
00389 simHit != simTrack->pSimHit_end(); ++simHit )
00390 {
00391 const DetId detId(simHit->detUnitId());
00392 if ( detId.det() != DetId::Muon or detId.subdetId() != MuonSubdetId::RPC ) continue;
00393 const RPCDetId rpcDetId = static_cast<const RPCDetId>(simHit->detUnitId());
00394 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(rpcDetId()));
00395 if ( !roll ) continue;
00396
00397 ++nRPCHit;
00398 pthrSimHits.push_back(&*simHit);
00399 }
00400 hasRPCHit = nRPCHit > 0;
00401 }
00402
00403 if ( hasRPCHit )
00404 {
00405 switch ( simTrack->pdgId() )
00406 {
00407 case 13: h_simTrackPType->Fill( 0); break;
00408 case -13: h_simTrackPType->Fill( 1); break;
00409 case 11: h_simTrackPType->Fill( 2); break;
00410 case -11: h_simTrackPType->Fill( 3); break;
00411 case 211: h_simTrackPType->Fill( 4); break;
00412 case -211: h_simTrackPType->Fill( 5); break;
00413 case 321: h_simTrackPType->Fill( 6); break;
00414 case -321: h_simTrackPType->Fill( 7); break;
00415 case 2212: h_simTrackPType->Fill( 8); break;
00416 case -2212: h_simTrackPType->Fill( 9); break;
00417 default: h_simTrackPType->Fill(10); break;
00418 }
00419 }
00420 }
00421
00422
00423 int nRefHitBarrel = 0, nRefHitEndcap = 0;
00424 for ( std::vector<const PSimHit*>::const_iterator simHitP = muonSimHits.begin();
00425 simHitP != muonSimHits.end(); ++simHitP )
00426 {
00427 const PSimHit* simHit = *simHitP;
00428 const RPCDetId detId = static_cast<const RPCDetId>(simHit->detUnitId());
00429 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId));
00430
00431 const int region = roll->id().region();
00432 const int ring = roll->id().ring();
00433
00434 const int station = roll->id().station();
00435
00436
00437
00438 if ( region == 0 )
00439 {
00440 ++nRefHitBarrel;
00441 h_.refHitOccupancyBarrel_wheel->Fill(ring);
00442 h_.refHitOccupancyBarrel_station->Fill(station);
00443 h_.refHitOccupancyBarrel_wheel_station->Fill(ring, station);
00444
00445 h_refOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[simHit->detUnitId()]);
00446 }
00447 else
00448 {
00449 ++nRefHitEndcap;
00450 h_.refHitOccupancyEndcap_disk->Fill(region*station);
00451 h_.refHitOccupancyEndcap_disk_ring->Fill(region*station, ring);
00452
00453 h_refOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[simHit->detUnitId()]);
00454 }
00455 }
00456
00457
00458 for ( std::vector<const PSimHit*>::const_iterator simHitP = pthrSimHits.begin();
00459 simHitP != pthrSimHits.end(); ++simHitP )
00460 {
00461 const PSimHit* simHit = *simHitP;
00462 const RPCDetId detId = static_cast<const RPCDetId>(simHit->detUnitId());
00463 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId()));
00464
00465 const int region = roll->id().region();
00466 const int ring = roll->id().ring();
00467
00468 const int station = roll->id().station();
00469
00470
00471
00472 if ( region == 0 )
00473 {
00474 ++nRefHitBarrel;
00475 h_refPunchOccupancyBarrel_wheel->Fill(ring);
00476 h_refPunchOccupancyBarrel_station->Fill(station);
00477 h_refPunchOccupancyBarrel_wheel_station->Fill(ring, station);
00478
00479 h_refOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[simHit->detUnitId()]);
00480 }
00481 else
00482 {
00483 ++nRefHitEndcap;
00484 h_refPunchOccupancyEndcap_disk->Fill(region*station);
00485 h_refPunchOccupancyEndcap_disk_ring->Fill(region*station, ring);
00486
00487 h_refOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[simHit->detUnitId()]);
00488 }
00489 }
00490 h_.nRefHitBarrel->Fill(nRefHitBarrel);
00491 h_.nRefHitEndcap->Fill(nRefHitEndcap);
00492
00493
00494 int sumClusterSizeBarrel = 0, sumClusterSizeEndcap = 0;
00495 int nRecHitBarrel = 0, nRecHitEndcap = 0;
00496 for ( RecHitIter recHitIter = recHitHandle->begin();
00497 recHitIter != recHitHandle->end(); ++recHitIter )
00498 {
00499 const RPCDetId detId = static_cast<const RPCDetId>(recHitIter->rpcId());
00500 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId()));
00501 if ( !roll ) continue;
00502
00503 const int region = roll->id().region();
00504 const int ring = roll->id().ring();
00505
00506 const int station = roll->id().station();
00507
00508
00509
00510 h_.clusterSize->Fill(recHitIter->clusterSize());
00511
00512 if ( region == 0 )
00513 {
00514 ++nRecHitBarrel;
00515 sumClusterSizeBarrel += recHitIter->clusterSize();
00516 h_.clusterSizeBarrel->Fill(recHitIter->clusterSize());
00517 h_.recHitOccupancyBarrel_wheel->Fill(ring);
00518 h_.recHitOccupancyBarrel_station->Fill(station);
00519 h_.recHitOccupancyBarrel_wheel_station->Fill(ring, station);
00520 }
00521 else
00522 {
00523 ++nRecHitEndcap;
00524 sumClusterSizeEndcap += recHitIter->clusterSize();
00525 h_.clusterSizeEndcap->Fill(recHitIter->clusterSize());
00526 h_.recHitOccupancyEndcap_disk->Fill(region*station);
00527 h_.recHitOccupancyEndcap_disk_ring->Fill(region*station, ring);
00528 }
00529
00530 }
00531 const double nRecHit = nRecHitBarrel+nRecHitEndcap;
00532 h_.nRecHitBarrel->Fill(nRecHitBarrel);
00533 h_.nRecHitEndcap->Fill(nRecHitEndcap);
00534 if ( nRecHit > 0 )
00535 {
00536 const int sumClusterSize = sumClusterSizeBarrel+sumClusterSizeEndcap;
00537 h_.avgClusterSize->Fill(double(sumClusterSize)/nRecHit);
00538
00539 if ( nRecHitBarrel > 0 )
00540 {
00541 h_.avgClusterSizeBarrel->Fill(double(sumClusterSizeBarrel)/nRecHitBarrel);
00542 }
00543 if ( nRecHitEndcap > 0 )
00544 {
00545 h_.avgClusterSizeEndcap->Fill(double(sumClusterSizeEndcap)/nRecHitEndcap);
00546 }
00547 }
00548
00549
00550 typedef std::map<const PSimHit*, RecHitIter> SimToRecHitMap;
00551 SimToRecHitMap simToRecHitMap;
00552
00553 for ( std::vector<const PSimHit*>::const_iterator simHitP = muonSimHits.begin();
00554 simHitP != muonSimHits.end(); ++simHitP )
00555 {
00556 const PSimHit* simHit = *simHitP;
00557 const RPCDetId simDetId = static_cast<const RPCDetId>(simHit->detUnitId());
00558
00559
00560 const double simX = simHit->localPosition().x();
00561
00562 for ( RecHitIter recHitIter = recHitHandle->begin();
00563 recHitIter != recHitHandle->end(); ++recHitIter )
00564 {
00565 const RPCDetId recDetId = static_cast<const RPCDetId>(recHitIter->rpcId());
00566 const RPCRoll* recRoll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(recDetId));
00567 if ( !recRoll ) continue;
00568
00569 if ( simDetId != recDetId ) continue;
00570
00571 const double recX = recHitIter->localPosition().x();
00572 const double newDx = fabs(recX - simX);
00573
00574
00575 SimToRecHitMap::const_iterator prevSimToReco = simToRecHitMap.find(simHit);
00576 if ( prevSimToReco == simToRecHitMap.end() )
00577 {
00578 simToRecHitMap.insert(std::make_pair(simHit, recHitIter));
00579 }
00580 else
00581 {
00582 const double oldDx = fabs(prevSimToReco->second->localPosition().x() - simX);
00583
00584 if ( newDx < oldDx )
00585 {
00586 simToRecHitMap[simHit] = recHitIter;
00587 }
00588 }
00589 }
00590 }
00591
00592
00593
00594 int nMatchHitBarrel = 0, nMatchHitEndcap = 0;
00595 for ( SimToRecHitMap::const_iterator match = simToRecHitMap.begin();
00596 match != simToRecHitMap.end(); ++match )
00597 {
00598 const PSimHit* simHit = match->first;
00599 RecHitIter recHitIter = match->second;
00600
00601 const RPCDetId detId = static_cast<const RPCDetId>(simHit->detUnitId());
00602 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId));
00603
00604 const int region = roll->id().region();
00605 const int ring = roll->id().ring();
00606
00607 const int station = roll->id().station();
00608
00609
00610
00611 const double simX = simHit->localPosition().x();
00612 const double recX = recHitIter->localPosition().x();
00613 const double errX = sqrt(recHitIter->localPositionError().xx());
00614 const double dX = recX - simX;
00615 const double pull = errX == 0 ? -999 : dX/errX;
00616
00617
00618
00619
00620 if ( region == 0 )
00621 {
00622 ++nMatchHitBarrel;
00623 h_.resBarrel->Fill(dX);
00624 h_.pullBarrel->Fill(pull);
00625 h_.matchOccupancyBarrel_wheel->Fill(ring);
00626 h_.matchOccupancyBarrel_station->Fill(station);
00627 h_.matchOccupancyBarrel_wheel_station->Fill(ring, station);
00628
00629 h_.res_wheel_res->Fill(ring, dX);
00630 h_.res_station_res->Fill(station, dX);
00631 h_.pull_wheel_pull->Fill(ring, pull);
00632 h_.pull_station_pull->Fill(station, pull);
00633
00634 h_matchOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[detId.rawId()]);
00635 }
00636 else
00637 {
00638 ++nMatchHitEndcap;
00639 h_.resEndcap->Fill(dX);
00640 h_.pullEndcap->Fill(pull);
00641 h_.matchOccupancyEndcap_disk->Fill(region*station);
00642 h_.matchOccupancyEndcap_disk_ring->Fill(region*station, ring);
00643
00644 h_.res_disk_res->Fill(region*station, dX);
00645 h_.res_ring_res->Fill(ring, dX);
00646 h_.pull_disk_pull->Fill(region*station, pull);
00647 h_.pull_ring_pull->Fill(ring, pull);
00648
00649 h_matchOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[detId.rawId()]);
00650 }
00651
00652 }
00653 h_.nMatchHitBarrel->Fill(nMatchHitBarrel);
00654 h_.nMatchHitEndcap->Fill(nMatchHitEndcap);
00655
00656
00657 for ( edm::View<reco::Muon>::const_iterator muon = muonHandle->begin();
00658 muon != muonHandle->end(); ++muon )
00659 {
00660 if ( !muon->isGlobalMuon() ) continue;
00661
00662 int nRPCHitBarrel = 0;
00663 int nRPCHitEndcap = 0;
00664
00665 const reco::TrackRef glbTrack = muon->globalTrack();
00666 for ( trackingRecHit_iterator recHit = glbTrack->recHitsBegin();
00667 recHit != glbTrack->recHitsEnd(); ++recHit )
00668 {
00669 if ( !(*recHit)->isValid() ) continue;
00670 const DetId detId = (*recHit)->geographicalId();
00671 if ( detId.det() != DetId::Muon or detId.subdetId() != MuonSubdetId::RPC ) continue;
00672 const RPCDetId rpcDetId = static_cast<const RPCDetId>(detId);
00673
00674 if ( rpcDetId.region() == 0 ) ++nRPCHitBarrel;
00675 else ++nRPCHitEndcap;
00676 }
00677
00678 const int nRPCHit = nRPCHitBarrel + nRPCHitEndcap;
00679 h_nRPCHitPerRecoMuon->Fill(nRPCHit);
00680 if ( nRPCHitBarrel and nRPCHitEndcap )
00681 {
00682 h_nRPCHitPerRecoMuonOverlap->Fill(nRPCHit);
00683 h_recoMuonOverlap_pt->Fill(muon->pt());
00684 h_recoMuonOverlap_eta->Fill(muon->eta());
00685 h_recoMuonOverlap_phi->Fill(muon->phi());
00686 }
00687 else if ( nRPCHitBarrel )
00688 {
00689 h_nRPCHitPerRecoMuonBarrel->Fill(nRPCHit);
00690 h_recoMuonBarrel_pt->Fill(muon->pt());
00691 h_recoMuonBarrel_eta->Fill(muon->eta());
00692 h_recoMuonBarrel_phi->Fill(muon->phi());
00693 }
00694 else if ( nRPCHitEndcap )
00695 {
00696 h_nRPCHitPerRecoMuonEndcap->Fill(nRPCHit);
00697 h_recoMuonEndcap_pt->Fill(muon->pt());
00698 h_recoMuonEndcap_eta->Fill(muon->eta());
00699 h_recoMuonEndcap_phi->Fill(muon->phi());
00700 }
00701 else
00702 {
00703 h_recoMuonNoRPC_pt->Fill(muon->pt());
00704 h_recoMuonNoRPC_eta->Fill(muon->eta());
00705 h_recoMuonNoRPC_phi->Fill(muon->phi());
00706 }
00707 }
00708
00709
00710 for ( RecHitIter recHitIter = recHitHandle->begin();
00711 recHitIter != recHitHandle->end(); ++recHitIter )
00712 {
00713 const RPCDetId detId = static_cast<const RPCDetId>(recHitIter->rpcId());
00714 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(detId));
00715
00716 const int region = roll->id().region();
00717 const int ring = roll->id().ring();
00718
00719 const int station = roll->id().station();
00720
00721
00722
00723 bool matched = false;
00724 for ( SimToRecHitMap::const_iterator match = simToRecHitMap.begin();
00725 match != simToRecHitMap.end(); ++match )
00726 {
00727 if ( recHitIter == match->second )
00728 {
00729 matched = true;
00730 break;
00731 }
00732 }
00733
00734 if ( !matched )
00735 {
00736
00737 if ( region == 0 )
00738 {
00739 h_.umOccupancyBarrel_wheel->Fill(ring);
00740 h_.umOccupancyBarrel_station->Fill(station);
00741 h_.umOccupancyBarrel_wheel_station->Fill(ring, station);
00742 }
00743 else
00744 {
00745 h_.umOccupancyEndcap_disk->Fill(region*station);
00746 h_.umOccupancyEndcap_disk_ring->Fill(region*station, ring);
00747 }
00748
00749
00750 int nPunchMatched = 0;
00751
00752 for ( std::vector<const PSimHit*>::const_iterator pthrSimHitP = pthrSimHits.begin();
00753 pthrSimHitP != pthrSimHits.end(); ++pthrSimHitP )
00754 {
00755 const PSimHit* simHit = *pthrSimHitP;
00756 const int absSimHitPType = abs(simHit->particleType());
00757 if ( absSimHitPType == 13 ) continue;
00758
00759 const RPCDetId simDetId = static_cast<const RPCDetId>(simHit->detUnitId());
00760 if ( simDetId == detId ) ++nPunchMatched;
00761 }
00762
00763 if ( nPunchMatched > 0 )
00764 {
00765 if ( region == 0 )
00766 {
00767 h_recPunchOccupancyBarrel_wheel->Fill(ring);
00768 h_recPunchOccupancyBarrel_station->Fill(station);
00769 h_recPunchOccupancyBarrel_wheel_station->Fill(ring, station);
00770 }
00771 else
00772 {
00773 h_recPunchOccupancyEndcap_disk->Fill(region*station);
00774 h_recPunchOccupancyEndcap_disk_ring->Fill(region*station, ring);
00775 }
00776 }
00777 }
00778 }
00779
00780
00781 for ( RecHitIter recHitIter = recHitHandle->begin();
00782 recHitIter != recHitHandle->end(); ++recHitIter )
00783 {
00784 const RPCDetId recDetId = static_cast<const RPCDetId>(recHitIter->rpcId());
00785 const RPCRoll* roll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(recDetId));
00786
00787 const int region = roll->id().region();
00788
00789
00790
00791
00792
00793
00794 const double recX = recHitIter->localPosition().x();
00795 const double recErrX = sqrt(recHitIter->localPositionError().xx());
00796
00797 bool matched = false;
00798 for ( SimHitIter simHitIter = simHitHandle->begin();
00799 simHitIter != simHitHandle->end(); ++simHitIter )
00800 {
00801 const RPCDetId simDetId = static_cast<const RPCDetId>(simHitIter->detUnitId());
00802 const RPCRoll* simRoll = dynamic_cast<const RPCRoll*>(rpcGeom->roll(simDetId));
00803 if ( !simRoll ) continue;
00804
00805 if ( simDetId != recDetId ) continue;
00806
00807 const double simX = simHitIter->localPosition().x();
00808 const double dX = fabs(recX-simX);
00809
00810 if ( dX/recErrX < 5 )
00811 {
00812 matched = true;
00813 break;
00814 }
00815 }
00816
00817 if ( !matched )
00818 {
00819 if ( region == 0 )
00820 {
00821 h_noiseOccupancyBarrel_detId->Fill(detIdToIndexMapBarrel_[recDetId.rawId()]);
00822 }
00823 else
00824 {
00825 h_noiseOccupancyEndcap_detId->Fill(detIdToIndexMapEndcap_[recDetId.rawId()]);
00826 }
00827 }
00828 }
00829
00830 h_eventCount->Fill(2);
00831 }
00832
00833 DEFINE_FWK_MODULE(RPCRecHitValid);
00834