//
// Created: ??? ???
// Updated: 11 Dec 2007 Mario Sitta
+// Updated: 20 Mar 2012 Mario Sitta Reimplemented with simpler shapes
+// Updated: 20 Jul 2012 Mario Sitta Reimplemented with Composite Shape
+// Updated: 12 Oct 2012 Mario Sitta Composite Shape also for EndCap
//
// Technical data are taken from: ALICE-Thermal Screen "Cone transition"
// (thermal-screen1_a3.ps), "Cylinder" (thermal-screen2_a3.ps), "Half
const Double_t kInnerBCentral = 2.023 *fgkcm;
const Double_t kOuterACentral = 2.4374*fgkcm;
const Double_t kOuterBCentral = 3.8162*fgkcm;
+ const Double_t kCoolManifHoleWid = 24.0*fgkmm; // TO BE CHECKED!
+ const Double_t kCoolManifHoleLen = 57.5*fgkmm; // 54.2 + 1.5*2 + 0.3 toll.
+ const Double_t kCoolManifHoleZPos = 36.47*fgkcm;// MUST match SPD class
+ const Double_t kCoolSuppHoleWid = 15.0*fgkmm;
+ const Double_t kCoolSuppHoleLen = 38.4*fgkmm; // 35.1 + 1.5*2 + 0.3 toll.// TO BE CHECKED!
+ const Double_t kCoolSuppHoleZPos = 26.5*fgkcm;
// Dimensions of the EndCap shield
const Double_t kHalfLengthEndCap = 25.*fgkmm;
const Double_t kThicknessEndCap = 2.0*fgkmm;
const Double_t kInnerRadialCone = 37.3*fgkcm;
const Double_t kOuterRadialCone = 39.0*fgkcm;
const Double_t kInnerACone = 14.2344*fgkcm;
- // const Double_t kInnerBCone = 9.0915*fgkcm;
+ const Double_t kInnerBCone = 9.0915*fgkcm;
const Double_t kOuterACone = 9.5058*fgkcm;
- // const Double_t kOuterBCone = 14.8831*fgkcm;
+ const Double_t kOuterBCone = 14.8831*fgkcm;
+ // Dimensions of the filler blocks and bars
+ const Double_t kFillerBlockLength = 20.0*fgkmm;
+ const Double_t kFillerBlockHoleR = 2.4*fgkmm;
+ const Double_t kFillerBlockZTrans = 1.5*fgkmm;
+ const Double_t kFillerBarLength = 220.0*fgkmm;
+ const Double_t kFillerBarThick = 1.0*fgkmm;
// Dimensions of the Flange's Ring and Wing
const Double_t kHalfLengthRing = 7.5*fgkmm;
const Double_t kThicknessRing = 0.3*fgkmm;
const Double_t kWideWing = 6.0*fgkcm;
const Double_t kThetaWing = 45.0;
// Common data
- const Double_t kTheta = 36.0*TMath::DegToRad();
+ const Double_t kThetaDeg = 36.0;
+ const Double_t kTheta = kThetaDeg*TMath::DegToRad();
const Double_t kThicknessOmega = 0.3*fgkmm;
// Local variables
- Double_t x, y;
- Double_t zpos;
- Double_t xshld[24], yshld[24];
- Double_t xair[24] , yair[24];
+ Double_t xpos, ypos, zpos;
+ Double_t xXtru[24], yXtru[24];
+ Double_t xshld[24], yshld[24]; // Coord. of external thermal shape
+ Double_t xair[24] , yair[24]; // Coord. of whole air shape
Double_t xomega[48], yomega[48];
- // Double_t *xyarb8;
+
// The entire shield is made up of two half central shields
// symmetric with respect to the XZ plane, four half end cap
TGeoVolumeAssembly *vM = new TGeoVolumeAssembly("ITSspdThermalShield");
- // The central half shield: a half tube of carbon fiber,
- // a similar but proportionally smaller half tube of air inside it,
- // and a Omega-shaped carbon fiber insert inside the air.
- // They are all XTru shapes
-
- TGeoXtru *centralshape = new TGeoXtru(2);
+ // The central half shield: a Composite Shape of carbon fiber.
+ // We need Composite Shapes because we have holes in which the SPD
+ // cooling manifolds and their supports will be placed.
+ // All Composite elements are XTru shapes
+ // First determine the external shape points
CreateSPDThermalShape(kInnerACentral,kInnerBCentral,kInnerRadiusCentral,
kOuterACentral,kOuterBCentral,kOuterRadiusCentral,
kTheta,xshld,yshld);
- centralshape->DefinePolygon(24,xshld,yshld);
- centralshape->DefineSection(0,-kHalfLengthCentral);
- centralshape->DefineSection(1, kHalfLengthCentral);
-
// Now rescale to get the air volume dimensions
InsidePoint(xshld[23], yshld[23],
xshld[ 0], yshld[ 0],
xshld[ 0], yshld[ 0], kThicknessCentral,
xair[23], yair[23]);
- // Create the air shape
- TGeoXtru *centralairshape = new TGeoXtru(2);
-
- centralairshape->DefinePolygon(24,xair,yair);
- centralairshape->DefineSection(0,-kHalfLengthCentral);
- centralairshape->DefineSection(1, kHalfLengthCentral);
+ // Then use them to determine the Omega shape points
+ CreateSPDOmegaShape(xair,yair,kThicknessOmega,xomega,yomega);
- // Create the Omega insert
- TGeoXtru *centralomegashape = new TGeoXtru(2);
+ // Finally create the single Xtru volumes
+ TGeoXtru *uppershape = new TGeoXtru(2);
+ uppershape->SetName("upTS");
- CreateSPDOmegaShape(xair,yair,kThicknessOmega,xomega,yomega);
+ for (Int_t j=0; j<6; j++) {
+ xXtru[j ] = xair[11-j];
+ yXtru[j ] = yair[11-j];
+ xXtru[j+6] = xshld[j+6];
+ yXtru[j+6] = yshld[j+6];
+ }
+ yXtru[5] = yXtru[6]; // Air is not at same Y as thermal shield
+ for (Int_t j=0; j<12; j++) {
+ xXtru[23-j] = -xXtru[j];
+ yXtru[23-j] = yXtru[j];
+ }
- centralomegashape->DefinePolygon(48,xomega,yomega);
- centralomegashape->DefineSection(0,-kHalfLengthCentral);
- centralomegashape->DefineSection(1, kHalfLengthCentral);
+ uppershape->DefinePolygon(24,xXtru,yXtru);
+ uppershape->DefineSection(0,-kHalfLengthCentral);
+ uppershape->DefineSection(1, kHalfLengthCentral);
- // The end cap half shield: a half tube of carbon fiber,
- // a similar but proportionally smaller half tube of air inside it,
- // and a Omega-shaped carbon fiber insert inside the air.
- // They are all XTru shapes
+ TGeoXtru *lowershape = new TGeoXtru(2);
+ lowershape->SetName("lwTS");
- TGeoXtru *endcapshape = new TGeoXtru(2);
+ for (Int_t j=0; j<6; j++) {
+ xXtru[j ] = xshld[j];
+ yXtru[j ] = yshld[j];
+ xXtru[j+6] = xair[5-j];
+ yXtru[j+6] = yair[5-j];
+ }
+ yXtru[6] = yXtru[5]; // Air is not at same Y as thermal shield
+ for (Int_t j=0; j<12; j++) {
+ xXtru[23-j] = -xXtru[j];
+ yXtru[23-j] = yXtru[j];
+ }
+ lowershape->DefinePolygon(24,xXtru,yXtru);
+ lowershape->DefineSection(0,-kHalfLengthCentral);
+ lowershape->DefineSection(1, kHalfLengthCentral);
+
+ yomega[10] = yshld[6]; // Add also base thickness
+ yomega[11] = yomega[10];
+ yomega[36] = yshld[17];
+ yomega[37] = yomega[36];
+
+ TGeoXtru *omegashape = new TGeoXtru(2);
+ omegashape->SetName("omTS");
+
+ omegashape->DefinePolygon(48,xomega,yomega);
+ omegashape->DefineSection(0,-kHalfLengthCentral);
+ omegashape->DefineSection(1, kHalfLengthCentral);
+
+ // And now the holes and their position matrices
+ Double_t radius = 0.5*(uppershape->GetY(11)+lowershape->GetY(0));
+
+ TGeoBBox *manifhole = new TGeoBBox(kCoolManifHoleWid/2,
+ 0.55*(uppershape->GetY(11)-lowershape->GetY(0)),
+ kCoolManifHoleLen/2);
+ manifhole->SetName("mhTS");
+
+ zpos = kCoolManifHoleZPos;
+
+ TGeoTranslation *m1p = new TGeoTranslation("m1p",0,radius, zpos);
+ TGeoTranslation *m1n = new TGeoTranslation("m1n",0,radius,-zpos);
+ m1p->RegisterYourself();
+ m1n->RegisterYourself();
+
+ TGeoCombiTrans *m2p = new TGeoCombiTrans("m2p",radius*SinD(kThetaDeg),
+ radius*CosD(kThetaDeg),
+ zpos,
+ new TGeoRotation("",-kThetaDeg,0,0));
+ TGeoCombiTrans *m2n = new TGeoCombiTrans("m2n",radius*SinD(kThetaDeg),
+ radius*CosD(kThetaDeg),
+ -zpos,
+ new TGeoRotation("",-kThetaDeg,0,0));
+ m2p->RegisterYourself();
+ m2n->RegisterYourself();
+
+ TGeoCombiTrans *m3p = new TGeoCombiTrans("m3p",radius*SinD(-kThetaDeg),
+ radius*CosD(-kThetaDeg),
+ zpos,
+ new TGeoRotation("",kThetaDeg,0,0));
+ TGeoCombiTrans *m3n = new TGeoCombiTrans("m3n",radius*SinD(-kThetaDeg),
+ radius*CosD(-kThetaDeg),
+ -zpos,
+ new TGeoRotation("",kThetaDeg,0,0));
+ m3p->RegisterYourself();
+ m3n->RegisterYourself();
+
+ TGeoCombiTrans *m4p = new TGeoCombiTrans("m4p",radius*SinD(2*kThetaDeg),
+ radius*CosD(2*kThetaDeg),
+ zpos,
+ new TGeoRotation("",-2*kThetaDeg,0,0));
+ TGeoCombiTrans *m4n = new TGeoCombiTrans("m4n",radius*SinD(2*kThetaDeg),
+ radius*CosD(2*kThetaDeg),
+ -zpos,
+ new TGeoRotation("",-2*kThetaDeg,0,0));
+ m4p->RegisterYourself();
+ m4n->RegisterYourself();
+
+ TGeoCombiTrans *m5p = new TGeoCombiTrans("m5p",radius*SinD(-2*kThetaDeg),
+ radius*CosD(-2*kThetaDeg),
+ zpos,
+ new TGeoRotation("",2*kThetaDeg,0,0));
+ TGeoCombiTrans *m5n = new TGeoCombiTrans("m5n",radius*SinD(-2*kThetaDeg),
+ radius*CosD(-2*kThetaDeg),
+ -zpos,
+ new TGeoRotation("",2*kThetaDeg,0,0));
+ m5p->RegisterYourself();
+ m5n->RegisterYourself();
+
+ TGeoBBox *supphole = new TGeoBBox(kCoolSuppHoleWid/2,
+ 0.55*(uppershape->GetY(11)-lowershape->GetY(0)),
+ kCoolSuppHoleLen/2);
+ supphole->SetName("shTS");
+
+ zpos = kCoolSuppHoleZPos;
+
+ TGeoTranslation *s1p = new TGeoTranslation("s1p",0,radius, zpos);
+ TGeoTranslation *s1n = new TGeoTranslation("s1n",0,radius,-zpos);
+ s1p->RegisterYourself();
+ s1n->RegisterYourself();
+
+ TGeoCombiTrans *s2p = new TGeoCombiTrans("s2p",radius*SinD(kThetaDeg),
+ radius*CosD(kThetaDeg),
+ zpos,
+ new TGeoRotation("",-kThetaDeg,0,0));
+ TGeoCombiTrans *s2n = new TGeoCombiTrans("s2n",radius*SinD(kThetaDeg),
+ radius*CosD(kThetaDeg),
+ -zpos,
+ new TGeoRotation("",-kThetaDeg,0,0));
+ s2p->RegisterYourself();
+ s2n->RegisterYourself();
+
+ TGeoCombiTrans *s3p = new TGeoCombiTrans("s3p",radius*SinD(-kThetaDeg),
+ radius*CosD(-kThetaDeg),
+ zpos,
+ new TGeoRotation("",kThetaDeg,0,0));
+ TGeoCombiTrans *s3n = new TGeoCombiTrans("s3n",radius*SinD(-kThetaDeg),
+ radius*CosD(-kThetaDeg),
+ -zpos,
+ new TGeoRotation("",kThetaDeg,0,0));
+ s3p->RegisterYourself();
+ s3n->RegisterYourself();
+
+ TGeoCombiTrans *s4p = new TGeoCombiTrans("s4p",radius*SinD(2*kThetaDeg),
+ radius*CosD(2*kThetaDeg),
+ zpos,
+ new TGeoRotation("",-2*kThetaDeg,0,0));
+ TGeoCombiTrans *s4n = new TGeoCombiTrans("s4n",radius*SinD(2*kThetaDeg),
+ radius*CosD(2*kThetaDeg),
+ -zpos,
+ new TGeoRotation("",-2*kThetaDeg,0,0));
+ s4p->RegisterYourself();
+ s4n->RegisterYourself();
+
+ TGeoCombiTrans *s5p = new TGeoCombiTrans("s5p",radius*SinD(-2*kThetaDeg),
+ radius*CosD(-2*kThetaDeg),
+ zpos,
+ new TGeoRotation("",2*kThetaDeg,0,0));
+ TGeoCombiTrans *s5n = new TGeoCombiTrans("s5n",radius*SinD(-2*kThetaDeg),
+ radius*CosD(-2*kThetaDeg),
+ -zpos,
+ new TGeoRotation("",2*kThetaDeg,0,0));
+ s5p->RegisterYourself();
+ s5n->RegisterYourself();
+
+ // Finally the actual shape
+ TGeoCompositeShape *centralshape = new TGeoCompositeShape("centralTS",
+ "upTS+lwTS+omTS-mhTS:m1p-mhTS:m1n-mhTS:m2p-mhTS:m2n-mhTS:m3p-mhTS:m3n-mhTS:m4p-mhTS:m4n-mhTS:m5p-mhTS:m5n-shTS:s1p-shTS:s1n-shTS:s2p-shTS:s2n-shTS:s3p-shTS:s3n-shTS:s4p-shTS:s4n-shTS:s5p-shTS:s5n");
+
+ // The end cap half shield: a Composite Shape of carbon fiber.
+ // We need Composite Shapes because we have elements partially
+ // entering the empty spaces, and this would create overlaps or
+ // extrusions.
+ // All Composite elements are XTru shapes
+
+ // First determine the external shape points
CreateSPDThermalShape(kInnerAEndCap,kInnerBEndCap,kInnerRadiusEndCap,
kOuterAEndCap,kOuterBEndCap,kOuterRadiusEndCap,
kTheta,xshld,yshld);
- endcapshape->DefinePolygon(24,xshld,yshld);
- endcapshape->DefineSection(0,-kHalfLengthEndCap);
- endcapshape->DefineSection(1, kHalfLengthEndCap);
-
// Now rescale to get the air volume dimensions
InsidePoint(xshld[23], yshld[23],
xshld[ 0], yshld[ 0],
xshld[ 0], yshld[ 0], kThicknessEndCap,
xair[23], yair[23]);
- // Create the air shape
- TGeoXtru *endcapairshape = new TGeoXtru(2);
+ // Then use them to determine the Omega shape points
+ CreateSPDOmegaShape(xair,yair,kThicknessOmega,xomega,yomega);
- endcapairshape->DefinePolygon(24,xair,yair);
- endcapairshape->DefineSection(0,-kHalfLengthEndCap);
- endcapairshape->DefineSection(1, kHalfLengthEndCap);
+ // Finally create the single Xtru volumes
+ TGeoXtru *upendcapshape = new TGeoXtru(2);
+ upendcapshape->SetName("upEC");
- // Create the Omega insert
- TGeoXtru *endcapomegashape = new TGeoXtru(2);
+ for (Int_t j=0; j<6; j++) {
+ xXtru[j ] = xair[11-j];
+ yXtru[j ] = yair[11-j];
+ xXtru[j+6] = xshld[j+6];
+ yXtru[j+6] = yshld[j+6];
+ }
+ yXtru[5] = yXtru[6]; // Air is not at same Y as thermal shield
+ for (Int_t j=0; j<12; j++) {
+ xXtru[23-j] = -xXtru[j];
+ yXtru[23-j] = yXtru[j];
+ }
- CreateSPDOmegaShape(xair,yair,kThicknessOmega,xomega,yomega);
+ upendcapshape->DefinePolygon(24,xXtru,yXtru);
+ upendcapshape->DefineSection(0,-kHalfLengthEndCap);
+ upendcapshape->DefineSection(1, kHalfLengthEndCap);
- endcapomegashape->DefinePolygon(48,xomega,yomega);
- endcapomegashape->DefineSection(0,-kHalfLengthEndCap);
- endcapomegashape->DefineSection(1, kHalfLengthEndCap);
+ TGeoXtru *lowendcapshape = new TGeoXtru(2);
+ lowendcapshape->SetName("lwEC");
- // The cone half shield is more complex since there is no basic
- // TGeo shape to describe it correctly. So it is made of a series
- // of TGeoArb8 shapes filled with air, which all together make up the
- // the cone AND its internal insert. Part of the following code is
- // adapted from SPDThermalSheald method.
+ for (Int_t j=0; j<6; j++) {
+ xXtru[j ] = xshld[j];
+ yXtru[j ] = yshld[j];
+ xXtru[j+6] = xair[5-j];
+ yXtru[j+6] = yair[5-j];
+ }
+ yXtru[6] = yXtru[5]; // Air is not at same Y as thermal shield
+ for (Int_t j=0; j<12; j++) {
+ xXtru[23-j] = -xXtru[j];
+ yXtru[23-j] = yXtru[j];
+ }
+
+ lowendcapshape->DefinePolygon(24,xXtru,yXtru);
+ lowendcapshape->DefineSection(0,-kHalfLengthEndCap);
+ lowendcapshape->DefineSection(1, kHalfLengthEndCap);
+
+ yomega[10] = yshld[6]; // Add also base thickness
+ yomega[11] = yomega[10];
+ yomega[36] = yshld[17];
+ yomega[37] = yomega[36];
+
+ TGeoXtru *omgendcapshape = new TGeoXtru(2);
+ omgendcapshape->SetName("omEC");
+
+ omgendcapshape->DefinePolygon(48,xomega,yomega);
+ omgendcapshape->DefineSection(0,-kHalfLengthEndCap);
+ omgendcapshape->DefineSection(1, kHalfLengthEndCap);
+
+ // Finally the actual shape
+ TGeoCompositeShape *endcapshape = new TGeoCompositeShape("endcapTS",
+ "upEC+lwEC+omEC");
+
+ // The filler block: a Xtru
+ TGeoXtru *fillershape = new TGeoXtru(2);
+
+ xXtru[0] = omgendcapshape->GetX(1) + 0.0002; // Avoid thiny extrusion
+ yXtru[0] = omgendcapshape->GetY(1);
+ xXtru[1] = omgendcapshape->GetX(0) + 0.0002;
+ yXtru[1] = omgendcapshape->GetY(0);
+ xXtru[2] = omgendcapshape->GetX(47) - 0.0002;
+ yXtru[2] = omgendcapshape->GetY(47);
+ xXtru[3] = omgendcapshape->GetX(46);
+ yXtru[3] = omgendcapshape->GetY(46);
+
+ fillershape->DefinePolygon(4,xXtru,yXtru);
+ fillershape->DefineSection(0,-kFillerBlockLength/2);
+ fillershape->DefineSection(1, kFillerBlockLength/2);
+
+ // The hole in the filler: a Tube (made of air)
+ TGeoTube *fillerholeshape = new TGeoTube(0, kFillerBlockHoleR,
+ kFillerBlockLength/2);
- // Filled portions
- TGeoArb8 *sC1 = new TGeoArb8(kHalfLengthCone);
- TGeoArb8 *sC2 = new TGeoArb8(kHalfLengthCone);
+ // The filler bar: a BBox
+ Double_t fside = omgendcapshape->GetY(14) - omgendcapshape->GetY(13);
+ TGeoBBox *fillbarshape = new TGeoBBox(fside/2, fside/2, kFillerBarLength/2);
+ // The hole in the bar filler: a smaller BBox (made of air)
+ fside -= 2*kFillerBarThick;
+ TGeoBBox *fillbarholeshape = new TGeoBBox(fside/2, fside/2,
+ kFillerBarLength/2);
+
+ // The cone half shield is more complex since there is no basic
+ // TGeo shape to describe it correctly. So it is a Composite Shape
+ // of a series of TGeoArb8 shapes, in which TGeoArb8 shapes filled
+ // with air are placed, which all together make up the cone AND
+ // its internal insert. Part of the following code is adapted from
+ // old SPDThermalSheald method.
+
+ // sCn : Filled portions, sChn : Air holes
+ TGeoArb8 *sC1 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC2 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC3 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC4 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC5 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC6 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC7 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC8 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC9 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC10 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sC11 = new TGeoArb8(kHalfLengthCone);
+
+ sC1->SetName("sC1");
+ sC2->SetName("sC2");
+ sC3->SetName("sC3");
+ sC4->SetName("sC4");
+ sC5->SetName("sC5");
+ sC6->SetName("sC6");
+ sC7->SetName("sC7");
+ sC8->SetName("sC8");
+ sC9->SetName("sC9");
+ sC10->SetName("sC10");
+ sC11->SetName("sC11");
+
+ TGeoArb8 *sCh1 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh2 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh3 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh4 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh5 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh6 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh7 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh8 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh9 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh10 = new TGeoArb8(kHalfLengthCone);
+ TGeoArb8 *sCh11 = new TGeoArb8(kHalfLengthCone);
+
+ sCh1->SetName("sCh1");
+ sCh2->SetName("sCh2");
+ sCh3->SetName("sCh3");
+ sCh4->SetName("sCh4");
+ sCh5->SetName("sCh5");
+ sCh6->SetName("sCh6");
+ sCh7->SetName("sCh7");
+ sCh8->SetName("sCh8");
+ sCh9->SetName("sCh9");
+ sCh10->SetName("sCh10");
+ sCh11->SetName("sCh11");
+
+ // Smaller end: determine the coordinates of the points of carbon fiber
CreateSPDThermalShape(kInnerACentral,kInnerBCentral,kInnerRadiusCentral,
kOuterACentral,kOuterBCentral,kOuterRadiusCentral,
kTheta,xshld,yshld);
- sC1->SetVertex(0,xshld[12],yshld[12]);
- sC1->SetVertex(1,xshld[11],yshld[11]);
- sC1->SetVertex(2,xshld[ 0],yshld[ 0]);
- sC1->SetVertex(3,xshld[23],yshld[23]);
+ sC1->SetVertex(0, xshld[12], yshld[12]);
+ sC1->SetVertex(1, xshld[11], yshld[11]);
+ sC1->SetVertex(2, xshld[ 0], yshld[ 0]);
+ sC1->SetVertex(3, xshld[23], yshld[23]);
+
+ sC2->SetVertex(0, xshld[11], yshld[11]);
+ sC2->SetVertex(1, xshld[10], yshld[10]);
+ sC2->SetVertex(2, xshld[ 1], yshld[ 1]);
+ sC2->SetVertex(3, xshld[ 0], yshld[ 0]);
+
+ sC3->SetVertex(0, xshld[10], yshld[10]);
+ sC3->SetVertex(1, xshld[ 9], yshld[ 9]);
+ sC3->SetVertex(2, xshld[ 2], yshld[ 2]);
+ sC3->SetVertex(3, xshld[ 1], yshld[ 1]);
+
+ sC4->SetVertex(0, xshld[ 9], yshld[ 9]);
+ sC4->SetVertex(1, xshld[ 8], yshld[ 8]);
+ sC4->SetVertex(2, xshld[ 3], yshld[ 3]);
+ sC4->SetVertex(3, xshld[ 2], yshld[ 2]);
+
+ sC5->SetVertex(0, xshld[ 8], yshld[ 8]);
+ sC5->SetVertex(1, xshld[ 7], yshld[ 7]);
+ sC5->SetVertex(2, xshld[ 4], yshld[ 4]);
+ sC5->SetVertex(3, xshld[ 3], yshld[ 3]);
+
+ sC6->SetVertex(0, xshld[ 7], yshld[ 7]);
+ sC6->SetVertex(1, xshld[ 6], yshld[ 6]);
+ sC6->SetVertex(2, xshld[ 5], yshld[ 5]);
+ sC6->SetVertex(3, xshld[ 4], yshld[ 4]);
+
+ sC7->SetVertex(0,-xshld[10], yshld[10]);
+ sC7->SetVertex(1,-xshld[11], yshld[11]);
+ sC7->SetVertex(2,-xshld[ 0], yshld[ 0]);
+ sC7->SetVertex(3,-xshld[ 1], yshld[ 1]);
+
+ sC8->SetVertex(0,-xshld[ 9], yshld[ 9]);
+ sC8->SetVertex(1,-xshld[10], yshld[10]);
+ sC8->SetVertex(2,-xshld[ 1], yshld[ 1]);
+ sC8->SetVertex(3,-xshld[ 2], yshld[ 2]);
+
+ sC9->SetVertex(0,-xshld[ 8], yshld[ 8]);
+ sC9->SetVertex(1,-xshld[ 9], yshld[ 9]);
+ sC9->SetVertex(2,-xshld[ 2], yshld[ 2]);
+ sC9->SetVertex(3,-xshld[ 3], yshld[ 3]);
+
+ sC10->SetVertex(0,-xshld[ 7], yshld[ 7]);
+ sC10->SetVertex(1,-xshld[ 8], yshld[ 8]);
+ sC10->SetVertex(2,-xshld[ 3], yshld[ 3]);
+ sC10->SetVertex(3,-xshld[ 4], yshld[ 4]);
+
+ sC11->SetVertex(0,-xshld[ 6], yshld[ 6]);
+ sC11->SetVertex(1,-xshld[ 7], yshld[ 7]);
+ sC11->SetVertex(2,-xshld[ 4], yshld[ 4]);
+ sC11->SetVertex(3,-xshld[ 5], yshld[ 5]);
+
+ // Then rescale to get the air volume dimensions
+ InsidePoint(xshld[23], yshld[23],
+ xshld[ 0], yshld[ 0],
+ xshld[ 1], yshld[ 1], kThicknessCone,
+ xair[0], yair[0]);
+ for (Int_t i=1; i<23; i++) {
+ InsidePoint(xshld[i-1], yshld[i-1],
+ xshld[ i ], yshld[ i ],
+ xshld[i+1], yshld[i+1], kThicknessCone,
+ xair[i], yair[i]);
+ }
+ InsidePoint(xshld[22], yshld[22],
+ xshld[23], yshld[23],
+ xshld[ 0], yshld[ 0], kThicknessCone,
+ xair[23], yair[23]);
+
+ // Then use them to determine the Omega shape points
+ CreateSPDOmegaShape(xair,yair,kThicknessOmega,xomega,yomega);
- sC2->SetVertex(0,xshld[11],yshld[11]);
- sC2->SetVertex(1,xshld[10],yshld[10]);
- sC2->SetVertex(2,xshld[ 1],yshld[ 1]);
- sC2->SetVertex(3,xshld[ 0],yshld[ 0]);
+ // Finally fill the small end coordinates of the air shapes
+ sCh1->SetVertex(0, xomega[ 0], yomega[ 0]);
+ sCh1->SetVertex(1, xomega[ 1], yomega[ 1]);
+ sCh1->SetVertex(2,-xomega[ 1], yomega[ 1]);
+ sCh1->SetVertex(3,-xomega[ 0], yomega[ 0]);
+
+ sCh2->SetVertex(0, xomega[20], yomega[20]);
+ sCh2->SetVertex(1, xomega[21], yomega[21]);
+ sCh2->SetVertex(2, xomega[22], yomega[22]);
+ sCh2->SetVertex(3, xomega[23], yomega[23]);
+
+ sCh3->SetVertex(0, xomega[ 2], yomega[ 2]);
+ sCh3->SetVertex(1, xomega[ 3], yomega[ 3]);
+ sCh3->SetVertex(2, xomega[ 4], yomega[ 4]);
+ sCh3->SetVertex(3, xomega[ 5], yomega[ 5]);
+
+ sCh4->SetVertex(0, xomega[16], yomega[16]);
+ sCh4->SetVertex(1, xomega[17], yomega[17]);
+ sCh4->SetVertex(2, xomega[18], yomega[18]);
+ sCh4->SetVertex(3, xomega[19], yomega[19]);
+
+ sCh5->SetVertex(0, xomega[ 6], yomega[ 6]);
+ sCh5->SetVertex(1, xomega[ 7], yomega[ 7]);
+ sCh5->SetVertex(2, xomega[ 8], yomega[ 8]);
+ sCh5->SetVertex(3, xomega[ 9], yomega[ 9]);
+
+ sCh6->SetVertex(0, xomega[12], yomega[12]);
+ sCh6->SetVertex(1, xomega[13], yomega[13]);
+ sCh6->SetVertex(2, xomega[14], yomega[14]);
+ sCh6->SetVertex(3, xomega[15], yomega[15]);
+
+ sCh7->SetVertex(0,-xomega[21], yomega[21]);
+ sCh7->SetVertex(1,-xomega[20], yomega[20]);
+ sCh7->SetVertex(2,-xomega[23], yomega[23]);
+ sCh7->SetVertex(3,-xomega[22], yomega[22]);
+
+ sCh8->SetVertex(0,-xomega[ 3], yomega[ 3]);
+ sCh8->SetVertex(1,-xomega[ 2], yomega[ 2]);
+ sCh8->SetVertex(2,-xomega[ 5], yomega[ 5]);
+ sCh8->SetVertex(3,-xomega[ 4], yomega[ 4]);
+
+ sCh9->SetVertex(0,-xomega[17], yomega[17]);
+ sCh9->SetVertex(1,-xomega[16], yomega[16]);
+ sCh9->SetVertex(2,-xomega[19], yomega[19]);
+ sCh9->SetVertex(3,-xomega[18], yomega[18]);
+
+ sCh10->SetVertex(0,-xomega[ 7], yomega[ 7]);
+ sCh10->SetVertex(1,-xomega[ 6], yomega[ 6]);
+ sCh10->SetVertex(2,-xomega[ 9], yomega[ 9]);
+ sCh10->SetVertex(3,-xomega[ 8], yomega[ 8]);
+
+ sCh11->SetVertex(0,-xomega[13], yomega[13]);
+ sCh11->SetVertex(1,-xomega[12], yomega[12]);
+ sCh11->SetVertex(2,-xomega[15], yomega[15]);
+ sCh11->SetVertex(3,-xomega[14], yomega[14]);
+
+ // Bigger end: determine the coordinates of the points of carbon fiber
// Drawings give only the radius, convert it to the apothegm
Double_t kInnerRadiusCone = TMath::Sqrt(kInnerRadialCone*kInnerRadialCone
Double_t kOuterRadiusCone = TMath::Sqrt(kOuterRadialCone*kOuterRadialCone
- 0.25*kOuterACone*kOuterACone);
- Double_t xco[4], yco[4], xci[4], yci[4];
-
- for (Int_t i=0; i<2; i++) {
- Double_t th = i*kTheta*TMath::RadToDeg();
- xco[2*i ] = kOuterRadiusCone*SinD(th) - 0.5*kOuterACone*CosD(th);
- yco[2*i ] = kOuterRadiusCone*CosD(th) + 0.5*kOuterACone*SinD(th);
- xci[2*i ] = kInnerRadiusCone*SinD(th) - 0.5*kInnerACone*CosD(th);
- yci[2*i ] = kInnerRadiusCone*CosD(th) + 0.5*kInnerACone*SinD(th);
- xco[2*i+1] = kOuterRadiusCone*SinD(th) + 0.5*kOuterACone*CosD(th);
- yco[2*i+1] = kOuterRadiusCone*CosD(th) - 0.5*kOuterACone*SinD(th);
- xci[2*i+1] = kInnerRadiusCone*SinD(th) + 0.5*kInnerACone*CosD(th);
- yci[2*i+1] = kInnerRadiusCone*CosD(th) - 0.5*kInnerACone*SinD(th);
- }
+ CreateSPDThermalShape(kInnerACone,kInnerBCone,kInnerRadiusCone,
+ kOuterACone,kOuterBCone,kOuterRadiusCone,
+ kTheta,xshld,yshld);
- sC1->SetVertex(4,xco[0],yco[0]);
- sC1->SetVertex(5,xco[1],yco[1]);
- sC1->SetVertex(6,xci[1],yci[1]);
- sC1->SetVertex(7,xci[0],yci[0]);
-
- sC2->SetVertex(4,xco[1],yco[1]);
- sC2->SetVertex(5,xco[2],yco[2]);
- sC2->SetVertex(6,xci[2],yci[2]);
- sC2->SetVertex(7,xci[1],yci[1]);
-
- // Air holes
- TGeoArb8 *sCh1 = new TGeoArb8(kHalfLengthCone);
- TGeoArb8 *sCh2 = new TGeoArb8(kHalfLengthCone);
-
- for(Int_t i=0; i<4; i++){
- InsidePoint(sC1->GetVertices()[((i+3)%4)*2+0],
- sC1->GetVertices()[((i+3)%4)*2+1],
- sC1->GetVertices()[i*2+0],
- sC1->GetVertices()[i*2+1],
- sC1->GetVertices()[((i+1)%4)*2+0],
- sC1->GetVertices()[((i+1)%4)*2+1],-kThicknessCone,x,y);
- sCh1->SetVertex(i,x,y);
-
- InsidePoint(sC1->GetVertices()[((i+3)%4 +4)*2+0],
- sC1->GetVertices()[((i+3)%4 +4)*2+1],
- sC1->GetVertices()[(i+4)*2+0],
- sC1->GetVertices()[(i+4)*2+1],
- sC1->GetVertices()[((i+1)%4 +4)*2+0],
- sC1->GetVertices()[((i+1)%4 +4)*2+1],-kThicknessCone,x,y);
- sCh1->SetVertex(i+4,x,y);
-
- InsidePoint(sC2->GetVertices()[((i+3)%4)*2+0],
- sC2->GetVertices()[((i+3)%4)*2+1],
- sC2->GetVertices()[i*2+0],
- sC2->GetVertices()[i*2+1],
- sC2->GetVertices()[((i+1)%4)*2+0],
- sC2->GetVertices()[((i+1)%4)*2+1],-kThicknessCone,x,y);
- sCh2->SetVertex(i,x,y);
-
- InsidePoint(sC2->GetVertices()[((i+3)%4 +4)*2+0],
- sC2->GetVertices()[((i+3)%4 +4)*2+1],
- sC2->GetVertices()[(i+4)*2+0],
- sC2->GetVertices()[(i+4)*2+1],
- sC2->GetVertices()[((i+1)%4 +4)*2+0],
- sC2->GetVertices()[((i+1)%4 +4)*2+1],-kThicknessCone,x,y);
- sCh2->SetVertex(i+4,x,y);
+ sC1->SetVertex(4, xshld[12], yshld[12]);
+ sC1->SetVertex(5, xshld[11], yshld[11]);
+ sC1->SetVertex(6, xshld[ 0], yshld[ 0]);
+ sC1->SetVertex(7, xshld[23], yshld[23]);
+
+ sC2->SetVertex(4, xshld[11], yshld[11]);
+ sC2->SetVertex(5, xshld[10], yshld[10]);
+ sC2->SetVertex(6, xshld[ 1], yshld[ 1]);
+ sC2->SetVertex(7, xshld[ 0], yshld[ 0]);
+
+ sC3->SetVertex(4, xshld[10], yshld[10]);
+ sC3->SetVertex(5, xshld[ 9], yshld[ 9]);
+ sC3->SetVertex(6, xshld[ 2], yshld[ 2]);
+ sC3->SetVertex(7, xshld[ 1], yshld[ 1]);
+
+ sC4->SetVertex(4, xshld[ 9], yshld[ 9]);
+ sC4->SetVertex(5, xshld[ 8], yshld[ 8]);
+ sC4->SetVertex(6, xshld[ 3], yshld[ 3]);
+ sC4->SetVertex(7, xshld[ 2], yshld[ 2]);
+
+ sC5->SetVertex(4, xshld[ 8], yshld[ 8]);
+ sC5->SetVertex(5, xshld[ 7], yshld[ 7]);
+ sC5->SetVertex(6, xshld[ 4], yshld[ 4]);
+ sC5->SetVertex(7, xshld[ 3], yshld[ 3]);
+
+ sC6->SetVertex(4, xshld[ 7], yshld[ 7]);
+ sC6->SetVertex(5, xshld[ 6], yshld[ 6]);
+ sC6->SetVertex(6, xshld[ 5], yshld[ 5]);
+ sC6->SetVertex(7, xshld[ 4], yshld[ 4]);
+
+ sC7->SetVertex(4,-xshld[10], yshld[10]);
+ sC7->SetVertex(5,-xshld[11], yshld[11]);
+ sC7->SetVertex(6,-xshld[ 0], yshld[ 0]);
+ sC7->SetVertex(7,-xshld[ 1], yshld[ 1]);
+
+ sC8->SetVertex(4,-xshld[ 9], yshld[ 9]);
+ sC8->SetVertex(5,-xshld[10], yshld[10]);
+ sC8->SetVertex(6,-xshld[ 1], yshld[ 1]);
+ sC8->SetVertex(7,-xshld[ 2], yshld[ 2]);
+
+ sC9->SetVertex(4,-xshld[ 8], yshld[ 8]);
+ sC9->SetVertex(5,-xshld[ 9], yshld[ 9]);
+ sC9->SetVertex(6,-xshld[ 2], yshld[ 2]);
+ sC9->SetVertex(7,-xshld[ 3], yshld[ 3]);
+
+ sC10->SetVertex(4,-xshld[ 7], yshld[ 7]);
+ sC10->SetVertex(5,-xshld[ 8], yshld[ 8]);
+ sC10->SetVertex(6,-xshld[ 3], yshld[ 3]);
+ sC10->SetVertex(7,-xshld[ 4], yshld[ 4]);
+
+ sC11->SetVertex(4,-xshld[ 6], yshld[ 6]);
+ sC11->SetVertex(5,-xshld[ 7], yshld[ 7]);
+ sC11->SetVertex(6,-xshld[ 4], yshld[ 4]);
+ sC11->SetVertex(7,-xshld[ 5], yshld[ 5]);
+
+ // Then rescale to get the air volume dimensions
+ InsidePoint(xshld[23], yshld[23],
+ xshld[ 0], yshld[ 0],
+ xshld[ 1], yshld[ 1], kThicknessCone,
+ xair[0], yair[0]);
+ for (Int_t i=1; i<23; i++) {
+ InsidePoint(xshld[i-1], yshld[i-1],
+ xshld[ i ], yshld[ i ],
+ xshld[i+1], yshld[i+1], kThicknessCone,
+ xair[i], yair[i]);
}
+ InsidePoint(xshld[22], yshld[22],
+ xshld[23], yshld[23],
+ xshld[ 0], yshld[ 0], kThicknessCone,
+ xair[23], yair[23]);
+
+ // Then use them to determine the Omega shape points
+ CreateSPDOmegaShape(xair,yair,kThicknessOmega,xomega,yomega);
+
+ // Finally fill the big end coordinates of the air shapes
+ sCh1->SetVertex(4, xomega[ 0], yomega[ 0]);
+ sCh1->SetVertex(5, xomega[ 1], yomega[ 1]);
+ sCh1->SetVertex(6,-xomega[ 1], yomega[ 1]);
+ sCh1->SetVertex(7,-xomega[ 0], yomega[ 0]);
+
+ sCh2->SetVertex(4, xomega[20], yomega[20]);
+ sCh2->SetVertex(5, xomega[21], yomega[21]);
+ sCh2->SetVertex(6, xomega[22], yomega[22]);
+ sCh2->SetVertex(7, xomega[23], yomega[23]);
+
+ sCh3->SetVertex(4, xomega[ 2], yomega[ 2]);
+ sCh3->SetVertex(5, xomega[ 3], yomega[ 3]);
+ sCh3->SetVertex(6, xomega[ 4], yomega[ 4]);
+ sCh3->SetVertex(7, xomega[ 5], yomega[ 5]);
+
+ sCh4->SetVertex(4, xomega[16], yomega[16]);
+ sCh4->SetVertex(5, xomega[17], yomega[17]);
+ sCh4->SetVertex(6, xomega[18], yomega[18]);
+ sCh4->SetVertex(7, xomega[19], yomega[19]);
+
+ sCh5->SetVertex(4, xomega[ 6], yomega[ 6]);
+ sCh5->SetVertex(5, xomega[ 7], yomega[ 7]);
+ sCh5->SetVertex(6, xomega[ 8], yomega[ 8]);
+ sCh5->SetVertex(7, xomega[ 9], yomega[ 9]);
+
+ sCh6->SetVertex(4, xomega[12], yomega[12]);
+ sCh6->SetVertex(5, xomega[13], yomega[13]);
+ sCh6->SetVertex(6, xomega[14], yomega[14]);
+ sCh6->SetVertex(7, xomega[15], yomega[15]);
+
+ sCh7->SetVertex(4,-xomega[21], yomega[21]);
+ sCh7->SetVertex(5,-xomega[20], yomega[20]);
+ sCh7->SetVertex(6,-xomega[23], yomega[23]);
+ sCh7->SetVertex(7,-xomega[22], yomega[22]);
+
+ sCh8->SetVertex(4,-xomega[ 3], yomega[ 3]);
+ sCh8->SetVertex(5,-xomega[ 2], yomega[ 2]);
+ sCh8->SetVertex(6,-xomega[ 5], yomega[ 5]);
+ sCh8->SetVertex(7,-xomega[ 4], yomega[ 4]);
+
+ sCh9->SetVertex(4,-xomega[17], yomega[17]);
+ sCh9->SetVertex(5,-xomega[16], yomega[16]);
+ sCh9->SetVertex(6,-xomega[19], yomega[19]);
+ sCh9->SetVertex(7,-xomega[18], yomega[18]);
+
+ sCh10->SetVertex(4,-xomega[ 7], yomega[ 7]);
+ sCh10->SetVertex(5,-xomega[ 6], yomega[ 6]);
+ sCh10->SetVertex(6,-xomega[ 9], yomega[ 9]);
+ sCh10->SetVertex(7,-xomega[ 8], yomega[ 8]);
+
+ sCh11->SetVertex(4,-xomega[13], yomega[13]);
+ sCh11->SetVertex(5,-xomega[12], yomega[12]);
+ sCh11->SetVertex(6,-xomega[15], yomega[15]);
+ sCh11->SetVertex(7,-xomega[14], yomega[14]);
+
+ // Now the actual carbon fiber cone: a CompositeShape
+ TGeoCompositeShape *sCone = new TGeoCompositeShape("sCone",
+ "sC1+sC2+sC3+sC4+sC5+sC6+sC7+sC8+sC9+sC10+sC11");
// Finally the carbon fiber Ring with its Wings and their
// stesalite inserts. They are Tube and TubeSeg shapes
centralshield->SetVisibility(kTRUE);
centralshield->SetLineColor(7);
centralshield->SetLineWidth(1);
-
- TGeoVolume *centralairshield = new TGeoVolume("SPDcentralairshield",
- centralairshape,medSPDair);
- centralairshield->SetVisibility(kTRUE);
- centralairshield->SetLineColor(5); // Yellow
- centralairshield->SetLineWidth(1);
- centralairshield->SetFillColor(centralairshield->GetLineColor());
- centralairshield->SetFillStyle(4090); // 90% transparent
-
- TGeoVolume *centralomega = new TGeoVolume("SPDcentralomega",
- centralomegashape,medSPDcf);
- centralomega->SetVisibility(kTRUE);
- centralomega->SetLineColor(7);
- centralomega->SetLineWidth(1);
-
- centralairshield->AddNode(centralomega,1,0);
- centralshield->AddNode(centralairshield,1,0);
+ centralshield->SetFillColor(centralshield->GetLineColor());
+ centralshield->SetFillStyle(4090); // 90% transparent
TGeoVolume *endcapshield = new TGeoVolume("SPDendcapshield",
endcapshape,medSPDcf);
endcapshield->SetVisibility(kTRUE);
endcapshield->SetLineColor(7);
endcapshield->SetLineWidth(1);
-
- TGeoVolume *endcapairshield = new TGeoVolume("SPDendcapairshield",
- endcapairshape,medSPDair);
- endcapairshield->SetVisibility(kTRUE);
- endcapairshield->SetLineColor(5); // Yellow
- endcapairshield->SetLineWidth(1);
- endcapairshield->SetFillColor(endcapairshield->GetLineColor());
- endcapairshield->SetFillStyle(4090); // 90% transparent
-
- TGeoVolume *endcapomega = new TGeoVolume("SPDendcapomega",
- endcapomegashape,medSPDcf);
- endcapomega->SetVisibility(kTRUE);
- endcapomega->SetLineColor(7);
- endcapomega->SetLineWidth(1);
-
- endcapairshield->AddNode(endcapomega,1,0);
- endcapshield->AddNode(endcapairshield,1,0);
-
- TGeoVolume *vC1 = new TGeoVolume("SPDconeshieldV1",sC1,medSPDcf);
- vC1->SetVisibility(kTRUE);
- vC1->SetLineColor(7);
- vC1->SetLineWidth(1);
+ endcapshield->SetFillColor(endcapshield->GetLineColor());
+ endcapshield->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *fillerblock = new TGeoVolume("SPDfillerblock",
+ fillershape,medSPDcf);
+ fillerblock->SetVisibility(kTRUE);
+ fillerblock->SetLineColor(7);
+ fillerblock->SetLineWidth(1);
+ fillerblock->SetFillColor(fillerblock->GetLineColor());
+ fillerblock->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *fillerhole = new TGeoVolume("SPDfillerhole",
+ fillerholeshape,medSPDair);
+ fillerhole->SetVisibility(kTRUE);
+ fillerhole->SetLineColor(5); // Yellow
+ fillerhole->SetLineWidth(1);
+ fillerhole->SetFillColor(fillerhole->GetLineColor());
+ fillerhole->SetFillStyle(4090); // 90% transparent
+
+ ypos = (fillershape->GetY(0)+fillershape->GetY(1))/2;
+ fillerblock->AddNode(fillerhole, 1, new TGeoTranslation(0, ypos, 0));
+
+ zpos = omgendcapshape->GetZ(1) - fillershape->GetZ(1) - kFillerBlockZTrans;
+ endcapshield->AddNode(fillerblock, 1, new TGeoTranslation(0, 0, zpos));
+ endcapshield->AddNode(fillerblock, 2, new TGeoCombiTrans(0, 0, zpos,
+ new TGeoRotation("", kThetaDeg,0,0)));
+ endcapshield->AddNode(fillerblock, 3, new TGeoCombiTrans(0, 0, zpos,
+ new TGeoRotation("",-kThetaDeg,0,0)));
+ endcapshield->AddNode(fillerblock, 4, new TGeoCombiTrans(0, 0, zpos,
+ new TGeoRotation("", 2*kThetaDeg,0,0)));
+ endcapshield->AddNode(fillerblock, 5, new TGeoCombiTrans(0, 0, zpos,
+ new TGeoRotation("",-2*kThetaDeg,0,0)));
+
+ TGeoVolume *fillerbar = new TGeoVolume("SPDfillerbar",
+ fillbarshape,medSPDcf);
+ fillerbar->SetVisibility(kTRUE);
+ fillerbar->SetLineColor(7);
+ fillerbar->SetLineWidth(1);
+ fillerbar->SetFillColor(fillerbar->GetLineColor());
+ fillerbar->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *fillbarhole = new TGeoVolume("SPDfillerbarhole",
+ fillbarholeshape,medSPDair);
+ fillbarhole->SetVisibility(kTRUE);
+ fillbarhole->SetLineColor(5); // Yellow
+ fillbarhole->SetLineWidth(1);
+ fillbarhole->SetFillColor(fillbarhole->GetLineColor());
+ fillbarhole->SetFillStyle(4090); // 90% transparent
+
+ fillerbar->AddNode(fillbarhole, 1, 0);
+
+ TGeoVolume *vCone = new TGeoVolume("SPDconeshield",sCone,medSPDcf);
+ vCone->SetVisibility(kTRUE);
+ vCone->SetLineColor(7);
+ vCone->SetLineWidth(1);
+ vCone->SetFillColor(vCone->GetLineColor());
+ vCone->SetFillStyle(4090); // 90% transparent
TGeoVolume *vCh1 = new TGeoVolume("SPDconeshieldH1",sCh1,medSPDair);
-
vCh1->SetVisibility(kTRUE);
vCh1->SetLineColor(5); // Yellow
vCh1->SetLineWidth(1);
vCh1->SetFillColor(vCh1->GetLineColor());
vCh1->SetFillStyle(4090); // 90% transparent
- vC1->AddNode(vCh1,1,0);
-
- TGeoVolume *vC2 = new TGeoVolume("SPDconeshieldV2",sC2,medSPDcf);
-
- vC2->SetVisibility(kTRUE);
- vC2->SetLineColor(7);
- vC2->SetLineWidth(1);
-
TGeoVolume *vCh2 = new TGeoVolume("SPDconeshieldH2",sCh2,medSPDair);
-
vCh2->SetVisibility(kTRUE);
vCh2->SetLineColor(5); // Yellow
vCh2->SetLineWidth(1);
vCh2->SetFillColor(vCh2->GetLineColor());
vCh2->SetFillStyle(4090); // 90% transparent
- vC2->AddNode(vCh2,1,0);
+ TGeoVolume *vCh3 = new TGeoVolume("SPDconeshieldH3",sCh3,medSPDair);
+ vCh3->SetVisibility(kTRUE);
+ vCh3->SetLineColor(5); // Yellow
+ vCh3->SetLineWidth(1);
+ vCh3->SetFillColor(vCh3->GetLineColor());
+ vCh3->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh4 = new TGeoVolume("SPDconeshieldH4",sCh4,medSPDair);
+ vCh4->SetVisibility(kTRUE);
+ vCh4->SetLineColor(5); // Yellow
+ vCh4->SetLineWidth(1);
+ vCh4->SetFillColor(vCh4->GetLineColor());
+ vCh4->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh5 = new TGeoVolume("SPDconeshieldH5",sCh5,medSPDair);
+ vCh5->SetVisibility(kTRUE);
+ vCh5->SetLineColor(5); // Yellow
+ vCh5->SetLineWidth(1);
+ vCh5->SetFillColor(vCh5->GetLineColor());
+ vCh5->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh6 = new TGeoVolume("SPDconeshieldH6",sCh6,medSPDair);
+ vCh6->SetVisibility(kTRUE);
+ vCh6->SetLineColor(5); // Yellow
+ vCh6->SetLineWidth(1);
+ vCh6->SetFillColor(vCh6->GetLineColor());
+ vCh6->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh7 = new TGeoVolume("SPDconeshieldH7",sCh7,medSPDair);
+ vCh7->SetVisibility(kTRUE);
+ vCh7->SetLineColor(5); // Yellow
+ vCh7->SetLineWidth(1);
+ vCh7->SetFillColor(vCh7->GetLineColor());
+ vCh7->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh8 = new TGeoVolume("SPDconeshieldH8",sCh8,medSPDair);
+ vCh8->SetVisibility(kTRUE);
+ vCh8->SetLineColor(5); // Yellow
+ vCh8->SetLineWidth(1);
+ vCh8->SetFillColor(vCh8->GetLineColor());
+ vCh8->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh9 = new TGeoVolume("SPDconeshieldH9",sCh9,medSPDair);
+ vCh9->SetVisibility(kTRUE);
+ vCh9->SetLineColor(5); // Yellow
+ vCh9->SetLineWidth(1);
+ vCh9->SetFillColor(vCh9->GetLineColor());
+ vCh9->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh10 = new TGeoVolume("SPDconeshieldH10",sCh10,medSPDair);
+ vCh10->SetVisibility(kTRUE);
+ vCh10->SetLineColor(5); // Yellow
+ vCh10->SetLineWidth(1);
+ vCh10->SetFillColor(vCh10->GetLineColor());
+ vCh10->SetFillStyle(4090); // 90% transparent
+
+ TGeoVolume *vCh11 = new TGeoVolume("SPDconeshieldH11",sCh11,medSPDair);
+ vCh11->SetVisibility(kTRUE);
+ vCh11->SetLineColor(5); // Yellow
+ vCh11->SetLineWidth(1);
+ vCh11->SetFillColor(vCh11->GetLineColor());
+ vCh11->SetFillStyle(4090); // 90% transparent
+
+ vCone->AddNode(vCh1 ,1,0);
+ vCone->AddNode(vCh2 ,1,0);
+ vCone->AddNode(vCh3 ,1,0);
+ vCone->AddNode(vCh4 ,1,0);
+ vCone->AddNode(vCh5 ,1,0);
+ vCone->AddNode(vCh6 ,1,0);
+ vCone->AddNode(vCh7 ,1,0);
+ vCone->AddNode(vCh8 ,1,0);
+ vCone->AddNode(vCh9 ,1,0);
+ vCone->AddNode(vCh10,1,0);
+ vCone->AddNode(vCh11,1,0);
TGeoVolume *ring = new TGeoVolume("SPDshieldring",ringshape,medSPDcf);
ring->SetVisibility(kTRUE);
wing->SetLineColor(7);
wing->SetLineWidth(1);
- TGeoVolume *winginsert = new TGeoVolume("SPDshieldringinsert",
+ TGeoVolume *winginsert = new TGeoVolume("SPDshieldwinginsert",
winginsertshape,medSPDste);
winginsert->SetVisibility(kTRUE);
winginsert->SetLineColor(3); // Green
zpos = kHalfLengthCentral+kHalfLengthEndCap;
vM->AddNode(endcapshield,1,
new TGeoTranslation(0,0, zpos-kLittleZTrans));
- vM->AddNode(endcapshield,2,
- new TGeoTranslation(0,0,-zpos-kLittleZTrans));
+ vM->AddNode(endcapshield,2,new TGeoCombiTrans(
+ 0, 0,-zpos-kLittleZTrans, new TGeoRotation("", 0,180,0) ) );
vM->AddNode(endcapshield,3,new TGeoCombiTrans(
- 0, 0, zpos-kLittleZTrans, new TGeoRotation("",180,0,0) ) );
+ 0, 0, zpos-kLittleZTrans, new TGeoRotation("",180, 0,0) ) );
vM->AddNode(endcapshield,4,new TGeoCombiTrans(
- 0, 0,-zpos-kLittleZTrans, new TGeoRotation("",180,0,0) ) );
+ 0, 0,-zpos-kLittleZTrans, new TGeoRotation("",180,180,0) ) );
+
+ xpos = omgendcapshape->GetX(13) + fillbarshape->GetDX();
+ ypos = omgendcapshape->GetY(13) + fillbarshape->GetDY();
+ zpos -= fillbarshape->GetDZ();
+ vM->AddNode(fillerbar, 1, new TGeoTranslation( xpos, ypos, zpos));
+ vM->AddNode(fillerbar, 2, new TGeoTranslation(-xpos, ypos, zpos));
+ vM->AddNode(fillerbar, 3, new TGeoTranslation( xpos,-ypos, zpos));
+ vM->AddNode(fillerbar, 4, new TGeoTranslation(-xpos,-ypos, zpos));
+ vM->AddNode(fillerbar, 5, new TGeoTranslation( xpos, ypos,-zpos));
+ vM->AddNode(fillerbar, 6, new TGeoTranslation(-xpos, ypos,-zpos));
+ vM->AddNode(fillerbar, 7, new TGeoTranslation( xpos,-ypos,-zpos));
+ vM->AddNode(fillerbar, 8, new TGeoTranslation(-xpos,-ypos,-zpos));
zpos = kHalfLengthCentral+2*kHalfLengthEndCap+kHalfLengthCone;
- for (Int_t i=0; i<10; i++) {
- Double_t thetaC12 = kTheta*TMath::RadToDeg();
- vM->AddNode(vC1,2*i+1, new TGeoCombiTrans(
- 0, 0, zpos-kLittleZTrans,
- new TGeoRotation("",0, 0,i*thetaC12) ) );
- vM->AddNode(vC1,2*i+2, new TGeoCombiTrans(
- 0, 0, -zpos-kLittleZTrans,
- new TGeoRotation("",0,180,i*thetaC12) ) );
- vM->AddNode(vC2,2*i+1, new TGeoCombiTrans(
- 0, 0, zpos-kLittleZTrans,
- new TGeoRotation("",0, 0,i*thetaC12) ) );
- vM->AddNode(vC2,2*i+2, new TGeoCombiTrans(
- 0, 0, -zpos-kLittleZTrans,
- new TGeoRotation("",0,180,i*thetaC12) ) );
- }
+ vM->AddNode(vCone ,1, new TGeoTranslation(0, 0, zpos-kLittleZTrans));
+
+ vM->AddNode(vCone ,2, new TGeoCombiTrans(0, 0, zpos-kLittleZTrans,
+ new TGeoRotation("", 0, 0, 180) ));
+
+ vM->AddNode(vCone ,3, new TGeoCombiTrans(0, 0, -zpos-kLittleZTrans,
+ new TGeoRotation("", 0, 180, 0) ));
+
+ vM->AddNode(vCone ,4, new TGeoCombiTrans(0, 0, -zpos-kLittleZTrans,
+ new TGeoRotation("", 0, 180, 180) ));
zpos = kHalfLengthCentral+2*kHalfLengthEndCap+2*kHalfLengthCone
+ kHalfLengthRing;
// Updated: 10 Jun 2010 Mario Sitta Freon inside cooling pipes
// Updated: 08 Sep 2010 Mario Sitta
// Updated: 14 Sep 2010 Mario Sitta Cables prolonged till cone
+// Updated: 20 Dec 2011 Mario Sitta Composite vol to avoid new overlap
//
// Technical data are taken from AutoCAD drawings and other (oral)
// information given by D.Elia
const Double_t kCoaxCableSectCu = 6.024 *fgkmm;// Computed
const Double_t kCoaxCableHighMeg = 5.695 *fgkmm;// Computed
+ const Double_t kCablesYtrans = 2.500 *fgkmm;// Avoid ovlps
+
// Overall position and rotation of the C-Side Cable Trays
const Double_t kTraySideCRPos = 45.300 *fgkcm;
const Double_t kTraySideCZPos = -102.400 *fgkcm;
// The Cable Tray lower face: a Xtru
TGeoXtru *sideCHorFace = new TGeoXtru(2);
+ sideCHorFace->SetName("ITSsuppSPDTraySideCHor");
xprof[0] = 0.;
yprof[0] = 0.;
// The internal wall: a Xtru
TGeoXtru *intWall = new TGeoXtru(2);
+ intWall->SetName("ITSsuppSPDTraySideCWall");
xprof[0] = sideCHorFace->GetX(5);
yprof[0] = sideCHorFace->GetY(5);
xprof[0] = -kTrayCCablesZLenOut;
yprof[0] = xprof[0]/TanD(kTrayCCablesOutRot);
xprof[1] = sideCMidFace->GetX(5);
- yprof[1] = sideCMidFace->GetY(5);
+ yprof[1] = sideCMidFace->GetY(5) + kCablesYtrans;
xprof[2] = sideCMidFace->GetX(4);
- yprof[2] = sideCMidFace->GetY(4);
+ yprof[2] = sideCMidFace->GetY(4) + kCablesYtrans;
xprof[3] = sideCMidFace->GetX(3);
- yprof[3] = sideCMidFace->GetY(3);
+ yprof[3] = sideCMidFace->GetY(3) + kCablesYtrans;
xprof[4] = xprof[3] - kOpticalFibersSect*SinD(kTrayCFoldAngle);
yprof[4] = yprof[3] + kOpticalFibersSect*CosD(kTrayCFoldAngle);
InsidePoint(xprof[1], yprof[1], xprof[2], yprof[2], xprof[3], yprof[3],
xprof[0] = -kTrayCCablesZLenOut;
yprof[0] = xprof[0]/TanD(kTrayCCablesOutRot);
xprof[1] = sideCMidFace->GetX(5);
- yprof[1] = sideCMidFace->GetY(5);
+ yprof[1] = sideCMidFace->GetY(5) + kCablesYtrans;
xprof[2] = sideCMidFace->GetX(4);
- yprof[2] = sideCMidFace->GetY(4);
+ yprof[2] = sideCMidFace->GetY(4) + kCablesYtrans;
xprof[3] = sideCMidFace->GetX(3);
- yprof[3] = sideCMidFace->GetY(3);
+ yprof[3] = sideCMidFace->GetY(3) + kCablesYtrans;
xprof[4] = xprof[3] - kLowVoltCableSectCu*SinD(kTrayCFoldAngle);
yprof[4] = yprof[3] + kLowVoltCableSectCu*CosD(kTrayCFoldAngle);
InsidePoint(xprof[1], yprof[1], xprof[2], yprof[2], xprof[3], yprof[3],
xprof[0] = -kTrayCCablesZLenOut;
yprof[0] = xprof[0]/TanD(kTrayCCablesOutRot);
xprof[1] = sideCMidFace->GetX(5);
- yprof[1] = sideCMidFace->GetY(5);
+ yprof[1] = sideCMidFace->GetY(5) + kCablesYtrans;
xprof[2] = sideCMidFace->GetX(4);
- yprof[2] = sideCMidFace->GetY(4);
+ yprof[2] = sideCMidFace->GetY(4) + kCablesYtrans;
xprof[3] = sideCMidFace->GetX(3);
- yprof[3] = sideCMidFace->GetY(3);
+ yprof[3] = sideCMidFace->GetY(3) + kCablesYtrans;
xprof[4] = xprof[3] - kHiVoltCableSectCu*SinD(kTrayCFoldAngle);
yprof[4] = yprof[3] + kHiVoltCableSectCu*CosD(kTrayCFoldAngle);
InsidePoint(xprof[1], yprof[1], xprof[2], yprof[2], xprof[3], yprof[3],
xprof[0] = -kTrayCCablesZLenOut;
yprof[0] = xprof[0]/TanD(kTrayCCablesOutRot);
xprof[1] = sideCMidFace->GetX(5);
- yprof[1] = sideCMidFace->GetY(5);
+ yprof[1] = sideCMidFace->GetY(5) + kCablesYtrans;
xprof[2] = sideCMidFace->GetX(4);
- yprof[2] = sideCMidFace->GetY(4);
+ yprof[2] = sideCMidFace->GetY(4) + kCablesYtrans;
xprof[3] = sideCMidFace->GetX(3);
- yprof[3] = sideCMidFace->GetY(3);
+ yprof[3] = sideCMidFace->GetY(3) + kCablesYtrans;
xprof[4] = xprof[3] - kCoaxCableSectCu*SinD(kTrayCFoldAngle);
yprof[4] = yprof[3] + kCoaxCableSectCu*CosD(kTrayCFoldAngle);
InsidePoint(xprof[1], yprof[1], xprof[2], yprof[2], xprof[3], yprof[3],
coaxCablesMeg->DefineSection(0, 0);
coaxCablesMeg->DefineSection(1, kCoaxCableSectCu);
+ // To avoid a newly discovered overlap,
+ // transform the two overlapping volumes into a Composite Shape
+ TGeoCompositeShape *trayIntern =
+ new TGeoCompositeShape("ITSSPDInternalTrayC",
+ "ITSsuppSPDTraySideCHor+ITSsuppSPDTraySideCWall");
// We have all shapes: now create the real volumes
TGeoMedium *medAl = mgr->GetMedium("ITS_ALUMINUM$");
TGeoMedium *medPUR = mgr->GetMedium("ITS_POLYURETHANE$");
TGeoMedium *medMeg = mgr->GetMedium("ITS_MEGOLON$");
- TGeoVolume *traySideCHorFace = new TGeoVolume("ITSsuppSPDTraySideCHor",
- sideCHorFace, medAl);
+ TGeoVolume *traySideCIntern = new TGeoVolume("ITSsuppSPDTraySideCInternal",
+ trayIntern, medAl);
- traySideCHorFace->SetVisibility(kTRUE);
- traySideCHorFace->SetLineColor(6); // Purple
- traySideCHorFace->SetLineWidth(1);
- traySideCHorFace->SetFillColor(traySideCHorFace->GetLineColor());
- traySideCHorFace->SetFillStyle(4000); // 0% transparent
+ traySideCIntern->SetVisibility(kTRUE);
+ traySideCIntern->SetLineColor(6); // Purple
+ traySideCIntern->SetLineWidth(1);
+ traySideCIntern->SetFillColor(traySideCIntern->GetLineColor());
+ traySideCIntern->SetFillStyle(4000); // 0% transparent
TGeoVolume *traySideCMidFace = new TGeoVolume("ITSsuppSPDTraySideCMid",
sideCMidFace, medAl);
traySideCLongCover->SetFillColor(traySideCLongCover->GetLineColor());
traySideCLongCover->SetFillStyle(4000); // 0% transparent
- TGeoVolume *traySideCIntWall = new TGeoVolume("ITSsuppSPDTraySideCWall",
- intWall, medAl);
-
- traySideCIntWall->SetVisibility(kTRUE);
- traySideCIntWall->SetLineColor(6); // Purple
- traySideCIntWall->SetLineWidth(1);
- traySideCIntWall->SetFillColor(traySideCIntWall->GetLineColor());
- traySideCIntWall->SetFillStyle(4000); // 0% transparent
-
TGeoVolume *traySideCHorTube = new TGeoVolume("ITSsuppSPDTraySideCHorTube",
horTube, medIn);
// Now build up the trays
- cableTrayC->AddNode(traySideCHorFace,1,0);
+ cableTrayC->AddNode(traySideCIntern,1,0);
cableTrayC->AddNode(traySideCMidFace,1,0);
cableTrayC->AddNode(traySideCLongCover,1,0);
- cableTrayC->AddNode(traySideCIntWall,1,0);
-
traySideCHorTube->AddNode(traySideCHorFreon, 1, 0);
traySideCIncTube->AddNode(traySideCIncFreon, 1, 0);
traySideCOutTube->AddNode(traySideCOutFreon, 1, 0);
const Double_t kSideCInputCablesPOLYAX = 0.1098;
const Double_t kSideCOutputCablesX0 = 27.40 *fgkcm;
- const Double_t kSideCOutputCablesWide = 8.30 *fgkcm;
+ const Double_t kSideCOutputCablesWide = 8.50 *fgkcm;
const Double_t kSideCOutputCablesHigh = 1.18 *fgkcm;
const Double_t kSideCOutputCablesCu = 0.6775;
const Double_t kSideCOutputCablesPlast = 0.1613;
const Double_t kCablePlasticHeight = 11.50 *fgkmm;// 1150 mm^2
const Double_t kCoolingWaterHeight = 2.65 *fgkmm;// 265 mm^2
const Double_t kPoliUrethaneHeight = 4.62 *fgkmm;// 462 mm^2
+ const Double_t kCablesYtrans = 2.50 *fgkmm;// Avoid ovlps
// Overall position and rotation of the C-Side Cable Trays
const Double_t kTraySideCRPos = 45.30 *fgkcm;
// Copper lies on the lower plate: get position of its points
TGeoXtru *lowerplate = (TGeoXtru*)(mgr->GetVolume("ITSsuppTraySideCLower")->GetShape());
xprof[0] = lowerplate->GetX(5);
- yprof[0] = lowerplate->GetY(5);
+ yprof[0] = lowerplate->GetY(5) + kCablesYtrans;
xprof[1] = lowerplate->GetX(4);
- yprof[1] = lowerplate->GetY(4);
+ yprof[1] = lowerplate->GetY(4) + kCablesYtrans;
xprof[2] = lowerplate->GetX(3);
- yprof[2] = lowerplate->GetY(3);
+ yprof[2] = lowerplate->GetY(3) + kCablesYtrans;
xprof[3] = xprof[2] - kCopperHeight*SinD(kSideCFoldAngle);
yprof[3] = yprof[2] + kCopperHeight*CosD(kSideCFoldAngle);
InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],