CMS 3D CMS Logo

EcalClusterLocal.cc
Go to the documentation of this file.
9 #include "TMath.h"
10 #include "TVector2.h"
11 
12 namespace egammaTools {
13 
15  const CaloGeometry &caloGeometry,
16  float &etacry,
17  float &phicry,
18  int &ieta,
19  int &iphi,
20  float &thetatilt,
21  float &phitilt) {
22  assert(bclus.hitsAndFractions().at(0).first.subdetId() == EcalBarrel);
23 
25  caloGeometry.getSubdetectorGeometry(DetId::Ecal, EcalBarrel); //EcalBarrel = 1
26 
27  const math::XYZPoint &position_ = bclus.position();
28  double Theta = -position_.theta() + 0.5 * TMath::Pi();
29  double Eta = position_.eta();
30  double Phi = TVector2::Phi_mpi_pi(position_.phi());
31 
32  //Calculate expected depth of the maximum shower from energy (like in PositionCalc::Calculate_Location()):
33  // The parameters X0 and T0 are hardcoded here because these values were used to calculate the corrections:
34  const float X0 = 0.89;
35  const float T0 = 7.4;
36  double depth = X0 * (T0 + log(bclus.energy()));
37 
38  //find max energy crystal
39  std::vector<std::pair<DetId, float> > crystals_vector = bclus.hitsAndFractions();
40  float drmin = 999.;
41  EBDetId crystalseed;
42  //printf("starting loop over crystals, etot = %5f:\n",bclus.energy());
43  for (unsigned int icry = 0; icry != crystals_vector.size(); ++icry) {
44  EBDetId crystal(crystals_vector[icry].first);
45 
46  auto cell = geom->getGeometry(crystal);
47  const TruncatedPyramid *cpyr = dynamic_cast<const TruncatedPyramid *>(cell.get());
48  GlobalPoint center_pos = cpyr->getPosition(depth);
49  double EtaCentr = center_pos.eta();
50  double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
51 
52  float dr = reco::deltaR(Eta, Phi, EtaCentr, PhiCentr);
53  if (dr < drmin) {
54  drmin = dr;
55  crystalseed = crystal;
56  }
57  }
58 
59  ieta = crystalseed.ieta();
60  iphi = crystalseed.iphi();
61 
62  // Get center cell position from shower depth
63  auto cell = geom->getGeometry(crystalseed);
64  const TruncatedPyramid *cpyr = dynamic_cast<const TruncatedPyramid *>(cell.get());
65 
66  thetatilt = cpyr->getThetaAxis();
67  phitilt = cpyr->getPhiAxis();
68 
69  GlobalPoint center_pos = cpyr->getPosition(depth);
70 
71  double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
72  double PhiWidth = (TMath::Pi() / 180.);
73  phicry = (TVector2::Phi_mpi_pi(Phi - PhiCentr)) / PhiWidth;
74  //Some flips to take into account ECAL barrel symmetries:
75  if (ieta < 0)
76  phicry *= -1.;
77 
78  double ThetaCentr = -center_pos.theta() + 0.5 * TMath::Pi();
79  double ThetaWidth = (TMath::Pi() / 180.) * TMath::Cos(ThetaCentr);
80  etacry = (Theta - ThetaCentr) / ThetaWidth;
81  //flip to take into account ECAL barrel symmetries:
82  if (ieta < 0)
83  etacry *= -1.;
84 
85  return;
86  }
87 
89  const CaloGeometry &caloGeometry,
90  float &xcry,
91  float &ycry,
92  int &ix,
93  int &iy,
94  float &thetatilt,
95  float &phitilt) {
96  assert(bclus.hitsAndFractions().at(0).first.subdetId() == EcalEndcap);
97 
99  caloGeometry.getSubdetectorGeometry(DetId::Ecal, EcalEndcap); //EcalBarrel = 1
100 
101  const math::XYZPoint &position_ = bclus.position();
102  //double Theta = -position_.theta()+0.5*TMath::Pi();
103  double Eta = position_.eta();
104  double Phi = TVector2::Phi_mpi_pi(position_.phi());
105  double X = position_.x();
106  double Y = position_.y();
107 
108  //Calculate expected depth of the maximum shower from energy (like in PositionCalc::Calculate_Location()):
109  // The parameters X0 and T0 are hardcoded here because these values were used to calculate the corrections:
110  const float X0 = 0.89;
111  float T0 = 1.2;
112  //different T0 value if outside of preshower coverage
113  if (TMath::Abs(bclus.eta()) < 1.653)
114  T0 = 3.1;
115 
116  double depth = X0 * (T0 + log(bclus.energy()));
117 
118  //find max energy crystal
119  std::vector<std::pair<DetId, float> > crystals_vector = bclus.hitsAndFractions();
120  float drmin = 999.;
121  EEDetId crystalseed;
122  //printf("starting loop over crystals, etot = %5f:\n",bclus.energy());
123  for (unsigned int icry = 0; icry != crystals_vector.size(); ++icry) {
124  EEDetId crystal(crystals_vector[icry].first);
125 
126  auto cell = geom->getGeometry(crystal);
127  const TruncatedPyramid *cpyr = dynamic_cast<const TruncatedPyramid *>(cell.get());
128  GlobalPoint center_pos = cpyr->getPosition(depth);
129  double EtaCentr = center_pos.eta();
130  double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
131 
132  float dr = reco::deltaR(Eta, Phi, EtaCentr, PhiCentr);
133  if (dr < drmin) {
134  drmin = dr;
135  crystalseed = crystal;
136  }
137  }
138 
139  ix = crystalseed.ix();
140  iy = crystalseed.iy();
141 
142  // Get center cell position from shower depth
143  auto cell = geom->getGeometry(crystalseed);
144  const TruncatedPyramid *cpyr = dynamic_cast<const TruncatedPyramid *>(cell.get());
145 
146  thetatilt = cpyr->getThetaAxis();
147  phitilt = cpyr->getPhiAxis();
148 
149  GlobalPoint center_pos = cpyr->getPosition(depth);
150 
151  double XCentr = center_pos.x();
152  double XWidth = 2.59;
153  xcry = (X - XCentr) / XWidth;
154 
155  double YCentr = center_pos.y();
156  double YWidth = 2.59;
157  ycry = (Y - YCentr) / YWidth;
158 
159  return;
160  }
161 
162 } // namespace egammaTools
EBDetId::ieta
int ieta() const
get the crystal ieta
Definition: EBDetId.h:49
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
X
#define X(str)
Definition: MuonsGrabber.cc:38
EBDetId
Definition: EBDetId.h:17
PV3DBase::theta
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72
EBDetId.h
EEDetId.h
CaloGeometry::getSubdetectorGeometry
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:34
cms::cuda::assert
assert(be >=bs)
egammaTools::localEcalClusterCoordsEE
void localEcalClusterCoordsEE(const reco::CaloCluster &bclus, const CaloGeometry &geom, float &xcry, float &ycry, int &ix, int &iy, float &thetatilt, float &phitilt)
Definition: EcalClusterLocal.cc:88
TruncatedPyramid
A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code.
Definition: TruncatedPyramid.h:19
EEDetId::ix
int ix() const
Definition: EEDetId.h:77
dqmdumpme.first
first
Definition: dqmdumpme.py:55
EcalBarrel
Definition: EcalSubdetector.h:10
LEDCalibrationChannels.iphi
iphi
Definition: LEDCalibrationChannels.py:64
deltaR.h
CaloGeometry
Definition: CaloGeometry.h:21
Abs
T Abs(T a)
Definition: MathUtil.h:49
TruncatedPyramid.h
reco::CaloCluster
Definition: CaloCluster.h:31
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
VtxSmearedParameters_cfi.Phi
Phi
Definition: VtxSmearedParameters_cfi.py:112
Point3DBase< float, GlobalTag >
LEDCalibrationChannels.depth
depth
Definition: LEDCalibrationChannels.py:65
EEDetId
Definition: EEDetId.h:14
EcalEndcap
Definition: EcalSubdetector.h:10
egammaTools
Definition: ConversionFinder.h:34
egammaTools::localEcalClusterCoordsEB
void localEcalClusterCoordsEB(const reco::CaloCluster &bclus, const CaloGeometry &geom, float &etacry, float &phicry, int &ieta, int &iphi, float &thetatilt, float &phitilt)
Definition: EcalClusterLocal.cc:14
LEDCalibrationChannels.ieta
ieta
Definition: LEDCalibrationChannels.py:63
CaloSubdetectorGeometry.h
math::XYZPoint
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
reco::CaloCluster::eta
double eta() const
pseudorapidity of cluster centroid
Definition: CaloCluster.h:181
reco::CaloCluster::hitsAndFractions
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:210
PV3DBase::eta
T eta() const
Definition: PV3DBase.h:73
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
TruncatedPyramid::getThetaAxis
CCGFloat getThetaAxis() const
Definition: TruncatedPyramid.cc:49
MonitorAlCaEcalPi0_cfi.X0
X0
Definition: MonitorAlCaEcalPi0_cfi.py:77
DetId::Ecal
Definition: DetId.h:27
EEDetId::iy
int iy() const
Definition: EEDetId.h:83
reco::CaloCluster::position
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:154
EcalClusterLocal.h
DOFs::Y
Definition: AlignPCLThresholdsWriter.cc:37
TruncatedPyramid::getPosition
GlobalPoint getPosition(CCGFloat depth) const override
Definition: TruncatedPyramid.cc:45
flavorHistoryFilter_cfi.dr
dr
Definition: flavorHistoryFilter_cfi.py:37
CaloGeometry.h
reco::deltaR
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
CaloSubdetectorGeometry
Definition: CaloSubdetectorGeometry.h:22
dqm-mbProfile.log
log
Definition: dqm-mbProfile.py:17
TruncatedPyramid::getPhiAxis
CCGFloat getPhiAxis() const
Definition: TruncatedPyramid.cc:51
Pi
const double Pi
Definition: CosmicMuonParameters.h:18
EBDetId::iphi
int iphi() const
get the crystal iphi
Definition: EBDetId.h:51
reco::CaloCluster::energy
double energy() const
cluster energy
Definition: CaloCluster.h:149
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
CaloCluster.h