Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "DPGAnalysis/Skims/src/RPCRecHitFilter.h"
00007
00008
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010
00011
00012 #include "FWCore/Framework/interface/Frameworkfwd.h"
00013
00014 #include "FWCore/Framework/interface/MakerMacros.h"
00015 #include "DataFormats/Common/interface/Handle.h"
00016 #include <DataFormats/RPCRecHit/interface/RPCRecHit.h>
00017 #include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h"
00018
00019 #include <Geometry/DTGeometry/interface/DTGeometry.h>
00020 #include <Geometry/RPCGeometry/interface/RPCGeometry.h>
00021 #include "Geometry/RPCGeometry/interface/RPCGeomServ.h"
00022 #include "MagneticField/Engine/interface/MagneticField.h"
00023 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00024 #include <Geometry/Records/interface/MuonGeometryRecord.h>
00025 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
00026 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00027 #include "DataFormats/DetId/interface/DetId.h"
00028 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00029
00030
00031 #include <FWCore/Utilities/interface/Exception.h>
00032 #include "DataFormats/Provenance/interface/Timestamp.h"
00033
00035
00036 #include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
00037 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuRegionalCand.h"
00038 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutCollection.h"
00039
00040 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTCand.h"
00041 #include "CondFormats/L1TObjects/interface/L1GtParameters.h"
00042 #include "CondFormats/DataRecord/interface/L1GtParametersRcd.h"
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 using namespace reco;
00054
00055 typedef std::vector<L1MuRegionalCand> L1MuRegionalCandCollection;
00056
00057 #include <sys/time.h>
00058 #include <algorithm>
00059 #include <memory>
00060 #include <cmath>
00061 #include "math.h"
00062 #include "TFile.h"
00063 #include "TMath.h"
00064 #include "TTree.h"
00065
00066 #include "TDirectory.h"
00067 #include "TFile.h"
00068 #include "TTree.h"
00069 #include <cstdlib>
00070 #include <stdio.h>
00071 #include "stdlib.h"
00072 #include <string>
00073 #include <memory>
00074 #include<cmath>
00075
00076 using namespace edm;
00077 using namespace reco;
00078 using namespace std;
00079
00080 RPCRecHitFilter::RPCRecHitFilter(const edm::ParameterSet& iConfig){
00081
00082
00083 LogTrace("RPCEffTrackExtrapolation") <<"Dentro Costruttore"<<std::endl;
00084
00085 RPCDataLabel = iConfig.getUntrackedParameter<std::string>("rpcRecHitLabel");
00086
00087
00088
00089
00090 centralBX_ = iConfig.getUntrackedParameter<int>("CentralBunchCrossing",0);
00091 BXWindow_ = iConfig.getUntrackedParameter<int>("BunchCrossingWindow",9999);
00092
00093 minHits_ = iConfig.getUntrackedParameter<int>("minimumNumberOfHits",0);
00094 hitsInStations_ = iConfig.getUntrackedParameter<int>("HitsInStation",0);
00095
00096
00097 Debug_ = iConfig.getUntrackedParameter<bool>("Debug",false);
00098 Verbose_ = iConfig.getUntrackedParameter<bool>("Verbose",false);
00099
00100
00101 Barrel_ = iConfig.getUntrackedParameter<bool>("UseBarrel",true);
00102 EndcapPositive_ = iConfig.getUntrackedParameter<bool>("UseEndcapPositive",true);
00103 EndcapNegative_ = iConfig.getUntrackedParameter<bool>("UseEndcapNegative",true);
00104
00105 cosmicsVeto_ = iConfig.getUntrackedParameter<bool>("CosmicsVeto",false);
00106
00107
00108
00109 }
00110
00111 void RPCRecHitFilter::beginJob()
00112 {
00113
00114 }
00115
00116 bool RPCRecHitFilter::filter( edm::Event& iEvent, const edm::EventSetup& iSetup){
00117
00118
00119 edm::ESHandle<RPCGeometry> rpcGeo;
00120 iSetup.get<MuonGeometryRecord>().get(rpcGeo);
00121
00122 edm::Handle<RPCRecHitCollection> rpcHits;
00123 iEvent.getByLabel(RPCDataLabel,rpcHits);
00124
00125
00126 ESHandle<GlobalTrackingGeometry> theTrackingGeometry;
00127 iSetup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
00128
00129
00130 std::map <int , int > numberOfRecHitsBarrel;
00131 std::map <int , int > numberOfDigisBarrel;
00132 std::map <int , int > numberOfRecHitsEndcap;
00133 std::map <int , int > numberOfDigisEndcap;
00134
00135 std::map <pair < int , int > , std::vector<RPCDetId> > numberOfRecHitsSameWheelSameSector;
00136 std::map <pair < int , int > , std::vector<RPCDetId> > numberOfDigisSameWheelSameSector;
00137 std::map <pair < int , int > , std::vector<RPCDetId> > numberOfHitsSameDiskSectorPositive;
00138 std::map <pair < int , int > , std::vector<RPCDetId> > numberOfHitsSameDiskSectorNegative;
00139
00140
00141 const std::vector< RPCRoll * > rls = rpcGeo->rolls();
00142
00143 bool condition = true;
00144
00145
00146 int nRecHits = 0;
00147 int nBarrel = 0;
00148 int nEndcap = 0;
00149
00150
00152 for (int i = 0; i < (int) rls.size() ; ++i){
00153
00154 RPCDetId did = rls[i]->id();
00155
00156
00158 RPCRecHitCollection::range rpcRecHitRange = rpcHits->get(did);
00159 RPCRecHitCollection::const_iterator RecHitsIt;
00160
00161
00162 for(RecHitsIt = rpcRecHitRange.first; RecHitsIt!=rpcRecHitRange.second; ++RecHitsIt){
00163
00164
00165
00166 if(did.region()==0){
00167
00168 if (cosmicsVeto_ ){
00169
00170 for(int u = -1;u<=1;++u){
00171 for(int t = -1;t<=1;++t){
00172 numberOfRecHitsSameWheelSameSector[pair< int, int >( did.ring()+u,did.sector()+t)].push_back(did);
00173 }
00174 }
00175 }
00176
00177 else{
00178 if( did.station()==1) {
00179 for(int u = -1;u<=1;++u){
00180 for(int t = -1;t<=1;++t){
00181 numberOfRecHitsSameWheelSameSector[pair< int, int >(did.ring()+u,did.sector()+t)].push_back(did);
00182 }
00183 }
00184 }
00185 }
00186
00187 ++numberOfRecHitsBarrel[did.ring()];
00188 ++nBarrel;
00189
00190 }
00191
00192 else {
00193 if(did.region()== -1) {
00194 for(int t = -1;t<=1;++t){
00195 numberOfHitsSameDiskSectorNegative[pair<int,int>(did.ring(),did.sector()+t)].push_back(did);
00196 }
00197 }
00198
00199 if(did.region()== 1){
00200 for(int t = -1;t<=1;++t){
00201 numberOfHitsSameDiskSectorPositive[pair<int,int>(did.ring(),did.sector()+t)].push_back(did);
00202 }
00203 }
00204 ++numberOfRecHitsEndcap[did.station()];
00205
00206 ++nEndcap;
00207 }
00208
00209 ++nRecHits;
00210
00211 break;
00212 }
00213
00214
00215 }
00217
00218
00221 bool cond1 = false;
00222 bool cond2 = false;
00223 bool cond3 = false;
00224
00225 std::map < int, bool >vectorBarrelCands;
00226 std::map < int, bool >vectorEndcapCandsPositive;
00227 std::map < int, bool >vectorEndcapCandsNegative;
00228
00229 bool veto = false;
00230
00231
00232 for ( std::map <pair < int , int > , std::vector < RPCDetId> >::const_iterator iter = numberOfRecHitsSameWheelSameSector.begin();iter != numberOfRecHitsSameWheelSameSector.end();++iter){
00233
00234 vectorBarrelCands[1] = false;
00235 vectorBarrelCands[2] = false;
00236
00237 if(iter->second.size()>1){
00238 for(size_t i = 0; i < iter->second.size(); ++i){
00239 if(iter->second[i].layer()==1 && iter->second[i].station() == 1)vectorBarrelCands[0] = true;
00240 if(iter->second[i].layer()==2 && iter->second[i].station() == 1)vectorBarrelCands[1] = true;
00241 if(cosmicsVeto_)if(iter->second[i].station() > 2){ veto = true;
00242 vectorBarrelCands[1] = false;vectorBarrelCands[2] = false ;
00243 break;
00244 }
00245 }
00246 }
00247
00248 if(( vectorBarrelCands[0] && vectorBarrelCands[1])) {
00249 cond1 = true;
00250 break;
00251 }
00252 }
00253
00254
00255
00256 for ( std::map <pair < int ,int >, std::vector < RPCDetId> >::const_iterator iter = numberOfHitsSameDiskSectorPositive.begin(); iter != numberOfHitsSameDiskSectorPositive.end(); ++iter){
00257
00258 vectorEndcapCandsPositive[1] = false;
00259 vectorEndcapCandsPositive[2] = false;
00260 vectorEndcapCandsPositive[3] = false;
00261
00262
00263 if(iter->second.size()>1){
00264 for(size_t i = 0; i < iter->second.size(); ++i){
00265 if(iter->second[i].station()==1)vectorEndcapCandsPositive[1] = true;
00266 if(iter->second[i].station()==2)vectorEndcapCandsPositive[2] = true;
00267 if(iter->second[i].station()==3)vectorEndcapCandsPositive[3] = true;
00268 }
00269 }
00270
00271 if(( (vectorEndcapCandsPositive[1] && vectorEndcapCandsPositive[2]) ||
00272 (vectorEndcapCandsPositive[1] && vectorEndcapCandsPositive[3]) ||
00273 (vectorEndcapCandsPositive[2] && vectorEndcapCandsPositive[3]) )) {
00274 cond2 = true;
00275 break;
00276 }
00277
00278 }
00279
00280
00281 for ( std::map <pair < int ,int >, std::vector < RPCDetId> >::const_iterator iter = numberOfHitsSameDiskSectorNegative.begin(); iter != numberOfHitsSameDiskSectorNegative.end(); ++iter){
00282
00283 vectorEndcapCandsNegative[1] = false;
00284 vectorEndcapCandsNegative[2] = false;
00285 vectorEndcapCandsNegative[3] = false;
00286
00287
00288 if(iter->second.size()>1){
00289 for(size_t i = 0; i < iter->second.size(); ++i){
00290 if(iter->second[i].station()==1)vectorEndcapCandsNegative[1] = true;
00291 if(iter->second[i].station()==2)vectorEndcapCandsNegative[2] = true;
00292 if(iter->second[i].station()==3)vectorEndcapCandsNegative[3] = true;
00293 }
00294 }
00295
00296 if(( (vectorEndcapCandsNegative[1] && vectorEndcapCandsNegative[2]) ||
00297 (vectorEndcapCandsNegative[1] && vectorEndcapCandsNegative[3]) ||
00298 (vectorEndcapCandsNegative[2] && vectorEndcapCandsNegative[3]) )) {
00299 cond3 = true;
00300 break;
00301 }
00302
00303 }
00304
00305
00306 condition = condition && ( nBarrel + nEndcap >= minHits_ );
00307
00308
00309 cond1 = Barrel_ && cond1;
00310 cond2 = EndcapPositive_ && cond2;
00311 cond3 = EndcapNegative_ && cond3;
00312
00313 bool condition2 = (cond1 || cond2 || cond3);
00314 if(Barrel_ || EndcapPositive_ || EndcapNegative_)condition = condition && condition2;
00315
00316
00317
00318 return condition;
00319
00320 }
00321
00322 void RPCRecHitFilter::endJob(){
00323
00324 }
00325
00326 RPCRecHitFilter::~RPCRecHitFilter(){}
00327
00328 DEFINE_FWK_MODULE(RPCRecHitFilter);
00329