CMS 3D CMS Logo

List of all members | Public Member Functions | Private Attributes
TBPositionCalc Class Reference

#include <TBPositionCalc.h>

Public Member Functions

CLHEP::Hep3Vector CalculateCMSPos (const std::vector< EBDetId > &passedDetIds, int myCrystal, EcalRecHitCollection const *passedRecHitsMap)
 
CLHEP::Hep3Vector CalculateTBPos (const std::vector< EBDetId > &passedDetIds, int myCrystal, EcalRecHitCollection const *passedRecHitsMap)
 
void computeRotation (int myCrystal, CLHEP::HepRotation &CMStoTB)
 
 TBPositionCalc (const std::map< std::string, double > &providedParameters, const std::string &mapFile, const CaloSubdetectorGeometry *passedGeometry)
 
 TBPositionCalc ()
 
 ~TBPositionCalc ()
 

Private Attributes

bool param_LogWeighted_
 
Double32_t param_T0_
 
Double32_t param_W0_
 
Double32_t param_X0_
 
const CaloSubdetectorGeometrytheGeometry_
 
EcalTBCrystalMaptheTestMap
 

Detailed Description

Definition at line 26 of file TBPositionCalc.h.

Constructor & Destructor Documentation

TBPositionCalc::TBPositionCalc ( const std::map< std::string, double > &  providedParameters,
const std::string &  mapFile,
const CaloSubdetectorGeometry passedGeometry 
)
TBPositionCalc::TBPositionCalc ( )
inline

Definition at line 32 of file TBPositionCalc.h.

References CalculateCMSPos(), CalculateTBPos(), computeRotation(), and ~TBPositionCalc().

32 { };
TBPositionCalc::~TBPositionCalc ( )

Definition at line 21 of file TBPositionCalc.cc.

Referenced by TBPositionCalc().

22 {
23  if (theTestMap) delete theTestMap;
24 }
EcalTBCrystalMap * theTestMap

Member Function Documentation

CLHEP::Hep3Vector TBPositionCalc::CalculateCMSPos ( const std::vector< EBDetId > &  passedDetIds,
int  myCrystal,
EcalRecHitCollection const *  passedRecHitsMap 
)

Definition at line 59 of file TBPositionCalc.cc.

References funct::cos(), egammaForCoreTracking_cff::depth, edm::SortedCollection< T, SORT >::find(), ecaldqm::getGeometry(), cmsBatch::log, M_PI, SiStripPI::max, PV3DBase< T, PVType, FrameType >::phi(), TCMET_cfi::radius, funct::sin(), EBDetId::SMCRYSTALMODE, mathSSE::sqrt(), PV3DBase< T, PVType, FrameType >::theta(), mps_merge::weight, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by TBPositionCalc().

59  {
60 
61  // Calculate the total energy
62  double thisEne = 0;
63  double eTot = 0;
64  EBDetId myId;
65  std::vector<EBDetId>::const_iterator myIt;
66  for (myIt = passedDetIds.begin(); myIt != passedDetIds.end(); myIt++) {
67  myId = (*myIt);
68  EcalRecHitCollection::const_iterator itt = passedRecHitsMap->find(myId);
69  thisEne = itt->energy();
70  eTot += thisEne;
71  }
72 
73  // Calculate shower depth
74  float depth = 0.;
75  if(eTot<=0.) {
76  edm::LogError("NegativeClusterEnergy") << "cluster with negative energy: " << eTot << ", setting depth to 0.";
77  } else {
78  depth = param_X0_ * (param_T0_ + log(eTot));
79  }
80 
81  // Get position of the central crystal from shower depth
82  EBDetId maxId_ = EBDetId(1, myCrystal, EBDetId::SMCRYSTALMODE);
83  auto center_cell = theGeometry_ -> getGeometry(maxId_);
84  GlobalPoint center_pos = center_cell->getPosition(depth);
85 
86  // Loop over the hits collection
87  double weight = 0;
88  double total_weight = 0;
89  double cluster_theta = 0;
90  double cluster_phi = 0;
91  std::vector<EBDetId>::const_iterator myIt2;
92  for (myIt2 = passedDetIds.begin(); myIt2 != passedDetIds.end(); myIt2++) {
93 
94  // getting weights
95  myId = (*myIt2);
96  EcalRecHitCollection::const_iterator itj = passedRecHitsMap->find(myId);
97  double ener = itj->energy();
98 
99  if (param_LogWeighted_) {
100  if(eTot<=0.) { weight = 0.; }
101  else { weight = std::max(0., param_W0_ + log( fabs(ener)/eTot) ); }
102  } else {
103  weight = ener/eTot;
104  }
105  total_weight += weight;
106 
107  // weighted position of this detId
108  auto jth_cell = theGeometry_->getGeometry(myId);
109  GlobalPoint jth_pos = jth_cell->getPosition(depth);
110  cluster_theta += weight*jth_pos.theta();
111  cluster_phi += weight*jth_pos.phi();
112  }
113 
114  // normalizing
115  cluster_theta /= total_weight;
116  cluster_phi /= total_weight;
117  if (cluster_phi > M_PI) { cluster_phi -= 2.*M_PI; }
118  if (cluster_phi < -M_PI){ cluster_phi += 2.*M_PI; }
119 
120  // position in the cms frame
121  double radius = sqrt(center_pos.x()*center_pos.x() + center_pos.y()*center_pos.y() + center_pos.z()*center_pos.z());
122  double xpos = radius*cos(cluster_phi)*sin(cluster_theta);
123  double ypos = radius*sin(cluster_phi)*sin(cluster_theta);
124  double zpos = radius*cos(cluster_theta);
125 
126  return CLHEP::Hep3Vector(xpos, ypos, zpos);
127 }
Double32_t param_X0_
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
std::vector< EcalRecHit >::const_iterator const_iterator
T y() const
Definition: PV3DBase.h:63
Double32_t param_W0_
Definition: weight.py:1
CaloGeometry const * getGeometry()
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
const CaloSubdetectorGeometry * theGeometry_
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
#define M_PI
virtual std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
Double32_t param_T0_
static const int SMCRYSTALMODE
Definition: EBDetId.h:159
T x() const
Definition: PV3DBase.h:62
CLHEP::Hep3Vector TBPositionCalc::CalculateTBPos ( const std::vector< EBDetId > &  passedDetIds,
int  myCrystal,
EcalRecHitCollection const *  passedRecHitsMap 
)

Definition at line 26 of file TBPositionCalc.cc.

References edm::SortedCollection< T, SORT >::end(), and edm::SortedCollection< T, SORT >::find().

Referenced by TBPositionCalc().

26  {
27 
28  std::vector<EBDetId> passedDetIds = upassedDetIds;
29  // throw an error if the cluster was not initialized properly
30  if(passedRecHitsMap == nullptr)
31  throw(std::runtime_error("\n\n TBPositionCalc::CalculateTBPos called uninitialized.\n\n"));
32 
33  // check DetIds are nonzero
34  std::vector<EBDetId> validDetIds;
35  std::vector<EBDetId>::const_iterator iter;
36  for (iter = passedDetIds.begin(); iter != passedDetIds.end(); iter++) {
37  if (((*iter) != DetId(0))
38  && (passedRecHitsMap->find(*iter) != passedRecHitsMap->end()))
39  validDetIds.push_back(*iter);
40  }
41  passedDetIds.clear();
42  passedDetIds = validDetIds;
43 
44  // computing the position in the cms frame
45  CLHEP::Hep3Vector cmsPos = CalculateCMSPos(passedDetIds, myCrystal, passedRecHitsMap);
46 
47  // computing the rotation matrix (from CMS to TB)
48  CLHEP::HepRotation *CMStoTB = new CLHEP::HepRotation();
49  computeRotation(myCrystal, (*CMStoTB));
50 
51  // moving to testbeam frame
52  CLHEP::Hep3Vector tbPos = (*CMStoTB)*cmsPos;
53  delete CMStoTB;
54 
55  return tbPos;
56 }
void computeRotation(int myCrystal, CLHEP::HepRotation &CMStoTB)
CLHEP::Hep3Vector CalculateCMSPos(const std::vector< EBDetId > &passedDetIds, int myCrystal, EcalRecHitCollection const *passedRecHitsMap)
Definition: DetId.h:18
void TBPositionCalc::computeRotation ( int  myCrystal,
CLHEP::HepRotation &  CMStoTB 
)

Definition at line 130 of file TBPositionCalc.cc.

References JetChargeProducer_cfi::exp, diffTwoXMLs::r1, and diffTwoXMLs::r2.

Referenced by TBPositionCalc().

130  {
131 
132  // taking eta/phi of the crystal
133 
134  double myEta = 999.;
135  double myPhi = 999.;
136  double myTheta = 999.;
137  theTestMap->findCrystalAngles(MyCrystal, myEta, myPhi);
138  myTheta = 2.0*atan(exp(-myEta));
139 
140  // matrix
141  CLHEP::HepRotation * fromCMStoTB = new CLHEP::HepRotation();
142  double angle1 = 90.*deg - myPhi;
143  CLHEP::HepRotationZ * r1 = new CLHEP::HepRotationZ(angle1);
144  double angle2 = myTheta;
145  CLHEP::HepRotationX * r2 = new CLHEP::HepRotationX(angle2);
146  double angle3 = 90.*deg;
147  CLHEP::HepRotationZ * r3 = new CLHEP::HepRotationZ(angle3);
148  (*fromCMStoTB) *= (*r3);
149  (*fromCMStoTB) *= (*r2);
150  (*fromCMStoTB) *= (*r1);
151 
152  CMStoTB = (*fromCMStoTB);
153 
154  delete fromCMStoTB;
155  delete r1;
156  delete r2;
157  delete r3;
158 }
EcalTBCrystalMap * theTestMap
void findCrystalAngles(const int thisCrysIndex, double &thisEta, double &thisPhi)

Member Data Documentation

bool TBPositionCalc::param_LogWeighted_
private

Definition at line 44 of file TBPositionCalc.h.

Double32_t TBPositionCalc::param_T0_
private

Definition at line 46 of file TBPositionCalc.h.

Double32_t TBPositionCalc::param_W0_
private

Definition at line 47 of file TBPositionCalc.h.

Double32_t TBPositionCalc::param_X0_
private

Definition at line 45 of file TBPositionCalc.h.

const CaloSubdetectorGeometry* TBPositionCalc::theGeometry_
private

Definition at line 51 of file TBPositionCalc.h.

EcalTBCrystalMap* TBPositionCalc::theTestMap
private

Definition at line 49 of file TBPositionCalc.h.