CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/TrackingTools/TrackAssociator/src/TrackDetMatchInfo.cc

Go to the documentation of this file.
00001 #include <map>
00002 #include "TrackingTools/TrackAssociator/interface/TrackDetMatchInfo.h"
00003 #include "TrackingTools/TrackAssociator/interface/DetIdInfo.h"
00004 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00005 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00006 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00007 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00008 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010 #include "DataFormats/Math/interface/LorentzVector.h"
00011 #include "Math/VectorUtil.h"
00012 #include <algorithm>
00013 
00014 
00016 
00017 std::string TrackDetMatchInfo::dumpGeometry( const DetId& id )
00018 {
00019    if ( ! caloGeometry.isValid() || 
00020         ! caloGeometry->getSubdetectorGeometry(id) ||
00021         ! caloGeometry->getSubdetectorGeometry(id)->getGeometry(id) ) {
00022       throw cms::Exception("FatalError")  << "Failed to access geometry for DetId: " << id.rawId();
00023    }
00024    std::ostringstream oss;
00025 
00026    const CaloCellGeometry::CornersVec& points = caloGeometry->getSubdetectorGeometry(id)->getGeometry(id)->getCorners();
00027    for( CaloCellGeometry::CornersVec::const_iterator point = points.begin();
00028        point != points.end(); ++point)
00029      oss << "(" << point->z() << ", " << point->perp() << ", " << point->eta() << ", " << point->phi() << "), \t";
00030    return oss.str();
00031 }
00032 
00033 
00034 GlobalPoint TrackDetMatchInfo::getPosition( const DetId& id)
00035 {
00036    // this part might be slow
00037    if ( ! caloGeometry.isValid() || 
00038         ! caloGeometry->getSubdetectorGeometry(id) ||
00039         ! caloGeometry->getSubdetectorGeometry(id)->getGeometry(id) ) {
00040       throw cms::Exception("FatalError") << "Failed to access geometry for DetId: " << id.rawId();
00041       return GlobalPoint(0,0,0);
00042    }
00043    return caloGeometry->getSubdetectorGeometry(id)->getGeometry(id)->getPosition();
00044 }
00045 
00046 
00047 double TrackDetMatchInfo::crossedEnergy( EnergyType type )
00048 {
00049    double energy(0);
00050    switch (type) {
00051     case EcalRecHits:
00052         {
00053            for(std::vector<const EcalRecHit*>::const_iterator hit=crossedEcalRecHits.begin(); hit!=crossedEcalRecHits.end(); hit++)
00054              energy += (*hit)->energy();
00055         }
00056       break;
00057     case HcalRecHits:
00058         {
00059            for(std::vector<const HBHERecHit*>::const_iterator hit = crossedHcalRecHits.begin(); hit != crossedHcalRecHits.end(); hit++)
00060              energy += (*hit)->energy();
00061         }
00062       break;
00063     case HORecHits:
00064         {
00065            for(std::vector<const HORecHit*>::const_iterator hit = crossedHORecHits.begin(); hit != crossedHORecHits.end(); hit++)
00066              energy += (*hit)->energy();
00067         }
00068       break;
00069     case TowerTotal:
00070         {
00071            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00072              energy += (*hit)->energy();
00073         }
00074       break;
00075     case TowerEcal:
00076         {
00077            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00078              energy += (*hit)->emEnergy();
00079         }
00080       break;
00081     case TowerHcal:
00082         {
00083            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00084              energy += (*hit)->hadEnergy();
00085         }
00086       break;
00087     case TowerHO:
00088         {
00089            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00090              energy += (*hit)->outerEnergy();
00091         }
00092       break;
00093     default:
00094       throw cms::Exception("FatalError") << "Unknown calo energy type: " << type;
00095    }
00096    return energy;
00097 }
00098 
00099 bool TrackDetMatchInfo::insideCone(const DetId& id, const double dR) {
00100    GlobalPoint idPosition = getPosition(id);
00101    if (idPosition.mag()<0.01) return false;
00102    
00103    math::XYZVector idPositionRoot( idPosition.x(), idPosition.y(), idPosition.z() );
00104    math::XYZVector trackP3( stateAtIP.momentum().x(), stateAtIP.momentum().y(), stateAtIP.momentum().z() );
00105    return ROOT::Math::VectorUtil::DeltaR(trackP3, idPositionRoot) < 0.5;
00106 }
00107 
00108 double TrackDetMatchInfo::coneEnergy( double dR, EnergyType type )
00109 {
00110    double energy(0);
00111    switch (type) {
00112     case EcalRecHits:
00113         {
00114            for(std::vector<const EcalRecHit*>::const_iterator hit=ecalRecHits.begin(); hit!=ecalRecHits.end(); hit++)
00115              if (insideCone((*hit)->detid(),dR)) energy += (*hit)->energy();
00116         }
00117       break;
00118     case HcalRecHits:
00119         {
00120            for(std::vector<const HBHERecHit*>::const_iterator hit = hcalRecHits.begin(); hit != hcalRecHits.end(); hit++)
00121              if (insideCone((*hit)->detid(),dR)) energy += (*hit)->energy();
00122         }
00123       break;
00124     case HORecHits:
00125         {
00126            for(std::vector<const HORecHit*>::const_iterator hit = hoRecHits.begin(); hit != hoRecHits.end(); hit++)
00127              if (insideCone((*hit)->detid(),dR)) energy += (*hit)->energy();
00128         }
00129       break;
00130     case TowerTotal:
00131         {
00132            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00133              if (insideCone((*hit)->id(),dR)) energy += (*hit)->energy();
00134         }
00135       break;
00136     case TowerEcal:
00137         {
00138            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00139              if (insideCone((*hit)->id(),dR)) energy += (*hit)->emEnergy();
00140         }
00141       break;
00142     case TowerHcal:
00143         {
00144            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00145              if (insideCone((*hit)->id(),dR)) energy += (*hit)->hadEnergy();
00146         }
00147       break;
00148     case TowerHO:
00149         {
00150            for(std::vector<const CaloTower*>::const_iterator hit=crossedTowers.begin(); hit!=crossedTowers.end(); hit++)
00151              if (insideCone((*hit)->id(),dR)) energy += (*hit)->outerEnergy();
00152         }
00153       break;
00154     default:
00155       throw cms::Exception("FatalError") << "Unknown calo energy type: " << type;
00156    }
00157    return energy;
00158 }
00159 
00160 
00162 
00163 double TrackDetMatchInfo::nXnEnergy(const DetId& id, EnergyType type, int gridSize)
00164 {
00165    double energy(0);
00166    if ( id.rawId() == 0 ) return 0.;
00167    switch (type)  {
00168     case TowerTotal:
00169     case TowerHcal:
00170     case TowerEcal:
00171     case TowerHO:
00172         {
00173            if ( id.det() != DetId::Calo ) {
00174               throw cms::Exception("FatalError") << "Wrong DetId. Expected CaloTower, but found:\n" <<
00175                 DetIdInfo::info(id)<<"\n";
00176            }
00177            CaloTowerDetId centerId(id);
00178            for(std::vector<const CaloTower*>::const_iterator hit=towers.begin(); hit!=towers.end(); hit++) {
00179               CaloTowerDetId neighborId((*hit)->id());
00180               int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00181                               -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00182               int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00183               if ( abs(72-dPhi) < dPhi ) dPhi = 72-dPhi;
00184               if(  dEta <= gridSize && dPhi <= gridSize ) {
00185                  switch (type) {
00186                   case TowerTotal:
00187                     energy += (*hit)->energy();
00188                     break;
00189                   case TowerEcal:
00190                     energy += (*hit)->emEnergy();
00191                     break;
00192                   case TowerHcal:
00193                     energy += (*hit)->hadEnergy();
00194                     break;
00195                   case TowerHO:
00196                     energy += (*hit)->outerEnergy();
00197                     break;
00198                   default:
00199                     throw cms::Exception("FatalError") << "Unknown calo tower energy type: " << type;
00200                  }
00201               }
00202            }
00203         }
00204       break;
00205     case EcalRecHits:
00206         {
00207            if( id.det() != DetId::Ecal || (id.subdetId() != EcalBarrel && id.subdetId() != EcalEndcap) ) {
00208               throw cms::Exception("FatalError") << "Wrong DetId. Expected EcalBarrel or EcalEndcap, but found:\n" <<
00209                 DetIdInfo::info(id)<<"\n";
00210            }
00211            // Since the ECAL granularity is small and the gap between EE and EB is significant,
00212            // energy is computed only within the system that contains the central element
00213            if( id.subdetId() == EcalBarrel ) {
00214               EBDetId centerId(id);
00215               for(std::vector<const EcalRecHit*>::const_iterator hit=ecalRecHits.begin(); hit!=ecalRecHits.end(); hit++) {
00216                  if ((*hit)->id().subdetId() != EcalBarrel) continue;
00217                  EBDetId neighborId((*hit)->id());
00218                  int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00219                                  -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00220                  int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00221                  if ( abs(360-dPhi) < dPhi ) dPhi = 360-dPhi;
00222                  if(  dEta <= gridSize && dPhi <= gridSize ) {
00223                     energy += (*hit)->energy();
00224                  }
00225               }
00226            } else {
00227               // Endcap
00228               EEDetId centerId(id);
00229               for(std::vector<const EcalRecHit*>::const_iterator hit=ecalRecHits.begin(); hit!=ecalRecHits.end(); hit++) {
00230                  if ((*hit)->id().subdetId() != EcalEndcap) continue;
00231                  EEDetId neighborId((*hit)->id());
00232                  if(  centerId.zside() == neighborId.zside() && 
00233                       abs(centerId.ix()-neighborId.ix()) <= gridSize && 
00234                       abs(centerId.iy()-neighborId.iy()) <= gridSize ) {
00235                     energy += (*hit)->energy();
00236                  }
00237               }
00238            }
00239         }
00240       break;
00241     case HcalRecHits:
00242         {
00243            if( id.det() != DetId::Hcal || (id.subdetId() != HcalBarrel && id.subdetId() != HcalEndcap) ) {
00244               throw cms::Exception("FatalError") << "Wrong DetId. Expected HE or HB, but found:\n" <<
00245                 DetIdInfo::info(id)<<"\n";
00246            }
00247            HcalDetId centerId(id);
00248            for(std::vector<const HBHERecHit*>::const_iterator hit=hcalRecHits.begin(); hit!=hcalRecHits.end(); hit++) {
00249               HcalDetId neighborId((*hit)->id());
00250               int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00251                               -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00252               int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00253               if ( abs(72-dPhi) < dPhi ) dPhi = 72-dPhi;
00254               if(  dEta <= gridSize && dPhi <= gridSize ){
00255                  energy += (*hit)->energy();
00256               }
00257            }
00258         }
00259       break;
00260     case HORecHits:
00261         {
00262            if( id.det() != DetId::Hcal || (id.subdetId() != HcalOuter) ) {
00263               throw cms::Exception("FatalError") << "Wrong DetId. Expected HO, but found:\n" <<
00264                 DetIdInfo::info(id)<<"\n";
00265            }
00266            HcalDetId centerId(id);
00267            for(std::vector<const HORecHit*>::const_iterator hit=hoRecHits.begin(); hit!=hoRecHits.end(); hit++) {
00268               HcalDetId neighborId((*hit)->id());
00269               int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00270                               -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00271               int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00272               if ( abs(72-dPhi) < dPhi ) dPhi = 72-dPhi;
00273               if(  dEta <= gridSize && dPhi <= gridSize ) {
00274                  energy += (*hit)->energy();
00275               }
00276            }
00277         }
00278       break;
00279     default:
00280       throw cms::Exception("FatalError") << "Unkown or not implemented energy type requested, type:" << type;
00281    }
00282    return energy;
00283 }
00284 
00285 double TrackDetMatchInfo::nXnEnergy(EnergyType type, int gridSize)
00286 {
00287    switch (type)  {
00288     case TowerTotal:
00289     case TowerHcal:
00290     case TowerEcal:
00291     case TowerHO:
00292       if( crossedTowerIds.empty() ) return 0;
00293       return nXnEnergy(crossedTowerIds.front(), type, gridSize);
00294       break;
00295     case EcalRecHits:
00296       if( crossedEcalIds.empty() ) return 0;
00297       return nXnEnergy(crossedEcalIds.front(), type, gridSize);
00298       break;
00299     case HcalRecHits:
00300       if( crossedHcalIds.empty() ) return 0;
00301       return nXnEnergy(crossedHcalIds.front(), type, gridSize);
00302       break;
00303     case HORecHits:
00304       if( crossedHOIds.empty() ) return 0;
00305       return nXnEnergy(crossedHOIds.front(), type, gridSize);
00306       break;
00307     default:
00308       throw cms::Exception("FatalError") << "Unkown or not implemented energy type requested, type:" << type;
00309    }
00310    return -999;
00311 }
00312 
00313 
00314 TrackDetMatchInfo::TrackDetMatchInfo():
00315        trkGlobPosAtEcal(0,0,0)
00316      , trkGlobPosAtHcal(0,0,0)
00317      , trkGlobPosAtHO(0,0,0)
00318      , trkMomAtEcal(0,0,0)
00319      , trkMomAtHcal(0,0,0)
00320      , trkMomAtHO(0,0,0)
00321      , isGoodEcal(false)
00322      , isGoodHcal(false)
00323      , isGoodCalo(false)
00324      , isGoodHO(false)
00325      , isGoodMuon(false)
00326      , simTrack(0)
00327      , ecalTrueEnergy(-999)
00328      , hcalTrueEnergy(-999)
00329 {
00330 }
00331 
00332 DetId TrackDetMatchInfo::findMaxDeposition( EnergyType type )
00333 {
00334    DetId id;
00335    float maxEnergy = -9999;
00336    switch (type) {
00337     case EcalRecHits:
00338         {
00339            for(std::vector<const EcalRecHit*>::const_iterator hit=ecalRecHits.begin(); hit!=ecalRecHits.end(); hit++)
00340              if ( (*hit)->energy() > maxEnergy ) {
00341                 maxEnergy = (*hit)->energy();
00342                 id = (*hit)->detid();
00343              }
00344         }
00345       break;
00346     case HcalRecHits:
00347         {
00348            for(std::vector<const HBHERecHit*>::const_iterator hit=hcalRecHits.begin(); hit!=hcalRecHits.end(); hit++)
00349              if ( (*hit)->energy() > maxEnergy ) {
00350                 maxEnergy = (*hit)->energy();
00351                 id = (*hit)->detid();
00352              }
00353         }
00354       break;
00355     case HORecHits:
00356         {
00357            for(std::vector<const HORecHit*>::const_iterator hit=hoRecHits.begin(); hit!=hoRecHits.end(); hit++)
00358              if ( (*hit)->energy() > maxEnergy ) {
00359                 maxEnergy = (*hit)->energy();
00360                 id = (*hit)->detid();
00361              }
00362         }
00363       break;
00364     case TowerTotal:
00365     case TowerEcal:
00366     case TowerHcal:
00367         {
00368            for(std::vector<const CaloTower*>::const_iterator hit=towers.begin(); hit!=towers.end(); hit++)
00369              {
00370                 double energy = 0;
00371                 switch (type) {
00372                  case TowerTotal:
00373                    energy = (*hit)->energy();
00374                    break;
00375                  case TowerEcal:
00376                    energy = (*hit)->emEnergy();
00377                    break;
00378                  case TowerHcal:
00379                    energy = (*hit)->hadEnergy();
00380                    break;
00381                  case TowerHO:
00382                    energy = (*hit)->energy();
00383                    break;
00384                  default:
00385                    throw cms::Exception("FatalError") << "Unknown calo tower energy type: " << type;
00386                 }
00387                 if ( energy > maxEnergy ) {
00388                    maxEnergy = energy;
00389                    id = (*hit)->id();
00390                 }
00391              }
00392         }
00393     default:
00394       throw cms::Exception("FatalError") << "Maximal energy deposition: unkown or not implemented energy type requested, type:" << type;
00395    }
00396    return id;
00397 }
00398 
00399 DetId TrackDetMatchInfo::findMaxDeposition(const DetId& id, EnergyType type, int gridSize)
00400 {
00401    double energy_max(0);
00402    DetId id_max;
00403    if ( id.rawId() == 0 ) return id_max;
00404    switch (type)  {
00405     case TowerTotal:
00406     case TowerHcal:
00407     case TowerEcal:
00408     case TowerHO:
00409         {
00410            if ( id.det() != DetId::Calo ) {
00411               throw cms::Exception("FatalError") << "Wrong DetId. Expected CaloTower, but found:\n" <<
00412                 DetIdInfo::info(id)<<"\n";
00413            }
00414            CaloTowerDetId centerId(id);
00415            for(std::vector<const CaloTower*>::const_iterator hit=towers.begin(); hit!=towers.end(); hit++) {
00416               CaloTowerDetId neighborId((*hit)->id());
00417               int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00418                               -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00419               int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00420               if ( abs(72-dPhi) < dPhi ) dPhi = 72-dPhi;
00421               if(  dEta <= gridSize && dPhi <= gridSize ) {
00422                  switch (type) {
00423                   case TowerTotal:
00424                     if ( energy_max < (*hit)->energy() ){
00425                        energy_max = (*hit)->energy();
00426                        id_max = (*hit)->id();
00427                     }
00428                     break;
00429                   case TowerEcal:
00430                     if ( energy_max < (*hit)->emEnergy() ){
00431                        energy_max = (*hit)->emEnergy();
00432                        id_max = (*hit)->id();
00433                     }
00434                     break;
00435                   case TowerHcal:
00436                     if ( energy_max < (*hit)->hadEnergy() ){
00437                        energy_max = (*hit)->hadEnergy();
00438                        id_max = (*hit)->id();
00439                     }
00440                     break;
00441                   case TowerHO:
00442                     if ( energy_max < (*hit)->outerEnergy() ){
00443                        energy_max = (*hit)->outerEnergy();
00444                        id_max = (*hit)->id();
00445                     }
00446                     break;
00447                   default:
00448                     throw cms::Exception("FatalError") << "Unknown calo tower energy type: " << type;
00449                  }
00450               }
00451            }
00452         }
00453       break;
00454     case EcalRecHits:
00455         {
00456            if( id.det() != DetId::Ecal || (id.subdetId() != EcalBarrel && id.subdetId() != EcalEndcap) ) {
00457               throw cms::Exception("FatalError") << "Wrong DetId. Expected EcalBarrel or EcalEndcap, but found:\n" <<
00458                 DetIdInfo::info(id)<<"\n";
00459            }
00460            // Since the ECAL granularity is small and the gap between EE and EB is significant,
00461            // energy is computed only within the system that contains the central element
00462            if( id.subdetId() == EcalBarrel ) {
00463               EBDetId centerId(id);
00464               for(std::vector<const EcalRecHit*>::const_iterator hit=ecalRecHits.begin(); hit!=ecalRecHits.end(); hit++) {
00465                  if ((*hit)->id().subdetId() != EcalBarrel) continue;
00466                  EBDetId neighborId((*hit)->id());
00467                  int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00468                                  -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00469                  int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00470                  if ( abs(360-dPhi) < dPhi ) dPhi = 360-dPhi;
00471                  if(  dEta <= gridSize && dPhi <= gridSize ) {
00472                     if ( energy_max < (*hit)->energy() ){
00473                        energy_max = (*hit)->energy();
00474                        id_max = (*hit)->id();
00475                     }
00476                  }
00477               }
00478            } else {
00479               // Endcap
00480               EEDetId centerId(id);
00481               for(std::vector<const EcalRecHit*>::const_iterator hit=ecalRecHits.begin(); hit!=ecalRecHits.end(); hit++) {
00482                  if ((*hit)->id().subdetId() != EcalEndcap) continue;
00483                  EEDetId neighborId((*hit)->id());
00484                  if(  centerId.zside() == neighborId.zside() && 
00485                       abs(centerId.ix()-neighborId.ix()) <= gridSize && 
00486                       abs(centerId.iy()-neighborId.iy()) <= gridSize ) {
00487                     if ( energy_max < (*hit)->energy() ){
00488                        energy_max = (*hit)->energy();
00489                        id_max = (*hit)->id();
00490                     }
00491                  }
00492               }
00493            }
00494         }
00495       break;
00496     case HcalRecHits:
00497         {
00498            if( id.det() != DetId::Hcal || (id.subdetId() != HcalBarrel && id.subdetId() != HcalEndcap) ) {
00499               throw cms::Exception("FatalError") << "Wrong DetId. Expected HE or HB, but found:\n" <<
00500                 DetIdInfo::info(id)<<"\n";
00501            }
00502            HcalDetId centerId(id);
00503            for(std::vector<const HBHERecHit*>::const_iterator hit=hcalRecHits.begin(); hit!=hcalRecHits.end(); hit++) {
00504               HcalDetId neighborId((*hit)->id());
00505               int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00506                               -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00507               int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00508               if ( abs(72-dPhi) < dPhi ) dPhi = 72-dPhi;
00509               if(  dEta <= gridSize && dPhi <= gridSize ){
00510                  if ( energy_max < (*hit)->energy() ){
00511                     energy_max = (*hit)->energy();
00512                     id_max = (*hit)->id();
00513                  }
00514               }
00515            }
00516         }
00517       break;
00518     case HORecHits:
00519         {
00520            if( id.det() != DetId::Hcal || (id.subdetId() != HcalOuter) ) {
00521               throw cms::Exception("FatalError") << "Wrong DetId. Expected HO, but found:\n" <<
00522                 DetIdInfo::info(id)<<"\n";
00523            }
00524            HcalDetId centerId(id);
00525            for(std::vector<const HORecHit*>::const_iterator hit=hoRecHits.begin(); hit!=hoRecHits.end(); hit++) {
00526               HcalDetId neighborId((*hit)->id());
00527               int dEta = abs( (centerId.ieta()<0?centerId.ieta()+1:centerId.ieta() )
00528                               -(neighborId.ieta()<0?neighborId.ieta()+1:neighborId.ieta() ) ) ;
00529               int dPhi = abs( centerId.iphi()-neighborId.iphi() );
00530               if ( abs(72-dPhi) < dPhi ) dPhi = 72-dPhi;
00531               if(  dEta <= gridSize && dPhi <= gridSize ) {
00532                  if ( energy_max < (*hit)->energy() ){
00533                     energy_max = (*hit)->energy();
00534                     id_max = (*hit)->id();
00535                  }
00536               }
00537            }
00538         }
00539       break;
00540     default:
00541       throw cms::Exception("FatalError") << "Unkown or not implemented energy type requested, type:" << type;
00542    }
00543    return id_max;
00544 }
00545 
00546 DetId TrackDetMatchInfo::findMaxDeposition(EnergyType type, int gridSize)
00547 {
00548    DetId id_max;
00549    switch (type)  {
00550     case TowerTotal:
00551     case TowerHcal:
00552     case TowerEcal:
00553     case TowerHO:
00554       if( crossedTowerIds.empty() ) return id_max;
00555       return findMaxDeposition(crossedTowerIds.front(), type, gridSize);
00556       break;
00557     case EcalRecHits:
00558       if( crossedEcalIds.empty() ) return id_max;
00559       return findMaxDeposition(crossedEcalIds.front(), type, gridSize);
00560       break;
00561     case HcalRecHits:
00562       if( crossedHcalIds.empty() ) return id_max;
00563       return findMaxDeposition(crossedHcalIds.front(), type, gridSize);
00564       break;
00565     case HORecHits:
00566       if( crossedHOIds.empty() ) return id_max;
00567       return findMaxDeposition(crossedHOIds.front(), type, gridSize);
00568       break;
00569     default:
00570       throw cms::Exception("FatalError") << "Unkown or not implemented energy type requested, type:" << type;
00571    }
00572    return id_max;
00573 }
00574 
00576 // Obsolete
00577 //
00578 
00579 
00580 
00581 double TrackDetMatchInfo::ecalConeEnergy()
00582 {
00583    return coneEnergy (999, EcalRecHits );
00584 }
00585 
00586 double TrackDetMatchInfo::hcalConeEnergy()
00587 {
00588    return coneEnergy (999, HcalRecHits );
00589 }
00590 
00591 double TrackDetMatchInfo::hoConeEnergy()
00592 {
00593    return coneEnergy (999, HcalRecHits );
00594 }
00595 
00596 double TrackDetMatchInfo::ecalCrossedEnergy()
00597 {
00598    return crossedEnergy( EcalRecHits );
00599 }
00600 
00601 double TrackDetMatchInfo::hcalCrossedEnergy()
00602 {
00603    return crossedEnergy( HcalRecHits );
00604 }
00605 
00606 double TrackDetMatchInfo::hoCrossedEnergy()
00607 {
00608    return crossedEnergy( HORecHits );
00609 }
00610       
00611       
00612 int TrackDetMatchInfo::numberOfSegments() const {
00613    int numSegments = 0;
00614    for(std::vector<TAMuonChamberMatch>::const_iterator chamber=chambers.begin(); chamber!=chambers.end(); chamber++)
00615      numSegments += chamber->segments.size();
00616    return numSegments;
00617 }
00618 
00619 int TrackDetMatchInfo::numberOfSegmentsInStation(int station) const {
00620    int numSegments = 0;
00621    for(std::vector<TAMuonChamberMatch>::const_iterator chamber=chambers.begin(); chamber!=chambers.end(); chamber++)
00622      if(chamber->station()==station) numSegments += chamber->segments.size();
00623    return numSegments;
00624 }
00625 
00626 int TrackDetMatchInfo::numberOfSegmentsInStation(int station, int detector) const {
00627    int numSegments = 0;
00628    for(std::vector<TAMuonChamberMatch>::const_iterator chamber=chambers.begin(); chamber!=chambers.end(); chamber++)
00629      if(chamber->station()==station&&chamber->detector()==detector) numSegments += chamber->segments.size();
00630    return numSegments;
00631 }
00632 
00633 int TrackDetMatchInfo::numberOfSegmentsInDetector(int detector) const {
00634    int numSegments = 0;
00635    for(std::vector<TAMuonChamberMatch>::const_iterator chamber=chambers.begin(); chamber!=chambers.end(); chamber++)
00636      if(chamber->detector()==detector) numSegments += chamber->segments.size();
00637    return numSegments;
00638 }