00001 #include "RecoCaloTools/Selectors/interface/CaloDualConeSelector.h"
00002 #include "RecoCaloTools/MetaCollections/interface/CaloRecHitMetaCollectionFast.h"
00003 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00004
00005 CaloDualConeSelector::CaloDualConeSelector(double dRmin, double dRmax, const CaloGeometry* geom) :
00006 geom_(geom),deltaRmin_(dRmin),deltaRmax_(dRmax),detector_(DetId::Detector(0)),subdet_(0) {
00007 }
00008
00009 CaloDualConeSelector::CaloDualConeSelector(double dRmin, double dRmax, const CaloGeometry* geom, DetId::Detector detector, int subdet) :
00010 geom_(geom),deltaRmin_(dRmin),deltaRmax_(dRmax),detector_(detector),subdet_(subdet) {
00011 }
00012
00013 std::auto_ptr<CaloRecHitMetaCollectionV> CaloDualConeSelector::select(double eta, double phi, const CaloRecHitMetaCollectionV& inputCollection) {
00014 GlobalPoint p(GlobalPoint::Cylindrical(1,phi,tanh(eta)));
00015 return select(p,inputCollection);
00016 }
00017
00018 std::auto_ptr<CaloRecHitMetaCollectionV> CaloDualConeSelector::select(const GlobalPoint& p, const CaloRecHitMetaCollectionV& inputCollection) {
00019 CaloRecHitMetaCollectionFast* c=new CaloRecHitMetaCollectionFast();
00020
00021
00022
00023 for (int subdet=subdet_; subdet<=7 && (subdet_==0 || subdet_==subdet); subdet++) {
00024 const CaloSubdetectorGeometry* sdg=geom_->getSubdetectorGeometry(detector_,subdet);
00025 if (sdg!=0) {
00026
00027 CaloSubdetectorGeometry::DetIdSet dis_excl=sdg->getCells(p,deltaRmin_);
00028 CaloSubdetectorGeometry::DetIdSet dis_all=sdg->getCells(p,deltaRmax_);
00029
00030 CaloSubdetectorGeometry::DetIdSet dis;
00031 std::set_difference(dis_all.begin(),dis_all.end(),
00032 dis_excl.begin(),dis_excl.end(),
00033 std::inserter(dis,dis.begin()));
00034
00035 CaloRecHitMetaCollectionV::const_iterator j,je=inputCollection.end();
00036
00037 for (CaloSubdetectorGeometry::DetIdSet::iterator i=dis.begin(); i!=dis.end(); i++) {
00038 if (i->subdetId()!=subdet) continue;
00039 j=inputCollection.find(*i);
00040 if (j!=je) c->add(&(*j));
00041 }
00042 }
00043 }
00044
00045 return std::auto_ptr<CaloRecHitMetaCollectionV>(c);
00046 }