+ // Final flange shape, and at to full shape
+ TGeoCompositeShape* flangeShape = new TGeoCompositeShape(flangeComb.Data());
+ flangeShape->SetName("FMD3_flange");
+ for (Int_t i = 0; i < 2; i++) {
+ TGeoRotation* rot = new TGeoRotation();
+ rot->RotateZ((i+.5)*90);
+ TVector2 v(flangeX, 0);
+ TVector2 w = v.Rotate((i+.5) * 2 * flangeAngle);
+ TGeoCombiTrans* trans = new TGeoCombiTrans(w.X(),w.Y(),
+ r4->X()+flangeDepth, rot);
+ trans->SetName(Form("FMD3_flange_matrix%d", i));
+ trans->RegisterYourself();
+ coneComb.Append(Form("+FMD3_flange:FMD3_flange_matrix%d", i));
+ }
+ coneComb.Append(")-(");
+
+ //__________________________________________________________________
+ // Holes
+ Double_t holeL = fmd3->GetHoleLength()/2;
+ Double_t holeD = fmd3->GetHoleDepth()/2;
+ Double_t holeLW = fmd3->GetHoleLowWidth()/2;
+ Double_t holeHW = fmd3->GetHoleHighWidth()/2;
+ Double_t holeA = fmd3->GetConeOuterAngle();
+ Double_t holeA2 = TMath::Pi() - fmd3->GetConeOuterAngle();
+ Double_t holeO = fmd3->GetHoleOffset();
+ Double_t holeZ = (holeO
+ + holeL * TMath::Cos(holeA)
+ - holeD * TMath::Sin(holeA2));
+ Double_t holeX = (fmd3->ConeR(-holeZ + fmd3->GetInnerZ() + fmd3->GetNoseZ())
+ - holeD * TMath::Sin(holeA2));
+ new TGeoTrd1("FMD3_cone_hole", holeLW, holeHW, holeD, holeL);
+ TGeoTrd1* plateShape = new TGeoTrd1("FMD3_cooling_plate",
+ holeLW, holeHW, .033, holeL);
+ TGeoRotation* holeRot = new TGeoRotation();
+ holeRot->SetName("FMD3_cone_hole_rotation");
+ holeRot->RotateZ(90);
+ holeRot->RotateY(holeA*180/TMath::Pi());
+ TGeoCombiTrans* holeBaseTrans = new TGeoCombiTrans(holeX, 0, holeZ, holeRot);
+ holeBaseTrans->SetName("FMD3_cone_hole_base_matrix");
+ // TGeoRotation* plateRot = new TGeoRotation();
+ // plateRot->SetName("FMD3_cone_plate_rotation");
+ // plateRot->RotateZ(90);
+ // plateRot->RotateY(plateA*180/TMath::Pi());
+ // TGeoCombiTrans* plateBaseTrans = new
+ // TGeoCombiTrans(plateX,0,plateZ,plateRot);
+ TGeoVolume* plateVolume = new TGeoVolume("FMD3_cooling_plate",
+ plateShape, fAl);
+ plateShape->SetTitle("FMD3 cooling plate");
+ plateVolume->SetTitle("FMD3 cooling plate");
+ for (Int_t i = 0; i < 4; i++) {
+ Double_t ang = 360. / 8 * (i + .5);
+ TGeoCombiTrans* trans = new TGeoCombiTrans(*holeBaseTrans);
+ trans->RotateZ(ang);
+ trans->SetName(Form("FMD3_cone_hole_matrix%d", i));
+ trans->RegisterYourself();
+ trans = new TGeoCombiTrans(*holeBaseTrans);
+ trans->RotateZ(ang);
+ trans->SetName(Form("FMD3_cooling_plate_matrix%d", i));
+ coneComb.Append(Form("FMD3_cone_hole:FMD3_cone_hole_matrix%d+", i));
+ support->AddNode(plateVolume, i, trans);
+ }
+
+ //__________________________________________________________________
+ // Bolts
+ Double_t boltRadius = fmd3->GetBoltRadius();
+ Double_t boltLength = fmd3->GetBoltLength() / 2;
+ Double_t boltZ1 = fmd3->GetInnerZ()+fmd3->GetNoseZ()-10;
+ Double_t boltZ2 = fmd3->GetInnerZ()+fmd3->GetNoseZ()-20;
+ Double_t boltXE = 2*boltLength*TMath::Cos(fmd3->GetConeOuterAngle());
+ Double_t boltX1 = (fmd3->ConeR(boltZ1) - boltXE);
+ Double_t boltX2 = (fmd3->ConeR(boltZ2) - boltXE);
+
+ new TGeoTube("FMD3_bolt_hole", 0, boltRadius, boltLength+.2);
+ TGeoTube* boltShape = new TGeoTube("FMD3_bolt", 0, boltRadius, boltLength);
+ TGeoRotation* boltRot = new TGeoRotation();
+ boltRot->RotateY(-fmd3->GetConeOuterAngle()*180/TMath::Pi());
+ TGeoCombiTrans* boltTrans1 = new TGeoCombiTrans(boltX1, 0, 10, boltRot);
+ TGeoCombiTrans* boltTrans2 = new TGeoCombiTrans(boltX2, 0, 20, boltRot);
+ TGeoCombiTrans* boltTrans3 = new TGeoCombiTrans(*boltTrans1);
+ TGeoCombiTrans* boltTrans4 = new TGeoCombiTrans(*boltTrans2);
+ boltTrans3->RotateZ(180);
+ boltTrans4->RotateZ(180);
+ boltTrans1->SetName("FMD3_bolt_matrix1");
+ boltTrans2->SetName("FMD3_bolt_matrix2");
+ boltTrans3->SetName("FMD3_bolt_matrix3");
+ boltTrans4->SetName("FMD3_bolt_matrix4");
+ boltTrans1->RegisterYourself();
+ boltTrans2->RegisterYourself();
+ boltTrans3->RegisterYourself();
+ boltTrans4->RegisterYourself();
+ coneComb.Append("FMD3_bolt_hole:FMD3_bolt_matrix1"
+ "+FMD3_bolt_hole:FMD3_bolt_matrix2"
+ "+FMD3_bolt_hole:FMD3_bolt_matrix3"
+ "+FMD3_bolt_hole:FMD3_bolt_matrix4");
+ TGeoVolume* boltVolume = new TGeoVolume("FMD3_bolt", boltShape, fSteel);
+ support->AddNode(boltVolume, 1, boltTrans1);
+ support->AddNode(boltVolume, 2, boltTrans2);
+ boltShape->SetTitle("FMD3 steering bolt");
+ boltVolume->SetTitle("FMD3 steering bolt");
+
+ //__________________________________________________________________
+ // Cut-outs for tension wheel sheeve
+ new TGeoBBox("FMD3_sheeve_hole", .55, .75, 1.16);
+ Double_t sheeveHoleZ = fmd3->GetInnerZ() + fmd3->GetNoseZ() - .75;
+ Double_t sheeveHoleR = fmd3->ConeR(sheeveHoleZ) - .55 + .2572222;
+ TGeoCombiTrans* sheeveMat1 = new TGeoCombiTrans(sheeveHoleR,0,1.15,0);
+ TGeoCombiTrans* sheeveMat2 = new TGeoCombiTrans(sheeveHoleR,0,1.15,0);
+ sheeveMat1->RotateZ(45);
+ sheeveMat2->RotateZ(135);
+ sheeveMat1->SetName("FMD3_sheeve_hole_matrix1");
+ sheeveMat2->SetName("FMD3_sheeve_hole_matrix2");
+ sheeveMat1->RegisterYourself();
+ sheeveMat2->RegisterYourself();
+ coneComb.Append("+FMD3_sheeve_hole:FMD3_sheeve_hole_matrix1"
+ "+FMD3_sheeve_hole:FMD3_sheeve_hole_matrix2)");
+
+ //__________________________________________________________________
+ // Sheeve boxes
+ Double_t sheeveL = 1.15;
+ TGeoBBox* sheeveSideS = new TGeoBBox("FMD3_sheeve_side",
+ .55, .25, 1.15);
+ TGeoBBox* sheeveBackS = new TGeoBBox("FMD3_sheeve_back",
+ .55, .25, .15);
+ TGeoBBox* sheeveWingS = new TGeoBBox("FMD3_sheeve_wing",
+ .15, .15, 1.15);
+ TGeoPcon* sheeveWheelS = new TGeoPcon("FMD3_sheeve_wheel", 0, 360, 9);
+ Double_t sheeveInnerR = 0; // .2;
+ Double_t sheeveR = .875;
+ Double_t sheeveWheelZ = .95;
+ sheeveWheelS->DefineSection(0, -.25, sheeveInnerR, 1);
+ sheeveWheelS->DefineSection(1, -.125, sheeveInnerR, 1);
+ sheeveWheelS->DefineSection(2, -.125, sheeveInnerR, sheeveWheelZ);
+ sheeveWheelS->DefineSection(3, -.0625, sheeveInnerR, sheeveR+.02);
+ sheeveWheelS->DefineSection(4, 0.000, sheeveInnerR, sheeveR);
+ sheeveWheelS->DefineSection(5, +.0625, sheeveInnerR, sheeveR+.02);
+ sheeveWheelS->DefineSection(6, +.125, sheeveInnerR, sheeveWheelZ);
+ sheeveWheelS->DefineSection(7, +.125, sheeveInnerR, 1);
+ sheeveWheelS->DefineSection(8, +.25, sheeveInnerR, 1);
+ TGeoVolume* sheeveSideV = new TGeoVolume("FMD3_sheeve_side",
+ sheeveSideS, fPlastic);
+ TGeoVolume* sheeveBackV = new TGeoVolume("FMD3_sheeve_back",
+ sheeveBackS, fPlastic);
+ TGeoVolume* sheeveWingV = new TGeoVolume("FMD3_sheeve_wing",
+ sheeveWingS, fPlastic);
+ TGeoVolume* sheeveWheelV= new TGeoVolume("FMD3_sheeve_wheel",
+ sheeveWheelS, fPlastic);
+ TGeoVolumeAssembly* sheeveBox = new TGeoVolumeAssembly("FMD3_sheeve_box");
+ sheeveBox->AddNode(sheeveSideV, 1, new TGeoTranslation(0, -.5, 0));
+ sheeveBox->AddNode(sheeveSideV, 2, new TGeoTranslation(0, +.5, 0));
+ sheeveBox->AddNode(sheeveBackV, 1, new TGeoTranslation(0, 0, 2.0+.15-1.15));
+ sheeveBox->AddNode(sheeveWingV, 1, new TGeoTranslation(.55-.15, -.90, 0));
+ sheeveBox->AddNode(sheeveWingV, 2, new TGeoTranslation(.55-.15, +.90, 0));
+ TGeoRotation* sheeveWheelR = new TGeoRotation;
+ sheeveWheelR->RotateX(90);
+ TGeoCombiTrans* sheeveWheelM = new TGeoCombiTrans(0, 0, sheeveWheelZ-sheeveL,
+ sheeveWheelR);
+ sheeveBox->AddNode(sheeveWheelV, 1, sheeveWheelM);
+ support->AddNode(sheeveBox, 1, sheeveMat1);
+ support->AddNode(sheeveBox, 2, sheeveMat2);
+
+
+
+ //__________________________________________________________________
+ // Final cone
+ TGeoCompositeShape* coneShape = new TGeoCompositeShape(coneComb.Data());
+ coneShape->SetName("FMD3_cone");
+ coneShape->SetTitle("FMD3 cone");
+ TGeoVolume* coneVolume = new TGeoVolume("FMD3_Cone", coneShape, fC);
+ coneVolume->SetLineColor(kRed);
+ support->AddNode(coneVolume, 0, new TGeoTranslation(0, 0, 0));
+
+ //__________________________________________________________________
+ // Tension boxes.
+ TGeoVolume* tensionBox = TensionBox();
+ Double_t tensionH = .6;
+ Double_t tensionL = 4;
+ Double_t tensionZ = 23.654;
+ Double_t tensionR = fmd3->ConeR(fmd3->GetInnerZ() + fmd3->GetNoseZ()
+ - tensionZ);
+ Double_t tensionAr = fmd3->GetConeOuterAngle();
+ Double_t tensionA = tensionAr * 180 / TMath::Pi();
+ TGeoRotation* tensionQ = new TGeoRotation;
+ tensionQ->RotateY(tensionA);
+ TGeoCombiTrans* tensionM1 = new TGeoCombiTrans(tensionR,0,tensionZ, tensionQ);
+ TGeoCombiTrans* tensionM2 = new TGeoCombiTrans(tensionR,0,tensionZ, tensionQ);
+ tensionM1->RotateZ(45);
+ tensionM2->RotateZ(135);
+ support->AddNode(tensionBox, 1, tensionM1);
+ support->AddNode(tensionBox, 2, tensionM2);
+
+ // Double_t tensionHR = 0.15;
+ Double_t wireT = .1/2;
+ Double_t wireZ1 = (tensionZ
+ - tensionL * TMath::Cos(tensionAr)
+ - tensionH * TMath::Sin(tensionAr));
+ Double_t wireR1 = (tensionR
+ - tensionL * TMath::Sin(tensionAr)
+ + tensionH * TMath::Cos(tensionAr));
+ AliFMDDebug(10, ("Wire Z1: %f=%f-%f*cos(%f)-%f*sin(%f)",
+ wireZ1, tensionZ, tensionL, tensionAr, tensionH, tensionAr));
+ AliFMDDebug(10, ("Wire R1: %f=%f-%f*sin(%f)-%f*cos(%f)",
+ wireR1, tensionR, tensionL, tensionAr, tensionH, tensionAr));
+
+ Double_t wireStartA = 42.3 * TMath::Pi() / 180;
+ Double_t wireZ2 = (sheeveWheelZ * (1 - TMath::Sin(wireStartA))
+ // - sheeveL -
+ - wireT * TMath::Sin(wireStartA));
+ /* (sheeveWheelZ * (1 - TMath::Sin(wireStartA))
+ - wireT * TMath::Sin(wireStartA)
+ - sheeveL); */
+ AliFMDDebug(10, ("wireZ2=%f=%f*(1-%f)", wireZ2, sheeveWheelZ,
+ TMath::Sin(wireStartA)));
+ Double_t wireR2 = (sheeveHoleR +
+ sheeveWheelZ * TMath::Cos(wireStartA) +
+ wireT * TMath::Cos(wireStartA));
+ Double_t wireDR = wireR1-wireR2;
+ Double_t wireDZ = wireZ1-wireZ2;
+ Double_t wireL = TMath::Sqrt(wireDR*wireDR+wireDZ*wireDZ)-.01;
+ Double_t wireAngle = TMath::ATan2(wireDR,wireDZ);
+ TGeoTube* wireShape = new TGeoTube("FMD3_wire", 0, wireT, wireL/2);
+ TGeoVolume* wireVolume = new TGeoVolume("FMD3_wire", wireShape,fSteel);
+ TGeoRotation* wireRot = new TGeoRotation();
+ wireRot->RotateY(180/TMath::Pi()*wireAngle);
+ Double_t wireR = wireR2 + wireDR / 2;
+ Double_t wireZ = wireZ2 + wireDZ / 2;
+ TGeoCombiTrans* wireM1 = new TGeoCombiTrans(wireR, 0,wireZ, wireRot);
+ TGeoCombiTrans* wireM2 = new TGeoCombiTrans(wireR, 0,wireZ, wireRot);
+ wireM1->RotateZ(45);
+ wireM2->RotateZ(135);
+ support->AddNode(wireVolume, 1, wireM1);
+ support->AddNode(wireVolume, 2, wireM2);
+
+
+ TGeoTorus* wireTS = new TGeoTorus(sheeveWheelZ+wireT, 0, wireT, 0,
+ 90-wireStartA*180/TMath::Pi());
+ TGeoVolume* wireTV = new TGeoVolume("FMD3_bend_wire",wireTS,fSteel);
+ TGeoRotation* wireTR = new TGeoRotation;
+ wireTR->RotateY(90);
+ wireTR->RotateZ(-90);
+ Double_t wireTZ = sheeveWheelZ;
+ TGeoCombiTrans* wireTM1 = new TGeoCombiTrans(sheeveHoleR,0,wireTZ,wireTR);
+ TGeoCombiTrans* wireTM2 = new TGeoCombiTrans(sheeveHoleR,0,wireTZ,wireTR);
+ wireTM1->RotateZ(45);
+ wireTM2->RotateZ(135);
+ support->AddNode(wireTV, 1, wireTM1);
+ support->AddNode(wireTV, 2, wireTM2);
+
+ Double_t colarR = 4.05;
+ Double_t wireEL = sheeveHoleR - colarR;
+ TGeoTube* wireES = new TGeoTube("FMD3_end_wire", 0, wireT, wireEL/2);
+ TGeoVolume* wireEV = new TGeoVolume("FMD3_end_wire", wireES, fSteel);
+ TGeoRotation* wireER = new TGeoRotation;
+ wireER->RotateY(90);
+ TGeoCombiTrans* wireEM1 = new TGeoCombiTrans(colarR+wireEL/2,0,
+ -wireT,wireER);
+ TGeoCombiTrans* wireEM2 = new TGeoCombiTrans(colarR+wireEL/2,0,
+ -wireT,wireER);
+ wireEM1->RotateZ(45);
+ wireEM2->RotateZ(135);
+ support->AddNode(wireEV, 1, wireEM1);
+ support->AddNode(wireEV, 2, wireEM2);
+
+
+
+
+ //__________________________________________________________________
+ // Place support volumes in half-detector volumes
+ Double_t z = fmd3->GetInnerZ();
+ AliFMDDebug(1, ("FMD3 support at z=%f", -fmd3->GetNoseZ()));
+ TGeoTranslation* t1 = new TGeoTranslation(0, 0, -fmd3->GetNoseZ());
+ fmd3TopVolume->AddNode(support, 1, t1);
+ TGeoCombiTrans* t2 = new TGeoCombiTrans(*t1);
+ t2->RotateZ(180);
+ fmd3BotVolume->AddNode(support, 2, t2);
+
+ TGeoRotation* rot = new TGeoRotation("FMD3 rotatation");