X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSv11GeometrySDD.cxx;h=f0a601053bd8eff20fc4d9cb1ddb3b2604b97c6c;hb=f9cdb612f270a574140df4a57f10497a65ea21c0;hp=9695bc0eec825f09be92df4c98475143e2034693;hpb=4adcf39069ed56ecb202c85266add9b19f6fe5fd;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSv11GeometrySDD.cxx b/ITS/AliITSv11GeometrySDD.cxx index 9695bc0eec8..f0a601053bd 100755 --- a/ITS/AliITSv11GeometrySDD.cxx +++ b/ITS/AliITSv11GeometrySDD.cxx @@ -30,6 +30,7 @@ // General Root includes +#include #include // Root Geometry includes @@ -39,24 +40,24 @@ #include #include #include +#include #include #include #include #include +#include -#include "AliITSgeom.h" -#include "AliITSgeomSDD.h" #include "AliITSv11GeometrySDD.h" #include "AliITSv11GeomCableFlat.h" #include "AliITSv11GeomCableRound.h" -const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName3 = "ITSsddSensitivL3"; -const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName4 = "ITSsddSensitivL4"; -const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.2*2*fgkmm; +const char* AliITSv11GeometrySDD::fgkSDDsensitiveVolName3 = "ITSsddSensitivL3"; +const char* AliITSv11GeometrySDD::fgkSDDsensitiveVolName4 = "ITSsddSensitivL4"; +const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.21*2*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm; -const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 3.5*fgkmm; -const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 3.*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 7.5*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 7.1*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm; @@ -98,7 +99,7 @@ const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm; const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm; const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm; const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm; -const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 2.2*fgkmm; const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm; const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm; const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm; @@ -106,8 +107,8 @@ const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm; const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm; const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm; -const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 145.*fgkmm; -const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 200.*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 129.*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 205.*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube) const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm; @@ -117,8 +118,8 @@ const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6; const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14; const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm; -const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 235.*fgkmm; -const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 286.*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 220.*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 291.*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube) const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm; const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm; @@ -133,7 +134,7 @@ const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4Det const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm; //hybrid -const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!! +const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 48.5; // approx !!! // Origine taken at the hybrid corner : const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm; const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm; @@ -159,6 +160,10 @@ const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm; const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm; const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorLen = 9.500*fgkmm; +const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorWid = 1.490*fgkcm; //??? +const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorAng = 15.0; + const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ??? const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu; @@ -464,8 +469,14 @@ const Double_t AliITSv11GeometrySDD::fgkSectionPlastPerMod = (TMath::Pi()*(3*0.3 - fgkSectionCuPerMod); const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ??? +const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672; +const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496; +const Double_t AliITSv11GeometrySDD::fgkEndLadderEarthCableR = 0.5*fgkmm; // (sections are given in cm square) const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables +const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilThick = 0.1*fgkmm; // Thickness of Al foil on hybrid side - TO BE CHECKED +const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilWide = 4.2*fgkmm; // Width of Al foil on hybrid side - from digitCableA +const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilSide = 2.0*fgkmm; // Side length of Al foil on hybrid side const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm; const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm; @@ -486,11 +497,8 @@ const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone" - - - - - +using std::endl; +using std::cout; ClassImp(AliITSv11GeometrySDD) //________________________________________________________________________ @@ -544,6 +552,14 @@ AliITSv11GeometrySDD::AliITSv11GeometrySDD(): // // Standard constructor // + fCommonVol[0] = NULL; + fCommonVol[1] = NULL; + fCommonTr[0] = NULL; + fCommonTr[1] = NULL; + for (Int_t i=0; iGetMedium(ch); if (! medium) printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName); @@ -791,9 +823,10 @@ void AliITSv11GeometrySDD::CreateBasicObjects() { TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal - TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ??????????? + TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws TGeoMedium *coolerMediumSDD = GetMedium("WATER$"); - TGeoMedium *raccordMedium = GetMedium("INOX$"); // ??? material of raccordo ??? + TGeoMedium *raccordMedium = GetMedium("INOX$"); // same as AISI 316-L + TGeoMedium *copperMedium = GetMedium("COPPER$"); //******************************************************************** // pieces of the carbon fiber structure @@ -809,11 +842,13 @@ void AliITSv11GeometrySDD::CreateBasicObjects() { Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta); //--- the top V of the Carbon Fiber Ladder (segment) - TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta, + TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape", + fgkSegmentLength/2., halfTheta, -1, fgkLadderLa, fgkLadderHa, fgkLadderl); TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1", cfLaddTop1,carbonFiberLadderStruct); - TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta, + TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape", + fgkSegmentLength/2., halfTheta, 1, fgkLadderLa, fgkLadderHa, fgkLadderl); TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2", cfLaddTop2, carbonFiberLadderStruct); @@ -822,11 +857,13 @@ void AliITSv11GeometrySDD::CreateBasicObjects() { TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0); //--- the 2 side V - TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1, + TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape", + fgkSegmentLength/2., beta, -1, fgkLadderLb, fgkLadderHb, fgkLadderl); TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1", cfLaddSide1,carbonFiberLadderStruct); - TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1, + TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape", + fgkSegmentLength/2., beta, 1, fgkLadderLb, fgkLadderHb, fgkLadderl); TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2", cfLaddSide2,carbonFiberLadderStruct); @@ -940,6 +977,14 @@ void AliITSv11GeometrySDD::CreateBasicObjects() { TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5); + // The ground wire running on the top vertex - M.S. 12 nov 2013 + TGeoTube *groundWire = new TGeoTube(0, fgkEndLadderEarthCableR, fgkSegmentLength/2); + TGeoVolume *groundWireVol = new TGeoVolume("ITSsddGroundWire", groundWire, + copperMedium); + groundWireVol->SetLineColor(41); // should be something brown-ish + TGeoTranslation *trGroundWire = new TGeoTranslation(0, + fgkLadderHeight/2-5*fgkEndLadderEarthCableR, 0); + fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1; fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1; fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR; @@ -959,6 +1004,7 @@ void AliITSv11GeometrySDD::CreateBasicObjects() { fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3; fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4; fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5; + fLaddSegCommonVol[19]= groundWireVol; fLaddSegCommonTr[19]= trGroundWire; //******************************************************************** @@ -966,7 +1012,7 @@ void AliITSv11GeometrySDD::CreateBasicObjects() { //******************************************************************** char cableName[30]; for (Int_t i=0; iAddNode(highVCard, 1, 0); -// TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 ); +// TGeoVolumeAssembly *supportRing = CreateSupportRing(); // moth->AddNode(supportRing, 1, 0); // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 ); @@ -1219,6 +1265,7 @@ void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) { TGeoVolumeAssembly *lay3Ladder = CreateLadder(3); TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3); + TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2(); //TGeoVolume *lay3Detectors = CreateDetectors(3); TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape", fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5); @@ -1240,7 +1287,7 @@ void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) { for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) { Double_t ladderPhi = -3*dPhi+iLadd*dPhi; - sprintf(rotName, "ITSsddLay3Ladd%i",iLadd); + snprintf(rotName, 30, "ITSsddLay3Ladd%i",iLadd); Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH; if (iLadd%2 != 0) minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH; @@ -1260,19 +1307,19 @@ void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) { 0, ladderPhi, kFALSE); virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd); /////////////////////////////////////////////////// - sprintf(rotName, "ITSsddLay3DetBox%i",iLadd); + snprintf(rotName, 30, "ITSsddLay3DetBox%i",iLadd); Double_t minRadiusDetBox = fgkLay3DetShortRadius; if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius; minRadiusDetBox += detectorsThick/2; TGeoCombiTrans *ctDet; + ctDet = CreateCombiTrans(rotName, minRadiusDetBox, + 0, ladderPhi, kTRUE); + if (iLadd != 2) - ctDet = CreateCombiTrans(rotName, minRadiusDetBox, - 0, ladderPhi, kTRUE); + virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet); else - ctDet = CreateCombiTrans(rotName, minRadiusDetBox, - 0, ladderPhi, kFALSE); + virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet); - virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet); /////////////////////////////////////////////////// } @@ -1467,7 +1514,7 @@ void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) { Double_t dR = 0; if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius; - sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd); + snprintf(rotName, 30, "ITSsddLay3EndLadd%i",iLadd); TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR, fgkLay3Length/2, ladderPhi, kTRUE); @@ -1526,7 +1573,7 @@ void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) { // placing virtual ladder and detectors volumes following ladder // ordering convention - char rotName[20]; + char rotName[30]; Int_t iLaddMin = 0; Int_t iLaddMax = fgkLay4Nladd; if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) { @@ -1536,7 +1583,7 @@ void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) { for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) { Double_t ladderPhi = -5*dPhi + iLadd*dPhi; - sprintf(rotName, "ITSsddLay4Ladd%i",iLadd); + snprintf(rotName, 30, "ITSsddLay4Ladd%i",iLadd); Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH; if (iLadd%2 != 0) minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH; @@ -1545,7 +1592,7 @@ void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) { 0, ladderPhi, kTRUE); virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd); /////////////////////////////////////////////////// - sprintf(rotName, "ITSsddLay4DetBox%i",iLadd); + snprintf(rotName, 30, "ITSsddLay4DetBox%i",iLadd); Double_t minRadiusDetBox = fgkLay4DetShortRadius; if (iLadd%2 != 0) minRadiusDetBox = fgkLay4DetLongRadius; @@ -1727,7 +1774,7 @@ void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) { if (iLadd%2 != 0) dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius; - sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd); + snprintf(rotName, 30, "ITSsddLay4EndLadd%i",iLadd); TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR, fgkLay4Length/2, ladderPhi, kTRUE); @@ -1783,7 +1830,7 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) { //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment); TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment); - sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment); + snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment); Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment) + fgkSegmentLength/2; TGeoTranslation *segTr = new TGeoTranslation(transName, 0, @@ -1795,7 +1842,7 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) { TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment); //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment); - sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment); + snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment); Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment) + fgkSegmentLength/2; TGeoTranslation *segTr = new TGeoTranslation(transName, 0, @@ -1855,7 +1902,7 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) { AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!! char cableHVname[30]; for (Int_t iSegment = 0; iSegmentSetVertex( 0, 0, 0); - cfLaddSide->SetVertex( 1, 0, -H); - cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)), - -L*TMath::Cos(angle)-l*TMath::Sin(angle)); - cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle)); - cfLaddSide->SetVertex( 4, 0, 0); - cfLaddSide->SetVertex( 5, 0, -H); - cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)), - -L*TMath::Cos(angle)-l*TMath::Sin(angle)); - cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle)); + cfLaddSide->SetName(name); + + // Points must be in clockwise order + cfLaddSide->SetVertex(0, 0, 0); + cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)), + -L*TMath::Cos(angle)-l*TMath::Sin(angle)); + cfLaddSide->SetVertex(4, 0, 0); + cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)), + -L*TMath::Cos(angle)-l*TMath::Sin(angle)); + if (xSign < 0) { + cfLaddSide->SetVertex(1, 0, -H); + cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle)); + cfLaddSide->SetVertex(5, 0, -H); + cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle)); + } else { + cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle)); + cfLaddSide->SetVertex(3, 0, -H); + cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle)); + cfLaddSide->SetVertex(7, 0, -H); + } return cfLaddSide; } @@ -1972,15 +2030,34 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2 - TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *niSDD = GetMedium("NICKEL$"); TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip - TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors + TGeoMedium *medSMDweld = GetMedium("SDD X7R weld$"); //**************************************************** main volume : - TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2, - (fgkHybridLength)/2); +// TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2, +// (fgkHybridLength)/2); + Double_t xhybr[6],yhybr[6]; + xhybr[0] = -fgkHybridWidth/2; + yhybr[0] = -volumeThick/2; + xhybr[1] = fgkHybridWidth/2; + yhybr[1] = -volumeThick/2; + xhybr[2] = fgkHybridWidth/2; + yhybr[2] = volumeThick/2; + xhybr[3] = -fgkHybridWidth/2; + yhybr[3] = volumeThick/2; + xhybr[4] = xhybr[3] - 1.05*fgkHybCC2SensorLen*SinD(fgkHybCC2SensorAng); + yhybr[4] = yhybr[3] - 1.05*fgkHybCC2SensorLen*CosD(fgkHybCC2SensorAng); + xhybr[5] = xhybr[4]; + yhybr[5] = yhybr[4] - volumeThick; + + TGeoXtru *hybridBox = new TGeoXtru(2); + hybridBox->DefinePolygon(6, xhybr, yhybr); + hybridBox->DefineSection(0,-fgkHybridLength/2); + hybridBox->DefineSection(1, fgkHybridLength/2); + TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox, airSDD); @@ -2090,7 +2167,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2, fgkHybAlThick/2, sideWidth2/2); - TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0, + TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0, lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2, (fgkHybridLength-sideWidth2)/2); TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0, @@ -2171,7 +2248,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { Double_t vX[3] = {1,0,0}; for (Int_t i=0; i<3; i++) { char ch[20]; - sprintf(ch, "lowFLpieceA%i", i+4); + snprintf(ch, 20, "lowFLpieceA%i", i+4); lowFLpiece.SetName(ch); lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ); @@ -2185,7 +2262,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { lowFLpiece.CreateAndInsertBoxCableSegment(1,90); lowFLpiece.ResetPoints(); - sprintf(ch, "lowFLpieceB%i", i+4); + snprintf(ch, 20, "lowFLpieceB%i", i+4); lowFLpiece.SetName(ch); x1[0] = fgkHybridWidth/2 - piece3width; x2[0] = x1[0] - fgkHybFLlowHoleAmbDX; @@ -2212,7 +2289,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { char ch[20]; for (Int_t i=0; i<4; i++) { - sprintf(ch, "pascalCC%i", i); + snprintf(ch, 20, "pascalCC%i", i); chip.SetName(ch); x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2; x2[0] = x1[0] + fgkHybPascalDX; @@ -2223,7 +2300,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { chip.CreateAndInsertBoxCableSegment(1,-90); chip.ResetPoints(); - sprintf(ch, "ambraCC%i", i); + snprintf(ch, 20, "ambraCC%i", i); chip.SetName(ch); x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2; x2[0] = x1[0] + fgkHybAmbraDX; @@ -2236,7 +2313,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { //**************************************************** CC outside chips: // I don't think there is a second aluminium layer here ... for (Int_t i = 0; i<4; i++) { - sprintf(ch, "ccLayerA%i", i); + snprintf(ch, 20, "ccLayerA%i", i); AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick); ccLayer1.SetInitialNode(hybrid); @@ -2256,7 +2333,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { ccLayer1.AddCheckPoint( hybrid, 1, x2, vX ); ccLayer1.CreateAndInsertBoxCableSegment(1,-90); - sprintf(ch, "ccLayerB%i", i); + snprintf(ch, 20, "ccLayerB%i", i); AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick); ccLayer2.SetInitialNode(hybrid); ccLayer2.SetNLayers(2); @@ -2270,7 +2347,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { ccLayer2.AddCheckPoint( hybrid, 1, x2, vX ); ccLayer2.CreateAndInsertBoxCableSegment(1,-90); ccLayer2.ResetPoints(); - sprintf(ch, "ccLayerC%i", i); + snprintf(ch, 20, "ccLayerC%i", i); ccLayer2.SetName(ch); x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2; x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm; @@ -2281,6 +2358,54 @@ TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) { ccLayer2.AddCheckPoint( hybrid, 0, x1, vX ); ccLayer2.AddCheckPoint( hybrid, 1, x2, vX ); ccLayer2.CreateAndInsertBoxCableSegment(1,-90); + + //**************************************************** CC to sensors: + // (alas, we cannot use GeomCableFlat here because section is not constant) + Double_t xcc[8],ycc[8]; + xcc[0] = -0.5*ccLayer1.GetWidth(); + ycc[0] = 0; + xcc[1] = 0.5*ccLayer1.GetWidth(); + ycc[1] = 0; + xcc[2] = xcc[1]; + ycc[2] = -fgkHybCC2SensorLen*0.8; + xcc[3] = xcc[2] + 0.1*fgkHybCC2SensorWid; + ycc[3] = ycc[2]; + xcc[4] = xcc[3]; + ycc[4] = -fgkHybCC2SensorLen; + xcc[5] = xcc[4] - fgkHybCC2SensorWid; + ycc[5] = ycc[4]; + xcc[6] = xcc[5]; + ycc[6] = 0.8*ycc[5]; + xcc[7] = xcc[0]; + ycc[7] = 0.2*ycc[5]; + + TGeoXtru* ccToSensPoliSh = new TGeoXtru(2); + ccToSensPoliSh->DefinePolygon(8, xcc, ycc); + ccToSensPoliSh->DefineSection(0, 0.); + ccToSensPoliSh->DefineSection(1, ccLayer1.GetThickness()); + + snprintf(ch, 20, "ccToSens%i", i); + TGeoVolume* ccToSensPoliVol = new TGeoVolume(ch, ccToSensPoliSh, polyhamideSDD); + ccToSensPoliVol->SetLineColor(fColorPolyhamide); + + TGeoXtru* ccToSensAlSh = new TGeoXtru(2); + xcc[6] += 0.001; + ycc[7] -= 0.001; + ccToSensAlSh->DefinePolygon(8, xcc, ycc); + ccToSensAlSh->DefineSection(0, 0.); + ccToSensAlSh->DefineSection(1, fgkHybAlCCThick); + + snprintf(ch, 20, "ccToSensAl%i", i); + TGeoVolume* ccToSensAlVol = new TGeoVolume(ch, ccToSensAlSh, alSDD50p100); + ccToSensAlVol->SetLineColor(fColorAl); + + ccToSensPoliVol->AddNode(ccToSensAlVol, 1, 0); + + Double_t coord[3]; + ccLayer1.GetPoint(0,coord); + hybrid->AddNode(ccToSensPoliVol, i+1, + new TGeoCombiTrans(coord[0], coord[1], coord[2], + new TGeoRotation("",-90-fgkHybCC2SensorAng, 90, 90))); }; //**************************************************** FL UP: @@ -2381,6 +2506,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) { TGeoMedium *phynoxSDD = GetMedium("INOX$"); TGeoMedium *coolerMediumSDD = GetMedium("WATER$"); TGeoMedium *airSDD = GetMedium("SDD AIR$"); + TGeoMedium *alSDD = GetMedium("AL$"); Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder Double_t segmentLength = fgkSegmentLength; @@ -2444,11 +2570,37 @@ TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) { //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment"); - TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox", - fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW, - fgkLadderHeight/2+fgkLadderSegBoxDH/2, - segmentLength/2); - +// TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox", +// fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW, +// fgkLadderHeight/2+fgkLadderSegBoxDH/2, +// segmentLength/2); + // A shaped Xtru instead of a simple BBox to avoid overlaps and extrusions + TGeoXtru *segBox = new TGeoXtru(2); + segBox->SetName("ITSsddSegBox"); + + Double_t xseg[12],yseg[12]; + xseg[ 0] = -(fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW); + yseg[ 0] = fgkLadderHeight/2+fgkLadderSegBoxDH/2; + xseg[ 1] = xseg[0]; + yseg[ 1] = -yseg[0]; + xseg[ 2] = 0.87*xseg[1]; + yseg[ 2] = yseg[1]; + xseg[ 3] = 0.77*xseg[1]; + yseg[ 3] = -yseg[0] - 0.62*fgkHybCC2SensorLen; + xseg[ 4] = 0.72*xseg[1]; + yseg[ 4] = yseg[3]; + xseg[ 5] = 0.83*xseg[1]; + yseg[ 5] = yseg[1]; + + for (Int_t j=0; j<6; j++) { + xseg[6+j] = -xseg[5-j]; + yseg[6+j] = yseg[5-j]; + } + + segBox->DefinePolygon(12, xseg, yseg); + segBox->DefineSection(0,-segmentLength/2); + segBox->DefineSection(1, segmentLength/2); + TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment", segBox, airSDD); virtualSeg->SetVisibility(kFALSE); @@ -2531,7 +2683,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) { virtualSeg->AddNode(fPinSupport, 7, transPS7); virtualSeg->AddNode(fPinSupport, 8, transPS8); - TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ??? + TGeoMedium *pinMed = GetMedium("RYTON$"); Double_t fgkPinHeight = 4.5*fgkmm; TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR, fgkPinHeight/2.); @@ -2659,7 +2811,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) { //************************* // the 2 hybrids : //************************* - Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY(); + Double_t hybDy = ((TGeoXtru*)fHybrid->GetShape())->GetY(2); Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy; Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle) @@ -2683,8 +2835,8 @@ TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) { //*********** if (fAddCables) { // Starting from this segment - Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ(); - Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX(); + Double_t hybDz = ((TGeoXtru*)fHybrid->GetShape())->GetZ(1); + Double_t hybDx = ((TGeoXtru*)fHybrid->GetShape())->GetX(1); Double_t posDigitCableAlongHyb = shiftHyb+ hybDx - digitCableA->GetWidth()/2; Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy @@ -2729,6 +2881,46 @@ TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) { digitCableB[iCable].GetPoint( 1, coord); digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ); }; + + // Now the small Al foil on the same hybrid side + Double_t xfoil[5],yfoil[5]; + hybDx *= 0.95; + xfoil[0] = -fgkHybridAlFoilWide/2; + yfoil[0] = hybDx; + xfoil[1] = fgkHybridAlFoilWide/2; + yfoil[1] = yfoil[0]; + xfoil[2] = xfoil[1]; + yfoil[2] = -hybDx + (fgkHybridAlFoilWide - fgkHybridAlFoilSide); + xfoil[3] = xfoil[0] + fgkHybridAlFoilSide; + yfoil[3] = -hybDx; + xfoil[4] = xfoil[0]; + yfoil[4] = yfoil[3]; + + TGeoXtru* alFoilSh = new TGeoXtru(2); + alFoilSh->DefinePolygon(5, xfoil, yfoil); + alFoilSh->DefineSection(0,-fgkHybridAlFoilThick/2); + alFoilSh->DefineSection(1, fgkHybridAlFoilThick/2); + + TGeoVolume* alFoilVol = new TGeoVolume("ITSsddAlFoilHybSide", alFoilSh, alSDD); + alFoilVol->SetLineColor(fColorAl); + + Double_t zFoilTrans = cableSideSign*(hybDz + alFoilSh->GetX(1)); + TGeoRotation rotFoil3; + TGeoRotation rotFoil4; + if (cableSideSign > 0) { + rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, -90, -90); + rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, 90, 90); + } else { + rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, 90, -90); + rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, -90, 90); + } + TGeoCombiTrans *foiTr1 = new TGeoCombiTrans(*pipeTr2, rotFoil3); + TGeoCombiTrans *foiTr2 = new TGeoCombiTrans(*pipeTr1, rotFoil4); + AddTranslationToCombiTrans( foiTr1, -hybrVolX, hybrVolY, zFoilTrans); + AddTranslationToCombiTrans( foiTr2, hybrVolX, hybrVolY, zFoilTrans); + + virtualSeg->AddNode(alFoilVol, 1, foiTr1); + virtualSeg->AddNode(alFoilVol, 2, foiTr2); }; //********************************** @@ -2743,7 +2935,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() { // Create a pine support and its pine // axis of rotation is the cone axis, center in its middle // - TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? + TGeoMedium *rytonSDD = GetMedium("RYTON$"); TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2., 0,fgkPinSuppRmax,0,fgkPinSuppRmax- @@ -2784,19 +2976,19 @@ TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() { Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle); TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.); + side1->SetName("ITSsddCPSside1"); side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.); - side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX, - -fgkCoolPipeSuppWidthExt/2.); + side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.); side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX, fgkCoolPipeSuppWidthExt/2.); - side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.); - side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.); - side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2., + side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX, -fgkCoolPipeSuppWidthExt/2.); + side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.); + side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.); side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2., fgkCoolPipeSuppWidthExt/2.); - side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.); - side1->SetName("ITSsddCPSside1"); + side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2., + -fgkCoolPipeSuppWidthExt/2.); TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0, - fgkCoolPipeSuppAxeDist @@ -2846,7 +3038,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() { axe->InspectShape(); }; - TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *rytonSDD = GetMedium("RYTON$"); TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape( "ITSsddCoolPipeSuppShapeL", @@ -2873,6 +3065,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() { Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle); TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.); + side1->SetName("ITSsddCPSside1R"); side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.); side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX), -fgkCoolPipeSuppWidthExt/2.); @@ -2885,7 +3078,6 @@ TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() { side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2., fgkCoolPipeSuppWidthExt/2.); side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.); - side1->SetName("ITSsddCPSside1R"); TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0, - fgkCoolPipeSuppAxeDist @@ -2946,7 +3138,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() { "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR" "-ITSsddCPSaxeR:ITSsddCPSaxeTrR"); - TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *rytonSDD = GetMedium("RYTON$"); TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR", coolPipeSuppShape, rytonSDD); coolPipeSupp->SetLineColor(fColorRyton); @@ -3103,12 +3295,14 @@ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) { //--- The 3 V shape corners of the Carbon Fiber Ladder //--- the top V - TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1, + TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape", + topCornerLength/2., halfTheta, -1, fgkLadderLa, fgkLadderHa, fgkLadderl); - TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1", + TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1", cfLaddTop1,carbonFiberLadderStruct); cfLaddTopVol1->SetLineColor(fColorCarbonFiber); - TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1, + TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape", + topCornerLength/2., halfTheta, 1, fgkLadderLa, fgkLadderHa, fgkLadderl); TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2", cfLaddTop2,carbonFiberLadderStruct); @@ -3119,12 +3313,14 @@ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) { virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1); //--- the 2 side V - TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1, + TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape", + length/2., beta, -1, fgkLadderLb, fgkLadderHb, fgkLadderl); TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1", cfLaddSide1,carbonFiberLadderStruct); cfLaddSideVol1->SetLineColor(fColorCarbonFiber); - TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1, + TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape", + length/2., beta, 1, fgkLadderLb, fgkLadderHb, fgkLadderl); TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2", cfLaddSide2,carbonFiberLadderStruct); @@ -3430,12 +3626,12 @@ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) { // (void) iLay; - TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2 TGeoMedium *copper = GetMedium("COPPER$"); - TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ??????????? + TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12 + TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws //========================================= // cooling support of the Carlos card (HeatBridge): @@ -3515,23 +3711,23 @@ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) { Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) + bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07; - TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0]; + TGeoRotation *carlosSuppRot = (TGeoRotation *)fCommonTr[0]; TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+ fgkCarlosSuppX2+fgkCarlosSuppX3)/2, - screw1y,screw1z, CarlosSuppRot); + screw1y,screw1z, carlosSuppRot); TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+ fgkCarlosSuppX2+fgkCarlosSuppX3)/2, - screw1z,screw1y, CarlosSuppRot); + screw1z,screw1y, carlosSuppRot); TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+ fgkCarlosSuppX2+fgkCarlosSuppX3)/2, - screw1y,screw1z, CarlosSuppRot); + screw1y,screw1z, carlosSuppRot); TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+ fgkCarlosSuppX2+fgkCarlosSuppX3)/2, - screw1z,screw1y, CarlosSuppRot); + screw1z,screw1y, carlosSuppRot); assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1); assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2); @@ -3718,12 +3914,12 @@ Int_t AliITSv11GeometrySDD::CreateLVCard() { // Creates the assemblies containing the LV cards (left and right) // - TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2 TGeoMedium *copper = GetMedium("COPPER$"); - TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ??????????? + TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12 + TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft"); fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight"); @@ -3956,18 +4152,17 @@ Int_t AliITSv11GeometrySDD::CreateLVCard() { } //________________________________________________________________________ -TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){ +TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(){ // // return an assembly containing the HV card // - iLay = iLay; TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard - TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // check if different + TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // check if different TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ??????????? TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ??????????? - TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard"); @@ -4238,7 +4433,6 @@ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){ return highVCard; } - //________________________________________________________________________ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) { // @@ -4246,7 +4440,7 @@ TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) { // and their cooling system // - TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!! + TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12 TGeoMedium *phynoxSDD = GetMedium("INOX$"); TGeoMedium *coolerMediumSDD = GetMedium("WATER$"); @@ -4445,18 +4639,20 @@ TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) { // This is the code actually used for the end ladder cards // - TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!! + TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12 TGeoMedium *phynoxSDD = GetMedium("INOX$"); TGeoMedium *coolerMediumSDD = GetMedium("WATER$"); TGeoMedium *copper = GetMedium("COPPER$"); TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ??? TGeoMedium *airSDD = GetMedium("SDD AIR$"); - TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$"); + TGeoMedium *polyurethane = GetMedium("POLYURETHANE$"); Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3; Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3; Int_t nCards = 3; Double_t rREF = fgkEndLaddCardsShortRadiusLay3; + Double_t deltaZcables = 0; // reference radius corresponding to local y=0 if (iLay==4) { @@ -4464,6 +4660,7 @@ TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) { endLadPipeArmZ = fgkEndLadPipeArmZLay4; nCards = 4; rREF = fgkEndLaddCardsShortRadiusLay4; + deltaZcables = 2.8*fgkmm; } Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2 @@ -4508,10 +4705,10 @@ TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) { // are escaping... Double_t cableSectionR1 = cablesRadius-thickTotCable/2; Double_t cableSectionR2 = rMax; - Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm; - Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm; - // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone - // (I'm waiting for the new cone) + Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables; + Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables; + // Those numbers are to be fixed to stick the maximum to the SDD cone + // (hardcoded numbers are ugly, but it's easier to find where to stop) containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax); containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax); @@ -4690,20 +4887,29 @@ TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) { Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod - + fgkSectionGlassPerMod)*nCards; + + fgkSectionGlassPerMod)*nCards + + fgkSectionCoolPolyuEL + fgkSectionCoolWaterEL; // We fix thickness, then width is calculated accordingly - Double_t width = sectionV/thickTotCable; + Double_t width = sectionV/thickTotCable; Double_t thickCu = thickTotCable*fgkSectionCuPerMod - / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod); + / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL); Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod - / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod); - Double_t thickGlass = thickTotCable - thickCu - thickPlast; + / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL); + Double_t thickGlass = thickTotCable*fgkSectionGlassPerMod + / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL); + + Double_t thickCoolPolyu = thickTotCable*fgkSectionCoolPolyuEL + / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL); + Double_t thickCoolWater = thickTotCable*fgkSectionCoolWaterEL + / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL); AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable); - cable.SetNLayers(3); + cable.SetNLayers(5); cable.SetLayer(0, thickCu, copper, kRed); cable.SetLayer(1, thickPlast, plastic, kYellow); cable.SetLayer(2, thickGlass, opticalFiber, kGreen); + cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray); + cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue); Double_t zVect[3]={0,0,1}; Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3 @@ -4720,17 +4926,27 @@ TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) { cable.SetInitialNode(endLadderCards); cable.CreateAndInsertCableSegment(1); + // The earth cable + TGeoTorus *earthShape = new TGeoTorus(rMax-fgkEndLadderEarthCableR, + 0., fgkEndLadderEarthCableR, + phi0, dphi); // same as containerShape + + TGeoVolume *earthCable = new TGeoVolume("SDDcableEndLadderEarthCable", + earthShape, copper); + + endLadderCards->AddNode(earthCable, 1, + new TGeoTranslation(0, 0, fgkDistEndLaddCardsLadd+1)); + return endLadderCards; } //________________________________________________________________________ -TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) { +TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing() { // // return an assembly of the support rings, attaching the ladders to the cone // - iLay = iLay; TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing"); @@ -4836,7 +5052,7 @@ void AliITSv11GeometrySDD::CreateSDDsensor() { TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi TGeoMedium *alSDD = GetMedium("AL$"); // ITSal TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2 - TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + TGeoMedium *glassSDD = GetMedium("STDGLASS$"); // StdGlass Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick; @@ -4874,7 +5090,7 @@ void AliITSv11GeometrySDD::CreateSDDsensor() { wafer3->SetLineColor(fColorSilicon); TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3", fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2); - TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens); + TGeoVolume *sensVol3 = new TGeoVolume(fgkSDDsensitiveVolName3,sensBox3, siliconSDDsens); sensVol3->SetLineColor(fColorSilicon+5); wafer3->AddNode(sensVol3, 1, 0); fSDDsensor3->AddNode(wafer3, 1, 0); @@ -4883,7 +5099,7 @@ void AliITSv11GeometrySDD::CreateSDDsensor() { wafer4->SetLineColor(fColorSilicon); TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4", fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2); - TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens); + TGeoVolume *sensVol4 = new TGeoVolume(fgkSDDsensitiveVolName4,sensBox4, siliconSDDsens); sensVol4->SetLineColor(fColorSilicon+5); wafer4->AddNode(sensVol4, 1, 0); fSDDsensor4->AddNode(wafer4, 1, 0); @@ -5225,14 +5441,14 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) { // Int_t nDetectors = fgkLay3Ndet; - Double_t ladderLength = fgkLay3LadderLength; + // Double_t ladderLength = fgkLay3LadderLength; Double_t *sensorZPos = fLay3sensorZPos; TGeoVolume *sensorSDD = fSDDsensor3; if (iLay==3) {} else if (iLay==4) { nDetectors = fgkLay4Ndet; - ladderLength = fgkLay4LadderLength; + // ladderLength = fgkLay4LadderLength; sensorZPos = fLay4sensorZPos; sensorSDD = fSDDsensor4; } else { @@ -5240,7 +5456,7 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) { }; char name[30]; - sprintf(name,"ITSsddDetBox%i",iLay); + snprintf(name,30,"ITSsddDetBox%i",iLay); TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd"); @@ -5249,7 +5465,7 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) { Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2; if (iLay==3) if (i%2!=0) localY = -localY; if (iLay==4) if (i%2==0) localY = -localY; - sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i); + snprintf(name, 30, "ITSsddLay%iSensorPos%i",iLay, i); if (i >= nDetectors/2) { TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ); @@ -5271,121 +5487,45 @@ TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) { //________________________________________________________________________ -Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD, - Int_t startMod) { +TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() { // -// export the geometry in a AliITSgeom object -// Obsolete +// return a box volume containing the detectors +// Special case for Layer 3 Ladder 2 which is rotated (cannot simply +// rotate the standard volume, because the module numbering would be wrong) +// M.Sitta 25 Nov 2009 // + + Int_t nDetectors = fgkLay3Ndet; + Double_t *sensorZPos = fLay3sensorZPos; + TGeoVolume *sensorSDD = fSDDsensor3; - if (! geom) { - printf("error:Try to fill null (AliITSgeom *) object"); - return kFALSE; - }; - if (! fMotherVol) { - printf("error:Try to set sensor geometry while geometry is not defined\n"); - return kFALSE; - }; - - const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2., - fgkWaferLengthSens/2.}; - if(!(geom->IsShapeDefined(kSDD))) - geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz)); - - char layerName[30]; - char ladderName[30]; - char sensorName[30]; - char senstivName[30]; - const Int_t kNLay = 2; - const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd}; - const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet}; - - if (GetDebug(1)) - printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n"); - - Int_t firstSDDmod = startMod; - for (Int_t iLay=0; iLayGetNode(layerName); - if (layNode) { - if (GetDebug(1)) printf("%s\n",layNode->GetName()); - TGeoVolume *layVolume = layNode->GetVolume(); - TGeoHMatrix layMatrix(*layNode->GetMatrix()); - - for (Int_t iLadd=0; iLaddGetNode(ladderName); - if (laddNode) { - if (GetDebug(1)) printf("| %s\n",laddNode->GetName()); - TGeoVolume *laddVolume = laddNode->GetVolume(); - TGeoHMatrix laddMatrix(layMatrix); - laddMatrix.Multiply(laddNode->GetMatrix()); - - for (Int_t iDet=0; iDetGetNode(sensorName); - if (detNode) { - if (GetDebug(1)) printf("| | %s\n",detNode->GetName()); - TGeoVolume *detVolume = detNode->GetVolume(); - TGeoHMatrix detMatrix(laddMatrix); - detMatrix.Multiply(detNode->GetMatrix()); - - TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1"); - if (wafNode) { - TGeoVolume *wafVolume = wafNode->GetVolume(); - TGeoHMatrix wafMatrix(detMatrix); - detMatrix.Multiply(wafNode->GetMatrix()); - //-------------------------------------------------------- - sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1"); - TGeoNode *sensitivNode = wafVolume->GetNode(senstivName); - if (sensitivNode) { - TGeoHMatrix sensMatrix(wafMatrix); - sensMatrix.Multiply(sensitivNode->GetMatrix()); - - // Sticking to the convention for local wafer coordinate - // in AliITSgeom : - if (iDet >= kNDet[iLay]/2) { - // TGeoRotation rotY("",0,180,0); - TGeoRotation rotY("",-180,-180,0); - sensMatrix.Multiply(&rotY); - }; - // Creating the matrix in AliITSgeom for - // this sensitive volume : - Double_t *trans = sensMatrix.GetTranslation(); - Double_t *r = sensMatrix.GetRotationMatrix(); - Double_t rot[10] = {r[0],r[1],r[2], - r[3],r[4],r[5], - r[6],r[7],r[8], 1.0}; - //rot[9]!=0.0 => not a unity matrix - geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1, - kSDD,trans,rot); - // iLadd+1, iDet+1 because ladd. and det. start at +1 - // elsewhere - startMod++; - - } else - printf("Error (ExportSensorGeometry) %s not found !\n", - senstivName); - } else - printf("Error (ExportSensorGeometry) %s not found !\n", - "ITSsddWafer_1"); - } else - printf("Error (ExportSensorGeometry) %s not found !\n", - sensorName); - }; - } else - printf("Error (ExportSensorGeometry) %s not found !\n", - ladderName); - }; - } else - printf("Error (ExportSensorGeometry) %s not found !\n", - layerName); - }; + char name[30]; + snprintf(name,30,"ITSsddDetBoxLadd2"); + + TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd"); - return (startMod-firstSDDmod); + for (Int_t i=0; i= nDetectors/2) { + TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ); + sensorPos->SetName(name); + virtualDet->AddNode(sensorSDD, i, sensorPos); + } + else { + TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180); + TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY, + localZ, rotSensor); + sensorPos->SetName(name); + virtualDet->AddNode(sensorSDD, i, sensorPos); + }; + } + + if(GetDebug(1)) virtualDet->CheckOverlaps(0.01); + return virtualDet; } @@ -5411,7 +5551,7 @@ GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const { // Get the layer index : if (node->GetNdaughters()==fgkLay3Ndet) - lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!! + lay = 3; else lay = 4; return kTRUE; @@ -5459,7 +5599,7 @@ TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t //________________________________________________________________________ Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2, - Double_t refZ1, Double_t refZ2) { + Double_t refZ1, Double_t refZ2) const { // just a helping function return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1); } @@ -5478,7 +5618,7 @@ Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Doub TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$"); char titleCable[30]; - sprintf(titleCable,"cableSDDport%i",(Int_t)angle); + snprintf(titleCable,30,"cableSDDport%i",(Int_t)angle); //--- Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4); @@ -5814,17 +5954,19 @@ void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth) // cables that are grouped at the end of SSD cones //================================== - Double_t fgkSDDCableR6 = fgkSDDCableR5+9; - Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8; +// Double_t fgkSDDCableR6 = fgkSDDCableR5+9; +// Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8; + Double_t fgkSDDCableR6 = fgkSDDCableR5+8; + Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8; TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable"); // Add some hardcoded shifts to avoid overlaps with SSD pathc panels - CreateAndInsetConeCablePart(endConeSDDCable, 40, 1*3,2*4, fgkSDDCableR5, - fgkSDDCableZ5,fgkSDDCableR6+0.7,fgkSDDCableZ6); + CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5, + fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6); - CreateAndInsetConeCablePart(endConeSDDCable, 60, 1*3,1*4, fgkSDDCableR5, - fgkSDDCableZ5,fgkSDDCableR6+0.6,fgkSDDCableZ6); + CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5, + fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); @@ -5832,29 +5974,29 @@ void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth) CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); - CreateAndInsetConeCablePart(endConeSDDCable, 110, 2*3,3*4, fgkSDDCableR5, - fgkSDDCableZ5,fgkSDDCableR6+0.9,fgkSDDCableZ6); + CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5, + fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6); - CreateAndInsetConeCablePart(endConeSDDCable, 146, 0*3,3*4, fgkSDDCableR5, - fgkSDDCableZ5,fgkSDDCableR6+0.7,fgkSDDCableZ6); + CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5, + fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); - CreateAndInsetConeCablePart(endConeSDDCable, 176.1, 0*3,1*4, fgkSDDCableR5, + CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); - CreateAndInsetConeCablePart(endConeSDDCable, 220, 1*3,2*4, fgkSDDCableR5, - fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); + CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5, + fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6); - CreateAndInsetConeCablePart(endConeSDDCable, 240, 1*3,2*4, fgkSDDCableR5, + CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); - CreateAndInsetConeCablePart(endConeSDDCable, 290.1, 2*3,2*4, fgkSDDCableR5, + CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); - CreateAndInsetConeCablePart(endConeSDDCable, 315, 1*3,1*4, fgkSDDCableR5, - fgkSDDCableZ5,fgkSDDCableR6+0.6,fgkSDDCableZ6); + CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5, + fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6); CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5, fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);