Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "DataFormats/DetId/interface/DetId.h"
00007 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00008 #include "DataFormats/CaloTowers/interface/CaloTower.h"
00009 #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
00010 #include "DataFormats/HcalRecHit/interface/HBHERecHit.h"
00011 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00012 #include "FWCore/Framework/interface/Event.h"
00013 #include "FWCore/Framework/interface/EventSetup.h"
00014 #include "FWCore/Framework/interface/MakerMacros.h"
00015 #include "DataFormats/Common/interface/Handle.h"
00016 #include "FWCore/Framework/interface/ESHandle.h"
00017 #include "DataFormats/Common/interface/OrphanHandle.h"
00018
00019 #include "DataFormats/GeometrySurface/interface/Cylinder.h"
00020 #include "DataFormats/GeometrySurface/interface/Plane.h"
00021 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00022 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00023 #include "FWCore/Utilities/interface/Exception.h"
00024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00025
00026 #include <set>
00027 #include <vector>
00028
00029
00030 class HDetIdAssociator{
00031 public:
00032 HDetIdAssociator():theMap_(0),nPhi_(0),nEta_(0),etaBinSize_(0),ivProp_(0){};
00033 HDetIdAssociator(const int nPhi, const int nEta, const double etaBinSize)
00034 :theMap_(0),nPhi_(nPhi),nEta_(nEta),etaBinSize_(etaBinSize),ivProp_(0){};
00035
00036 virtual ~HDetIdAssociator(){};
00037 virtual std::vector<GlobalPoint> getTrajectory( const FreeTrajectoryState&,
00038 const std::vector<GlobalPoint>&);
00039
00040
00041 virtual std::set<DetId> getDetIdsCloseToAPoint(const GlobalPoint&,
00042 const int idR = 0);
00043
00044 virtual std::set<DetId> getDetIdsCloseToAPoint(const GlobalPoint& point,
00045 const double dR = 0)
00046 {
00047 int etaIdR = int(dR/etaBinSize_);
00048 int phiIdR = int(dR/(2*3.1416)*nPhi_);
00049 if (etaIdR>phiIdR)
00050 return getDetIdsCloseToAPoint(point, 1+etaIdR);
00051 else
00052 return getDetIdsCloseToAPoint(point, 1+phiIdR);
00053 }
00054
00055 virtual std::set<DetId> getDetIdsInACone(const std::set<DetId>&,
00056 const std::vector<GlobalPoint>& trajectory,
00057 const double );
00058 virtual std::set<DetId> getCrossedDetIds(const std::set<DetId>&,
00059 const std::vector<GlobalPoint>& trajectory);
00060 virtual std::set<DetId> getMaxEDetId(const std::set<DetId>&,
00061 edm::Handle<CaloTowerCollection> caloTowers);
00062 virtual std::set<DetId> getMaxEDetId(const std::set<DetId>&,
00063 edm::Handle<HBHERecHitCollection> recHits);
00064
00065 virtual int iEta (const GlobalPoint&);
00066 virtual int iPhi (const GlobalPoint&);
00067 virtual void setPropagator(Propagator* ptr){ ivProp_ = ptr; };
00068
00069 protected:
00070 virtual void check_setup()
00071 {
00072 if (nEta_==0) throw cms::Exception("FatalError") << "Number of eta bins is not set.\n";
00073 if (nPhi_==0) throw cms::Exception("FatalError") << "Number of phi bins is not set.\n";
00074 if (ivProp_==0) throw cms::Exception("FatalError") << "Track propagator is not defined\n";
00075 if (etaBinSize_==0) throw cms::Exception("FatalError") << "Eta bin size is not set.\n";
00076 }
00077
00078 virtual void buildMap();
00079 virtual GlobalPoint getPosition(const DetId&) = 0;
00080 virtual std::set<DetId> getASetOfValidDetIds() = 0;
00081 virtual std::vector<GlobalPoint> getDetIdPoints(const DetId&) = 0;
00082
00083 virtual bool insideElement(const GlobalPoint&, const DetId&) = 0;
00084 virtual bool nearElement(const GlobalPoint& point, const DetId& id, const double distance)
00085 {
00086 GlobalPoint center = getPosition(id);
00087 return sqrt(pow(point.eta()-center.eta(),2)+pow(point.phi()-center.phi(),2)) < distance;
00088 };
00089
00090 std::vector<std::vector<std::set<DetId> > >* theMap_;
00091 const int nPhi_;
00092 const int nEta_;
00093 const double etaBinSize_;
00094 Propagator *ivProp_;
00095 };