diff --git a/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_InterLink.h b/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_InterLink.h index 079026e9ea5acc8477232cac5d0f501eb64d252a..331a2dd2995830c80ff26cb2751aae7d7a9aebe9 100755 --- a/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_InterLink.h +++ b/InnerDetector/InDetDetDescr/SCT_GeoModel/SCT_GeoModel/SCT_InterLink.h @@ -8,8 +8,14 @@ #include "SCT_GeoModel/SCT_ComponentFactory.h" #include <string> +#include <vector> class GeoMaterial; +class GeoTube; +class GeoLogVol; +class GeoPhysVol; +class GeoTubs; +class GeoTransform; class SCT_InterLink : public SCT_SharedComponentFactory { @@ -23,7 +29,6 @@ public: double outerRadius() const {return m_outerRadius;} double length() const {return m_length;} - private: void getParameters(); virtual GeoVPhysVol * build(); @@ -52,6 +57,19 @@ private: double m_phiPosBearing; int m_nRepeatBearing; + const GeoTube* m_interLinkShape; + const GeoLogVol* m_interLinkLog; + GeoPhysVol* m_interLink; + const GeoTubs* m_interLinkSegShape; + const GeoLogVol* m_interLinkSegLog; + GeoPhysVol* m_interLinkSeg; + const GeoTubs* m_bearingShape; + const GeoLogVol* m_bearingLog; + GeoPhysVol* m_bearing; + const GeoTubs* m_FSIFlangeShape; + const GeoLogVol* m_FSIFlangeLog; + GeoPhysVol* m_FSIFlange; + std::vector<GeoTransform*> m_geoTransforms; }; #endif // SCT_GEOMODEL_SCT_INTERLINK_H diff --git a/InnerDetector/InDetDetDescr/SCT_GeoModel/src/SCT_InterLink.cxx b/InnerDetector/InDetDetDescr/SCT_GeoModel/src/SCT_InterLink.cxx index c598f20907224e79f338cb8090157402ee2e7102..3e14d2ae33d064833c2136b5d1e3ba68f765fc6c 100755 --- a/InnerDetector/InDetDetDescr/SCT_GeoModel/src/SCT_InterLink.cxx +++ b/InnerDetector/InDetDetDescr/SCT_GeoModel/src/SCT_InterLink.cxx @@ -17,13 +17,24 @@ #include "CLHEP/Units/SystemOfUnits.h" SCT_InterLink::SCT_InterLink(const std::string & name) - : SCT_SharedComponentFactory(name) + : SCT_SharedComponentFactory(name), + m_interLinkShape(nullptr), + m_interLinkLog(nullptr), + m_interLink(nullptr), + m_interLinkSegShape(nullptr), + m_interLinkSegLog(nullptr), + m_interLinkSeg(nullptr), + m_bearingShape(nullptr), + m_bearingLog(nullptr), + m_bearing(nullptr), + m_FSIFlangeShape(nullptr), + m_FSIFlangeLog(nullptr), + m_FSIFlange(nullptr) { getParameters(); m_physVolume = build(); } - void SCT_InterLink::getParameters() { @@ -70,64 +81,69 @@ SCT_InterLink::build() // Make the interlink. SCT_MaterialManager materials; - GeoPhysVol* interLink; if(m_nRepeat == 1) { // For old geometry interlink is a simple tube of material - const GeoTube* interLinkShape = new GeoTube(m_innerRadius, m_outerRadius, 0.5*m_length); - const GeoMaterial* material = materials.getMaterialForVolume(m_materialName, interLinkShape->volume()); + m_interLinkShape = new GeoTube(m_innerRadius, m_outerRadius, 0.5*m_length); + const GeoMaterial* material = materials.getMaterialForVolume(m_materialName, m_interLinkShape->volume()); if(!material) {material = materials.getMaterial(m_materialName);} - const GeoLogVol* interLinkLog = new GeoLogVol(getName(), interLinkShape, material); - interLink = new GeoPhysVol(interLinkLog); + m_interLinkLog = new GeoLogVol(getName(), m_interLinkShape, material); + m_interLink = new GeoPhysVol(m_interLinkLog); } else { // In updated version we make air tube containing interlink segments and B6 bearings // And also include FSI flange segments if defined // Air tube: - const GeoTube* interLinkShape = new GeoTube(m_innerRadius, m_outerRadiusBearing, 0.5*m_length); - const GeoLogVol* interLinkLog = new GeoLogVol(getName(), interLinkShape, materials.gasMaterial()); - interLink = new GeoPhysVol(interLinkLog); + m_interLinkShape = new GeoTube(m_innerRadius, m_outerRadiusBearing, 0.5*m_length); + m_interLinkLog = new GeoLogVol(getName(), m_interLinkShape, materials.gasMaterial()); + m_interLink = new GeoPhysVol(m_interLinkLog); // Interlink segments: - const GeoTubs* interLinkSegShape = new GeoTubs(m_innerRadius, m_outerRadius, 0.5*m_length, - 0.5*m_dPhi*CLHEP::radian, m_dPhi*CLHEP::radian); - const GeoLogVol* interLinkSegLog = new GeoLogVol("InterlinkSegment", interLinkSegShape, materials.getMaterialForVolume(m_materialName, interLinkSegShape->volume())); - GeoPhysVol* interLinkSeg = new GeoPhysVol(interLinkSegLog); + m_interLinkSegShape = new GeoTubs(m_innerRadius, m_outerRadius, 0.5*m_length, - 0.5*m_dPhi*CLHEP::radian, m_dPhi*CLHEP::radian); + m_interLinkSegLog = new GeoLogVol("InterlinkSegment", m_interLinkSegShape, materials.getMaterialForVolume(m_materialName, m_interLinkSegShape->volume())); + m_interLinkSeg = new GeoPhysVol(m_interLinkSegLog); for(int i=0; i<m_nRepeat; i++) { double interlinkAngle = m_phiPos + (i * 360./m_nRepeat)*CLHEP::deg; - interLink->add(new GeoTransform(HepGeom::RotateZ3D(interlinkAngle))); - interLink->add(interLinkSeg); + GeoTransform* geoTransform = new GeoTransform(HepGeom::RotateZ3D(interlinkAngle)); + m_geoTransforms.push_back(geoTransform); + m_interLink->add(geoTransform); + m_interLink->add(m_interLinkSeg); } // B6 bearings - const GeoTubs* bearingShape = new GeoTubs(m_innerRadiusBearing, m_outerRadiusBearing, 0.5*m_lengthBearing, - 0.5*m_dPhiBearing*CLHEP::radian, m_dPhiBearing*CLHEP::radian); - const GeoLogVol* bearingLog = new GeoLogVol("Bearing", bearingShape, materials.getMaterialForVolume(m_materialNameBearing, bearingShape->volume())); - GeoPhysVol* bearing = new GeoPhysVol(bearingLog); + m_bearingShape = new GeoTubs(m_innerRadiusBearing, m_outerRadiusBearing, 0.5*m_lengthBearing, - 0.5*m_dPhiBearing*CLHEP::radian, m_dPhiBearing*CLHEP::radian); + m_bearingLog = new GeoLogVol("Bearing", m_bearingShape, materials.getMaterialForVolume(m_materialNameBearing, m_bearingShape->volume())); + m_bearing = new GeoPhysVol(m_bearingLog); for(int i=0; i<m_nRepeatBearing; i++) { double bearingAngle = m_phiPosBearing + (i * 360./m_nRepeatBearing)*CLHEP::deg; - interLink->add(new GeoTransform(HepGeom::RotateZ3D(bearingAngle))); - interLink->add(bearing); + GeoTransform* geoTransform = new GeoTransform(HepGeom::RotateZ3D(bearingAngle)); + m_geoTransforms.push_back(geoTransform); + m_interLink->add(geoTransform); + m_interLink->add(m_bearing); } // FSI Flange segments: // These exactly fill gaps between interlink segments, with smaller radial extent if(m_includeFSIFlange) { double dPhiFSI = (360./m_nRepeat)*CLHEP::deg - m_dPhi; - const GeoTubs* FSIFlangeShape = new GeoTubs(m_innerRadiusFSIFlange, m_outerRadiusFSIFlange, 0.5*m_length, - 0.5*dPhiFSI*CLHEP::radian, dPhiFSI*CLHEP::radian); - const GeoLogVol* FSIFlangeLog = new GeoLogVol("FSIFlangeSegment", FSIFlangeShape, materials.getMaterialForVolume(m_materialNameFSIFlange, FSIFlangeShape->volume())); - GeoPhysVol* FSIFlange = new GeoPhysVol(FSIFlangeLog); + m_FSIFlangeShape = new GeoTubs(m_innerRadiusFSIFlange, m_outerRadiusFSIFlange, 0.5*m_length, - 0.5*dPhiFSI*CLHEP::radian, dPhiFSI*CLHEP::radian); + m_FSIFlangeLog = new GeoLogVol("FSIFlangeSegment", m_FSIFlangeShape, materials.getMaterialForVolume(m_materialNameFSIFlange, m_FSIFlangeShape->volume())); + m_FSIFlange = new GeoPhysVol(m_FSIFlangeLog); for(int i=0; i<m_nRepeat; i++) { double phiPosFSI = m_phiPos + (180./m_nRepeat)*CLHEP::deg; double FSIFlangeAngle = phiPosFSI + (i * 360./m_nRepeat)*CLHEP::deg; - interLink->add(new GeoTransform(HepGeom::RotateZ3D(FSIFlangeAngle))); - interLink->add(FSIFlange); + GeoTransform* geoTransform = new GeoTransform(HepGeom::RotateZ3D(FSIFlangeAngle)); + m_geoTransforms.push_back(geoTransform); + m_interLink->add(geoTransform); + m_interLink->add(m_FSIFlange); } } } - return interLink; + return m_interLink; }