Go to the documentation of this file.00001 #include "RecoMET/METAlgorithms/interface/CSCHaloAlgo.h"
00002 #include "FWCore/Common/interface/TriggerNames.h"
00003
00004
00005
00006
00007
00008
00009 using namespace reco;
00010 using namespace std;
00011 using namespace edm;
00012 #include "TMath.h"
00013
00014 CSCHaloAlgo::CSCHaloAlgo()
00015 {
00016 deta_threshold = 0.;
00017 min_inner_radius = 0.;
00018 max_inner_radius = 9999.;
00019 min_outer_radius = 0.;
00020 max_outer_radius = 9999.;
00021 dphi_threshold = 999.;
00022 norm_chi2_threshold = 999.;
00023 recHit_t0=0.;
00024 recHit_twindow=25.;
00025 expected_BX=3;
00026 max_dt_muon_segment=-10.0;
00027 max_free_inverse_beta=0.0;
00028
00029 min_outer_theta = 0.;
00030 max_outer_theta = TMath::Pi();
00031
00032 matching_dphi_threshold = 0.18;
00033 matching_deta_threshold = 0.4;
00034 matching_dwire_threshold = 5.;
00035 }
00036
00037 reco::CSCHaloData CSCHaloAlgo::Calculate(const CSCGeometry& TheCSCGeometry,
00038 edm::Handle<reco::MuonCollection>& TheCosmicMuons,
00039 const edm::Handle<reco::MuonTimeExtraMap> TheCSCTimeMap,
00040 edm::Handle<reco::MuonCollection>& TheMuons,
00041 edm::Handle<CSCSegmentCollection>& TheCSCSegments,
00042 edm::Handle<CSCRecHit2DCollection>& TheCSCRecHits,
00043 edm::Handle < L1MuGMTReadoutCollection >& TheL1GMTReadout,
00044 edm::Handle<edm::TriggerResults>& TheHLTResults,
00045 const edm::TriggerNames * triggerNames,
00046 const edm::Handle<CSCALCTDigiCollection>& TheALCTs,
00047 MuonSegmentMatcher *TheMatcher,
00048 const edm::Event& TheEvent)
00049 {
00050 reco::CSCHaloData TheCSCHaloData;
00051 int imucount=0;
00052 if( TheCosmicMuons.isValid() )
00053 {
00054 short int n_tracks_small_beta=0;
00055 short int n_tracks_small_dT=0;
00056 short int n_tracks_small_dT_and_beta=0;
00057 for( reco::MuonCollection::const_iterator iMuon = TheCosmicMuons->begin() ; iMuon != TheCosmicMuons->end() ; iMuon++, imucount++ )
00058 {
00059 reco::TrackRef Track = iMuon->outerTrack();
00060 if(!Track) continue;
00061
00062 bool StoreTrack = false;
00063
00064 float innermost_global_z = 1500.;
00065 float outermost_global_z = 0.;
00066 GlobalPoint InnerMostGlobalPosition(0.,0.,0.);
00067 GlobalPoint OuterMostGlobalPosition(0.,0.,0.);
00068 int nCSCHits = 0;
00069 for(unsigned int j = 0 ; j < Track->extra()->recHits().size(); j++ )
00070 {
00071 edm::Ref<TrackingRecHitCollection> hit( Track->extra()->recHits(), j );
00072 if( !hit->isValid() ) continue;
00073 DetId TheDetUnitId(hit->geographicalId());
00074 if( TheDetUnitId.det() != DetId::Muon ) continue;
00075 if( TheDetUnitId.subdetId() != MuonSubdetId::CSC ) continue;
00076
00077 const GeomDetUnit *TheUnit = TheCSCGeometry.idToDetUnit(TheDetUnitId);
00078 LocalPoint TheLocalPosition = hit->localPosition();
00079 const BoundPlane& TheSurface = TheUnit->surface();
00080 const GlobalPoint TheGlobalPosition = TheSurface.toGlobal(TheLocalPosition);
00081
00082 float z = TheGlobalPosition.z();
00083 if( TMath::Abs(z) < innermost_global_z )
00084 {
00085 innermost_global_z = TMath::Abs(z);
00086 InnerMostGlobalPosition = GlobalPoint( TheGlobalPosition);
00087 }
00088 if( TMath::Abs(z) > outermost_global_z )
00089 {
00090 outermost_global_z = TMath::Abs(z);
00091 OuterMostGlobalPosition = GlobalPoint( TheGlobalPosition );
00092 }
00093 nCSCHits ++;
00094 }
00095
00096 std::vector<const CSCSegment*> MatchedSegments = TheMatcher->matchCSC(*Track,TheEvent);
00097
00098
00099 float InnerSegmentTime[2] = {0,0};
00100 float OuterSegmentTime[2] = {0,0};
00101 float innermost_seg_z[2] = {1500,1500};
00102 float outermost_seg_z[2] = {0,0};
00103 for (std::vector<const CSCSegment*>::const_iterator segment =MatchedSegments.begin();
00104 segment != MatchedSegments.end(); ++segment)
00105 {
00106 CSCDetId TheCSCDetId((*segment)->cscDetId());
00107 const CSCChamber* TheCSCChamber = TheCSCGeometry.chamber(TheCSCDetId);
00108 LocalPoint TheLocalPosition = (*segment)->localPosition();
00109 const GlobalPoint TheGlobalPosition = TheCSCChamber->toGlobal(TheLocalPosition);
00110 float z = TheGlobalPosition.z();
00111 int TheEndcap = TheCSCDetId.endcap();
00112 if( TMath::Abs(z) < innermost_seg_z[TheEndcap-1] )
00113 {
00114 innermost_seg_z[TheEndcap-1] = TMath::Abs(z);
00115 InnerSegmentTime[TheEndcap-1] = (*segment)->time();
00116 }
00117 if( TMath::Abs(z) > outermost_seg_z[TheEndcap-1] )
00118 {
00119 outermost_seg_z[TheEndcap-1] = TMath::Abs(z);
00120 OuterSegmentTime[TheEndcap-1] = (*segment)->time();
00121 }
00122 }
00123
00124 if( nCSCHits < 3 ) continue;
00125
00126 float dT_Segment = 0;
00127
00128 if( innermost_seg_z[0] < outermost_seg_z[0])
00129 dT_Segment = OuterSegmentTime[0]-InnerSegmentTime[0];
00130 if( innermost_seg_z[1] < outermost_seg_z[1])
00131 {
00132
00133
00134 if (dT_Segment == 0.0 || OuterSegmentTime[1]-InnerSegmentTime[1] < dT_Segment)
00135 dT_Segment = OuterSegmentTime[1]-InnerSegmentTime[1] ;
00136 }
00137
00138 if( OuterMostGlobalPosition.x() == 0. || OuterMostGlobalPosition.y() == 0. || OuterMostGlobalPosition.z() == 0. )
00139 continue;
00140 if( InnerMostGlobalPosition.x() == 0. || InnerMostGlobalPosition.y() == 0. || InnerMostGlobalPosition.z() == 0. )
00141 continue;
00142
00143
00144 StoreTrack = true;
00145
00146 float deta = TMath::Abs( OuterMostGlobalPosition.eta() - InnerMostGlobalPosition.eta() );
00147 float dphi = TMath::ACos( TMath::Cos( OuterMostGlobalPosition.phi() - InnerMostGlobalPosition.phi() ) ) ;
00148 float theta = Track->outerMomentum().theta();
00149 float innermost_x = InnerMostGlobalPosition.x() ;
00150 float innermost_y = InnerMostGlobalPosition.y();
00151 float outermost_x = OuterMostGlobalPosition.x();
00152 float outermost_y = OuterMostGlobalPosition.y();
00153 float innermost_r = TMath::Sqrt(innermost_x *innermost_x + innermost_y * innermost_y );
00154 float outermost_r = TMath::Sqrt(outermost_x *outermost_x + outermost_y * outermost_y );
00155
00156 if( deta < deta_threshold )
00157 StoreTrack = false;
00158 if( theta > min_outer_theta && theta < max_outer_theta )
00159 StoreTrack = false;
00160 if( dphi > dphi_threshold )
00161 StoreTrack = false;
00162 if( innermost_r < min_inner_radius )
00163 StoreTrack = false;
00164 if( innermost_r > max_inner_radius )
00165 StoreTrack = false;
00166 if( outermost_r < min_outer_radius )
00167 StoreTrack = false;
00168 if( outermost_r > max_outer_radius )
00169 StoreTrack = false;
00170 if( Track->normalizedChi2() > norm_chi2_threshold )
00171 StoreTrack = false;
00172
00173 if( StoreTrack )
00174 {
00175 TheCSCHaloData.GetCSCTrackImpactPositions().push_back( InnerMostGlobalPosition );
00176 TheCSCHaloData.GetTracks().push_back( Track );
00177 }
00178
00179
00180 if( TheCSCTimeMap.isValid() )
00181 {
00182 reco::MuonRef muonR(TheCosmicMuons,imucount);
00183 const reco::MuonTimeExtraMap & timeMapCSC = *TheCSCTimeMap;
00184 reco::MuonTimeExtra timecsc = timeMapCSC[muonR];
00185 float freeInverseBeta = timecsc.freeInverseBeta();
00186
00187 if (dT_Segment < max_dt_muon_segment )
00188 n_tracks_small_dT++;
00189 if (freeInverseBeta < max_free_inverse_beta)
00190 n_tracks_small_beta++;
00191 if ((dT_Segment < max_dt_muon_segment) && (freeInverseBeta < max_free_inverse_beta))
00192 n_tracks_small_dT_and_beta++;
00193 }
00194 else
00195 {
00196 static bool MuonTimeFail = false;
00197 if( !MuonTimeFail )
00198 {
00199 edm::LogWarning ("InvalidInputTag") << "The MuonTimeExtraMap does not appear to be in the event. Some beam halo "
00200 << " identification variables will be empty" ;
00201 MuonTimeFail = true;
00202 }
00203 }
00204 }
00205 TheCSCHaloData.SetNIncomingTracks(n_tracks_small_dT,n_tracks_small_beta,n_tracks_small_dT_and_beta);
00206 }
00207 else
00208 {
00209 static bool CosmicFail = false;
00210 if( !CosmicFail )
00211 {
00212 edm::LogWarning ("InvalidInputTag") << " The Cosmic Muon collection does not appear to be in the event. These beam halo "
00213 << " identification variables will be empty" ;
00214 CosmicFail = true;
00215 }
00216 }
00217
00218 if( TheHLTResults.isValid() )
00219 {
00220 bool EventPasses = false;
00221 for( unsigned int index = 0 ; index < vIT_HLTBit.size(); index++)
00222 {
00223 if( vIT_HLTBit[index].label().size() )
00224 {
00225
00226 unsigned int bit = triggerNames->triggerIndex( vIT_HLTBit[index].label().c_str());
00227 if( bit < TheHLTResults->size() )
00228 {
00229
00230 if( TheHLTResults->accept( bit ) && !TheHLTResults->error( bit ) )
00231 {
00232 EventPasses = true;
00233 }
00234 }
00235 }
00236 }
00237 if( EventPasses )
00238 TheCSCHaloData.SetHLTBit(true);
00239 else
00240 TheCSCHaloData.SetHLTBit(false);
00241 }
00242 else
00243 {
00244 static bool HLTFail = false;
00245 if( !HLTFail )
00246 {
00247 edm::LogWarning ("InvalidInputTag") << "The HLT results do not appear to be in the event. The beam halo HLT trigger "
00248 << "decision will not be used in the halo identification";
00249 HLTFail = true;
00250 }
00251 }
00252
00253 if( TheL1GMTReadout.isValid() )
00254 {
00255 L1MuGMTReadoutCollection const *gmtrc = TheL1GMTReadout.product ();
00256 std::vector < L1MuGMTReadoutRecord > gmt_records = gmtrc->getRecords ();
00257 std::vector < L1MuGMTReadoutRecord >::const_iterator igmtrr;
00258
00259 int icsc = 0;
00260 int PlusZ = 0 ;
00261 int MinusZ = 0 ;
00262
00263 for (igmtrr = gmt_records.begin (); igmtrr != gmt_records.end (); igmtrr++)
00264 {
00265 std::vector < L1MuRegionalCand >::const_iterator iter1;
00266 std::vector < L1MuRegionalCand > rmc;
00267 rmc = igmtrr->getCSCCands ();
00268 for (iter1 = rmc.begin (); iter1 != rmc.end (); iter1++)
00269 {
00270 if (!(*iter1).empty ())
00271 {
00272 if ((*iter1).isFineHalo ())
00273 {
00274 float halophi = iter1->phiValue();
00275 halophi = halophi > TMath::Pi() ? halophi - 2.*TMath::Pi() : halophi;
00276 float haloeta = iter1->etaValue();
00277 bool HaloIsGood = true;
00278
00279 if( TheMuons.isValid() )
00280 {
00281 float dphi = 9999.;
00282 float deta = 9999.;
00283 for( reco::MuonCollection::const_iterator mu = TheMuons->begin(); mu != TheMuons->end() && HaloIsGood ; mu++ )
00284 {
00285
00286 if( mu->isStandAloneMuon() && !mu->isTrackerMuon() && !mu->isGlobalMuon() ) continue;
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 const std::vector<MuonChamberMatch> chambers = mu->matches();
00305 for(std::vector<MuonChamberMatch>::const_iterator iChamber = chambers.begin();
00306 iChamber != chambers.end() ; iChamber ++ )
00307 {
00308 if( iChamber->detector() != MuonSubdetId::CSC ) continue;
00309 for( std::vector<reco::MuonSegmentMatch>::const_iterator iSegment = iChamber->segmentMatches.begin() ;
00310 iSegment != iChamber->segmentMatches.end(); ++iSegment )
00311 {
00312 edm::Ref<CSCSegmentCollection> cscSegment = iSegment->cscSegmentRef;
00313 std::vector<CSCRecHit2D> hits = cscSegment -> specificRecHits();
00314 for( std::vector<CSCRecHit2D>::iterator iHit = hits.begin();
00315 iHit != hits.end() ; iHit++ )
00316 {
00317 DetId TheDetUnitId(iHit->cscDetId());
00318 const GeomDetUnit *TheUnit = TheCSCGeometry.idToDetUnit(TheDetUnitId);
00319 LocalPoint TheLocalPosition = iHit->localPosition();
00320 const BoundPlane& TheSurface = TheUnit->surface();
00321 GlobalPoint TheGlobalPosition = TheSurface.toGlobal(TheLocalPosition);
00322
00323 float phi_ = TheGlobalPosition.phi();
00324 float eta_ = TheGlobalPosition.eta();
00325
00326 deta = deta < TMath::Abs( eta_ - haloeta ) ? deta : TMath::Abs( eta_ - haloeta );
00327 dphi = dphi < TMath::ACos(TMath::Cos(phi_ - halophi)) ? dphi : TMath::ACos(TMath::Cos(phi_ - halophi));
00328 }
00329 }
00330 }
00331 if ( dphi < matching_dphi_threshold && deta < matching_deta_threshold)
00332 HaloIsGood = false;
00333 }
00334 }
00335 if( !HaloIsGood )
00336 continue;
00337 if( (*iter1).etaValue() > 0 )
00338 PlusZ++;
00339 else
00340 MinusZ++;
00341 }
00342 else
00343 icsc++;
00344 }
00345 }
00346 }
00347 TheCSCHaloData.SetNumberOfHaloTriggers(PlusZ, MinusZ);
00348 }
00349 else
00350 {
00351 static bool L1Fail = false;
00352 if( !L1Fail )
00353 {
00354 edm::LogWarning ("InvalidInputTag") << "The L1MuGMTReadoutCollection does not appear to be in the event. The L1 beam halo trigger "
00355 << "decision will not be used in the halo identification";
00356 L1Fail = true;
00357 }
00358 }
00359
00360
00361
00362
00363 short int n_alctsP=0;
00364 short int n_alctsM=0;
00365 if(TheALCTs.isValid())
00366 {
00367 for (CSCALCTDigiCollection::DigiRangeIterator j=TheALCTs->begin(); j!=TheALCTs->end(); j++)
00368 {
00369 const CSCALCTDigiCollection::Range& range =(*j).second;
00370 CSCDetId detId((*j).first.rawId());
00371 for (CSCALCTDigiCollection::const_iterator digiIt = range.first; digiIt!=range.second; ++digiIt)
00372 {
00373 if( (*digiIt).isValid() && ( (*digiIt).getBX() < expected_BX ) )
00374 {
00375 int digi_endcap = detId.endcap();
00376 int digi_station = detId.station();
00377 int digi_ring = detId.ring();
00378 int digi_chamber = detId.chamber();
00379 int digi_wire = digiIt->getKeyWG();
00380 if( digi_station == 1 && digi_ring == 4 )
00381 digi_ring = 1;
00382
00383 bool DigiIsGood = true;
00384 int dwire = 999.;
00385 if( TheMuons.isValid() )
00386 {
00387
00388 for(reco::MuonCollection::const_iterator mu = TheMuons->begin(); mu!= TheMuons->end() && DigiIsGood ; mu++ )
00389 {
00390 if( !mu->isTrackerMuon() && !mu->isGlobalMuon() && mu->isStandAloneMuon() ) continue;
00391
00392 const std::vector<MuonChamberMatch> chambers = mu->matches();
00393 for(std::vector<MuonChamberMatch>::const_iterator iChamber = chambers.begin();
00394 iChamber != chambers.end(); iChamber ++ )
00395 {
00396 if( iChamber->detector() != MuonSubdetId::CSC ) continue;
00397 for( std::vector<reco::MuonSegmentMatch>::const_iterator iSegment = iChamber->segmentMatches.begin();
00398 iSegment != iChamber->segmentMatches.end(); iSegment++ )
00399 {
00400 edm::Ref<CSCSegmentCollection> cscSegRef = iSegment->cscSegmentRef;
00401 std::vector<CSCRecHit2D> hits = cscSegRef->specificRecHits();
00402 for( std::vector<CSCRecHit2D>::iterator iHit = hits.begin();
00403 iHit != hits.end(); iHit++ )
00404 {
00405 if( iHit->cscDetId().endcap() != digi_endcap ) continue;
00406 if( iHit->cscDetId().station() != digi_station ) continue;
00407 if( iHit->cscDetId().ring() != digi_ring ) continue;
00408 if( iHit->cscDetId().chamber() != digi_chamber ) continue;
00409 CSCRecHit2D::ChannelContainer hitwires = iHit->wgroups();
00410 int nwires = hitwires.size();
00411 int center_id = nwires/2 + 1;
00412 int hit_wire = hitwires[center_id -1 ];
00413 dwire = dwire < TMath::Abs(hit_wire - digi_wire)? dwire : TMath::Abs(hit_wire - digi_wire );
00414 }
00415 }
00416 }
00417 if( dwire <= matching_dwire_threshold )
00418 DigiIsGood = false;
00419 }
00420 }
00421
00422 if( DigiIsGood )
00423 {
00424 if( detId.endcap() == 1 )
00425 n_alctsP++;
00426 else if ( detId.endcap() == 2)
00427 n_alctsM++;
00428 }
00429 }
00430 }
00431 }
00432 }
00433 else
00434 {
00435 static bool DigiFail=false;
00436 if (!DigiFail){
00437 edm::LogWarning ("InvalidInputTag") << "The CSCALCTDigiCollection does not appear to be in the event. The ALCT Digis will "
00438 << " not be used in the halo identification";
00439 DigiFail=true;
00440 }
00441 }
00442 TheCSCHaloData.SetNOutOfTimeTriggers(n_alctsP,n_alctsM);
00443
00444
00445
00446
00447 short int n_recHitsP = 0;
00448 short int n_recHitsM = 0;
00449 if( TheCSCRecHits.isValid() )
00450 {
00451 CSCRecHit2DCollection::const_iterator dRHIter;
00452 for (dRHIter = TheCSCRecHits->begin(); dRHIter != TheCSCRecHits->end(); dRHIter++)
00453 {
00454 if ( !((*dRHIter).isValid()) ) continue;
00455 CSCDetId idrec = (CSCDetId)(*dRHIter).cscDetId();
00456 float RHTime = (*dRHIter).tpeak();
00457 LocalPoint rhitlocal = (*dRHIter).localPosition();
00458 const CSCChamber* chamber = TheCSCGeometry.chamber(idrec);
00459 GlobalPoint globalPosition = chamber->toGlobal(rhitlocal);
00460 float globZ = globalPosition.z();
00461 if ( RHTime < (recHit_t0 - recHit_twindow) )
00462 {
00463 if( globZ > 0 )
00464 n_recHitsP++;
00465 else
00466 n_recHitsM++;
00467 }
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483 }
00484 }
00485 else
00486 {
00487 static bool RecHitFail = false;
00488 if( !RecHitFail )
00489 {
00490 edm::LogWarning ("InvalidInputTag") << "The requested CSCRecHit2DCollection does not appear to be in the event. The CSC RecHit "
00491 << " variables used for halo identification will not be calculated or stored";
00492 RecHitFail = true;
00493 }
00494 }
00495 TheCSCHaloData.SetNOutOfTimeHits(n_recHitsP+n_recHitsM);
00496
00497
00498
00499 short int maxNSegments = 0;
00500 bool plus_endcap = false;
00501 bool minus_endcap = false;
00502 bool both_endcaps = false;
00503 float r = 0., phi = 0.;
00504 if (TheCSCSegments.isValid()) {
00505 for(CSCSegmentCollection::const_iterator iSegment = TheCSCSegments->begin();
00506 iSegment != TheCSCSegments->end();
00507 iSegment++) {
00508
00509 CSCDetId iCscDetID = iSegment->cscDetId();
00510 bool SegmentIsGood=true;
00511
00512 if( TheMuons.isValid() )
00513 {
00514 for(reco::MuonCollection::const_iterator mu = TheMuons->begin(); mu!= TheMuons->end() && SegmentIsGood ; mu++ )
00515 {
00516 if( !mu->isTrackerMuon() && !mu->isGlobalMuon() && mu->isStandAloneMuon() ) continue;
00517 const std::vector<MuonChamberMatch> chambers = mu->matches();
00518 for(std::vector<MuonChamberMatch>::const_iterator kChamber = chambers.begin();
00519 kChamber != chambers.end(); kChamber ++ )
00520 {
00521 if( kChamber->detector() != MuonSubdetId::CSC ) continue;
00522 for( std::vector<reco::MuonSegmentMatch>::const_iterator kSegment = kChamber->segmentMatches.begin();
00523 kSegment != kChamber->segmentMatches.end(); kSegment++ )
00524 {
00525 edm::Ref<CSCSegmentCollection> cscSegRef = kSegment->cscSegmentRef;
00526 CSCDetId kCscDetID = cscSegRef->cscDetId();
00527
00528 if( kCscDetID == iCscDetID )
00529 {
00530 SegmentIsGood = false;
00531 }
00532 }
00533 }
00534 }
00535 }
00536 if(!SegmentIsGood) continue;
00537
00538
00539
00540 LocalPoint iLocalPosition = iSegment->localPosition();
00541 LocalVector iLocalDirection = iSegment->localDirection();
00542
00543 GlobalPoint iGlobalPosition = TheCSCGeometry.chamber(iCscDetID)->toGlobal(iLocalPosition);
00544 GlobalVector iGlobalDirection = TheCSCGeometry.chamber(iCscDetID)->toGlobal(iLocalDirection);
00545
00546 float iTheta = iGlobalDirection.theta();
00547 if (iTheta > max_segment_theta && iTheta < TMath::Pi() - max_segment_theta) continue;
00548
00549 float iPhi = iGlobalPosition.phi();
00550 float iR = TMath::Sqrt(iGlobalPosition.x()*iGlobalPosition.x() + iGlobalPosition.y()*iGlobalPosition.y());
00551 short int nSegs = 0;
00552
00553
00554 for (CSCSegmentCollection::const_iterator jSegment = TheCSCSegments->begin();
00555 jSegment != TheCSCSegments->end();
00556 jSegment++) {
00557 if (jSegment == iSegment) continue;
00558
00559 LocalPoint jLocalPosition = jSegment->localPosition();
00560 LocalVector jLocalDirection = jSegment->localDirection();
00561 CSCDetId jCscDetID = jSegment->cscDetId();
00562 GlobalPoint jGlobalPosition = TheCSCGeometry.chamber(jCscDetID)->toGlobal(jLocalPosition);
00563 GlobalVector jGlobalDirection = TheCSCGeometry.chamber(jCscDetID)->toGlobal(jLocalDirection);
00564 float jTheta = jGlobalDirection.theta();
00565 float jPhi = jGlobalPosition.phi();
00566 float jR = TMath::Sqrt(jGlobalPosition.x()*jGlobalPosition.x() + jGlobalPosition.y()*jGlobalPosition.y());
00567
00568 if (TMath::ACos(TMath::Cos(jPhi - iPhi)) <= max_segment_phi_diff
00569 && TMath::Abs(jR - iR) <= max_segment_r_diff
00570 && (jTheta < max_segment_theta || jTheta > TMath::Pi() - max_segment_theta)) {
00572 if( TheMuons.isValid() ) {
00573 for(reco::MuonCollection::const_iterator mu = TheMuons->begin(); mu!= TheMuons->end() && SegmentIsGood ; mu++ ) {
00574 if( !mu->isTrackerMuon() && !mu->isGlobalMuon() && mu->isStandAloneMuon() ) continue;
00575 const std::vector<MuonChamberMatch> chambers = mu->matches();
00576 for(std::vector<MuonChamberMatch>::const_iterator kChamber = chambers.begin();
00577 kChamber != chambers.end(); kChamber ++ ) {
00578 if( kChamber->detector() != MuonSubdetId::CSC ) continue;
00579 for( std::vector<reco::MuonSegmentMatch>::const_iterator kSegment = kChamber->segmentMatches.begin();
00580 kSegment != kChamber->segmentMatches.end(); kSegment++ ) {
00581 edm::Ref<CSCSegmentCollection> cscSegRef = kSegment->cscSegmentRef;
00582 CSCDetId kCscDetID = cscSegRef->cscDetId();
00583
00584 if( kCscDetID == jCscDetID ) {
00585 SegmentIsGood = false;
00586 }
00587 }
00588 }
00589 }
00590 }
00591 if(SegmentIsGood) {
00592 nSegs++;
00593 minus_endcap = iGlobalPosition.z() < 0 || jGlobalPosition.z() < 0;
00594 plus_endcap = iGlobalPosition.z() > 0 || jGlobalPosition.z() > 0;
00595 }
00596 }
00597 }
00598
00599 if (nSegs > 0) nSegs++;
00600 if (nSegs > maxNSegments) {
00601
00602 r = iR;
00603 phi = iPhi;
00604 maxNSegments = nSegs;
00605 both_endcaps = both_endcaps ? both_endcaps : minus_endcap && plus_endcap;
00606 }
00607 }
00608 }
00609 TheCSCHaloData.SetNFlatHaloSegments(maxNSegments);
00610 TheCSCHaloData.SetSegmentsBothEndcaps(both_endcaps);
00611
00612
00613 return TheCSCHaloData;
00614 }
00615