]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSv11GeometrySupport.cxx
speed up tailcancallation (Theo)
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySupport.cxx
index 470bbb5dcd1ca1bfb4648ec0335f6d03c4affcdd..cd65af0bdfafc4526ff47e660d8ccb2f33f6c0c7 100644 (file)
@@ -789,6 +789,7 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
 // Created:         ???       Bjorn S. Nilsen
 // Updated:      18 Feb 2008  Mario Sitta
 // Updated:      25 Jul 2008  Mario Sitta   SDDCarbonFiberCone simpler
+// Updated:      10 Jun 2010  Mario Sitta   Cables across cone holes added
 //
 // Technical data are taken from:  "Supporto Generale Settore SDD"
 // (technical drawings ALR-0816/1-B), "Supporto Globale Settore SDD"
@@ -829,7 +830,7 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   const Double_t kTanConeTheta       =
                                      TMath::Tan(kConeTheta*TMath::DegToRad());
   // Dimensions of the Cone Inserts
-  const Double_t kConeCFThickness       = 1.5*fgkmm; // Carbon fiber thickness
+  const Double_t kConeCFThickness    =       1.5*fgkmm;//Carbon fiber thickness
   // Dimensions of the Cone Holes
   const Double_t kHole1RMin          = (450.0/2)*fgkmm;
   const Double_t kHole1RMax          = (530.0/2)*fgkmm;
@@ -845,17 +846,24 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   const Double_t kHole4DeltaR        =        15*fgkmm;
   const Double_t kHole4Width         =        30*fgkmm;
   //  const Int_t    kNHole4             =         3      ;
+  // Fraction of materials in holes
+  const Double_t kHolePlasticFrac    =       0.55846;
+  const Double_t kHoleCuFrac         =       0.06319;
+  const Double_t kHoleGlassFrac      =       0.02652;
 
   // Local variables
   Double_t x, y, z, t, dza, rmin, rmax;
 
 
   // Recover the needed materials
-  TGeoMedium *medSDDcf  = mgr->GetMedium("ITS_SDD C (M55J)$");
-  TGeoMedium *medSDDair = mgr->GetMedium("ITS_SDD AIR$");
-  TGeoMedium *medSDDste = mgr->GetMedium("ITS_G10FR4$"); // stesalite
-  TGeoMedium *medSDDroh = mgr->GetMedium("ITS_ROHACELL$");
-  TGeoMedium *medSDDss  = mgr->GetMedium("ITS_INOX$");
+  TGeoMedium *medSDDcf    = mgr->GetMedium("ITS_SDD C (M55J)$");
+  TGeoMedium *medSDDair   = mgr->GetMedium("ITS_SDD AIR$");
+  TGeoMedium *medSDDste   = mgr->GetMedium("ITS_G10FR4$"); // stesalite
+  TGeoMedium *medSDDroh   = mgr->GetMedium("ITS_ROHACELL$");
+  TGeoMedium *medSDDss    = mgr->GetMedium("ITS_INOX$");
+  TGeoMedium *medSDDplast = mgr->GetMedium("ITS_SDDKAPTON (POLYCH2)$");
+  TGeoMedium *medSDDCu    = mgr->GetMedium("ITS_COPPER$");
+  TGeoMedium *medSDDglass = mgr->GetMedium("ITS_SDD OPTICFIB$");
 
   // First define the geometrical shapes
 
@@ -919,8 +927,8 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   // Mount up the cylinder
   for(Int_t i=0; i<kNBolts; i++){
     t = kThetaBolt*i;
-    x = kBoltRadius*TMath::Cos(t);
-    y = kBoltRadius*TMath::Sin(t);
+    x = kBoltRadius*CosD(t);
+    y = kBoltRadius*SinD(t);
     z = kFlangeHalfLength-kBoltDepth;
     flangecylinder->AddNode(bolt, i+1, new TGeoTranslation("",x,y,z));
   }
@@ -1358,6 +1366,143 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   hole4shape->Z(3)    = ZFromRmaxpCone(coneshape,4,kConeTheta,
                                       hole4shape->GetRmax(3));
 
+  // Cables to be put inside the holes: Pcon's
+  // (fractions are manually computed from AliITSv11GeometrySDD::SDDCables
+  TGeoPcon *hole1plastshape = new TGeoPcon(-kHole1Phi/2., kHole1Phi, 4);
+
+  hole1plastshape->Rmin(0) = hole1shape->GetRmin(0);
+  hole1plastshape->Rmax(0) = hole1shape->GetRmax(0);
+  hole1plastshape->Z(0)    = hole1shape->GetZ(0);
+
+  hole1plastshape->Rmin(1) = hole1shape->GetRmin(1);
+  hole1plastshape->Rmax(1) = hole1shape->GetRmax(1);
+  hole1plastshape->Z(1)    = hole1shape->GetZ(1);
+
+  dza = hole1plastshape->GetRmax(0) - (kHole1RMax-kHole1RMin)*kHolePlasticFrac;
+
+  hole1plastshape->Rmin(2) = dza;
+  hole1plastshape->Z(2)    = ZFromRminpCone(conefoamshape,1,kConeTheta,
+                                           hole1plastshape->GetRmin(2));
+  hole1plastshape->Rmax(2) = RmaxFromZpCone(conefoamshape,3,kConeTheta,
+                                           hole1plastshape->GetZ(2));
+
+  hole1plastshape->Rmin(3) = hole1plastshape->GetRmin(2);
+  hole1plastshape->Rmax(3) = hole1plastshape->GetRmin(3);
+  hole1plastshape->Z(3)    = ZFromRmaxpCone(conefoamshape,3,kConeTheta,
+                                           hole1plastshape->GetRmax(3));
+
+  TGeoPcon *hole1Cushape = new TGeoPcon(-kHole1Phi/2., kHole1Phi, 4);
+
+  hole1Cushape->Rmin(0) = hole1plastshape->GetRmin(2);
+  hole1Cushape->Rmax(0) = hole1Cushape->GetRmin(0);
+  hole1Cushape->Z(0)    = hole1plastshape->GetZ(2);
+
+  dza = hole1Cushape->GetRmax(0) - (kHole1RMax-kHole1RMin)*kHoleCuFrac;
+
+  hole1Cushape->Rmin(1) = dza;
+  hole1Cushape->Rmax(1) = hole1Cushape->GetRmax(0);
+  hole1Cushape->Z(1)    = ZFromRminpCone(conefoamshape,1,kConeTheta,
+                                        hole1Cushape->GetRmin(1));
+
+  hole1Cushape->Rmax(2) = hole1Cushape->GetRmax(0);
+  hole1Cushape->Rmin(2) = hole1Cushape->GetRmin(1);
+  hole1Cushape->Z(2)    = hole1plastshape->GetZ(3);
+
+  hole1Cushape->Rmin(3) = hole1Cushape->GetRmin(1);
+  hole1Cushape->Rmax(3) = hole1Cushape->GetRmin(3);
+  hole1Cushape->Z(3)    = ZFromRmaxpCone(conefoamshape,3,kConeTheta,
+                                        hole1Cushape->GetRmax(3));
+
+  TGeoPcon *hole1glassshape = new TGeoPcon(-kHole1Phi/2., kHole1Phi, 4);
+
+  hole1glassshape->Rmin(0) = hole1Cushape->GetRmin(1);
+  hole1glassshape->Rmax(0) = hole1glassshape->GetRmin(0);
+  hole1glassshape->Z(0)    = hole1Cushape->GetZ(1);
+
+  dza = hole1glassshape->GetRmax(0) - (kHole1RMax-kHole1RMin)*kHoleGlassFrac;
+
+  hole1glassshape->Rmin(1) = dza;
+  hole1glassshape->Rmax(1) = hole1glassshape->GetRmax(0);
+  hole1glassshape->Z(1)    = ZFromRminpCone(conefoamshape,1,kConeTheta,
+                                           hole1glassshape->GetRmin(1));
+
+  hole1glassshape->Rmax(2) = hole1glassshape->GetRmax(0);
+  hole1glassshape->Rmin(2) = hole1glassshape->GetRmin(1);
+  hole1glassshape->Z(2)    = hole1Cushape->GetZ(3);
+
+  hole1glassshape->Rmin(3) = hole1glassshape->GetRmin(1);
+  hole1glassshape->Rmax(3) = hole1glassshape->GetRmin(3);
+  hole1glassshape->Z(3)    = ZFromRmaxpCone(conefoamshape,3,kConeTheta,
+                                           hole1glassshape->GetRmax(3));
+  //
+  TGeoPcon *hole2plastshape = new TGeoPcon(-kHole2Phi/2., kHole2Phi, 4);
+
+  hole2plastshape->Rmin(0) = hole2shape->GetRmin(0);
+  hole2plastshape->Rmax(0) = hole2shape->GetRmax(0);
+  hole2plastshape->Z(0)    = hole2shape->GetZ(0);
+
+  hole2plastshape->Rmin(1) = hole2shape->GetRmin(1);
+  hole2plastshape->Rmax(1) = hole2shape->GetRmax(1);
+  hole2plastshape->Z(1)    = hole2shape->GetZ(1);
+
+  dza = hole2plastshape->GetRmax(0) - (kHole2RMax-kHole2RMin)*kHolePlasticFrac;
+
+  hole2plastshape->Rmin(2) = dza;
+  hole2plastshape->Z(2)    = ZFromRminpCone(conefoamshape,1,kConeTheta,
+                                           hole2plastshape->GetRmin(2));
+  hole2plastshape->Rmax(2) = RmaxFromZpCone(conefoamshape,3,kConeTheta,
+                                           hole2plastshape->GetZ(2));
+
+  hole2plastshape->Rmin(3) = hole2plastshape->GetRmin(2);
+  hole2plastshape->Rmax(3) = hole2plastshape->GetRmin(3);
+  hole2plastshape->Z(3)    = ZFromRmaxpCone(conefoamshape,3,kConeTheta,
+                                           hole2plastshape->GetRmax(3));
+
+  TGeoPcon *hole2Cushape = new TGeoPcon(-kHole2Phi/2., kHole2Phi, 4);
+
+  hole2Cushape->Rmin(0) = hole2plastshape->GetRmin(2);
+  hole2Cushape->Rmax(0) = hole2Cushape->GetRmin(0);
+  hole2Cushape->Z(0)    = hole2plastshape->GetZ(2);
+
+  dza = hole2Cushape->GetRmax(0) - (kHole2RMax-kHole2RMin)*kHoleCuFrac;
+
+  hole2Cushape->Rmin(1) = dza;
+  hole2Cushape->Rmax(1) = hole2Cushape->GetRmax(0);
+  hole2Cushape->Z(1)    = ZFromRminpCone(conefoamshape,1,kConeTheta,
+                                        hole2Cushape->GetRmin(1));
+
+  hole2Cushape->Rmax(2) = hole2Cushape->GetRmax(0);
+  hole2Cushape->Rmin(2) = hole2Cushape->GetRmin(1);
+  hole2Cushape->Z(2)    = hole2plastshape->GetZ(3);
+
+  hole2Cushape->Rmin(3) = hole2Cushape->GetRmin(1);
+  hole2Cushape->Rmax(3) = hole2Cushape->GetRmin(3);
+  hole2Cushape->Z(3)    = ZFromRmaxpCone(conefoamshape,3,kConeTheta,
+                                        hole2Cushape->GetRmax(3));
+
+  TGeoPcon *hole2glassshape = new TGeoPcon(-kHole2Phi/2., kHole2Phi, 4);
+
+  hole2glassshape->Rmin(0) = hole2Cushape->GetRmin(1);
+  hole2glassshape->Rmax(0) = hole2glassshape->GetRmin(0);
+  hole2glassshape->Z(0)    = hole2Cushape->GetZ(1);
+
+  dza = hole2glassshape->GetRmax(0) - (kHole2RMax-kHole2RMin)*kHoleGlassFrac;
+
+  hole2glassshape->Rmin(1) = dza;
+  hole2glassshape->Rmax(1) = hole2glassshape->GetRmax(0);
+  hole2glassshape->Z(1)    = ZFromRminpCone(conefoamshape,1,kConeTheta,
+                                           hole2glassshape->GetRmin(1));
+
+  hole2glassshape->Rmax(2) = hole2glassshape->GetRmax(0);
+  hole2glassshape->Rmin(2) = hole2glassshape->GetRmin(1);
+  hole2glassshape->Z(2)    = hole2Cushape->GetZ(3);
+
+  hole2glassshape->Rmin(3) = hole2glassshape->GetRmin(1);
+  hole2glassshape->Rmax(3) = hole2glassshape->GetRmin(3);
+  hole2glassshape->Z(3)    = ZFromRmaxpCone(conefoamshape,3,kConeTheta,
+                                           hole2glassshape->GetRmax(3));
+
+
   // Debug if requested
   if (GetDebug(1)) {
     coneshape->InspectShape();
@@ -1420,6 +1565,30 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   hole12->SetFillColor(hole12->GetLineColor());
   hole12->SetFillStyle(4090); // 90% transparent
 
+  TGeoVolume *hole1plast = new TGeoVolume("SDDCableHole1Plast",
+                                         hole1plastshape,medSDDplast);
+  hole1plast->SetVisibility(kTRUE);
+  hole1plast->SetLineColor(kBlue);
+  hole1plast->SetLineWidth(1);
+  hole1plast->SetFillColor(hole1plast->GetLineColor());
+  hole1plast->SetFillStyle(4090); // 90% transparent
+
+  TGeoVolume *hole1Cu = new TGeoVolume("SDDCableHole1Cu",
+                                      hole1Cushape,medSDDCu);
+  hole1Cu->SetVisibility(kTRUE);
+  hole1Cu->SetLineColor(kRed);
+  hole1Cu->SetLineWidth(1);
+  hole1Cu->SetFillColor(hole1Cu->GetLineColor());
+  hole1Cu->SetFillStyle(4090); // 90% transparent
+
+  TGeoVolume *hole1glass = new TGeoVolume("SDDCableHole1glass",
+                                         hole1glassshape,medSDDglass);
+  hole1glass->SetVisibility(kTRUE);
+  hole1glass->SetLineColor(kGreen);
+  hole1glass->SetLineWidth(1);
+  hole1glass->SetFillColor(hole1glass->GetLineColor());
+  hole1glass->SetFillStyle(4090); // 90% transparent
+
   TGeoVolume *hole2 = new TGeoVolume("SDDCableHole2",
                                     hole2shape,medSDDair);
   hole2->SetVisibility(kTRUE);
@@ -1444,6 +1613,30 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   hole22->SetFillColor(hole22->GetLineColor());
   hole22->SetFillStyle(4090); // 90% transparent
 
+  TGeoVolume *hole2plast = new TGeoVolume("SDDCableHole2Plast",
+                                         hole2plastshape,medSDDplast);
+  hole2plast->SetVisibility(kTRUE);
+  hole2plast->SetLineColor(kBlue);
+  hole2plast->SetLineWidth(1);
+  hole2plast->SetFillColor(hole2plast->GetLineColor());
+  hole2plast->SetFillStyle(4090); // 90% transparent
+
+  TGeoVolume *hole2Cu = new TGeoVolume("SDDCableHole2Cu",
+                                      hole2Cushape,medSDDCu);
+  hole2Cu->SetVisibility(kTRUE);
+  hole2Cu->SetLineColor(kRed);
+  hole2Cu->SetLineWidth(1);
+  hole2Cu->SetFillColor(hole2Cu->GetLineColor());
+  hole2Cu->SetFillStyle(4090); // 90% transparent
+
+  TGeoVolume *hole2glass = new TGeoVolume("SDDCableHole2glass",
+                                         hole2glassshape,medSDDglass);
+  hole2glass->SetVisibility(kTRUE);
+  hole2glass->SetLineColor(kGreen);
+  hole2glass->SetLineWidth(1);
+  hole2glass->SetFillColor(hole2glass->GetLineColor());
+  hole2glass->SetFillStyle(4090); // 90% transparent
+
   TGeoVolume *hole3 = new TGeoVolume("SDDCableHole3",
                                     hole3shape,medSDDair);
   hole3->SetVisibility(kTRUE);
@@ -1479,6 +1672,14 @@ void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr)
   // Mount up a cone
   cfconeinsert->AddNode(cfconefoam,1,0);
 
+  hole1->AddNode(hole1plast, 1, 0);
+  hole1->AddNode(hole1Cu, 1, 0);
+  hole1->AddNode(hole1glass, 1, 0);
+
+  hole2->AddNode(hole2plast, 1, 0);
+  hole2->AddNode(hole2Cu, 1, 0);
+  hole2->AddNode(hole2glass, 1, 0);
+
   for (Int_t i=0; i<12; i++) {
     Double_t phiH = i*30.0;
     cfconefoam->AddNode(hole1 , i+1, new TGeoRotation("", 0, 0, phiH));
@@ -3076,7 +3277,7 @@ void AliITSv11GeometrySupport::ServicesCableSupportSPD(TGeoVolume *moth,
 //
 
   SPDCableTraysSideA(moth, mgr);
-//  SPDCableTraysSideC(moth, mgr);
+  SPDCableTraysSideC(moth, mgr);
 
 }
 
@@ -3098,7 +3299,7 @@ void AliITSv11GeometrySupport::ServicesCableSupportSDD(TGeoVolume *moth,
 //
 
   SDDCableTraysSideA(moth, mgr);
-//  SDDCableTraysSideC(moth, mgr);
+  SDDCableTraysSideC(moth, mgr);
 
   return;
 }
@@ -3121,7 +3322,7 @@ void AliITSv11GeometrySupport::ServicesCableSupportSSD(TGeoVolume *moth,
 //
 
   SSDCableTraysSideA(moth, mgr);
-//  SSDCableTraysSideC(moth, mgr);
+  SSDCableTraysSideC(moth, mgr);
 
   return;
 }
@@ -3141,6 +3342,7 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
 // Output:
 //
 // Created:      15 Feb 2010  Mario Sitta
+// Updated:      10 Jun 2010  Mario Sitta  Freon inside cooling pipes
 //
 // Technical data are taken from AutoCAD drawings, L.Simonetti technical
 // drawings and other (oral) information given by F.Tosello and D.Elia
@@ -3182,6 +3384,8 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
 
   const Double_t kOpticalFibersSect      =    8.696*fgkmm;//!!!ESTIMATED!!!
   const Double_t kLowVoltageCableSect    =    3.412*fgkmm;//!!!ESTIMATED!!!
+  const Double_t kHiVoltageCableSect     =    1.873*fgkmm;//!!!ESTIMATED!!!
+
 
   // Local variables
   Double_t xprof[kForwardSideNpoints], yprof[kForwardSideNpoints];
@@ -3262,19 +3466,27 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
                                 (kForwardTrayInterSpace-kExternalTrayThick)/2,
                                       kExternalTrayLen/2);
 
-  // The cooling tube inside the forward tray: a TubeSeg
+  // The cooling tube inside the forward tray: a Tube
   Double_t zelong = (kForwardTraySecondHigh - 2*kForwardTrayThick
                - 2*forwTrayWall->GetDY() - kCoolingTubeRmax)*SinD(kTrayAZRot);
   Double_t zlen = (zelong + kForwardTrayTotalLen)/2;
-  TGeoTubeSeg *coolTubeForw = new TGeoTubeSeg(kCoolingTubeRmin,
-                                             kCoolingTubeRmax, zlen, 0, 360);
+  TGeoTube *coolTubeForw = new TGeoTube(0, kCoolingTubeRmax, zlen);
+
+  // The freon inside the forward tray tubes: a Tube
+  TGeoTube *freonTubeForw = new TGeoTube(0, kCoolingTubeRmin, zlen);
 
   // The cooling tube inside the external tray: a Ctub
-  TGeoCtub *coolTubeExt = new TGeoCtub(kCoolingTubeRmin, kCoolingTubeRmax,
+  TGeoCtub *coolTubeExt = new TGeoCtub(0, kCoolingTubeRmax,
                                       kExternalTrayLen/2, 0, 360,
                                       0, SinD(kTrayAZRot),-CosD(kTrayAZRot),
                                       0,                0,               1);
 
+  // The freon inside the forward tray tubes: a Tube
+  TGeoCtub *freonTubeExt = new TGeoCtub(0, kCoolingTubeRmin,
+                                       kExternalTrayLen/2, 0, 360,
+                                       0, SinD(kTrayAZRot),-CosD(kTrayAZRot),
+                                       0,                0,               1);
+
   // The optical fibers inside the forward tray: a BBox
   TGeoBBox *optFibsForw = new TGeoBBox(kOpticalFibersSect/2,
                                       kOpticalFibersSect/2,
@@ -3321,12 +3533,37 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   lowCablesExt->DefineSection(0, 0);
   lowCablesExt->DefineSection(1, kLowVoltageCableSect);
 
+  // The High Voltage cables inside the forward tray: a BBox
+  TGeoBBox *hiCablesForw = new TGeoBBox(kHiVoltageCableSect/2,
+                                       kHiVoltageCableSect/2,
+                                       kForwardTrayTotalLen/2);
+
+  // The High Voltage inside the external tray: a Xtru
+  TGeoXtru *hiCablesExt = new TGeoXtru(2);
+  hiCablesExt->SetName("ITSsuppSPDExtTrayHiVoltage");
+
+  yprof[0] = -kExternalTrayHigh + 2*kExternalTrayThick
+          + 2*forwTrayWall->GetDY();
+  xprof[0] = yprof[0]*TanD(kTrayAZRot);
+  xprof[1] = kExternalTrayLen;
+  yprof[1] = yprof[0];
+  xprof[2] = xprof[1];
+  yprof[2] = yprof[1] + kHiVoltageCableSect;
+  yprof[3] = yprof[2];
+  xprof[3] = yprof[2]*TanD(kTrayAZRot);
+
+  hiCablesExt->DefinePolygon(4, xprof, yprof);
+  hiCablesExt->DefineSection(0, 0);
+  hiCablesExt->DefineSection(1, kHiVoltageCableSect);
+
 
   // We have all shapes: now create the real volumes
-  TGeoMedium *medAl   = mgr->GetMedium("ITS_ALUMINUM$");
-  TGeoMedium *medIn   = mgr->GetMedium("ITS_INOX$");
-  TGeoMedium *medFibs = mgr->GetMedium("ITS_SDD OPTICFIB$");//!!TO BE CHECKED!!
-  TGeoMedium *medLVC  = mgr->GetMedium("ITS_SPD_LOWCABLES$");
+  TGeoMedium *medAl    = mgr->GetMedium("ITS_ALUMINUM$");
+  TGeoMedium *medIn    = mgr->GetMedium("ITS_INOX$");
+  TGeoMedium *medFreon = mgr->GetMedium("ITS_GASEOUS FREON$");
+  TGeoMedium *medFibs  = mgr->GetMedium("ITS_SDD OPTICFIB$");//!TO BE CHECKED!
+  TGeoMedium *medLVC   = mgr->GetMedium("ITS_SPD_LOWCABLES$");
+  TGeoMedium *medHVC   = mgr->GetMedium("ITS_SPD_HICABLES$");
 
   TGeoVolume *forwTrayABase = new TGeoVolume("ITSsuppSPDSideAForwTrayABase",
                                            forwTrayLowerFace, medAl);
@@ -3427,6 +3664,15 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   forwCoolTube->SetFillColor(forwCoolTube->GetLineColor());
   forwCoolTube->SetFillStyle(4000); // 0% transparent
 
+  TGeoVolume *forwCoolFreon = new TGeoVolume("ITSsuppSPDSideAForwTrayFreon",
+                                            freonTubeForw, medFreon);
+
+  forwCoolFreon->SetVisibility(kTRUE);
+  forwCoolFreon->SetLineColor(kBlue); // Blue
+  forwCoolFreon->SetLineWidth(1);
+  forwCoolFreon->SetFillColor(forwCoolFreon->GetLineColor());
+  forwCoolFreon->SetFillStyle(4000); // 0% transparent
+
   TGeoVolume *extCoolTube = new TGeoVolume("ITSsuppSPDSideAExtTrayCoolTube",
                                           coolTubeExt, medIn);
 
@@ -3436,6 +3682,15 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   extCoolTube->SetFillColor(extCoolTube->GetLineColor());
   extCoolTube->SetFillStyle(4000); // 0% transparent
 
+  TGeoVolume *extCoolFreon = new TGeoVolume("ITSsuppSPDSideAExtTrayFreon",
+                                           freonTubeExt, medFreon);
+
+  extCoolFreon->SetVisibility(kTRUE);
+  extCoolFreon->SetLineColor(kBlue); // Blue
+  extCoolFreon->SetLineWidth(1);
+  extCoolFreon->SetFillColor(extCoolFreon->GetLineColor());
+  extCoolFreon->SetFillStyle(4000); // 0% transparent
+
   TGeoVolume *forwOptFibs = new TGeoVolume("ITSsuppSPDSideAForwTrayOptFibs",
                                           optFibsForw, medFibs);
 
@@ -3472,6 +3727,24 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   extLowCabs->SetFillColor(extLowCabs->GetLineColor());
   extLowCabs->SetFillStyle(4000); // 0% transparent
 
+  TGeoVolume *forwHiCabs = new TGeoVolume("ITSsuppSPDSideAForwTrayHiCabs",
+                                         hiCablesForw, medHVC);
+
+  forwHiCabs->SetVisibility(kTRUE);
+  forwHiCabs->SetLineColor(kRed); // Red
+  forwHiCabs->SetLineWidth(1);
+  forwHiCabs->SetFillColor(forwHiCabs->GetLineColor());
+  forwHiCabs->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *extHiCabs = new TGeoVolume("ITSsuppSPDSideAExtTrayHiCabs",
+                                        hiCablesExt, medHVC);
+
+  extHiCabs->SetVisibility(kTRUE);
+  extHiCabs->SetLineColor(kRed); // Red
+  extHiCabs->SetLineWidth(1);
+  extHiCabs->SetFillColor(extHiCabs->GetLineColor());
+  extHiCabs->SetFillStyle(4000); // 0% transparent
+
 
   // Now build up the trays
   yloc = forwTrayLowerFace->GetDY();
@@ -3515,6 +3788,8 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   cableTrayAForw->AddNode(forwTrayAWall, 1,
                      new TGeoTranslation(0, yloc, zloc));
 
+  forwCoolTube->AddNode(forwCoolFreon, 1, 0);
+
   yloc = 2*kForwardTrayThick + 2*forwTrayWall->GetDY()
        + coolTubeForw->GetRmax();
   zloc = coolTubeForw->GetDz();
@@ -3533,6 +3808,13 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   cableTrayAForw->AddNode(forwLowCabs, 1,
                      new TGeoTranslation(-xloc, yloc, zloc));
 
+  xloc = hiCablesForw->GetDX() + 2*lowCablesForw->GetDX()
+       + coolTubeForw->GetRmax();
+  yloc = 2*kForwardTrayThick + 2*forwTrayWall->GetDY() + hiCablesForw->GetDY();
+  zloc = hiCablesForw->GetDZ();
+  cableTrayAForw->AddNode(forwHiCabs, 1,
+                     new TGeoTranslation(-xloc, yloc, zloc));
+
   // To simplify following placement in MARS, origin is on top
   yloc = -kExternalTrayHigh + kExternalTrayThick/2;
   zloc = kExternalTrayLen/2;
@@ -3559,6 +3841,8 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   cableTrayAExt->AddNode(extTrayAWall, 1,
                      new TGeoTranslation( 0, yloc, zloc));
 
+  extCoolTube->AddNode(extCoolFreon, 1, 0);
+
   yloc = -kExternalTrayHigh + 2*kExternalTrayThick + 2*extTrayWall->GetDY()
        + coolTubeExt->GetRmax();
   zloc = coolTubeExt->GetDz();
@@ -3575,6 +3859,11 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
                      new TGeoCombiTrans(-xloc, 0, 0,
                                         new TGeoRotation("",90,-90,-90)));
 
+  xloc = 2*kHiVoltageCableSect + kLowVoltageCableSect + coolTubeExt->GetRmax();
+  cableTrayAExt->AddNode(extHiCabs, 1,
+                     new TGeoCombiTrans(-xloc, 0, 0,
+                                        new TGeoRotation("",90,-90,-90)));
+
 
   // Finally put everything in the mother volume
   Double_t rExtTray = kTrayAR2Trans + kExternalTrayHigh;
@@ -3694,6 +3983,468 @@ void AliITSv11GeometrySupport::SPDCableTraysSideA(TGeoVolume *moth,
   return;
 }
 
+//______________________________________________________________________
+void AliITSv11GeometrySupport::SPDCableTraysSideC(TGeoVolume *moth,
+                                                 TGeoManager *mgr){
+//
+// Creates the SPD cable trays which are outside the ITS support cones
+// but still inside the TPC on Side C
+// (part of this code is taken or anyway inspired to ServicesCableSupport
+// method of AliITSv11GeometrySupport.cxx,v 1.9 2007/06/06)
+//
+// Input:
+//         moth : the TGeoVolume owing the volume structure
+//         mgr  : the GeoManager (default gGeoManager)
+// Output:
+//
+// Return:
+//
+// Created:         ???       Bjorn S. Nilsen
+// Updated:      22 Apr 2010  Mario Sitta
+// Updated:      10 Jun 2010  Mario Sitta  Freon inside cooling pipes
+//
+// Technical data are taken from AutoCAD drawings and other (oral)
+// information given by D.Elia
+//
+
+  // Dimensions and positions of the C-Side Cable Tray elements
+  const Int_t    kNumTraysSideC       =   10;
+
+  const Double_t kTrayCHalfWide       =    6.350 *fgkcm;
+  const Double_t kTrayCLength1        =  172.800 *fgkcm;
+  const Double_t kTrayCLength2        =  189.300 *fgkcm;
+  const Double_t kTrayCFirstLen       =  435.000 *fgkmm;
+  const Double_t kTrayCFirstHigh      =   83.000 *fgkmm;//!!!TO BE CHECKED!!!
+  const Double_t kTrayCSecondHigh     =   52.700 *fgkmm;//!!!TO BE CHECKED!!!
+  const Double_t kTrayCThick          =    0.200 *fgkcm;
+  const Double_t kTrayCInterSpace     =   18.000 *fgkmm;//!!!TO BE CHECKED!!!
+  const Double_t kTrayCFoldAngle      =    5.000 *fgkDegree;
+
+  const Double_t kCoolingTubeRmin     =    5.000 *fgkmm;
+  const Double_t kCoolingTubeRmax     =    6.000 *fgkmm;
+  const Double_t kOpticalFibersSect   =    8.696 *fgkmm;//!!!ESTIMATED!!!
+  const Double_t kLowVoltageCableSect =    3.412 *fgkmm;//!!!ESTIMATED!!!
+  const Double_t kHiVoltageCableSect  =    1.873 *fgkmm;//!!!ESTIMATED!!!
+
+  // Overall position and rotation of the C-Side Cable Trays
+  const Double_t kTraySideCRPos       =   45.300 *fgkcm;
+  const Double_t kTraySideCZPos       = -102.400 *fgkcm;
+  const Double_t kTraySideCAlphaRot[kNumTraysSideC/2]  =
+    {    0.0,      41.0,     -41.0,      76.0,      -76.0};
+  // From position of the other trays
+
+
+  // Local variables
+  Double_t xprof[8], yprof[8];
+  Double_t xloc, yloc, zloc, delta, alpharot;
+
+
+  // The single C-Side Cable tray as an assembly
+  TGeoVolumeAssembly *cableTrayC = new TGeoVolumeAssembly("ITSsupportSPDTrayC");
+
+  // First create all needed shapes
+
+  // The Cable Tray lower face: a Xtru
+  TGeoXtru *sideCHorFace = new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = 0.;
+  xprof[1] = kTrayCLength1;
+  yprof[1] = 0.;
+  xprof[2] = xprof[1] + kTrayCLength2*CosD(kTrayCFoldAngle);
+  yprof[2] = yprof[1] + kTrayCLength2*SinD(kTrayCFoldAngle);
+  xprof[3] = xprof[2] - kTrayCThick*SinD(kTrayCFoldAngle);
+  yprof[3] = yprof[2] + kTrayCThick*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kTrayCThick , xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = kTrayCThick;
+
+  delta = kTrayCHalfWide - kTrayCThick;
+
+  sideCHorFace->DefinePolygon(6, xprof, yprof);
+  sideCHorFace->DefineSection(0,-delta);
+  sideCHorFace->DefineSection(1, delta);
+
+  // The Cable Tray middle face: a Xtru
+  // (somehow duplicate of HorFace, but in this way avoid an overlap with Wall)
+  TGeoXtru *sideCMidFace = new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = kTrayCInterSpace + kTrayCThick;
+  xprof[1] = kTrayCLength1;
+  yprof[1] = yprof[0];
+  xprof[2] = xprof[1] + kTrayCLength2*CosD(kTrayCFoldAngle);
+  yprof[2] = yprof[1] + kTrayCLength2*SinD(kTrayCFoldAngle);
+  xprof[3] = xprof[2] - kTrayCThick*SinD(kTrayCFoldAngle);
+  yprof[3] = yprof[2] + kTrayCThick*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kTrayCThick , xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = yprof[0] + kTrayCThick;
+
+  delta = kTrayCHalfWide - kTrayCThick;
+
+  sideCMidFace->DefinePolygon(6, xprof, yprof);
+  sideCMidFace->DefineSection(0,-delta);
+  sideCMidFace->DefineSection(1, delta);
+
+  // The Cable Tray lower face: a Xtru
+  TGeoXtru *sideCSideFace = new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = 0.;
+  xprof[1] = kTrayCLength1;
+  yprof[1] = 0.;
+  xprof[2] = xprof[1] + kTrayCLength2*CosD(kTrayCFoldAngle);
+  yprof[2] = yprof[1] + kTrayCLength2*SinD(kTrayCFoldAngle);
+  xprof[3] = xprof[2] - kTrayCSecondHigh*SinD(kTrayCFoldAngle);
+  yprof[3] = yprof[2] + kTrayCSecondHigh*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kTrayCSecondHigh , xprof[4], yprof[4]);
+  xprof[5] = kTrayCFirstLen;
+  yprof[5] = kTrayCSecondHigh;
+  xprof[6] = xprof[5];
+  yprof[6] = kTrayCFirstHigh;
+  xprof[7] = xprof[0];
+  yprof[7] = yprof[6];
+
+  sideCSideFace->DefinePolygon(8, xprof, yprof);
+  sideCSideFace->DefineSection(0, 0);
+  sideCSideFace->DefineSection(1, kTrayCThick);
+
+  // The short cover: a BBox
+  TGeoBBox *sideCShortCover = new TGeoBBox(kTrayCFirstLen/2,
+                                          kTrayCThick/2,
+                                          kTrayCHalfWide-kTrayCThick);
+
+  // The long cover: a Xtru
+  TGeoXtru *sideCLongCover = new TGeoXtru(2);
+
+  xprof[5] = sideCSideFace->GetX(5);
+  yprof[5] = sideCSideFace->GetY(5);
+  xprof[4] = sideCSideFace->GetX(4);
+  yprof[4] = sideCSideFace->GetY(4);
+  xprof[3] = sideCSideFace->GetX(3);
+  yprof[3] = sideCSideFace->GetY(3);
+  xprof[2] = xprof[3] + kTrayCThick*SinD(kTrayCFoldAngle);
+  yprof[2] = yprof[3] - kTrayCThick*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[5], yprof[5], xprof[4], yprof[4], xprof[3], yprof[3],
+            -kTrayCThick , xprof[1], yprof[1]);
+  xprof[0] = xprof[5];
+  yprof[0] = yprof[5] - kTrayCThick;
+
+  delta = kTrayCHalfWide - kTrayCThick;
+
+  sideCLongCover->DefinePolygon(6, xprof, yprof);
+  sideCLongCover->DefineSection(0,-delta);
+  sideCLongCover->DefineSection(1, delta);
+
+  // The internal wall: a Xtru
+  TGeoXtru *intWall = new TGeoXtru(2);
+
+  xprof[0] = sideCHorFace->GetX(5);
+  yprof[0] = sideCHorFace->GetY(5);
+  xprof[1] = sideCHorFace->GetX(4);
+  yprof[1] = sideCHorFace->GetY(4);
+  xprof[2] = sideCHorFace->GetX(3);
+  yprof[2] = sideCHorFace->GetY(3);
+  xprof[3] = sideCMidFace->GetX(2);
+  yprof[3] = sideCMidFace->GetY(2);
+  xprof[4] = sideCMidFace->GetX(1);
+  yprof[4] = sideCMidFace->GetY(1);
+  xprof[5] = sideCMidFace->GetX(0);
+  yprof[5] = sideCMidFace->GetY(0);
+
+  intWall->DefinePolygon(6, xprof, yprof);
+  intWall->DefineSection(0,-kTrayCThick/2);
+  intWall->DefineSection(1, kTrayCThick/2);
+
+  // The horizontal part of the cooling tube inside the tray: a Tube
+  delta = sideCMidFace->GetX(4) - sideCMidFace->GetX(5);
+  TGeoTube *horTube = new TGeoTube(0, kCoolingTubeRmax, delta/2);
+
+  // The freon inside the horizontal part of the cooling tube: a Tube
+  TGeoTube *horFreon = new TGeoTube(0, kCoolingTubeRmin, delta/2);
+
+  // The inclined part of the cooling tube inside the tray: a Ctub
+  Double_t x3, y3, x4, y4;
+  x3 = sideCMidFace->GetX(3);
+  y3 = sideCMidFace->GetY(3);
+  x4 = sideCMidFace->GetX(4);
+  y4 = sideCMidFace->GetY(4);
+  delta = TMath::Sqrt( (x4 - x3 + kCoolingTubeRmax*SinD(kTrayCFoldAngle))*
+                      (x4 - x3 + kCoolingTubeRmax*SinD(kTrayCFoldAngle))    +
+       (y4 + kCoolingTubeRmax - y3 - kCoolingTubeRmax*SinD(kTrayCFoldAngle))*
+       (y4 + kCoolingTubeRmax - y3 - kCoolingTubeRmax*SinD(kTrayCFoldAngle)) );
+
+  TGeoCtub *incTube = new TGeoCtub(0, kCoolingTubeRmax, delta/2, 0, 360,
+                              0, SinD(kTrayCFoldAngle),-CosD(kTrayCFoldAngle),
+                              0,                     0,                    1);
+
+  // The freon inside the inclined part of the cooling tube: a Ctub
+  TGeoCtub *incFreon = new TGeoCtub(0, kCoolingTubeRmin, delta/2, 0, 360,
+                              0, SinD(kTrayCFoldAngle),-CosD(kTrayCFoldAngle),
+                              0,                     0,                    1);
+
+  // The optical fibers inside the tray: a Xtru
+  TGeoXtru *optFibs = new TGeoXtru(2);
+
+  xprof[0] = sideCMidFace->GetX(5);
+  yprof[0] = sideCMidFace->GetY(5);
+  xprof[1] = sideCMidFace->GetX(4);
+  yprof[1] = sideCMidFace->GetY(4);
+  xprof[2] = sideCMidFace->GetX(3);
+  yprof[2] = sideCMidFace->GetY(3);
+  xprof[3] = xprof[2] - kOpticalFibersSect*SinD(kTrayCFoldAngle);
+  yprof[3] = yprof[2] + kOpticalFibersSect*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kOpticalFibersSect , xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = yprof[0] + kOpticalFibersSect;
+
+  optFibs->DefinePolygon(6, xprof, yprof);
+  optFibs->DefineSection(0, 0);
+  optFibs->DefineSection(1, kOpticalFibersSect);
+
+  // The low voltage cables inside the tray: a Xtru
+  TGeoXtru *lowCables = new TGeoXtru(2);
+
+  xprof[0] = sideCMidFace->GetX(5);
+  yprof[0] = sideCMidFace->GetY(5);
+  xprof[1] = sideCMidFace->GetX(4);
+  yprof[1] = sideCMidFace->GetY(4);
+  xprof[2] = sideCMidFace->GetX(3);
+  yprof[2] = sideCMidFace->GetY(3);
+  xprof[3] = xprof[2] - kLowVoltageCableSect*SinD(kTrayCFoldAngle);
+  yprof[3] = yprof[2] + kLowVoltageCableSect*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kLowVoltageCableSect , xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = yprof[0] + kLowVoltageCableSect;
+
+  lowCables->DefinePolygon(6, xprof, yprof);
+  lowCables->DefineSection(0, 0);
+  lowCables->DefineSection(1, kLowVoltageCableSect);
+
+  // The high voltage cables inside the tray: a Xtru
+  TGeoXtru *hiCables = new TGeoXtru(2);
+
+  xprof[0] = sideCMidFace->GetX(5);
+  yprof[0] = sideCMidFace->GetY(5);
+  xprof[1] = sideCMidFace->GetX(4);
+  yprof[1] = sideCMidFace->GetY(4);
+  xprof[2] = sideCMidFace->GetX(3);
+  yprof[2] = sideCMidFace->GetY(3);
+  xprof[3] = xprof[2] - kHiVoltageCableSect*SinD(kTrayCFoldAngle);
+  yprof[3] = yprof[2] + kHiVoltageCableSect*CosD(kTrayCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kHiVoltageCableSect , xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = yprof[0] + kHiVoltageCableSect;
+
+  hiCables->DefinePolygon(6, xprof, yprof);
+  hiCables->DefineSection(0, 0);
+  hiCables->DefineSection(1, kHiVoltageCableSect);
+
+
+  // We have all shapes: now create the real volumes
+  TGeoMedium *medAl   = mgr->GetMedium("ITS_ALUMINUM$");
+  TGeoMedium *medIn   = mgr->GetMedium("ITS_INOX$");
+  TGeoMedium *medFr   = mgr->GetMedium("ITS_Freon$");
+  TGeoMedium *medFibs = mgr->GetMedium("ITS_SDD OPTICFIB$");//!!TO BE CHECKED!!
+  TGeoMedium *medLVC  = mgr->GetMedium("ITS_SPD_LOWCABLES$");
+  TGeoMedium *medHVC  = mgr->GetMedium("ITS_SPD_HICABLES$");
+
+  TGeoVolume *traySideCHorFace  = new TGeoVolume("ITSsuppSPDTraySideCHor",
+                                                sideCHorFace, medAl);
+
+  traySideCHorFace->SetVisibility(kTRUE);
+  traySideCHorFace->SetLineColor(6); // Purple
+  traySideCHorFace->SetLineWidth(1);
+  traySideCHorFace->SetFillColor(traySideCHorFace->GetLineColor());
+  traySideCHorFace->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCMidFace  = new TGeoVolume("ITSsuppSPDTraySideCMid",
+                                                sideCMidFace, medAl);
+
+  traySideCMidFace->SetVisibility(kTRUE);
+  traySideCMidFace->SetLineColor(6); // Purple
+  traySideCMidFace->SetLineWidth(1);
+  traySideCMidFace->SetFillColor(traySideCMidFace->GetLineColor());
+  traySideCMidFace->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCSideFace  = new TGeoVolume("ITSsuppSPDTraySideCSide",
+                                                 sideCSideFace, medAl);
+
+  traySideCSideFace->SetVisibility(kTRUE);
+  traySideCSideFace->SetLineColor(6); // Purple
+  traySideCSideFace->SetLineWidth(1);
+  traySideCSideFace->SetFillColor(traySideCSideFace->GetLineColor());
+  traySideCSideFace->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCShortCover  = new TGeoVolume("ITSsuppSPDTraySideCShCov",
+                                                   sideCShortCover, medAl);
+
+  traySideCShortCover->SetVisibility(kTRUE);
+  traySideCShortCover->SetLineColor(6); // Purple
+  traySideCShortCover->SetLineWidth(1);
+  traySideCShortCover->SetFillColor(traySideCShortCover->GetLineColor());
+  traySideCShortCover->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLongCover  = new TGeoVolume("ITSsuppSPDTraySideCLnCov",
+                                                  sideCLongCover, medAl);
+
+  traySideCLongCover->SetVisibility(kTRUE);
+  traySideCLongCover->SetLineColor(6); // Purple
+  traySideCLongCover->SetLineWidth(1);
+  traySideCLongCover->SetFillColor(traySideCLongCover->GetLineColor());
+  traySideCLongCover->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCIntWall  = new TGeoVolume("ITSsuppSPDTraySideCWall",
+                                                intWall, medAl);
+
+  traySideCIntWall->SetVisibility(kTRUE);
+  traySideCIntWall->SetLineColor(6); // Purple
+  traySideCIntWall->SetLineWidth(1);
+  traySideCIntWall->SetFillColor(traySideCIntWall->GetLineColor());
+  traySideCIntWall->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCHorTube = new TGeoVolume("ITSsuppSPDTraySideCHorTube",
+                                               horTube, medIn);
+
+  traySideCHorTube->SetVisibility(kTRUE);
+  traySideCHorTube->SetLineColor(kGray); // as in GeometrySPD
+  traySideCHorTube->SetLineWidth(1);
+  traySideCHorTube->SetFillColor(traySideCHorTube->GetLineColor());
+  traySideCHorTube->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCHorFreon = new TGeoVolume("ITSsuppSPDTraySideCHorFreon",
+                                                horFreon, medFr);
+
+  traySideCHorFreon->SetVisibility(kTRUE);
+  traySideCHorFreon->SetLineColor(kBlue); // Blue
+  traySideCHorFreon->SetLineWidth(1);
+  traySideCHorFreon->SetFillColor(traySideCHorFreon->GetLineColor());
+  traySideCHorFreon->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCIncTube = new TGeoVolume("ITSsuppSPDTraySideCIncTube",
+                                               incTube, medIn);
+
+  traySideCIncTube->SetVisibility(kTRUE);
+  traySideCIncTube->SetLineColor(kGray); // as in GeometrySPD
+  traySideCIncTube->SetLineWidth(1);
+  traySideCIncTube->SetFillColor(traySideCIncTube->GetLineColor());
+  traySideCIncTube->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCIncFreon = new TGeoVolume("ITSsuppSPDTraySideCIncFreon",
+                                                incFreon, medFr);
+
+  traySideCIncFreon->SetVisibility(kTRUE);
+  traySideCIncFreon->SetLineColor(kBlue); // Blue
+  traySideCIncFreon->SetLineWidth(1);
+  traySideCIncFreon->SetFillColor(traySideCIncFreon->GetLineColor());
+  traySideCIncFreon->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCOptFibs = new TGeoVolume("ITSsuppSPDTraySideCOptFibs",
+                                               optFibs, medFibs);
+
+  traySideCOptFibs->SetVisibility(kTRUE);
+  traySideCOptFibs->SetLineColor(kOrange); // Orange
+  traySideCOptFibs->SetLineWidth(1);
+  traySideCOptFibs->SetFillColor(traySideCOptFibs->GetLineColor());
+  traySideCOptFibs->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLowCabs = new TGeoVolume("ITSsuppSPDTraySideCLowCabs",
+                                               lowCables, medLVC);
+
+  traySideCLowCabs->SetVisibility(kTRUE);
+  traySideCLowCabs->SetLineColor(kRed); // Red
+  traySideCLowCabs->SetLineWidth(1);
+  traySideCLowCabs->SetFillColor(traySideCLowCabs->GetLineColor());
+  traySideCLowCabs->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCHiCabs = new TGeoVolume("ITSsuppSPDTraySideCHiCabs",
+                                              hiCables, medHVC);
+
+  traySideCHiCabs->SetVisibility(kTRUE);
+  traySideCHiCabs->SetLineColor(kRed); // Red
+  traySideCHiCabs->SetLineWidth(1);
+  traySideCHiCabs->SetFillColor(traySideCHiCabs->GetLineColor());
+  traySideCHiCabs->SetFillStyle(4000); // 0% transparent
+
+
+  // Now build up the trays
+  cableTrayC->AddNode(traySideCHorFace,1,0);
+
+  cableTrayC->AddNode(traySideCMidFace,1,0);
+
+  zloc = kTrayCHalfWide - kTrayCThick;
+  cableTrayC->AddNode(traySideCSideFace, 1,
+                     new TGeoTranslation( 0, 0, zloc));
+  zloc = -kTrayCHalfWide;
+  cableTrayC->AddNode(traySideCSideFace, 2,
+                     new TGeoTranslation( 0, 0, zloc));
+
+  xloc = sideCShortCover->GetDX();
+  yloc = kTrayCFirstHigh - sideCShortCover->GetDY();
+  cableTrayC->AddNode(traySideCShortCover, 1,
+                     new TGeoTranslation( xloc, yloc, 0));
+
+  cableTrayC->AddNode(traySideCLongCover,1,0);
+
+  cableTrayC->AddNode(traySideCIntWall,1,0);
+
+  traySideCHorTube->AddNode(traySideCHorFreon, 1, 0);
+  traySideCIncTube->AddNode(traySideCIncFreon, 1, 0);
+
+  xloc = horTube->GetDz();
+  yloc = sideCMidFace->GetY(5) + horTube->GetRmax();
+  cableTrayC->AddNode(traySideCHorTube, 1,
+                     new TGeoCombiTrans( xloc, yloc, 0,
+                     new TGeoRotation("",-90.,-90.,90.)));
+
+  xloc = sideCMidFace->GetX(4) + (incTube->GetDz())*CosD(kTrayCFoldAngle);
+  yloc = sideCMidFace->GetY(4) +  incTube->GetRmax() +
+           (incTube->GetDz())*SinD(kTrayCFoldAngle)+0.005;//Avoid small ovrlp
+  cableTrayC->AddNode(traySideCIncTube, 1,
+                     new TGeoCombiTrans( xloc, yloc, 0,
+                     new TGeoRotation("",-90.+kTrayCFoldAngle,-90.,90.)));
+
+  zloc = horTube->GetRmax();
+  cableTrayC->AddNode(traySideCOptFibs, 1,
+                     new TGeoTranslation( 0, 0, zloc));
+
+  zloc = kLowVoltageCableSect + horTube->GetRmax();
+  cableTrayC->AddNode(traySideCLowCabs, 1,
+                     new TGeoTranslation( 0, 0,-zloc));
+
+  zloc = kHiVoltageCableSect + kLowVoltageCableSect + horTube->GetRmax();
+  cableTrayC->AddNode(traySideCHiCabs, 1,
+                     new TGeoTranslation( 0, 0,-zloc));
+
+
+  // Finally put everything in the mother volume
+  for (Int_t jt = 0; jt < kNumTraysSideC/2; jt++) {
+    alpharot = kTraySideCAlphaRot[jt];
+
+    xloc = kTraySideCRPos*SinD(alpharot);
+    yloc = kTraySideCRPos*CosD(alpharot);
+    moth->AddNode(cableTrayC,2*jt+1,
+               new TGeoCombiTrans(-xloc, yloc, kTraySideCZPos,
+               new TGeoRotation("",-90.+alpharot,-90.,90.+kTrayCFoldAngle)));
+    alpharot += 180;
+    xloc = kTraySideCRPos*SinD(alpharot);
+    yloc = kTraySideCRPos*CosD(alpharot);
+    moth->AddNode(cableTrayC,2*jt+2,
+               new TGeoCombiTrans(-xloc, yloc, kTraySideCZPos,
+               new TGeoRotation("",-90.+alpharot,-90.,90.+kTrayCFoldAngle)));
+  }
+
+
+  return;
+}
+
 //______________________________________________________________________
 void AliITSv11GeometrySupport::SDDCableTraysSideA(TGeoVolume *moth,
                                                  TGeoManager *mgr){
@@ -3918,6 +4669,75 @@ void AliITSv11GeometrySupport::SDDCableTraysSideA(TGeoVolume *moth,
   return;
 }
 
+//______________________________________________________________________
+void AliITSv11GeometrySupport::SDDCableTraysSideC(TGeoVolume *moth,
+                                                 TGeoManager *mgr){
+//
+// Creates the SDD cable trays which are outside the ITS support cones
+// but still inside the TPC on Side C
+// (part of this code is taken or anyway inspired to ServicesCableSupport
+// method of AliITSv11GeometrySupport.cxx,v 1.9 2007/06/06)
+//
+// Input:
+//         moth : the TGeoVolume owing the volume structure
+//         mgr  : the GeoManager (default gGeoManager)
+// Output:
+//
+// Created:         ???       Bjorn S. Nilsen
+// Updated:      17 Apr 2010  Mario Sitta
+//
+// Technical data are taken from AutoCAD drawings and other (oral)
+// information given by F.Tosello
+//
+
+  // Dimensions and positions of the C-Side Cable Tray elements
+  const Int_t    kNumTraySideC           =    4;
+
+  const Double_t kSideCFoldAngle         =    5.00 *fgkDegree;
+
+  // Overall position and rotation of the C-Side Cable Trays
+  const Double_t kTraySideCRPos          =   45.30    *fgkcm;
+  const Double_t kTraySideCZPos          = -102.40    *fgkcm;
+  const Double_t kTraySideCAlphaRot[kNumTraySideC]  = {    -23.0,      59.0,
+    /* from SSD tray position */                      180.-23.0, 180.+59.0};
+
+
+  // Local variables
+//  Double_t xprof[12], yprof[12];
+  Double_t xloc, yloc, alpharot, alphafold;
+
+
+  // The assembly holding the metallic structure
+  // We need four of them because the content is different
+  TGeoVolumeAssembly *trayStructure[kNumTraySideC];
+  for (Int_t jt = 0; jt < kNumTraySideC; jt++) {
+    char name[20];
+    sprintf(name,"ITSsupportSDDTrayC%d",jt);
+    trayStructure[jt] = CreateSDDSSDTraysSideC(name);
+  }
+
+
+  // We have all shapes: now create the real volumes
+  TGeoMedium *medAl    = mgr->GetMedium("ITS_ALUMINUM$");
+  if (0==1) medAl->Print();
+
+  // Finally put everything in the mother volume
+  alphafold = kSideCFoldAngle;
+
+  for (Int_t jt = 0; jt < kNumTraySideC; jt++) {
+    alpharot = kTraySideCAlphaRot[jt];
+    xloc = kTraySideCRPos*SinD(alpharot);
+    yloc = kTraySideCRPos*CosD(alpharot);
+    moth->AddNode(trayStructure[jt],1,
+                      new TGeoCombiTrans(-xloc, yloc, kTraySideCZPos,
+                      new TGeoRotation("",-90.+alpharot,-90.,90.+alphafold)));
+  }
+
+
+  return;
+}
+
+
 //______________________________________________________________________
 void AliITSv11GeometrySupport::SSDCableTraysSideA(TGeoVolume *moth,
                                                  TGeoManager *mgr){
@@ -4458,6 +5278,207 @@ void AliITSv11GeometrySupport::SSDCableTraysSideA(TGeoVolume *moth,
   return;
 }
 
+//______________________________________________________________________
+void AliITSv11GeometrySupport::SSDCableTraysSideC(TGeoVolume *moth,
+                                                 TGeoManager *mgr){
+//
+// Creates the SSD cable trays which are outside the ITS support cones
+// but still inside the TPC on Side C
+// (part of this code is taken or anyway inspired to ServicesCableSupport
+// method of AliITSv11GeometrySupport.cxx,v 1.9 2007/06/06)
+//
+// Input:
+//         moth : the TGeoVolume owing the volume structure
+//         mgr  : the GeoManager (default gGeoManager)
+// Output:
+//
+// Created:         ???       Bjorn S. Nilsen
+// Updated:      15 Apr 2010  Mario Sitta
+//
+// Technical data are taken from AutoCAD drawings and other (oral)
+// information given by F.Tosello
+//
+
+  // Dimensions and positions of the C-Side Cable Tray elements
+  const Int_t    kNumTraySideC           =    4;
+
+  const Double_t kSideCFoldAngle         =    5.00 *fgkDegree;
+
+  const Double_t kServicesWidth          =  100.00 *fgkmm;
+  const Double_t kCopperHeight           =   11.20 *fgkmm;// 1120 mm^2
+  const Double_t kCablePlasticHeight     =   11.50 *fgkmm;// 1150 mm^2
+  const Double_t kCoolingWaterHeight     =    2.65 *fgkmm;//  265 mm^2
+  const Double_t kPoliUrethaneHeight     =    4.62 *fgkmm;//  462 mm^2
+
+  // Overall position and rotation of the C-Side Cable Trays
+  const Double_t kTraySideCRPos          =   45.30    *fgkcm;
+  const Double_t kTraySideCZPos          = -102.40    *fgkcm;
+  const Double_t kTraySideCAlphaRot[kNumTraySideC]  = {     23.0,     -59.0,
+    /* from Patch panel position */                   180.+23.0, 180.-59.0};
+
+
+  // Local variables
+  Double_t xprof[6], yprof[6];
+  Double_t xloc, yloc, alpharot, alphafold;
+
+
+  // The assembly holding the metallic structure
+  TGeoVolumeAssembly *trayStructure =
+                               CreateSDDSSDTraysSideC("ITSsupportSSDTrayC");
+
+  // The cable copper inside the tray: a Xtru
+  TGeoXtru *copper = new TGeoXtru(2);
+  copper->SetName("ITSsuppSSDTrayCCopper");
+
+  // Copper lies on the lower plate: get position of its points
+  TGeoXtru *lowerplate = (TGeoXtru*)(mgr->GetVolume("ITSsuppTraySideCLower")->GetShape());
+  xprof[0] = lowerplate->GetX(5);
+  yprof[0] = lowerplate->GetY(5);
+  xprof[1] = lowerplate->GetX(4);
+  yprof[1] = lowerplate->GetY(4);
+  xprof[2] = lowerplate->GetX(3);
+  yprof[2] = lowerplate->GetY(3);
+  xprof[3] = xprof[2] - kCopperHeight*SinD(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kCopperHeight*CosD(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kCopperHeight , xprof[4], yprof[4]);
+  xprof[5] = xprof[0];
+  yprof[5] = yprof[0] + kCopperHeight;
+
+  copper->DefinePolygon(6, xprof, yprof);
+  copper->DefineSection(0, -kServicesWidth/2);
+  copper->DefineSection(1,  kServicesWidth/2);
+
+  // The cable plastic inside the tray: a Xtru
+  TGeoXtru *plastic = new TGeoXtru(2);
+  plastic->SetName("ITSsuppSSDTrayCPlastic");
+
+  xprof[0] = copper->GetX(5);
+  yprof[0] = copper->GetY(5);
+  xprof[1] = copper->GetX(4);
+  yprof[1] = copper->GetY(4);
+  xprof[2] = copper->GetX(3);
+  yprof[2] = copper->GetY(3);
+  xprof[3] = xprof[2] - kCablePlasticHeight*SinD(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kCablePlasticHeight*CosD(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kCablePlasticHeight , xprof[4], yprof[4]);
+  xprof[5] = xprof[0];
+  yprof[5] = yprof[0] + kCablePlasticHeight;
+
+  plastic->DefinePolygon(6, xprof, yprof);
+  plastic->DefineSection(0, -kServicesWidth/2);
+  plastic->DefineSection(1,  kServicesWidth/2);
+
+  // The cooling water inside the tray: a Xtru
+  TGeoXtru *water = new TGeoXtru(2);
+  water->SetName("ITSsuppSSDTrayCWater");
+
+  xprof[0] = plastic->GetX(5);
+  yprof[0] = plastic->GetY(5);
+  xprof[1] = plastic->GetX(4);
+  yprof[1] = plastic->GetY(4);
+  xprof[2] = plastic->GetX(3);
+  yprof[2] = plastic->GetY(3);
+  xprof[3] = xprof[2] - kCoolingWaterHeight*SinD(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kCoolingWaterHeight*CosD(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kCoolingWaterHeight , xprof[4], yprof[4]);
+  xprof[5] = xprof[0];
+  yprof[5] = yprof[0] + kCoolingWaterHeight;
+
+  water->DefinePolygon(6, xprof, yprof);
+  water->DefineSection(0, -kServicesWidth/2);
+  water->DefineSection(1,  kServicesWidth/2);
+
+  // The poliurethane inside the tray: a Xtru
+  TGeoXtru *PUR = new TGeoXtru(2);
+  PUR->SetName("ITSsuppSSDTrayCPUR");
+
+  xprof[0] = water->GetX(5);
+  yprof[0] = water->GetY(5);
+  xprof[1] = water->GetX(4);
+  yprof[1] = water->GetY(4);
+  xprof[2] = water->GetX(3);
+  yprof[2] = water->GetY(3);
+  xprof[3] = xprof[2] - kPoliUrethaneHeight*SinD(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kPoliUrethaneHeight*CosD(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kPoliUrethaneHeight , xprof[4], yprof[4]);
+  xprof[5] = xprof[0];
+  yprof[5] = yprof[0] + kPoliUrethaneHeight;
+
+  PUR->DefinePolygon(6, xprof, yprof);
+  PUR->DefineSection(0, -kServicesWidth/2);
+  PUR->DefineSection(1,  kServicesWidth/2);
+
+
+  // We have all shapes: now create the real volumes
+  TGeoMedium *medCu    = mgr->GetMedium("ITS_COPPER$");
+  TGeoMedium *medFEP   = mgr->GetMedium("ITS_SSD FEP$");
+  TGeoMedium *medH2O   = mgr->GetMedium("ITS_WATER$");
+  TGeoMedium *medPUR   = mgr->GetMedium("ITS_POLYURETHANE$");
+
+  TGeoVolume *copperCable = new TGeoVolume("ITSsuppSSDSideCCableCu",
+                                          copper, medCu);
+
+  copperCable->SetVisibility(kTRUE);
+  copperCable->SetLineColor(kRed); // Red
+  copperCable->SetLineWidth(1);
+  copperCable->SetFillColor(copperCable->GetLineColor());
+  copperCable->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *cableFEP = new TGeoVolume("ITSsuppSSDSideCCableFEP",
+                                       plastic, medFEP);
+
+  cableFEP->SetVisibility(kTRUE);
+  cableFEP->SetLineColor(kYellow); // Yellow
+  cableFEP->SetLineWidth(1);
+  cableFEP->SetFillColor(cableFEP->GetLineColor());
+  cableFEP->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *trayWater = new TGeoVolume("ITSsuppSSDSideCTrayWater",
+                                        water, medH2O);
+
+  trayWater->SetVisibility(kTRUE);
+  trayWater->SetLineColor(kBlue); // Blue
+  trayWater->SetLineWidth(1);
+  trayWater->SetFillColor(trayWater->GetLineColor());
+  trayWater->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *trayPolyUr = new TGeoVolume("ITSsuppSSDSideCPolyUr",
+                                         PUR, medPUR);
+
+  trayPolyUr->SetVisibility(kTRUE);
+  trayPolyUr->SetLineColor(kGray); // Gray
+  trayPolyUr->SetLineWidth(1);
+  trayPolyUr->SetFillColor(trayPolyUr->GetLineColor());
+  trayPolyUr->SetFillStyle(4000); // 0% transparent
+
+
+  // Now fill in the tray
+  trayStructure->AddNode(copperCable,1,0);
+  trayStructure->AddNode(cableFEP,1,0);
+  trayStructure->AddNode(trayWater,1,0);
+  trayStructure->AddNode(trayPolyUr,1,0);
+
+
+  // Finally put everything in the mother volume
+  alphafold = kSideCFoldAngle;
+
+  for (Int_t jt = 0; jt < kNumTraySideC; jt++) {
+    alpharot = kTraySideCAlphaRot[jt];
+    xloc = kTraySideCRPos*SinD(alpharot);
+    yloc = kTraySideCRPos*CosD(alpharot);
+    moth->AddNode(trayStructure,jt+1,
+                      new TGeoCombiTrans(-xloc, yloc, kTraySideCZPos,
+                      new TGeoRotation("",-90.+alpharot,-90.,90.+alphafold)));
+  }
+
+
+  return;
+}
+
 //______________________________________________________________________
 TGeoVolumeAssembly* AliITSv11GeometrySupport::CreateSDDForwardTraySideA(TGeoManager *mgr){
 //
@@ -5064,3 +6085,409 @@ TGeoXtru* AliITSv11GeometrySupport::CreateSDDSSDTraysSideA(
   return trayPart;
 }
 
+//______________________________________________________________________
+TGeoVolumeAssembly* AliITSv11GeometrySupport::CreateSDDSSDTraysSideC(
+                                                       const char *trayName,
+                                                       TGeoManager *mgr){
+
+//
+// Creates the SDD and SSD Trays on Side C which are supposedly identical
+//
+// Input:
+//         trayName : the assembly name
+//
+// Output:
+//
+// Return:     a TGeoVolumeAssembly
+//
+// Created:      16 Apr 2010  Mario Sitta
+//
+// Technical data are taken from AutoCAD drawings and other (oral)
+// information given by F.Tosello
+//
+
+  const Double_t kSideCHalfThick      =    0.100   *fgkcm;
+  const Double_t kSideCFoldAngle      =    5.000   *TMath::DegToRad();
+
+  const Double_t kSideCLength1        =  172.800   *fgkcm;
+  const Double_t kSideCLength2        =  189.300   *fgkcm;
+  const Double_t kSideCHalfWide       =    6.350   *fgkcm;
+  const Double_t kSideCHeight1        =   11.800   *fgkcm;
+  const Double_t kSideCHeight2        =    4.300   *fgkcm;
+  const Double_t kSideCSideLength1    =   10.800   *fgkcm;
+  const Double_t kSideCSideLength2    =   63.800   *fgkcm;
+  const Double_t kSideCSideHeight     =    8.800   *fgkcm;
+  const Int_t    kNPointsLowerFace    =    6;
+  const Int_t    kNPointsLateralFace  =    9;
+
+  const Double_t kSideCWingAHalfLen   =    5.000   *fgkcm;
+  const Double_t kSideCWingBHalfLen   =   30.500   *fgkcm;
+  const Double_t kSideCWingCHalfLen   =    2.000   *fgkcm;
+  const Double_t kSideCWingDHalfLen   =   48.500   *fgkcm;
+  const Double_t kSideCWingEHalfLen   =   83.000   *fgkcm;
+  const Double_t kSideCWingsHalfWide  =    0.450   *fgkcm;
+
+  const Int_t    kNPointsCoverFace    =   12;
+
+  const Double_t kPlateHalfLen        =    6.000   *fgkcm;
+  const Double_t kPlateThick          =    0.600   *fgkcm;
+  const Double_t kPlateHeight         =    4.200   *fgkcm;
+  const Int_t    kNPointsPlate        =    6;
+
+  const Double_t kBarCoolRmax         =    0.4     *fgkcm;
+  const Int_t    kNumBarCool          =    2;
+  const Double_t kXShiftBarCool[kNumBarCool] = { 8.7, 13.0 };
+  const Double_t kYShiftBarCool[kNumBarCool] = { 8.5,  5.0 };
+
+
+  // Local variables
+  Double_t xprof[12], yprof[12];
+  Double_t xloc, yloc, zloc, delta, alpharot;
+
+  // The single C-Side Cable tray as an assembly
+  TGeoVolumeAssembly *cableTrayC = new TGeoVolumeAssembly(trayName);
+
+  // First create all needed shapes
+
+  // The Cable Tray lower face: a Xtru
+  TGeoXtru *sideCLowerFace = new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = 0.;
+  xprof[1] = kSideCLength1;
+  yprof[1] = 0.;
+  xprof[2] = xprof[1] + kSideCLength2*TMath::Cos(kSideCFoldAngle);
+  yprof[2] = yprof[1] + kSideCLength2*TMath::Sin(kSideCFoldAngle);
+  xprof[3] = xprof[2] - 2*kSideCHalfThick*TMath::Sin(kSideCFoldAngle);
+  yprof[3] = yprof[2] + 2*kSideCHalfThick*TMath::Cos(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             2*kSideCHalfThick , xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = 2*kSideCHalfThick;
+
+  sideCLowerFace->DefinePolygon(kNPointsLowerFace, xprof, yprof);
+  sideCLowerFace->DefineSection(0,-kSideCHalfWide);
+  sideCLowerFace->DefineSection(1, kSideCHalfWide);
+
+  // The Cable Tray lateral face: a Xtru
+  TGeoXtru *sideCLateralFace = new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = 0.;
+  xprof[1] = kSideCLength1;
+  yprof[1] = 0.;
+  xprof[2] = xprof[1] + kSideCLength2*TMath::Cos(kSideCFoldAngle);
+  yprof[2] = yprof[1] + kSideCLength2*TMath::Sin(kSideCFoldAngle);
+  xprof[3] = xprof[2] - kSideCHeight2*TMath::Sin(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kSideCHeight2*TMath::Cos(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kSideCHeight2, xprof[4], yprof[4]);
+  xprof[5] = kSideCSideLength1 + kSideCSideLength2;
+  yprof[5] = kSideCHeight2;
+  xprof[6] = xprof[5];
+  yprof[6] = kSideCSideHeight;
+  xprof[7] = kSideCSideLength1;
+  yprof[7] = kSideCHeight1;
+  xprof[8] = 0;
+  yprof[8] = yprof[7];
+
+  sideCLateralFace->DefinePolygon(kNPointsLateralFace, xprof, yprof);
+  sideCLateralFace->DefineSection(0,-kSideCHalfThick);
+  sideCLateralFace->DefineSection(1, kSideCHalfThick);
+
+  // The lateral wings: four BBox's
+  TGeoBBox *sideCLateralWingA = new TGeoBBox(kSideCWingAHalfLen,
+                                            kSideCHalfThick,
+                                            kSideCWingsHalfWide);
+
+  TGeoBBox *sideCLateralWingB = new TGeoBBox(kSideCWingBHalfLen,
+                                            kSideCHalfThick,
+                                            kSideCWingsHalfWide);
+
+  TGeoBBox *sideCLateralWingC = new TGeoBBox(kSideCHalfThick,    // With these
+                                            kSideCWingCHalfLen, // X,Y avoid
+                                            kSideCWingsHalfWide);//rotations
+
+  TGeoBBox *sideCLateralWingD = new TGeoBBox(kSideCWingDHalfLen,
+                                            kSideCHalfThick,
+                                            kSideCWingsHalfWide);
+
+  TGeoBBox *sideCLateralWingE = new TGeoBBox(kSideCWingEHalfLen,
+                                            kSideCHalfThick,
+                                            kSideCWingsHalfWide);
+
+  // The connecting lower plate: a Xtru
+  TGeoXtru *sideCLowerPlate =  new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = 0.;
+  xprof[1] = kPlateHalfLen;
+  yprof[1] = 0.;
+  xprof[2] = xprof[1] + kPlateHalfLen*TMath::Cos(kSideCFoldAngle);
+  yprof[2] = kPlateHalfLen*TMath::Sin(kSideCFoldAngle);
+  xprof[3] = xprof[2] - kPlateThick*TMath::Sin(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kPlateThick*TMath::Cos(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kPlateThick, xprof[4], yprof[4]);
+  xprof[5] = 0.;
+  yprof[5] = kPlateThick;
+
+  sideCLowerPlate->DefinePolygon(kNPointsPlate, xprof, yprof);
+  Double_t zwide = kSideCHalfWide + 2*kSideCHalfThick;
+  sideCLowerPlate->DefineSection(0,-zwide);
+  sideCLowerPlate->DefineSection(1, zwide);
+
+  // The connecting side plate: a Xtru
+  TGeoXtru *sideCLateralPlate = new TGeoXtru(2);
+
+  xprof[0] = 0.;
+  yprof[0] = 0.;
+  xprof[1] = kPlateHalfLen;
+  yprof[1] = 0.;
+  xprof[2] = xprof[1] + kPlateHalfLen*TMath::Cos(kSideCFoldAngle);
+  yprof[2] = kPlateHalfLen*TMath::Sin(kSideCFoldAngle);
+  xprof[3] = xprof[2] - kPlateHeight*TMath::Sin(kSideCFoldAngle);
+  yprof[3] = yprof[2] + kPlateHeight*TMath::Cos(kSideCFoldAngle);
+  InsidePoint(xprof[0], yprof[0], xprof[1], yprof[1], xprof[2], yprof[2],
+             kPlateHeight, xprof[4], yprof[4]); // Avoid small overlap
+  xprof[5] = 0.;
+  yprof[5] = kPlateHeight;
+
+  sideCLateralPlate->DefinePolygon(kNPointsPlate, xprof, yprof);
+  sideCLateralPlate->DefineSection(0,-kPlateThick/2);
+  sideCLateralPlate->DefineSection(1, kPlateThick/2);
+
+  // The bar fixing the cooling tubes: a Tube
+  TGeoTube *coolBar = new TGeoTube(0., kBarCoolRmax, kSideCHalfWide);
+
+  // The Cable Tray cover: a (complex) Xtru
+  TGeoXtru *sideCCoverFace = new TGeoXtru(2);
+
+  xprof[ 0] = sideCLateralFace->GetX(8);
+  yprof[ 0] = sideCLateralFace->GetY(8);
+  xprof[ 1] = sideCLateralFace->GetX(7);
+  yprof[ 1] = sideCLateralFace->GetY(7);
+  xprof[ 2] = sideCLateralFace->GetX(6);
+  yprof[ 2] = sideCLateralFace->GetY(6);
+  xprof[ 3] = sideCLateralFace->GetX(5);
+  yprof[ 3] = sideCLateralFace->GetY(5);
+  xprof[ 4] = sideCLateralFace->GetX(4);
+  yprof[ 4] = sideCLateralFace->GetY(4);
+
+  xloc = (kSideCLength1 + (kSideCSideLength1+kSideCSideLength2))/2;
+  delta  = kSideCLength1 - (xloc + kSideCWingDHalfLen);
+  xprof[ 5] = xprof[4]
+           + (delta + 2*kSideCWingEHalfLen)*TMath::Cos(kSideCFoldAngle);
+  yprof[ 5] = yprof[4]
+           + (delta + 2*kSideCWingEHalfLen)*TMath::Sin(kSideCFoldAngle);
+
+  xprof[ 6] = xprof[5] - 2*kSideCHalfThick*TMath::Sin(kSideCFoldAngle);
+  yprof[ 6] = yprof[5] + 2*kSideCHalfThick*TMath::Cos(kSideCFoldAngle);
+  InsidePoint(xprof[3], yprof[3], xprof[4], yprof[4], xprof[5], yprof[5],
+             2*kSideCHalfThick, xprof[7], yprof[7]);
+  InsidePoint(xprof[2], yprof[2], xprof[3], yprof[3], xprof[4], yprof[4],
+             2*kSideCHalfThick, xprof[8], yprof[8]);
+  xprof[ 9] = xprof[2] + 2*kSideCHalfThick;
+  yprof[ 9] = yprof[2] + 2*kSideCHalfThick;
+  xprof[10] = xprof[1];
+  yprof[10] = yprof[1] + 2*kSideCHalfThick;
+  xprof[11] = xprof[0];
+  yprof[11] = yprof[0] + 2*kSideCHalfThick;
+
+  sideCCoverFace->DefinePolygon(kNPointsCoverFace, xprof, yprof);
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + 2*kSideCWingsHalfWide;
+  sideCCoverFace->DefineSection(0,-zloc);
+  sideCCoverFace->DefineSection(1, zloc);
+
+
+  // We have all shapes: now create the real volumes
+  TGeoMedium *medAl      = mgr->GetMedium("ITS_ALUMINUM$");
+
+  TGeoVolume *traySideCLowerFace  = new TGeoVolume("ITSsuppTraySideCLower",
+                                                  sideCLowerFace, medAl);
+
+  traySideCLowerFace->SetVisibility(kTRUE);
+  traySideCLowerFace->SetLineColor(6); // Purple
+  traySideCLowerFace->SetLineWidth(1);
+  traySideCLowerFace->SetFillColor(traySideCLowerFace->GetLineColor());
+  traySideCLowerFace->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralFace  = new TGeoVolume("ITSsuppTraySideCLateral",
+                                                    sideCLateralFace, medAl);
+
+  traySideCLateralFace->SetVisibility(kTRUE);
+  traySideCLateralFace->SetLineColor(6); // Purple
+  traySideCLateralFace->SetLineWidth(1);
+  traySideCLateralFace->SetFillColor(traySideCLateralFace->GetLineColor());
+  traySideCLateralFace->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralWingA =
+    new TGeoVolume("ITSsuppTraySideCLateralWingA", sideCLateralWingA,  medAl);
+
+  traySideCLateralWingA->SetVisibility(kTRUE);
+  traySideCLateralWingA->SetLineColor(6); // Purple
+  traySideCLateralWingA->SetLineWidth(1);
+  traySideCLateralWingA->SetFillColor(traySideCLateralWingA->GetLineColor());
+  traySideCLateralWingA->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralWingB =
+    new TGeoVolume("ITSsuppTraySideCLateralWingB", sideCLateralWingB,  medAl);
+
+  traySideCLateralWingB->SetVisibility(kTRUE);
+  traySideCLateralWingB->SetLineColor(6); // Purple
+  traySideCLateralWingB->SetLineWidth(1);
+  traySideCLateralWingB->SetFillColor(traySideCLateralWingB->GetLineColor());
+  traySideCLateralWingB->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralWingC =
+    new TGeoVolume("ITSsuppTraySideCLateralWingC", sideCLateralWingC,  medAl);
+
+  traySideCLateralWingC->SetVisibility(kTRUE);
+  traySideCLateralWingC->SetLineColor(6); // Purple
+  traySideCLateralWingC->SetLineWidth(1);
+  traySideCLateralWingC->SetFillColor(traySideCLateralWingC->GetLineColor());
+  traySideCLateralWingC->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralWingD =
+    new TGeoVolume("ITSsuppTraySideCLateralWingD", sideCLateralWingD,  medAl);
+
+  traySideCLateralWingD->SetVisibility(kTRUE);
+  traySideCLateralWingD->SetLineColor(6); // Purple
+  traySideCLateralWingD->SetLineWidth(1);
+  traySideCLateralWingD->SetFillColor(traySideCLateralWingD->GetLineColor());
+  traySideCLateralWingD->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralWingE =
+    new TGeoVolume("ITSsuppTraySideCLateralWingE", sideCLateralWingE,  medAl);
+
+  traySideCLateralWingE->SetVisibility(kTRUE);
+  traySideCLateralWingE->SetLineColor(6); // Purple
+  traySideCLateralWingE->SetLineWidth(1);
+  traySideCLateralWingE->SetFillColor(traySideCLateralWingE->GetLineColor());
+  traySideCLateralWingE->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLowerPlate =
+    new TGeoVolume("ITSsuppTraySideCLowerPlate", sideCLowerPlate,  medAl);
+
+  traySideCLowerPlate->SetVisibility(kTRUE);
+  traySideCLowerPlate->SetLineColor(6); // Purple
+  traySideCLowerPlate->SetLineWidth(1);
+  traySideCLowerPlate->SetFillColor(traySideCLowerPlate->GetLineColor());
+  traySideCLowerPlate->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCLateralPlate =
+    new TGeoVolume("ITSsuppTraySideCLateralPlate", sideCLateralPlate,  medAl);
+
+  traySideCLateralPlate->SetVisibility(kTRUE);
+  traySideCLateralPlate->SetLineColor(6); // Purple
+  traySideCLateralPlate->SetLineWidth(1);
+  traySideCLateralPlate->SetFillColor(traySideCLateralPlate->GetLineColor());
+  traySideCLateralPlate->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *traySideCCoverFace =
+    new TGeoVolume("ITSsuppTraySideCCoverFace", sideCCoverFace,  medAl);
+
+  traySideCCoverFace->SetVisibility(kTRUE);
+  traySideCCoverFace->SetLineColor(6); // Purple
+  traySideCCoverFace->SetLineWidth(1);
+  traySideCCoverFace->SetFillColor(traySideCCoverFace->GetLineColor());
+  traySideCCoverFace->SetFillStyle(4000); // 0% transparent
+
+  TGeoVolume *coolingTubeBar = new TGeoVolume("ITSsuppTraySideCCoolBar",
+                                             coolBar, medAl);
+
+  coolingTubeBar->SetVisibility(kTRUE);
+  coolingTubeBar->SetLineColor(6); // Purple
+  coolingTubeBar->SetLineWidth(1);
+  coolingTubeBar->SetFillColor(coolingTubeBar->GetLineColor());
+  coolingTubeBar->SetFillStyle(4000); // 0% transparent
+
+
+  // Now build up the tray
+  cableTrayC->AddNode(traySideCLowerFace,1,0);
+
+  zloc = kSideCHalfWide + kSideCHalfThick;
+  cableTrayC->AddNode(traySideCLateralFace,1,
+                           new TGeoTranslation(0., 0., zloc) );
+  cableTrayC->AddNode(traySideCLateralFace,2,
+                           new TGeoTranslation(0., 0.,-zloc) );
+
+  xloc = kSideCWingAHalfLen;
+  yloc = kSideCHeight1 - kSideCHalfThick;
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + kSideCWingsHalfWide;
+  cableTrayC->AddNode(traySideCLateralWingA,1,
+                           new TGeoTranslation(xloc, yloc, zloc) );
+  cableTrayC->AddNode(traySideCLateralWingA,2,
+                           new TGeoTranslation(xloc, yloc,-zloc) );
+
+  xloc = kSideCSideLength1 + kSideCSideLength2/2;
+  yloc = Yfrom2Points(kSideCSideLength1,kSideCHeight1,
+                     kSideCSideLength1+kSideCSideLength2,kSideCSideHeight,
+                     xloc) - kSideCHalfThick -0.0012; // Avoid small overlap
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + kSideCWingsHalfWide;
+  alpharot = (-(kSideCHeight1 - kSideCSideHeight)/kSideCSideLength2 )*
+               TMath::RadToDeg();
+  cableTrayC->AddNode(traySideCLateralWingB,1,
+                           new TGeoCombiTrans(xloc, yloc, zloc,
+                                       new TGeoRotation("",alpharot,0,0) ) );
+  cableTrayC->AddNode(traySideCLateralWingB,2,
+                           new TGeoCombiTrans(xloc, yloc,-zloc,
+                                       new TGeoRotation("",alpharot,0,0) ) );
+
+  xloc = kSideCSideLength1 + kSideCSideLength2 - kSideCHalfThick;
+  yloc = kSideCSideHeight - kSideCWingCHalfLen;
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + kSideCWingsHalfWide;
+  cableTrayC->AddNode(traySideCLateralWingC,1,
+                           new TGeoTranslation(xloc, yloc, zloc) );
+  cableTrayC->AddNode(traySideCLateralWingC,2,
+                           new TGeoTranslation(xloc, yloc,-zloc) );
+
+  xloc = (kSideCLength1 + (kSideCSideLength1+kSideCSideLength2))/2;
+  yloc = kSideCHeight2 - kSideCHalfThick;
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + kSideCWingsHalfWide;
+  cableTrayC->AddNode(traySideCLateralWingD,1,
+                           new TGeoTranslation(xloc, yloc, zloc) );
+  cableTrayC->AddNode(traySideCLateralWingD,2,
+                           new TGeoTranslation(xloc, yloc,-zloc) );
+
+  delta = kSideCLength1 - (xloc + kSideCWingDHalfLen);
+  xloc = kSideCLength1 + delta + kSideCWingEHalfLen;
+  yloc = (xloc - kSideCLength1)*TMath::Tan(kSideCFoldAngle) +
+         kSideCHeight2*TMath::Cos(kSideCFoldAngle) - kSideCHalfThick;
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + kSideCWingsHalfWide;
+  alpharot = kSideCFoldAngle*TMath::RadToDeg();
+  cableTrayC->AddNode(traySideCLateralWingE,1,
+                           new TGeoCombiTrans(xloc, yloc, zloc,
+                                       new TGeoRotation("",alpharot,0,0) ) );
+  cableTrayC->AddNode(traySideCLateralWingE,2,
+                           new TGeoCombiTrans(xloc, yloc,-zloc,
+                                       new TGeoRotation("",alpharot,0,0) ) );
+
+  xloc = kSideCLength1 - kPlateHalfLen;
+  yloc = -kPlateThick -0.0025; // Avoid small overlap
+  cableTrayC->AddNode(traySideCLowerPlate,1,
+                           new TGeoTranslation(xloc, yloc, 0.) );
+
+  xloc = kSideCLength1 - kPlateHalfLen;
+  yloc = -kPlateThick;
+  zloc = kSideCHalfWide + 2*kSideCHalfThick + kPlateThick/2;
+  cableTrayC->AddNode(traySideCLateralPlate,1,
+                           new TGeoTranslation(xloc, yloc, zloc) );
+  cableTrayC->AddNode(traySideCLateralPlate,2,
+                           new TGeoTranslation(xloc, yloc,-zloc) );
+
+  for (Int_t jc = 0; jc <kNumBarCool; jc++) {
+    xloc = kXShiftBarCool[jc];
+    yloc = kYShiftBarCool[jc];
+    cableTrayC->AddNode(coolingTubeBar,jc+1,
+                             new TGeoTranslation(xloc, yloc, 0.) );
+  }
+
+  cableTrayC->AddNode(traySideCCoverFace,1,0);
+
+
+  // Finally return what we made up
+
+  return cableTrayC;
+}
+