CMS 3D CMS Logo

PreshowerPhiClusterAlgo.cc
Go to the documentation of this file.
1 #include <vector>
2 #include <map>
3 #include <iostream>
4 
12 
13 #include "TH1.h"
14 
16  HitsID *used_strips,
17  RecHitsMap *the_rechitsMap_p,
18  const CaloSubdetectorGeometry*& geometry_p,
19  CaloSubdetectorTopology*& topology_p,
20  double deltaEta, double minDeltaPhi, double maxDeltaPhi)
21 {
22 
23  rechits_map = the_rechitsMap_p;
24  used_s = used_strips;
25 
26  int plane = strip.plane();
27 
28  // create null-cluster
29  std::vector< std::pair<DetId,float> > dummy;
30  Point posi(0,0,0);
31  reco::PreshowerCluster nullcluster = reco::PreshowerCluster(0., posi, dummy, plane);
32  if (strip == ESDetId(0)) return nullcluster; // works in case of no intersected strip found (e.g. in the Barrel)
33 
34  const CaloCellGeometry *refCell = geometry_p->getGeometry(strip);
35  GlobalPoint refpos = refCell->getPosition();
36  double refEta = refpos.eta();
37  double refPhi = refpos.phi();
38 
39  // Collection of cluster strips
40  EcalRecHitCollection clusterRecHits;
41 
42  double x_pos = 0;
43  double y_pos = 0;
44  double z_pos = 0;
45 
46  RecHitsMap::iterator strip_it;
47  for (strip_it = rechits_map->begin(); strip_it != rechits_map->end(); ++strip_it) {
48 
49  if (!goodStrip(strip_it)) continue;
50 
51  ESDetId mystrip = (strip_it->first == DetId(0)) ? ESDetId(0) : ESDetId(strip_it->first);
52  if (mystrip.plane() != plane) continue;
53 
54  const CaloCellGeometry *thisCell = geometry_p->getGeometry(strip_it->first);
55  GlobalPoint position = thisCell->getPosition();
56 
57  if (fabs(position.eta() - refEta) < deltaEta) {
58 
59  //std::cout<<"all strips : "<<mystrip.plane()<<" "<<position.phi()<<" "<<reco::deltaPhi(position.phi(), refPhi)<<std::endl;
60 
61  if (reco::deltaPhi(position.phi(), refPhi) > 0 && reco::deltaPhi(position.phi(), refPhi) > maxDeltaPhi) continue;
62  if (reco::deltaPhi(position.phi(), refPhi) < 0 && reco::deltaPhi(position.phi(), refPhi) < minDeltaPhi) continue;
63 
64  //std::cout<<mystrip.zside()<<" "<<mystrip.plane()<<" "<<mystrip.six()<<" "<<mystrip.siy()<<" "<<mystrip.strip()<<" "<<position.eta()<<" "<<position.phi()<<" "<<strip_it->second.energy()<<" "<<strip_it->second.recoFlag()<<" "<<refEta<<" "<<refPhi<<" "<<reco::deltaPhi(position.phi(), refPhi)<<std::endl;
65 
66  clusterRecHits.push_back(strip_it->second);
67  used_s->insert(strip_it->first);
68 
69  x_pos += strip_it->second.energy() * position.x();
70  y_pos += strip_it->second.energy() * position.y();
71  z_pos += strip_it->second.energy() * position.z();
72  }
73 
74  }
75 
77  double Eclust = 0;
78 
79  std::vector<std::pair<DetId,float > > usedHits;
80  for (it=clusterRecHits.begin(); it != clusterRecHits.end(); it++) {
81  Eclust += it->energy();
82  usedHits.push_back(std::pair<DetId,float > (it->id(), 1.));
83  }
84 
85  if (Eclust > 0.) {
86  x_pos /= Eclust;
87  y_pos /= Eclust;
88  z_pos /= Eclust;
89  }
90  Point pos(x_pos,y_pos,z_pos);
91 
92  reco::PreshowerCluster cluster = reco::PreshowerCluster(Eclust, pos, usedHits, plane);
93 
94  return cluster;
95 }
96 
97 // returns true if the candidate strip fulfills the requirements to be added to the cluster:
98 bool PreshowerPhiClusterAlgo::goodStrip(RecHitsMap::iterator candidate_it) {
99 
100  if ( used_s->find(candidate_it->first) != used_s->end())
101  LogTrace("PreShowerPhiClusterAlgo") << " This strip is in use";
102  if (candidate_it == rechits_map->end() )
103  LogTrace("PreShowerPhiClusterAlgo") << " No such a strip in rechits_map";
104  if (candidate_it->second.energy() <= esStripEnergyCut_)
105  LogTrace("PreShowerPhiClusterAlgo") << "Strip energy" << candidate_it->second.energy() <<"is below threshold";
106 
107  // crystal should not be included...
108  if ( (used_s->find(candidate_it->first) != used_s->end()) || // ...if it already belongs to a cluster
109  (candidate_it == rechits_map->end() ) || // ...if it corresponds to a hit
110  (candidate_it->second.energy() <= esStripEnergyCut_ ) ) // ...if it has a negative or zero energy
111  {
112  return false;
113  }
114  return true;
115 }
116 
reco::PreshowerCluster makeOneCluster(ESDetId strip, HitsID *used_strips, RecHitsMap *rechits_map, const CaloSubdetectorGeometry *&geometry_p, CaloSubdetectorTopology *&topology_p, double deltaEta, double minDeltaPhi, double maxDeltaPhi)
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
T y() const
Definition: PV3DBase.h:63
void push_back(T const &t)
static const double deltaEta
Definition: CaloConstants.h:8
virtual const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
bool goodStrip(RecHitsMap::iterator candidate_it)
T z() const
Definition: PV3DBase.h:64
#define LogTrace(id)
std::vector< EcalRecHit >::iterator iterator
const_iterator end() const
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
Definition: DetId.h:18
T eta() const
Definition: PV3DBase.h:76
std::map< DetId, EcalRecHit > RecHitsMap
static int position[264][3]
Definition: ReadPGInfo.cc:509
int plane() const
Definition: ESDetId.h:47
const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
T x() const
Definition: PV3DBase.h:62
const_iterator begin() const