Go to the documentation of this file.00001
00002
00003
00004
00012
00013
00014
00015
00016
00017
00018
00019 #include "HLTrigger/special/interface/HLTRPCTrigNoSyncFilter.h"
00020
00021
00022 #include <memory>
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 typedef struct {
00037 int id;
00038 int bx;
00039 GlobalPoint gp;
00040 } RPC4DHit;
00041
00042 bool bigmag(const RPC4DHit &Point1,const RPC4DHit &Point2){
00043 if((Point2).gp.mag() > (Point1).gp.mag()) return true;
00044 else return false;
00045 }
00046
00047 HLTRPCTrigNoSyncFilter::HLTRPCTrigNoSyncFilter(const edm::ParameterSet& iConfig)
00048 {
00049
00050 m_GMTInputTag =iConfig.getParameter< edm::InputTag >("GMTInputTag");
00051 rpcRecHitsLabel = iConfig.getParameter<edm::InputTag>("rpcRecHits");
00052 }
00053
00054
00055 HLTRPCTrigNoSyncFilter::~HLTRPCTrigNoSyncFilter()
00056 {
00057
00058
00059 }
00060
00061
00062
00063
00064
00065
00066
00067 bool HLTRPCTrigNoSyncFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup){
00068
00069 std::vector<RPC4DHit> GlobalRPC4DHits;
00070 std::vector<RPC4DHit> GlobalRPC4DHitsNoBx0;
00071
00072 edm::Handle<RPCRecHitCollection> rpcRecHits;
00073
00074
00075
00076 iEvent.getByLabel(rpcRecHitsLabel,rpcRecHits);
00077
00078 if(!rpcRecHits.isValid()){
00079
00080
00081 return false;
00082 }
00083 if(rpcRecHits->begin() == rpcRecHits->end()){
00084
00085
00086 return false;
00087 }
00088
00089 RPCRecHitCollection::const_iterator recHit;
00090
00091 edm::ESHandle<RPCGeometry> rpcGeo;
00092 iSetup.get<MuonGeometryRecord>().get(rpcGeo);
00093
00094 int k = 0;
00095
00096 for (recHit = rpcRecHits->begin(); recHit != rpcRecHits->end(); recHit++){
00097 RPCDetId rollId = (RPCDetId)(*recHit).rpcId();
00098 LocalPoint recHitPos=recHit->localPosition();
00099 const RPCRoll* rollasociated = rpcGeo->roll(rollId);
00100 const BoundPlane & RPCSurface = rollasociated->surface();
00101 GlobalPoint RecHitInGlobal = RPCSurface.toGlobal(recHitPos);
00102
00103 int BX = recHit->BunchX();
00104
00105
00106 RPC4DHit ThisHit;
00107 ThisHit.bx = BX;
00108 ThisHit.gp = RecHitInGlobal;
00109 ThisHit.id = k;
00110 GlobalRPC4DHits.push_back(ThisHit);
00111 if(BX!=0)GlobalRPC4DHitsNoBx0.push_back(ThisHit);
00112 k++;
00113 }
00114
00115 if(GlobalRPC4DHitsNoBx0.size()==0){
00116
00117
00118 return false;
00119 }
00120
00121 if(GlobalRPC4DHitsNoBx0.size()>100){
00122
00123
00124 return false;
00125 }
00126
00127 edm::Handle<L1MuGMTReadoutCollection> gmtrc_handle;
00128 iEvent.getByLabel(m_GMTInputTag,gmtrc_handle);
00129
00130 std::vector<L1MuGMTExtendedCand> gmt_candidates = (*gmtrc_handle).getRecord().getGMTCands();
00131
00132 std::vector<L1MuGMTExtendedCand>::const_iterator candidate;
00133
00134
00135 if(gmt_candidates.size()==0){
00136
00137 return false;
00138 }
00139
00140 for(candidate=gmt_candidates.begin(); candidate!=gmt_candidates.end(); candidate++) {
00141 int qual = candidate->quality();
00142
00143 if(qual < 5) continue;
00144 float eta=candidate->etaValue();
00145 float phi=candidate->phiValue();
00146
00147
00148
00149
00150
00151 std::vector<RPC4DHit> PointsForGMT;
00152
00153 for(std::vector<RPC4DHit>::iterator Point = GlobalRPC4DHitsNoBx0.begin(); Point!=GlobalRPC4DHitsNoBx0.end(); ++Point){
00154 float phiP = Point->gp.phi();
00155 float etaP = Point->gp.eta();
00156
00157
00158
00159 if(fabs(phi-phiP) <=0.1 && fabs(eta-etaP)<=0.20){
00160 PointsForGMT.push_back(*Point);
00161
00162 }
00163 }
00164
00165
00166
00167 if(PointsForGMT.size()<1){
00168
00169 continue;
00170 }
00171
00172 std::sort(PointsForGMT.begin(), PointsForGMT.end(), bigmag);
00173
00174
00175
00176
00177 int lastbx=-7;
00178 bool outOfTime = false;
00179 bool incr = true;
00180 bool anydifferentzero = true;
00181 bool anydifferentone = true;
00182
00183
00184 for(std::vector<RPC4DHit>::iterator point = PointsForGMT.begin(); point < PointsForGMT.end(); ++point) {
00185
00186 outOfTime |= (point->bx!=0);
00187 incr &= (point->bx>=lastbx);
00188 anydifferentzero &= (!point->bx==0);
00189 anydifferentone &= (!point->bx==1);
00190 lastbx = point->bx;
00191
00192 }
00193
00194
00195
00196
00197
00198
00199
00200 bool Candidate = (outOfTime&&incr);
00201
00202 if(Candidate){
00203
00204 return true;
00205 }
00206 }
00207
00208
00209 return false;
00210 }
00211
00212
00213 void
00214 HLTRPCTrigNoSyncFilter::beginJob(){
00215 }
00216
00217
00218 void
00219 HLTRPCTrigNoSyncFilter::endJob(){
00220 }
00221
00222
00223 DEFINE_FWK_MODULE(HLTRPCTrigNoSyncFilter);