CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/Calibration/Tools/interface/DetIdAssociator.h

Go to the documentation of this file.
00001 //
00002 // Original Author:  Dmytro Kovalskyi
00003 // Modified for HCAL by Michal Szleper
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 //#include "DataFormats/GeometryVector/interface/GlobalPoint.h"
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    // find DetIds arround given direction
00040    // idR is a number of the adjacent bins to retrieve 
00041    virtual std::set<DetId> getDetIdsCloseToAPoint(const GlobalPoint&, 
00042                                                   const int idR = 0);
00043    // dR is a cone radius in eta-phi
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 };