47 #include "TGeoManager.h" 49 #include "TGeoMatrix.h" 56 #include "TEveVector.h" 57 #include "TEveTrans.h" 62 typedef std::map< const float*, TGeoVolume*> CaloVolMap;
80 void AddLeafNode(TGeoVolume* mother, TGeoVolume* daughter,
const char*
name, TGeoMatrix* mtx )
82 int n = mother->GetNdaughters();
83 mother->AddNode(daughter, 1, mtx);
84 mother->GetNode(n)->SetName(name);
88 TGeoCombiTrans* createPlacement(
const GeomDet *det )
95 TGeoTranslation trans( posx, posy, posz );
102 const Double_t
matrix[9] = { detRot.
xx(), detRot.
yx(), detRot.
zx(),
103 detRot.
xy(), detRot.
yy(), detRot.
zy(),
104 detRot.
xz(), detRot.
yz(), detRot.
zz()
106 rotation.SetMatrix( matrix );
108 return new TGeoCombiTrans( trans, rotation );
118 TGeoVolume*
res =
nullptr;
119 if (mother->GetNdaughters()) {
120 TGeoNode*
n = mother->FindNode(Form(
"%s_%d_1", prefix,
id));
121 if ( n ) res = n->GetVolume();
125 res =
new TGeoVolumeAssembly( Form(
"%s_%d", prefix,
id ));
127 mother->AddNode(res, 1);
135 TGeoVolume*
res =
nullptr;
136 if (mother->GetNdaughters()) {
137 TGeoNode*
n = mother->FindNode(Form(
"%s_1",prefix));
138 if ( n ) res = n->GetVolume();
143 res =
new TGeoVolumeAssembly(prefix);
145 mother->AddNode(res, 1);
161 Blue0 = 13, Blue1 = 24, Blue2 = 6,
162 Yellow0 = 3, Yellow1 = 16,
164 Red = 29, Orange0 = 79, Orange1 = 14,
175 std::map<ERecoDet, TGeoMedium*>::iterator it =
m_recoMedium.find(det);
188 color = GMCol::Green;
198 color = GMCol::Blue2;
208 color = GMCol::Yellow1;
218 color = GMCol::Yellow0;
224 color = GMCol::Blue2;
228 color = GMCol::Orange1;
232 color = GMCol::Green;
236 color = GMCol::Blue2;
240 color = GMCol::Blue1;
243 printf(
"invalid medium id \n");
247 TGeoMaterial* mat =
new TGeoMaterial(
name.c_str(), 0, 0, 0);
250 mat->SetFillStyle(3000);
261 std::shared_ptr<FWTGeoRecoGeometry>
274 TGeoManager*
geom =
new TGeoManager(
"cmsGeo",
"CMS Detector" );
275 if(
nullptr == gGeoIdentity )
277 gGeoIdentity =
new TGeoIdentity(
"Identity" );
283 TGeoMaterial *vacuum =
new TGeoMaterial(
"Vacuum", 0 ,0 ,0 );
286 TGeoVolume *top = geom->MakeBox(
"CMS",
m_dummyMedium, 270., 270., 120. );
290 return std::shared_ptr<FWTGeoRecoGeometry>();
292 geom->SetTopVolume( top );
294 top->SetVisibility( kFALSE );
295 top->SetLineColor( kBlue );
339 geom->CloseGeometry();
341 geom->DefaultColors();
343 geom->CloseGeometry();
352 TGeoShape* shape =
nullptr;
359 std::array< const float, 4 >
const & par = b2->
parameters ();
362 float hBottomEdge = par [0];
363 float hTopEdge = par [1];
364 float thickness = par [2];
365 float apothem = par [3];
369 << hBottomEdge <<
"_" 378 if(
nullptr == shape )
380 shape =
new TGeoTrap(
397 if( dynamic_cast<const RectangularPlaneBounds *> (b) !=
nullptr )
414 if(
nullptr == shape )
416 shape =
new TGeoBBox( name.c_str(), width / 2., length / 2., thickness / 2. );
431 std::map<TGeoShape*, TGeoVolume*>::iterator vIt =
m_shapeToVolume.find(solid);
435 TGeoVolume* volume =
new TGeoVolume( name.c_str(),solid,
GetMedium(mid));
460 DetId detid = it->geographicalId();
465 std::string name = Form(
"PXB Ly:%d, Md:%d Ld:%d ", layer, module, ladder );
471 AddLeafNode( holder, child, name.c_str(), createPlacement( it ));
482 DetId detid = it->geographicalId();
488 std::string name = Form(
"PXF D:%d, B:%d, P:%d, S:%d", disk, blade, panel, side );
496 AddLeafNode( holder, child, name.c_str(), createPlacement( it ));
507 DetId detid = it->geographicalId();
518 AddLeafNode( holder, child, name.c_str(), createPlacement( it ));
529 DetId detid = it->geographicalId();
540 AddLeafNode( holder, child, name.c_str(), createPlacement( it ));
551 DetId detid = it->geographicalId();
562 AddLeafNode( holder, child, name.c_str(), createPlacement( it ));
573 DetId detid = it->geographicalId();
585 AddLeafNode( holder, child, name.c_str(), createPlacement( it ));
608 for(
auto it = dtChamberGeom.begin(),
609 end = dtChamberGeom.end();
612 if(
auto chamber = dynamic_cast< const DTChamber *>(*it))
624 AddLeafNode(holder, child, name.c_str(), createPlacement(
chamber));
633 for(
auto it = dtSuperLayerGeom.begin(),
634 end = dtSuperLayerGeom.end();
637 if(
auto * superlayer = dynamic_cast<const DTSuperLayer*>(*it))
650 AddLeafNode(holder, child, name.c_str(), createPlacement( superlayer));
658 for(
auto it = dtLayerGeom.begin(),
659 end = dtLayerGeom.end();
662 if(
auto layer = dynamic_cast<const DTLayer*>(*it))
678 AddLeafNode(holder, child, name.c_str(), createPlacement( layer));
689 throw cms::Exception(
"FatalError" ) <<
"Cannnot find CSCGeometry\n";
696 for(
auto it = cscGeom.begin(), itEnd = cscGeom.end(); it != itEnd; ++it )
698 unsigned int rawid = (*it)->geographicalId();
704 TGeoVolume*
child =
nullptr;
706 if(
auto chamber = dynamic_cast<const CSCChamber*>(*it))
708 else if(
auto * layer = dynamic_cast<const CSCLayer*>(*it))
720 AddLeafNode(holder, child, name.c_str(), createPlacement(*it));
754 TGeoVolume* holder =
GetDaughter(assembly,
"SuperChamber Region",
kMuonGEM , detid.region());
759 AddLeafNode(holder, child, name.c_str(), createPlacement(*it));
786 AddLeafNode(holder, child, name.c_str(), createPlacement(*it));
791 edm::LogInfo(
"FWRecoGeometry") <<
"failed to produce GEM geometry " << exception.
what() << std::endl;
807 for(
auto it = rpcGeom->
rolls().begin(),
828 AddLeafNode(holder, child, name.c_str(), createPlacement(*it));
848 unsigned int rawid = roll->geographicalId().rawId();
860 AddLeafNode(holder, child, name.c_str(), createPlacement(roll));
868 edm::LogInfo(
"FWRecoGeometry") <<
"failed to produce ME0 geometry " << exception.
what() << std::endl;
886 CaloVolMap caloShapeMapP;
887 CaloVolMap caloShapeMapN;
888 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
895 if (!cell) { printf (
"HB not oblique !!!\n");
continue; }
897 TGeoVolume* volume =
nullptr;
898 CaloVolMap& caloShapeMap = (cell->
etaPos() > 0) ? caloShapeMapP : caloShapeMapN;
899 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
900 if (volIt == caloShapeMap.end())
906 HepGeom::Vector3D<float> lCenter;
907 for(
int c = 0;
c < 8; ++
c)
911 static const int arr[] = { 1, 0, 3, 2, 5, 4, 7, 6 };
913 for (
int c = 0;
c < 8; ++
c) {
915 points[
c*2 + 0 ] = -(lc[arr[
c]].
z() - lCenter.z());
917 points[
c*2 + 0 ] = (lc[arr[
c]].z() - lCenter.z());
918 points[
c*2 + 1 ] = (lc[arr[
c]].y() - lCenter.y());
922 float dz = (lc[4].x() -lc[0].x()) * 0.5;
923 TGeoShape* solid =
new TGeoArb8(dz, &points[0]);
924 volume =
new TGeoVolume(
"hcal oblique prism", solid,
GetMedium(
kHCal));
925 caloShapeMap[cell->
param()] = volume;
928 volume = volIt->second;
931 HepGeom::Vector3D<float> gCenter;
933 for (
int c = 0;
c < 8; ++
c)
934 gCenter += HepGeom::Vector3D<float>(gc[
c].
x(), gc[
c].
y(), gc[
c].
z());
937 TGeoTranslation gtr(gCenter.x(), gCenter.y(), gCenter.z());
942 rotPhi.SetAngles(0, -cell->
phiPos()*TMath::RadToDeg(), 0);
943 rot.MultiplyBy(&rotPhi);
947 std::stringstream nname;
949 AddLeafNode(holder, volume, nname.str().c_str(),
new TGeoCombiTrans(gtr, rot));
960 CaloVolMap caloShapeMapP;
961 CaloVolMap caloShapeMapN;
968 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
974 if (!cell) { printf (
"EC not oblique \n");
continue; }
976 TGeoVolume* volume =
nullptr;
977 CaloVolMap& caloShapeMap = (cell->
etaPos() > 0) ? caloShapeMapP : caloShapeMapN;
978 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
979 if ( volIt == caloShapeMap.end())
984 HepGeom::Vector3D<float> lCenter;
985 for(
int c = 0;
c < 8; ++
c)
993 static const int arrP[] = { 3, 2, 1, 0, 7, 6, 5, 4 };
994 static const int arrN[] = { 7, 6, 5, 4 ,3, 2, 1, 0};
995 const int* arr = (detid.
ieta() > 0) ? &arrP[0] : &arrN[0];
998 for (
int c = 0;
c < 8; ++
c) {
999 points[
c*2 + 0 ] = lc[arr[
c]].x() - lCenter.x();
1000 points[
c*2 + 1 ] = lc[arr[
c]].y() - lCenter.y();
1003 float dz = (lc[4].z() -lc[0].z()) * 0.5;
1004 TGeoShape* solid =
new TGeoArb8(dz, &points[0]);
1005 volume =
new TGeoVolume(
"ecal oblique prism", solid,
GetMedium(
kHCal));
1006 caloShapeMap[cell->
param()] = volume;
1010 volume = volIt->second;
1014 HepGeom::Vector3D<float> gCenter;
1016 for (
int c = 0;
c < 8; ++
c) {
1017 gCenter += HepGeom::Vector3D<float>(gc[
c].x(), gc[
c].y(), gc[
c].z());
1022 TGeoTranslation gtr(gCenter.x(), gCenter.y(), gCenter.z());
1024 rot.SetAngles(cell->
phiPos()*TMath::RadToDeg(), 0, 0);
1028 std::stringstream nname;
1030 AddLeafNode(holder, volume, nname.str().c_str(),
new TGeoCombiTrans(gtr, rot));
1039 CaloVolMap caloShapeMapP;
1040 CaloVolMap caloShapeMapN;
1047 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
1053 if (!cell) { printf (
"EC not oblique \n");
continue; }
1055 TGeoVolume* volume =
nullptr;
1056 CaloVolMap& caloShapeMap = (cell->
etaPos() > 0) ? caloShapeMapP : caloShapeMapN;
1057 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
1058 if ( volIt == caloShapeMap.end())
1063 HepGeom::Vector3D<float> lCenter;
1064 for(
int c = 0;
c < 8; ++
c)
1067 static const int arrP[] = { 3, 2, 1, 0, 7, 6, 5, 4 };
1068 static const int arrN[] = { 7, 6, 5, 4 ,3, 2, 1, 0};
1069 const int* arr = (detid.
ieta() > 0) ? &arrP[0] : &arrN[0];
1072 for (
int c = 0;
c < 8; ++
c) {
1073 points[
c*2 + 0 ] = lc[arr[
c]].x() - lCenter.x();
1074 points[
c*2 + 1 ] = lc[arr[
c]].y() - lCenter.y();
1077 float dz = (lc[4].z() -lc[0].z()) * 0.5;
1078 TGeoShape* solid =
new TGeoArb8(dz, &points[0]);
1079 volume =
new TGeoVolume(
"ecal oblique prism", solid,
GetMedium(
kHCal));
1080 caloShapeMap[cell->
param()] = volume;
1083 volume = volIt->second;
1085 HepGeom::Vector3D<float> gCenter;
1087 for (
int c = 0;
c < 8; ++
c) {
1088 gCenter += HepGeom::Vector3D<float>(gc[
c].x(), gc[
c].y(), gc[
c].z());
1092 TGeoTranslation gtr(gCenter.x(), gCenter.y(), gCenter.z());
1094 rot.SetAngles(cell->
phiPos()*TMath::RadToDeg(), 0, 0);
1098 std::stringstream nname;
1100 AddLeafNode(holder, volume, nname.str().c_str(),
new TGeoCombiTrans(gtr, rot));
1107 CaloVolMap caloShapeMapP;
1108 CaloVolMap caloShapeMapN;
1115 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
1121 if (!cell) { printf (
"EC not Z prism \n");
continue; }
1123 TGeoVolume* volume =
nullptr;
1124 CaloVolMap& caloShapeMap = (cell->
etaPos() > 0) ? caloShapeMapP : caloShapeMapN;
1125 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
1126 if ( volIt == caloShapeMap.end())
1131 HepGeom::Vector3D<float> lCenter;
1132 for(
int c = 0;
c < 8; ++
c)
1135 static const int arrP[] = { 3, 2, 1, 0, 7, 6, 5, 4 };
1136 static const int arrN[] = { 7, 6, 5, 4 ,3, 2, 1, 0};
1137 const int* arr = (detid.
ieta() > 0) ? &arrP[0] : &arrN[0];
1140 for (
int c = 0;
c < 8; ++
c) {
1141 points[
c*2 + 0 ] = lc[arr[
c]].x() - lCenter.x();
1142 points[
c*2 + 1 ] = lc[arr[
c]].y() - lCenter.y();
1145 float dz = (lc[4].z() -lc[0].z()) * 0.5;
1146 TGeoShape* solid =
new TGeoArb8(dz, &points[0]);
1147 volume =
new TGeoVolume(
"ecal oblique prism", solid,
GetMedium(
kHCal));
1148 caloShapeMap[cell->
param()] = volume;
1151 volume = volIt->second;
1153 HepGeom::Vector3D<float> gCenter;
1155 for (
int c = 0;
c < 8; ++
c) {
1156 gCenter += HepGeom::Vector3D<float>(gc[
c].x(), gc[
c].y(), gc[
c].z());
1160 TGeoTranslation gtr(gCenter.x(), gCenter.y(), gCenter.z());
1162 rot.SetAngles(cell->
phiPos()*TMath::RadToDeg(), 0, 0);
1166 std::stringstream nname;
1168 AddLeafNode(holder, volume, nname.str().c_str(),
new TGeoCombiTrans(gtr, rot));
1175 CaloVolMap caloShapeMapP;
1176 CaloVolMap caloShapeMapN;
1182 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
1187 if (!cell) { printf (
"EC not oblique \n");
continue; }
1188 TGeoVolume* volume =
nullptr;
1189 CaloVolMap& caloShapeMap = (cell->
etaPos() > 0) ? caloShapeMapP : caloShapeMapN;
1190 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
1191 if ( volIt == caloShapeMap.end())
1196 HepGeom::Vector3D<float> lCenter;
1197 for(
int c = 0;
c < 8; ++
c)
1201 static const int arrP[] = { 3, 2, 1, 0, 7, 6, 5, 4 };
1202 static const int arrN[] = { 7, 6, 5, 4 ,3, 2, 1, 0};
1203 const int* arr = (detid.
ieta() > 0) ? &arrP[0] : &arrN[0];
1206 for (
int c = 0;
c < 8; ++
c) {
1207 points[
c*2 + 0 ] = lc[arr[
c]].x() - lCenter.x();
1208 points[
c*2 + 1 ] = lc[arr[
c]].y() - lCenter.y();
1211 float dz = (lc[4].z() -lc[0].z()) * 0.5;
1212 TGeoShape* solid =
new TGeoArb8(dz, &points[0]);
1214 caloShapeMap[cell->
param()] = volume;
1217 volume = volIt->second;
1220 HepGeom::Vector3D<float> gCenter;
1222 for (
int c = 0;
c < 8; ++
c) {
1223 gCenter += HepGeom::Vector3D<float>(gc[
c].x(), gc[
c].y(), gc[
c].z());
1227 TGeoTranslation gtr(gCenter.x(), gCenter.y(), gCenter.z());
1229 rot.SetAngles(cell->
phiPos()*TMath::RadToDeg(), 0, 0);
1233 std::stringstream nname;
1235 AddLeafNode(holder, volume, nname.str().c_str(),
new TGeoCombiTrans(gtr, rot));
1245 for (
int i = 0;
i < 8; ++
i)
1246 gCenter += TEveVector(gc[
i].
x(), gc[
i].
y(), gc[
i].
z());
1249 TEveVector tgCenter;
1250 for (
int i = 4;
i < 8; ++
i)
1251 tgCenter += TEveVector(gc[
i].
x(), gc[
i].
y(), gc[
i].
z());
1255 TEveVector axis = tgCenter - gCenter;
1260 tr.GetBaseVec(1, v1t);
1263 TEveVector v1(v1t.x(), v1t.y(), v1t.z());
1264 double dot13 = axis.Dot(v1);
1265 TEveVector gd = axis;
1270 TMath::Cross(v1.Arr(), axis.Arr(), v2.Arr());
1271 TMath::Cross(axis.Arr(), v1.Arr(), v2.Arr());
1274 tr.SetBaseVec(1, v1.fX, v1.fY, v1.fZ);
1275 tr.SetBaseVec(2, v2.fX, v2.fY, v2.fZ);
1276 tr.SetBaseVec(3, axis.fX, axis.fY, axis.fZ);
1277 tr.Move3PF(gCenter.fX, gCenter.fY, gCenter.fZ);
1279 TGeoHMatrix*
out =
new TGeoHMatrix();
1280 tr.SetGeoHMatrix(*out);
1288 const HepGeom::Transform3D idtr;
1296 for(
int c = 0;
c < 8; ++
c )
1298 points[
c*2 ] = co[
c].x();
1299 points[
c*2+1] = co[
c].y();
1301 TGeoShape* solid =
new TGeoArb8(cell->
param()[0],
points);
1314 CaloVolMap caloShapeMap;
1320 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
1325 if (!cell) { printf(
"ecalBarrel cell not a TruncatedPyramid !!\n");
return; }
1327 TGeoVolume* volume =
nullptr;
1328 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
1329 if ( volIt == caloShapeMap.end())
1332 caloShapeMap[cell->
param()] = volume;
1335 volume = volIt->second;
1340 std::stringstream nname;
1342 AddLeafNode(holder, volume, nname.str().c_str(), mtx);
1351 for( std::vector<DetId>::const_iterator it = vid.begin(),
end = vid.end(); it !=
end; ++it)
1356 if (!cell) { printf(
"ecalEndcap cell not a TruncatedPyramid !!\n");
continue;}
1358 TGeoVolume* volume =
nullptr;
1359 CaloVolMap::iterator volIt = caloShapeMap.find(cell->
param());
1360 if ( volIt == caloShapeMap.end())
1364 caloShapeMap[cell->
param()] = volume;
1367 volume = volIt->second;
1372 std::stringstream nname;
1374 AddLeafNode(holder, volume, nname.str().c_str(), mtx);
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
TGeoMedium * m_dummyMedium
T getUntrackedParameter(std::string const &, T const &) const
std::shared_ptr< FWTGeoRecoGeometry > produce(const FWTGeoRecoGeometryRecord &)
const TrackerGeometry * m_trackerGeom
virtual float length() const =0
const CaloGeometry * m_caloGeom
unsigned int tidRing(const DetId &id) const
virtual const std::array< const float, 4 > parameters() const
edm::ESHandle< GlobalTrackingGeometry > m_geomRecord
int zside() const
get the z-side of the cell (1/-1)
TGeoShape * createShape(const GeomDet *det)
unsigned int pxfDisk(const DetId &id) const
const std::vector< const RPCRoll * > & rolls() const
Return a vector of all RPC rolls.
unsigned int tecRing(const DetId &id) const
ring id
CaloCellGeometry::Pt3D Pt3D
unsigned int pxbLadder(const DetId &id) const
unsigned int side(const DetId &id) const
const Bounds & bounds() const
unsigned int tidWheel(const DetId &id) const
unsigned int pxbModule(const DetId &id) const
char const * what() const override
std::string print(DetId detid) const
std::map< TGeoShape *, TGeoVolume * > m_shapeToVolume
const Plane & surface() const
The nominal surface of the GeomDet.
void addCaloTowerGeometry()
void setWhatProduced(T *iThis, const es::Label &iLabel=es::Label())
virtual float width() const =0
const DepRecordT & getRecord() const
unsigned int tibSide(const DetId &id) const
TGeoMedium * GetMedium(ERecoDet)
const CCGFloat * param() const
unsigned int tidSide(const DetId &id) const
const TrackerTopology * m_trackerTopology
CaloCellGeometry::Pt3D Pt3D
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
const DetContainer & detsTEC() const
void addHcalCaloGeometryOuter()
TGeoHMatrix * getEcalTrans(CaloCellGeometry::CornersVec const &gc)
static const int SubdetId
void addEcalCaloGeometry()
std::map< std::string, TGeoShape * > m_nameToShape
CaloCellGeometry::Pt3DVec Pt3DVec
unsigned int tobSide(const DetId &id) const
int ieta() const
get the cell ieta
const DetContainer & detsPXB() const
const std::vector< const GEMEtaPartition * > & etaPartitions() const
Return a vector of all GEM eta partitions.
const TrackingGeometry * slaveGeometry(DetId id) const
Return the pointer to the actual geometry for a given DetId.
DetId geographicalId() const
The label of this GeomDet.
void addHcalCaloGeometryBarrel()
int ieta() const
get the crystal ieta
std::map< ERecoDet, TGeoMedium * > m_recoMedium
virtual const DetContainer & dets() const =0
Returm a vector of all GeomDet (including all GeomDetUnits)
unsigned int tibModule(const DetId &id) const
const DetContainer & detsTIB() const
TGeoShape * makeEcalShape(const TruncatedPyramid *cell)
TGeoVolume * GetDaughter(TGeoVolume *mother, const char *prefix, ERecoDet cidx, int id)
unsigned int pxbLayer(const DetId &id) const
unsigned int tecModule(const DetId &id) const
const std::vector< const GEMSuperChamber * > & superChambers() const
Return a vector of all GEM super chambers.
const std::vector< ME0EtaPartition const * > & etaPartitions() const
Return a vector of all ME0 eta partitions.
virtual float thickness() const =0
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
int zside() const
get the z-side of the tower (1/-1)
CaloCellGeometry::Pt3D Pt3D
unsigned int tecOrder(const DetId &id) const
unsigned int tobModule(const DetId &id) const
CaloCellGeometry::Pt3DVec Pt3DVec
CornersVec const & getCorners() const
Returns the corner points of this cell's volume.
A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code...
std::vector< DetId > getValidDetIds() const
Get the list of all valid detector ids.
void addPixelForwardGeometry()
~FWTGeoRecoGeometryESProducer(void) override
FWTGeoRecoGeometryESProducer(const edm::ParameterSet &)
const DetContainer & detsPXF() const
void addHcalCaloGeometryForward()
const DetContainer & detsTOB() const
std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id.
const RotationType & rotation() const
TGeoVolume * GetTopHolder(const char *prefix, ERecoDet cidx)
int ieta() const
get the tower ieta
unsigned int tobRod(const DetId &id) const
std::shared_ptr< FWTGeoRecoGeometry > m_fwGeometry
const PositionType & position() const
void addHcalCaloGeometryEndcap()
T const * product() const
void addPixelBarrelGeometry()
unsigned int pxfPanel(const DetId &id) const
unsigned int pxfBlade(const DetId &id) const
CaloCellGeometry::Pt3DVec Pt3DVec
TGeoVolume * createVolume(const std::string &name, const GeomDet *det, ERecoDet=kDummy)
const DetContainer & detsTID() const
int zside() const
get the z-side of the crystal (1/-1)
unsigned int tibOrder(const DetId &id) const