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
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
00212
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
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
00461
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
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
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 }