From 45c52bb20e409f9402c6e1e9f3839ee960413707 Mon Sep 17 00:00:00 2001 From: masera Date: Mon, 28 Jun 2010 08:24:27 +0000 Subject: [PATCH] Improvement of SPD description: extenders + optical patch panels + optical fibres on the cone (A. Pulvienti, M. Sitta) --- ITS/AliITSv11GeometrySPD.cxx | 162 ++++++++++++++++++++++++++++++++--- ITS/AliITSv11GeometrySPD.h | 3 + ITS/AliITSv11Hybrid.cxx | 42 +++++++++ 3 files changed, 193 insertions(+), 14 deletions(-) diff --git a/ITS/AliITSv11GeometrySPD.cxx b/ITS/AliITSv11GeometrySPD.cxx index ef2b3e01cf0..685b49f6f32 100644 --- a/ITS/AliITSv11GeometrySPD.cxx +++ b/ITS/AliITSv11GeometrySPD.cxx @@ -1779,7 +1779,76 @@ TGeoVolume* AliITSv11GeometrySPD::CreateClip(TArrayD &sizes,Bool_t isDummy, TGeoVolume *vClip = new TGeoVolume("ITSSPDclip", shClipHole, mat); vClip->SetLineColor(kGray + 2); return vClip; -}//______________________________________________________________________ +} + +//______________________________________________________________________ +TGeoVolume* AliITSv11GeometrySPD::CreatePatchPanel(TArrayD &sizes, + TGeoManager *mgr) const +{ + // + // Creates the patch panel approximated with a "L"-shaped TGeoXtru + // with a finite thickness for all the shape + // Its local reference frame is such that point A corresponds to origin. + // + Double_t hLength = fgkmm * 50.0; // horizontal length + Double_t vLength = fgkmm * 50.0; // vertical length + Double_t angle = 87.5; // angle between hor and vert + Double_t thickness = fgkmm * 4.0; // thickness + Double_t width = fgkmm * 100.0; // width looking from cone + + Double_t x[7], y[7]; + + y[0] = 0.0; + y[1] = y[0] + hLength; + y[2] = y[1]; + y[3] = y[0] + thickness; + y[4] = y[3] + vLength * TMath::Cos(angle*TMath::DegToRad()); + y[5] = y[4] - thickness / TMath::Sin(angle*TMath::DegToRad()); + y[6] = y[0]; + + x[0] = 0.0; + x[1] = x[0]; + x[2] = x[1] + thickness; + x[3] = x[2]; + x[4] = x[3] + vLength * TMath::Sin(angle*TMath::DegToRad()); + x[5] = x[4]; + x[6] = x[0] + thickness; + + sizes.Set(3); + sizes[0] = hLength; + sizes[1] = vLength; + sizes[2] = thickness; + + TGeoXtru *shPatch = new TGeoXtru(2); + shPatch->SetName("ITSSPDpatchShape1"); + shPatch->DefinePolygon(7, x, y); + shPatch->DefineSection(0, -0.5*width, 0., 0., 1.0); + shPatch->DefineSection(1, 0.5*width, 0., 0., 1.0); + + /* + Double_t subThickness = 10.0 * fgkmm; + Double_t subWidth = 55.0 * fgkmm; + new TGeoBBox("ITSSPDpatchShape2", 0.5*subThickness, 60.0 * fgkmm, 0.5*subWidth); + TGeoRotation *rotSub = new TGeoRotation(*gGeoIdentity); + rotSub->SetName("shPatchSubRot"); + rotSub->RotateZ(50.0); + rotSub->RegisterYourself(); + TGeoCombiTrans *trSub = new TGeoCombiTrans(0.26*hLength, 0.26*vLength, 0.0, rotSub); + trSub->SetName("shPatchSubTr"); + trSub->RegisterYourself(); + + TGeoCompositeShape *shPatchFinal = new TGeoCompositeShape("ITSSPDpatchShape1-(ITSSPDpatchShape2:shPatchSubTr)"); + */ + + TGeoMedium *mat = GetMedium("AL$", mgr); + //TGeoVolume *vPatch = new TGeoVolume("ITSSPDpatchPanel", shPatchFinal, mat); + TGeoVolume *vPatch = new TGeoVolume("ITSSPDpatchPanel", shPatch, mat); + vPatch->SetLineColor(kAzure); + + return vPatch; +} + +//______________________________________________________________________ TGeoCompositeShape* AliITSv11GeometrySPD::CreateGroundingFoilShape (Int_t itype,Double_t &length,Double_t &width, Double_t thickness,TArrayD &sizes) @@ -2708,7 +2777,8 @@ TGeoVolumeAssembly* AliITSv11GeometrySPD::CreatePixelBus // ??? Resistance //TGeoMedium *medRes = GetMedium("SDD X7R capacitors$",mgr); TGeoMedium *medRes = GetMedium("ALUMINUM$",mgr); - TGeoMedium *medExt = GetMedium("SDDKAPTON (POLYCH2)$", mgr); + //TGeoMedium *medExt = GetMedium("SDDKAPTON (POLYCH2)$", mgr); + TGeoMedium *medExt = GetMedium("SPD-MIX CU KAPTON$", mgr); // ** SIZES & POSITIONS ** Double_t busLength = 170.501 * fgkmm; // length of plane part Double_t busWidth = 13.800 * fgkmm; // width @@ -2916,15 +2986,20 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, // angrot is the rotation angle (passed as an argument to avoid // defining the same quantity in two different places) // - // Created: ?? ??? 2008 Alberto Pulvirenti - // Updated: 03 May 2010 Mario Sitta + // Created: ?? ??? 2008 A. Pulvirenti + // Updated: 03 May 2010 M. Sitta + // Updated: 20 Jun 2010 A. Pulvirenti Optical patch panels + // Updated: 22 Jun 2010 M. Sitta Fiber cables // TGeoMedium *medInox = GetMedium("INOX$",mgr); - TGeoMedium *medExt = GetMedium("SDDKAPTON (POLYCH2)$", mgr); + //TGeoMedium *medExt = GetMedium("SDDKAPTON (POLYCH2)$", mgr); + TGeoMedium *medExtB = GetMedium("SPD-BUS CU KAPTON$", mgr); + TGeoMedium *medExtM = GetMedium("SPD-MCM CU KAPTON$", mgr); TGeoMedium *medPlate = GetMedium("SPD C (M55J)$", mgr); TGeoMedium *medFreon = GetMedium("Freon$", mgr); TGeoMedium *medGas = GetMedium("GASEOUS FREON$", mgr); + TGeoMedium *medFibs = GetMedium("SDD OPTICFIB$",mgr); Double_t extThickness = fgkmm * 0.25; Double_t ext1Length = fgkmm * (26.7 - 10.0); @@ -2948,11 +3023,13 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, const Double_t kPlateWidth = 50.0 *fgkmm; const Double_t kPlateThickness = 5.0 *fgkmm; - const Double_t kConeTubeRmin = 5.0 *fgkmm; - const Double_t kConeTubeRmax = 6.0 *fgkmm; + const Double_t kConeTubeRmin = 2.0 *fgkmm; + const Double_t kConeTubeRmax = 3.0 *fgkmm; + + const Double_t kHorizTubeLen = 150.0 *fgkmm; + const Double_t kYtoHalfStave = 6.8 *fgkmm; - const Double_t kHorizTubeLen = 150.0 *fgkmm; //!!!TO BE CHECKED!!! - const Double_t kYtoHalfStave = 6.8 *fgkmm; //!!!TO BE CHECKED!!! + const Double_t kOptFibDiamet = 4.5 *fgkmm; Double_t x[12], y[12]; Double_t xloc, yloc, zloc; @@ -2963,6 +3040,7 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, container[0] = new TGeoVolumeAssembly("ITSSPDConeModule"); container[1] = new TGeoVolumeAssembly("ITSSPDCoolingModuleSideA"); container[2] = new TGeoVolumeAssembly("ITSSPDCoolingModuleSideC"); + container[3] = new TGeoVolumeAssembly("ITSSPDPatchPanelModule"); // The extender on the cone as a Xtru x[0] = 0.0; @@ -2993,7 +3071,7 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, shCable->DefineSection(0, 0.0); shCable->DefineSection(1, kCableThickness); - TGeoVolume *volCable = new TGeoVolume("ITSSPDExtender", shCable, medExt); + TGeoVolume *volCable = new TGeoVolume("ITSSPDExtender", shCable, medExtB); volCable->SetLineColor(kGreen); // The MCM extender on the cone as a Xtru @@ -3002,7 +3080,7 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, 0.5*kMCMThickness); TGeoVolume *volMCMExt = new TGeoVolume("ITSSPDExtenderMCM", - shMCMExt, medExt); + shMCMExt, medExtM); volMCMExt->SetLineColor(kGreen+3); // The support plate on the cone as a composite shape @@ -3079,6 +3157,18 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, shCylFr, medGas); volCylGasFr->SetLineColor(kPurple); + // The optical fibers bundle on the cone as a Tube + Double_t optLength = shCable->GetX(5) - shCable->GetX(0) + kYtoHalfStave; + TGeoTube *shOptFibs = new TGeoTube(0., 0.5*kOptFibDiamet, 0.5*optLength); + + TGeoVolume *volOptFibs = new TGeoVolume("ITSSPDOpticalFibersOnCone", + shOptFibs, medFibs); + volOptFibs->SetLineColor(kOrange); + + // The optical patch panels + TArrayD psizes; + TGeoVolume *volPatch = CreatePatchPanel(psizes, mgr); + // Now place everything in the containers volTubeA->AddNode(volGasFr, 1, 0); volTubeC->AddNode(volFreon, 1, 0); @@ -3098,6 +3188,17 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, container[0]->AddNode(volPlate, 1, new TGeoTranslation( xloc, 0., zloc)); + TGeoRotation *rot2 = new TGeoRotation(*gGeoIdentity); + rot2->SetName("rotPatch"); + rot2->RotateX(90.0); + rot2->RotateY(163.0); + //rot2->RotateZ(132.5); + + Double_t dxPatch = 2.9; + Double_t dzPatch = 2.8; + TGeoCombiTrans *tr2 = new TGeoCombiTrans(1.7*ext2Length - dxPatch, 0.0, dzPatch, rot2); + container[3]->AddNode(volPatch, 0, tr2); + xloc = shTube->GetRmax(); yloc = shTube->GetRmax(); zloc = shTube->GetDz() - shTube->GetRmax() - kYtoHalfStave; @@ -3116,11 +3217,20 @@ TList* AliITSv11GeometrySPD::CreateConeModule(const Double_t angrot, new TGeoCombiTrans(-xloc, yloc,-zloc, new TGeoRotation("",0.,angrot,0.))); + xloc = shOptFibs->GetRmax() + 2*shTube->GetRmax(); + yloc = shOptFibs->GetRmax(); + zloc = shOptFibs->GetDZ() - shTube->GetRmax() - kYtoHalfStave; + container[1]->AddNode(volOptFibs, 1, + new TGeoTranslation(-xloc, -yloc, zloc)); + container[2]->AddNode(volOptFibs, 1, + new TGeoTranslation(-xloc, -yloc, zloc)); + // Finally create the list of assemblies and return it to the caller TList* conemodulelist = new TList(); conemodulelist->Add(container[0]); conemodulelist->Add(container[1]); conemodulelist->Add(container[2]); + conemodulelist->Add(container[3]); return conemodulelist; } @@ -3140,7 +3250,7 @@ void AliITSv11GeometrySPD::CreateCones(TGeoVolume *moth) const const Double_t kInnerRadius = 80.775*fgkmm; const Double_t kZTrans = 452.000*fgkmm; const Double_t kAlphaRot = 46.500*fgkDegree; - const Double_t kAlphaSpaceCool = 8.500*fgkDegree; + const Double_t kAlphaSpaceCool = 9.500*fgkDegree; TList* modulelist = CreateConeModule(90-kAlphaRot); TGeoVolumeAssembly* module; @@ -3148,8 +3258,10 @@ void AliITSv11GeometrySPD::CreateCones(TGeoVolume *moth) const Double_t xloc, yloc, zloc; //Double_t angle[10] = {18., 54., 90., 126., 162., -18., -54., -90., -126., -162.}; - // angleNm for cone modules (cables), angleNc for cooling tubes + // anglem for cone modules (cables and cooling tubes) + // anglep for pathc panels Double_t anglem[10] = {18., 54., 90., 126., 162., 198., 234., 270., 306., 342.}; + Double_t anglep[10] = {18., 62., 90., 115., 162., 198., 242., 270., 295., 342.}; // Double_t angle1m[10] = {23., 53., 90., 127., 157., 203.0, 233.0, 270.0, 307.0, 337.0}; // Double_t angle2m[10] = {18., 53., 90., 126., 162., 198.0, 233.0, 270.0, 309.0, 342.0}; // Double_t angle1c[10] = {23., 53., 90., 124., 157., 203.0, 233.0, 270.0, 304.0, 337.0}; @@ -3192,7 +3304,7 @@ void AliITSv11GeometrySPD::CreateCones(TGeoVolume *moth) const new TGeoCombiTrans( xloc, yloc, zloc, rot1)); } - // Finally the cooling tubes on Side C + // And the cooling tubes on Side C module = (TGeoVolumeAssembly*)modulelist->At(2); for (Int_t i = 0; i < kNumberOfModules; i++) { anglec = anglem[i] - kAlphaSpaceCool; @@ -3207,6 +3319,28 @@ void AliITSv11GeometrySPD::CreateCones(TGeoVolume *moth) const new TGeoCombiTrans(-xloc,-yloc,-zloc, rot2)); } + // Finally the optical patch panels + module = (TGeoVolumeAssembly*)modulelist->At(3); + for (Int_t i = 0; i < kNumberOfModules; i++) { + TGeoRotation *rot1 = new TGeoRotation(*gGeoIdentity); + rot1->RotateY(-kAlphaRot); + rot1->RotateZ(anglep[i]); + xloc = kInnerRadius*CosD(anglep[i]); + yloc = kInnerRadius*SinD(anglep[i]); + zloc = kZTrans; + moth->AddNode(module, 2*i, + new TGeoCombiTrans( xloc, yloc, zloc, rot1)); + + TGeoRotation *rot2 = new TGeoRotation(*gGeoIdentity); + rot2->RotateY(180.-kAlphaRot); + rot2->RotateZ(anglep[i]); + xloc = kInnerRadius*CosD(anglep[i]); + yloc = kInnerRadius*SinD(anglep[i]); + zloc = kZTrans; + moth->AddNode(module, 2*i+1, + new TGeoCombiTrans(-xloc,-yloc,-zloc, rot2)); + } + } //______________________________________________________________________ diff --git a/ITS/AliITSv11GeometrySPD.h b/ITS/AliITSv11GeometrySPD.h index 9d9c407a838..7976ed04e93 100644 --- a/ITS/AliITSv11GeometrySPD.h +++ b/ITS/AliITSv11GeometrySPD.h @@ -109,6 +109,9 @@ class AliITSv11GeometrySPD : public AliITSv11Geometry // the Pixel Bus & extenders (old method which will be removed) virtual TGeoVolumeAssembly* CreatePixelBusAndExtensions(Bool_t zpos=kTRUE, TGeoManager *mgr = gGeoManager) const; + + virtual TGeoVolume* CreatePatchPanel(TArrayD &sizes, + TGeoManager *mgr = gGeoManager) const; virtual TList* CreateConeModule(const Double_t angle, TGeoManager *mgr = gGeoManager) const; diff --git a/ITS/AliITSv11Hybrid.cxx b/ITS/AliITSv11Hybrid.cxx index 359548c60b1..7d198888eb3 100644 --- a/ITS/AliITSv11Hybrid.cxx +++ b/ITS/AliITSv11Hybrid.cxx @@ -5404,6 +5404,20 @@ void AliITSv11Hybrid::CreateMaterials(){ Float_t zKapton[4]={1.,6.,7.,8.}; Float_t wKapton[4]={0.026362,0.69113,0.07327,0.209235}; Float_t dKapton = 1.42; + + // Kapton + Cu (for Pixel Bus) + + Float_t aKaptonCu[5]={1.00794, 12.0107, 14.010, 15.9994, 63.5460}; + Float_t zKaptonCu[5]={1., 6., 7., 8., 29.}; + Float_t wKaptonCuBus[5]; + + // Kapton + Cu (for Pixel MCM) + + Float_t wKaptonCuMCM[5]; + + // Kapton + Cu (mix of two above) + + Float_t wKaptonCuMix[5]; //SDD ruby sph. Float_t aAlOxide[2] = { 26.981539,15.9994}; @@ -5485,6 +5499,34 @@ void AliITSv11Hybrid::CreateMaterials(){ AliMixture(27,"GEN Air$",aAir,zAir,dAir,4,wAir); AliMedium(27,"GEN Air$",27,0,ifield,fieldm,tmaxfdAir,stemaxAir,deemaxAir,epsilAir,stminAir); + Double_t cuFrac = 0.56; + Double_t kFrac = 1.0 - cuFrac; + Double_t cuDens = 8.96; + Float_t dKaptonCuBus = cuFrac * cuDens + kFrac * dKapton; + for (Int_t j=0; j<4; j++) + wKaptonCuBus[j] = wKapton[j]*kFrac; + wKaptonCuBus[4] = cuFrac; + AliMixture(48, "SPD-BUS CU KAPTON", aKaptonCu, zKaptonCu, dKaptonCuBus, 5, wKaptonCuBus); + AliMedium(48,"SPD-BUS CU KAPTON$",48,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); + + cuFrac = 0.5; + kFrac = 1.0 - cuFrac; + Float_t dKaptonCuMCM = cuFrac * cuDens + kFrac * dKapton; + for (Int_t j=0; j<4; j++) + wKaptonCuMCM[j] = wKapton[j]*kFrac; + wKaptonCuMCM[4] = cuFrac; + AliMixture(49, "SPD-MCM CU KAPTON", aKaptonCu, zKaptonCu, dKaptonCuMCM, 5, wKaptonCuMCM); + AliMedium(49,"SPD-MCM CU KAPTON$",49,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); + + cuFrac = (0.56 + 0.5) / 2.0; + kFrac = 1.0 - cuFrac; + Float_t dKaptonCuMix = cuFrac * cuDens + kFrac * dKapton; + for (Int_t j=0; j<4; j++) + wKaptonCuMix[j] = wKapton[j]*kFrac; + wKaptonCuMix[4] = cuFrac; + AliMixture(50, "SPD-MIX CU KAPTON", aKaptonCu, zKaptonCu, dKaptonCuMix, 5, wKaptonCuMix); + AliMedium(50,"SPD-MIX CU KAPTON$",50,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); + AliMaterial(51,"SPD SI$",0.28086E+02,0.14000E+02,0.23300E+01,0.93600E+01,0.99900E+03); AliMedium(51,"SPD SI$",51,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi); -- 2.43.0