8 if(passedGeometry ==
NULL)
9 throw(std::runtime_error(
"\n\n TBPositionCalc: wrong initialization.\n\n"));
10 theGeometry_ = passedGeometry;
13 param_LogWeighted_ = providedParameters.find(
"LogWeighted")->second;
14 param_X0_ = providedParameters.find(
"X0")->second;
15 param_T0_ = providedParameters.find(
"T0")->second;
16 param_W0_ = providedParameters.find(
"W0")->second;
23 if (theTestMap)
delete theTestMap;
29 if(passedRecHitsMap ==
NULL)
30 throw(std::runtime_error(
"\n\n TBPositionCalc::CalculateTBPos called uninitialized.\n\n"));
33 std::vector<EBDetId> validDetIds;
34 std::vector<EBDetId>::iterator iter;
35 for (iter = passedDetIds.begin(); iter != passedDetIds.end(); iter++) {
36 if (((*iter) !=
DetId(0))
37 && (passedRecHitsMap->
find(*iter) != passedRecHitsMap->
end()))
38 validDetIds.push_back(*iter);
41 passedDetIds = validDetIds;
44 CLHEP::Hep3Vector cmsPos = CalculateCMSPos(passedDetIds, myCrystal, passedRecHitsMap);
47 CLHEP::HepRotation *CMStoTB =
new CLHEP::HepRotation();
48 computeRotation(myCrystal, (*CMStoTB));
51 CLHEP::Hep3Vector tbPos = (*CMStoTB)*cmsPos;
64 std::vector<EBDetId>::iterator myIt;
65 for (myIt = passedDetIds.begin(); myIt != passedDetIds.end(); myIt++) {
68 thisEne = itt->energy();
75 edm::LogError(
"NegativeClusterEnergy") <<
"cluster with negative energy: " << eTot <<
", setting depth to 0.";
77 depth = param_X0_ * (param_T0_ +
log(eTot));
88 double total_weight = 0;
89 double cluster_theta = 0;
90 double cluster_phi = 0;
91 std::vector<EBDetId>::iterator myIt2;
92 for (myIt2 = passedDetIds.begin(); myIt2 != passedDetIds.end(); myIt2++) {
97 double ener = itj->energy();
99 if (param_LogWeighted_) {
100 if(eTot<=0.) { weight = 0.; }
101 else { weight =
std::max(0., param_W0_ +
log( fabs(ener)/eTot) ); }
110 cluster_theta += weight*jth_pos.
theta();
111 cluster_phi += weight*jth_pos.
phi();
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; }
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);
126 return CLHEP::Hep3Vector(xpos, ypos, zpos);
136 double myTheta = 999.;
137 theTestMap->findCrystalAngles(MyCrystal, myEta, myPhi);
138 myTheta = 2.0*atan(
exp(-myEta));
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);
152 CMStoTB = (*fromCMStoTB);
void computeRotation(int myCrystal, CLHEP::HepRotation &CMStoTB)
Sin< T >::type sin(const T &t)
Geom::Phi< T > phi() const
std::vector< EcalRecHit >::const_iterator const_iterator
Geom::Theta< T > theta() const
const T & max(const T &a, const T &b)
CLHEP::Hep3Vector CalculateTBPos(std::vector< EBDetId > passedDetIds, int myCrystal, EcalRecHitCollection const *passedRecHitsMap)
Cos< T >::type cos(const T &t)
const_iterator end() const
CLHEP::Hep3Vector CalculateCMSPos(std::vector< EBDetId > passedDetIds, int myCrystal, EcalRecHitCollection const *passedRecHitsMap)
A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code...
iterator find(key_type k)
static const int SMCRYSTALMODE