00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "Calibration/Tools/interface/TrackAssociator.h"
00022
00023
00024
00025
00026 #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
00027 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00028 #include "DataFormats/DetId/interface/DetId.h"
00029 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00030
00031
00032 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00033
00034
00035
00036
00037 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00038
00039 #include "TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixPropagator.h"
00040 #include "Utilities/Timing/interface/TimingReport.h"
00041 #include <stack>
00042 #include <set>
00043
00044
00045 #include "Calibration/Tools/interface/TimerStack.h"
00046
00047
00048
00049
00050
00051
00052 using namespace reco;
00053
00054 HTrackAssociator::HTrackAssociator()
00055 {
00056 ivProp_ = 0;
00057 defProp_ = 0;
00058 debug_ = 0;
00059 caloTowerMap_ = 0;
00060 useDefaultPropagator_ = false;
00061 }
00062
00063 HTrackAssociator::~HTrackAssociator()
00064 {
00065 if (defProp_) delete defProp_;
00066 }
00067
00068
00069 void HTrackAssociator::addDataLabels( const std::string className,
00070 const std::string moduleLabel,
00071 const std::string productInstanceLabel)
00072 {
00073 if (className == "EBRecHitCollection")
00074 {
00075 EBRecHitCollectionLabels.clear();
00076 EBRecHitCollectionLabels.push_back(moduleLabel);
00077 EBRecHitCollectionLabels.push_back(productInstanceLabel);
00078 }
00079 if (className == "EERecHitCollection")
00080 {
00081 EERecHitCollectionLabels.clear();
00082 EERecHitCollectionLabels.push_back(moduleLabel);
00083 EERecHitCollectionLabels.push_back(productInstanceLabel);
00084 }
00085 if (className == "HBHERecHitCollection")
00086 {
00087 HBHERecHitCollectionLabels.clear();
00088 HBHERecHitCollectionLabels.push_back(moduleLabel);
00089 HBHERecHitCollectionLabels.push_back(productInstanceLabel);
00090 }
00091 if (className == "CaloTowerCollection")
00092 {
00093 CaloTowerCollectionLabels.clear();
00094 CaloTowerCollectionLabels.push_back(moduleLabel);
00095 CaloTowerCollectionLabels.push_back(productInstanceLabel);
00096 }
00097 }
00098
00099
00100
00101 void HTrackAssociator::setPropagator( Propagator* ptr)
00102 {
00103 ivProp_ = ptr;
00104 caloDetIdAssociator_.setPropagator(ivProp_);
00105 ecalDetIdAssociator_.setPropagator(ivProp_);
00106 hcalDetIdAssociator_.setPropagator(ivProp_);
00107 }
00108
00109
00110 void HTrackAssociator::useDefaultPropagator()
00111 {
00112 useDefaultPropagator_ = true;
00113 }
00114
00115
00116
00117 void HTrackAssociator::init( const edm::EventSetup& iSetup )
00118 {
00119
00120 iSetup.get<CaloGeometryRecord>().get(theCaloGeometry_);
00121 if (!theCaloGeometry_.isValid())
00122 throw cms::Exception("FatalError") << "Unable to find IdealGeometryRecord in event!\n";
00123
00124 if (useDefaultPropagator_ && ! defProp_ ) {
00125
00126 edm::ESHandle<MagneticField> bField;
00127 iSetup.get<IdealMagneticFieldRecord>().get(bField);
00128
00129 SteppingHelixPropagator* prop = new SteppingHelixPropagator(&*bField,anyDirection);
00130 prop->setMaterialMode(false);
00131 prop->applyRadX0Correction(true);
00132
00133 defProp_ = prop;
00134 setPropagator(defProp_);
00135 }
00136
00137
00138 }
00139
00140
00141 HTrackDetMatchInfo HTrackAssociator::associate( const edm::Event& iEvent,
00142 const edm::EventSetup& iSetup,
00143 const FreeTrajectoryState& trackOrigin,
00144 const HAssociatorParameters& parameters )
00145 {
00146 HTrackDetMatchInfo info;
00147 using namespace edm;
00148 HTimerStack timers;
00149
00150 init( iSetup );
00151
00152 FreeTrajectoryState currentPosition(trackOrigin);
00153
00154 if (parameters.useEcal) fillEcal( iEvent, iSetup, info, currentPosition,parameters.idREcal, parameters.dREcal);
00155 if (parameters.useHcal) fillHcal( iEvent, iSetup, info, currentPosition,parameters.idRHcal,parameters.dRHcal);
00156 if (parameters.useCalo) fillCaloTowers( iEvent, iSetup, info, currentPosition,parameters.idRCalo,parameters.dRCalo);
00157
00158 return info;
00159 }
00160
00161
00162 std::vector<EcalRecHit> HTrackAssociator::associateEcal( const edm::Event& iEvent,
00163 const edm::EventSetup& iSetup,
00164 const FreeTrajectoryState& trackOrigin,
00165 const double dR )
00166 {
00167 HAssociatorParameters parameters;
00168 parameters.useHcal = false;
00169 parameters.dREcal = dR;
00170 HTrackDetMatchInfo info( associate(iEvent, iSetup, trackOrigin, parameters ));
00171 if (dR>0)
00172 return info.coneEcalRecHits;
00173 else
00174 return info.crossedEcalRecHits;
00175 }
00176
00177
00178 double HTrackAssociator::getEcalEnergy( const edm::Event& iEvent,
00179 const edm::EventSetup& iSetup,
00180 const FreeTrajectoryState& trackOrigin,
00181 const double dR )
00182 {
00183 HAssociatorParameters parameters;
00184 parameters.useHcal = false;
00185 parameters.dREcal = dR;
00186 HTrackDetMatchInfo info = associate(iEvent, iSetup, trackOrigin, parameters );
00187 if(dR>0)
00188 return info.ecalConeEnergyFromRecHits();
00189 else
00190 return info.ecalEnergyFromRecHits();
00191 }
00192
00193
00194 std::vector<CaloTower> HTrackAssociator::associateHcal( const edm::Event& iEvent,
00195 const edm::EventSetup& iSetup,
00196 const FreeTrajectoryState& trackOrigin,
00197 const double dR )
00198 {
00199 HAssociatorParameters parameters;
00200 parameters.useEcal = false;
00201 parameters.dRHcal = dR;
00202 HTrackDetMatchInfo info( associate(iEvent, iSetup, trackOrigin, parameters ));
00203 if (dR>0)
00204 return info.coneTowers;
00205 else
00206 return info.crossedTowers;
00207
00208 }
00209
00210
00211 double HTrackAssociator::getHcalEnergy( const edm::Event& iEvent,
00212 const edm::EventSetup& iSetup,
00213 const FreeTrajectoryState& trackOrigin,
00214 const double dR )
00215 {
00216 HAssociatorParameters parameters;
00217 parameters.useEcal = false;
00218 parameters.dRHcal = dR;
00219 HTrackDetMatchInfo info( associate(iEvent, iSetup, trackOrigin, parameters ));
00220 if (dR>0)
00221 return info.hcalConeEnergyFromRecHits();
00222 else
00223 return info.hcalEnergyFromRecHits();
00224 }
00225
00226
00227 void HTrackAssociator::fillEcal( const edm::Event& iEvent,
00228 const edm::EventSetup& iSetup,
00229 HTrackDetMatchInfo& info,
00230 const FreeTrajectoryState& trajectoryPoint,
00231 const int idR,
00232 const double dR)
00233 {
00234 HTimerStack timers;
00235 timers.push("HTrackAssociator::fillEcal");
00236
00237 ecalDetIdAssociator_.setGeometry(&*theCaloGeometry_);
00238
00239 timers.push("HTrackAssociator::fillEcal::propagation");
00240
00241 std::vector<GlobalPoint> ecalPoints;
00242 ecalPoints.push_back(GlobalPoint(135.,0,310.));
00243 ecalPoints.push_back(GlobalPoint(150.,0,340.));
00244 ecalPoints.push_back(GlobalPoint(170.,0,370.));
00245
00246 std::vector<GlobalPoint> ecalTrajectory = ecalDetIdAssociator_.getTrajectory(trajectoryPoint, ecalPoints);
00247
00248
00249 if(ecalTrajectory.empty()) {
00250 LogTrace("HTrackAssociator::fillEcal") << "Failed to propagate a track to ECAL; moving on\n";
00251 info.isGoodEcal = 0;
00252 return;
00253 }
00254
00255 info.isGoodEcal = 1;
00256
00257 info.trkGlobPosAtEcal = getPoint(ecalTrajectory[0]);
00258
00259
00260 timers.pop_and_push("HTrackAssociator::fillEcal::access::EcalBarrel");
00261 edm::Handle<EBRecHitCollection> EBRecHits;
00262 edm::Handle<EERecHitCollection> EERecHits;
00263
00264
00265
00266 iEvent.getByLabel (EBRecHitCollectionLabels[0], EBRecHitCollectionLabels[1], EBRecHits);
00267
00268 if (EERecHitCollectionLabels[1]!=EBRecHitCollectionLabels[1]) iEvent.getByLabel (EERecHitCollectionLabels[0], EERecHitCollectionLabels[1], EERecHits);
00269
00270
00271 timers.pop_and_push("HTrackAssociator::fillEcal::matching");
00272 std::set<DetId> ecalIdsInRegion = ecalDetIdAssociator_.getDetIdsCloseToAPoint(ecalTrajectory[0],idR);
00273 std::set<DetId> ecalIdsInACone = ecalDetIdAssociator_.getDetIdsInACone(ecalIdsInRegion, ecalTrajectory, dR);
00274 std::set<DetId> crossedEcalIds = ecalDetIdAssociator_.getCrossedDetIds(ecalIdsInRegion, ecalTrajectory);
00275
00276
00277 timers.pop_and_push("HTrackAssociator::fillEcal::addEcalRecHits");
00278 for(std::set<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++) {
00279 std::vector<EcalRecHit>::const_iterator hit = (*EBRecHits).find(*itr);
00280 if(hit != (*EBRecHits).end())
00281 info.crossedEcalRecHits.push_back(*hit);
00282 else
00283 LogTrace("HTrackAssociator::fillEcal") << "EcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00284 }
00285 for(std::set<DetId>::const_iterator itr=ecalIdsInACone.begin(); itr!=ecalIdsInACone.end();itr++) {
00286 std::vector<EcalRecHit>::const_iterator hit = (*EBRecHits).find(*itr);
00287 if(hit != (*EBRecHits).end()) {
00288 info.coneEcalRecHits.push_back(*hit);
00289 }
00290 else
00291 LogTrace("HTrackAssociator::fillEcal") << "EcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00292 }
00293 if (EERecHitCollectionLabels[1]==EBRecHitCollectionLabels[1])return;
00294 for(std::set<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++) {
00295 std::vector<EcalRecHit>::const_iterator hit = (*EERecHits).find(*itr);
00296 if(hit != (*EERecHits).end())
00297 info.crossedEcalRecHits.push_back(*hit);
00298 else
00299 LogTrace("HTrackAssociator::fillEcal") << "EcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00300 }
00301 for(std::set<DetId>::const_iterator itr=ecalIdsInACone.begin(); itr!=ecalIdsInACone.end();itr++) {
00302 std::vector<EcalRecHit>::const_iterator hit = (*EERecHits).find(*itr);
00303 if(hit != (*EERecHits).end()) {
00304 info.coneEcalRecHits.push_back(*hit);
00305 }
00306 else
00307 LogTrace("HTrackAssociator::fillEcal") << "EcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00308 }
00309 }
00310
00311
00312 void HTrackAssociator::fillCaloTowers( const edm::Event& iEvent,
00313 const edm::EventSetup& iSetup,
00314 HTrackDetMatchInfo& info,
00315 const FreeTrajectoryState& trajectoryPoint,
00316 const int idR,
00317 const double dR)
00318 {
00319
00320 HTimerStack timers;
00321 timers.push("HTrackAssociator::fillCaloTowers");
00322
00323 caloDetIdAssociator_.setGeometry(&*theCaloGeometry_);
00324
00325
00326 timers.push("HTrackAssociator::fillCaloTowers::propagation");
00327 std::vector<GlobalPoint> hcalPoints;
00328 hcalPoints.push_back(GlobalPoint(135.,0,310.));
00329 hcalPoints.push_back(GlobalPoint(150.,0,340.));
00330 hcalPoints.push_back(GlobalPoint(170.,0,370.));
00331 hcalPoints.push_back(GlobalPoint(190.,0,400.));
00332 hcalPoints.push_back(GlobalPoint(240.,0,500.));
00333 hcalPoints.push_back(GlobalPoint(280.,0,550.));
00334
00335 std::vector<GlobalPoint> hcalTrajectory = caloDetIdAssociator_.getTrajectory(trajectoryPoint, hcalPoints);
00336
00337
00338 if(hcalTrajectory.empty()) {
00339 LogTrace("HTrackAssociator::fillEcal") << "Failed to propagate a track to ECAL; moving on\n";
00340 info.isGoodCalo = 0;
00341 info.isGoodEcal = 0;
00342 std::cout<<" HTrackAssociator::fillCaloTowers::Failed to propagate a track to ECAL "<<std::endl;
00343 return;
00344 }
00345
00346 info.isGoodCalo = 1;
00347 info.isGoodEcal = 1;
00348 info.trkGlobPosAtEcal = getPoint(hcalTrajectory[0]);
00349
00350 if(hcalTrajectory.size()<4) {
00351 LogTrace("HTrackAssociator::fillEcal") << "Failed to propagate a track to HCAL; moving on\n";
00352 info.isGoodHcal = 0;
00353 }
00354
00355 info.isGoodHcal = 1;
00356
00357 info.trkGlobPosAtHcal = getPoint(hcalTrajectory[4]);
00358
00359
00360 timers.pop_and_push("HTrackAssociator::fillCaloTowers::access::CaloTowers");
00361 edm::Handle<CaloTowerCollection> caloTowers;
00362
00363 if (CaloTowerCollectionLabels.empty())
00364 throw cms::Exception("FatalError") << "Module lable is not set for CaloTowers.\n";
00365 else
00366 iEvent.getByLabel (CaloTowerCollectionLabels[0], CaloTowerCollectionLabels[1], caloTowers);
00367 if (!caloTowers.isValid()) throw cms::Exception("FatalError") << "Unable to find CaloTowers in event!\n";
00368
00369 timers.push("HTrackAssociator::fillCaloTowers::matching");
00370
00371
00372
00373 std::set<DetId> caloTowerIdsInRegion = caloDetIdAssociator_.getDetIdsCloseToAPoint(hcalTrajectory[0],idR);
00374
00375 std::set<DetId> caloTowerIdsInACone;
00376 std::set<DetId> crossedCaloTowerIds;
00377 std::set<DetId> caloTowerIdsInBox;
00378 caloTowerIdsInACone = caloDetIdAssociator_.getDetIdsInACone(caloTowerIdsInRegion, hcalTrajectory, dR);
00379
00380 crossedCaloTowerIds = caloDetIdAssociator_.getMaxEDetId(caloTowerIdsInRegion, caloTowers);
00381
00382 caloTowerIdsInBox = caloDetIdAssociator_.getDetIdsInACone(crossedCaloTowerIds, hcalTrajectory, -1.);
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402 timers.push("HTrackAssociator::fillCaloTowers::addCaloTowers");
00403 for(std::set<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
00404 {
00405 DetId id(*itr);
00406 CaloTowerCollection::const_iterator tower = (*caloTowers).find(id);
00407 if(tower != (*caloTowers).end())
00408 info.crossedTowers.push_back(*tower);
00409 else
00410 LogTrace("HTrackAssociator::fillEcal") << "CaloTower is not found for DetId: " << id.rawId() << "\n";
00411 }
00412
00413 for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
00414 {
00415 DetId id(*itr);
00416 CaloTowerCollection::const_iterator tower = (*caloTowers).find(id);
00417 if(tower != (*caloTowers).end()) {
00418 info.coneTowers.push_back(*tower);
00419 }
00420 else
00421 LogTrace("HTrackAssociator::fillEcal") << "CaloTower is not found for DetId: " << id.rawId() << "\n";
00422 }
00423
00424 for(std::set<DetId>::const_iterator itr=caloTowerIdsInBox.begin(); itr!=caloTowerIdsInBox.end();itr++)
00425 {
00426 DetId id(*itr);
00427 CaloTowerCollection::const_iterator tower = (*caloTowers).find(id);
00428 if(tower != (*caloTowers).end()) {
00429 info.boxTowers.push_back(*tower);
00430 }
00431 else
00432 LogTrace("HTrackAssociator::fillEcal") << "CaloTower is not found for DetId: " << id.rawId() << "\n";
00433 }
00434
00435 for(std::set<DetId>::const_iterator itr=caloTowerIdsInRegion.begin(); itr!=caloTowerIdsInRegion.end();itr++)
00436 {
00437 DetId id(*itr);
00438 CaloTowerCollection::const_iterator tower = (*caloTowers).find(id);
00439 if(tower != (*caloTowers).end()) {
00440 info.regionTowers.push_back(*tower);
00441 }
00442 else
00443 LogTrace("HTrackAssociator::fillEcal") << "CaloTower is not found for DetId: " << id.rawId() << "\n";
00444 }
00445
00446 }
00447
00448
00449 void HTrackAssociator::fillHcal( const edm::Event& iEvent,
00450 const edm::EventSetup& iSetup,
00451 HTrackDetMatchInfo& info,
00452 const FreeTrajectoryState& trajectoryPoint,
00453 const int idR,
00454 const double dR) {
00455 HTimerStack timers;
00456 timers.push("HTrackAssociator::fillHcal");
00457
00458 hcalDetIdAssociator_.setGeometry(&*theCaloGeometry_);
00459
00460
00461 timers.push("HTrackAssociator::fillHcal::propagation");
00462 std::vector<GlobalPoint> hcalPoints;
00463 hcalPoints.push_back(GlobalPoint(190.,0,400.));
00464 hcalPoints.push_back(GlobalPoint(240.,0,500.));
00465 hcalPoints.push_back(GlobalPoint(280.,0,550.));
00466
00467 std::vector<GlobalPoint> hcalTrajectory = hcalDetIdAssociator_.getTrajectory(trajectoryPoint, hcalPoints);
00468
00469
00470 if(hcalTrajectory.empty()) {
00471 LogTrace("HTrackAssociator::fillHcal") << "Failed to propagate a track to HCAL; moving on\n";
00472 info.isGoodHcal = 0;
00473
00474 return;
00475 }
00476
00477 info.isGoodHcal = 1;
00478
00479 info.trkGlobPosAtHcal = getPoint(hcalTrajectory[0]);
00480 timers.pop_and_push("HTrackAssociator::fillHcal::access::Hcal");
00481
00482 edm::Handle<HBHERecHitCollection> HBHERecHits;
00483
00484
00485
00486 iEvent.getByLabel (HBHERecHitCollectionLabels[0], HBHERecHitCollectionLabels[1], HBHERecHits);
00487 if (!HBHERecHits.isValid()) throw cms::Exception("FatalError") << "Unable to find HBHERecHitCollection in event!\n";
00488
00489 timers.pop_and_push("HTrackAssociator::fillHcal::matching");
00490
00491
00492
00493 std::set<DetId> hcalIdsInRegion = hcalDetIdAssociator_.getDetIdsCloseToAPoint(hcalTrajectory[0],idR);
00494
00495 std::set<DetId> hcalIdsInACone;
00496 std::set<DetId> crossedHcalIds;
00497 std::set<DetId> hcalIdsInBox;
00498 hcalIdsInACone = hcalDetIdAssociator_.getDetIdsInACone(hcalIdsInRegion, hcalTrajectory, dR);
00499
00500 crossedHcalIds = hcalDetIdAssociator_.getMaxEDetId(hcalIdsInRegion, HBHERecHits);
00501
00502 hcalIdsInBox = hcalDetIdAssociator_.getDetIdsInACone(crossedHcalIds, hcalTrajectory, -1.);
00503
00504
00505 timers.pop_and_push("HTrackAssociator::fillHcal::addHcalRecHits");
00506 for(std::set<DetId>::const_iterator itr=crossedHcalIds.begin(); itr!=crossedHcalIds.end();itr++) {
00507 std::vector<HBHERecHit>::const_iterator hit = (*HBHERecHits).find(*itr);
00508 if(hit != (*HBHERecHits).end())
00509 info.crossedHcalRecHits.push_back(*hit);
00510 else
00511 LogTrace("HTrackAssociator::fillHcal") << "HcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00512 }
00513 for(std::set<DetId>::const_iterator itr=hcalIdsInACone.begin(); itr!=hcalIdsInACone.end();itr++) {
00514 std::vector<HBHERecHit>::const_iterator hit = (*HBHERecHits).find(*itr);
00515 if(hit != (*HBHERecHits).end())
00516 info.coneHcalRecHits.push_back(*hit);
00517 else
00518 LogTrace("HTrackAssociator::fillHcal") << "HcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00519 }
00520 for(std::set<DetId>::const_iterator itr=hcalIdsInBox.begin(); itr!=hcalIdsInBox.end();itr++) {
00521 std::vector<HBHERecHit>::const_iterator hit = (*HBHERecHits).find(*itr);
00522 if(hit != (*HBHERecHits).end())
00523 info.boxHcalRecHits.push_back(*hit);
00524 else
00525 LogTrace("HTrackAssociator::fillHcal") << "HcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00526 }
00527 for(std::set<DetId>::const_iterator itr=hcalIdsInRegion.begin(); itr!=hcalIdsInRegion.end();itr++) {
00528 std::vector<HBHERecHit>::const_iterator hit = (*HBHERecHits).find(*itr);
00529 if(hit != (*HBHERecHits).end())
00530 info.regionHcalRecHits.push_back(*hit);
00531 else
00532 LogTrace("HTrackAssociator::fillHcal") << "HcalRecHit is not found for DetId: " << itr->rawId() <<"\n";
00533 }
00534 }
00535
00536
00537 void HTrackAssociator::fillHcalTowers( const edm::Event& iEvent,
00538 const edm::EventSetup& iSetup,
00539 HTrackDetMatchInfo& info,
00540 const FreeTrajectoryState& trajectoryPoint,
00541 const int idR,
00542 const double dR)
00543 {
00544
00545 HTimerStack timers;
00546 timers.push("HTrackAssociator::fillCaloTowers");
00547
00548 caloDetIdAssociator_.setGeometry(&*theCaloGeometry_);
00549
00550
00551 timers.push("HTrackAssociator::fillCaloTowers::propagation");
00552 std::vector<GlobalPoint> hcalPoints;
00553 hcalPoints.push_back(GlobalPoint(190.,0,400.));
00554 hcalPoints.push_back(GlobalPoint(240.,0,500.));
00555 hcalPoints.push_back(GlobalPoint(280.,0,550.));
00556
00557 std::vector<GlobalPoint> hcalTrajectory = caloDetIdAssociator_.getTrajectory(trajectoryPoint, hcalPoints);
00558
00559
00560 if(hcalTrajectory.empty()) {
00561 LogTrace("HTrackAssociator::fillEcal") << "Failed to propagate a track to HCAL; moving on\n";
00562 info.isGoodCalo = 0;
00563 std::cout<<" HTrackAssociator::fillCaloTowers::Failed to propagate a track to HCAL "<<std::endl;
00564 return;
00565 }
00566
00567 info.isGoodCalo = 1;
00568
00569 info.trkGlobPosAtHcal = getPoint(hcalTrajectory[0]);
00570
00571
00572 timers.pop_and_push("HTrackAssociator::fillCaloTowers::access::CaloTowers");
00573 edm::Handle<CaloTowerCollection> caloTowers;
00574
00575 if (CaloTowerCollectionLabels.empty())
00576 throw cms::Exception("FatalError") << "Module lable is not set for CaloTowers.\n";
00577 else
00578 iEvent.getByLabel (CaloTowerCollectionLabels[0], CaloTowerCollectionLabels[1], caloTowers);
00579 if (!caloTowers.isValid()) throw cms::Exception("FatalError") << "Unable to find CaloTowers in event!\n";
00580
00581 timers.push("HTrackAssociator::fillCaloTowers::matching");
00582
00583
00584 std::set<DetId> caloTowerIdsInBigRegion = caloDetIdAssociator_.getDetIdsCloseToAPoint(hcalTrajectory[0],idR+1);
00585 std::set<DetId> caloTowerIdsInRegion = caloDetIdAssociator_.getDetIdsCloseToAPoint(hcalTrajectory[0],idR);
00586
00587 std::set<DetId> caloTowerIdsInACone;
00588 std::set<DetId> crossedCaloTowerIds;
00589 std::set<DetId> caloTowerIdsInBox;
00590 caloTowerIdsInACone = caloDetIdAssociator_.getDetIdsInACone(caloTowerIdsInBigRegion, hcalTrajectory, dR);
00591
00592 crossedCaloTowerIds = caloDetIdAssociator_.getMaxEDetId(caloTowerIdsInRegion, caloTowers);
00593
00594 caloTowerIdsInBox = caloDetIdAssociator_.getDetIdsInACone(crossedCaloTowerIds, hcalTrajectory, -1.);
00595
00596
00597 timers.push("HTrackAssociator::fillCaloTowers::addCaloTowers");
00598 for(std::set<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
00599 {
00600 DetId id(*itr);
00601 CaloTowerCollection::const_iterator tower = (*caloTowers).find(id);
00602 if(tower != (*caloTowers).end())
00603 info.crossedTowers.push_back(*tower);
00604 else
00605 LogTrace("HTrackAssociator::fillEcal") << "CaloTower is not found for DetId: " << id.rawId() << "\n";
00606 }
00607
00608 for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
00609 {
00610 DetId id(*itr);
00611 CaloTowerCollection::const_iterator tower = (*caloTowers).find(id);
00612 if(tower != (*caloTowers).end())
00613 info.coneTowers.push_back(*tower);
00614 else
00615 LogTrace("HTrackAssociator::fillEcal") << "CaloTower is not found for DetId: " << id.rawId() << "\n";
00616 }
00617
00618 }
00619
00620
00621 FreeTrajectoryState HTrackAssociator::getFreeTrajectoryState( const edm::EventSetup& iSetup,
00622 const SimTrack& track,
00623 const SimVertex& vertex )
00624 {
00625 edm::ESHandle<MagneticField> bField;
00626 iSetup.get<IdealMagneticFieldRecord>().get(bField);
00627
00628 GlobalVector vector( track.momentum().x(), track.momentum().y(), track.momentum().z() );
00629
00630 GlobalPoint point( vertex.position().x()*.1, vertex.position().y()*.1, vertex.position().z()*.1 );
00631 int charge = track.type( )> 0 ? -1 : 1;
00632 GlobalTrajectoryParameters tPars(point, vector, charge, &*bField);
00633
00634 CLHEP::HepSymMatrix covT(6,1); covT *= 1e-6;
00635 CartesianTrajectoryError tCov(covT);
00636
00637 return FreeTrajectoryState(tPars, tCov);
00638 }
00639
00640
00641 FreeTrajectoryState HTrackAssociator::getFreeTrajectoryState( const edm::EventSetup& iSetup,
00642 const reco::Track& track )
00643 {
00644 edm::ESHandle<MagneticField> bField;
00645 iSetup.get<IdealMagneticFieldRecord>().get(bField);
00646
00647 GlobalVector vector( track.momentum().x(), track.momentum().y(), track.momentum().z() );
00648
00649 GlobalPoint point( track.vertex().x(), track.vertex().y(), track.vertex().z() );
00650
00651 GlobalTrajectoryParameters tPars(point, vector, track.charge(), &*bField);
00652
00653
00654
00655
00656 CLHEP::HepSymMatrix covT(6,1); covT *= 1e-6;
00657 CartesianTrajectoryError tCov(covT);
00658
00659 return FreeTrajectoryState(tPars, tCov);
00660 }
00661