+
+}
+
+
+//______________________________________________________________________
+void AliITSv11GeometrySPD::CreateServices(TGeoVolume *moth) const
+{
+ //
+ // New method to implement SPD services
+ //
+ // Created: 25 Jul 2012 Mario Sitta
+ // Updated: 15 Nov 2012 Mario Sitta
+ //
+ // Data provided by C.Gargiulo from CAD
+
+ // Cooling manifolds
+ const Double_t kCoolManifWidth = fgkmm * 22.0;
+ const Double_t kCoolManifLength = fgkmm * 50.0;
+ const Double_t kCoolManifThick = fgkmm * 7.0;
+ const Double_t kCoolManifFitR1out = fgkmm * 4.0;
+ const Double_t kCoolManifFitH1 = fgkmm * 2.5;
+ const Double_t kCoolManifFitR2out = fgkmm * 4.0;
+ const Double_t kCoolManifFitR2in = fgkmm * 3.2;
+ const Double_t kCoolManifFitH2 = fgkmm * 7.0;
+ const Double_t kCoolManifFitZPos = fgkmm * 2.0; // TO BE CHECKED!
+ const Double_t kCoolManifCollR1 = fgkmm * 3.0;
+ const Double_t kCoolManifCollH1 = fgkmm * 2.5;
+ const Double_t kCoolManifCollR2 = fgkmm * 1.5;
+ const Double_t kCoolManifCollH2 = fgkmm * 5.0;
+ const Double_t kCoolManifCollXPos = fgkmm * 5.0;
+ const Double_t kCoolManifCollDZ = fgkmm * 13.0;
+ const Double_t kCoolManifCollZ0 = fgkmm * 9.0;
+
+ const Double_t kCoolManifRPosCAD = fgkmm * 76.2;
+ const Double_t kCoolManifZPos = fgkcm * 33.97;// 34.0 - 0.03 toll.
+ // Manifold supports
+ const Double_t kManifSuppWidth = fgkmm * 24.0; // TO BE CHECKED!
+ const Double_t kManifSuppLen1 = fgkmm * 17.9;
+ const Double_t kManifSuppLen2 = fgkmm * 54.2;
+ const Double_t kManifSuppLen3 = fgkmm * 7.9;
+ const Double_t kManifSuppThick = fgkmm * 1.5;
+ const Double_t kSuppScrewXPos = fgkmm * 4.0;
+ const Double_t kSuppScrewZPos = fgkmm * 3.0;
+ const Double_t kRThermalShield = fgkcm * 9.9255; // MUST match with GeometrySupport
+ // Sector supports
+ const Double_t kSectSuppWidth = fgkmm * 15.0;
+ const Double_t kSectSuppLen1 = fgkmm * 16.9; // TO BE CHECKED!
+ const Double_t kSectSuppLen2 = fgkmm * 35.1; // TO BE CHECKED!
+ const Double_t kSectSuppThick = fgkmm * 1.5;
+ const Double_t kSectSuppDepth = fgkmm * 17.78; // MUST match with GeometrySupport
+ const Double_t kSectScrewZPos = fgkmm * 5.1; // TO BE CHECKED!
+
+ const Double_t kSectSuppZPos = fgkcm * 26.5;
+ // Sector clips
+ const Double_t kSectClipLength = fgkmm * 30.0;
+ const Double_t kSectClipWidth = fgkmm * 28.53;
+ const Double_t kSectClipThick1 = fgkmm * 2.0;
+ const Double_t kSectClipThick2 = fgkmm * 0.715;
+ const Double_t kSectClipInStave = fgkmm * 11.0; // Tuned
+ const Double_t kSectClipAngle = 29.0; // Degree. Tuned
+ // M3 screws
+ const Double_t kScrewM3Diam = fgkmm * 3.0;
+ const Double_t kScrewM3HeadThick = fgkmm * 2.0;
+ const Double_t kScrewM3HeadRmin = fgkmm * 1.5;
+ const Double_t kScrewM3HeadRmax = fgkmm * 2.5;
+ const Double_t kScrewM3OutManifH = fgkmm * 1.5;
+ // Central set pin (in sector support)
+ const Double_t kSetPinDiam = fgkmm * 6.0;
+ const Double_t kSetPinHeadDiam = fgkmm * 8.0;
+ const Double_t kSetPinHeadRmin = fgkmm * 1.5;
+ const Double_t kSetPinHeadThick = fgkmm * 1.5;
+ const Double_t kSetPinOutClipH = fgkmm * 1.0;
+
+ // Local variables
+ Double_t xprof[12], yprof[12];
+ Double_t radius, theta;
+ Double_t xpos, ypos, zpos;
+ Double_t tmp;
+
+
+ // The cooling manifold: an Assembly
+ TGeoVolumeAssembly *coolmanifA = new TGeoVolumeAssembly("ITSSPDCoolManifSideA");
+ TGeoVolumeAssembly *coolmanifC = new TGeoVolumeAssembly("ITSSPDCoolManifSideC");
+
+ // The various parts of the manifold
+ TGeoBBox *manifblksh = new TGeoBBox(kCoolManifWidth/2,
+ kCoolManifThick/2,
+ kCoolManifLength/2);
+
+ TGeoBBox *manifinscubesh = new TGeoBBox(kCoolManifFitR2out,
+ kCoolManifFitR2out,
+ kCoolManifFitR2out);
+
+ TGeoTube *manifinscyl1sh = new TGeoTube(0, // TO BE CHECKED!
+ kCoolManifFitR1out,
+ kCoolManifFitH1/2);
+
+ TGeoTube *manifinscyl2sh = new TGeoTube(kCoolManifFitR2in,
+ kCoolManifFitR2out,
+ kCoolManifFitH2/2);
+
+ TGeoTube *manifcollcyl1sh = new TGeoTube(0,
+ kCoolManifCollR1,
+ kCoolManifCollH1/2);
+
+ TGeoTube *manifcollcyl2sh = new TGeoTube(0,
+ kCoolManifCollR2,
+ kCoolManifCollH2/2);
+
+ // The cooling manifold supports
+ const Double_t kCoolManifRPos = kCoolManifRPosCAD +
+ (manifinscubesh->GetDY() +
+ 2*manifinscyl1sh->GetDz() +
+ manifblksh->GetDY() );
+
+ const Double_t kManifSuppDepth = kRThermalShield -
+ (kCoolManifRPos + manifblksh->GetDY());
+
+ TGeoXtru *suppmanifsh = new TGeoXtru(2);
+
+ xprof[ 0] = kManifSuppLen2/2 + kManifSuppThick;
+ yprof[ 0] = 0;
+ xprof[ 1] = xprof[0];
+ yprof[ 1] = kManifSuppDepth;
+ xprof[ 2] = kManifSuppLen2/2 + kManifSuppLen3;
+ yprof[ 2] = yprof[1];
+ xprof[ 3] = xprof[2];
+ yprof[ 3] = yprof[2] + kManifSuppThick;
+ xprof[ 4] = kManifSuppLen2/2;
+ yprof[ 4] = yprof[3];
+ xprof[ 5] = xprof[4];
+ yprof[ 5] = kManifSuppThick;
+ xprof[ 6] = -xprof[5];
+ yprof[ 6] = yprof[5];
+ xprof[ 7] = -xprof[4];
+ yprof[ 7] = yprof[4];
+ xprof[ 8] = -(kManifSuppLen2/2 + kManifSuppLen1);
+ yprof[ 8] = yprof[3];
+ xprof[ 9] = xprof[8];
+ yprof[ 9] = yprof[2];
+ xprof[10] = -xprof[1];
+ yprof[10] = yprof[1];
+ xprof[11] = -xprof[0];
+ yprof[11] = yprof[0];
+
+ suppmanifsh->DefinePolygon(12,xprof,yprof);
+ suppmanifsh->DefineSection(0,-kManifSuppWidth/2);
+ suppmanifsh->DefineSection(1, kManifSuppWidth/2);
+
+ // The screw head and body
+ TGeoTube *suppscrewbodysh = new TGeoTube(0, kScrewM3Diam/2,
+ kManifSuppThick/2);
+
+ TGeoPcon *suppscrewheadsh = new TGeoPcon(0, 360, 4);
+ suppscrewheadsh->DefineSection(0,-kScrewM3HeadThick/2,0, kScrewM3HeadRmax);
+ suppscrewheadsh->DefineSection(1, 0, 0, kScrewM3HeadRmax);
+ suppscrewheadsh->DefineSection(2, 0, kScrewM3HeadRmin, kScrewM3HeadRmax);
+ suppscrewheadsh->DefineSection(3, kScrewM3HeadThick/2,
+ kScrewM3HeadRmin, kScrewM3HeadRmax);
+
+ TGeoTube *clipscrewbodysh = new TGeoTube(0, kScrewM3Diam/2,
+ kSectClipThick1/2);
+
+ // The screw segment below the manifold and the sector clip
+ TGeoTube *screwoutmanifsh = new TGeoTube(0, kScrewM3Diam/2,
+ kScrewM3OutManifH/2);
+
+ // The sector supports
+ TGeoXtru *suppsectsh = new TGeoXtru(2);
+
+ xprof[ 0] = kSectSuppLen2/2 + kSectSuppThick;
+ yprof[ 0] = 0;
+ xprof[ 1] = xprof[0];
+ yprof[ 1] = kSectSuppDepth;
+ xprof[ 2] = kSectSuppLen2/2 + kSectSuppLen1;
+ yprof[ 2] = yprof[1];
+ xprof[ 3] = xprof[2];
+ yprof[ 3] = yprof[2] + kSectSuppThick;
+ xprof[ 4] = kSectSuppLen2/2;
+ yprof[ 4] = yprof[3];
+ xprof[ 5] = xprof[4];
+ yprof[ 5] = kSectSuppThick;
+ xprof[ 6] = -xprof[5];
+ yprof[ 6] = yprof[5];
+ xprof[ 7] = -xprof[4];
+ yprof[ 7] = yprof[4];
+ xprof[ 8] = -xprof[3];
+ yprof[ 8] = yprof[3];
+ xprof[ 9] = -xprof[2];
+ yprof[ 9] = yprof[2];
+ xprof[10] = -xprof[1];
+ yprof[10] = yprof[1];
+ xprof[11] = -xprof[0];
+ yprof[11] = yprof[0];
+
+ suppsectsh->DefinePolygon(12,xprof,yprof);
+ suppsectsh->DefineSection(0,-kSectSuppWidth/2);
+ suppsectsh->DefineSection(1, kSectSuppWidth/2);
+
+ // The sector clips
+ TGeoXtru *sectclipsh = new TGeoXtru(2);
+
+ xprof[ 0] = kSectClipWidth/2;
+ yprof[ 0] = 0;
+ xprof[ 1] = -kSectClipWidth/2;
+ yprof[ 1] = yprof[0];
+ xprof[ 2] = xprof[1];
+ yprof[ 2] = -kSectClipThick1;
+ xprof[ 3] = kSectClipWidth/2 - kSectClipThick2;
+ yprof[ 3] = yprof[2];
+ xprof[ 4] = xprof[3] + kSectClipInStave*SinD(kSectClipAngle);
+ yprof[ 4] = -kSectClipInStave*CosD(kSectClipAngle);
+ xprof[ 5] = xprof[4] + kSectClipThick2*CosD(kSectClipAngle);
+ yprof[ 5] = yprof[4] + kSectClipThick2*SinD(kSectClipAngle);
+
+ sectclipsh->DefinePolygon(6,xprof,yprof);
+ sectclipsh->DefineSection(0,-kSectClipLength/2);
+ sectclipsh->DefineSection(1, kSectClipLength/2);
+
+ // The central set pin head and body
+ TGeoTube *setpinbodysh = new TGeoTube(0, kSetPinDiam/2,
+ kSectSuppThick/2);
+
+ TGeoTube *setpinheadsh = new TGeoTube(kSetPinHeadRmin, kSetPinHeadDiam/2,
+ kSetPinHeadThick/2);
+
+ TGeoTube *pinclipbodysh = new TGeoTube(0, kSetPinDiam/2,
+ kSectClipThick1/2);
+
+ // The set pin segment below the sector clip
+ TGeoTube *setpinoutclipsh = new TGeoTube(0, kSetPinDiam/2,
+ kSetPinOutClipH/2);
+
+
+ // We have the shapes: now create the real volumes
+ TGeoMedium *medInox = GetMedium("INOX$");
+ TGeoMedium *medCu = GetMedium("COPPER$");
+ TGeoMedium *medSPDcf = GetMedium("SPD shield$");
+
+ TGeoVolume *manifblk = new TGeoVolume("ITSSPDBlkManif",
+ manifblksh,medInox);
+ manifblk->SetLineColor(kGreen+2);
+
+ TGeoVolume *manifinscube = new TGeoVolume("ITSSPDInsCubeManif",
+ manifinscubesh,medCu);
+ manifinscube->SetLineColor(kYellow);
+
+ TGeoVolume *manifinscyl1 = new TGeoVolume("ITSSPDInsCyl1Manif",
+ manifinscyl1sh,medCu);
+ manifinscyl1->SetLineColor(kYellow);
+
+ TGeoVolume *manifinscyl2 = new TGeoVolume("ITSSPDInsCyl2Manif",
+ manifinscyl2sh,medCu);
+ manifinscyl2->SetLineColor(kYellow);
+
+ TGeoVolume *manifcollcyl1 = new TGeoVolume("ITSSPDCollCyl1Manif",
+ manifcollcyl1sh,medCu);
+ manifcollcyl1->SetLineColor(kYellow);
+
+ TGeoVolume *manifcollcyl2 = new TGeoVolume("ITSSPDCollCyl2Manif",
+ manifcollcyl2sh,medCu);
+ manifcollcyl2->SetLineColor(kYellow);
+
+ TGeoVolume *suppmanif = new TGeoVolume("ITSSPDCoolManifSupp",
+ suppmanifsh,medSPDcf);
+ suppmanif->SetLineColor(7);
+
+ TGeoVolume *suppscrewbody = new TGeoVolume("ITSSPDSuppScrewBody",
+ suppscrewbodysh,medInox);
+ suppscrewbody->SetLineColor(kGray);
+
+ xpos = kCoolManifLength/2 - kSuppScrewZPos;
+ ypos = suppscrewbodysh->GetDz();
+ zpos = kCoolManifWidth/2 - kSuppScrewXPos;
+ suppmanif->AddNode(suppscrewbody, 1, new TGeoCombiTrans( xpos, ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ suppmanif->AddNode(suppscrewbody, 2, new TGeoCombiTrans( xpos, ypos,-zpos,
+ new TGeoRotation("",0,90,0)));
+ suppmanif->AddNode(suppscrewbody, 3, new TGeoCombiTrans(-xpos, ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ suppmanif->AddNode(suppscrewbody, 4, new TGeoCombiTrans(-xpos, ypos,-zpos,
+ new TGeoRotation("",0,90,0)));
+
+ TGeoVolume *suppscrewhead = new TGeoVolume("ITSSPDSuppScrewHead",
+ suppscrewheadsh,medInox);
+ suppscrewhead->SetLineColor(kGray);
+
+ TGeoVolume *screwoutmanif = new TGeoVolume("ITSSPDSuppScrewOutManif",
+ screwoutmanifsh,medInox);
+ screwoutmanif->SetLineColor(kGray);
+
+ TGeoVolume *suppsect = new TGeoVolume("ITSSPDCoolSectorSupp",
+ suppsectsh,medSPDcf);
+ suppsect->SetLineColor(7);
+
+ xpos = kSectSuppLen2/2 - kSectScrewZPos;
+ ypos = suppscrewbodysh->GetDz();
+ suppsect->AddNode(suppscrewbody, 1, new TGeoCombiTrans( xpos, ypos, 0,
+ new TGeoRotation("",0,90,0)));
+ suppsect->AddNode(suppscrewbody, 2, new TGeoCombiTrans(-xpos, ypos, 0,
+ new TGeoRotation("",0,90,0)));
+
+ TGeoVolume *setpinbody = new TGeoVolume("ITSSPDSetPinBody",
+ setpinbodysh,medInox);
+ setpinbody->SetLineColor(kGray);
+
+ ypos = setpinbodysh->GetDz();
+ suppsect->AddNode(setpinbody, 1, new TGeoCombiTrans( 0, ypos, 0,
+ new TGeoRotation("",0,90,0)));
+
+ TGeoVolume *setpinhead = new TGeoVolume("ITSSPDSetPinHead",
+ setpinheadsh,medInox);
+ setpinhead->SetLineColor(kGray);
+
+ TGeoVolume *sectclip = new TGeoVolume("ITSSPDCoolSectorClip",
+ sectclipsh,medSPDcf);
+ sectclip->SetLineColor(7);
+
+ TGeoVolume *clipscrewbody = new TGeoVolume("ITSSPDClipScrewBody",
+ clipscrewbodysh,medInox);
+ clipscrewbody->SetLineColor(kGray);
+
+ ypos = -clipscrewbodysh->GetDz();
+ zpos = kSectSuppLen2/2 - kSectScrewZPos;
+ sectclip->AddNode(clipscrewbody, 1, new TGeoCombiTrans( 0, ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ sectclip->AddNode(clipscrewbody, 2, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,90,0)));
+
+ TGeoVolume *pinclipbody = new TGeoVolume("ITSSPDClipPinBody",
+ pinclipbodysh,medInox);
+ pinclipbody->SetLineColor(kGray);
+
+ ypos = -pinclipbodysh->GetDz();
+ sectclip->AddNode(pinclipbody, 1, new TGeoCombiTrans( 0, ypos, 0,
+ new TGeoRotation("",0,90,0)));
+
+ TGeoVolume *setpinoutclip = new TGeoVolume("ITSSPDSetPinOutClip",
+ setpinoutclipsh,medInox);
+ setpinoutclip->SetLineColor(kGray);
+
+
+ // Add all volumes in the assemblies
+ coolmanifA->AddNode(manifblk,1,0);
+ coolmanifC->AddNode(manifblk,1,0);
+
+ ypos = manifblksh->GetDY() + manifinscyl1sh->GetDz();
+ zpos = manifblksh->GetDZ() - manifinscyl1sh->GetRmax() - kCoolManifFitZPos;
+ coolmanifA->AddNode(manifinscyl1, 1, new TGeoCombiTrans(0, -ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifC->AddNode(manifinscyl1, 1, new TGeoCombiTrans(0, -ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+
+ ypos += (manifinscyl1sh->GetDz() + manifinscubesh->GetDY());
+ coolmanifA->AddNode(manifinscube, 1, new TGeoTranslation(0, -ypos, zpos));
+ coolmanifC->AddNode(manifinscube, 1, new TGeoTranslation(0, -ypos, zpos));
+
+ zpos += (manifinscubesh->GetDZ() + manifinscyl2sh->GetDz());
+ coolmanifA->AddNode(manifinscyl2, 1, new TGeoTranslation(0, -ypos, zpos));
+ coolmanifC->AddNode(manifinscyl2, 1, new TGeoTranslation(0, -ypos, zpos));
+
+ ypos = manifblksh->GetDY();
+ coolmanifA->AddNode(suppmanif, 1, new TGeoCombiTrans(0, ypos, 0,
+ new TGeoRotation("",-90,90,90)));
+ coolmanifC->AddNode(suppmanif, 1, new TGeoCombiTrans(0, ypos, 0,
+ new TGeoRotation("",-90,90,90)));
+
+ ypos += (kManifSuppThick + kScrewM3HeadThick/2);
+ xpos = kCoolManifWidth/2 - kSuppScrewXPos;
+ zpos = kCoolManifLength/2 - kSuppScrewZPos;
+ coolmanifA->AddNode(suppscrewhead, 1, new TGeoCombiTrans( xpos, ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(suppscrewhead, 1, new TGeoCombiTrans( xpos, ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifA->AddNode(suppscrewhead, 2, new TGeoCombiTrans( xpos, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(suppscrewhead, 2, new TGeoCombiTrans( xpos, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifA->AddNode(suppscrewhead, 3, new TGeoCombiTrans(-xpos, ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(suppscrewhead, 3, new TGeoCombiTrans(-xpos, ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifA->AddNode(suppscrewhead, 4, new TGeoCombiTrans(-xpos, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(suppscrewhead, 4, new TGeoCombiTrans(-xpos, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+
+ ypos = manifblksh->GetDY() + screwoutmanifsh->GetDz();
+ coolmanifA->AddNode(screwoutmanif, 1, new TGeoCombiTrans( xpos,-ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(screwoutmanif, 1, new TGeoCombiTrans( xpos,-ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifA->AddNode(screwoutmanif, 2, new TGeoCombiTrans( xpos,-ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(screwoutmanif, 2, new TGeoCombiTrans( xpos,-ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifA->AddNode(screwoutmanif, 3, new TGeoCombiTrans(-xpos,-ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(screwoutmanif, 3, new TGeoCombiTrans(-xpos,-ypos, zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifA->AddNode(screwoutmanif, 4, new TGeoCombiTrans(-xpos,-ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(screwoutmanif, 4, new TGeoCombiTrans(-xpos,-ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+
+ ypos = manifblksh->GetDY() + suppmanifsh->GetY(1) - suppsectsh->GetY(1);
+ zpos = manifblksh->GetDZ() + (kCoolManifZPos - kSectSuppZPos);
+ coolmanifA->AddNode(suppsect, 1, new TGeoCombiTrans(0, ypos,-zpos,
+ new TGeoRotation("",-90,90,90)));
+ coolmanifC->AddNode(suppsect, 1, new TGeoCombiTrans(0, ypos,-zpos,
+ new TGeoRotation("",-90,90,90)));
+
+ tmp = ypos; // Save it to avoid recomputing
+
+ ypos += (kSectSuppThick + kScrewM3HeadThick/2);
+ zpos += (kSectSuppLen2/2 - kSectScrewZPos);
+ coolmanifA->AddNode(suppscrewhead, 5, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(suppscrewhead, 5, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ zpos -= 2*(kSectSuppLen2/2 - kSectScrewZPos);
+ coolmanifA->AddNode(suppscrewhead, 6, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(suppscrewhead, 6, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+
+ ypos = tmp + kSectSuppThick + kSetPinHeadThick/2;
+ zpos += (kSectSuppLen2/2 - kSectScrewZPos);
+ coolmanifA->AddNode(setpinhead, 1, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(setpinhead, 1, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+
+ ypos = tmp - 8.e-5; // Avoid microscopic overlap
+ tmp = ypos;
+ coolmanifA->AddNode(sectclip, 1, new TGeoTranslation( 0, ypos,-zpos));
+ coolmanifC->AddNode(sectclip, 1, new TGeoCombiTrans ( 0, ypos,-zpos,
+ new TGeoRotation("",-90,180,90)));
+
+ ypos -= (kSectClipThick1 + setpinoutclipsh->GetDz());
+ coolmanifA->AddNode(setpinoutclip, 1, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(setpinoutclip, 1, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+
+ ypos = tmp - (kSectClipThick1 + screwoutmanifsh->GetDz());
+ zpos += (kSectSuppLen2/2 - kSectScrewZPos);
+ coolmanifA->AddNode(screwoutmanif, 5, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(screwoutmanif, 5, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ zpos -= 2*(kSectSuppLen2/2 - kSectScrewZPos);
+ coolmanifA->AddNode(screwoutmanif, 6, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+ coolmanifC->AddNode(screwoutmanif, 6, new TGeoCombiTrans( 0, ypos,-zpos,
+ new TGeoRotation("",0,-90,0)));
+
+ xpos = manifblksh->GetDX() - kCoolManifCollXPos;
+ ypos = manifblksh->GetDY() + manifcollcyl1sh->GetDz();
+ zpos =-manifblksh->GetDZ() + kCoolManifCollZ0;
+ for (Int_t i=0; i<3; i++) {
+ coolmanifA->AddNode(manifcollcyl1, 2*i+1,
+ new TGeoCombiTrans( xpos, -ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifA->AddNode(manifcollcyl1, 2*i+2,
+ new TGeoCombiTrans(-xpos, -ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifC->AddNode(manifcollcyl1, 2*i+1,
+ new TGeoCombiTrans( xpos, -ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifC->AddNode(manifcollcyl1, 2*i+2,
+ new TGeoCombiTrans(-xpos, -ypos, zpos,
+ new TGeoRotation("",0,90,0)));
+ Double_t y = ypos + manifcollcyl1sh->GetDz() + manifcollcyl2sh->GetDz();
+ coolmanifA->AddNode(manifcollcyl2, 2*i+1,
+ new TGeoCombiTrans( xpos, -y, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifA->AddNode(manifcollcyl2, 2*i+2,
+ new TGeoCombiTrans(-xpos, -y, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifC->AddNode(manifcollcyl2, 2*i+1,
+ new TGeoCombiTrans( xpos, -y, zpos,
+ new TGeoRotation("",0,90,0)));
+ coolmanifC->AddNode(manifcollcyl2, 2*i+2,
+ new TGeoCombiTrans(-xpos, -y, zpos,
+ new TGeoRotation("",0,90,0)));
+
+ zpos += kCoolManifCollDZ;
+ }
+
+ // Now add the cooling tubes to the assembly
+ CreateCoolingTubes(coolmanifA, kFALSE);
+ CreateCoolingTubes(coolmanifC, kTRUE);
+
+
+ // Finally put everything in the mother volume
+ radius = kCoolManifRPos + 1.e-5; // Avoid microscopic overlap
+ zpos = kCoolManifZPos + manifblksh->GetDZ();
+ for (Int_t i=0; i<10; i++) {
+ theta = 36.*i;
+ moth->AddNode(coolmanifA, i+1, new TGeoCombiTrans(radius*SinD(theta),
+ radius*CosD(theta),
+ zpos,
+ new TGeoRotation("",-theta,0,0)));
+ moth->AddNode(coolmanifC, i+1, new TGeoCombiTrans(radius*SinD(theta),
+ radius*CosD(theta),
+ -zpos,
+ new TGeoRotation("",90-theta,180,-90)));
+ }
+
+
+}
+
+
+//______________________________________________________________________
+void AliITSv11GeometrySPD::CreateCoolingTubes(TGeoVolume *moth, Bool_t sideC) const
+{
+ //
+ // Private method to implement SPD cooling tubes
+ // going from the manifolds to the staves
+ // Since their form is quite complicate (especially on Side C
+ // where capillaries are located) a separate method is used
+ // If sideC is true, the cooling tubes on Side C are created
+ // along with the cooling loops (aka "capillaries"), otherwise
+ // the (simpler) tubes on Side A get created.
+ //
+ // In all variables: L = Left (X > 0) R = Right (X < 0)
+ //
+ // Created: 10 Nov 2012 Mario Sitta
+ //
+ // Data provided by C.Gargiulo from CAD
+
+ // Cooling manifolds - THESE VALUES *MUST* MATCH WITH CALLING METHOD!
+ const Double_t kCoolManifWidth = fgkmm * 22.0;
+ const Double_t kCoolManifLength = fgkmm * 50.0;
+ const Double_t kCoolManifThick = fgkmm * 7.0;
+ const Double_t kCoolManifCollH1 = fgkmm * 2.5;
+ const Double_t kCoolManifCollH2 = fgkmm * 5.0;
+ // Cooling pipes
+ const Double_t kCoolPipeSideARin = fgkmm * 1.5;
+ const Double_t kCoolPipeSideARout = fgkmm * 1.8;
+ const Double_t kCoolPipeSideCRin = fgkmm * 0.5;
+ const Double_t kCoolPipeSideCRout = fgkmm * 0.85;
+ const Double_t kCoolPipeHeight = fgkmm * 1.923;
+ const Double_t kCoolPipeCRadiusL[3] = {11.0, 14.0, 31.34};// TO BE CHECKED!
+ const Double_t kCoolPipeCRadiusR[3] = {12.0, 14.0, 35.54};// TO BE CHECKED!
+ const Double_t kCoolPipeARadiusL12[2] = {14.0, 30.0};
+ const Double_t kCoolPipeARadiusR12[2] = {14.0, 30.0};
+ const Double_t kCoolPipeARadiusL34[2] = {22.0, 30.0};
+ const Double_t kCoolPipeARadiusR34[2] = {22.0, 30.0};
+ const Double_t kCoolPipeARadiusL[3]= {14.0, 14.0, 31.34}; // TO BE CHECKED!
+ const Double_t kCoolPipeARadiusR[3]= {14.0, 14.0, 35.54}; // TO BE CHECKED!
+ const Double_t kCoolPipeZSPD = fgkcm * 8.47;
+ // Cooling pipes position - THESE VALUES *MUST* MATCH WITH CALLING METHOD!
+ const Double_t kCoolManifCollXPos = fgkmm * 5.0;
+ const Double_t kCoolManifCollDZ = fgkmm * 13.0;
+ const Double_t kCoolManifCollZ0 = fgkmm * 9.0;
+
+ Int_t kPurple = 6; // Purple (Root does not define it)
+
+ // Local variables
+ Double_t xpos, ypos, zpos;
+ Char_t pipename[11];
+
+ //
+ TGeoMedium *medPhynox = GetMedium("PHYNOX$");
+ TGeoMedium *medFreon = GetMedium("Freon$");
+ TGeoMedium *medGasFr = GetMedium("GASEOUS FREON$");
+
+ // The cooling tubes are created as CableRound volumes
+ // because it's easier to compose them piece by piece
+ AliITSv11GeomCableRound *coolpipe[6];
+
+ if (sideC)
+ for (Int_t i = 0; i<6; i++) {
+ snprintf(pipename,11,"coolPipeC%d",i+1);
+ coolpipe[i] = new AliITSv11GeomCableRound(pipename,kCoolPipeSideCRout);
+ coolpipe[i]->SetNLayers(2);
+ coolpipe[i]->SetLayer(0, kCoolPipeSideCRin, medFreon, kPurple);
+ coolpipe[i]->SetLayer(1,(kCoolPipeSideCRout-kCoolPipeSideCRin),
+ medPhynox, kYellow);
+ }
+ else
+ for (Int_t i = 0; i<6; i++) {
+ snprintf(pipename,11,"coolPipeA%d",i+1);
+ coolpipe[i] = new AliITSv11GeomCableRound(pipename,kCoolPipeSideARout);
+ coolpipe[i]->SetNLayers(2);
+ coolpipe[i]->SetLayer(0, kCoolPipeSideARin, medGasFr, kPurple);
+ coolpipe[i]->SetLayer(1,(kCoolPipeSideARout-kCoolPipeSideARin),
+ medPhynox, kYellow);
+ }
+
+ // Now place them in the mother assembly
+ xpos = kCoolManifWidth/2 - kCoolManifCollXPos;
+ ypos = kCoolManifThick/2 + kCoolManifCollH1 + kCoolManifCollH2;
+ zpos =-kCoolManifLength/2 + kCoolManifCollZ0;
+
+ if (sideC) { // On Side C tubes are simpler and can be created in a loop
+
+ for (Int_t i=0; i<3; i++) {
+
+ Double_t coordL[3] = { xpos,-ypos,zpos};
+ Double_t coordR[3] = {-xpos,-ypos,zpos};
+ Double_t vect[3] = {0, 1, 0};
+ coolpipe[2*i]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[2*i]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= kCoolPipeCRadiusL[i]*fgkmm;
+ coordL[2] -= kCoolPipeCRadiusL[i]*fgkmm;
+ coordR[1] -= kCoolPipeCRadiusR[i]*fgkmm;
+ coordR[2] -= kCoolPipeCRadiusR[i]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[2*i]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[2*i]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 3, coordR, vect);
+
+ zpos += kCoolManifCollDZ;
+ }
+
+ for (Int_t i=0; i<6; i++) {
+ coolpipe[i]->SetInitialNode(moth);
+
+ coolpipe[i]->CreateAndInsertTubeSegment(1);
+ coolpipe[i]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[i]->CreateAndInsertTubeSegment(3);
+ }
+
+ } else { // On Side A tubes are all different so are created one by one
+
+ Double_t coordL[3] = { xpos,-ypos,zpos};
+ Double_t coordR[3] = {-xpos,-ypos,zpos};
+ Double_t vect[3] = {0, 1, 0};
+ coolpipe[0]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[0]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= SinD(45) *kCoolPipeARadiusL12[0]*fgkmm;
+ coordL[2] -= (1+CosD(45))*kCoolPipeARadiusL12[0]*fgkmm;
+ coordR[1] -= SinD(45) *kCoolPipeARadiusR12[0]*fgkmm;
+ coordR[2] -= (1+CosD(45))*kCoolPipeARadiusR12[0]*fgkmm;
+ vect[1] = TMath::Sqrt(2);
+ vect[2] = -vect[1];
+ coolpipe[0]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[1] += (1-CosD(45))*kCoolPipeARadiusL12[1]*fgkmm;
+ coordL[2] -= SinD(45) *kCoolPipeARadiusL12[1]*fgkmm;
+ coordR[1] += (1-CosD(45))*kCoolPipeARadiusR12[1]*fgkmm;
+ coordR[2] -= SinD(45) *kCoolPipeARadiusR12[1]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[0]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 3, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[0]->AddCheckPoint(moth, 4, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 4, coordR, vect);
+
+ coolpipe[0]->SetInitialNode(moth);
+ coolpipe[0]->CreateAndInsertTubeSegment(1);
+ coolpipe[0]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[0]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[0]->CreateAndInsertTubeSegment(4);
+
+ coolpipe[1]->SetInitialNode(moth);
+ coolpipe[1]->CreateAndInsertTubeSegment(1);
+ coolpipe[1]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[1]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[1]->CreateAndInsertTubeSegment(4);
+
+ zpos += kCoolManifCollDZ;
+
+ coordL[0] = xpos; coordL[1] = -ypos; coordL[2] = zpos;
+ coordR[0] =-xpos; coordR[1] = -ypos; coordR[2] = zpos;
+ vect[0] = 0; vect[1] = 1; vect[2] = 0;
+
+ coolpipe[2]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[2]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= SinD(45) *kCoolPipeARadiusL34[0]*fgkmm;
+ coordL[2] -= (1+CosD(45))*kCoolPipeARadiusL34[0]*fgkmm;
+ coordR[1] -= SinD(45) *kCoolPipeARadiusR34[0]*fgkmm;
+ coordR[2] -= (1+CosD(45))*kCoolPipeARadiusR34[0]*fgkmm;
+ vect[1] = TMath::Sqrt(2);
+ vect[2] = -vect[1];
+ coolpipe[2]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[1] += (1-CosD(45))*kCoolPipeARadiusL34[1]*fgkmm;
+ coordL[2] -= SinD(45) *kCoolPipeARadiusL34[1]*fgkmm;
+ coordR[1] += (1-CosD(45))*kCoolPipeARadiusR34[1]*fgkmm;
+ coordR[2] -= SinD(45) *kCoolPipeARadiusR34[1]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[2]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 3, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[2]->AddCheckPoint(moth, 4, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 4, coordR, vect);
+
+ coolpipe[2]->SetInitialNode(moth);
+ coolpipe[2]->CreateAndInsertTubeSegment(1);
+ coolpipe[2]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[2]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[2]->CreateAndInsertTubeSegment(4);
+
+ coolpipe[3]->SetInitialNode(moth);
+ coolpipe[3]->CreateAndInsertTubeSegment(1);
+ coolpipe[3]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[3]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[3]->CreateAndInsertTubeSegment(4);
+
+ zpos += kCoolManifCollDZ;
+
+ coordL[0] = xpos; coordL[1] = -ypos; coordL[2] = zpos;
+ coordR[0] =-xpos; coordR[1] = -ypos; coordR[2] = zpos;
+ vect[0] = 0; vect[1] = 1; vect[2] = 0;
+
+ coolpipe[4]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[4]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= kCoolPipeARadiusL[2]*fgkmm;
+ coordL[2] -= kCoolPipeARadiusL[2]*fgkmm;
+ coordR[1] -= kCoolPipeARadiusR[2]*fgkmm;
+ coordR[2] -= kCoolPipeARadiusR[2]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[4]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[4]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 3, coordR, vect);
+
+ coolpipe[4]->SetInitialNode(moth);
+ coolpipe[4]->CreateAndInsertTubeSegment(1);
+ coolpipe[4]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[4]->CreateAndInsertTubeSegment(3);
+
+ coolpipe[5]->SetInitialNode(moth);
+ coolpipe[5]->CreateAndInsertTubeSegment(1);
+ coolpipe[5]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[5]->CreateAndInsertTubeSegment(3);
+
+ } // if (sideC)
+
+ if(GetDebug(3))
+ for (Int_t i=0; i<6; i++)
+ coolpipe[i]->PrintCheckPoints();
+