]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSv11GeometrySSD.cxx
fix in calling of gaussian spread function
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySSD.cxx
index 5ee182aea257b3d535bb28698df67832b5bd19c6..76c8557a336468bd9f581e7b604880df2351982e 100644 (file)
@@ -13,6 +13,7 @@
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+/* $Id$ */
 
 //*************************************************************************
 // SSD geometry, based on ROOT geometrical modeler
 #include "TList.h"
 #include "TGeoMatrix.h"
 #include "TGeoCompositeShape.h"
+#include "TGeoBoolNode.h"
 #include "TGeoTube.h"
 #include "TGeoBBox.h"
+#include "TGeoXtru.h"
+#include "TGeoTorus.h"
+#include "TGeoPgon.h"
+#include "TGeoPcon.h"
+#include "TRotation.h"
 #include "AliITSv11GeometrySSD.h"
+
+/////////////////////////////////////////////////////////////////////////////////
+// Names of the Sensitive Volumes of Layer 5 and Layer 6
+/////////////////////////////////////////////////////////////////////////////////
+const char* AliITSv11GeometrySSD::fgkSSDsensitiveVolName5 = "ITSssdSensitivL5";
+const char* AliITSv11GeometrySSD::fgkSSDsensitiveVolName6 = "ITSssdSensitivL6";
 /////////////////////////////////////////////////////////////////////////////////
 //Parameters for SSD Geometry
 /////////////////////////////////////////////////////////////////////////////////
+// Variable for Vertical Disalignement of Modules
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkSSDTolerance = 0.0001*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDModuleVerticalDisalignment = 0.2*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDModuleSideDisalignment     = 0.2*fgkmm;
+// For ladders:
+const Double_t AliITSv11GeometrySSD::fgkSSDLadderVerticalDisalignment = 0.520*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
 // Layer5 (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDLay5LadderLength      = 950.7*fgkmm;
@@ -59,42 +80,45 @@ const Double_t AliITSv11GeometrySSD::fgkSSDChipLength            =  11.100*fgkmm
 const Double_t AliITSv11GeometrySSD::fgkSSDChipWidth             =   3.850*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDChipHeight            =   0.180*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDChipSeparationLength  =   1.000*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueLength        =   fgkSSDChipLength;
-const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueWidth         =   fgkSSDChipWidth;
+const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueLength     = fgkSSDChipLength;
+const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueWidth      =  fgkSSDChipWidth;
 const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueHeight        =   0.030*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 // Stiffener (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerLength       =  73.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerWidth        =   6.500*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerHeight       =   0.315*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerHeight       =   0.295*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerToChipDist   =   2.500*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Length   =   1.600*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603CapLength  =  0.900*fgkmm;  // Includes solder
+const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Length   = 1.600*fgkmm; 
 const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Width    =   0.870*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Height   =   0.800*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812CapLength  =  0.215*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Length   =   4.600*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Width    =   3.400*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Height   =   1.400*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Height   =   1.400*fgkmm;   
 const Double_t AliITSv11GeometrySSD::fgkSSDWireLength            =  30.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDWireRadius            =   0.185*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDConnectorPosition[2]  = {44.32*fgkmm, 
-                                                                     0.33*fgkmm};
-const Double_t AliITSv11GeometrySSD::fgkSSDConnectorSeparation   = 0.44*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDConnectorLength       = 2.16*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDConnectorWidth        = 3.60*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDConnectorHeight       = 
-                                                   0.25*fgkSSDStiffenerHeight;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorPosition[2]  = {44.32*fgkmm, 0.33*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorSeparation   =       0.44*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorLength       =       2.16*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorWidth        =       3.60*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorHeight       =   0.25*fgkSSDStiffenerHeight;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorAlHeight     =      0.030*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorNiHeight     =   0.002*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDConnectorSnHeight     =   0.15*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 // Cooling Block (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockLength    =   3.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockWidth     =   4.000*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHeight[3] = 
-                                                                                                        {1.950*fgkmm, 0.240*fgkmm, 0.300*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHeight[3] =  
+                                                                                {1.950*fgkmm, 0.240*fgkmm, 0.300*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleRadius[2] = 
-                                                                                                                   {1.000*fgkmm, 0.120*fgkmm};
+  {1.025*fgkmm, 0.120*fgkmm};  // Added 50 micron tolerance for thicker wall cooling pipe (March 2010)
 const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleLength[2] = 
-                                                                                                                       {1.900*fgkmm, 0.400*fgkmm};
+                                                                                                         {1.900*fgkmm, 0.400*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleCenter    =  
                                                                                                                                         1.500*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleHeight    =  
@@ -103,44 +127,45 @@ const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleHeight    =
 // SSD Sensor (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const char*  AliITSv11GeometrySSD::fgkSSDSensitiveVolName       = 
-                                                          "SSDSensorSensitiveVol";
+                                                                                                                "SSDSensorSensitiveVol";
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorLength          =  42.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorHeight          =   0.300*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorWidth           =  75.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorOverlap         = 
                                                                                                   fgkSSDSensorLength-39.1*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorInsensitiveLength      = 1.*fgkmm; 
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorInsensitiveWidth       = 1.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorInsensitiveLength    = 1.*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorInsensitiveWidth     = 1.*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 // Flex (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexFullLength       =  106.000*fgkmm; 
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexLength[4]        = 
-                       {0.5*(fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength
-                                               +(fgkSSDChipNumber-1)*fgkSSDChipSeparationLength),
-                        0.5*(fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength
-                                               +(fgkSSDChipNumber-1)*fgkSSDChipSeparationLength)-4.000*fgkmm,
-                                                 9.500*fgkmm, 10.000*fgkmm};
+                       {0.5 * (fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength
+                                (fgkSSDChipNumber-1)*fgkSSDChipSeparationLength),
+                        0.5 * (fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength
+                                + (fgkSSDChipNumber-1)*fgkSSDChipSeparationLength)
+                                                                          - 4.000*fgkmm, 9.500*fgkmm, 10.000*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexWidth[2]         = 
-                                                                                                                {  9.340*fgkmm,  5.380*fgkmm};
+                                                                                                  {  9.340*fgkmm,  5.380*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexHeight[2]        =
-                                                                                                                {  0.030*fgkmm,  0.020*fgkmm};      
+                                                                                                  {  0.030*fgkmm,  0.020*fgkmm};      
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexAngle            =   30.000;
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexHoleLength       =    1.430*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDFlexHoleWidth        =    3.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDEndFlexCompLength[6] = 
-                                                                                  {3.30*fgkmm,4.12*fgkmm,4.22*fgkmm,1.70*fgkmm,0.75*fgkmm,7.18*fgkmm};
+                        {3.30*fgkmm,4.12*fgkmm,4.22*fgkmm,1.70*fgkmm,0.75*fgkmm,7.18*fgkmm};
 const Double_t AliITSv11GeometrySSD:: fgkSSDEndFlexCompWidth[3] =
-                                                                                                          {15.03*fgkmm,23.48*fgkmm,12.28*fgkmm};
+                                                                                  {15.03*fgkmm,23.48*fgkmm,12.28*fgkmm};
 /////////////////////////////////////////////////////////////////////////////////
 // SSD Ladder Cable (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
-const Double_t AliITSv11GeometrySSD::fgkSSDLadderCableWidth     =   23.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDLadderCableWidth     =     23.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDLadderCableHeight[2] = {  0.030*fgkmm*17.5/23.5,  1.25 * 0.030*fgkmm};   // Al covers ~ 17.5/23.5 of surface, Kapton includes glue+foam   
 /////////////////////////////////////////////////////////////////////////////////
 // SSD Module (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDModuleStiffenerPosition[2]  = 
-                                                                                                                  { 1.000*fgkmm, 3.900*fgkmm};
+                                                                                                        { 1.000*fgkmm, 3.900*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDModuleSensorSupportDistance =  
                                                                                                                                        45.600*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDModuleCoolingBlockToSensor  =  
@@ -148,79 +173,96 @@ const Double_t AliITSv11GeometrySSD::fgkSSDModuleCoolingBlockToSensor  =
 /////////////////////////////////////////////////////////////////////////////////
 // Sensor Support (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportLength                = 
-                                                                                                                                          5.800*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportLength                    
+                                                                                                                                        5.800*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportWidth          =  
-                                                                                                                                          2.000*fgkmm;
+                                                                                                                                        2.000*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportHeight[2]      =
-                                                                                                                    { 4.620*fgkmm, 5.180*fgkmm};
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportThickness[2] = 
-                                                                                                                    { 0.450*fgkmm, 0.450*fgkmm};
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportPosition       =  
-                                                                         0.5*(fgkSSDModuleSensorSupportDistance
-                                                              +    fgkSSDSensorSideSupportThickness[0])
-                                                                  -           fgkSSDSensorSideSupportLength;
+                                                                                                    { 4.620*fgkmm-fgkSSDModuleVerticalDisalignment, 
+                                                                                                      5.220*fgkmm-fgkSSDModuleVerticalDisalignment};
+//const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportHeight[2]      =
+//                                                                                                  { 4.520*fgkmm, 5.130*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportThickness[2]   = 
+                                                                                                        { 0.450*fgkmm, 0.450*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportPosition       
+                                                               = 0.5 * (fgkSSDModuleSensorSupportDistance
+                                                           +  fgkSSDSensorSideSupportThickness[0])
+                                                               -  fgkSSDSensorSideSupportLength;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportLength      =  
-                                                                                                                                          5.250*fgkmm;
+                                                                                                                                   5.250*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportWidth        =
-                                                                                                                                      1.680*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportHeight[2]    =
-          {fgkSSDSensorSideSupportHeight[0]+fgkSSDSensorSideSupportThickness[0],
-          fgkSSDSensorSideSupportHeight[1]+fgkSSDSensorSideSupportThickness[1]};
-const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportThickness[2] =
-   {fgkSSDSensorSideSupportThickness[0],fgkSSDSensorSideSupportThickness[1]};
+                                                                                                                                       1.680*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportHeight[2]    
+                                                                 = {fgkSSDSensorSideSupportHeight[0]
+                                                                 +  fgkSSDSensorSideSupportThickness[0],
+                                                                        fgkSSDSensorSideSupportHeight[1]
+                                                                 +  fgkSSDSensorSideSupportThickness[1]};
+const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportThickness[2] 
+                                                                 =  {fgkSSDSensorSideSupportThickness[0],
+                                                                         fgkSSDSensorSideSupportThickness[1]};
 const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportPosition     = 
-                                                                                                                                     19.000*fgkmm;
+                                                                                                                                  19.000*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 // Chip Cables (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDChipCablesLength[2]   = 
-                                                {73.12/fgkSSDChipNumber*fgkmm,fgkSSDChipLength+2.*0.19*fgkmm};
+                                 {73.12/fgkSSDChipNumber*fgkmm,fgkSSDChipLength+2.*0.19*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDChipCablesHeight[4]   = 
-                                               {  0.014*fgkmm,  0.010*fgkmm, fgkSSDModuleCoolingBlockToSensor
-  -  (fgkSSDSensorSideSupportHeight[1]-fgkSSDSensorSideSupportHeight[0])
-  -   fgkSSDCoolingBlockHoleCenter-fgkSSDStiffenerHeight
-  -   fgkSSDChipHeight-fgkSSDSensorHeight,
-      fgkSSDModuleCoolingBlockToSensor
-  -   fgkSSDCoolingBlockHoleCenter-fgkSSDStiffenerHeight
-  -   fgkSSDChipHeight-fgkSSDSensorHeight};
+                                 {  0.014*fgkmm,  0.010*fgkmm, fgkSSDModuleCoolingBlockToSensor
+                                                                 -  (fgkSSDSensorSideSupportHeight[1]
+                                                                 -   fgkSSDSensorSideSupportHeight[0])
+                                                                 -   fgkSSDModuleVerticalDisalignment
+                                                                 -   fgkSSDCoolingBlockHoleCenter
+                                                                 -   fgkSSDStiffenerHeight
+                                                                 -   fgkSSDChipHeight-fgkSSDSensorHeight,
+                                                                         fgkSSDModuleCoolingBlockToSensor
+                                                                 -   fgkSSDModuleVerticalDisalignment  
+                                                                 -   fgkSSDCoolingBlockHoleCenter
+                                                                 -       fgkSSDStiffenerHeight
+                                                                 -   fgkSSDChipHeight-fgkSSDSensorHeight};
 const Double_t AliITSv11GeometrySSD::fgkSSDChipCablesWidth[3]    = 
-                                                                                                { 11.000*fgkmm,  0.800*fgkmm,  0.600*fgkmm};
+                                           { 11.000*fgkmm,  0.800*fgkmm,  0.600*fgkmm};
 /////////////////////////////////////////////////////////////////////////////////
 // Carbon Fiber Junction Parameters (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionLength          = 
-                                                                                                                                          3.820*fgkmm;
+                                                                                                                                       3.820*fgkmm;
+//const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionLength          = 
+//                                                                                                                                        3.780;
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionWidth           = 
-                                                                         fgkSSDSensorLength-fgkSSDSensorOverlap;
+                                                                                fgkSSDSensorLength-fgkSSDSensorOverlap;
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionEdge[2]         = 
-                                                                                                                        {  0.86*fgkmm,  0.30*fgkmm};
+                                                                                                       {  0.86*fgkmm,  0.30*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionAngle[2]        = 
-                                                                                                                        { 30.00, 90.00};
+                                                                                                                               { 30.00, 90.00};
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionToSensorSupport = 
-                                                                                                                                           1.78*fgkmm;
+                                                                                                                                        1.78*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 //Carbon Fiber Parameters (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
-const Double_t AliITSv11GeometrySSD::fgkCarbonFiberTriangleLength          
-  fgkSSDModuleSensorSupportDistance-2.*fgkCarbonFiberJunctionToSensorSupport;  
-const Double_t AliITSv11GeometrySSD::fgkCarbonFiberTriangleAngle           = 
-                                                                                                                                          60.00;
+const Double_t AliITSv11GeometrySSD::fgkCarbonFiberTriangleLength          
+                                                                  = fgkSSDModuleSensorSupportDistance
+                                                                  - 2. * fgkCarbonFiberJunctionToSensorSupport;  
+const Double_t AliITSv11GeometrySSD::fgkCarbonFiberTriangleAngle = 60.00;
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportTopEdgeDist[2]   = 
-                                                                                                                  {  0.751*fgkmm,  0.482*fgkmm};
-const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportEdgeLength       =  
-                                                                                                                                          1.630*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportWidth            = 
-                                                                                                                                          0.950*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportXAxisLength      = 
-            fgkCarbonFiberTriangleLength-0.5*fgkCarbonFiberSupportTopEdgeDist[1]
-                    / TMath::Cos(fgkCarbonFiberTriangleAngle*TMath::DegToRad());
-const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportYAxisLength      = 
-                                 0.5*(fgkCarbonFiberJunctionWidth-fgkCarbonFiberSupportWidth)
-                        - fgkCarbonFiberSupportTopEdgeDist[0]-fgkCarbonFiberSupportWidth;
+                                                                                                 {  0.751*fgkmm,  0.482*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportEdgeLength  = 
+                                                                                                                                       1.630*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportWidth =   0.950*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportXAxisLength      
+                                                                       = fgkCarbonFiberTriangleLength
+                                                                       - 0.5*fgkCarbonFiberSupportTopEdgeDist[1]
+                                                                       / TMath::Cos(fgkCarbonFiberTriangleAngle
+                                                                       * TMath::DegToRad());
+const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportYAxisLength      
+                                                                       = 0.5*(fgkCarbonFiberJunctionWidth
+                                                                       - fgkCarbonFiberSupportWidth)
+                                                                       - fgkCarbonFiberSupportTopEdgeDist[0]
+                                                                       - fgkCarbonFiberSupportWidth;
 /////////////////////////////////////////////////////////////////////////////////
 // Carbon Fiber Lower Support Parameters (lengths are in mm)
 /////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkLowerSupportToSensorZ           = 11.575*fgkmm;  
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportWidth             
                                                                                                                                          =  0.950*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportLowerLenght       
@@ -230,80 +272,258 @@ const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportHeight
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportVolumeSeparation  
                                                                                          = 0.5*fgkCarbonFiberSupportWidth;
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportTransverseWidth   
-                                                                = fgkCarbonFiberJunctionWidth
-                                 - 2.*(fgkCarbonFiberLowerSupportWidth
-                                                                + fgkCarbonFiberLowerSupportVolumeSeparation);
+                                                                       = fgkCarbonFiberJunctionWidth
+                                                                       - 2. * (fgkCarbonFiberLowerSupportWidth
+                                                                       + fgkCarbonFiberLowerSupportVolumeSeparation);
 const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportVolumePosition[2] 
-                                                                = {fgkCarbonFiberLowerSupportWidth
-                                                                +  fgkCarbonFiberLowerSupportVolumeSeparation,
-                                                                       fgkCarbonFiberLowerSupportWidth
-                                                                +  fgkCarbonFiberLowerSupportVolumeSeparation                                                  
-                                                                +  fgkCarbonFiberLowerSupportTransverseWidth};
+                                                                       = {fgkCarbonFiberLowerSupportWidth
+                                                                       +  fgkCarbonFiberLowerSupportVolumeSeparation,
+                                                                          fgkCarbonFiberLowerSupportWidth
+                                                                       +  fgkCarbonFiberLowerSupportVolumeSeparation                                                   
+                                                                       +  fgkCarbonFiberLowerSupportTransverseWidth};
 /////////////////////////////////////////////////////////////////////////////////
 // End Ladder Carbon Fiber Junction Parameters (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkEndLadderCarbonFiberLowerJunctionLength[2] = 
-  {0.5*(fgkSSDLay5LadderLength
-         -fgkSSDLay5SensorsNumber*fgkCarbonFiberJunctionWidth
-         -fgkCarbonFiberLowerSupportWidth),
-       0.5*(fgkSSDLay5LadderLength
-         -fgkSSDLay5SensorsNumber*fgkCarbonFiberJunctionWidth
-         +fgkCarbonFiberLowerSupportWidth)};
+                                                          {0.5 * (fgkSSDLay5LadderLength
+                                                                       -  fgkSSDLay5SensorsNumber
+                                                                       *  fgkCarbonFiberJunctionWidth
+                                                                       -  fgkCarbonFiberLowerSupportWidth),
+                                                               0.5 * (fgkSSDLay5LadderLength
+                                                                       -  fgkSSDLay5SensorsNumber
+                                                                       *  fgkCarbonFiberJunctionWidth
+                                                                       +  fgkCarbonFiberLowerSupportWidth)};
 const Double_t AliITSv11GeometrySSD::fgkEndLadderCarbonFiberUpperJunctionLength[2] = 
-               {fgkEndLadderCarbonFiberLowerJunctionLength[0]-20.4*fgkmm,
-                fgkEndLadderCarbonFiberLowerJunctionLength[1]-20.6*fgkmm};
+                                               {fgkEndLadderCarbonFiberLowerJunctionLength[0]-20.4*fgkmm,
+                                                fgkEndLadderCarbonFiberLowerJunctionLength[1]-20.6*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkEndLadderMountingBlockPosition[2] = 
-                                                  {fgkEndLadderCarbonFiberLowerJunctionLength[0]-16.50*fgkmm,
-                                                  fgkEndLadderCarbonFiberLowerJunctionLength[1]-31.50*fgkmm};
+                                               {fgkEndLadderCarbonFiberLowerJunctionLength[0]-16.50*fgkmm,
+                                                fgkEndLadderCarbonFiberLowerJunctionLength[1]-31.50*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkendladdercoolingsupportdistance[3] = 
+                                                                                       {15.0*fgkmm, 13.5*fgkmm, 14.5*fgkmm};
 /////////////////////////////////////////////////////////////////////////////////
 // Cooling Tube Support (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportRmax          =  1.45*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportRmax      =  1.45*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportRmin          
                                                                                          = fgkSSDCoolingBlockHoleRadius[0];
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportLength        =  8.55*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportHeight        =  0.85*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportWidth         =  2.00*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportLength    =  8.55*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportHeight    =  0.85*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportWidth     =  2.00*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportSeparation    = 
-                                      fgkSSDSensorLength-2.*fgkSSDSensorOverlap;
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportToCarbonFiber = 11.70*fgkmm;
+                                        fgkSSDSensorLength-2.*fgkSSDSensorOverlap;
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportToCarbonFiber = 
+                                                                                                                                         11.70*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 // Cooling Tube (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeRmax       = 
-                                                                                                         fgkCoolingTubeSupportRmin;
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeRmin       =  0.96*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkCoolingTubeLength     = 
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeRmax = fgkCoolingTubeSupportRmin;
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeRmin =  1.915*fgkmm/2; // Nominal + 50 micron tolerance; real pipes are closer to 450 micron wall thickness
+const Double_t AliITSv11GeometrySSD::fgkCoolingTubeLength = 
                                                                                                        fgkCarbonFiberJunctionWidth;
 const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSeparation = 
-                                       fgkSSDModuleSensorSupportDistance+fgkSSDCoolingBlockLength;
+                                                                        fgkSSDModuleSensorSupportDistance
+                                                                 +      fgkSSDCoolingBlockLength;
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockToSensorSupport = 30.7*fgkmm;
 /////////////////////////////////////////////////////////////////////////////////
 // SSD Mounting Block Parameters (lengths are in mm and angles in degrees)
 /////////////////////////////////////////////////////////////////////////////////
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockLength[3]            = 
-                                                                                                                       { 60.0*fgkmm, 42.2*fgkmm, 34.0*fgkmm};
+                                                                                  { 60.0*fgkmm, 42.2*fgkmm, 34.0*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHeight[4]            =
-                                                                                                         {  4.0*fgkmm,  8.0*fgkmm,  5.0*fgkmm,  0.2*fgkmm};
+                                                          {  4.0*fgkmm,  8.0*fgkmm,  5.0*fgkmm,  0.2*fgkmm};
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockWidth                =   
-                                                                                                                                                  20.0*fgkmm;
+                                                                                                                                         20.0*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTrapezoidAngle   =   
-                                                                                                                                                  40.0;
+                                                                                                                                                   40.0;
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTrapezoidHeight  = 
                   0.30*(fgkSSDMountingBlockHeight[1]-fgkSSDMountingBlockHeight[2]);
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTrapezoidUpBasis =    
-                                                                                                                                                       2.5*fgkmm;
+                                                                                                                                         2.5*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTubeLength[2]    = 
-                                                                                                                                 { 56.0*fgkmm, 12.0*fgkmm}; 
+                                                                                                         { 56.0*fgkmm, 12.0*fgkmm}; 
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTubeWidth[2]     = 
-                                                                                                                                 {  5.0*fgkmm,  2.9*fgkmm}; 
+                                                                                                     {  5.0*fgkmm,  2.9*fgkmm}; 
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleRadius           = 
-                                                                                                                                                       1.0*fgkmm;
+                                                                                                                                         1.0*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleEdge        =   
-                                                                                                                                                       6.0*fgkmm;
-const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleHeigth      =  
-                                                                                                                                                       4.0*fgkmm;
+                                                                                                                                         6.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleHeight      =  
+                                                                                                                                         4.0*fgkmm;
 const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleRadius[2]   =
-                                                                       {  1.5*fgkmm,fgkSSDMountingBlockScrewHoleEdge/6.};
+                                                         {  1.5*fgkmm,fgkSSDMountingBlockScrewHoleEdge/6.};
+/////////////////////////////////////////////////////////////////////////////////
+// SSD Mounting Block Clip Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockClipLength        = 15.1*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockClipThickness     = 0.3*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockClibScrewRadius   = 1.6*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockClibScrewPosition = 4.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockClibWidth         = 9.0*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
+// SSD Mounting Block Support Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockSupportWidth[2] = {9.5*fgkmm,10.0*fgkmm}; 
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockSupportDownHeight   = 4.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockSupportRadius[2] = {fgkSSDLay5RadiusMin
+                                                                                                 -  fgkSSDMountingBlockHeight[1]
+                                                                                                 +  0.5*fgkCoolingTubeSupportHeight
+                                                                                                 +      fgkSSDModuleCoolingBlockToSensor
+                                                                                                 -      fgkMountingBlockSupportDownHeight,
+                                                                                                        fgkSSDLay6RadiusMin
+                                                                                                 -  fgkSSDMountingBlockHeight[1]
+                                                                                                 +  0.5*fgkCoolingTubeSupportHeight
+                                                                                                 +      fgkSSDModuleCoolingBlockToSensor
+                                                                                                 -      fgkMountingBlockSupportDownHeight}; 
+const Double_t AliITSv11GeometrySSD::fgkMountingBlockSupportUpHeight[2] = {fgkSSDLay5RadiusMax
+                                                                                                   -  fgkSSDMountingBlockHeight[1]
+                                                                                                   +  0.5*fgkCoolingTubeSupportHeight
+                                                                                                   +  fgkSSDModuleCoolingBlockToSensor
+                                                                                                       -  fgkMountingBlockSupportRadius[0],
+                                                                                                          fgkSSDLay6RadiusMax
+                                                                                                   -  fgkSSDMountingBlockHeight[1]
+                                                                                                   +  0.5*fgkCoolingTubeSupportHeight
+                                                                                                   +  fgkSSDModuleCoolingBlockToSensor
+                                                                                                       -  fgkMountingBlockSupportRadius[1]};
+const Double_t AliITSv11GeometrySSD::fgkLadderSupportHeight = 10.0*fgkmm; // To be verified
+const Double_t AliITSv11GeometrySSD::fgkLadderSupportRingLay5Position = 451.35*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkLadderSupportRingLay6Position = 510.00*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
+// SSD End Cap Cover Plate Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateSmallHoleRadius = 1.25*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateBigHoleRadius = 2.45*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateThickness = 0.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateSmallHoleSeparation[3] =
+                                                                                               {16.5*fgkmm,22.0*fgkmm,7.*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateLength[6] = 
+                                 {7.*fgkmm,55.*fgkmm,8.0*fgkmm,53.*fgkmm,61.0*fgkmm,25.5*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateWidth[3] = 
+                                                                                          {68.5*fgkmm,75.5*fgkmm,6.5*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateScrewRadiusMin = 0.750*fgkmm;  
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateScrewRadiusMax = 2.*fgkmm;  
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateClipLength = 10.4*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateClipWidth = 6.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateDownClipLength = 5.7*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoverPlateDownClipWidth = 5.0*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
+// SSD End Cap Kapton Foil Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkEndCapKaptonFoilThickness = 0.4*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapKaptonFoilLength = 68.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapKaptonFoilWidth = 75.0*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
+// SSD End Cap Cooling Tube Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoolingTubeAxialRadius[2] =
+                                                                                                               {10.5*fgkmm,9.25*fgkmm}; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoolingTubeRadiusMin = 1.3*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoolingTubeRadiusMax = 1.5*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoolingTubeAngle[5] =
+                                                                                                       {182.3,177.9,84.4,70.0,35.0}; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoolingTubeLength[5] = 
+                                                                       {49.5*fgkmm,41.7*fgkmm,47.6*fgkmm,5.0*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCoolingTubeToCoverSide = 13.0*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
+// SSD End Cap Cover Side Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkEndCapSideCoverLength[5] = {3.5*fgkmm,
+                                                                         6.5*fgkmm,75.0*fgkmm,8.0*fgkmm,2.0*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapSideCoverWidth[7] = {30.9*fgkmm,
+                                                                         47.5*fgkmm,12.6*fgkmm,5.6*fgkmm,
+                                                                         20.0*fgkmm,7.0*fgkmm,5.9*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapSideCoverThickness = 0.4*fgkmm; 
+/////////////////////////////////////////////////////////////////////////////////
+// SSD End Cap Cards Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardElectBoardBackLength[3] = 
+                                                                                                          {62.0*fgkmm,21.87*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardElectBoardBackWidth[2] = 
+                                                                                                           {47.0*fgkmm,0.35*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardElectBoardBackThickness = 
+                                                                                                                                         1.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardElectBoardLength = 61.8*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardElectBoardLayerWidth[2] =
+                                                                                                          {43.5*fgkmm, 0.70*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardElectBoardLayerThickness = 
+                                                                                                                                        0.15*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardJMDConnectorThickness = 
+                                                                                                                                        19.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardJMDConnectorLength[2] = 
+                                                                                                                {4.80*fgkmm,1.1*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardJMDConnectorWidth[2] =
+                                                                                                                {3.3*fgkmm,1.10*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardJMDConnectorToLayer = 
+                                                                                                                                         2.1*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardCableConnectorLength[3] =
+                                                                                               {5.2*fgkmm,3.5*fgkmm,1.2*fgkmm}; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardCableConnectorWidth[2] =
+                                                                                                                {1.9*fgkmm,0.15*fgkmm}; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardCableConnectorThickness = 
+                                                                                                                                          19*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardCableConnectorDistance = 
+                                                                                                                                         1.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapCardCableConnectorToLayer = 
+                                                                                                                                         3.6*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapStripConnectionLength = 
+                                                                                                                                        61.0*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapStripConnectionThickness =
+                                                                                                                                        5.97*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapStripConnectionWidth = 3.0*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapInterfaceCardBLength[7] = 
+                                                                                               {3.1*fgkmm,68.0*fgkmm,3.6*fgkmm,
+                                                                         1.9*fgkmm,2.5*fgkmm,14.2*fgkmm,1.5*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapInterfaceCardBWidth[5] = 
+                                                 {17.0*fgkmm,10.0*fgkmm,5.9*fgkmm,6.4*fgkmm,3.9*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapInterfaceCardBThickness = 
+                                                                                                                                         1.0*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapInterfaceElectBoardCardBThickness 
+                                                                                                                                  = 0.15*fgkmm; 
+const Double_t AliITSv11GeometrySSD::fgkEndCapInterfaceCardBJMDConnectorSeparation = 
+                                                                                                                                        20.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapStiffenerLength = 68.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapStiffenerWidth = 5.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapStiffenerThickness = 5.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapEffectiveCableRadiusMin = 1.25*fgkmm; // To Be Checked
+const Double_t AliITSv11GeometrySSD::fgkEndCapEffectiveCableRadiusMax = 1.575*fgkmm; // To Be Checked
+/////////////////////////////////////////////////////////////////////////////////
+// SSD End Cap SupportLayer5/6 Side Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportLength[2] = {70.424*fgkmm,72.919*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportMiddleRadius[2] = {377.0*fgkmm,437.0*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportLowRadius[2] = {375.0*fgkmm,435.0*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportHighWidth = 20.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportLowWidth[2] = {3.0*fgkmm,3.0*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportCenterLay5ITSPosition = 624.9*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportCenterLay5Position = 2.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportCenterLay6ITSPosition = 635.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkEndCapSupportCenterLay6Position = 2.5*fgkmm;
+/////////////////////////////////////////////////////////////////////////////////
+// SSD Cone Parameters (lengths are in mm and angles in degrees)
+/////////////////////////////////////////////////////////////////////////////////
+const Double_t AliITSv11GeometrySSD::fgkSSDLowerPConeRadius = 296.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeAngle = 39.0; 
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeZLength[2] = {168.0*fgkmm,153.0*fgkmm};
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeLittleHoleRadius = 317.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeLittleHoleLength = 20.*fgkmm;  
+const Double_t AliITSv11GeometrySSD::fgkSSDConeMiddleRadius = 350.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeMiddleLength = 30.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeMiddleWidth = 40.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeUpRadius = 400.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeUpMaxRadius = 459.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeUpMiddleRadius = 472.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeDownRadius = 282.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeTrapezoidAngle = 42.0;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeTrapezoidBasis = 200.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeExternalRadius = 492.5*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeRadiusWidth = 16.75*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDPConeLength = 168.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCentralSupportLength = 1020.*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCentralSupportRadius = 297.5*fgkmm;  
+const Double_t AliITSv11GeometrySSD::fgkSSDCentralSupportWidth = 6.28*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCentralAL3SupportLength = 60.0*fgkmm;
+const Double_t AliITSv11GeometrySSD::fgkSSDCentralAL3SupportWidth = 2.5*fgkSSDCentralSupportWidth;
+
 /////////////////////////////////////////////////////////////////////////////////
 ClassImp(AliITSv11GeometrySSD)
 /////////////////////////////////////////////////////////////////////////////////
@@ -315,6 +535,7 @@ AliITSv11GeometrySSD::AliITSv11GeometrySSD():
   fSSDStiffenerConnectorMedium(),
   fSSDStiffener0603CapacitorMedium(),
   fSSDStiffener1812CapacitorMedium(),
+  fSSDStiffenerCapacitorCapMedium(),
   fSSDStiffenerHybridWireMedium(),
   fSSDKaptonFlexMedium(),
   fSSDAlTraceFlexMedium(),
@@ -329,566 +550,751 @@ AliITSv11GeometrySSD::AliITSv11GeometrySSD():
   fSSDTubeHolderMedium(),
   fSSDCoolingTubeWater(),
   fSSDCoolingTubePhynox(),
+  fSSDSupportRingAl(),
   fSSDMountingBlockMedium(),
-  fMotherVol(0),
+  fSSDRohaCellCone(),
+  fSSDAir(),
+  fSSDCopper(),
+  fSSDSn(),
+  fCreateMaterials(kFALSE),
+  fTransformationMatrices(kFALSE),
+  fBasicObjects(kFALSE),
+  fcarbonfiberjunction(),
+  fcoolingtubesupport(),
+  fhybridmatrix(),
+  fssdcoolingblocksystem(),
+  fcoolingblocksystematrix(),
+  fssdstiffenerflex(),
+  fssdendflex(),
+  fcoolingtube(0),
+  fendladdercoolingtubesupportmatrix(),
+  fendladdermountingblock(),
+  fendladdermountingblockclip(),
+  fSSDSensor5(),
+  fSSDSensor6(),
+  fSSDLayer5(),        
+  fSSDLayer6(),
+  fMotherVol(),
+  fLay5LadderSupportRing(),
+  fLay6LadderSupportRing(),
+  fgkEndCapSupportSystem(),
+  fSSDCone(),
   fColorCarbonFiber(4),
   fColorRyton(5),
-  fColorPhynox(5),
+  fColorPhynox(14),
   fColorSilicon(3),
-  fColorAl(7),
+  fColorAl(38),
+  fColorNiSn(40),
   fColorKapton(6),
   fColorPolyhamide(5),
   fColorStiffener(9),
-  fColorEpoxy(30)
+  fColorEpoxy(30),
+  fColorWater(7),
+  fColorG10(41)
 {
   ////////////////////////
   // Standard constructor
   ////////////////////////
-  CreateMaterials();
-}
-/////////////////////////////////////////////////////////////////////////////////
-AliITSv11GeometrySSD::AliITSv11GeometrySSD(const AliITSv11GeometrySSD &s):
-  AliITSv11Geometry(s.GetDebug()),
-  fSSDChipMedium(s.fSSDChipMedium),
-  fSSDChipGlueMedium(s.fSSDChipGlueMedium),
-  fSSDStiffenerMedium(s.fSSDStiffenerMedium),
-  fSSDStiffenerConnectorMedium(s.fSSDStiffenerConnectorMedium),
-  fSSDStiffener0603CapacitorMedium(s.fSSDStiffener0603CapacitorMedium),
-  fSSDStiffener1812CapacitorMedium(s.fSSDStiffener1812CapacitorMedium),
-  fSSDStiffenerHybridWireMedium(s.fSSDStiffenerHybridWireMedium),
-  fSSDKaptonFlexMedium(s.fSSDKaptonFlexMedium),
-  fSSDAlTraceFlexMedium(s.fSSDAlTraceFlexMedium),
-  fSSDAlTraceLadderCableMedium(s.fSSDAlTraceLadderCableMedium),
-  fSSDKaptonLadderCableMedium(s.fSSDKaptonLadderCableMedium),
-  fSSDKaptonChipCableMedium(s.fSSDKaptonChipCableMedium),
-  fSSDAlTraceChipCableMedium(s.fSSDAlTraceChipCableMedium),
-  fSSDAlCoolBlockMedium(s.fSSDAlCoolBlockMedium),
-  fSSDSensorMedium(s.fSSDSensorMedium),
-  fSSDSensorSupportMedium(s.fSSDSensorSupportMedium),
-  fSSDCarbonFiberMedium(s.fSSDCarbonFiberMedium),
-  fSSDTubeHolderMedium(s.fSSDTubeHolderMedium),
-  fSSDCoolingTubeWater(s.fSSDCoolingTubeWater),
-  fSSDCoolingTubePhynox(s.fSSDCoolingTubePhynox),
-  fSSDMountingBlockMedium(s.fSSDMountingBlockMedium),
-  fMotherVol(s.fMotherVol),
-  fColorCarbonFiber(s.fColorCarbonFiber),
-  fColorRyton(s.fColorRyton),
-  fColorPhynox(s.fColorPhynox),
-  fColorSilicon(s.fColorSilicon),
-  fColorAl(s.fColorAl),
-  fColorKapton(s.fColorKapton),
-  fColorPolyhamide(s.fColorPolyhamide),
-  fColorStiffener(s.fColorStiffener),
-  fColorEpoxy(s.fColorEpoxy)
-{
-  ////////////////////////
-  // Copy Constructor
-  ////////////////////////
-  CreateMaterials();
-}
-/////////////////////////////////////////////////////////////////////////////////
-AliITSv11GeometrySSD& AliITSv11GeometrySSD::
-operator=(const AliITSv11GeometrySSD &s){
-  ////////////////////////
-  // Assignment operator
-  ////////////////////////
-  this->~AliITSv11GeometrySSD();
-  new(this) AliITSv11GeometrySSD(s); 
-  return *this;
-/*     
-  if(&s == this) return *this;
-  fMotherVol = s.fMotherVol;
-  return *this;
- */
-}
-/////////////////////////////////////////////////////////////////////////////////
-// Setting the transformation Matrices
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetSSDSensorSupportCombiTransMatrix(){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for SSD Sensor Support   
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters SSDSensorSupportAssembly:
-  ////////////////////////////////////////////////////////
-  const Double_t kssdsensorsupporttransx[3] = {-0.5*fgkSSDSensorSideSupportWidth,
-                                                                  0.5*fgkSSDSensorSideSupportWidth,
-                                                          0.5*fgkSSDSensorCenterSupportThickness[0]
-                                                                         -    fgkSSDSensorCenterSupportPosition}; 
-  const Double_t kssdsensorsupporttransy[3] = 
-                                                                          {0.5*fgkSSDSensorSideSupportThickness[0],
-                                                          -0.5*fgkSSDSensorSideSupportThickness[0]
-                                                              -fgkSSDModuleSensorSupportDistance,
-                                                           0.5*fgkSSDSensorCenterSupportWidth
-                                                                          -0.5*fgkSSDModuleSensorSupportDistance}; 
-  const Double_t kssdsensorsupporttransz[3] = {0.,0.,
-                                                                               fgkSSDSensorCenterSupportThickness[0]}; 
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters SSDSensorSupportAssembly:
-  ////////////////////////////////////////////////////////  
-  const Double_t kssdsensorsupportrotphi[3]   = {   0., 180., 270.};
-  const Double_t kssdsensorsupportrottheta[3] = {  90.,  90.,  90.};
-  const Double_t kssdsensorsupportrotpsi[3]   = {- 90.,- 90.,- 90.};
-  ////////////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of SSDSensorSupportAssembly:
-  ////////////////////////////////////////////////////////////////
-  char ssdsensorsupportcombitransname[40];
-  char ssdsensorsupportrotname[40];
-  TGeoCombiTrans *ssdsensorsupportlocalmatrix[fgkSSDSensorSupportCombiTransNumber];
-  for(Int_t i=0; i<fgkSSDSensorSupportCombiTransNumber; i++){ 
-               sprintf(ssdsensorsupportcombitransname,"SSDSensorSupportCombiTrans%i",i);
-               sprintf(ssdsensorsupportrotname,"SSDSensorSupportRot%i",i);
-               ssdsensorsupportlocalmatrix[i] =
-                                new TGeoCombiTrans(ssdsensorsupportcombitransname,
-                                                                       kssdsensorsupporttransx[i],
-                                                                       kssdsensorsupporttransy[i],
-                                                                       kssdsensorsupporttransz[i],
-                                                                       new TGeoRotation(ssdsensorsupportrotname,
-                                                                                                          kssdsensorsupportrotphi[i],
-                                                                                                          kssdsensorsupportrottheta[i],
-                                                                                                   kssdsensorsupportrotpsi[i]));
-           fSSDSensorSupportCombiTransMatrix[i] = ssdsensorsupportlocalmatrix[i];
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++){
+    fendladdermountingblockcombitrans[i] = NULL;
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetSSDModuleCombiTransMatrix(Double_t SSDChipCablesHeigth){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for SSD Module   
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters SSDModuleAssembly:
-  ////////////////////////////////////////////////////////
-  const Double_t kssdmoduletransx[7] = {0.5*fgkSSDStiffenerLength,
-                                                0.5*fgkSSDChipLength+0.5*(fgkSSDStiffenerLength
-                                      - (fgkSSDChipNumber*fgkSSDChipLength+(fgkSSDChipNumber-1)
-                                          * fgkSSDChipSeparationLength)),
-                                      - fgkSSDModuleStiffenerPosition[0]+0.5*fgkSSDSensorWidth,
-                                  0.5*(fgkSSDStiffenerLength-fgkSSDChipNumber*fgkSSDChipLength
-                                          -       (fgkSSDChipNumber-1)*fgkSSDChipSeparationLength),
-                               0.5*fgkSSDStiffenerLength-0.5*fgkSSDModuleSensorSupportDistance
-                          - fgkSSDCoolingBlockLength,
-                               0.5*(fgkSSDStiffenerLength+fgkSSDChipCablesLength[1]
-                          + (fgkSSDChipNumber-1)*fgkSSDChipCablesLength[0]),
-                               0.5*(fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength
-                          +(fgkSSDChipNumber-1)*fgkSSDChipSeparationLength)}; 
-  const Double_t kssdmoduletransy[7] = {0.5*fgkSSDStiffenerWidth,
-                                      0.5*fgkSSDChipWidth+(fgkSSDStiffenerWidth
-                                        - fgkSSDStiffenerToChipDist-fgkSSDChipWidth),
-                                    - fgkSSDModuleStiffenerPosition[1]+0.5*fgkSSDSensorLength,
-                                      fgkSSDStiffenerWidth,
-                                      0.,
-                                      fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1]
-                                        - fgkSSDStiffenerWidth
-                                    + fgkSSDStiffenerToChipDist+fgkSSDChipWidth,
-                                      fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1]
-                                        - fgkSSDStiffenerWidth}; 
-  const Double_t kssdmoduletransz[7] = {0.5*fgkSSDStiffenerHeight,
-                                    - 0.5*fgkSSDChipHeight,
-                                      0.5*fgkSSDSensorHeight-fgkSSDStiffenerHeight-fgkSSDChipHeight
-                                        - SSDChipCablesHeigth,
-                                    - 0.5*fgkSSDFlexHeight[0],
-                                      fgkSSDStiffenerHeight,
-                                    - fgkSSDChipHeight,
-                                    - 0.5*fgkSSDChipHeight}; 
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters SSDModuleAssembly:
-  ////////////////////////////////////////////////////////  
-  const Double_t kssdmodulerotphi[7]   = {   0.,   0.,  90.,   0.,   0.,  90., 180.};
-  const Double_t kssdmodulerottheta[7] = {   0.,   0.,   0.,   0.,   0.,   0.,   0.};
-  const Double_t kssdmodulerotpsi[7]   = {   0.,   0.,   0.,   0.,   0.,   0.,   0.};
-  ////////////////////////////////////////////////////////  
-  //Name of CombiTrans Transformation of SSDModuleAssembly:
-  ////////////////////////////////////////////////////////  
-  const char* ssdmodulecombitransname[7] = {"SSDStiffenerCombiTrans",
-                                                                                            "SSDChipCombiTrans",
-                                                                                          "SSDSensorCombiTrans",
-                                                                                           "SSDFlex0CombiTrans",
-                                                                                "SSDCoolingBlockCombiTrans",
-                                                                                  "SSDChipCablesCombiTrans",
-                                                                                       "SSDFlex1CombiTrans"};
-  const char* ssdmodulerotname[7] = {"SSDStiffenerRotName",
-                                                                                 "SSDChipRotName",
-                                                                               "SSDSensorRotName",
-                                                                                "SSDFlex0RotName",
-                                                                 "SSDCoolingBlockRotName",
-                                                                       "SSDChipCablesRotName",
-                                                                               "SSDFlex1RotName"};
-  TGeoCombiTrans *ssdmodulelocalmatrix[fgkSSDModuleCombiTransNumber];
-  for(Int_t i=0; i<fgkSSDModuleCombiTransNumber; i++){ 
-                                       ssdmodulelocalmatrix[i] =
-                                       new TGeoCombiTrans(ssdmodulecombitransname[i],
-                                                                          kssdmoduletransx[i],
-                                                                          kssdmoduletransy[i],
-                                                                          kssdmoduletransz[i],
-                                                                          new TGeoRotation(ssdmodulerotname[i],
-                                                                                                                     kssdmodulerotphi[i],
-                                                                                                       kssdmodulerottheta[i],
-                                                                                                       kssdmodulerotpsi[i]));
-    fSSDModuleCombiTransMatrix[i] = ssdmodulelocalmatrix[i];
+  for (Int_t i=0; i < fgkcarbonfibersupportnumber; i++) {
+    fcarbonfibersupport[i] = 0;
+    fcarbonfibersupportmatrix[i] = 0;
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetCarbonFiberJunctionCombiTransMatrix(){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for Carbon Fiber Junction   
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters CarbonFiberJunction:
-  ////////////////////////////////////////////////////////
-  const Double_t kcarbonfiberjunctiontransx[3] = 
-                               {  0.0,fgkCarbonFiberTriangleLength,fgkCarbonFiberTriangleLength
-                                * TMath::Cos(fgkCarbonFiberTriangleAngle*TMath::DegToRad())};
-  const Double_t kcarbonfiberjunctiontransy[3] = 
-                                                                         {  0.0, 0.0,fgkCarbonFiberTriangleLength
-                                *   TMath::Sin(fgkCarbonFiberTriangleAngle*TMath::DegToRad())};
-  const Double_t kcarbonfiberjunctiontransz[3] = {  0.0,  0.0,  0.0};
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters CarbonFiberJunction:
-  ////////////////////////////////////////////////////////
-  const Double_t kcarbonfiberjunctionrotphi[3]   = {   0., 120., 240.};
-  const Double_t kcarbonfiberjunctionrottheta[3] = {   0.,   0.,   0.};
-  const Double_t kcarbonfiberjunctionrotpsi[3]   = {   0.,   0.,   0.};
-  ///////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of CarbonFiberJunction:
-  ///////////////////////////////////////////////////////////
-  char carbonfiberjunctioncombitransname[40];
-  char carbonfiberjunctionrotname[40];
-  TGeoCombiTrans *carbonfiberjunctionlocalmatrix[fgkCarbonFiberJunctionCombiTransNumber];
-  for(Int_t i=0; i<fgkCarbonFiberJunctionCombiTransNumber; i++) {
-               sprintf(carbonfiberjunctioncombitransname,"CarbonFiberJunctionCombiTrans%i",i);
-               sprintf(carbonfiberjunctionrotname,"CarbonFiberJunctionRot%i",i);
-               carbonfiberjunctionlocalmatrix[i] =
-                                       new TGeoCombiTrans(carbonfiberjunctioncombitransname,
-                                                                          kcarbonfiberjunctiontransx[i],
-                                                                          kcarbonfiberjunctiontransy[i],
-                                                                          kcarbonfiberjunctiontransz[i],
-                                                               new TGeoRotation(carbonfiberjunctionrotname,
-                                                                                               kcarbonfiberjunctionrotphi[i],
-                                                                                               kcarbonfiberjunctionrottheta[i],
-                                                                                               kcarbonfiberjunctionrotpsi[i]));
-    fCarbonFiberJunctionCombiTransMatrix[i] = carbonfiberjunctionlocalmatrix[i];
+  for (Int_t i=0; i < fgkcarbonfiberjunctionumber; i++) {
+    fcarbonfiberjunctionmatrix[i] = 0;
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetEndLadderCarbonFiberJunctionCombiTransMatrix(Int_t i){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for End Ladder Carbon Fiber Junction   
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters EndLadderCarbonFiberJunction:
-  ////////////////////////////////////////////////////////
-  const Double_t kendladdercarbonfiberjunctiontransx[3] = 
-                               {  0.0,fgkCarbonFiberTriangleLength,fgkCarbonFiberTriangleLength
-               *            TMath::Cos(fgkCarbonFiberTriangleAngle*TMath::DegToRad())};
-  const Double_t kendladdercarbonfiberjunctiontransy[3] = 
-                                                                               {  0.0, 0.0,fgkCarbonFiberTriangleLength
-               *            TMath::Sin(fgkCarbonFiberTriangleAngle*TMath::DegToRad())};
-  const Double_t kendladdercarbonfiberjunctiontransz[3] = {  0.0,  0.0,  
-                                                  0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[i]
-                                                          -fgkEndLadderCarbonFiberUpperJunctionLength[i])};
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters EndLadderCarbonFiberJunction:
-  ////////////////////////////////////////////////////////
-  const Double_t kendladdercarbonfiberjunctionrotphi[3]   = {   0., 120., 240.};
-  const Double_t kendladdercarbonfiberjunctionrottheta[3] = {   0.,   0.,   0.};
-  const Double_t kendladdercarbonfiberjunctionrotpsi[3]   = {   0.,   0.,   0.};
-  ///////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of CarbonFiberJunction:
-  ///////////////////////////////////////////////////////////
-  char endladdercarbonfiberjunctioncombitransname[40];
-  char endladdercarbonfiberjunctionrotname[40];
-  TGeoCombiTrans *endladdercarbonfiberjunctionlocalmatrix[fgkEndLadderCarbonFiberJunctionCombiTransNumber];
-  for(Int_t i=0; i<fgkEndLadderCarbonFiberJunctionCombiTransNumber; i++) {
-       sprintf(endladdercarbonfiberjunctioncombitransname,"EndLadderCarbonFiberJunctionCombiTrans%i",i);
-       sprintf(endladdercarbonfiberjunctionrotname,"EndLadderCarbonFiberJunctionRot%i",i);
-       endladdercarbonfiberjunctionlocalmatrix[i] =
-       new TGeoCombiTrans(endladdercarbonfiberjunctioncombitransname,
-                                                                                 kendladdercarbonfiberjunctiontransx[i],
-                                                                                 kendladdercarbonfiberjunctiontransy[i],
-                                                                                 kendladdercarbonfiberjunctiontransz[i],
-                                               new TGeoRotation(endladdercarbonfiberjunctionrotname,
-                                                                                 kendladdercarbonfiberjunctionrotphi[i],
-                                                                                   kendladdercarbonfiberjunctionrottheta[i],
-                                                                            kendladdercarbonfiberjunctionrotpsi[i]));
-    fEndLadderCarbonFiberJunctionCombiTransMatrix[i] = 
-                                                                        endladdercarbonfiberjunctionlocalmatrix[i];
+  for (Int_t i=0; i < fgkcarbonfiberlowersupportnumber; i++) {
+    fcarbonfiberlowersupport[i] = 0;
+    fcarbonfiberlowersupportrans[0] = 0;
   }
-}
-////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetCarbonFiberAssemblyCombiTransMatrix(){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for Carbon fiber Assembly   
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters CarbonFiberAssembly:
-  ////////////////////////////////////////////////////////
-  const Double_t kcarbonfiberassemblytransx[3] = {  0.0,  0.0,  0.0};
-  const Double_t kcarbonfiberassemblytransy[3] = 
-                                                                               {  0.5*fgkCarbonFiberJunctionWidth, 0.0, 
-                                       fgkCarbonFiberJunctionWidth-fgkCarbonFiberLowerSupportWidth
-                          -    fgkCarbonFiberLowerSupportVolumePosition[0]
-                          -    fgkCarbonFiberLowerSupportVolumePosition[1]};
-  const Double_t kcarbonfiberassemblytransz[3] = 
-                                                 {  0.0,  0.0,-  0.5*fgkCarbonFiberLowerSupportHeight};
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters CarbonFiberAssembly:
-  ////////////////////////////////////////////////////////
-  const Double_t kcarbonfiberassemblyrotphi[3]   = {   0.,  90.,   0.};
-  const Double_t kcarbonfiberassemblyrottheta[3] = {  90.,
-                                                                                       -fgkCarbonFiberTriangleAngle,   0.};
-  const Double_t kcarbonfiberassemblyrotpsi[3]   = {   0.,- 90.,   0.};
-  ///////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of CarbonFiberAssembly:
-  ///////////////////////////////////////////////////////////
-  char carbonfiberassemblycombitransname[30];
-  char carbonfiberassemblyrotname[30];
-  TGeoCombiTrans *carbonfiberassemblylocalmatrix[fgkCarbonFiberAssemblyCombiTransNumber];
-  for(Int_t i=0; i<fgkCarbonFiberAssemblyCombiTransNumber; i++) {
-       sprintf(carbonfiberassemblycombitransname,"CarbonFiberAssemblyCombiTrans%i",i);
-       sprintf(carbonfiberassemblyrotname,"CarbonFiberAssemblyRot%i",i);
-       carbonfiberassemblylocalmatrix[i] =
-                                               new TGeoCombiTrans(carbonfiberassemblycombitransname,
-                                                                                  kcarbonfiberassemblytransx[i],
-                                                                                  kcarbonfiberassemblytransy[i],
-                                                                                  kcarbonfiberassemblytransz[i],
-                                                new TGeoRotation(carbonfiberassemblyrotname,
-                                                                                  kcarbonfiberassemblyrotphi[i],
-                                                                                  kcarbonfiberassemblyrottheta[i],
-                                                                                  kcarbonfiberassemblyrotpsi[i]));
-    fCarbonFiberAssemblyCombiTransMatrix[i] = carbonfiberassemblylocalmatrix[i];
+  for (Int_t i=0; i < fgkvolumekind; i++) {
+    fssdsensorsupport[i] = 0;
+  }
+  for (Int_t i=0; i < fgkssdsensorsupportnumber; i++) {
+    fssdsensorsupportmatrix[i] = 0;
+  }
+  for (Int_t i=0; i < fgkcoolingtubesupportnumber; i++) {
+    fcoolingtubesupportmatrix[i] = 0;
+  }
+  for (Int_t i=0; i < fgkhybridcompnumber; i++) {
+    fssdhybridcomponent[i] = 0;
+  }
+  for (Int_t i=0; i < fgkcoolingblocknumber; i++) {
+    fcoolingblockmatrix[i] = 0;
+  }
+  for (Int_t i=0; i < fgkflexnumber; i++) {
+    fstiffenerflexmatrix[i] = 0;
+    fendflexmatrix[i] = 0;
+  }
+  for (Int_t i=0; i < fgkendladdercoolingtubenumber; i++) {
+    fendladdercoolingtube[i] = 0;
+    for (Int_t j = 0; j < 2; j++) 
+      fendladdercoolingtubematrix[i][j] = 0;
+  }
+  for (Int_t i=0; i < fgkendlabbercarbonfiberjunctionumber; i++) {
+    fendladdercarbonfiberjunction[i] = 0;
+  }
+  for (Int_t i=0; i < fgkendladdercarbonfiberjunctionmatrixnumber; i++) {
+    fendladdercarbonfiberjunctionmatrix[i] = 0;
+  }
+  for (Int_t i=0; i < fgkendladdercarbonfibermatrixnumber; i++) {
+    fendladdercarbonfibermatrix[i] = 0;
+  }
+  for (Int_t i=0; i < fgkendladdermountingblocknumber; i++) {
+    fendladdermountingblockclipmatrix[i] = 0;
+  }
+  for (Int_t i = 0; i < fgkendladderlowersuppnumber+1; i++) {
+    fendladderlowersupptrans[i] = 0;
+  }
+  for (Int_t i = 0; i < fgkladdercablesnumber; i++) {
+    fladdercablematrix[i] = 0;
+  }
+  for (Int_t i = 0; i < fgkladdersegmentnumber; i++) {
+    fladdersegment[i] = 0;
+  }
+  for (Int_t i = 0; i < fgkladdernumber; i++) {
+    fladder[i] = 0;
+    fladdermatrix[i] = 0;
+    fssdsensormatrix[i] = 0;
+    flayermatrix[i] = 0;
+  }
+  for (Int_t i = 0; i < 2; i++) {
+    fLay5LadderSupport[i] = 0;
+    fLay6LadderSupport[i] = 0;
+    fcoolingtubematrix[i] = NULL;
+    fendladdersegment[i] = NULL;
+    fendladdersegmentmatrix[i] = NULL;
   }
 }
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetCoolingTubeSupportCombiTransMatrix(){
+
+///////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::CreateTransformationMatrices(){
+  ///////////////////////////////////////////////////////////////////////  
+  // Method generating the trasformation matrix for the whole SSD Geometry   
+  ///////////////////////////////////////////////////////////////////////  
+  // Setting some variables for Carbon Fiber Supportmatrix creation
+  //////////////////////////////////////////////////////////////////////
+  Double_t carbonfibersupportxaxisEdgeproj = fgkCarbonFiberSupportEdgeLength
+                                                                                  * CosD(fgkCarbonFiberJunctionAngle[0]);
+  Double_t symmetryplaneposition = (fgkCarbonFiberSupportYAxisLength
+                                                                +      fgkCarbonFiberSupportTopEdgeDist[0]
+                                                                +      fgkCarbonFiberSupportWidth);
+  Double_t carbonfibersupportheight = carbonfibersupportxaxisEdgeproj
+                                                                       * TanD(fgkCarbonFiberJunctionAngle[0]);
+  TGeoRotation* carbonfiberot[3];
+  for(Int_t i=0; i<3; i++) carbonfiberot[i] = new TGeoRotation();
+  carbonfiberot[0]->SetAngles(0.0,180.0,0.0);
+  carbonfiberot[1]->SetAngles(90.,-fgkCarbonFiberTriangleAngle,-90.);
+  carbonfiberot[2]->SetRotation((*carbonfiberot[1])*(*carbonfiberot[0]));
+  Double_t transvector[3] = {fgkCarbonFiberTriangleLength
+                                                 *  CosD(fgkCarbonFiberTriangleAngle),0.,
+                                                 -  fgkCarbonFiberTriangleLength
+                                                 *      SinD(fgkCarbonFiberTriangleAngle)};
+  ///////////////////////////////////////////
+  //Setting Local Translations and Rotations: 
+  ///////////////////////////////////////////
+  TGeoCombiTrans* localcarbonfibersupportmatrix[3]; 
+  localcarbonfibersupportmatrix[0] = new TGeoCombiTrans(0.0,0.0,
+                                                                        0.5*carbonfibersupportheight,NULL);    
+  localcarbonfibersupportmatrix[1] = new TGeoCombiTrans(transvector[0],
+                                                                        2.*symmetryplaneposition+transvector[1],
+                                                                        transvector[2], carbonfiberot[2]);
+  localcarbonfibersupportmatrix[2] = new TGeoCombiTrans(*carbonfiberot[1]);
+  /////////////////////////////////////////////////////////////
+  // Carbon Fiber Support Transformations
+  /////////////////////////////////////////////////////////////
+  const Int_t kcarbonfibersupportmatrixnumber[2] = {2,3};
+  for(Int_t i=0; i<fgkcarbonfibersupportnumber; i++){ 
+               fcarbonfibersupportmatrix[i] = new TGeoHMatrix();
+               for(Int_t j=0; j<kcarbonfibersupportmatrixnumber[i]; j++)
+                       fcarbonfibersupportmatrix[i]->MultiplyLeft(localcarbonfibersupportmatrix[i==0?2*j:j]);
+  }            
+  /////////////////////////////////////////////////////////////
+  // Carbon Fiber Junction Transformation
+  /////////////////////////////////////////////////////////////
+  const Int_t kcarbonfiberjunctionmatrixnumber = 2;
+  TGeoCombiTrans** localcarbonfiberjunctionmatrix[fgkcarbonfiberjunctionumber];
+  TGeoRotation** localcarbonfiberjunctionrot[fgkcarbonfiberjunctionumber];
+  TGeoTranslation** localcarbonfiberjunctiontrans[fgkcarbonfiberjunctionumber];
+  for(Int_t i=0; i<fgkcarbonfiberjunctionumber; i++){ 
+       localcarbonfiberjunctionmatrix[i] = 
+                                               new TGeoCombiTrans*[kcarbonfiberjunctionmatrixnumber];
+       localcarbonfiberjunctionrot[i] = 
+                                               new TGeoRotation*[kcarbonfiberjunctionmatrixnumber];
+       localcarbonfiberjunctiontrans[i] = 
+                                               new TGeoTranslation*[kcarbonfiberjunctionmatrixnumber];
+  }
+  ///////////////////////
+  // Setting Translations
+  ///////////////////////
+  localcarbonfiberjunctiontrans[0][0] = new TGeoTranslation(0.,0.,0.);
+  localcarbonfiberjunctiontrans[1][0] = 
+                                new TGeoTranslation(fgkCarbonFiberTriangleLength,0.0,0.0);
+  localcarbonfiberjunctiontrans[2][0] = 
+                                new TGeoTranslation(fgkCarbonFiberTriangleLength
+                                * TMath::Cos(fgkCarbonFiberTriangleAngle*TMath::DegToRad()),
+                                fgkCarbonFiberTriangleLength
+                                * TMath::Sin(fgkCarbonFiberTriangleAngle*TMath::DegToRad()),0.0);
+  localcarbonfiberjunctiontrans[0][1] = 
+                                new TGeoTranslation(0.0,0.5*fgkCarbonFiberJunctionWidth,0.0);
+  localcarbonfiberjunctiontrans[1][1] = 
+                                new TGeoTranslation(*localcarbonfiberjunctiontrans[0][1]);
+  localcarbonfiberjunctiontrans[2][1] = 
+                                new TGeoTranslation(*localcarbonfiberjunctiontrans[0][1]);
+  ////////////////////
+  // Setting Rotations
+  ////////////////////
+  for(Int_t i=0; i<fgkcarbonfiberjunctionumber; i++)
+               for(Int_t j=0; j<kcarbonfiberjunctionmatrixnumber; j++)
+                       localcarbonfiberjunctionrot[i][j] = new TGeoRotation();
+  for(Int_t i=0; i<fgkcarbonfiberjunctionumber; i++)
+       localcarbonfiberjunctionrot[i][0]->SetAngles(120.*i,0.0,0.0);
+  localcarbonfiberjunctionrot[0][1]->SetAngles(0.0,90.0,0.0);
+  localcarbonfiberjunctionrot[1][1]->SetRotation(*localcarbonfiberjunctionrot[0][1]);
+  localcarbonfiberjunctionrot[2][1]->SetRotation(*localcarbonfiberjunctionrot[0][1]);
+  ////////////////////////////////////////
+  // Setting Carbon Fiber Junction matrix 
+  ////////////////////////////////////////
+  for(Int_t i=0; i<fgkcarbonfiberjunctionumber; i++){
+               fcarbonfiberjunctionmatrix[i] = new TGeoHMatrix();
+               for(Int_t j=0; j<kcarbonfiberjunctionmatrixnumber; j++){
+                       localcarbonfiberjunctionmatrix[i][j] = 
+                       new TGeoCombiTrans(*localcarbonfiberjunctiontrans[i][j],
+                                                          *localcarbonfiberjunctionrot[i][j]);
+                   fcarbonfiberjunctionmatrix[i]->MultiplyLeft(localcarbonfiberjunctionmatrix[i][j]);
+        }
+  }
+  /////////////////////////////////////////////////////////////
+  // Carbon Fiber Lower Support Transformations
   /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for Cooling Tube Support   
+  TGeoTranslation* localcarbonfiberlowersupportrans[2];
+  localcarbonfiberlowersupportrans[0] = new TGeoTranslation(0.0,
+                                                                        fgkCarbonFiberLowerSupportVolumePosition[1]
+                                                               +    fgkCarbonFiberLowerSupportVolumePosition[0],
+                                                                        0.0);
+  localcarbonfiberlowersupportrans[1] = new TGeoTranslation(0.0,
+                                                                        fgkCarbonFiberJunctionWidth
+                                                               -    fgkCarbonFiberLowerSupportWidth
+                                                               -    fgkCarbonFiberLowerSupportVolumePosition[0]
+                                                               -    fgkCarbonFiberLowerSupportVolumePosition[1],
+                                                               -    0.5*fgkCarbonFiberLowerSupportHeight);
+   localcarbonfiberlowersupportrans[0]->Add(localcarbonfiberlowersupportrans[1]);
+   fcarbonfiberlowersupportrans[0] = 
+                                               new TGeoTranslation(*localcarbonfiberlowersupportrans[0]);
+   fcarbonfiberlowersupportrans[1] = 
+                                               new TGeoTranslation(*localcarbonfiberlowersupportrans[1]);
   /////////////////////////////////////////////////////////////
-  //Translation Parameters CoolingTubeSupport:
-  ////////////////////////////////////////////////////////
+  // SSD Sensor Support Transformations
+  /////////////////////////////////////////////////////////////
+  const Int_t kssdsensorsupportmatrixnumber = 3;
+  TGeoCombiTrans** localssdsensorsupportmatrix[fgkssdsensorsupportnumber];
+  TGeoRotation** localssdsensorsupportrot[fgkssdsensorsupportnumber];
+  TGeoTranslation** localssdsensorsupportrans[fgkssdsensorsupportnumber];
+  for(Int_t i=0; i<fgkssdsensorsupportnumber; i++){ 
+       localssdsensorsupportmatrix[i] = 
+                                               new TGeoCombiTrans*[kssdsensorsupportmatrixnumber];
+       localssdsensorsupportrot[i] = 
+                                               new TGeoRotation*[kssdsensorsupportmatrixnumber];
+       localssdsensorsupportrans[i] = 
+                                               new TGeoTranslation*[kssdsensorsupportmatrixnumber];
+  }
+  ///////////////////////
+  // Setting Translations
+  ///////////////////////
+  localssdsensorsupportrans[0][0] = new TGeoTranslation(0.0,
+                                                                         0.5*fgkSSDSensorSideSupportWidth,
+                                                                         0.0);
+  localssdsensorsupportrans[1][0] = 
+                                                new TGeoTranslation(*localssdsensorsupportrans[0][0]);
+  localssdsensorsupportrans[2][0] = 
+                                                new TGeoTranslation(*localssdsensorsupportrans[0][0]);
+  localssdsensorsupportrans[0][1] = 
+                                                new TGeoTranslation(-0.5*fgkSSDSensorSideSupportWidth,
+                                                                               0.5*fgkSSDSensorSideSupportThickness[0],
+                                                                               0.0);
+  localssdsensorsupportrans[1][1] = 
+                                                new TGeoTranslation(0.5*fgkSSDSensorSideSupportWidth,
+                                                                       -   0.5*fgkSSDSensorSideSupportThickness[0]
+                                                                   -   fgkSSDModuleSensorSupportDistance,
+                                                                               0.0);
+  localssdsensorsupportrans[2][1] = 
+                                                new TGeoTranslation(0.5*fgkSSDSensorCenterSupportThickness[0]
+                                                                       -    fgkSSDSensorCenterSupportPosition,
+                                                                                0.5*fgkSSDSensorCenterSupportWidth
+                                                                       -    0.5*fgkSSDModuleSensorSupportDistance,
+                                                                                fgkSSDSensorCenterSupportThickness[0]);
+  localssdsensorsupportrans[0][2] = 
+                                                new TGeoTranslation(fgkCarbonFiberTriangleLength
+                                                                       +    fgkCarbonFiberJunctionToSensorSupport,
+                                                                                fgkCarbonFiberJunctionWidth
+                                                                   -    0.5*(fgkCarbonFiberLowerSupportWidth
+                                                                       +    fgkSSDSensorCenterSupportLength
+                                                                       -    fgkSSDSensorCenterSupportThickness[0])
+                                                                       -    fgkSSDSensorCenterSupportPosition,
+                                                                            0.0);
+  localssdsensorsupportrans[1][2] = 
+                                               new TGeoTranslation(*localssdsensorsupportrans[0][2]);
+  localssdsensorsupportrans[2][2] = 
+                                               new TGeoTranslation(*localssdsensorsupportrans[0][2]);
+  ////////////////////
+  // Setting Rotations
+  ////////////////////
+  for(Int_t i=0; i<fgkssdsensorsupportnumber; i++)
+               for(Int_t j=0; j<kssdsensorsupportmatrixnumber; j++)
+                       localssdsensorsupportrot[i][j] = new TGeoRotation();
+  for(Int_t i=0; i<fgkssdsensorsupportnumber; i++){
+       localssdsensorsupportrot[i][0]->SetAngles(0.0,90.0,0.0);
+       localssdsensorsupportrot[i][2]->SetAngles(-90.0,0.0,0.0);
+  }
+  localssdsensorsupportrot[0][1]->SetAngles(0.0,90.0,-90.0);
+  localssdsensorsupportrot[1][1]->SetAngles(180.0,90.0,-90.0);
+  localssdsensorsupportrot[2][1]->SetAngles(270.0,90.0,-90.0);
+  ////////////////////////////////////////
+  // SSD Sensor Support matrix 
+  ////////////////////////////////////////
+  for(Int_t i=0; i<fgkssdsensorsupportnumber; i++){
+               fssdsensorsupportmatrix[i] = new TGeoHMatrix();
+               for(Int_t j=0; j<kssdsensorsupportmatrixnumber; j++){
+                       localssdsensorsupportmatrix[i][j] = 
+                       new TGeoCombiTrans(*localssdsensorsupportrans[i][j],
+                                                          *localssdsensorsupportrot[i][j]);
+                   fssdsensorsupportmatrix[i]->MultiplyLeft(localssdsensorsupportmatrix[i][j]);
+        }
+  }
+  /////////////////////////////////////////////////////////////
+  // SSD Cooling Tube Support Transformations
+  /////////////////////////////////////////////////////////////
+  const Int_t kcoolingtubesupportmatrixnumber = 2;
+  TGeoCombiTrans* localcoolingtubesupportmatrix[kcoolingtubesupportmatrixnumber];
+  TGeoTranslation* localcoolingtubesupportrans[kcoolingtubesupportmatrixnumber];
+  TGeoRotation* localcoolingtubesupportrot[kcoolingtubesupportmatrixnumber];
   Double_t phi = TMath::ASin(0.5*fgkCoolingTubeSupportHeight
                                                                                                        /fgkCoolingTubeSupportRmax);
-  const Double_t kcoolingtubesupporttransx[2] = 
-                                                 {0.,2.*fgkCoolingTubeSupportRmax*TMath::Cos(phi)
+  localcoolingtubesupportrans[0] = 
+                       new TGeoTranslation(2.*fgkCoolingTubeSupportRmax*TMath::Cos(phi)
                                                +  2.*(fgkCoolingTubeSupportLength
                                                -  fgkCoolingTubeSupportRmax*(1.+TMath::Cos(phi)))
                                                +  fgkCarbonFiberTriangleLength
-                                               -  2.0*fgkCarbonFiberJunctionLength};
-  const Double_t kcoolingtubesupporttransy[2] = {  0.0,  0.0};
-  const Double_t kcoolingtubesupporttransz[2] = {  0.0,  0.0};
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters CoolingTubeSupport:
-  ////////////////////////////////////////////////////////
-  const Double_t kcoolingsubesupportrotphi[2]   = {   0., 180.};
-  const Double_t kcoolingsubesupportrottheta[2] = {   0.,   0.};
-  const Double_t kcoolingsubesupportrotpsi[2]   = {   0.,   0.};
-  ///////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of CarbonFiberJunction:
-  ///////////////////////////////////////////////////////////
-  char coolingtubesupportcombitransname[40];
-  char coolingtubesupportrotname[40];
-  TGeoCombiTrans *coolingtubesupportlocalmatrix[fgkCoolingTubeSupportCombiTransNumber];
-  for(Int_t i=0; i<fgkCoolingTubeSupportCombiTransNumber; i++) {
-       sprintf(coolingtubesupportcombitransname,"CoolingTubeSupportCombiTrans%i",i);
-       sprintf(coolingtubesupportrotname,"CoolingTubeSupportRot%i",i);
-       coolingtubesupportlocalmatrix[i] =
-                       new TGeoCombiTrans(coolingtubesupportcombitransname,
-                                                          kcoolingtubesupporttransx[i],
-                                                          kcoolingtubesupporttransy[i],
-                                                          kcoolingtubesupporttransz[i],
-                                                          new TGeoRotation(coolingtubesupportrotname,
-                                                                                               kcoolingsubesupportrotphi[i],
-                                                                                               kcoolingsubesupportrottheta[i],
-                                                                                               kcoolingsubesupportrotpsi[i]));
-    fCoolingTubeSupportCombiTransMatrix[i] = coolingtubesupportlocalmatrix[i];
+                                               -  2.0*fgkCarbonFiberJunctionLength,0.0,0.0);
+  localcoolingtubesupportrans[1] = 
+                       new TGeoTranslation(fgkCarbonFiberJunctionLength
+                                       - (fgkCoolingTubeSupportLength-fgkCoolingTubeSupportRmax),
+                                       - (2.0*fgkSSDSensorLength-fgkSSDSensorOverlap)+
+                                                  fgkSSDModuleStiffenerPosition[1]+fgkSSDStiffenerWidth
+                    +  0.5*fgkSSDFlexHoleLength+2.*fgkCarbonFiberJunctionWidth
+                    -  0.5*(fgkCarbonFiberLowerSupportWidth
+                                       +          fgkSSDSensorCenterSupportLength
+                    -      fgkSSDSensorCenterSupportThickness[0])
+                                       +  0.5*fgkSSDSensorLength,
+                                       -  0.5*fgkCoolingTubeSupportHeight);  
+  for(Int_t i=0; i<kcoolingtubesupportmatrixnumber; i++)     
+  localcoolingtubesupportrot[i] = new TGeoRotation();
+  localcoolingtubesupportrot[0]->SetAngles(180.0,0.0,0.0);
+  localcoolingtubesupportrot[1]->SetAngles(0.0,90.0,0.0);
+  for(Int_t i=0; i<kcoolingtubesupportmatrixnumber; i++)
+       localcoolingtubesupportmatrix[i] = 
+               new TGeoCombiTrans(*localcoolingtubesupportrans[i],
+                                                  *localcoolingtubesupportrot[i]);
+  fcoolingtubesupportmatrix[0] = new TGeoHMatrix(*localcoolingtubesupportmatrix[1]);
+  fcoolingtubesupportmatrix[1] = new TGeoHMatrix((*localcoolingtubesupportmatrix[1])*
+                                                               (*localcoolingtubesupportmatrix[0]));
+  /////////////////////////////////////////////////////////////
+  // End Ladder SSD Cooling Tube Support Transformations
+  /////////////////////////////////////////////////////////////
+  TGeoTranslation** localendladdercooltubetrans[2];
+  localendladdercooltubetrans[0] = new TGeoTranslation*[4];
+  localendladdercooltubetrans[1] = new TGeoTranslation*[2];
+  for(Int_t i=0; i<4; i++) localendladdercooltubetrans[0][i] = new TGeoTranslation();
+  localendladdercooltubetrans[0][0]->SetTranslation(fgkCarbonFiberJunctionLength
+                                                                                       -          (fgkCoolingTubeSupportLength
+                                                                                       -               fgkCoolingTubeSupportRmax),
+                                                                                                       fgkEndLadderMountingBlockPosition[0]
+                                                                                       -               fgkendladdercoolingsupportdistance[0]
+                                                                                       +   0.5*fgkCoolingTubeSupportWidth,
+                                                                                       -   0.5*fgkCoolingTubeSupportHeight);
+  localendladdercooltubetrans[0][1]->SetTranslation(fgkCarbonFiberJunctionLength
+                                                                                       -          (fgkCoolingTubeSupportLength
+                                                                                       -               fgkCoolingTubeSupportRmax),
+                                                                                                       fgkEndLadderMountingBlockPosition[0]
+                                                                                       +               fgkendladdercoolingsupportdistance[1]
+                                                                                       +   0.5*fgkCoolingTubeSupportWidth,
+                                                                                       -   0.5*fgkCoolingTubeSupportHeight);
+  localendladdercooltubetrans[0][2]->SetTranslation(2*(fgkCoolingTubeSupportLength
+                                                                                       -       fgkCoolingTubeSupportRmax)
+                                                                                       +               fgkCarbonFiberTriangleLength
+                                                                                       -   2.0*fgkCarbonFiberJunctionLength,
+                                                                                               0.0,
+                                                                                               0.0);
+  localendladdercooltubetrans[0][3]->SetTranslation(0.0,
+                                                                                                       fgkendladdercoolingsupportdistance[0]
+                                                                                       +               fgkendladdercoolingsupportdistance[1],
+                                                                                                       0.0);
+  for(Int_t i=0; i<2; i++) localendladdercooltubetrans[1][i] = new TGeoTranslation();
+  localendladdercooltubetrans[1][0]->SetTranslation(fgkCoolingTubeSupportRmax
+                                                                                       +               fgkCarbonFiberJunctionLength
+                                                                                       -               fgkCoolingTubeSupportLength,
+                                                                                                       fgkEndLadderCarbonFiberLowerJunctionLength[1]
+                                                                                       -       0.5*fgkCoolingTubeSupportWidth
+                                                                                                  -fgkendladdercoolingsupportdistance[2],
+                                                                                       -   0.5*fgkCoolingTubeSupportHeight);
+  localendladdercooltubetrans[1][1]->SetTranslation(fgkCarbonFiberTriangleLength
+                                                                                       +               fgkCoolingTubeSupportLength
+                                                                                       -               fgkCoolingTubeSupportRmax
+                                                                                       -               fgkCarbonFiberJunctionLength,
+                                                                                                       fgkEndLadderCarbonFiberLowerJunctionLength[1]
+                                                                                       -       0.5*fgkCoolingTubeSupportWidth
+                                                                                       -               fgkendladdercoolingsupportdistance[2],
+                                                                                       -   0.5*fgkCoolingTubeSupportHeight);
+  fendladdercoolingtubesupportmatrix = new TGeoHMatrix**[kcoolingtubesupportmatrixnumber];
+  fendladdercoolingtubesupportmatrix[0] = new TGeoHMatrix*[4];
+  fendladdercoolingtubesupportmatrix[1] = new TGeoHMatrix*[2];
+  fendladdercoolingtubesupportmatrix[0][0] = new TGeoHMatrix((*localendladdercooltubetrans[0][0])*
+  (*localcoolingtubesupportrot[1]));
+  fendladdercoolingtubesupportmatrix[0][1] = new TGeoHMatrix((*localendladdercooltubetrans[0][1])*
+  (*localcoolingtubesupportrot[1]));
+  fendladdercoolingtubesupportmatrix[0][2] = new TGeoHMatrix(*fendladdercoolingtubesupportmatrix[0][0]);
+  fendladdercoolingtubesupportmatrix[0][2]->Multiply(localcoolingtubesupportrot[0]);
+  fendladdercoolingtubesupportmatrix[0][2]->MultiplyLeft(localendladdercooltubetrans[0][2]);
+  fendladdercoolingtubesupportmatrix[0][3] = new TGeoHMatrix(*fendladdercoolingtubesupportmatrix[0][2]);
+  fendladdercoolingtubesupportmatrix[0][3]->MultiplyLeft(localendladdercooltubetrans[0][3]);
+
+  fendladdercoolingtubesupportmatrix[1][0] =   
+                                                       new TGeoHMatrix((*localendladdercooltubetrans[1][0])
+                                                                                  *(*localcoolingtubesupportrot[1]));
+  fendladdercoolingtubesupportmatrix[1][1] = new TGeoHMatrix(*localcoolingtubesupportrot[1]);
+  fendladdercoolingtubesupportmatrix[1][1]->Multiply(localcoolingtubesupportrot[0]);
+  fendladdercoolingtubesupportmatrix[1][1]->MultiplyLeft(localendladdercooltubetrans[1][1]);
+  /////////////////////////////////////////////////////////////
+  // SSD Cooling Tube Transformations
+  /////////////////////////////////////////////////////////////
+  TGeoRotation* localcoolingtuberot = new TGeoRotation();      
+  localcoolingtuberot->SetAngles(0.,90.,0.);
+  TGeoTranslation* localcoolingtubetrans[2];
+  TVector3* localcoolingtubevect[2];
+
+  localcoolingtubevect[0] = new TVector3(-0.5*(fgkCoolingTubeSeparation
+                                                 -fgkCarbonFiberTriangleLength),
+                                           fgkCarbonFiberJunctionWidth         // Y-coord is local Z, from sensor translation 
+                                           - fgkCarbonFiberLowerSupportWidth 
+                                           - fgkLowerSupportToSensorZ ,
+                                                 -  0.5*fgkCoolingTubeSupportHeight);  
+  localcoolingtubevect[1] = new TVector3( -localcoolingtubevect[0]->X()+fgkCarbonFiberTriangleLength,
+                                             localcoolingtubevect[0]->Y(),
+                                             localcoolingtubevect[0]->Z());
+  for(Int_t j=0; j<2; j++){
+    localcoolingtubetrans[j] = 
+       new TGeoTranslation(localcoolingtubevect[j]->X(),
+                           localcoolingtubevect[j]->Y(),
+                           localcoolingtubevect[j]->Z());
+     fcoolingtubematrix[j] = new TGeoHMatrix((*localcoolingtubetrans[j])
+                                            *(*localcoolingtuberot));
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetCoolingTubeCombiTransMatrix(){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for Cooling Tube  
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters CoolingTube:
-  ////////////////////////////////////////////////////////
-  const Double_t kcoolingtubetransx[2] = {  0.,  fgkCoolingTubeSeparation};
-  const Double_t kcoolingtubetransy[2] = {  fgkCoolingTubeLength/2.0, fgkCoolingTubeLength/2.0};
-  const Double_t kcoolingtubetransz[2] = {  0.0,  0.};
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters CoolingTube:
-  ////////////////////////////////////////////////////////
-  const Double_t kcoolingtuberotphi[2]   = {   0.,   0.};
-  const Double_t kcoolingtuberottheta[2] = {  90.,  90.};
-  const Double_t kcoolingtuberotpsi[2]   = {   0.,   0.};
-  ///////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of CarbonFiberJunction:
-  ///////////////////////////////////////////////////////////
-  const char* coolingtubecombitransname[fgkCoolingTubeCombiTransNumber] = 
-                                                       {"CoolingTubeCombiTrans0","CoolingTubeCombiTrans1"};
-  const char* coolingtuberotationname[fgkCoolingTubeCombiTransNumber] = 
-                                                               {"CoolingTubeRotation0","CoolingTubeRotation1"};
-  TGeoCombiTrans *coolingtubelocalmatrix[fgkCoolingTubeCombiTransNumber];
-  for(Int_t i=0; i<fgkCoolingTubeCombiTransNumber; i++) {
-        coolingtubelocalmatrix[i] =
-                       new TGeoCombiTrans(coolingtubecombitransname[i],
-                                                          kcoolingtubetransx[i],
-                                                          kcoolingtubetransy[i],
-                                                          kcoolingtubetransz[i], 
-                                                          new TGeoRotation(coolingtuberotationname[i],
-                                                                           kcoolingtuberotphi[i],
-                                                                           kcoolingtuberottheta[i],
-                           kcoolingtuberotpsi[i]) );
-    fCoolingTubeTransMatrix[i] = coolingtubelocalmatrix[i];
+  /////////////////////////////////////////////////////////////
+  // SSD End Ladder Cooling Tube Transformations
+  /////////////////////////////////////////////////////////////
+  TGeoRotation* localendlladdercoolingtuberot = new TGeoRotation();    
+  localendlladdercoolingtuberot->SetAngles(0.,90.,0.);
+  TGeoTranslation** localendlladdercoolingtubetrans[2];
+  localendlladdercoolingtubetrans[0] = new TGeoTranslation*[2];
+  localendlladdercoolingtubetrans[1] = new TGeoTranslation*[2];
+  for(Int_t i=0; i<2; i++)     
+       for(Int_t j=0; j<2; j++)        
+               localendlladdercoolingtubetrans[i][j] = new TGeoTranslation();
+
+  Double_t sensZshift = 0.5*fgkCarbonFiberJunctionWidth - fgkCarbonFiberLowerSupportWidth - fgkLowerSupportToSensorZ;
+  localendlladdercoolingtubetrans[0][0]->SetTranslation(-(fgkCoolingTubeSupportLength
+                                                                       -        fgkCoolingTubeSupportRmax)
+                                                                       +        fgkCarbonFiberJunctionLength,
+                                                       0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[0]+sensZshift),
+                                                                       - 0.5*fgkCoolingTubeSupportHeight);
+  localendlladdercoolingtubetrans[0][1]->SetTranslation((fgkCoolingTubeSupportLength
+                                                                       -        fgkCoolingTubeSupportRmax)
+                                                                       -        fgkCarbonFiberJunctionLength
+                                                                       +    fgkCarbonFiberTriangleLength,
+                                                       0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[0]+sensZshift),
+                                                                       - 0.5*fgkCoolingTubeSupportHeight);
+
+  localendlladdercoolingtubetrans[1][0]->SetTranslation(-(fgkCoolingTubeSupportLength
+                                                         -   fgkCoolingTubeSupportRmax)
+                                                       +       fgkCarbonFiberJunctionLength,
+                                                       0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[1]-sensZshift),
+                                                 -             0.5*fgkCoolingTubeSupportHeight);        
+  localendlladdercoolingtubetrans[1][1]->SetTranslation((fgkCoolingTubeSupportLength
+                                                 -      fgkCoolingTubeSupportRmax)
+                                                 -      fgkCarbonFiberJunctionLength
+                                                 +    fgkCarbonFiberTriangleLength,
+                                                       0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[1]-sensZshift),
+                                                 -             0.5*fgkCoolingTubeSupportHeight);        
+  for(Int_t i=0; i<2; i++)
+       for(Int_t j=0; j<2; j++){
+               fendladdercoolingtubematrix[i][j] = new TGeoHMatrix(*localendlladdercoolingtuberot);
+               fendladdercoolingtubematrix[i][j]->MultiplyLeft(localendlladdercoolingtubetrans[i][j]); 
+       }
+  /////////////////////////////////////////////////////////////
+  // SSD Hybrid Components Transformations
+  /////////////////////////////////////////////////////////////
+  const Int_t khybridmatrixnumber = 3;
+  TGeoTranslation* localhybridtrans[khybridmatrixnumber];
+  localhybridtrans[0] = new TGeoTranslation(0.5*fgkSSDStiffenerLength,
+                                            0.5*fgkSSDStiffenerWidth,
+                                            0.5*fgkSSDStiffenerHeight);
+  localhybridtrans[1] = new TGeoTranslation(fgkSSDModuleStiffenerPosition[0],
+                                            fgkSSDModuleStiffenerPosition[1],0.0);
+
+  localhybridtrans[2] = new TGeoTranslation(
+                      -  0.5*(fgkSSDSensorWidth-fgkCarbonFiberTriangleLength),
+                      -      (2.*fgkSSDSensorLength-fgkSSDSensorOverlap)+
+                              fgkSSDModuleStiffenerPosition[1]+fgkSSDStiffenerWidth
+                      +                0.5*fgkSSDFlexHoleLength+2.*fgkCarbonFiberJunctionWidth
+                      -                0.5*(fgkCarbonFiberLowerSupportWidth+fgkSSDSensorCenterSupportLength
+                      -       fgkSSDSensorCenterSupportThickness[0]),
+                      -      (fgkSSDModuleCoolingBlockToSensor+0.5*fgkCoolingTubeSupportHeight
+                      -       fgkSSDSensorHeight-fgkSSDChipCablesHeight[3]-fgkSSDChipHeight
+                                         -       fgkSSDModuleVerticalDisalignment)); 
+  fhybridmatrix = new TGeoHMatrix();
+  for(Int_t i=0; i<khybridmatrixnumber; i++) fhybridmatrix->MultiplyLeft(localhybridtrans[i]);
+  /////////////////////////////////////////////////////////////
+  // SSD Cooling Block Transformations
+  /////////////////////////////////////////////////////////////
+  TGeoTranslation localcoolingblocktrans (fcoolingtubematrix[0]->GetTranslation()[0] 
+                                         - 0.5*fgkSSDCoolingBlockLength,
+                                         fhybridmatrix->GetTranslation()[1]-0.5*fgkSSDStiffenerWidth,
+                                         fhybridmatrix->GetTranslation()[2]+0.5*fgkSSDStiffenerHeight+
+                                         0.5*(fgkSSDCoolingBlockHoleCenter+fgkCoolingTubeRmax));
+  fcoolingblocksystematrix = new TGeoHMatrix(localcoolingblocktrans);
+  /////////////////////////////////////////////////////////////
+  // SSD Stiffener Flex Transformations
+  /////////////////////////////////////////////////////////////
+  const Int_t klocalflexmatrixnumber = 4;
+  TGeoCombiTrans** localflexmatrix[fgkflexnumber];
+  for(Int_t i=0; i<fgkflexnumber; i++)    
+      localflexmatrix[i] = new TGeoCombiTrans*[klocalflexmatrixnumber];
+  for(Int_t i=0; i<fgkflexnumber; i++)
+      for(Int_t j =0; j<klocalflexmatrixnumber; j++) 
+            localflexmatrix[i][j] = new TGeoCombiTrans();
+  Double_t ssdstiffenerseparation = fgkSSDSensorLength
+                                                                 - 2.*fgkSSDModuleStiffenerPosition[1]
+                                                                 -    fgkSSDStiffenerWidth;
+  localflexmatrix[0][0]->SetTranslation(-fgkSSDFlexLength[0]
+                                        +0.5*fgkSSDStiffenerLength,
+                                         0.5*fgkSSDStiffenerWidth,
+                                        -0.5*fgkSSDStiffenerHeight
+                                        -0.5*fgkSSDFlexHeight[0]);
+  localflexmatrix[1][0]->SetTranslation(-(fgkSSDStiffenerLength-fgkSSDFlexLength[0])
+                                        +0.5*fgkSSDStiffenerLength,ssdstiffenerseparation
+                                        -0.5*fgkSSDStiffenerWidth,
+                                        -0.5*fgkSSDStiffenerHeight
+                                        -0.5*fgkSSDFlexHeight[0]);
+  TGeoRotation* localflexrot = new TGeoRotation();
+  localflexrot->SetAngles(180.,0.,0.);    
+  localflexmatrix[1][0]->SetRotation(localflexrot);
+  for(Int_t i=0; i<fgkflexnumber; i++)
+      for(Int_t j =1; j<klocalflexmatrixnumber; j++) 
+            localflexmatrix[i][j]->SetTranslation(*localhybridtrans[j-1]);
+  for(Int_t i=0; i<fgkflexnumber; i++){
+      fstiffenerflexmatrix[i] = new TGeoHMatrix();
+      for(Int_t j =0; j<klocalflexmatrixnumber; j++)   
+            fstiffenerflexmatrix[i]->MultiplyLeft(localflexmatrix[i][j]);
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetLadderSegmentCombiTransMatrix(){
   /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for SSD Ladder Segment   
+  // SSD End Flex Transformations
   /////////////////////////////////////////////////////////////
-  //Translation Parameters LadderSegment:
-  ////////////////////////////////////////////////////////
-       const Double_t kladdersegmenttransx[fgkLadderSegmentCombiTransNumber] = {  0.,
-        -  0.5*(fgkSSDSensorWidth-fgkCarbonFiberTriangleLength),
-                        fgkCarbonFiberTriangleLength+fgkCarbonFiberJunctionToSensorSupport,
-                        fgkCarbonFiberJunctionLength-(fgkCoolingTubeSupportLength
-        -       fgkCoolingTubeSupportRmax),
-               0.5*(fgkCarbonFiberTriangleLength-fgkCoolingTubeSeparation)}; 
-       const Double_t kladdersegmenttransy[fgkLadderSegmentCombiTransNumber] = {  0.,
-        -      (2.*fgkSSDSensorLength-fgkSSDSensorOverlap)+
-                        fgkSSDModuleStiffenerPosition[1]+fgkSSDStiffenerWidth
-        +               0.5*fgkSSDFlexHoleLength+2.*fgkCarbonFiberJunctionWidth
-        -               0.5*(fgkCarbonFiberLowerSupportWidth+fgkSSDSensorCenterSupportLength
-        -            fgkSSDSensorCenterSupportThickness[0]),
-                                 fgkCarbonFiberJunctionWidth-0.5*(fgkCarbonFiberLowerSupportWidth
-        +            fgkSSDSensorCenterSupportLength
-        -            fgkSSDSensorCenterSupportThickness[0])
-        -                        fgkSSDSensorCenterSupportPosition,
-                                 fgkCarbonFiberJunctionWidth-fgkCarbonFiberLowerSupportWidth
-        -                        fgkCoolingTubeSupportToCarbonFiber,
-                                                                                                0.0};
-       const Double_t kladdersegmenttransz[fgkLadderSegmentCombiTransNumber] = {  0.,
-        -        (fgkSSDModuleCoolingBlockToSensor+0.5*fgkCoolingTubeSupportHeight
-        -         fgkSSDSensorHeight-fgkSSDChipCablesHeight[3]-fgkSSDChipHeight),
-                                                                                                                                                        0.,
-        -     0.5*fgkCoolingTubeSupportHeight,
-        -     0.5*fgkCoolingTubeSupportHeight};
-//////////////////////////////////////////////////
-  //Rotational Parameters LadderSegment:
-  ////////////////////////////////////////////////////////
-  const Double_t kladdersegmentrotphi[fgkLadderSegmentCombiTransNumber]   =
-                                                                                                         {   0.,   0.,- 90.,   0.,  0.};
-  const Double_t kladdersegmentrottheta[fgkLadderSegmentCombiTransNumber] = 
-                                                                                                         {   0.,   0.,   0.,  90.,  0.};
-  const Double_t kladdersegmentrotpsi[fgkLadderSegmentCombiTransNumber]   = 
-                                                                                                         {   0.,   0.,   0.,   0.,  0.};
-  //////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of LadderSegment:
-  //////////////////////////////////////////////////////
-  char laddersegmentcombitransname[40];
-  char laddersegmentrotname[40];
-  TGeoCombiTrans *laddersegmentlocalmatrix[fgkLadderSegmentCombiTransNumber];
-  for(Int_t i=0; i<fgkLadderSegmentCombiTransNumber; i++) {
-               sprintf(laddersegmentcombitransname,"LadderSegmentCombiTrans%i",i);
-               sprintf(laddersegmentrotname,"LadderSegmentRot%i",i);
-               laddersegmentlocalmatrix[i] =
-                                       new TGeoCombiTrans(laddersegmentcombitransname,
-                                                                          kladdersegmenttransx[i],
-                                                                          kladdersegmenttransy[i],
-                                                                          kladdersegmenttransz[i],
-                                                                          new TGeoRotation(laddersegmentrotname,
-                                                                                                               kladdersegmentrotphi[i],
-                                                                                                               kladdersegmentrottheta[i],
-                                                                                                               kladdersegmentrotpsi[i]));
-    fLadderSegmentCombiTransMatrix[i] = laddersegmentlocalmatrix[i];
+  TGeoRotation* localendflexrot = new TGeoRotation();
+  localendflexrot->SetAngles(0.0,90.0,0.0);
+  TGeoCombiTrans* localendflexmatrix = new TGeoCombiTrans();
+  Double_t ssdflexradiusmax = (fgkSSDFlexLength[3]-fgkSSDFlexLength[2])
+                            /  TMath::Tan(fgkSSDFlexAngle*TMath::DegToRad());
+  Double_t ssdflexboxlength = fgkSSDFlexFullLength-2.*fgkSSDFlexAngle
+                            * TMath::DegToRad()*ssdflexradiusmax
+                                                              - fgkSSDFlexLength[2]-TMath::Pi()
+                                                              * fgkSSDStiffenerHeight-fgkSSDFlexLength[0]
+                                                                                  - 0.1*fgkSSDFlexFullLength;
+  Double_t trans = ssdflexboxlength*CosD(2.*fgkSSDFlexAngle)
+                            + (ssdflexradiusmax-fgkSSDStiffenerHeight)*SinD(2.*fgkSSDFlexAngle)
+                            +      fgkSSDFlexLength[2];
+  localendflexmatrix->SetTranslation(fgkSSDFlexLength[0]-trans,
+                              0.5*fgkSSDFlexWidth[0],
+                              2.*fgkSSDStiffenerHeight
+                            + 0.5*fgkSSDFlexHeight[0]);      
+  localendflexmatrix->SetRotation(localendflexrot);
+  for(Int_t i=0; i<fgkflexnumber; i++) 
+      fendflexmatrix[i] = new TGeoHMatrix((*fstiffenerflexmatrix[i])*(*localendflexmatrix));
+  /////////////////////////////////////////////////////////////
+  // End Ladder Carbon Fiber Junction
+  /////////////////////////////////////////////////////////////
+  TGeoCombiTrans** localendladdercarbonfiberjunctionmatrix[fgkendlabbercarbonfiberjunctionumber];
+  TGeoRotation** localendladdercarbonfiberjunctionrot[fgkendlabbercarbonfiberjunctionumber];    
+  TGeoTranslation** localendladdercarbonfiberjunctiontrans[fgkendlabbercarbonfiberjunctionumber];    
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++){
+      localendladdercarbonfiberjunctionmatrix[i] 
+            = new TGeoCombiTrans*[fgkendladdercarbonfiberjunctionmatrixnumber];
+      localendladdercarbonfiberjunctionrot[i] 
+            = new TGeoRotation*[fgkendladdercarbonfiberjunctionmatrixnumber];
+      localendladdercarbonfiberjunctiontrans[i] 
+            = new TGeoTranslation*[fgkendladdercarbonfiberjunctionmatrixnumber];
+      fendladdercarbonfiberjunctionmatrix[i]
+            = new TGeoHMatrix*[fgkendladdercarbonfiberjunctionmatrixnumber];
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetEndLadderSegmentCombiTransMatrix(Int_t i){
-  /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for SSD End Ladder Segment   
-  /////////////////////////////////////////////////////////////
-  //Translation Parameters EndLadderSegment:
-  ////////////////////////////////////////////////////////
-  const Double_t kendladdersegmenttransx[fgkEndLadderSegmentCombiTransNumber] =
-            {0.0,
-                                                                                         0.0,
-          -  0.25*(fgkSSDMountingBlockLength[0]
-                              +         fgkSSDMountingBlockLength[1])
-          +  0.5*fgkCarbonFiberTriangleLength,
-                                                                                         0.0}; 
-  const Double_t kendladdersegmenttransy[fgkEndLadderSegmentCombiTransNumber] = 
-                                                        {0.5*fgkEndLadderCarbonFiberLowerJunctionLength[i],
-            i==0 ? 0. : fgkCarbonFiberLowerSupportWidth,
-                        fgkEndLadderMountingBlockPosition[i],
-                                                  (1-i)*(fgkEndLadderMountingBlockPosition[i]
-                                                                                +  0.5*fgkSSDMountingBlockWidth)}; 
-  const Double_t kendladdersegmenttransz[fgkEndLadderSegmentCombiTransNumber] = 
-            {0.0,
-                                                                                         0.0,
-                                                                               -  fgkSSDMountingBlockHeight[1]
-                                                                               +  0.5*fgkSSDMountingBlockHeight[0],
-          -  0.5*fgkCarbonFiberLowerSupportHeight}; 
-  ////////////////////////////////////////////////////////
-  //Rotational Parameters EndLadderSegment:
-  ////////////////////////////////////////////////////////  
-  const Double_t kendladdersegmentrotphi[fgkEndLadderSegmentCombiTransNumber] =  
-            {   0.,  90.,   0.,   0.};
-  const Double_t kendladdersegmentrottheta[fgkEndLadderSegmentCombiTransNumber] = 
-            {  90.,-fgkCarbonFiberTriangleAngle, 0.,   0.};
-  const Double_t kendladdersegmentrotpsi[fgkEndLadderSegmentCombiTransNumber] = 
-            {   0.,- 90.,   0.,   0.};
-  ////////////////////////////////////////////////////////
-  //Name of CombiTrans Transformation of EndLadderSegment:
-  ////////////////////////////////////////////////////////
-  char endladdersegmentcombitransname[30];
-  char endladdersegmentrotname[30];
-  TGeoCombiTrans *endladdersegmentlocalmatrix[fgkEndLadderSegmentCombiTransNumber];
-  for(Int_t i=0; i<fgkEndLadderSegmentCombiTransNumber; i++){ 
-               sprintf(endladdersegmentcombitransname,"EndLadderSegmentCombiTrans%i",i);
-               sprintf(endladdersegmentrotname,"EndLadderSegmentRot%i",i);
-               endladdersegmentlocalmatrix[i] =
-                               new TGeoCombiTrans(endladdersegmentcombitransname,
-                                                                  kendladdersegmenttransx[i],
-                                                                  kendladdersegmenttransy[i],
-                                                                  kendladdersegmenttransz[i],
-                                                                  new TGeoRotation(endladdersegmentrotname,
-                                                                                                       kendladdersegmentrotphi[i],
-                                                                                                       kendladdersegmentrottheta[i],
-                                                                                                       kendladdersegmentrotpsi[i]));
-    fEndLadderSegmentCombiTransMatrix[i] = endladdersegmentlocalmatrix[i];
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++)    
+      for(Int_t j=0; j<fgkendladdercarbonfiberjunctionmatrixnumber; j++){
+            localendladdercarbonfiberjunctionrot[i][j] = new TGeoRotation();
+            localendladdercarbonfiberjunctiontrans[i][j] = new TGeoTranslation();
+      }
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++)     
+      for(Int_t j=0; j<fgkendladdercarbonfiberjunctionmatrixnumber; j++)
+          localendladdercarbonfiberjunctionrot[i][j]->SetAngles(120.*j,0.,0.);
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++){
+      localendladdercarbonfiberjunctiontrans[i][1]->SetTranslation(fgkCarbonFiberTriangleLength,
+                              0.0,0.0);
+      localendladdercarbonfiberjunctiontrans[i][2]->SetTranslation(fgkCarbonFiberTriangleLength
+               *                     CosD(fgkCarbonFiberTriangleAngle),fgkCarbonFiberTriangleLength
+               *                     SinD(fgkCarbonFiberTriangleAngle),
+                        0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[i]
+  -                          fgkEndLadderCarbonFiberUpperJunctionLength[i]));
   }
-}
-/////////////////////////////////////////////////////////////////////////////////
-void AliITSv11GeometrySSD::SetLadderCableCombiTransMatrix(Int_t iLayer){
+  TGeoCombiTrans* localendladdercarbonfiberjunctionglobalmatrix[fgkendlabbercarbonfiberjunctionumber];
+  TGeoRotation* localendladdercarbonfiberjunctionglobalrot[fgkendlabbercarbonfiberjunctionumber];
+  TGeoTranslation* localendladdercarbonfiberjunctionglobaltrans[fgkendlabbercarbonfiberjunctionumber];
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++){
+      localendladdercarbonfiberjunctionglobalrot[i] = new TGeoRotation();
+      localendladdercarbonfiberjunctionglobaltrans[i] = new TGeoTranslation();
+      localendladdercarbonfiberjunctionglobalrot[i]->SetAngles(0.0,90.0,0.0);
+      localendladdercarbonfiberjunctionglobaltrans[i]->SetTranslation(0.0,
+            0.5*fgkEndLadderCarbonFiberLowerJunctionLength[i],0.0);
+      localendladdercarbonfiberjunctionglobalmatrix[i] = 
+            new TGeoCombiTrans(*localendladdercarbonfiberjunctionglobaltrans[i],
+                               *localendladdercarbonfiberjunctionglobalrot[i]);
+  }
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++)    
+      for(Int_t j=0; j<fgkendladdercarbonfiberjunctionmatrixnumber; j++){
+            localendladdercarbonfiberjunctionmatrix[i][j] = 
+                  new TGeoCombiTrans(*localendladdercarbonfiberjunctiontrans[i][j],
+                                     *localendladdercarbonfiberjunctionrot[i][j]);
+           fendladdercarbonfiberjunctionmatrix[i][j] =
+            new TGeoHMatrix((*localendladdercarbonfiberjunctionglobalmatrix[i])
+            *               (*localendladdercarbonfiberjunctionmatrix[i][j])); 
+      }  
   /////////////////////////////////////////////////////////////
-  // Method generating CombiTrans Matrix for SSD Ladder Cable   
+  // End Ladder Carbon Fiber Support
+  /////////////////////////////////////////////////////////////
+  TGeoTranslation* localendladdercarbonfibertrans[fgkendladdercarbonfibermatrixnumber];
+  for(Int_t i=0; i<fgkendladdercarbonfibermatrixnumber; i++){
+      localendladdercarbonfibertrans[i] = new TGeoTranslation();
+      localendladdercarbonfibertrans[i]->SetTranslation(0.0,
+            i==0 ? 0.0 :fgkCarbonFiberLowerSupportWidth,0.0);
+      fendladdercarbonfibermatrix[i] = new TGeoHMatrix*[fgkcarbonfibersupportnumber];
+  }
+  for(Int_t i=0; i<fgkendladdercarbonfibermatrixnumber; i++)
+      for(Int_t j=0; j<fgkcarbonfibersupportnumber; j++)
+            fendladdercarbonfibermatrix[i][j] = 
+            new TGeoHMatrix((*localendladdercarbonfibertrans[i])
+            *(*fcarbonfibersupportmatrix[j]));
+  /////////////////////////////////////////////////////////////
+  // End Ladder SSD Mounting Block
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++)
+      fendladdermountingblockcombitrans[i] = new TGeoCombiTrans();
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++)
+      fendladdermountingblockcombitrans[i]->SetTranslation(-  0.25*(fgkSSDMountingBlockLength[0]
+                                +       fgkSSDMountingBlockLength[1])
+                                +  0.5*fgkCarbonFiberTriangleLength,
+                                fgkEndLadderMountingBlockPosition[i],
+                                -  fgkSSDMountingBlockHeight[1]
+                                +  0.5*fgkSSDMountingBlockHeight[0]);
+  TGeoRotation* endladdermountingblockrot = new TGeoRotation();
+  endladdermountingblockrot->SetAngles(0.,90.,0.);
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++)
+       fendladdermountingblockcombitrans[i]->SetRotation(*endladdermountingblockrot);
+  /////////////////////////////////////////////////////////////
+  // End Ladder SSD Mounting Block Clip Matrix 
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++) 
+       fendladdermountingblockclipmatrix[i] = new TGeoHMatrix*[2];
+  
+  TGeoRotation* localendladdercliprot = new TGeoRotation();
+  TGeoTranslation* localendladdercliptrans = new TGeoTranslation();
+  localendladdercliptrans->SetTranslation(-0.5*(fgkSSDMountingBlockLength[0]
+                                                                                 -     fgkSSDMountingBlockLength[1])
+                                                                                 + fgkSSDMountingBlockLength[0],0.,0.);
+  localendladdercliprot->SetAngles(90.,180.,-90.);
+  TGeoCombiTrans* localendladderclipcombitrans = 
+                       new TGeoCombiTrans(*localendladdercliptrans,*localendladdercliprot);
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++)
+       for(Int_t j=0; j<2; j++){
+               fendladdermountingblockclipmatrix[i][j] = 
+                                               new TGeoHMatrix(*fendladdermountingblockcombitrans[i]);
+               if(j!=0) fendladdermountingblockclipmatrix[i][j]->Multiply(localendladderclipcombitrans);
+       }
+  /////////////////////////////////////////////////////////////
+  // End Ladder Carbon Fiber Lower Support
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgkendladderlowersuppnumber; i++)
+      fendladderlowersupptrans[i] = 
+            new TGeoTranslation(0.0,(1-i)*(fgkEndLadderMountingBlockPosition[i]
+                        +  0.5*fgkSSDMountingBlockWidth),
+                        -  0.5*fgkCarbonFiberLowerSupportHeight);
+  fendladderlowersupptrans[0]->SetDz(-0.5*fgkCarbonFiberLowerSupportHeight-fgkSSDTolerance);
+  fendladderlowersupptrans[2] = new TGeoTranslation(0.0,
+                                                                        fgkCarbonFiberLowerSupportVolumePosition[1]
+                                                               +    fgkCarbonFiberLowerSupportVolumePosition[0],
+                                                                        0.0);
+  fendladderlowersupptrans[2]->Add(fendladderlowersupptrans[1]);
+ /////////////////////////////////////////////////////////////
+  // Matrix for positioning Ladder into mother volume
+  /////////////////////////////////////////////////////////////
+  TGeoHMatrix** ladderglobalmatrix[fgkladdernumber];
+  for(Int_t i=0; i<fgkladdernumber; i++) 
+       ladderglobalmatrix[i] = new TGeoHMatrix*[fgkladdernumber];
+  TGeoRotation* localladdermotherrot = new TGeoRotation();
+  localladdermotherrot->SetAngles(0.,90.,0.);  
+  TGeoTranslation* localladdermothertrans[fgkladdernumber];
+  TGeoCombiTrans* localladdermothercombitrans[fgkladdernumber];
+  for(Int_t i=0; i<fgkladdernumber; i++){
+       localladdermothertrans[i] = new TGeoTranslation(0.,
+                                                         - fgkEndLadderCarbonFiberLowerJunctionLength[1]
+                                                         + fgkEndLadderCarbonFiberLowerJunctionLength[0]
+                                                         + (i==0?fgkSSDLay5SensorsNumber:fgkSSDLay6SensorsNumber)
+                                                         * fgkCarbonFiberJunctionWidth,0.);
+       localladdermothercombitrans[i] = new TGeoCombiTrans(*localladdermothertrans[i],
+                                                                                                               *localladdermotherrot);
+       ladderglobalmatrix[0][i] = new TGeoHMatrix(*localladdermothercombitrans[i]);
+       ladderglobalmatrix[1][i] = new TGeoHMatrix(ladderglobalmatrix[0][i]->Inverse());
+  }
+  /////////////////////////////////////////////////////////////
+  // Ladder Cables Matrices
   /////////////////////////////////////////////////////////////
-  // Translation Parameters for LadderCable
-  /////////////////////////////////////////
   Double_t ssdflexradius = fgkSSDStiffenerHeight+2*fgkSSDFlexHeight[0]
                                             + fgkSSDFlexHeight[1];  
-  Double_t ssdflexradiusmax = (fgkSSDFlexLength[3]-fgkSSDFlexLength[2])
-                                                       /  TMath::Tan(fgkSSDFlexAngle*TMath::DegToRad());
   Double_t ssdladdercabletransx[3];
   ssdladdercabletransx[0] = (ssdflexradiusmax-fgkSSDFlexHeight[1]-ssdflexradius)
-                                                 *   TMath::Sin(2.*fgkSSDFlexAngle*TMath::DegToRad())
-                                                 *       TMath::Cos(2.*fgkSSDFlexAngle*TMath::DegToRad());
+                                                 *   SinD(2.*fgkSSDFlexAngle)
+                                                 *       CosD(2.*fgkSSDFlexAngle);
   ssdladdercabletransx[1] = ((ssdflexradiusmax-fgkSSDFlexHeight[1]-ssdflexradius)
                                                  -     ssdladdercabletransx[0]
-                                                 /     TMath::Sin(2.*fgkSSDFlexAngle*TMath::DegToRad()))
-                                                 *     TMath::Cos(fgkSSDFlexAngle*TMath::DegToRad());                                          
+                                                 /     SinD(2.*fgkSSDFlexAngle))
+                                                 *     CosD(fgkSSDFlexAngle);                                          
   ssdladdercabletransx[2] = (fgkSSDFlexFullLength-2.*fgkSSDFlexAngle
                                                  *       TMath::DegToRad()*ssdflexradiusmax
                                                  -     fgkSSDFlexLength[2]-TMath::Pi()
                                                  *       fgkSSDStiffenerHeight-fgkSSDFlexLength[0]
                                                  -       fgkSSDLadderCableWidth)
-                                                 *       TMath::Cos(2.*fgkSSDFlexAngle*TMath::DegToRad());
+                                                 *       CosD(2.*fgkSSDFlexAngle);
   Double_t ssdladdercabletransz[3] = {ssdladdercabletransx[0]
-                                                 *     TMath::Tan(2.*fgkSSDFlexAngle*TMath::DegToRad()),
+                                                 *     TanD(2.*fgkSSDFlexAngle),
                                                        ssdladdercabletransx[1]
-                                                 *     TMath::Tan(fgkSSDFlexAngle*TMath::DegToRad()),
+                                                 *     TanD(fgkSSDFlexAngle),
                                                        ssdladdercabletransx[2]
-                                                 *     TMath::Tan(2.*fgkSSDFlexAngle*TMath::DegToRad())};      
+                                                 *     TanD(2.*fgkSSDFlexAngle)};      
   TGeoRotation* localladdercablerot[3];        
-  localladdercablerot[0] = new TGeoRotation("LocalLadderCableRot0",90.,0.,0.);
-  localladdercablerot[1] = new TGeoRotation("LocalLadderCableRot1",90.,60.,-90.);
-  localladdercablerot[2] = new TGeoRotation("LocalLadderCableRot2");
+  for(Int_t i=0; i<3; i++) localladdercablerot[i] = new TGeoRotation();
+  localladdercablerot[0]->SetAngles(90.,0.,0.);
+  localladdercablerot[1]->SetAngles(90.,60.,-90.);
   localladdercablerot[2]->SetRotation((*localladdercablerot[1])
                                                 *                        (*localladdercablerot[0]));
+  //TGeoRotation* localladdercablerot = new TGeoRotation();    
+  //localladdercablerot->SetAngles(90.,0.,0.);
   ////////////////////////////////////////////
   // LocalLadderCableCombiTransMatrix
   ////////////////////////////////////////////
@@ -904,11 +1310,27 @@ void AliITSv11GeometrySSD::SetLadderCableCombiTransMatrix(Int_t iLayer){
   localladdercablecombitransmatrix[0][0]  =
                                                new TGeoCombiTrans(-0.5*fgkCarbonFiberTriangleLength,
                                                0.,0.,NULL);
-  localladdercablecombitransmatrix[0][1] = fLadderSegmentCombiTransMatrix[1];
+  localladdercablecombitransmatrix[0][1] = 
+       new TGeoCombiTrans(-0.5*(fgkSSDSensorWidth-fgkCarbonFiberTriangleLength),
+                                          - (2.*fgkSSDSensorLength-fgkSSDSensorOverlap)+
+                                                fgkSSDModuleStiffenerPosition[1]+fgkSSDStiffenerWidth
+                                          + 0.5*fgkSSDFlexHoleLength+2.*fgkCarbonFiberJunctionWidth
+                                          - 0.5*(fgkCarbonFiberLowerSupportWidth
+                                          + fgkSSDSensorCenterSupportLength
+                                          - fgkSSDSensorCenterSupportThickness[0]),
+                                          - (fgkSSDModuleCoolingBlockToSensor
+                                          + 0.5*fgkCoolingTubeSupportHeight
+                                          - fgkSSDSensorHeight-fgkSSDChipCablesHeight[3]
+                                          - fgkSSDChipHeight),NULL);
   localladdercablecombitransmatrix[0][2] = 
                                                new TGeoCombiTrans(fgkSSDModuleStiffenerPosition[0],
                                                                                   fgkSSDModuleStiffenerPosition[1],0.,0);
-  localladdercablecombitransmatrix[0][3] = fSSDModuleCombiTransMatrix[6];
+  localladdercablecombitransmatrix[0][3] = new TGeoCombiTrans(
+                                       0.5*(fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength
+                                  +(fgkSSDChipNumber-1)*fgkSSDChipSeparationLength),
+                                  fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1]
+                                        - fgkSSDStiffenerWidth,- 0.5*fgkSSDChipHeight,
+                                                                                               new TGeoRotation("",180.,0.,0.));
   localladdercablecombitransmatrix[0][4] = 
                                                new TGeoCombiTrans(-ssdladdercabletransx[0]
                                                -     ssdladdercabletransx[1]-ssdladdercabletransx[2]
@@ -921,196 +1343,449 @@ void AliITSv11GeometrySSD::SetLadderCableCombiTransMatrix(Int_t iLayer){
   ///////////////////////////////////////////
   // Rigth Side Ladder Cables Transformations
   ///////////////////////////////////////////
+  TGeoCombiTrans* localladdercablessdmodulematrix = 
+       new TGeoCombiTrans(0.5*(fgkSSDStiffenerLength-fgkSSDChipNumber*fgkSSDChipLength
+                                                                 - (fgkSSDChipNumber-1)*fgkSSDChipSeparationLength),
+                                                                        fgkSSDStiffenerWidth,
+                                                                 - 0.5*fgkSSDFlexHeight[0],NULL);
   for(Int_t i=0; i<klocalladdercombitransnumber; i++)
    localladdercablecombitransmatrix[1][i] = 
-                       (i!=3 ? localladdercablecombitransmatrix[0][i]:
-                                       fSSDModuleCombiTransMatrix[3]);         
+                       (i!=3 ? new TGeoCombiTrans(*localladdercablecombitransmatrix[0][i]):
+                                       new TGeoCombiTrans(*localladdercablessdmodulematrix));  
   ///////////////////////////////////////////
-  // Setting LadderCableCombiTransMatrix
+  // Setting LadderCableHMatrix
   ///////////////////////////////////////////
-  Int_t beamaxistrans[3] = {0,0,0};
-  switch(iLayer){
-  case 5: 
-         beamaxistrans[0] = fgkSSDLay5SensorsNumber/2;
-         beamaxistrans[1] = beamaxistrans[0]+1;
-         beamaxistrans[2] = beamaxistrans[0]-1;
-  break;
-  case 6:
-         beamaxistrans[0] = (fgkSSDLay6SensorsNumber-1)/2;
-       beamaxistrans[1] = beamaxistrans[0]+1;
-       beamaxistrans[2] = beamaxistrans[0];
-         break;
-  }
-  TGeoHMatrix* localladdercablehmatrix[klocalladdersidecablesnumber];
-  TGeoRotation* laddercablerot;
-  TGeoTranslation* laddercabletrans;
-  for(Int_t i=0; i<klocalladdersidecablesnumber; i++){
-        localladdercablehmatrix[i] = new TGeoHMatrix();
-        for(Int_t j=0; j<klocalladdercombitransnumber; j++){
-                  localladdercablehmatrix[i]->MultiplyLeft(
-                  localladdercablecombitransmatrix[i][klocalladdercombitransnumber-j-1]);
-        }
-        laddercablerot = new TGeoRotation();
-        laddercablerot->SetMatrix(localladdercablehmatrix[i]->GetRotationMatrix());
-  laddercabletrans = new TGeoTranslation();
-  Double_t* laddercabletransvector = localladdercablehmatrix[i]->GetTranslation();
-  laddercabletrans->SetTranslation(laddercabletransvector[0],
+  Int_t beamaxistrans[2][3];
+  beamaxistrans[0][0] = fgkSSDLay5SensorsNumber/2; 
+  beamaxistrans[0][1] = beamaxistrans[0][0]+1;
+  beamaxistrans[0][2] = beamaxistrans[0][0]-1;
+  beamaxistrans[1][0] = (fgkSSDLay6SensorsNumber-1)/2;
+  beamaxistrans[1][1] = beamaxistrans[1][0]+1;
+  beamaxistrans[1][2] = beamaxistrans[1][0];
+  TGeoHMatrix** localladdercablehmatrix[fgkladdercablesnumber];
+  TGeoRotation* laddercablerot = new TGeoRotation();
+  TGeoTranslation* laddercabletrans = new TGeoTranslation();
+  TGeoCombiTrans* laddercablecombitrans = new TGeoCombiTrans();
+  Double_t* laddercabletransvector;    
+  for(Int_t i=0; i<fgkladdercablesnumber; i++){ 
+       localladdercablehmatrix[i] = new TGeoHMatrix*[klocalladdersidecablesnumber];
+       fladdercablematrix[i] = new TGeoHMatrix*[fgkladdercablematrixnumber];
+  }
+  for(Int_t i=0; i<fgkladdercablesnumber; i++){
+       for(Int_t j=0; j<klocalladdersidecablesnumber; j++){
+               localladdercablehmatrix[i][j] = new TGeoHMatrix();
+               for(Int_t k=0; k<klocalladdercombitransnumber; k++){
+                       localladdercablehmatrix[i][j]->MultiplyLeft(
+                       localladdercablecombitransmatrix[j][klocalladdercombitransnumber-k-1]);
+        }
+               laddercablerot->SetMatrix(localladdercablehmatrix[i][j]->GetRotationMatrix());
+               laddercabletransvector = localladdercablehmatrix[i][j]->GetTranslation();
+               laddercabletrans->SetTranslation(laddercabletransvector[0],
                                                                         laddercabletransvector[1]
-                                       +                (i==0 ? beamaxistrans[0] : 0.)
+                                       +                (j==0 ? beamaxistrans[i][0] : 0.)
                                        *                                fgkCarbonFiberJunctionWidth,
-                                                                        laddercabletransvector[2]);     
-        fLadderCableCombiTransMatrix[i] = new TGeoCombiTrans(*laddercabletrans,
-                                                                                                  *laddercablerot);
-       } 
-       fLadderCableCombiTransMatrix[2] = 
-                                       AddTranslationToCombiTrans(fLadderCableCombiTransMatrix[1],0.,
-                                       beamaxistrans[1]*fgkCarbonFiberJunctionWidth,0.);
-       fLadderCableCombiTransMatrix[3] = 
-                                       AddTranslationToCombiTrans(fLadderCableCombiTransMatrix[0],0.,
-                                       beamaxistrans[2]*fgkCarbonFiberJunctionWidth,0.);
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupportShape(Double_t length, 
-                                                       Double_t height,Double_t width,Double_t* thickness){
+                                                                        laddercabletransvector[2]);
+               laddercablecombitrans->SetRotation(*laddercablerot);
+               laddercablecombitrans->SetTranslation(*laddercabletrans);       
+               fladdercablematrix[i][j] = new TGeoHMatrix(*laddercablecombitrans);
+       }
+    fladdercablematrix[i][2] = 
+                                       AddTranslationToHMatrix(fladdercablematrix[i][1],0.,
+                                       beamaxistrans[i][1]*fgkCarbonFiberJunctionWidth,0.);
+       fladdercablematrix[i][3] = 
+                                       AddTranslationToHMatrix(fladdercablematrix[i][0],0.,
+                                       beamaxistrans[i][2]*fgkCarbonFiberJunctionWidth,0.);
+  }
+  for(Int_t i=0; i<fgkladdercablesnumber; i++)
+    for(Int_t j=0; j<klocalladdercombitransnumber-1; j++) 
+      fladdercablematrix[i][j]->MultiplyLeft(ladderglobalmatrix[1][i]);
+  
+  ///////////////////////////////////////////
+  // Setting Ladder HMatrix
+  ///////////////////////////////////////////
+  Int_t ssdlaysensorsnumber[fgkladdernumber] = {fgkSSDLay5SensorsNumber,
+                                                                                               fgkSSDLay6SensorsNumber};
+  for(Int_t i=0; i<fgkladdernumber; i++){
+       fladdermatrix[i] = new TGeoHMatrix*[ssdlaysensorsnumber[i]];
+       for(Int_t j=0; j<ssdlaysensorsnumber[i]; j++){
+               fladdermatrix[i][j] = new TGeoHMatrix();
+               fladdermatrix[i][j]->SetDx(-0.5*fgkCarbonFiberTriangleLength);
+               fladdermatrix[i][j]->SetDy(fgkCarbonFiberJunctionWidth*j);
+               fladdermatrix[i][j]->MultiplyLeft(ladderglobalmatrix[1][i]);
+       }
+  }
+  ///////////////////////////////////////////
+  // Setting SSD Sensor Matrix 
+  ///////////////////////////////////////////
+  TGeoCombiTrans* localssdsensorcombitrans[2];
+  TGeoRotation* localssdsensorrot = new TGeoRotation();        
+  localssdsensorrot->SetAngles(0.,90.,0.);     
+  TGeoTranslation* localssdsensortrans[2];
+  for(Int_t i=0; i<2; i++) localssdsensortrans[i] = new TGeoTranslation();
+  localssdsensortrans[0]->SetTranslation(0.5*fgkCarbonFiberTriangleLength,
+                                        fgkCarbonFiberJunctionWidth 
+                                        - fgkCarbonFiberLowerSupportWidth 
+                                        - fgkLowerSupportToSensorZ,
+                                                       0.5*fgkSSDSensorHeight-0.5*fgkCoolingTubeSupportHeight
+                                         -             fgkSSDModuleCoolingBlockToSensor
+                                         +    (fgkSSDSensorSideSupportHeight[1]
+                                         -             fgkSSDSensorSideSupportHeight[0]));
+  localssdsensortrans[1]->SetTranslation(0.5*fgkCarbonFiberTriangleLength,
+                                        fgkCarbonFiberJunctionWidth 
+                                        - fgkCarbonFiberLowerSupportWidth 
+                                        - fgkLowerSupportToSensorZ,
+                                                   0.5*fgkSSDSensorHeight-0.5*fgkCoolingTubeSupportHeight
+                                                       -fgkSSDModuleCoolingBlockToSensor);
+
+  for(Int_t i=0; i<2; i++) 
+       localssdsensorcombitrans[i] = new TGeoCombiTrans(*localssdsensortrans[i],
+                                                                                                        *localssdsensorrot);   
+    for(Int_t i=0; i<fgkladdernumber; i++){
+       fssdsensormatrix[i] = new TGeoHMatrix*[ssdlaysensorsnumber[i]];
+       for(Int_t j=0; j<ssdlaysensorsnumber[i]; j++){
+               switch(i){
+                       case 0: //Ladder of Layer5  
+                       fssdsensormatrix[i][j] = new TGeoHMatrix((*fladdermatrix[i][j])
+                                                                  * ((j%2==0 ? *localssdsensorcombitrans[0] :
+                                                                                               *localssdsensorcombitrans[1])));
+                       break;
+                       case 1: //Ladder of Layer6 
+                       fssdsensormatrix[i][j] = new TGeoHMatrix((*fladdermatrix[i][j])
+                                                                  * ((j%2==0 ? *localssdsensorcombitrans[1] :
+                                                                                               *localssdsensorcombitrans[0])));
+               break;
+               }
+         }
+  }    
+  //////////////////////////
+  // Setting SSD End Ladder  
+  //////////////////////////
+  for(Int_t i=0; i<2; i++) fendladdersegmentmatrix[i] = new TGeoHMatrix*[2];
+  for(Int_t i=0; i<2; i++){
+       fendladdersegmentmatrix[0][i] = new TGeoHMatrix();
+       fendladdersegmentmatrix[0][i]->SetDx(-0.5*fgkCarbonFiberTriangleLength);
+       fendladdersegmentmatrix[0][i]->SetDy(fgkCarbonFiberJunctionWidth*ssdlaysensorsnumber[i]);
+       fendladdersegmentmatrix[0][i]->MultiplyLeft(ladderglobalmatrix[1][i]);
+       fendladdersegmentmatrix[1][i] = new TGeoHMatrix();
+       fendladdersegmentmatrix[1][i]->SetDx(-0.5*fgkCarbonFiberTriangleLength);
+       fendladdersegmentmatrix[1][i]->RotateZ(180.0);
+       fendladdersegmentmatrix[1][i]->MultiplyLeft(ladderglobalmatrix[1][i]);
+   }
+  /////////////////////////////////////////////////////
+  // Setting the CombiTransformation to pass ITS center 
+  /////////////////////////////////////////////////////
+  Double_t itscentertransz[fgklayernumber];
+  itscentertransz[0] = fgkSSDLay5LadderLength
+                                        - fgkLay5CenterITSPosition;
+  itscentertransz[1] = fgkSSDLay6LadderLength
+                                        - fgkLay6CenterITSPosition;
+  Double_t itssensortransy = fgkSSDModuleCoolingBlockToSensor
+                                                  + 0.5*fgkCoolingTubeSupportHeight;
+  TGeoRotation* itscenterrot[3];
+  for(Int_t i=0; i<fgklayernumber; i++) itscenterrot[i] = new TGeoRotation();
+  itscenterrot[0]->SetAngles(90.,180.,-90.);
+  itscenterrot[1]->SetAngles(0.,90.,0.);
+  itscenterrot[2] = new TGeoRotation((*itscenterrot[1])*(*itscenterrot[0]));
+  TGeoCombiTrans* itscentercombitrans[fgklayernumber];
+  for(Int_t i=0; i<fgklayernumber; i++) 
+       itscentercombitrans[i] = new TGeoCombiTrans(0.,
+                                                        itssensortransy,
+                                                        fgkEndLadderCarbonFiberLowerJunctionLength[1]
+                                                  - itscentertransz[i],itscenterrot[2]);
+  TGeoRotation** locallayerrot[fgklayernumber];
+  TGeoTranslation** locallayertrans[fgklayernumber];   
+  TGeoCombiTrans** locallayercombitrans[fgklayernumber];
+  TGeoTranslation* localbeamaxistrans[fgklayernumber];
+  localbeamaxistrans[0] = new TGeoTranslation(0.,0.,0.5*fgkSSDLay5LadderLength
+                                        - fgkLay5CenterITSPosition);
+  localbeamaxistrans[1] = new TGeoTranslation(0.,0.,0.5*fgkSSDLay6LadderLength
+                                        - fgkLay6CenterITSPosition);
+  const Int_t kssdlayladdernumber[fgklayernumber] = 
+                       {fgkSSDLay5LadderNumber,fgkSSDLay6LadderNumber};
+  for(Int_t i=0; i<fgklayernumber; i++){
+    locallayerrot[i] = new TGeoRotation*[kssdlayladdernumber[i]];
+    locallayertrans[i] = new TGeoTranslation*[kssdlayladdernumber[i]];
+       locallayercombitrans[i] = new TGeoCombiTrans*[kssdlayladdernumber[i]];
+       flayermatrix[i] = new TGeoHMatrix*[kssdlayladdernumber[i]];
+  }
+  Double_t layerladderangleposition[fgklayernumber] = 
+               {360./fgkSSDLay5LadderNumber,360./fgkSSDLay6LadderNumber};
+  Double_t layerradius = 0.;
+  for(Int_t i=0; i<fgklayernumber; i++){       
+       for(Int_t j=0; j<kssdlayladdernumber[i]; j++){
+               switch(i){
+                       case 0: //Ladder of Layer5  
+                       layerradius = (j%2==0 ? fgkSSDLay5RadiusMin: fgkSSDLay5RadiusMax);
+                       break;
+                       case 1: //Ladder of Layer6 
+                       layerradius = (j%2==0 ? fgkSSDLay6RadiusMin: fgkSSDLay6RadiusMax);
+               break;
+               }
+               locallayerrot[i][j] = new TGeoRotation();
+               locallayertrans[i][j] = new TGeoTranslation();
+               locallayerrot[i][j]->SetAngles(j*layerladderangleposition[i],0.,0.);
+               locallayertrans[i][j]->SetTranslation(layerradius 
+                                                         *     CosD(90.0+j*layerladderangleposition[i]),
+                                                           layerradius 
+                                                         * SinD(90.0+j*layerladderangleposition[i]),0.);
+               locallayercombitrans[i][j] = new TGeoCombiTrans(*locallayertrans[i][j],
+                                                                        *locallayerrot[i][j]);
+               flayermatrix[i][j] = new TGeoHMatrix((*locallayercombitrans[i][j])*(*itscentercombitrans[i]));
+               flayermatrix[i][j]->Multiply(ladderglobalmatrix[0][i]);
+               flayermatrix[i][j]->MultiplyLeft(localbeamaxistrans[i]);
+       }
+  }
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Sensor Support Shape   
+  // Deallocating memory
   /////////////////////////////////////////////////////////////
-  const Int_t kvertexnumber = 4;
-  const Int_t kshapesnumber = 2;
-  Double_t shapewidth[2] = {width,width};
-  TVector3** vertexposition[kshapesnumber];
-  for(Int_t i = 0; i<kshapesnumber; i++) vertexposition[i] = 
-                                                                                                       new TVector3*[kvertexnumber];
-  //First Shape Vertex Positioning
-  vertexposition[0][0] = new TVector3();
-  vertexposition[0][1] = new TVector3(height);
-  vertexposition[0][2] = new TVector3(thickness[0]);
-  vertexposition[0][3] = new TVector3(*vertexposition[0][1]);
-  //Second Shape Vertex Positioning
-  vertexposition[1][0] = new TVector3(*vertexposition[0][0]);
-  vertexposition[1][1] = new TVector3(length);
-  vertexposition[1][2] = new TVector3(thickness[1]);
-  vertexposition[1][3] = new TVector3(vertexposition[1][1]->X());
-  char* ssdsensorsupportshapename[kshapesnumber] = 
-                                                       {"SSDSensorSupportShape1","SSDSensorSupportShape2"};
-  TGeoArb8* lSSDSensorSupportShape[kshapesnumber];
-  for(Int_t i = 0; i< kshapesnumber; i++) lSSDSensorSupportShape[i] = 
-                                          GetArbShape(vertexposition[i],shapewidth,i==0 ? 
-                                                                                                        thickness[1]: thickness[0],
-                                                                                                 ssdsensorsupportshapename[i]);
-  /////////////////////////////////////
-  //Setting Translations and Rotations: 
-  /////////////////////////////////////
-  TGeoRotation* ssdsensorsupportshaperot[2];
-  ssdsensorsupportshaperot[0] = 
-                                        new TGeoRotation("SSDSensorSupportShapeRot1",180.,0.,0.);
-  ssdsensorsupportshaperot[1] = 
-                                        new TGeoRotation("SSDSensorSupportShapeRot2",90.,90.,-90.);
-  TGeoTranslation* ssdsensorsupportshapetrans = 
-                                        new TGeoTranslation("SSDSensorSupportShapeTrans",0.,0.,
-                                                                                                                         0.5*thickness[0]);
-  TGeoCombiTrans* ssdsensorsupportcombitrans = 
-         new TGeoCombiTrans("SSDSensorSupportCombiTrans",0.5*thickness[0],width,0.,
-                                                 new TGeoRotation((*ssdsensorsupportshaperot[1])
-                                               *                  (*ssdsensorsupportshaperot[0])));
-  TGeoVolume* ssdsensorsupportcompvolume = 
-                                                 new TGeoVolumeAssembly("SSDSensorSupportCompVolume");
-  ssdsensorsupportcompvolume->AddNode(new TGeoVolume("SSDSensorSupportVolume1",
-                                                       lSSDSensorSupportShape[0],fSSDSensorSupportMedium),1,
-                                                       ssdsensorsupportshapetrans);
-  ssdsensorsupportcompvolume->AddNode(new TGeoVolume("SSDSensorSupportVolume2",
-                                                       lSSDSensorSupportShape[1],fSSDSensorSupportMedium),1,
-                                                       ssdsensorsupportcombitrans);
-  return ssdsensorsupportcompvolume;
+  for(Int_t i=0; i< kcarbonfibersupportmatrixnumber[1]; i++){
+       delete carbonfiberot[i];
+       delete localcarbonfibersupportmatrix[i];
+  }
+  for(Int_t i=0; i< fgkcarbonfiberjunctionumber; i++){
+     for(Int_t j=0; j< kcarbonfiberjunctionmatrixnumber; j++){
+       delete localcarbonfiberjunctionmatrix[i][j];
+          delete localcarbonfiberjunctionrot[i][j];
+          delete localcarbonfiberjunctiontrans[i][j];
+          }
+       delete [] localcarbonfiberjunctionmatrix[i];
+       delete [] localcarbonfiberjunctionrot[i];
+       delete [] localcarbonfiberjunctiontrans[i];
+  }
+  for(Int_t i=0; i<fgkcarbonfiberlowersupportnumber; i++) 
+          delete localcarbonfiberlowersupportrans[i];
+  for(Int_t i=0; i< fgkssdsensorsupportnumber; i++){
+     for(Int_t j=0; j< kssdsensorsupportmatrixnumber; j++){
+       delete localssdsensorsupportmatrix[i][j];
+          delete localssdsensorsupportrot[i][j];
+          delete localssdsensorsupportrans[i][j];
+          }
+       delete [] localssdsensorsupportmatrix[i];
+       delete [] localssdsensorsupportrot[i];
+       delete [] localssdsensorsupportrans[i];
+  }
+  for(Int_t i=0; i<kcoolingtubesupportmatrixnumber; i++){
+       delete localcoolingtubesupportmatrix[i];
+       delete localcoolingtubesupportrot[i];
+       delete localcoolingtubesupportrans[i];
+  }
+  for(Int_t j=0; j<2; j++){
+    delete localcoolingtubevect[j];
+    delete localcoolingtubetrans[j];
+  }
+ delete endladdermountingblockrot;
+ for(Int_t i=0; i<khybridmatrixnumber; i++) delete localhybridtrans[i];
+ for(Int_t i=0; i<fgkflexnumber; i++){
+      for(Int_t j=1; j<klocalflexmatrixnumber; j++) 
+            delete localflexmatrix[i][j];
+      delete [] localflexmatrix[i];
+ }
+ delete localendlladdercoolingtuberot;
+ for(Int_t i=0; i<2; i++){
+       for(Int_t j=0; j<2; j++)
+         delete localendlladdercoolingtubetrans[i][j];
+       delete [] localendlladdercoolingtubetrans[i];
+  }
+
+ delete localflexrot;
+ delete localendflexrot;
+ delete localendflexmatrix;
+ for(Int_t i=0; i<fgkladdernumber; i++){ 
+       delete localladdermothertrans[i];
+       delete localladdermothercombitrans[i];
+  }
+ delete localladdermotherrot;
+ for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++){    
+      for(Int_t j=0; j<fgkendladdercarbonfiberjunctionmatrixnumber; j++){
+            delete localendladdercarbonfiberjunctionmatrix[i][j];
+            delete localendladdercarbonfiberjunctionrot[i][j];
+            delete localendladdercarbonfiberjunctiontrans[i][j];
+      }
+      delete [] localendladdercarbonfiberjunctionmatrix[i];
+      delete [] localendladdercarbonfiberjunctionrot[i];
+      delete [] localendladdercarbonfiberjunctiontrans[i];
+      delete localendladdercarbonfiberjunctionglobalrot[i];
+      delete localendladdercarbonfiberjunctionglobaltrans[i];
+      delete localendladdercarbonfiberjunctionglobalmatrix[i];
+ }
+  for(Int_t i=0; i<2; i++){
+       for(Int_t j=0; j<(i==0?4:2); j++) delete localendladdercooltubetrans[i][j];
+       delete [] localendladdercooltubetrans[i];
+  }
+  for(Int_t i=0; i<fgkendladdercarbonfibermatrixnumber; i++)
+      delete localendladdercarbonfibertrans[i];
+  for(Int_t i=0; i<3; i++) delete localladdercablerot[i];
+  for(Int_t i=0; i<klocalladdersidecablesnumber; i++){
+       for(Int_t j=0; j<klocalladdercombitransnumber; j++)
+               delete localladdercablecombitransmatrix[i][j];
+               delete []localladdercablecombitransmatrix[i];
+  }
+  delete localendladdercliprot;
+  delete localendladdercliptrans;
+  for(Int_t i=0; i<fgkladdercablesnumber; i++){
+       for(Int_t j=0; j<klocalladdersidecablesnumber; j++)
+               delete localladdercablehmatrix[i][j];
+       delete []localladdercablehmatrix[i];
+  }
+  delete laddercablerot;
+  delete laddercabletrans;
+  delete laddercablecombitrans;
+  delete localladdercablessdmodulematrix;
+  delete localssdsensorrot;    
+  for(Int_t i=0; i<2; i++){
+       delete localssdsensortrans[i];
+       delete localssdsensorcombitrans[i];
+  }
+  for(Int_t i=0; i<fgklayernumber; i++){
+       for(Int_t j=0; j<kssdlayladdernumber[i]; j++){
+               delete locallayerrot[i][j];
+               delete locallayertrans[i][j];
+               delete locallayercombitrans[i][j];
+    }
+       delete [] locallayerrot[i];
+       delete [] locallayertrans[i];
+       delete [] locallayercombitrans[i];
+       delete localbeamaxistrans[i];
+  }
+  for(Int_t i=0; i<3; i++) delete itscenterrot[i];
+  for(Int_t i=0; i<fgkladdernumber; i++){
+       for(Int_t j=0; j<fgkladdernumber; j++)
+               delete ladderglobalmatrix[i][j];
+       delete [] ladderglobalmatrix[i];
+  }
+  /////////////////////////////////////////////////////////////
+  fTransformationMatrices = kTRUE;     
 }
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupport(Int_t VolumeKind, Int_t n){
+///////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::CreateBasicObjects(){
+  /////////////////////////////////////////////////////////////  
+  // Method generating the Objects of SSD Geometry    
+  /////////////////////////////////////////////////////////////
+  // SSD Sensor
+  ///////////////////////////////////
+  SetSSDSensor();
+  /////////////////////////////////////////////////////////////  
+  // Carbon Fiber Support    
+  /////////////////////////////////////////////////////////////  
+  TList* carbonfibersupportlist = GetCarbonFiberSupportList();  
+  for(Int_t i=0; i<fgkcarbonfibersupportnumber; i++) 
+      fcarbonfibersupport[i] = (TGeoVolume*)carbonfibersupportlist->At(i);
+  /////////////////////////////////////////////////////////////
+  // Carbon Fiber Junction 
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Sensor Support    
+  fcarbonfiberjunction = GetCarbonFiberJunction(fgkCarbonFiberJunctionWidth-fgkSSDTolerance);
   /////////////////////////////////////////////////////////////
-  TGeoVolume* ssdsensorsupport;
+  // Carbon Fiber Lower Support
+  /////////////////////////////////////////////////////////////
+  TList* carbonfiberlowersupportlist = GetCarbonFiberLowerSupportList();
+  for(Int_t i=0; i<fgkcarbonfiberlowersupportnumber; i++)
+       fcarbonfiberlowersupport[i] = (TGeoVolume*)carbonfiberlowersupportlist->At(i);
+  /////////////////////////////
+  // SSD Sensor Support
+  /////////////////////////////
+  for(Int_t i=0; i<fgkvolumekind; i++) fssdsensorsupport[i] = 
+                                                                               new TGeoVolume*[fgkssdsensorsupportnumber]; 
   Double_t sidesupporthickness[2] = {fgkSSDSensorSideSupportThickness[0],
-                                                                                  fgkSSDSensorSideSupportThickness[1]};
-  VolumeKind == 0 ? ssdsensorsupport = GetSSDSensorSupportShape(
-                                                               fgkSSDSensorSideSupportLength,
-                                                               fgkSSDSensorSideSupportHeight[(n==0 ? 0 : 1)],
-                                                               fgkSSDSensorSideSupportWidth,
-                                                               sidesupporthickness) :
-    ssdsensorsupport = GetSSDSensorSupportShape(fgkSSDSensorCenterSupportLength,
-                                                       fgkSSDSensorCenterSupportHeight[(n==0 ? 0 : 1)],
-                                                           fgkSSDSensorCenterSupportWidth,
-                                                           sidesupporthickness);
-  return ssdsensorsupport;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupportAssembly(Int_t n){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD Sensor Support Assembly   
-  /////////////////////////////////////////////////////////////
-  TGeoVolume* ssdsensorsupportassembly = 
-                                                        new TGeoVolumeAssembly("SSDSensorSupportAssembly");
-  const Int_t kvolumenumber = 2;
-  TGeoVolume* ssdsensorsupport[kvolumenumber];
-  for(Int_t i=0; i<kvolumenumber; i++) ssdsensorsupport[i] = 
-                                                                                                               GetSSDSensorSupport(i,n);
-  SetSSDSensorSupportCombiTransMatrix();
-  for(Int_t i=0; i<fgkSSDSensorSupportCombiTransNumber; i++) 
-       ssdsensorsupportassembly->AddNode((i<2 ? ssdsensorsupport[0]:
-                                                                                        ssdsensorsupport[1]),
-                                                                                i+1,fSSDSensorSupportCombiTransMatrix[i]);
-  return ssdsensorsupportassembly;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDModule(Int_t iChipCablesHeight){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD Sensor Module    
-  /////////////////////////////////////////////////////////////
-  TGeoVolume* ssdmodulevolume[fgkSSDModuleCombiTransNumber-1];
-  ssdmodulevolume[0] = GetSSDStiffenerAssembly();
-  ssdmodulevolume[1] = GetSSDChipAssembly();
-  ssdmodulevolume[2] = GetSSDSensor();
-  ssdmodulevolume[3] = GetSSDFlexAssembly();
-  ssdmodulevolume[4] = GetSSDCoolingBlockAssembly();
-  ssdmodulevolume[5] = GetSSDChipCablesAssembly(fgkSSDChipCablesHeight[iChipCablesHeight+2]);
-  SetSSDModuleCombiTransMatrix(fgkSSDChipCablesHeight[iChipCablesHeight+2]);
-  TGeoCombiTrans* ssdmoduleglobalcombitrans = 
-                                                                  new TGeoCombiTrans("SSDModuleGlobalCombiTrans",
-                                                                          fgkSSDModuleStiffenerPosition[0],
-                                                                          fgkSSDModuleStiffenerPosition[1],0.,NULL);
-  TGeoHMatrix* ssdmodulehmatrix[fgkSSDModuleCombiTransNumber];
-  TGeoVolume* ssdmodule = new TGeoVolumeAssembly("SSDModule");
-  for(Int_t i=0; i<fgkSSDModuleCombiTransNumber; i++){ 
-       ssdmodulehmatrix[i] = new TGeoHMatrix((*ssdmoduleglobalcombitrans)
-                                               *                                 (*fSSDModuleCombiTransMatrix[i]));
-       ssdmodule->AddNode(i==fgkSSDModuleCombiTransNumber-1 ? ssdmodulevolume[3] : 
-                                                 ssdmodulevolume[i],i!=fgkSSDModuleCombiTransNumber-1?1:2,
-                                                 ssdmodulehmatrix[i]);
-  }
-  return ssdmodule;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDSensor(){
+                                                                        fgkSSDSensorSideSupportThickness[1]};
+  for(Int_t i=0; i<fgkssdsensorsupportnumber-1; i++){
+       fssdsensorsupport[0][i] = GetSSDSensorSupport(fgkSSDSensorSideSupportLength,
+                                                                                          fgkSSDSensorSideSupportHeight[i],
+                                                                                          fgkSSDSensorSideSupportWidth,
+                                                                                          sidesupporthickness);  
+       fssdsensorsupport[1][i] = GetSSDSensorSupport(fgkSSDSensorCenterSupportLength,
+                                                                                          fgkSSDSensorCenterSupportHeight[i],
+                                                                                          fgkSSDSensorCenterSupportWidth,
+                                                                                          sidesupporthickness);
+  }
+  /////////////////////////////////////////////////////////////
+  // SSD Cooling Tube Support
+  /////////////////////////////////////////////////////////////
+  Int_t edgesnumber = 3;
+  fcoolingtubesupport = GetCoolingTubeSupport(edgesnumber);      
+  /////////////////////////////////////////////////////////////
+  // SSD Hybrid
+  /////////////////////////////////////////////////////////////
+  TList* ssdhybridcomponentslist = GetSSDHybridParts();
+  for(Int_t i=0; i<fgkhybridcompnumber; i++) 
+       fssdhybridcomponent[i] = (TGeoVolume*)ssdhybridcomponentslist->At(i);
+  /////////////////////////////////////////////////////////////
+  // SSD Cooling Block System
+  /////////////////////////////////////////////////////////////
+  fssdcoolingblocksystem = GetCoolingBlockSystem();
+   /////////////////////////////////////////////////////////////
+  // SSD Cooling Tube
+  /////////////////////////////////////////////////////////////
+  CreateCoolingTubes();
+  /////////////////////////////////////////////////////////////
+  // SSD Flex  
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Sensor  
+  fssdstiffenerflex = GetSSDStiffenerFlex();
+  fssdendflex = GetSSDEndFlex();
+  ///////////////////////////////////
+  // End Ladder Carbon Fiber Junction
+  ///////////////////////////////////
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++) 
+                                                  fendladdercarbonfiberjunction[i] = 
+                                                  new TGeoVolume*[fgkendlabbercarbonfiberjunctionumber];
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++){
+    fendladdercarbonfiberjunction[i][0] = 
+                 GetCarbonFiberJunction(fgkEndLadderCarbonFiberLowerJunctionLength[i]-fgkSSDTolerance);
+    fendladdercarbonfiberjunction[i][1] = 
+                 GetCarbonFiberJunction(fgkEndLadderCarbonFiberUpperJunctionLength[i]-fgkSSDTolerance);
+  }
+  ///////////////////////////////////
+  // End Ladder Mounting Block
+  ///////////////////////////////////
+  fendladdermountingblock = GetSSDMountingBlock();
+  ///////////////////////////////////
+  // End Ladder Mounting Block
+  ///////////////////////////////////
+  fendladdermountingblockclip = GetMountingBlockClip();
+  ///////////////////////////////////
+  // Ladder Support 
+  ///////////////////////////////////
+  TList* laddersupportlist = GetMountingBlockSupport(20);
+  fLay5LadderSupport[0] = (TGeoVolume*)laddersupportlist->At(0);
+  fLay5LadderSupport[1] = (TGeoVolume*)laddersupportlist->At(1);
+  fLay6LadderSupport[0] = (TGeoVolume*)laddersupportlist->At(2);
+  fLay6LadderSupport[1] = (TGeoVolume*)laddersupportlist->At(3);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
   /////////////////////////////////////////////////////////////
+  delete carbonfibersupportlist;
+  delete carbonfiberlowersupportlist;
+  delete ssdhybridcomponentslist;
+  delete laddersupportlist;
+  /////////////////////////////////////////////////////////////
+  fBasicObjects = kTRUE;
+}
+/////////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::SetSSDSensor(){
+  ////////////////////////////////////////////////////////////////
+  // Method generating SSD Sensors: it sets the private variables
+  // fSSDSensor5, fSSDSensor6  
+  ////////////////////////////////////////////////////////////////
   Double_t ssdsensitivelength = fgkSSDSensorLength-2.*fgkSSDSensorInsensitiveLength;
   Double_t ssdsensitivewidth  = fgkSSDSensorWidth-2.*fgkSSDSensorInsensitiveWidth;
   TGeoBBox* ssdsensorsensitiveshape = new TGeoBBox("SSDSensorSensitiveShape",
-                                                0.5*ssdsensitivelength,
                                                 0.5*ssdsensitivewidth,
-                                                0.5*fgkSSDSensorHeight);
-  TGeoVolume* ssdsensorsensitive = 
-      new TGeoVolume(fgkSSDSensitiveVolName,ssdsensorsensitiveshape,fSSDSensorMedium);
-  ssdsensorsensitive->SetLineColor(fColorSilicon);
+                                                0.5*fgkSSDSensorHeight,
+                                                0.5*ssdsensitivelength);
+  TGeoVolume* ssdsensorsensitiveLay5 = 
+       new TGeoVolume(fgkSSDsensitiveVolName5,ssdsensorsensitiveshape,fSSDSensorMedium);
+  TGeoVolume* ssdsensorsensitiveLay6 = 
+       new TGeoVolume(fgkSSDsensitiveVolName6,ssdsensorsensitiveshape,fSSDSensorMedium);
+  ssdsensorsensitiveLay5->SetLineColor(fColorSilicon);
+  ssdsensorsensitiveLay6->SetLineColor(fColorSilicon);
   TGeoBBox* ssdsensorinsensitiveshape[2];
   ssdsensorinsensitiveshape[0] = new TGeoBBox("SSDSensorInsensitiveShape1",
-                                                0.5*fgkSSDSensorLength,
                                                 0.5*fgkSSDSensorInsensitiveWidth,
-                                                0.5*fgkSSDSensorHeight);
+                                                0.5*fgkSSDSensorHeight,
+                                                0.5*fgkSSDSensorLength);
   ssdsensorinsensitiveshape[1] = new TGeoBBox("SSDSensorInsensitiveShape2",
-                                                0.5*fgkSSDSensorInsensitiveWidth,
                                                 0.5*ssdsensitivewidth,
-                                                0.5*fgkSSDSensorHeight);
+                                                0.5*fgkSSDSensorHeight,
+                                                0.5*fgkSSDSensorInsensitiveWidth);
   const char* ssdsensorinsensitivename[2] = {"SSDSensorInsensitive1",
                                              "SSDSensorInsensitive2"};
   TGeoVolume* ssdsensorinsensitive[2];
@@ -1119,202 +1794,689 @@ TGeoVolume* AliITSv11GeometrySSD::GetSSDSensor(){
                      fSSDSensorMedium);
       ssdsensorinsensitive[i]->SetLineColor(fColorCarbonFiber);
   }
-  TGeoVolume* ssdsensorinsensitivevol = 
-                              new TGeoVolumeAssembly("SSDSensorInsensitiveVol");
-  for(Int_t i=0; i<4; i++) 
-            ssdsensorinsensitivevol->AddNode(i%2==0 ? ssdsensorinsensitive[0]:
-            ssdsensorinsensitive[1],i<2?1:2,
-                  new TGeoTranslation(0.5*(1.-TMath::Power(-1.,i))*(i==1? 1.:-1.)
-      *     (ssdsensorsensitiveshape->GetDX()+ssdsensorinsensitiveshape[1]->GetDX()),
-                        0.5*(1.+TMath::Power(-1.,i))*(i==0?-1.: 1.)
-      *     (ssdsensorsensitiveshape->GetDY()+ssdsensorinsensitiveshape[0]->GetDY()),0.));            
-  TGeoVolume* ssdsensor = new TGeoVolumeAssembly("SSDSensor");
-  ssdsensor->AddNode(ssdsensorsensitive,1),ssdsensor->AddNode(ssdsensorinsensitivevol,1);
-  return ssdsensor;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDChipAssembly() const{
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Chip Assembly    
+  // Virtual Volume containing SSD Sensor  
   /////////////////////////////////////////////////////////////
-  const Int_t kssdchiprownumber = 2;
-  TGeoBBox* ssdchipcompshape[2];
-  ssdchipcompshape[0] =  new TGeoBBox("SSDChipCompShape",
-                                                                               0.5*fgkSSDChipLength,
-                                                                               0.5*fgkSSDChipWidth,
-                                                                               0.5*(fgkSSDChipHeight-fgkSSDChipGlueHeight));
-  ssdchipcompshape[1] =  new TGeoBBox("SSDChipGlueCompShape",
-                                                                               0.5*fgkSSDChipLength,
-                                                                               0.5*fgkSSDChipWidth,
-                                                                               0.5*fgkSSDChipGlueHeight);
-  TGeoVolume* ssdchipcomp[2];
-  ssdchipcomp[0] = new TGeoVolume("SSDChipComp",ssdchipcompshape[0],fSSDChipMedium);
-  ssdchipcomp[1] = new TGeoVolume("SSDChipGlueComp",ssdchipcompshape[1],
-                                                                 fSSDChipGlueMedium);
-  ssdchipcomp[0]->SetLineColor(fColorSilicon);  
-  ssdchipcomp[1]->SetLineColor(fColorEpoxy);
-  TGeoTranslation* ssdchipcomptrans[2];
-  ssdchipcomptrans[0] = new TGeoTranslation(0.,0.,-ssdchipcompshape[1]->GetDZ());
-  ssdchipcomptrans[1] = new TGeoTranslation(0.,0.,ssdchipcompshape[0]->GetDZ());
-  TGeoVolume* ssdchip = new TGeoVolumeAssembly("SSDChip");  
-  for(Int_t i=0; i<2; i++) ssdchip->AddNode(ssdchipcomp[i],1,ssdchipcomptrans[i]);
-  Double_t ssdchipseparation[2] = {fgkSSDChipLength+fgkSSDChipSeparationLength,
-                                                 fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1]
-                                  -  2.*(fgkSSDStiffenerWidth-fgkSSDStiffenerToChipDist
-                                  -  0.5*fgkSSDChipWidth)};
-  TGeoVolume* ssdchipassembly = new TGeoVolumeAssembly("SSDChipAssembly"); 
-  for(Int_t i=0; i<kssdchiprownumber; i++)
-    for(Int_t j=0; j<fgkSSDChipNumber; j++) 
-               ssdchipassembly->AddNode(ssdchip,fgkSSDChipNumber*i+j+1,
-               new TGeoTranslation(j*ssdchipseparation[0],i*ssdchipseparation[1],0.));
-  return ssdchipassembly;
+  TGeoBBox* virtualSSDSensorShape = new TGeoBBox("SSDSensorShape",
+                                                                                            0.5*fgkSSDSensorWidth,
+                                                                                            0.5*fgkSSDSensorHeight,
+                                                                                            0.5*fgkSSDSensorLength);
+  fSSDSensor5 = new TGeoVolume("ITSssdSensor5",virtualSSDSensorShape,
+                                                                                fSSDAir);      
+  fSSDSensor6 = new TGeoVolume("ITSssdSensor6",virtualSSDSensorShape,
+                                                                                fSSDAir);      
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<4; i++){ 
+            fSSDSensor5->AddNode(i%2==0 ? ssdsensorinsensitive[0]:
+            ssdsensorinsensitive[1],i<2?1:2,
+                       new TGeoTranslation(
+                        0.5*(1.+TMath::Power(-1.,i))*(i==0?-1.: 1.)
+      *   (ssdsensorsensitiveshape->GetDX()+ssdsensorinsensitiveshape[0]->GetDX()),0.,                 
+                       0.5*(1.-TMath::Power(-1.,i))*(i==1? 1.:-1.)
+      *   (ssdsensorsensitiveshape->GetDZ()+ssdsensorinsensitiveshape[1]->GetDZ())));    
+            fSSDSensor6->AddNode(i%2==0 ? ssdsensorinsensitive[0]:
+            ssdsensorinsensitive[1],i<2?1:2,
+                       new TGeoTranslation(
+                        0.5*(1.+TMath::Power(-1.,i))*(i==0?-1.: 1.)
+      *   (ssdsensorsensitiveshape->GetDX()+ssdsensorinsensitiveshape[0]->GetDX()),0.,                 
+                       0.5*(1.-TMath::Power(-1.,i))*(i==1? 1.:-1.)
+      *   (ssdsensorsensitiveshape->GetDZ()+ssdsensorinsensitiveshape[1]->GetDZ())));    
+  }
+    fSSDSensor5->AddNode(ssdsensorsensitiveLay5,1);
+    fSSDSensor6->AddNode(ssdsensorsensitiveLay6,1);
+}
+///////////////////////////////////////////////////////////////////////////////
+TList* AliITSv11GeometrySSD::GetCarbonFiberSupportList(){
+  /////////////////////////////////////////////////////////////  
+  // Method generating the Carbon Fiber Support   
+  /////////////////////////////////////////////////////////////  
+  const Int_t kvertexnumber = 4;
+  const Int_t kshapesnumber = 2;
+  TVector3** vertexposition[kshapesnumber];
+  for(Int_t i=0; i<kshapesnumber; i++) vertexposition[i] = new TVector3*[kvertexnumber];
+  Double_t carbonfibersupportxaxisEdgeproj = 
+               fgkCarbonFiberSupportEdgeLength*TMath::Cos(fgkCarbonFiberJunctionAngle[0]
+       *       TMath::DegToRad());
+  Double_t theta = TMath::ATan(fgkCarbonFiberSupportYAxisLength
+                                /                         fgkCarbonFiberSupportXAxisLength);
+  /////////////////////
+  //Vertex Positioning
+  ////////////////////
+  vertexposition[0][0] = new TVector3();
+  vertexposition[0][1] = new TVector3(fgkCarbonFiberSupportXAxisLength,
+                                     fgkCarbonFiberSupportYAxisLength, 0);
+  vertexposition[0][2] = new TVector3(carbonfibersupportxaxisEdgeproj,
+                                                                         carbonfibersupportxaxisEdgeproj
+                                     *                   TMath::Tan(theta), 0);
+  vertexposition[0][3] = new TVector3(fgkCarbonFiberSupportXAxisLength
+                                          -                      carbonfibersupportxaxisEdgeproj,
+                                                                         fgkCarbonFiberSupportYAxisLength
+                                     - vertexposition[0][2]->Y(), 0);
+  ////////////////////////////////////////////////////
+  //Setting the parameters for Isometry Transformation
+  ////////////////////////////////////////////////////
+  Double_t symmetryplaneposition = (fgkCarbonFiberSupportYAxisLength
+                                                                +      fgkCarbonFiberSupportTopEdgeDist[0]
+                                                                +      fgkCarbonFiberSupportWidth);
+  Double_t* param = new Double_t[4]; 
+  param[0] = 0., param[1] = 1., param[2] = 0., param[3] = -symmetryplaneposition;
+  for(Int_t j=0; j<kvertexnumber; j++) vertexposition[1][j] = 
+    new TVector3((GetReflection(vertexposition[0][j],param))->X(),
+                (GetReflection(vertexposition[0][j],param))->Y(), 0);
+  const char* carbonfibersupportshapename[kshapesnumber] = 
+                                               {"CarbonFiberSupportShape1","CarbonFiberSupportShape2"};
+  const char* carbonfibersupportname[kshapesnumber] = 
+                                               {"CarbonFiberSupport1","CarbonFiberSupport2"};
+  TGeoArb8* carbonfibersupportshape[kshapesnumber]; 
+  TGeoVolume* carbonfibersupport[kshapesnumber];
+  TList* carbonfibersupportlist = new TList();
+  Double_t width[2] = {fgkCarbonFiberSupportWidth,fgkCarbonFiberSupportWidth};
+  Double_t carbonfibersupportheight = 
+         carbonfibersupportxaxisEdgeproj*TMath::Tan(fgkCarbonFiberJunctionAngle[0]
+         *TMath::DegToRad());
+  for(Int_t i = 0; i< kshapesnumber; i++){
+   carbonfibersupportshape[i] = 
+                                       GetArbShape(vertexposition[i],width,carbonfibersupportheight,
+                                                               carbonfibersupportshapename[i],i==0 ? 1: -1);
+   carbonfibersupport[i] = new TGeoVolume(carbonfibersupportname[i],
+                                                  carbonfibersupportshape[i],fSSDCarbonFiberMedium);
+   carbonfibersupport[i]->SetLineColor(fColorCarbonFiber);
+   carbonfibersupportlist->Add(carbonfibersupport[i]); 
+   }
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i< kshapesnumber; i++){
+     for(Int_t j=0; j< kvertexnumber; j++)
+          delete vertexposition[i][j];
+       delete [] vertexposition[i];
+  }
+  delete [] param;
+  /////////////////////////////////////////////////////////////
+   return carbonfibersupportlist;
+}
+/////////////////////////////////////////////////////////////////////////////////
+TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberJunction(Double_t width){
+  /////////////////////////////////////////////////////////////
+  // Method generating SSD Carbon Fiber Junction
+  /////////////////////////////////////////////////////////////
+  const Int_t kvertexnumber = 6;
+  TGeoXtru* carbonfiberjunctionshape = new TGeoXtru(2);
+  Double_t reflectionparam[4] = {TMath::Tan(fgkCarbonFiberJunctionAngle[0]
+                                           *  TMath::DegToRad()),-1.,0.,0.};
+  TVector3* vertex[kvertexnumber];
+  vertex[0] = new TVector3();
+  vertex[3] = new TVector3(fgkCarbonFiberJunctionEdge[0]
+                       *                         TMath::Cos(fgkCarbonFiberJunctionAngle[0]
+                       *                         TMath::DegToRad()),
+                                                 fgkCarbonFiberJunctionEdge[0]
+                       *                         TMath::Sin(fgkCarbonFiberJunctionAngle[0]
+                                       * TMath::DegToRad()), 0);
+  vertex[4] = new TVector3(fgkCarbonFiberJunctionLength-fgkSSDTolerance,
+                          fgkCarbonFiberJunctionEdge[1], 0);
+  vertex[5] = new TVector3(fgkCarbonFiberJunctionLength-fgkSSDTolerance, 0, 0); 
+  vertex[1] = GetReflection(vertex[5],reflectionparam);        
+  vertex[2] = GetReflection(vertex[4],reflectionparam);        
+  Double_t xvertexpoints[6], yvertexpoints[6];
+  for(Int_t i=0; i<kvertexnumber; i++) 
+         xvertexpoints[i] = vertex[i]->X(), yvertexpoints[i] = vertex[i]->Y();
+  carbonfiberjunctionshape->DefinePolygon(kvertexnumber,xvertexpoints,yvertexpoints);
+  carbonfiberjunctionshape->DefineSection(0,-0.5*width);
+  carbonfiberjunctionshape->DefineSection(1,0.5*width);
+  TGeoVolume* carbonfiberjunction = new TGeoVolume("CarbonFiberJunction",
+                                                               carbonfiberjunctionshape,fSSDCarbonFiberMedium);
+  carbonfiberjunction->SetLineColor(fColorCarbonFiber);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for (Int_t i=0; i<kvertexnumber; i++) delete vertex[i];
+  ///////////////////////////////////////////////////////////// 
+  return carbonfiberjunction;
+}
+////////////////////////////////////////////////////////////////////////////////
+TList* AliITSv11GeometrySSD::GetCarbonFiberLowerSupportList(){
+  /////////////////////////////////////////////////////////////
+  // Method generating the Carbon Fiber Lower Support   
+  /////////////////////////////////////////////////////////////  
+  const Int_t kvertexnumber = 4;
+  const Int_t kshapesnumber = 2;
+  Double_t width[2] = {fgkCarbonFiberLowerSupportWidth,
+                                                               fgkCarbonFiberLowerSupportWidth};
+  TVector3** vertexposition[kshapesnumber];
+  for(Int_t i = 0; i<kshapesnumber; i++) vertexposition[i] = 
+                                                new TVector3*[kvertexnumber];
+  //First Shape Vertex Positioning
+  vertexposition[0][0] = new TVector3(fgkCarbonFiberLowerSupportLowerLenght, 0, 0);
+  vertexposition[0][1] = new TVector3(fgkCarbonFiberTriangleLength
+                                     - fgkCarbonFiberLowerSupportLowerLenght, 0, 0);
+  vertexposition[0][2] = new TVector3();
+  vertexposition[0][3] = new TVector3(fgkCarbonFiberTriangleLength, 0, 0);
+  //Second Shape Vertex Positioning
+  Double_t theta = TMath::ATan((fgkCarbonFiberLowerSupportVolumePosition[1]
+                                -                              fgkCarbonFiberLowerSupportVolumePosition[0])
+                                /                              fgkCarbonFiberTriangleLength);
+  vertexposition[1][0] = new TVector3(vertexposition[0][0]->X(),
+                                                               vertexposition[0][0]->X()*TMath::Tan(theta)
+                                     + fgkCarbonFiberLowerSupportVolumePosition[0], 0);
+  vertexposition[1][1] = new TVector3(vertexposition[0][1]->X(),
+                                                               vertexposition[0][1]->X()*TMath::Tan(theta)
+                                     + fgkCarbonFiberLowerSupportVolumePosition[0], 0);
+  vertexposition[1][2] = new TVector3(0.,fgkCarbonFiberLowerSupportVolumePosition[0], 0);
+  vertexposition[1][3] = new TVector3(fgkCarbonFiberTriangleLength,
+                                     fgkCarbonFiberLowerSupportVolumePosition[1], 0);
+  const char* carbonfiberlowersupportshapename[kshapesnumber] = 
+                         {"CarbonFiberLowerSupportShape1","CarbonFiberLowerSupportShape2"};
+  const char* carbonfiberlowersupportname[kshapesnumber] = 
+                         {"CarbonFiberLowerSupport1","CarbonFiberLowerSupport2"};
+  TGeoArb8* carbonfiberlowersupportshape[kshapesnumber];
+  TGeoVolume* carbonfiberlowersupport[kshapesnumber];
+  TList* carbonfiberlowersupportlist = new TList();
+  for(Int_t i = 0; i< kshapesnumber; i++){ 
+       carbonfiberlowersupportshape[i] = 
+                                                               GetArbShape(vertexposition[i],width,
+                                                                                       fgkCarbonFiberLowerSupportHeight,
+                                                                                       carbonfiberlowersupportshapename[i]);
+    carbonfiberlowersupport[i] = new TGeoVolume(carbonfiberlowersupportname[i],
+                                               carbonfiberlowersupportshape[i],fSSDCarbonFiberMedium);
+       carbonfiberlowersupport[i]->SetLineColor(fColorCarbonFiber);
+    carbonfiberlowersupportlist->Add(carbonfiberlowersupport[i]);
+  }
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i< kshapesnumber; i++){
+     for(Int_t j=0; j< kvertexnumber; j++)
+          delete vertexposition[i][j];
+       delete [] vertexposition[i];
+  }
+  /////////////////////////////////////////////////////////////
+  return carbonfiberlowersupportlist;
+}
+///////////////////////////////////////////////////////////////////////////////
+TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupport(Double_t length, Double_t height, 
+                                                                Double_t width, const Double_t* thickness)const{
+  /////////////////////////////////////////////////////////////
+  // Method generating the Sensor Support   
+  /////////////////////////////////////////////////////////////  
+       const Int_t kvertexnumber = 6;
+       TGeoXtru* ssdsensorsupportshape = new TGeoXtru(2);      
+    TVector3* vertexposition[kvertexnumber];
+       vertexposition[0] = new TVector3();     
+       vertexposition[1] = new TVector3(0.0,length,0); 
+       vertexposition[2] = new TVector3(thickness[1],vertexposition[1]->Y(),0);        
+       vertexposition[3] = new TVector3(vertexposition[2]->X(),thickness[0],0);        
+       vertexposition[4] = new TVector3(height,vertexposition[3]->Y(),0);      
+       vertexposition[5] = new TVector3(vertexposition[4]->X(),0,0);   
+       Double_t xvertexpoints[6], yvertexpoints[6];
+       for(Int_t i=0; i<kvertexnumber; i++) 
+               xvertexpoints[i] = vertexposition[i]->X(), 
+               yvertexpoints[i] = vertexposition[i]->Y();
+    ssdsensorsupportshape->DefinePolygon(kvertexnumber,xvertexpoints,yvertexpoints);
+    ssdsensorsupportshape->DefineSection(0,-0.5*width);
+    ssdsensorsupportshape->DefineSection(1,0.5*width);
+    TGeoVolume* ssdsensorsupport = new TGeoVolume("SSDSensorSupport",
+                                                                ssdsensorsupportshape,fSSDSensorSupportMedium);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+       for (Int_t i=0; i<kvertexnumber; i++)
+               delete vertexposition[i];
+  /////////////////////////////////////////////////////////////
+    return ssdsensorsupport;
+}
+////////////////////////////////////////////////////////////////////////////////
+TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeSupport(Int_t nedges){
+  /////////////////////////////////////////////////////////////
+  // Method generating the Cooling Tube Support
+  /////////////////////////////////////////////////////////////
+  if(nedges%2!=0) nedges--;    
+  const Int_t kvertexnumber = nedges+5;
+  Double_t phi = TMath::ASin(0.5*fgkCoolingTubeSupportHeight
+                          /                     fgkCoolingTubeSupportRmax)*TMath::RadToDeg();
+  Double_t angle = 90.+phi;
+  Double_t psi = 90.-phi;
+  ///////////////////////////////////////
+  // Vertex Positioning for TGeoXTru
+  ///////////////////////////////////////
+  TVector3** vertexposition = new TVector3*[kvertexnumber];
+
+  Double_t router = fgkCoolingTubeSupportRmin/CosD(phi/nedges);  //  Recalc inner radius so that tube fits inside  
+  vertexposition[0] = new TVector3(router*CosD(angle),
+                                  router*SinD(angle), 0);
+  vertexposition[1] = new TVector3(fgkCoolingTubeSupportRmax*CosD(angle),
+                                  fgkCoolingTubeSupportRmax*SinD(angle),0);
+  vertexposition[2] = new TVector3(vertexposition[1]->X(),
+                                  fgkCoolingTubeSupportRmax, 0);
+  vertexposition[3] = new TVector3(-vertexposition[1]->X(),
+                                  fgkCoolingTubeSupportRmax, 0);
+  vertexposition[4] = new TVector3(-vertexposition[1]->X(),
+                                  vertexposition[1]->Y(), 0);
+
+  for(Int_t i=0; i<nedges; i++)
+       vertexposition[i+5] = 
+               new TVector3(router*CosD(psi+i*(2.*phi/nedges)),
+                            router*SinD(psi+i*(2.*phi/nedges)), 0);
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXTru Volume definition for Cooling Tube Support Arc Part
+  ///////////////////////////////////////////////////////////////////////
+  TGeoXtru* coolingtubesupportarcshape = new TGeoXtru(2);      
+  Double_t* xvertexpoints = new Double_t[kvertexnumber];       
+  Double_t* yvertexpoints = new Double_t[kvertexnumber];       
+  for(Int_t i=0; i<kvertexnumber; i++){
+       xvertexpoints[i] = vertexposition[i]->X();
+       yvertexpoints[i] = vertexposition[i]->Y();
+  } 
+  coolingtubesupportarcshape->DefinePolygon(kvertexnumber,xvertexpoints,
+                                                                                       yvertexpoints);
+  coolingtubesupportarcshape->DefineSection(0,-0.5*fgkCoolingTubeSupportWidth);
+  coolingtubesupportarcshape->DefineSection(1,0.5*fgkCoolingTubeSupportWidth);
+  TGeoVolume* coolingtubesupportarc = new TGeoVolume("CoolingTubeSupportArc",
+                                                                         coolingtubesupportarcshape,
+                                                                                 fSSDTubeHolderMedium);
+  coolingtubesupportarc->SetLineColor(fColorG10);
+  //////////////////////////////////////////////////////////////////////////
+  // TGeoTubeSeg Volume definition for Cooling Tube Support TGeoTubeSeg Part
+  //////////////////////////////////////////////////////////////////////////
+  TGeoTubeSeg* coolingtubesupportsegshape = 
+                                                       new TGeoTubeSeg(fgkCoolingTubeSupportRmin,
+                                                                                       fgkCoolingTubeSupportRmax,
+                                                                                       0.5*fgkCoolingTubeSupportWidth,
+                                                                                       phi,360-phi);
+  TGeoVolume* coolingtubesupportseg = new TGeoVolume("CoolingTubeSupportSeg",
+                                                                                       coolingtubesupportsegshape,
+                                                                                       fSSDTubeHolderMedium);
+  coolingtubesupportseg->SetLineColor(fColorG10);
+  //////////////////////////////////////////////////////////////////////////
+  // TGeoBBox Volume definition for Cooling Tube Support Box Part
+  //////////////////////////////////////////////////////////////////////////
+  Double_t* boxorigin = new Double_t[3];
+  Double_t boxlength = fgkCoolingTubeSupportLength-2.*fgkCoolingTubeSupportRmax;
+  boxorigin[0] = fgkCoolingTubeSupportRmax+0.5*boxlength, boxorigin[1] = boxorigin[2] = 0.;
+  TGeoBBox* coolingtubesupportboxshape = new TGeoBBox(0.5*boxlength,
+                                                                                0.5*fgkCoolingTubeSupportHeight,
+                                                                                0.5*fgkCoolingTubeSupportWidth,boxorigin);
+  TGeoVolume* coolingtubesupportbox = new TGeoVolume("CoolingTubeSupportBox",
+                               coolingtubesupportboxshape,fSSDTubeHolderMedium);
+  coolingtubesupportbox->SetLineColor(fColorG10);
+  //////////////////////////////////////////////////////////////////////////
+  // Cooling Tube for Cooling Tube Support 
+  //////////////////////////////////////////////////////////////////////////
+  TGeoXtru* coolingtubearcshape[2];
+  coolingtubearcshape[0] = new TGeoXtru(2);    
+  Double_t* xvert = new Double_t[nedges+2];
+  Double_t* yvert = new Double_t[nedges+2];
+  Double_t ratio = fgkCoolingTubeRmin/fgkCoolingTubeSupportRmin;
+  ////////////////////////////////////////
+  // Positioning the vertices for TGeoXTru
+  ////////////////////////////////////////
+  xvert[0] = 0., yvert[0] = 0.;
+  xvert[1] = vertexposition[0]->X()*ratio,  yvert[1] = vertexposition[0]->Y()*ratio;
+  for(Int_t i=0; i< nedges; i++)
+               xvert[i+2] = vertexposition[kvertexnumber-i-1]->X()*ratio,
+               yvert[i+2] = vertexposition[kvertexnumber-i-1]->Y()*ratio;
+  ////////////////////////////////////////
+  // Defining TGeoXTru PolyGone
+  ////////////////////////////////////////
+  coolingtubearcshape[0]->DefinePolygon(nedges+2,xvert,yvert);
+  coolingtubearcshape[0]->DefineSection(0,-0.5*fgkCoolingTubeSupportWidth);
+  coolingtubearcshape[0]->DefineSection(1,0.5*fgkCoolingTubeSupportWidth);
+  coolingtubearcshape[1] = GetArcShape(2.*phi,fgkCoolingTubeRmin,
+               fgkCoolingTubeRmax,nedges,fgkCoolingTubeSupportWidth);
+  TGeoVolume* coolingtubearc[2];
+  coolingtubearc[0] = new TGeoVolume("CoolingTubeWaterArcPart",
+                                                                 coolingtubearcshape[0],fSSDCoolingTubeWater);
+  coolingtubearc[1] = new TGeoVolume("CoolingTubePhynoxArcPart",
+                                                                 coolingtubearcshape[1],fSSDCoolingTubePhynox);
+  coolingtubearc[0]->SetLineColor(fColorWater);
+  coolingtubearc[1]->SetLineColor(fColorPhynox);
+  ////////////////////////////////////////////
+  // Defining TGeoTubeSeg Part of Cooling Tube
+  ////////////////////////////////////////////
+  TGeoTubeSeg* coolingtubesegshape[2];
+  coolingtubesegshape[0] = new TGeoTubeSeg(fgkCoolingTubeRmin,fgkCoolingTubeRmax,
+                                                       0.5*fgkCoolingTubeSupportWidth,phi,360-phi);
+  coolingtubesegshape[1] = new TGeoTubeSeg(0.,fgkCoolingTubeRmin,
+                                                       0.5*fgkCoolingTubeSupportWidth,phi,360-phi);
+  TGeoVolume* coolingtubeseg[2];
+  coolingtubeseg[0] = new TGeoVolume("CoolingTubePhynoxPart",
+                                                                coolingtubesegshape[0],fSSDCoolingTubePhynox);
+  coolingtubeseg[1] = new TGeoVolume("CoolingTubeWaterPart",
+                                                                coolingtubesegshape[1],fSSDCoolingTubeWater);
+  coolingtubeseg[0]->SetLineColor(fColorPhynox);
+  coolingtubeseg[1]->SetLineColor(fColorWater);
+  /////////////////////////////////////////////////////////////
+  // Virtual Volume containing Cooling Tube Support  
+  /////////////////////////////////////////////////////////////
+  TGeoXtru* virtualCoolingTubeSupportShape = new TGeoXtru(2);
+  const Int_t kvirtualvertexnumber = 8;
+  TVector3* virtualvertex[kvirtualvertexnumber];
+   ////////////////////////////////////////
+  // Positioning the vertices for TGeoXTru
+  ////////////////////////////////////////
+  virtualvertex[0] = new TVector3(-fgkCoolingTubeSupportRmax,-fgkCoolingTubeSupportRmax, 0); 
+  virtualvertex[1] = new TVector3(virtualvertex[0]->X(),-virtualvertex[0]->Y(),0);
+  virtualvertex[2] = new TVector3(-virtualvertex[0]->X(),virtualvertex[1]->Y(),0);
+  virtualvertex[3] = new TVector3(virtualvertex[2]->X(),0.5*fgkCoolingTubeSupportHeight,0);
+  virtualvertex[4] = new TVector3(virtualvertex[3]->X()+boxlength,virtualvertex[3]->Y(),0);
+  virtualvertex[5] = new TVector3(virtualvertex[4]->X(),-virtualvertex[4]->Y(),0);
+  virtualvertex[6] = new TVector3(virtualvertex[3]->X(),-virtualvertex[3]->Y(),0);
+  virtualvertex[7] = new TVector3(virtualvertex[2]->X(),-virtualvertex[2]->Y(),0);
+  Double_t xmothervertex[kvirtualvertexnumber], ymothervertex[kvirtualvertexnumber];
+  for(Int_t i=0; i< kvirtualvertexnumber; i++)
+       xmothervertex[i] = virtualvertex[i]->X(),
+       ymothervertex[i] = virtualvertex[i]->Y();
+  ////////////////////////////////////////
+  // Defining TGeoXTru PolyGone
+  ////////////////////////////////////////
+  virtualCoolingTubeSupportShape->DefinePolygon(kvirtualvertexnumber,xmothervertex,
+                                                                                                                                        ymothervertex);
+  virtualCoolingTubeSupportShape->DefineSection(0,-0.5*fgkCoolingTubeSupportWidth);
+  virtualCoolingTubeSupportShape->DefineSection(1,0.5*fgkCoolingTubeSupportWidth);
+  /*TGeoVolume* virtualcoolingtubesupport = new TGeoVolume("CoolingTubeSupport",
+    virtualCoolingTubeSupportShape,fSSDAir); */
+  TGeoVolume* virtualcoolingtubesupport = new TGeoVolumeAssembly("CoolingTubeSupport");
+
+  ////////////////////////////////////////
+  // Positioning Volumes in Virtual Volume
+  ////////////////////////////////////////
+  TGeoRotation* coolingtubesupportrot = new TGeoRotation(); 
+  coolingtubesupportrot->SetAngles(-90.0,0.0,0.0);
+  virtualcoolingtubesupport->AddNode(coolingtubesupportarc,1,coolingtubesupportrot);
+  virtualcoolingtubesupport->AddNode(coolingtubesupportbox,1);
+  virtualcoolingtubesupport->AddNode(coolingtubesupportseg,1);
+  //virtualcoolingtubesupport->AddNode(coolingtubearc[0],1,coolingtubesupportrot);
+  //virtualcoolingtubesupport->AddNode(coolingtubearc[1],1,coolingtubesupportrot);
+  //virtualcoolingtubesupport->AddNode(coolingtubeseg[0],1);
+  //virtualcoolingtubesupport->AddNode(coolingtubeseg[1],1);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete [] vertexposition;
+  delete [] xvertexpoints;
+  delete [] yvertexpoints;
+  delete [] xvert;
+  delete [] yvert;
+  for(Int_t i=0; i< kvirtualvertexnumber; i++)
+       delete virtualvertex[i];
+  /////////////////////////////////////////////////////////////
+       return virtualcoolingtubesupport;
 }
 /////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDStiffenerAssembly(){
+TList* AliITSv11GeometrySSD::GetSSDHybridParts(){
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Stiffener Assembly    
+  // Method generating List containing SSD Hybrid Components   
   /////////////////////////////////////////////////////////////
+  TList* ssdhybridlist = new TList();
   const Int_t kssdstiffenernumber = 2;
   Double_t ssdstiffenerseparation = fgkSSDSensorLength
                                                                  - 2.*fgkSSDModuleStiffenerPosition[1]
                                                                  -    fgkSSDStiffenerWidth;
-  TGeoVolume* ssdstiffener = new TGeoVolumeAssembly("SSDStiffener");
-////////////////////////////
-// Stiffener Volumes
-///////////////////////////
-  const Int_t kstiffenerboxnumber = 6;
-  TGeoBBox* ssdstiffenerboxshapes[kstiffenerboxnumber];
-  ssdstiffenerboxshapes[0] = new TGeoBBox("SSDStiffenerBoxShape1",
-                                                                                 0.5* fgkSSDStiffenerLength,
-                                                                                 0.5* fgkSSDStiffenerWidth,
-                                                                                 0.5*(fgkSSDStiffenerHeight
-                                                  -                   fgkSSDConnectorHeight));
-  ssdstiffenerboxshapes[1] = new TGeoBBox("SSDStiffenerBoxShape2",
-                                                                                 0.5*(fgkSSDConnectorPosition[0]
-                                                  -              2.0* fgkSSDConnectorLength
-                                                  -                               fgkSSDConnectorSeparation),
-                                                                                 0.5* fgkSSDStiffenerWidth,
-                                                                                 0.5* fgkSSDConnectorHeight);
-  ssdstiffenerboxshapes[2] = new TGeoBBox("SSDStiffenerBoxShape3",
-                                                                                 0.5*(fgkSSDConnectorSeparation
-                                                  +              2.*  fgkSSDConnectorLength),
-                                                                                 0.5* fgkSSDConnectorPosition[1],
-                                                                                 0.5* fgkSSDConnectorHeight);
-  ssdstiffenerboxshapes[3] = new TGeoBBox("SSDStiffenerBoxShape4",
-                                                                                       ssdstiffenerboxshapes[2]->GetDX(),
-                                                                                 0.5*(fgkSSDStiffenerWidth
-                                                  -                   fgkSSDConnectorPosition[1]
-                                                  -                   fgkSSDConnectorWidth),
-                                                                                 0.5* fgkSSDConnectorHeight);
-   ssdstiffenerboxshapes[4] = new TGeoBBox("SSDStiffenerBoxShape5",
-                                                                                 0.5* fgkSSDConnectorSeparation,
-                                                                                 0.5* fgkSSDConnectorWidth,
-                                                                                 0.5* fgkSSDConnectorHeight);
-   ssdstiffenerboxshapes[5] = new TGeoBBox("SSDStiffenerBoxShape6",
-                                                                                 0.5*(fgkSSDStiffenerLength
-                                                        -                                 fgkSSDConnectorPosition[0]),
-                                                                                 0.5* fgkSSDStiffenerWidth,
-                                                                                 0.5* fgkSSDConnectorHeight);
-  TGeoVolume* ssdstiffenerbox[kstiffenerboxnumber];
-  char ssdtiffenerboxname[30];
-  for(Int_t i=0; i<kstiffenerboxnumber; i++){ 
-        sprintf(ssdtiffenerboxname,"SSDStiffenerBox%i",i+1);
-    ssdstiffenerbox[i] = new TGeoVolume(ssdtiffenerboxname,ssdstiffenerboxshapes[i],
-                                                                         fSSDStiffenerMedium);
-       ssdstiffenerbox[i]->SetLineColor(fColorStiffener);
-  }
-////////////////////////////
-// Connector 
-///////////////////////////
-  TGeoBBox* ssdconnectorshape =  new TGeoBBox("SSDConnectorShape",
-                                                                                        0.5*fgkSSDConnectorLength,
-                                                                                        0.5*fgkSSDConnectorWidth,
-                                                                                        0.5*fgkSSDConnectorHeight);
-  TGeoVolume* ssdconnector    = new TGeoVolume("SSDConnector",ssdconnectorshape,
-                                                                                               fSSDStiffenerConnectorMedium); 
-  ssdconnector->SetLineColor(fColorAl);
-  const Int_t kssdconnectornumber = 2;
-  TGeoTranslation* ssdconnectortrans[kssdconnectornumber];
-  ssdconnectortrans[0] = new TGeoTranslation("SSDConnectorTrans1",
-        -  ssdstiffenerboxshapes[0]->GetDX()+fgkSSDConnectorPosition[0]
-               -  fgkSSDConnectorSeparation-1.5*fgkSSDConnectorLength,
-                  ssdstiffenerboxshapes[0]->GetDY()-fgkSSDConnectorPosition[1]
-               -  ssdconnectorshape->GetDY(),
-                  ssdstiffenerboxshapes[0]->GetDZ()+ssdconnectorshape->GetDZ());       
-  ssdconnectortrans[1] = new TGeoTranslation("SSDConnectorTrans2",
-        -  ssdstiffenerboxshapes[0]->GetDX()+fgkSSDConnectorPosition[0]
-        -  0.5*fgkSSDConnectorLength,
-           ssdstiffenerboxshapes[0]->GetDY()-fgkSSDConnectorPosition[1]
-               -  ssdconnectorshape->GetDY(),
-                  ssdstiffenerboxshapes[0]->GetDZ()+ssdconnectorshape->GetDZ());
-  for(Int_t i=0; i<kssdconnectornumber; i++)
-                       ssdstiffener->AddNode(ssdconnector,i+1,ssdconnectortrans[i]);   
-//////////////////////////////////////
-// TGeoTranslation for Stiffener Boxes
-//////////////////////////////////////
-  TGeoTranslation* ssdstiffenerboxtrans[kstiffenerboxnumber];
-  ssdstiffenerboxtrans[0] = new TGeoTranslation("SSDStiffenerBoxTrans1",0.,0.,0.);
-  ssdstiffenerboxtrans[1] = new TGeoTranslation("SSDStiffenerBoxTrans2",
-                - (ssdstiffenerboxshapes[0]->GetDX()-ssdstiffenerboxshapes[1]->GetDX()),
-                   0.,
-                       ssdstiffenerboxshapes[0]->GetDZ()+ssdstiffenerboxshapes[1]->GetDZ());
-  ssdstiffenerboxtrans[2] = new TGeoTranslation("SSDStiffenerBoxTrans3",
-         - ssdstiffenerboxshapes[0]->GetDX()-ssdstiffenerboxshapes[2]->GetDX()
-                + fgkSSDConnectorPosition[0],
-                  ssdstiffenerboxshapes[0]->GetDY()-ssdstiffenerboxshapes[2]->GetDY(),
-                  ssdstiffenerboxshapes[0]->GetDZ()+ssdstiffenerboxshapes[2]->GetDZ());
-  ssdstiffenerboxtrans[3] = new TGeoTranslation("SSDStiffenerBoxTrans4",
-         - ssdstiffenerboxshapes[0]->GetDX()-ssdstiffenerboxshapes[3]->GetDX()
-                + fgkSSDConnectorPosition[0],
-                - ssdstiffenerboxshapes[0]->GetDY()+ssdstiffenerboxshapes[3]->GetDY(),
-                  ssdstiffenerboxshapes[0]->GetDZ()+ssdstiffenerboxshapes[3]->GetDZ());
-  ssdstiffenerboxtrans[4] = new TGeoTranslation("SSDStiffenerBoxTrans5",
-                - ssdstiffenerboxshapes[0]->GetDX()+fgkSSDConnectorPosition[0]
-                - 0.5*fgkSSDConnectorSeparation-2.*ssdconnectorshape->GetDX(),
-                  ssdstiffenerboxshapes[0]->GetDY()-fgkSSDConnectorPosition[1]
-                - ssdconnectorshape->GetDY(),
-                  ssdstiffenerboxshapes[0]->GetDZ()+ssdconnectorshape->GetDZ());
-  ssdstiffenerboxtrans[5] = new TGeoTranslation("SSDStiffenerBoxTrans6",
-         - ssdstiffenerboxshapes[0]->GetDX()+fgkSSDConnectorPosition[0]
-                + ssdstiffenerboxshapes[5]->GetDX(),
-                  0.,
-                  ssdstiffenerboxshapes[0]->GetDZ()+ssdstiffenerboxshapes[5]->GetDZ());
-  for(Int_t i=0; i<kstiffenerboxnumber; i++) 
-               ssdstiffener->AddNode(ssdstiffenerbox[i],1,ssdstiffenerboxtrans[i]);    
-  TGeoCombiTrans* ssdstiffenercombitrans[kssdstiffenernumber];
-  char ssdstiffenercombitransname[30];
-    for(Int_t i=0; i<kssdstiffenernumber; i++){ 
-       sprintf(ssdstiffenercombitransname,"SSDStiffenerCombiTrans%i",i+1);
-    ssdstiffenercombitrans[i] = new TGeoCombiTrans(ssdstiffenercombitransname,
-                       0.,i*ssdstiffenerseparation,0.,new TGeoRotation("",180*(1-i),0.,0.));
-  }
+  Double_t ssdchipcablesradius[kssdstiffenernumber];
+  for(Int_t i=0; i<kssdstiffenernumber; i++)
+         ssdchipcablesradius[i] = 0.25*(fgkSSDChipCablesHeight[i+2]
+                              -  fgkSSDChipCablesHeight[0]
+                              -  fgkSSDChipCablesHeight[1]);
+  /////////////////////////////////////////////////////////////
+  // Mother Volumes Containers 
+  /////////////////////////////////////////////////////////////
+  const Int_t kmothernumber = 2;
+  const Int_t kmothervertexnumber = 8;
+  Double_t xmothervertex[kmothernumber][kmothervertexnumber]; 
+  Double_t ymothervertex[kmothernumber][kmothervertexnumber]; 
+
+  TGeoVolumeAssembly* ssdhybridassembly[kmothernumber];
+  TGeoVolume* ssdhybridmother[kmothernumber][2];
+
+  TGeoRotation hybridmotherrotR(TGeoRotation("",-90.0,0.0,0.0)*TGeoRotation("",0.0,90.0,0.0)*TGeoRotation("",90.,180.,-90));
+  TGeoRotation hybridmotherrotL(TGeoRotation("",180.,0.0,0.0)*hybridmotherrotR);
+  TGeoRotation *hybridmotherrotInv = new TGeoRotation(hybridmotherrotR.Inverse());
+
+  const char* ssdhybridmothername[kmothernumber] = {"SSDHybridMother1","SSDHybridMother2"};
+  for(Int_t i=0; i<kmothernumber; i++){
+    xmothervertex[i][0] = -0.5*fgkSSDStiffenerWidth;
+    ymothervertex[i][0] = 0.5*fgkSSDStiffenerHeight;
+    xmothervertex[i][1] = -0.5*fgkSSDStiffenerWidth;
+    ymothervertex[i][1] = -0.5*fgkSSDStiffenerHeight-fgkSSDChipHeight      
+      -fgkSSDChipCablesHeight[i+2];
+    
+    xmothervertex[i][2] = 0.5*(fgkSSDSensorLength-ssdstiffenerseparation); //0.5*fgkSSDStiffenerWidth;
+    ymothervertex[i][2] = -0.5*fgkSSDStiffenerHeight-fgkSSDChipHeight -fgkSSDChipCablesHeight[i+2];
+    xmothervertex[i][3] = xmothervertex[i][2];
+    ymothervertex[i][3] = ymothervertex[i][2]+fgkSSDChipCablesHeight[0]+fgkSSDChipCablesHeight[1]+fgkSSDTolerance;
+
+    xmothervertex[i][4] = xmothervertex[i][2]-0.4;  
+    ymothervertex[i][4] = ymothervertex[i][3];
+    xmothervertex[i][5] = xmothervertex[i][4];
+    ymothervertex[i][5] = ymothervertex[i][4]+2*ssdchipcablesradius[i]-fgkSSDTolerance;
+
+    xmothervertex[i][6] = 0.5*fgkSSDStiffenerWidth+ssdchipcablesradius[i]+0.3*fgkmm;
+    ymothervertex[i][6] = ymothervertex[i][5];
+    
+    xmothervertex[i][7] = xmothervertex[i][6];
+    ymothervertex[i][7] = 0.5*fgkSSDStiffenerHeight;
+    TGeoXtru *shape = new TGeoXtru(2);
+    shape->DefinePolygon(8,xmothervertex[i],ymothervertex[i]);
+    shape->DefineSection(0,-0.5*fgkSSDStiffenerLength);
+    shape->DefineSection(1,0.5*fgkSSDStiffenerLength);
+    ssdhybridmother[i][0] = new TGeoVolume(TString(ssdhybridmothername[i])+"L",shape,fSSDAir);
+    ssdhybridmother[i][1] = new TGeoVolume(TString(ssdhybridmothername[i])+"R",shape,fSSDAir);
+    ssdhybridassembly[i] = new TGeoVolumeAssembly(ssdhybridmothername[i]);
+   }   
+  /////////////////////////////////////////////////////////////
+  // SSD Stiffener   
+  /////////////////////////////////////////////////////////////
+  TGeoBBox* ssdstiffenershape = new TGeoBBox("SSDStiffenerShape",
+                                             0.5*fgkSSDStiffenerLength,
+                                             0.5*(fgkSSDStiffenerWidth-fgkSSDTolerance),
+                                             0.5*fgkSSDStiffenerHeight);
+  TGeoVolume* ssdstiffener = new TGeoVolume("SSDStiffener",ssdstiffenershape,
+                                            fSSDStiffenerMedium);  
+  ssdstiffener->SetLineColor(fColorStiffener); 
+
 ////////////////////////////
 // Capacitor 0603-2200 nF
 ///////////////////////////
   const Int_t knapacitor0603number = 5;
+  TGeoBBox* capacitor0603mothershape =  new TGeoBBox("Capacitor0603MotherShape",
+                                              0.5*fgkSSDCapacitor0603Length + fgkSSDCapacitor0603CapLength,
+                                              0.5*fgkSSDCapacitor0603Width,
+                                              0.5*fgkSSDCapacitor0603Height);
+  TGeoVolume* capacitor0603mother = new TGeoVolume("Capacitor0603Mother",capacitor0603mothershape,
+                                             fSSDAir); 
+
   TGeoBBox* capacitor0603shape =  new TGeoBBox("Capacitor0603Shape",
-                                                                                        0.5*fgkSSDCapacitor0603Length,
-                                                                                        0.5*fgkSSDCapacitor0603Width,
-                                                                                        0.5*fgkSSDCapacitor0603Height);
+                                              0.5*fgkSSDCapacitor0603Length,
+                                              0.5*fgkSSDCapacitor0603Width,
+                                              0.5*fgkSSDCapacitor0603Height);
   TGeoVolume* capacitor0603 = new TGeoVolume("Capacitor0603",capacitor0603shape,
                                              fSSDStiffener0603CapacitorMedium); 
   capacitor0603->SetLineColor(fColorAl);
+  TGeoTranslation *cap0603trans = new TGeoTranslation(0.,0.,0.);
+  capacitor0603mother->AddNode(capacitor0603,1,cap0603trans);
+
+  TGeoBBox* capacitor0603capshape =  new TGeoBBox("Capacitor0603CapShape",
+                                              0.5*fgkSSDCapacitor0603CapLength,
+                                              0.5*fgkSSDCapacitor0603Width,
+                                              0.5*fgkSSDCapacitor0603Height);
+  TGeoVolume* capacitor0603cap = new TGeoVolume("Capacitor0603Cap",capacitor0603capshape,
+                                             fSSDStiffenerCapacitorCapMedium); 
+  capacitor0603cap->SetLineColor(fColorNiSn);
+  TGeoTranslation *cap0603captrans1 = new TGeoTranslation(- capacitor0603shape->GetDX() - capacitor0603capshape->GetDX(),0.,0.);
+  capacitor0603mother->AddNode(capacitor0603cap,1,cap0603captrans1);
+  TGeoTranslation *cap0603captrans2 = new TGeoTranslation(capacitor0603shape->GetDX() + capacitor0603capshape->GetDX(),0.,0.);
+  capacitor0603mother->AddNode(capacitor0603cap,2,cap0603captrans2);
+
+
+  TGeoVolume* ssdchip = GetSSDChip();
+
+  const Int_t knedges = 5;
+  TGeoVolume *ssdchipcables[2];
+
+  for(Int_t i=0; i<kmothernumber; i++){
+    for(Int_t j=0; j<kssdstiffenernumber; j++){
+      ssdhybridmother[i][j]->AddNode(ssdstiffener,1,hybridmotherrotInv);
+      for(Int_t k=1; k<knapacitor0603number+1; k++){
+       ssdhybridmother[i][j]->AddNode(capacitor0603mother,k,
+                                      new TGeoCombiTrans("",
+                                                         -0.5*(fgkSSDStiffenerWidth - fgkSSDCapacitor0603Width),
+                                                         -0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor0603Height),
+                                                         (k-3.)/6*fgkSSDStiffenerLength,
+                                                         hybridmotherrotInv));
+      }
+    }
+    
+    GetSSDChipCables(ssdchipcables[0],ssdchipcables[1],fgkSSDChipCablesHeight[i+2],knedges);
+    for(Int_t k=0; k<fgkSSDChipNumber; k++){
+      TGeoTranslation *chipcabletrans = new TGeoTranslation("",0.5*fgkSSDStiffenerWidth-fgkSSDChipWidth,
+                                                           - 0.5*fgkSSDStiffenerHeight - fgkSSDChipHeight
+                                                           - fgkSSDChipCablesHeight[i+2],
+                                                           (k+0.5-fgkSSDChipNumber/2)*
+                                                           (fgkSSDChipLength + fgkSSDChipSeparationLength));
+      TGeoCombiTrans *chiptrans = new TGeoCombiTrans("",0.5*(fgkSSDStiffenerWidth-fgkSSDChipWidth),
+                                                    - 0.5*(fgkSSDChipHeight+fgkSSDStiffenerHeight),
+                                                    (k+0.5-fgkSSDChipNumber/2)*(fgkSSDChipLength + fgkSSDChipSeparationLength),
+                                                    hybridmotherrotInv);
+      for(Int_t j=0; j<kssdstiffenernumber; j++){
+       ssdhybridmother[i][j]->AddNode(ssdchipcables[j],k+1,chipcabletrans);
+       ssdhybridmother[i][j]->AddNode(ssdchip,k+1,chiptrans);
+      }
+    }  
+    // Final placement by assembly
+    ssdhybridassembly[i]->AddNode(ssdhybridmother[i][0],1,new TGeoCombiTrans(TGeoTranslation("",0,0,0),hybridmotherrotL));
+    ssdhybridassembly[i]->AddNode(ssdhybridmother[i][1],1,new TGeoCombiTrans(TGeoTranslation("",0,ssdstiffenerseparation,0),hybridmotherrotR));
+    ssdhybridlist->Add(ssdhybridassembly[i]);
+  }    
+  /////////////////////////////////////////////////////////////
+  // Mother Volume Containing Capacitor Part 
+  /////////////////////////////////////////////////////////////
+  const Int_t kcapacitormothernumber = 8;
+  Double_t xcapacitorvertex[kcapacitormothernumber];
+  Double_t ycapacitorvertex[kcapacitormothernumber];  
+  ///////////////////////
+  // Setting the vertices 
+  ///////////////////////
+  xcapacitorvertex[0] = -fgkSSDConnectorPosition[0]+ssdstiffenershape->GetDX();    
+  xcapacitorvertex[1] = xcapacitorvertex[0];   
+  xcapacitorvertex[2] = 0.5*fgkSSDFlexHoleWidth;   
+  xcapacitorvertex[3] = xcapacitorvertex[2];   
+  xcapacitorvertex[4] = xcapacitorvertex[0];   
+  xcapacitorvertex[5] = xcapacitorvertex[0];   
+  xcapacitorvertex[6] = -xcapacitorvertex[0];   
+  xcapacitorvertex[7] = xcapacitorvertex[6];   
+  ycapacitorvertex[0] = -0.5*fgkSSDStiffenerWidth;    
+  ycapacitorvertex[1] = ssdstiffenerseparation-0.5*fgkSSDStiffenerWidth-fgkSSDFlexHoleLength;   
+  ycapacitorvertex[2] = ycapacitorvertex[1];   
+  ycapacitorvertex[3] = ycapacitorvertex[2]+fgkSSDFlexHoleLength;   
+  ycapacitorvertex[4] = ycapacitorvertex[3];   
+  ycapacitorvertex[5] = ycapacitorvertex[4]+fgkSSDStiffenerWidth;   
+  ycapacitorvertex[6] = ycapacitorvertex[5];   
+  ycapacitorvertex[7] = ycapacitorvertex[0];   
+  TGeoXtru* ssdhybridcapacitormothershape = new TGeoXtru(2);
+  ssdhybridcapacitormothershape->DefinePolygon(kcapacitormothernumber,xcapacitorvertex,
+                                              ycapacitorvertex);
+  ssdhybridcapacitormothershape->DefineSection(0,0.5*fgkSSDStiffenerHeight);
+  ssdhybridcapacitormothershape->DefineSection(1, 0.5*fgkSSDStiffenerHeight+fgkSSDCapacitor1812Height);
+//  TGeoVolume* ssdhybridcapacitormother = new TGeoVolume("SSDHybridCapacitorMother",ssdhybridcapacitormothershape,
+//                                          fSSDAir);
+  TGeoVolumeAssembly* ssdhybridcapacitormother = new TGeoVolumeAssembly("SSDHybridCapacitorMother");
 ////////////////////////////
-// Capacitor 1812-330 nF
+// Connector 
 ///////////////////////////
+  const Int_t kssdconnectorlayernumber = 3;
+  TGeoBBox* ssdconnectorshape[kssdconnectorlayernumber];
+  Double_t ssdConnectorThickness[kssdconnectorlayernumber]={fgkSSDConnectorAlHeight,fgkSSDConnectorNiHeight,fgkSSDConnectorSnHeight};
+  /*
+  Double_t ssdAlconnectororigin[3] = {0.0,0.0,0.5*(fgkSSDStiffenerHeight+fgkSSDConnectorAlHeight)};    
+  Double_t ssdNiconnectororigin[3] = {0.0,0.0,0.5*(fgkSSDStiffenerHeight+fgkSSDConnectorNiHeight)
+                                   +  fgkSSDConnectorAlHeight};  
+  */
+  Double_t ssdconnectororigin[3] = {0,0,0.5*fgkSSDStiffenerHeight};
+  const char* ssdconnectorname[kssdconnectorlayernumber] = {"SSDConnectorAl","SSDConnectorNi","SSDConnectorSn"};
+  TGeoMedium *ssdConnectorMedium[kssdconnectorlayernumber]={fSSDAlTraceFlexMedium,fSSDStiffenerConnectorMedium,fSSDSn};
+  TGeoVolume* ssdconnector[kssdconnectorlayernumber];
+  for(Int_t i=0; i<kssdconnectorlayernumber; i++){
+    ssdconnectororigin[2]+= 0.5*ssdConnectorThickness[i];
+      ssdconnectorshape[i] = new TGeoBBox(0.5*fgkSSDConnectorLength,
+                                          0.5*fgkSSDConnectorWidth,
+                                         0.5*ssdConnectorThickness[i],
+                                         ssdconnectororigin);
+      ssdconnectororigin[2]+= 0.5*ssdConnectorThickness[i];
+      ssdconnector[i] = new TGeoVolume(ssdconnectorname[i],ssdconnectorshape[i],
+                                       ssdConnectorMedium[i]);      
+      ssdconnector[i]->SetLineColor(i==0 ? fColorAl : fColorNiSn);
+  }
+  const Int_t kssdconnectornumber = 4;
+  TGeoTranslation* ssdconnectortrans[kssdconnectornumber];
+  ssdconnectortrans[0] = new TGeoTranslation(-ssdstiffenershape->GetDX()
+                       +  fgkSSDConnectorPosition[0]
+                       -  fgkSSDConnectorSeparation
+                       -  1.5*fgkSSDConnectorLength,
+                          ssdstiffenerseparation+ssdstiffenershape->GetDY()
+                       -  fgkSSDConnectorPosition[1]
+                       -  ssdconnectorshape[0]->GetDY(),0.0);  
+  ssdconnectortrans[1] = new TGeoTranslation(
+                       -  ssdstiffenershape->GetDX()
+                       +  fgkSSDConnectorPosition[0]
+                       -  0.5*fgkSSDConnectorLength,
+                          ssdstiffenerseparation+ssdstiffenershape->GetDY()
+                       -  fgkSSDConnectorPosition[1]
+                       -  ssdconnectorshape[0]->GetDY(),0.0);
+  ssdconnectortrans[2] = new TGeoTranslation(+ssdstiffenershape->GetDX()
+                       -  fgkSSDConnectorPosition[0]
+                       +  fgkSSDConnectorSeparation
+                       +  1.5*fgkSSDConnectorLength,
+                          -(ssdstiffenershape->GetDY()
+                       -  fgkSSDConnectorPosition[1]
+                       -  ssdconnectorshape[0]->GetDY()),0.0); 
+  ssdconnectortrans[3] = new TGeoTranslation(+ssdstiffenershape->GetDX()
+                       -  fgkSSDConnectorPosition[0]
+                       +  0.5*fgkSSDConnectorLength,
+                          -(ssdstiffenershape->GetDY()
+                       -  fgkSSDConnectorPosition[1]
+                       -  ssdconnectorshape[0]->GetDY()),0.0);
+  for(Int_t i=0; i<kssdconnectornumber; i++) {
+    Int_t nlay = kssdconnectorlayernumber - 1;
+    if (i == 1 || i == 2)
+      nlay++;
+    for(Int_t j=0; j<nlay; j++)
+      ssdhybridcapacitormother->AddNode(ssdconnector[j],i+1,ssdconnectortrans[i]);      
+  }
+////////////////////////////
+// Capacitor 1812-330 nF
+/////////////////////////// 
+//  Double_t ssdcapacitor1812origin[3] = {0.0,0.0,0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor1812Height)};    
   TGeoBBox* capacitor1812shape =  new TGeoBBox("Capacitor1812Shape",
                                                                                         0.5*fgkSSDCapacitor1812Length,
                                                                                         0.5*fgkSSDCapacitor1812Width,
-                                                                                        0.5*fgkSSDCapacitor1812Height);
+                                              0.5*fgkSSDCapacitor1812Height);
+  //            ssdcapacitor1812origin);
   TGeoVolume* capacitor1812 = new TGeoVolume("Capacitor1812",capacitor1812shape,
                                              fSSDStiffener1812CapacitorMedium); 
   capacitor1812->SetLineColor(fColorAl);
-  TGeoTranslation* capacitor1812trans = new TGeoTranslation("Capacitor1812Trans",
-                         0.,
-                         0.5*fgkSSDStiffenerWidth+ssdstiffenerseparation
-              -  capacitor1812shape->GetDY()-fgkSSDConnectorPosition[1],
-                         ssdstiffenerboxshapes[0]->GetDZ()+fgkSSDConnectorHeight
-                  +  0.5*fgkSSDCapacitor1812Height);
+  TGeoTranslation* capacitor1812trans = new TGeoTranslation(0.0,
+                                        0.5*fgkSSDStiffenerWidth+ssdstiffenerseparation
+                                      - capacitor1812shape->GetDY()-fgkSSDConnectorPosition[1],0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor1812Height));
+  ssdhybridcapacitormother->AddNode(capacitor1812,1,capacitor1812trans);
+
+  TGeoBBox* capacitor1812capshape =  new TGeoBBox("Capacitor1812CapShape",
+    0.5*fgkSSDCapacitor1812CapLength, 0.5*fgkSSDCapacitor1812Width,
+    0.5*fgkSSDCapacitor1812Height);
+  TGeoVolume* capacitor1812cap = new TGeoVolume("Capacitor1812Cap",capacitor1812capshape,
+                                             fSSDStiffenerCapacitorCapMedium);
+  capacitor1812cap->SetLineColor(fColorNiSn);
+  TGeoTranslation* capacitor1812captrans1 = new TGeoTranslation(
+       - capacitor1812shape->GetDX() - capacitor1812capshape->GetDX(),
+        0.5*fgkSSDStiffenerWidth+ssdstiffenerseparation
+        - capacitor1812shape->GetDY() - fgkSSDConnectorPosition[1],
+        0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor1812Height));
+  ssdhybridcapacitormother->AddNode(capacitor1812cap,1,capacitor1812captrans1);
+  TGeoTranslation* capacitor1812captrans2 = new TGeoTranslation(
+       capacitor1812shape->GetDX() + capacitor1812capshape->GetDX(),
+        0.5*fgkSSDStiffenerWidth+ssdstiffenerseparation
+        - capacitor1812shape->GetDY() - fgkSSDConnectorPosition[1],
+        0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor1812Height));
+  ssdhybridcapacitormother->AddNode(capacitor1812cap,2,capacitor1812captrans2);
+
 ////////////////////////////
 //Hybrid Wire
 ////////////////////////////
@@ -1323,8 +2485,8 @@ TGeoVolume* AliITSv11GeometrySSD::GetSSDStiffenerAssembly(){
                                 - fgkSSDConnectorSeparation;
   Double_t wirey = ssdstiffenerseparation+fgkSSDStiffenerWidth
                                 - 2.*fgkSSDConnectorPosition[1]-fgkSSDConnectorWidth;
-  Double_t ssdwireradius = TMath::Sqrt(TMath::Power(wirex,2.)
-                                        + TMath::Power(wirey,2));
+  Double_t ssdwireradius = TMath::Sqrt(wirex*wirex+wirey*wirey);
+
   Double_t wireangle = TMath::ATan(wirex/wirey);
   TGeoTube *hybridwireshape = new TGeoTube("HybridWireShape", 0., 
                                                fgkSSDWireRadius, 0.5*ssdwireradius);
@@ -1337,481 +2499,88 @@ TGeoVolume* AliITSv11GeometrySSD::GetSSDStiffenerAssembly(){
                                 + 1.5*fgkSSDConnectorLength+fgkSSDConnectorSeparation,
                    0.5*ssdwireradius-0.5*fgkSSDStiffenerWidth
                                 + fgkSSDConnectorPosition[1]+0.5*fgkSSDConnectorWidth,
-                                  ssdstiffenerboxshapes[0]->GetDZ()+fgkSSDConnectorHeight
-                                + fgkSSDWireRadius,
+                                  ssdstiffenershape->GetDZ()
+                                + fgkSSDWireRadius+fgkSSDConnectorAlHeight+fgkSSDConnectorNiHeight+fgkSSDConnectorSnHeight,
                    new TGeoRotation("HybridWireRot1",0.,90.,0.));
   hybridwirecombitrans[1] = new TGeoCombiTrans("HybridWireCombiTrans2",
-                                  0.,
-                                - 0.5*fgkSSDConnectorWidth+fgkSSDWireRadius,
-                                  0.,  
-                   new TGeoRotation("HybridWireRot2",
-                                -                  wireangle*TMath::RadToDeg(),0.,0.));
+                            0.0,
+                          - 0.5*fgkSSDConnectorWidth+fgkSSDWireRadius,
+                            0.0,       
+                            new TGeoRotation("HybridWireRot2",
+                          - wireangle*TMath::RadToDeg(),0.,0.));
   TGeoHMatrix* hybridwirematrix = new TGeoHMatrix();
   hybridwirematrix->MultiplyLeft(hybridwirecombitrans[0]);
   hybridwirematrix->MultiplyLeft(hybridwirecombitrans[1]);
-////////////////////////////
-// Stiffener Assembly
-///////////////////////////
-  TGeoVolume* ssdstiffenerassembly = 
-                                                               new TGeoVolumeAssembly("SSDStiffenerAssembly");
-  ssdstiffenerassembly->AddNode(hybridwire,1,hybridwirematrix);
-  for(Int_t i=0; i<kssdstiffenernumber; i++) {
-       ssdstiffenerassembly->AddNode(ssdstiffener,i+1,ssdstiffenercombitrans[i]);
-       for(Int_t j=1; j<knapacitor0603number+1; j++){
-    ssdstiffenerassembly->AddNode(capacitor0603,knapacitor0603number*i+j,new TGeoTranslation("",(j-3.
-       )/6*fgkSSDStiffenerLength,
-                                       i*ssdstiffenerseparation+
-                                       0.5*((i==0? 1:-1)*fgkSSDStiffenerWidth
-                                       +(i==0? -1:+1)*fgkSSDCapacitor0603Width),
-                                       -0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor0603Height)));
-       }
-       if(i==1) ssdstiffenerassembly->AddNode(capacitor1812,1,capacitor1812trans);
-}
-  return ssdstiffenerassembly;
+  ssdhybridcapacitormother->AddNode(hybridwire,1,hybridwirematrix);
+  ssdhybridlist->Add(ssdhybridcapacitormother);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete hybridwirecombitrans[0];
+  delete hybridwirecombitrans[1];
+  return ssdhybridlist;
+  /////////////////////////////////////////////////////////////
 }
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDChipCables(Double_t SSDChipCablesHeigth, 
-                                                                                                                                       char* side){
+///////////////////////////////////////////////////////////////////////////////
+TGeoVolume* AliITSv11GeometrySSD::GetCoolingBlockSystem(){
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Chip Cables    
+  // SSD Cooling Block System
   /////////////////////////////////////////////////////////////
-  const Int_t kssdchipcableslaynumber = 2;
-  Int_t ssdchipcablescolor[2] = {fColorAl,fColorPolyhamide};
-  Double_t ssdchipcablesradius[2];
-  ssdchipcablesradius[0] = 0.25*(SSDChipCablesHeigth
-                                                -  fgkSSDChipCablesHeight[0]
-                                                -  fgkSSDChipCablesHeight[1]);
-  ssdchipcablesradius[1] = ssdchipcablesradius[0]-fgkSSDChipCablesHeight[0];
-  Double_t ssdchipcablespiecelength = 0.5*(fgkSSDChipCablesWidth[0]
-                                                                   - 2.*TMath::Pi()*ssdchipcablesradius[0]
-                                                                       - ssdchipcablesradius[0]
-                                                                       - fgkSSDChipCablesWidth[1]
-                                                                       - fgkSSDChipCablesWidth[2]
-                                                                       - (side=="Right" ? 0 : 
-                                                                         fgkSSDModuleStiffenerPosition[1]
-                                                                       + TMath::Pi()*(0.5*fgkSSDSensorHeight
-                                                                       + fgkSSDChipCablesHeight[0]
-                                                                       + fgkSSDChipCablesHeight[1])));
-  //////////////////////////
-  //Box and Tube Seg Shapes
-  //////////////////////////
-  char* ssdchipcablesboxshapename[2*kssdchipcableslaynumber] = 
-                                         {"SSDChipCablesBoxLay0Shape0","SSDChipCablesBoxLay0Shape1",
-                                          "SSDChipCablesBoxLay1Shape0","SSDChipCablesBoxLay1Shape1"};
-  char* ssdchipcablestubesegshapename[2*kssdchipcableslaynumber] = 
-                         {"SSDChipCablesTubeSegLay0Shape0","SSDChipCablesTubeSegLay0Shape1",
-                          "SSDChipCablesTubeSegLay1Shape0","SSDChipCablesTubeSegLay1Shape1"};
-  TGeoBBox** ssdchipcablesboxshape[kssdchipcableslaynumber];
-  TGeoTubeSeg** ssdchipcablestubesegshape[kssdchipcableslaynumber];
-  for(Int_t i=0; i<kssdchipcableslaynumber; i++){
-    ssdchipcablesboxshape[i]        = new TGeoBBox*[2];
-    ssdchipcablestubesegshape[i]    = new TGeoTubeSeg*[2+(side=="Right" ? 0 : 1)];
-    ssdchipcablesboxshape[i][0]     = new TGeoBBox(ssdchipcablesboxshapename[2*i],
-                                                                                                  0.5*ssdchipcablespiecelength,
-                                                                                                  0.5*fgkSSDChipCablesLength[1],
-                                                                                                  0.5*fgkSSDChipCablesHeight[i]);
-    ssdchipcablesboxshape[i][1]     = new TGeoBBox(ssdchipcablesboxshapename[2*i+1],
-                                                  0.5*(ssdchipcablespiecelength+ssdchipcablesradius[0]
-                                        + (side=="Right" ? 0. : fgkSSDModuleStiffenerPosition[1])),            
-                                   0.5*fgkSSDChipCablesLength[1],0.5*fgkSSDChipCablesHeight[i]);
-    ssdchipcablestubesegshape[i][0] = 
-                                          new TGeoTubeSeg(ssdchipcablestubesegshapename[2*i],                                          
-                                                  ssdchipcablesradius[1]-i*fgkSSDChipCablesHeight[1],
-                                                  ssdchipcablesradius[i],0.5*fgkSSDChipCablesLength[1],
-                                                  0.,180.);
-    ssdchipcablestubesegshape[i][1] = 
-                                          new TGeoTubeSeg(ssdchipcablestubesegshapename[2*i+1],
-                                                ssdchipcablesradius[0]+i*fgkSSDChipCablesHeight[0],
-                                                        ssdchipcablesradius[0]+fgkSSDChipCablesHeight[0]
-                                        +               i*fgkSSDChipCablesHeight[1],
-                                                        0.5*fgkSSDChipCablesLength[1],0.,180.);
-    if(side!="Right") ssdchipcablestubesegshape[i][2] = 
-                                        new TGeoTubeSeg(ssdchipcablestubesegshapename[2*i],
-                                                0.5*fgkSSDSensorHeight+(1-i)*fgkSSDChipCablesHeight[1],
-                                                0.5*fgkSSDSensorHeight+(1-i)*fgkSSDChipCablesHeight[0]
-                                        +   fgkSSDChipCablesHeight[1],
-                                                0.5*fgkSSDChipCablesLength[1],0.,180.);
+  // SSD Cooling Block and Cooling Tube Transformations
+  /////////////////////////////////////////////////////////////
+  TGeoRotation* localcoolingblockrot = new TGeoRotation();
+  localcoolingblockrot->SetAngles(0.,90.,0.);
+  TGeoCombiTrans localcoolingblockmatrix(0.,0.5*fgkSSDCoolingBlockWidth,0.,localcoolingblockrot);
+  TVector3* coolingblocktransvector;
+  coolingblocktransvector = new TVector3(fgkCoolingTubeSeparation,
+                                                                 fgkSSDSensorLength
+                                                               - 2.*fgkSSDModuleStiffenerPosition[1]
+                                        - fgkSSDCoolingBlockWidth, 0);
+  const Int_t kcoolingblocktransnumber = 2;
+  const Int_t kcoolingblocknumber = 4;
+  TGeoHMatrix* coolingblockmatrix[kcoolingblocknumber];
+  TGeoRotation* localcoolingtuberot = new TGeoRotation();
+  localcoolingtuberot->SetAngles(0.0,90.0,0.0);
+  for(Int_t i=0; i<kcoolingblocktransnumber; i++){
+    for(Int_t j=0; j<kcoolingblocktransnumber; j++){
+      TGeoTranslation localcoolingblocktrans(i*coolingblocktransvector->X(),//+2*coolingtubedistance,
+                                            j*coolingblocktransvector->Y(),
+                                            - 0.5*(fgkSSDCoolingBlockHoleCenter
+                                                   + fgkCoolingTubeRmax));
+      coolingblockmatrix[2*i+j] = new TGeoHMatrix(localcoolingblocktrans*localcoolingblockmatrix);
+    }
   }
-  //////////////////////////
-  //Box under Chip
-  //////////////////////////
-  char ssdunderchipcablesboxshapename[30];
-  char ssdunderchipcablesboxname[30];  
-  char ssdunderchipcablesboxtransname[30];     
-  TGeoBBox* ssdunderchipcablesboxshape[kssdchipcableslaynumber];
-  TGeoVolume* ssdunderchipcablesbox[kssdchipcableslaynumber]; 
-  TGeoTranslation* ssdunderchipcablesboxtrans[kssdchipcableslaynumber];
-  for(Int_t i=0; i<kssdchipcableslaynumber; i++){ 
-               sprintf(ssdunderchipcablesboxshapename,"SSDUnderChipCablesBoxShape%i",i+1);
-               sprintf(ssdunderchipcablesboxname,"SSDUnderChipCablesBox%i",i+1);
-               sprintf(ssdunderchipcablesboxtransname,"SSDUnderChipCablesBoxTrans%i",i+1);
-               ssdunderchipcablesboxshape[i] = 
-                                                                  new TGeoBBox(ssdunderchipcablesboxshapename,
-                                                                  0.5*fgkSSDChipWidth,
-                                                                  0.5*fgkSSDChipCablesLength[1],
-                                                                  0.5*fgkSSDChipCablesHeight[i]);
-               ssdunderchipcablesbox[i] = new TGeoVolume(ssdunderchipcablesboxname,
-                                                                       ssdunderchipcablesboxshape[i],
-                                                                       (i==0?fSSDAlTraceChipCableMedium:fSSDKaptonChipCableMedium));           
-        ssdunderchipcablesbox[i]->SetLineColor(ssdchipcablescolor[i]);
-               ssdunderchipcablesboxtrans[i] = 
-                                               new TGeoTranslation(ssdunderchipcablesboxtransname,
-                                               (side=="Right"?-1.:1.)*0.5*fgkSSDChipWidth,
-                                               0.5*(fgkSSDChipCablesLength[0]-fgkSSDChipCablesLength[1])
-                                               +0.5*fgkSSDChipCablesLength[1],
-                                               (i==0?1.:-1.)*0.5*fgkSSDChipCablesHeight[1-i]);
-  }
-  //////////////////
-  //Trapezoid Shapes
-  //////////////////
-  const Int_t kssdchipcablesvertexnumber = 2;
-  const Int_t kssdchipcablestrapezoidnumber = 2;
-  TVector3** ssdchipcablestrapezoidvertex[kssdchipcablesvertexnumber];
-  for(Int_t i = 0; i< kssdchipcablestrapezoidnumber; i++) 
-        ssdchipcablestrapezoidvertex[i] = new TVector3*[kssdchipcablesvertexnumber];
-  //First Shape Vertex Positioning
-  ssdchipcablestrapezoidvertex[0][0] = new TVector3();
-  ssdchipcablestrapezoidvertex[0][1] = 
-               new TVector3(0.5*(fgkSSDChipCablesLength[0]-fgkSSDChipCablesLength[1]));
-  //Second Shape Vertex Positioning
-  ssdchipcablestrapezoidvertex[1][0] = 
-                                                         new TVector3(*ssdchipcablestrapezoidvertex[0][0]);
-  ssdchipcablestrapezoidvertex[1][1] = 
-                                                         new TVector3(*ssdchipcablestrapezoidvertex[0][1]);
-  //Setting the names of shapes and volumes
-  char* ssdchipcablestrapezoidboxshapename[kssdchipcablestrapezoidnumber] = 
-                 {"SSDChipCablesTrapezoidBoxShape1","SSDChipCablesTrapezoidBoxShape2"};
-  char* ssdchipcablestrapezoidshapename[kssdchipcablestrapezoidnumber] = 
-                 {"SSDChipCablesTrapezoidShape1","SSDChipCablesTrapezoidShape2"};
-  char* ssdchipcablestrapezoidboxname[kssdchipcablestrapezoidnumber] = 
-                 {"SSDChipCablesTrapezoidBox1","SSDChipCablesTrapezoidBox2"};
-  char* ssdhipcablestrapezoidname[kssdchipcablestrapezoidnumber] = 
-                 {"SSDChipCablesTrapezoid1","SSDChipCablesTrapezoid2"};
-  char* ssdchipcablestrapezoidassemblyname[kssdchipcablestrapezoidnumber] = 
-                 {"SSDChipCablesTrapezoidAssembly1","SSDChipCablesTrapezoidAssembly2"};
-  //Setting the Shapes
-  TGeoBBox* ssdchipcablestrapezoidboxshape[kssdchipcablestrapezoidnumber]; 
-  TGeoArb8* ssdchipcablestrapezoidshape[kssdchipcablestrapezoidnumber];
-  //Setting the Volumes
-  TGeoVolume* ssdchipcablestrapezoidbox[kssdchipcablestrapezoidnumber];
-  TGeoVolume* ssdchipcablestrapezoid[kssdchipcablestrapezoidnumber];
-  TGeoVolume* ssdchipcablestrapezoidassembly[kssdchipcablestrapezoidnumber]; 
-  Double_t ssdchipcablestrapezoidwidth[kssdchipcablesvertexnumber] = 
-   {fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2],fgkSSDChipCablesWidth[1]};
-  for(Int_t i=0; i<kssdchipcablestrapezoidnumber; i++){
-    ssdchipcablestrapezoidboxshape[i] = 
-                                       new TGeoBBox(ssdchipcablestrapezoidboxshapename[i],
-                                               0.5*fgkSSDChipCablesLength[1],
-                                           0.5*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2]),
-                                               0.5*fgkSSDChipCablesHeight[i]);
-    ssdchipcablestrapezoidshape[i] = 
-                                                         GetTrapezoidShape(ssdchipcablestrapezoidvertex[i],
-                                                         ssdchipcablestrapezoidwidth,
-                                                         fgkSSDChipCablesHeight[i],
-                                                         ssdchipcablestrapezoidshapename[i]);
-    ssdchipcablestrapezoidbox[i] = 
-                                               new TGeoVolume(ssdchipcablestrapezoidboxname[i],
-                                                                          ssdchipcablestrapezoidboxshape[i],
-                                                                          (i==0?fSSDAlTraceChipCableMedium:fSSDKaptonChipCableMedium));
-    ssdchipcablestrapezoid[i] = new TGeoVolume(ssdhipcablestrapezoidname[i],
-                                                                                          ssdchipcablestrapezoidshape[i],
-                                                                                          (i==0?fSSDAlTraceChipCableMedium:fSSDKaptonChipCableMedium));
-    ssdchipcablestrapezoidbox[i]->SetLineColor(ssdchipcablescolor[i]);
-    ssdchipcablestrapezoid[i]->SetLineColor(ssdchipcablescolor[i]);
-    ssdchipcablestrapezoidassembly[i] = 
-                               new TGeoVolumeAssembly(ssdchipcablestrapezoidassemblyname[i]);
-    ssdchipcablestrapezoidassembly[i]->AddNode(ssdchipcablestrapezoidbox[i],1,
-                               new TGeoTranslation(0.5*fgkSSDChipCablesLength[1],
-                                  0.5*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2]),0.));
-    ssdchipcablestrapezoidassembly[i]->AddNode(ssdchipcablestrapezoid[i],0,
-                       new TGeoCombiTrans(0.,0.,0.,new TGeoRotation("",90.,180.,-90.)));
-    ssdchipcablestrapezoidassembly[i]->AddNode(ssdchipcablestrapezoid[i],1,
-                       new TGeoTranslation(fgkSSDChipCablesLength[1],0.,0.));
+  TGeoVolume* coolingsystemother = new TGeoVolumeAssembly("CoolingBlockSystem");
+  TGeoVolume* ssdcoolingblock = GetSSDCoolingBlock(30);
+  /////////////////////////////////////////////////////////////
+  // Adding Cooling block to mother volume
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<kcoolingblocknumber; i++){ 
+    coolingsystemother->AddNode(ssdcoolingblock,i+1,coolingblockmatrix[i]);
   }
-  /////////////////////////////
-  //Box and Tube Seg CombiTrans
-  /////////////////////////////
-  TGeoTranslation* ssdchipcablesboxtrans[2*kssdchipcableslaynumber];
-  ssdchipcablesboxtrans[0] = 
-                                       new TGeoTranslation("SSDChipCablesLay1Box1Trans",0.,0.,0.);
-  ssdchipcablesboxtrans[1] = 
-                                       new TGeoTranslation("SSDChipCablesLay1Box2Trans",
-                                                                                ssdchipcablesboxshape[0][1]->GetDX()
-                                                  -             0.5*ssdchipcablespiecelength,
-                       0.0,
-                                                  -             2.*ssdchipcablesradius[0]
-                                                  -             fgkSSDChipCablesHeight[0]);
-  ssdchipcablesboxtrans[2] = new TGeoTranslation("SSDChipCablesLay2Box1Trans",
-                                                                                0.0,
-                                                                                0.0,
-                                                                                0.5*(fgkSSDChipCablesHeight[0]
-                                                  +                     fgkSSDChipCablesHeight[1]));
-  ssdchipcablesboxtrans[3] = 
-                                                        new TGeoTranslation("SSDChipCablesLay2Box2Trans",
-                                                                                ssdchipcablesboxshape[1][1]->GetDX()
-                                                  -                     0.5*ssdchipcablespiecelength,
-                                                                                0.0,
-                                                  -                     2.*ssdchipcablesradius[0]
-                                                  -                     0.5*fgkSSDChipCablesHeight[1]
-                                                  -                     1.5*fgkSSDChipCablesHeight[0]);
-  TGeoRotation* ssdchipcablesrot[3];
-  ssdchipcablesrot[0] = new TGeoRotation("SSDChipCablesRot1",0.,90.,0.);
-  ssdchipcablesrot[1] = new TGeoRotation("SSDChipCablesRot2",90.,90.,-90.);
-  ssdchipcablesrot[2] = new TGeoRotation("SSDChipCablesRot3",90.,-90.,-90.);
-  TGeoCombiTrans* ssdchipcablestubesegcombitrans[2*(kssdchipcableslaynumber+1)];    
-//  TGeoCombiTrans* SSDChipCablesTubeSegCombiTrans[2*(SSDChipCablesLayNumber+
-//                                                                                                       (side=="Right" ? 0 : 1))];
-  ssdchipcablestubesegcombitrans[0] = 
-                               new TGeoCombiTrans("SSDChipCablesLay1TubeSeg1CombiTrans",
-                               0.5*ssdchipcablespiecelength,
-                               0.0,
-                               ssdchipcablesradius[0]
-                       -   0.5*fgkSSDChipCablesHeight[0],
-                               new TGeoRotation((*ssdchipcablesrot[1])*(*ssdchipcablesrot[0])));
-  ssdchipcablestubesegcombitrans[1] = 
-                               new TGeoCombiTrans("SSDChipCablesLay1TubeSeg2CombiTrans",
-                       -   0.5*ssdchipcablespiecelength,
-                               0.0,
-                       -   ssdchipcablesradius[0]-0.5*fgkSSDChipCablesHeight[0],
-                               new TGeoRotation((*ssdchipcablesrot[2])*(*ssdchipcablesrot[0])));
-  ssdchipcablestubesegcombitrans[2] = 
-  new TGeoCombiTrans("SSDChipCablesLay2TubeSeg1CombiTrans",
-                               0.5*ssdchipcablespiecelength,
-                               0.0,
-                               ssdchipcablesradius[0]-0.5*fgkSSDChipCablesHeight[0],
-                               new TGeoRotation((*ssdchipcablesrot[1])*(*ssdchipcablesrot[0])));
-  ssdchipcablestubesegcombitrans[3] = 
-                               new TGeoCombiTrans("SSDChipCablesLay2TubeSeg2CombiTrans",
-                       -       0.5*ssdchipcablespiecelength,
-                               0.0,
-                       -       ssdchipcablesradius[0]+0.5*fgkSSDChipCablesHeight[0]
-                       -   fgkSSDChipCablesHeight[0],
-                               new TGeoRotation((*ssdchipcablesrot[2])*(*ssdchipcablesrot[0])));
-  ssdchipcablestubesegcombitrans[4] = 
-                               new TGeoCombiTrans("SSDChipCablesLay1TubeSeg4CombiTrans",
-                               0.5*ssdchipcablespiecelength+ssdchipcablesradius[0]
-                       +   fgkSSDModuleStiffenerPosition[1],
-                               0.0,
-                       -       2.*ssdchipcablesradius[0]-0.5*fgkSSDChipCablesHeight[0]
-                       -   (0.5*fgkSSDSensorHeight+fgkSSDChipCablesHeight[0]
-                       +       fgkSSDChipCablesHeight[1]),
-                       new TGeoRotation((*ssdchipcablesrot[1])*(*ssdchipcablesrot[0])));
-  ssdchipcablestubesegcombitrans[5] = 
-                       new TGeoCombiTrans("SSDChipCablesLay2TubeSeg5CombiTrans",
-                               0.5*ssdchipcablespiecelength+ssdchipcablesradius[0]
-                       +       fgkSSDModuleStiffenerPosition[1],
-                               0.0,
-                       -       2.*ssdchipcablesradius[0]-0.5*fgkSSDChipCablesHeight[0]
-                       -       (0.5*fgkSSDSensorHeight+fgkSSDChipCablesHeight[0]
-                       +       fgkSSDChipCablesHeight[1]),
-                       new TGeoRotation((*ssdchipcablesrot[1])*(*ssdchipcablesrot[0])));
-  TGeoCombiTrans* ssdchipcablestrapezoidcombitrans[kssdchipcableslaynumber];
-  ssdchipcablestrapezoidcombitrans[0] = (side=="Right" ? 
-                       new TGeoCombiTrans("SSDChipCableLay1TrapezoidRightCombiTrans",
-                               0.5*ssdchipcablespiecelength+ssdchipcablestrapezoidwidth[0]
-                       +       ssdchipcablesradius[0],
-                       -       0.5*fgkSSDChipCablesLength[1],
-                       -       fgkSSDChipCablesHeight[0]-2.*ssdchipcablesradius[0],
-                       new TGeoRotation("",90.,0.,0.)) :
-                       new TGeoCombiTrans("SSDChipCableLay1TrapezoidLeftCombiTrans",
-                       -       2.*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2])
-                       +       0.5*ssdchipcablespiecelength+ssdchipcablestrapezoidwidth[0]
-                       +       ssdchipcablesradius[0]+fgkSSDModuleStiffenerPosition[1],
-                               0.5*fgkSSDChipCablesLength[1],
-                       -       2.*(fgkSSDChipCablesHeight[0]+fgkSSDChipCablesHeight[1])
-                       -       2.*ssdchipcablesradius[0]-fgkSSDSensorHeight,
-                       new TGeoRotation("",-90.,0.,0.)));
-  ssdchipcablestrapezoidcombitrans[1] = (side=="Right" ? 
-                       new TGeoCombiTrans("SSDChipCableLay2TrapezoidRightCombiTrans",
-                               0.5*ssdchipcablespiecelength+ssdchipcablestrapezoidwidth[0]
-                       +       ssdchipcablesradius[0],
-                       -       0.5*fgkSSDChipCablesLength[1],
-                       -       0.5*(fgkSSDChipCablesHeight[0]+fgkSSDChipCablesHeight[1])
-                       -       fgkSSDChipCablesHeight[0]-2.*ssdchipcablesradius[0],
-                               new TGeoRotation("",90.,0.,0.)) :
-                               new TGeoCombiTrans("SSDChipCableLay2TrapezoidLeftCombiTrans",
-                       -       2.*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2])
-                       +       0.5*ssdchipcablespiecelength+ssdchipcablestrapezoidwidth[0]
-                       +       ssdchipcablesradius[0]+fgkSSDModuleStiffenerPosition[1],
-                               0.5*fgkSSDChipCablesLength[1],-0.5*(fgkSSDChipCablesHeight[0]
-                       +       fgkSSDChipCablesHeight[1])-fgkSSDChipCablesHeight[1]
-                       -       fgkSSDChipCablesHeight[0]-2.*ssdchipcablesradius[0]
-                       -       fgkSSDSensorHeight,new TGeoRotation("",-90.,0.,0.)));  
-  //////////////////////////
-  //Box and Tube Seg Volumes
-  //////////////////////////
-  char* ssdchipcablesboxname[2*kssdchipcableslaynumber] = 
-                                                        {"SSDChipCablesLay1Box1","SSDChipCablesLay1Box2",
-                                                         "SSDChipCablesLay2Box1","SSDChipCablesLay2Box2"};
-  char* ssdchiprightcablestubesegname[2*kssdchipcableslaynumber] = 
-                         {"SSDChipRightCablesLay1TubeSeg1","SSDChipRightCablesLay1TubeSeg2",
-                          "SSDChipRightCablesLay2TubeSeg1","SSDChipRightCablesLay2TubeSeg2"};
-  char* ssdchipLeftcablestubesegname[2*kssdchipcableslaynumber] = 
-                         {"SSDChipLeftCablesLay1TubeSeg1","SSDChipLeftCablesLay1TubeSeg2",
-                          "SSDChipLeftCablesLay2TubeSeg1","SSDChipLeftCablesLay2TubeSeg2"};
-  char* ssdchipcableslayassemblyname[kssdchipcableslaynumber] = 
-                         {"SSDChipCablesLay1","SSDChipCablesLay2"};
-  TGeoVolume** ssdchipcablesbox[kssdchipcableslaynumber];
-  TGeoVolume** ssdchipcablestubeseg[kssdchipcableslaynumber];
-  TGeoVolume* ssdchipcableslayassembly[kssdchipcableslaynumber];
-  for(Int_t i=0; i<kssdchipcableslaynumber; i++){
-    TGeoMedium* ssdchipcableslaymed = 
-            (i==0?fSSDAlTraceChipCableMedium:fSSDKaptonChipCableMedium);
-    ssdchipcablesbox[i] = new TGeoVolume*[2];
-    ssdchipcablestubeseg[i] = new TGeoVolume*[2+(side=="Right" ? 0 : 1)];
-    ssdchipcablesbox[i][0] = new TGeoVolume(ssdchipcablesboxname[2*i],
-                                          ssdchipcablesboxshape[i][0],ssdchipcableslaymed);
-    ssdchipcablesbox[i][1] = new TGeoVolume(ssdchipcablesboxname[2*i+1],
-                                          ssdchipcablesboxshape[i][1],ssdchipcableslaymed);
-    ssdchipcablestubeseg[i][0] = new TGeoVolume(ssdchiprightcablestubesegname[2*i],
-                                          ssdchipcablestubesegshape[i][0],ssdchipcableslaymed);
-    ssdchipcablestubeseg[i][1] = new TGeoVolume(ssdchiprightcablestubesegname[2*i+1],
-                                          ssdchipcablestubesegshape[i][1],ssdchipcableslaymed);
-    ssdchipcablesbox[i][0]->SetLineColor(ssdchipcablescolor[i]);
-    ssdchipcablesbox[i][1]->SetLineColor(ssdchipcablescolor[i]);
-    ssdchipcablestubeseg[i][0]->SetLineColor(ssdchipcablescolor[i]);
-    ssdchipcablestubeseg[i][1]->SetLineColor(ssdchipcablescolor[i]);
-    ssdchipcableslayassembly[i] = new TGeoVolumeAssembly(ssdchipcableslayassemblyname[i]);
-    ssdchipcableslayassembly[i]->AddNode(ssdchipcablesbox[i][0],1,
-                                                                                ssdchipcablesboxtrans[2*i]);
-    ssdchipcableslayassembly[i]->AddNode(ssdchipcablesbox[i][1],1,
-                                                                                ssdchipcablesboxtrans[2*i+1]);
-    ssdchipcableslayassembly[i]->AddNode(ssdchipcablestubeseg[i][0],1,
-                                                                                ssdchipcablestubesegcombitrans[2*i]);
-    ssdchipcableslayassembly[i]->AddNode(ssdchipcablestubeseg[i][1],1,
-                                                                                ssdchipcablestubesegcombitrans[2*i+1]);
-    if(side!="Right"){
-      ssdchipcablestubeseg[i][2] = new TGeoVolume(ssdchipLeftcablestubesegname[2*i],
-                                                                                                 ssdchipcablestubesegshape[i][2],
-                                                                                                 ssdchipcableslaymed);
-      ssdchipcablestubeseg[i][2]->SetLineColor(ssdchipcablescolor[i]);
-      ssdchipcableslayassembly[i]->AddNode(ssdchipcablestubeseg[i][2],1,
-                                                                                  ssdchipcablestubesegcombitrans[4+i]);
-    }
-    ssdchipcableslayassembly[i]->AddNode(ssdchipcablestrapezoidassembly[i],1,
-                                                                                ssdchipcablestrapezoidcombitrans[i]);
-  }
-  TGeoCombiTrans* ssdchipcablescombitrans[kssdchipcableslaynumber];
-  ssdchipcablescombitrans[0] = new TGeoCombiTrans("SSDChipCablesCombiTrans1",
-                                          (side=="Right" ? -1 : 1)*0.5*ssdchipcablespiecelength,
-                                               0.5*fgkSSDChipCablesLength[0],
-                                       -       (2.*ssdchipcablesradius[0]-fgkSSDChipCablesHeight[0]
-                                       -       0.5*fgkSSDChipCablesHeight[1]),
-                                               new TGeoRotation("",(side=="Right" ? 0 : 1)*180.,0.,0.));
-  ssdchipcablescombitrans[1] = new TGeoCombiTrans("SSDChipCablesCombiTrans2",
-                                               (side=="Right" ? -1 : 1)*0.5*ssdchipcablespiecelength,
-                                               0.5*fgkSSDChipCablesLength[0],
-                                       -       (2.*ssdchipcablesradius[0]-fgkSSDChipCablesHeight[0]
-                                       -       0.5*fgkSSDChipCablesHeight[1]),
-                                               new TGeoRotation("",(side=="Right" ? 0 : 1)*180.,0.,0.));
-  TGeoVolume* ssdchipcablesassembly = 
-                                               new TGeoVolumeAssembly("SSDChipCables");
-  for(Int_t i=0; i<kssdchipcableslaynumber; i++){ 
-               ssdchipcablesassembly->AddNode(ssdchipcableslayassembly[i],1,
-                                                                                                       ssdchipcablescombitrans[i]);
-               ssdchipcablesassembly->AddNode(ssdunderchipcablesbox[i],1,ssdunderchipcablesboxtrans[i]);
-  }
-  return ssdchipcablesassembly;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDChipCablesAssembly(Double_t SSDChipCablesHeigth){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD Chip Cables Assembly    
-  /////////////////////////////////////////////////////////////
-  const Int_t kchipcablesnumber = 2;
-  Double_t chipcablestransvector = fgkSSDSensorLength
-                                                                - 2.*fgkSSDModuleStiffenerPosition[1]
-                                                                - 2.*(fgkSSDStiffenerWidth
-                                                                - fgkSSDStiffenerToChipDist-fgkSSDChipWidth);
-  char* ssdchipcablesname[kchipcablesnumber] = {"Right","Left"};
-  TGeoVolume* ssdchipcables[kchipcablesnumber];  
-  TGeoVolume* ssdchipcablesassembly = 
-                                        new TGeoVolumeAssembly("SSDChipCablesAssembly");
-  for(Int_t i=0; i<kchipcablesnumber; i++) ssdchipcables[i] = 
-                                        GetSSDChipCables(SSDChipCablesHeigth,ssdchipcablesname[i]);
-  for(Int_t i=0; i<kchipcablesnumber; i++)
-    for(Int_t j=0; j<fgkSSDChipNumber; j++)
-      ssdchipcablesassembly->AddNode(ssdchipcables[i],fgkSSDChipNumber*i+j+1,
-                       new TGeoTranslation(-(ssdchipcablesname[i]=="Left" ? 1. : 0.)
-               *       chipcablestransvector,(j-0.5)*fgkSSDChipCablesLength[0]
-               +       0.5*fgkSSDChipCablesLength[1],0.));
-  return ssdchipcablesassembly;
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete coolingblocktransvector;
+  delete localcoolingblockrot;
+
+  return coolingsystemother;
 }
 /////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDFlex(Double_t ssdflexradius, Double_t SSDFlexHeigth){
+TGeoVolume* AliITSv11GeometrySSD::GetSSDStiffenerFlex()const{
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Flex    
+  // SSD Flex
   /////////////////////////////////////////////////////////////
-  const Int_t kssdflexvolumenumber = 3;
-  TGeoVolume* ssdflexvolume[kssdflexvolumenumber];
-  ////////////////////////
-  // Setting Display Color
-  ////////////////////////
-  Int_t ssdflexcolor;
-  ssdflexcolor = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fColorAl: fColorPolyhamide);
-  TGeoMedium* ssdflexmed = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fSSDAlTraceFlexMedium :
-                            fSSDKaptonFlexMedium);
-  ////////////////////////
-  // SSDFlexTrapezoidShape
-  ////////////////////////
-  const Int_t kssdflexvertexnumber = 2;
-  Double_t ssdflexwidth[kssdflexvertexnumber] = {fgkSSDFlexWidth[1],
-                                                                                               fgkSSDFlexWidth[0]};
-  TVector3* ssdflexvertex[kssdflexvertexnumber];
-  ssdflexvertex[0] = new TVector3();
-  ssdflexvertex[1] = new TVector3(fgkSSDFlexLength[0]-fgkSSDFlexLength[1]);
-  TGeoArb8* ssdflextrapezoidshape = GetTrapezoidShape(ssdflexvertex,
-                                                                                                         ssdflexwidth,SSDFlexHeigth,
-                                                                                                         "SSDFlexTrapezoidShape");
-  ssdflexvolume[0] = new TGeoVolume("SSDFlexTrapezoid",ssdflextrapezoidshape,ssdflexmed);
-  ssdflexvolume[0]->SetLineColor(ssdflexcolor);
-  /////////////////////////
-  //SSDFlexTubeSeg Assembly
-  /////////////////////////
-  const Int_t kssdflextubesegnumber = 2;
-  TGeoTubeSeg* ssdflextubesegshape[kssdflextubesegnumber];
-  Double_t ssdflexradiusmax = (fgkSSDFlexLength[3]-fgkSSDFlexLength[2])
-                                                       /  TMath::Tan(fgkSSDFlexAngle*TMath::DegToRad());
-  ssdflextubesegshape[0] = new TGeoTubeSeg("SSDFlexTubeSegShape1",
-                                                  ssdflexradius,ssdflexradius+SSDFlexHeigth,
-                                                  0.5*fgkSSDFlexWidth[0],0.,180.);
-  ssdflextubesegshape[1] = new TGeoTubeSeg("SSDFlexTubeSegShape2",
-                                                  ssdflexradiusmax-ssdflexradius-SSDFlexHeigth,
-                                                  ssdflexradiusmax-ssdflexradius,0.5*fgkSSDFlexWidth[0],
-                                                  0.,2.*fgkSSDFlexAngle);
-  TGeoRotation** ssdflextubsegrot[kssdflextubesegnumber];
-  for(Int_t i = 0; i<kssdflextubesegnumber; i++) 
-                                                                         ssdflextubsegrot[i] = new TGeoRotation*[2]; 
-  ssdflextubsegrot[0][0] = new TGeoRotation("SSDFlexTubeSeg1Rot1", 0., 90.,  0.);
-  ssdflextubsegrot[0][1] = new TGeoRotation("SSDFlexTubeSeg1Rot2",90., 90.,-90.);
-  ssdflextubsegrot[1][0] = new TGeoRotation("SSDFlexTubeSeg2Rot1", 0.,-90.,  0.);
-  ssdflextubsegrot[1][1] = new TGeoRotation("SSDFlexTubeSeg2Rot2",90., 90.,-90.);
-  TGeoCombiTrans* ssdflextubesegcombitrans[kssdflextubesegnumber];
-  ssdflextubesegcombitrans[0] = new TGeoCombiTrans("SSDFlexTubeSegCombiTrans1",
-                                                               fgkSSDFlexLength[0],0.5*fgkSSDFlexWidth[0],
-                                                               ssdflexradius+0.5*SSDFlexHeigth,
-                                                               new TGeoRotation((*ssdflextubsegrot[0][1])
-                                                       *       (*ssdflextubsegrot[0][0])));
-  ssdflextubesegcombitrans[1] = new TGeoCombiTrans("SSDFlexTubeSegCombiTrans2",
-                                                               fgkSSDFlexLength[0]-fgkSSDFlexLength[2],
-                                                               0.5*fgkSSDFlexWidth[0],
-                                                               ssdflexradiusmax+0.5*SSDFlexHeigth+ssdflexradius,
-                                                               new TGeoRotation((*ssdflextubsegrot[1][1])
-                                                       *       (*ssdflextubsegrot[1][0])));
-  ssdflexvolume[1] = new TGeoVolumeAssembly("SSDFlexTubeSegAssembly");
-  TGeoVolume* ssdflextubeseg[kssdflextubesegnumber];
-  char ssdflextubesegname[30];
-  for(Int_t i=0; i<kssdflextubesegnumber; i++){ 
-               sprintf(ssdflextubesegname,"SSDFlexTubeSeg%i",i+1);
-               ssdflextubeseg[i] = new TGeoVolume(ssdflextubesegname,ssdflextubesegshape[i],
-                                     ssdflexmed);
-               ssdflextubeseg[i]->SetLineColor(ssdflexcolor);
-        ssdflexvolume[1]->AddNode(ssdflextubeseg[i],1,ssdflextubesegcombitrans[i]);
-  }
-  ///////////
-  //Box Shape 
-  ///////////
-  const Int_t kssdflexboxnumber = 7;
+  const Int_t kssdflexlayernumber = 2;
+  TGeoXtru* ssdflexshape[kssdflexlayernumber];
+  for(Int_t i=0; i<kssdflexlayernumber; i++) ssdflexshape[i] = new TGeoXtru(2);
+  const Int_t kmothervertexnumber = 17; 
+  Double_t xmothervertex[kmothervertexnumber];
+  Double_t ymothervertex[kmothervertexnumber];
+  /////////////////////////////////////////////
+  // Auxiliary variables for vertex positioning
+  /////////////////////////////////////////////
+  const Int_t kssdflexboxnumber = 5;
   Double_t ssdflexboxlength[kssdflexboxnumber];
   ssdflexboxlength[0] = 0.5*(fgkSSDChipNumber
                                          *     fgkSSDChipLength+(fgkSSDChipNumber-1)
@@ -1824,478 +2593,952 @@ TGeoVolume* AliITSv11GeometrySSD::GetSSDFlex(Double_t ssdflexradius, Double_t SS
   ssdflexboxlength[3] = fgkSSDFlexHoleWidth;   
   ssdflexboxlength[4] = fgkSSDFlexLength[1]-ssdflexboxlength[0]
                                          -     ssdflexboxlength[1];
-  ssdflexboxlength[5] = fgkSSDFlexLength[2];   
-  ssdflexboxlength[6] = fgkSSDFlexFullLength-2.*fgkSSDFlexAngle
-                                         *     TMath::DegToRad()*ssdflexradiusmax
-                                         - fgkSSDFlexLength[2]-TMath::Pi()
-                                         *     fgkSSDStiffenerHeight-fgkSSDFlexLength[0];      
   Double_t ssdflexboxwidth[kssdflexboxnumber];
   ssdflexboxwidth[0] = fgkSSDFlexWidth[0];
   ssdflexboxwidth[1] = fgkSSDFlexWidth[0]-fgkSSDFlexHoleWidth;
   ssdflexboxwidth[2] = fgkSSDFlexHoleWidth;
   ssdflexboxwidth[3] = ssdflexboxwidth[2]-fgkSSDFlexHoleLength;
   ssdflexboxwidth[4] = fgkSSDFlexWidth[0];
-  ssdflexboxwidth[5] = fgkSSDFlexWidth[0];
-  ssdflexboxwidth[6] = fgkSSDFlexWidth[0];
-  TGeoBBox* ssdflexboxshape[kssdflexboxnumber+1];
-  for(Int_t i=0; i<kssdflexboxnumber+1; i++) ssdflexboxshape[i] = 
-                                               (i!= kssdflexboxnumber ? new TGeoBBox("SSDFlexBoxShape",
-                                                               0.5*ssdflexboxlength[i],
-                                                               0.5*ssdflexboxwidth[i],0.5*SSDFlexHeigth) : 
-                                                               ssdflexboxshape[2]);
-  //////////////////////////////
-  //SSDFlex Box Shape CombiTrans 
-  //////////////////////////////
-  TGeoCombiTrans* ssdflexboxcombitrans[kssdflexboxnumber+1];
-  ssdflexboxcombitrans[0] = new TGeoCombiTrans("SSDFlexBoxCombiTrans0",
-                                                               ssdflexvertex[1]->X()+0.5*ssdflexboxlength[0],
-                                                               0.5*fgkSSDFlexWidth[0],0.,0);
-  ssdflexboxcombitrans[1] = new TGeoCombiTrans("SSDFlexBoxCombiTrans1",
-                                                               ssdflexvertex[1]->X()+ssdflexboxlength[0]
-                                                       +       0.5*ssdflexboxlength[1],
-                                                               fgkSSDFlexHoleWidth+0.5*ssdflexboxwidth[1],0.,0);
-  ssdflexboxcombitrans[2] = new TGeoCombiTrans("SSDFlexBoxCombiTrans2",
-                                                               ssdflexvertex[1]->X()+ssdflexboxlength[0]
-                                                       +       fgkSSDFlexHoleLength+0.5*ssdflexboxlength[2],
-                                                               0.5*ssdflexboxwidth[2],0.,0);
-  ssdflexboxcombitrans[3] = new TGeoCombiTrans("SSDFlexBoxCombiTrans3",
-                                                               ssdflexvertex[1]->X()+ssdflexboxlength[0]
-                                                       +       fgkSSDFlexHoleLength+ssdflexboxlength[2]
-                                                       +       0.5*fgkSSDFlexHoleWidth,
-                                                               fgkSSDFlexHoleLength+0.5*ssdflexboxwidth[3],0.,0);
-  ssdflexboxcombitrans[4] = new TGeoCombiTrans("SSDFlexBoxCombiTrans4",
-                                                               ssdflexvertex[1]->X()+ssdflexboxlength[0]
-                                                       +       ssdflexboxlength[1]+0.5*ssdflexboxlength[4],
-                                                               0.5*fgkSSDFlexWidth[0],0.,0);
-  ssdflexboxcombitrans[5] = new TGeoCombiTrans("SSDFlexBoxCombiTrans5",
-                                                       -       0.5*fgkSSDFlexLength[2]+fgkSSDFlexLength[0],
-                                                               0.5*fgkSSDFlexWidth[0],
-                                                               2.*ssdflexradius+SSDFlexHeigth,0);
-  ssdflexboxcombitrans[6] = new TGeoCombiTrans("SSDFlexBoxCombiTrans6",
-                                                       -       ssdflexboxshape[6]->GetDX()
-                                                       +       ssdflexboxshape[6]->GetDX()
-                                                       *       TMath::Cos(2.*fgkSSDFlexAngle*TMath::DegToRad())
-                                                       +       fgkSSDFlexLength[0]-fgkSSDFlexLength[2]
-                                                       -       (ssdflexradiusmax-ssdflexradius-0.5*SSDFlexHeigth)
-                                                       *       TMath::Cos(fgkSSDFlexAngle*TMath::DegToRad()),
-                                                               0.5*fgkSSDFlexWidth[0],ssdflexboxshape[6]->GetDX()
-                                                               *TMath::Sin(2.*fgkSSDFlexAngle*TMath::DegToRad())
-                                                       +       SSDFlexHeigth+2.*ssdflexradius+(ssdflexradiusmax
-                                                       -       ssdflexradius-0.5*SSDFlexHeigth)
-                                                       *       TMath::Sin(fgkSSDFlexAngle*TMath::DegToRad()),
-                                                               new TGeoRotation("",90.,2.*fgkSSDFlexAngle,-90.));
-  ssdflexboxcombitrans[7] = new TGeoCombiTrans("SSDFlexBoxCombiTrans7",
-                                                               ssdflexvertex[1]->X()+ssdflexboxlength[0]
-                                                       +       fgkSSDFlexHoleLength+1.5*ssdflexboxlength[2]
-                                                       +       ssdflexboxlength[3],
-                                                               0.5*ssdflexboxwidth[2],0.,0);
-  ////////////////////////////
-  //SSDFlex Box Shape Assembly 
-  ////////////////////////////
-  ssdflexvolume[2] = new TGeoVolumeAssembly("SSDFlexBoxAssembly");
-  TGeoVolume* ssdflexbox[kssdflexboxnumber+1];
-  TGeoVolume* ssdendflex = GetSSDEndFlex(ssdflexboxlength[6],SSDFlexHeigth);
-  TGeoHMatrix* ssdendflexhmatrix = new TGeoHMatrix();
-  TGeoRotation* ssdendflexrot = new TGeoRotation("SSDEndFlexRot",180.,0.,0);
-  ssdendflexhmatrix->MultiplyLeft(ssdendflexrot);
-  ssdendflexhmatrix->MultiplyLeft(ssdflexboxcombitrans[6]);
-  char ssdflexboxname[30];
-  for(Int_t i=0; i<kssdflexboxnumber+1; i++){
-       sprintf(ssdflexboxname,"SSDFlexBox%i",i!=kssdflexboxnumber?i+1:7);
-       if(i==6){ssdflexvolume[2]->AddNode(ssdendflex,1,ssdendflexhmatrix);}
-       else{
-    ssdflexbox[i] = new TGeoVolume(ssdflexboxname,ssdflexboxshape[i],
-                                   ssdflexmed);
-       ssdflexbox[i]->SetLineColor(ssdflexcolor);
-       ssdflexvolume[2]->AddNode(ssdflexbox[i],1,ssdflexboxcombitrans[i]);}
- }
-  //////////////////////
-  //SSDFlex Construction
-  //////////////////////
-  TGeoVolume* ssdflex = new TGeoVolumeAssembly("SSDFlex");
-  for(Int_t i =0; i<kssdflexvolumenumber; i++) ssdflex->AddNode(ssdflexvolume[i],1);
-  return ssdflex;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDEndFlex(Double_t SSDEndFlexLength, 
-                                                                                                               Double_t SSDFlexHeigth){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD End Flex   
-  /////////////////////////////////////////
-  // Setting Display Color, Media and Index
-  /////////////////////////////////////////
-  Int_t ssdflexcolor;
-  ssdflexcolor = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fColorAl: fColorPolyhamide);
-  TGeoMedium* ssdflexmed = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fSSDAlTraceFlexMedium :
-                            fSSDKaptonFlexMedium);
-  ////////////////////////
-  const Int_t kssdendflexboxnumber = 5;
-  TGeoBBox* ssdendflexbboxshape[kssdendflexboxnumber];
-  ssdendflexbboxshape[0] = new TGeoBBox("SSDFlexBoxShape1",
-                                                                  0.5*SSDEndFlexLength,0.5*fgkSSDFlexWidth[0],
-                                                                  0.5*SSDFlexHeigth);
-  ssdendflexbboxshape[1] = new TGeoBBox("SSDFlexBoxShape2",
-                                   0.5*fgkSSDEndFlexCompLength[1],
-                                       0.5*(fgkSSDEndFlexCompWidth[0]-fgkSSDFlexWidth[0])/2,
-                                       0.5*SSDFlexHeigth);
-  ssdendflexbboxshape[2] = new TGeoBBox("SSDFlexBoxShape3",
-                                   0.5*fgkSSDEndFlexCompLength[2],
-                                       0.5*(fgkSSDEndFlexCompWidth[1]-fgkSSDFlexWidth[0])/2,
-                                       0.5*SSDFlexHeigth);
-  ssdendflexbboxshape[3] = new TGeoBBox("SSDFlexBoxShape4",
-                                   0.5*fgkSSDEndFlexCompLength[3],
-                                       0.5*(fgkSSDEndFlexCompWidth[0]-fgkSSDFlexWidth[0])/2,
-                                       0.5*SSDFlexHeigth);
-  ssdendflexbboxshape[4] = new TGeoBBox("SSDFlexBoxShape5",
-                                   0.5*(fgkSSDEndFlexCompLength[4]+fgkSSDEndFlexCompLength[5]),
-                                       0.25*(fgkSSDEndFlexCompWidth[2]-fgkSSDFlexWidth[0])/2,
-                                       0.5*SSDFlexHeigth);
-  TGeoVolume* ssdendflexbbox[kssdendflexboxnumber];  
-  char ssdendflexbboxname[30];
-  for(Int_t i=0; i<kssdendflexboxnumber; i++){
-       sprintf(ssdendflexbboxname,"SSDEndFlexBBox%i",i+1);
-       ssdendflexbbox[i] = new TGeoVolume(ssdendflexbboxname,
-                     ssdendflexbboxshape[i],
-                     ssdflexmed);
-       ssdendflexbbox[i]->SetLineColor(ssdflexcolor);
-  }
-  TGeoVolume* ssdendflex = new TGeoVolumeAssembly("SSDEndFlex");
-  Double_t partialsumlength = 0.;
-  for(Int_t i=0; i<kssdendflexboxnumber+1; i++) partialsumlength += fgkSSDEndFlexCompLength[i];
-  Double_t referencelength = SSDEndFlexLength-partialsumlength;
-  ssdendflex->AddNode(ssdendflexbbox[0],1);
-  ssdendflex->AddNode(ssdendflexbbox[1],1,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  0.5*fgkSSDEndFlexCompLength[1],
-                                          0.5*fgkSSDFlexWidth[0]+ssdendflexbboxshape[1]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[1],2,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  0.5*fgkSSDEndFlexCompLength[1],
-                                       -  0.5*fgkSSDFlexWidth[0]-ssdendflexbboxshape[1]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[2],1,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  fgkSSDEndFlexCompLength[1]+0.5*fgkSSDEndFlexCompLength[2],
-                                       +  0.5*fgkSSDFlexWidth[0]+ssdendflexbboxshape[2]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[2],2,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  fgkSSDEndFlexCompLength[1]+0.5*fgkSSDEndFlexCompLength[2],
-                                       -  0.5*fgkSSDFlexWidth[0]-ssdendflexbboxshape[2]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[3],1,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2]
-                                       +  0.5*fgkSSDEndFlexCompLength[3],
-                                       +  0.5*fgkSSDFlexWidth[0]+ssdendflexbboxshape[3]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[3],2,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2]
-                                       +  0.5*fgkSSDEndFlexCompLength[3],
-                                       -  0.5*fgkSSDFlexWidth[0]-ssdendflexbboxshape[3]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[4],1,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2]
-                                       +  fgkSSDEndFlexCompLength[3]+0.5*(fgkSSDEndFlexCompLength[4]+fgkSSDEndFlexCompLength[5]),
-                                       +  0.5*fgkSSDFlexWidth[0]+ssdendflexbboxshape[4]->GetDY(),
-                                          0.));
-  ssdendflex->AddNode(ssdendflexbbox[4],2,new TGeoTranslation(
-                                       -  0.5*SSDEndFlexLength+referencelength+fgkSSDEndFlexCompLength[0]
-                                       +  fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2]
-                                       +  fgkSSDEndFlexCompLength[3]+0.5*(fgkSSDEndFlexCompLength[4]
-                                       +  fgkSSDEndFlexCompLength[5]),
-                                       -  0.5*fgkSSDFlexWidth[0]-ssdendflexbboxshape[4]->GetDY(),
-                                          0.));
-  return ssdendflex;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDFlexAssembly(){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD Flex Assembly    
-  /////////////////////////////////////////////////////////////
-  TGeoVolume* ssdflexassembly = new TGeoVolumeAssembly("SSDFlexAssembly");
-  const Int_t kssdflexlayernumber = 4;
-  Double_t ssdflexheight[kssdflexlayernumber];
-  Double_t ssdflexradius[kssdflexlayernumber];
-  TGeoTranslation* ssdflextrans[kssdflexlayernumber];
-  for(Int_t i=0; i<kssdflexlayernumber; i++){ 
-    ssdflexheight[i] = (i%2==0 ? fgkSSDFlexHeight[0] : fgkSSDFlexHeight[1]);
-    ssdflexradius[i] = (i==0 ? fgkSSDStiffenerHeight : ssdflexradius[i-1]
-                                        +                                         ssdflexheight[i-1]);
-    ssdflextrans[i]  = new TGeoTranslation(0.,0.,-0.5*i*(ssdflexheight[0]
-                                        +                                         ssdflexheight[1])); 
-    ssdflexassembly->AddNode(GetSSDFlex(ssdflexradius[i],ssdflexheight[i]),i+1,
-                                                                                  ssdflextrans[i]);   
-  }
-  return ssdflexassembly;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDCoolingBlockAssembly(){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD Cooling Block Assembly    
-  /////////////////////////////////////////////////////////////
-  const Int_t kssdcoolingblocktransnumber = 2;
-  Double_t ssdcoolingblocktransvector[kssdcoolingblocktransnumber] = 
-                                       {fgkSSDModuleSensorSupportDistance+fgkSSDCoolingBlockLength,
-                                        fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1]
-                               -        fgkSSDCoolingBlockWidth};
-  TGeoVolume* ssdcoolingblock = GetSSDCoolingBlock();
-  TGeoVolume* ssdcoolingblockassembly = 
-                                                         new TGeoVolumeAssembly("SSDCoolingBlockAssembly");
-  for(Int_t i=0; i<kssdcoolingblocktransnumber; i++)
-    for(Int_t j=0; j<kssdcoolingblocktransnumber; j++) 
-               ssdcoolingblockassembly->AddNode(ssdcoolingblock,
-                                                 kssdcoolingblocktransnumber*i+j+1,
-                                                 new TGeoTranslation(i*ssdcoolingblocktransvector[0],
-                                                 j*ssdcoolingblocktransvector[1],0.));
-  return ssdcoolingblockassembly;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDCoolingBlock(){
-  /////////////////////////////////////////////////////////////
-  // Method generating SSD Cooling Block    
-  /////////////////////////////////////////////////////////////
-  // Center Cooling Block Hole
-  ////////////////////////////
-  Double_t coolingblockholeangle = TMath::ACos(0.5*fgkSSDCoolingBlockHoleLength[0]
-                                                       /fgkSSDCoolingBlockHoleRadius[0])*TMath::RadToDeg();
-  Double_t coolingblockholewidth = fgkSSDCoolingBlockWidth;
-  new TGeoTubeSeg("CoolingBlockHoleShape",
-                                               0.,
-                                               fgkSSDCoolingBlockHoleRadius[0],
-                                               0.5*coolingblockholewidth,
-                                               180.-coolingblockholeangle,360.+coolingblockholeangle);
-  TVector3* coolingblockholevertex[3];
-  coolingblockholevertex[0] = new TVector3();
-  coolingblockholevertex[1] = new TVector3(fgkSSDCoolingBlockHoleRadius[0]
-                                       *       TMath::Cos((90.-coolingblockholeangle)*TMath::DegToRad()),
-                                               fgkSSDCoolingBlockHoleRadius[0]
-                                       *       TMath::Sin((90.-coolingblockholeangle)*TMath::DegToRad()));
-  coolingblockholevertex[2] = new TVector3(coolingblockholevertex[1]->X(),
-                                       -       coolingblockholevertex[1]->Y());
-                                               GetTriangleShape(coolingblockholevertex,
-                                               coolingblockholewidth,"CoolingBlockTriangleHoleShape");
-  TGeoRotation* coolingblockholerot = 
-                                                         new TGeoRotation("CoolingBlockHoleRot",90,0.,0.);
-  coolingblockholerot->RegisterYourself();
-    new TGeoCompositeShape("CoolingTubeHoleShape",
-                                                         "CoolingBlockTriangleHoleShape:CoolingBlockHoleRot+"
-                                                         "CoolingBlockHoleShape");
-  ///////////////////////////
-  // Cooling Block Trapezoids
-  ///////////////////////////
-  const Int_t kvertexnumber = 4;
-  const Int_t ktrapezoidnumber = 2;
-  TVector3** coolingblocktrapezoidvertex[ktrapezoidnumber];
-  for(Int_t i = 0; i<ktrapezoidnumber; i++) coolingblocktrapezoidvertex[i] = 
-                                               new TVector3*[kvertexnumber]; 
-  Double_t coolingblockcomponentheight = fgkSSDCoolingBlockHeight[0]
-                                   -   fgkSSDCoolingBlockHoleCenter
-                                       -       fgkSSDCoolingBlockHoleRadius[0]
-                                       *       TMath::Sin(coolingblockholeangle*TMath::DegToRad());
-  Double_t coolingblocktrapezoidlength[ktrapezoidnumber] = 
-                                       {       fgkSSDCoolingBlockLength,
-                                               0.5*(fgkSSDCoolingBlockLength-2.
-                                       *       (fgkSSDCoolingBlockHoleLength[1]
-                                       -       fgkSSDCoolingBlockHoleRadius[1])
-                                       -       fgkSSDCoolingBlockHoleLength[0])}; 
-  Double_t coolingblocktrapezoidheigth[ktrapezoidnumber] = 
-                                       {       fgkSSDCoolingBlockHeight[0]-coolingblockcomponentheight
-                                       -       fgkSSDCoolingBlockHeight[1]-fgkSSDCoolingBlockHeight[2]
-                                       -       fgkSSDCoolingBlockHoleRadius[1],
-                                               coolingblockcomponentheight};
-  Double_t coolingblocktrapezoidwidth[ktrapezoidnumber]  = 
-                                               {fgkSSDCoolingBlockWidth,fgkSSDCoolingBlockWidth};
-  //////////////////////////
-  //Vertex Positioning Shape 
-  //////////////////////////
-  coolingblocktrapezoidvertex[0][0] = new TVector3();
-  coolingblocktrapezoidvertex[0][1] = new TVector3(coolingblocktrapezoidlength[0]);
-  coolingblocktrapezoidvertex[0][2] = new TVector3(
-                                               0.5*(coolingblocktrapezoidvertex[0][1]->X()
-                                       -       2.*coolingblocktrapezoidlength[1]
-                                       -       fgkSSDCoolingBlockHoleLength[0]));
-  coolingblocktrapezoidvertex[0][3] = 
-                                               new TVector3(coolingblocktrapezoidvertex[0][1]->X()
-                                       -       coolingblocktrapezoidvertex[0][2]->X());
-  coolingblocktrapezoidvertex[1][0] = new TVector3(); 
-  coolingblocktrapezoidvertex[1][1] = new TVector3(coolingblocktrapezoidlength[1]);
-  coolingblocktrapezoidvertex[1][2] = 
-                                               new TVector3(coolingblocktrapezoidheigth[1]
-                                       /                                coolingblocktrapezoidheigth[0]
-                                       *       coolingblocktrapezoidvertex[0][2]->X());
-  coolingblocktrapezoidvertex[1][3] = 
-                                               new TVector3(coolingblocktrapezoidvertex[1][1]->X());
-  char* coolingblocktrapezoidshapename[ktrapezoidnumber] = 
-                                       {"CoolingBlockTrapezoidShape0","CoolingBlockTrapezoidShape1"};
-  TGeoArb8* coolingblocktrapezoidshape[ktrapezoidnumber];
-  for(Int_t i = 0; i< ktrapezoidnumber; i++) coolingblocktrapezoidshape[i] = 
-                                               GetArbShape(coolingblocktrapezoidvertex[i],
-                                               coolingblocktrapezoidwidth,
-                                               coolingblocktrapezoidheigth[i],
-                                               coolingblocktrapezoidshapename[i]);
-  TGeoTranslation* coolingblocktrapezoidtrans = 
-                                               new TGeoTranslation("CoolingBlockTrapezoidTrans",
-                                               coolingblocktrapezoidvertex[0][2]->X(),
-                                               0.0,
-                                               0.5*(coolingblocktrapezoidheigth[0]
-                                       +       coolingblocktrapezoidheigth[1]));
-  coolingblocktrapezoidtrans->RegisterYourself();
-  TGeoCombiTrans* coolingblocktrapezoidcombitrans = 
-                                               new TGeoCombiTrans("CoolingBlockTrapezoidCombiTrans",
-                                               coolingblocktrapezoidvertex[0][3]->X(),
-                                               fgkSSDCoolingBlockWidth,
-                                               0.5*(coolingblocktrapezoidheigth[0]
-                                       +       coolingblocktrapezoidheigth[1]),
-                                               new TGeoRotation("",180.,0.,0.));
-  coolingblocktrapezoidcombitrans->RegisterYourself();
-       new TGeoCompositeShape("CoolingBlockTrapezoidCompositeShape",
-       "CoolingBlockTrapezoidShape0+CoolingBlockTrapezoidShape1:CoolingBlockTrapezoidTrans+"
-       "CoolingBlockTrapezoidShape1:CoolingBlockTrapezoidCombiTrans"); 
-  /////////////////////////////
-  // Cooling Block Boxes Shapes
-  /////////////////////////////
-  const Int_t kboxnumber = 3;
-  TGeoBBox* coolingblockboxshape[kboxnumber];
-  coolingblockboxshape[0] = new TGeoBBox("CoolingBlockBoxShape0",
-                                               0.5*fgkSSDCoolingBlockLength,
-                                               0.5*fgkSSDCoolingBlockWidth,
-                                               0.5*fgkSSDCoolingBlockHoleRadius[1]);
-  coolingblockboxshape[1] = new TGeoBBox("CoolingBlockBoxShape1",
-                                               0.5*(fgkSSDCoolingBlockLength
-                                       -       2.*fgkSSDCoolingBlockHoleLength[1]),
-                                               0.5*fgkSSDCoolingBlockWidth,
-                                               0.5*fgkSSDCoolingBlockHeight[2]);
-  coolingblockboxshape[2] = new TGeoBBox("CoolingBlockBoxShape2",
-                                               0.5*fgkSSDCoolingBlockLength,
-                                               0.5*fgkSSDCoolingBlockWidth,
-                                               0.5*fgkSSDCoolingBlockHeight[1]);
-  TGeoTranslation* coolingblockboxtrans[kboxnumber-1];
-  coolingblockboxtrans[0] = new TGeoTranslation("CoolingBlockBoxTrans0",0.,0.,
-                                               0.5*(fgkSSDCoolingBlockHeight[1]
-                                       +       fgkSSDCoolingBlockHoleRadius[1])
-                                       +       fgkSSDCoolingBlockHeight[2]);
-  coolingblockboxtrans[1] = new TGeoTranslation("CoolingBlockBoxTrans1",
-                                               0.0,
-                                               0.0,
-                                               0.5*(fgkSSDCoolingBlockHeight[1]
-                                       +       fgkSSDCoolingBlockHeight[2]));
-  for(Int_t i=0; i<kboxnumber-1; i++) coolingblockboxtrans[i]->RegisterYourself();
-       new TGeoCompositeShape("CoolingBlockBoxCompositeShape",
-                                                  "CoolingBlockBoxShape0:CoolingBlockBoxTrans0+"
-        "CoolingBlockBoxShape1:CoolingBlockBoxTrans1+CoolingBlockBoxShape2");
   ///////////////////////
-  // Cooling Block Shape
-  //////////////////////
-  TGeoCombiTrans* coolingtubeholeshapecombitrans = 
-                                               new TGeoCombiTrans("CoolingTubeHoleShapeCombiTrans",
-                                               0.5*fgkSSDCoolingBlockLength,
-                                               0.5*fgkSSDCoolingBlockWidth,
-                                               fgkSSDCoolingBlockHoleCenter,
-                                               new TGeoRotation("",0.,90.,0.));
-  coolingtubeholeshapecombitrans->RegisterYourself();
-  TGeoTranslation* coolingblocktrapezoidcompositeshapetrans = 
-                                               new TGeoTranslation("CoolingBlockTrapezoidCompositeShapeTrans",
-                                               0.0,
-                                               0.0,
-                                               0.5*coolingblocktrapezoidheigth[0]+fgkSSDCoolingBlockHeight[1]+
-                                               fgkSSDCoolingBlockHeight[2]+fgkSSDCoolingBlockHoleRadius[1]);
-  coolingblocktrapezoidcompositeshapetrans->RegisterYourself();
-  TGeoTranslation* coolingblockboxcompositeshapetrans = 
-                                               new TGeoTranslation("CoolingBlockBoxCompositeShapeTrans",
-                                               0.5*fgkSSDCoolingBlockLength,
-                                               0.5*fgkSSDCoolingBlockWidth,
-                                               0.5*fgkSSDCoolingBlockHeight[1]);
-  coolingblockboxcompositeshapetrans->RegisterYourself();
-  TGeoCompositeShape* ssdoolingblockshape = 
-               new TGeoCompositeShape("SSDCoolingBlockShape",  
-               "CoolingBlockBoxCompositeShape:CoolingBlockBoxCompositeShapeTrans+"
-               "CoolingBlockTrapezoidCompositeShape:CoolingBlockTrapezoidCompositeShapeTrans-"
-               "CoolingTubeHoleShape:CoolingTubeHoleShapeCombiTrans");
-  TGeoVolume* ssdcoolingblock = new TGeoVolume("SSDCoolingBlock",
-               ssdoolingblockshape,fSSDAlCoolBlockMedium);
-  return ssdcoolingblock;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberJunction(Double_t width){
+  // Setting the vertices 
+  ///////////////////////
+  xmothervertex[0]  = 0.0;
+  xmothervertex[1]  = xmothervertex[0];
+  xmothervertex[2]  = fgkSSDFlexLength[0]-fgkSSDFlexLength[1];
+  xmothervertex[3]  = xmothervertex[2]+ssdflexboxlength[0]+ssdflexboxlength[1]
+                                       + ssdflexboxlength[4];
+  xmothervertex[4]  = xmothervertex[3];
+  xmothervertex[5]  = xmothervertex[4]-ssdflexboxlength[4];
+  xmothervertex[6]  = xmothervertex[5];
+  xmothervertex[7]  = xmothervertex[6]-fgkSSDFlexHoleLength;
+  xmothervertex[8]  = xmothervertex[7];
+  xmothervertex[9]  = xmothervertex[8]-ssdflexboxlength[2];
+  xmothervertex[10] = xmothervertex[9]; 
+  xmothervertex[11] = xmothervertex[10]-ssdflexboxlength[3];
+  xmothervertex[12] = xmothervertex[11];
+  xmothervertex[13] = xmothervertex[12]-ssdflexboxlength[2];
+  xmothervertex[14] = xmothervertex[13];
+  xmothervertex[15] = xmothervertex[14]-fgkSSDFlexHoleLength;
+  xmothervertex[16] = xmothervertex[15];
+  ymothervertex[0]  = 0.0;
+  ymothervertex[1]  = fgkSSDFlexWidth[1];
+  ymothervertex[2]  = fgkSSDFlexWidth[0];
+  ymothervertex[3]  = ymothervertex[2];
+  ymothervertex[4]  = ymothervertex[0];
+  ymothervertex[5]  = ymothervertex[4];
+  ymothervertex[6]  = ssdflexboxwidth[2];
+  ymothervertex[7]  = ymothervertex[6];
+  ymothervertex[8]  = ymothervertex[0];
+  ymothervertex[9]  = ymothervertex[8];
+  ymothervertex[10] = ssdflexboxwidth[2]-ssdflexboxwidth[3];
+  ymothervertex[11] = ymothervertex[10];
+  ymothervertex[12] = ymothervertex[0];
+  ymothervertex[13] = ymothervertex[12];
+  ymothervertex[14] = ymothervertex[7];
+  ymothervertex[15] = ymothervertex[14];
+  ymothervertex[16] = ymothervertex[0];
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Carbon Fiber Junction
+  // First Mother Volume containing SSDFlex
   /////////////////////////////////////////////////////////////
-  const Int_t kvertexnumber = 4;
-  TVector3* vertex[kvertexnumber];
-  vertex[0] = new TVector3();
-  vertex[1] = new TVector3(fgkCarbonFiberJunctionLength,0.);
-  vertex[2] = new TVector3(fgkCarbonFiberJunctionLength
-               -         fgkCarbonFiberJunctionEdge[1]
-                       *         TMath::Cos(fgkCarbonFiberJunctionAngle[1]*TMath::DegToRad()),
-                                 fgkCarbonFiberJunctionEdge[1]*TMath::Sin(fgkCarbonFiberJunctionAngle[1]
-                       *     TMath::DegToRad()));
-  vertex[3] = new TVector3(fgkCarbonFiberJunctionEdge[0]
-                       *         TMath::Cos(fgkCarbonFiberJunctionAngle[0]*TMath::DegToRad()),
-                                 fgkCarbonFiberJunctionEdge[0]
-                       *         TMath::Sin(fgkCarbonFiberJunctionAngle[0]*TMath::DegToRad()));
-  TGeoArb8* carbonfiberjunctionshapepiece = 
-                                               new TGeoArb8("CarbonFiberJunctionShapePiece",0.5*width);
-  //////////////////////////////////
-  //Setting the vertices in TGeoArb8
-  //////////////////////////////////
-  for(Int_t i = 0; i<2*kvertexnumber; i++)
-       carbonfiberjunctionshapepiece->SetVertex(i,
-                                                       vertex[(i < kvertexnumber ? i: i-kvertexnumber)]->X(),
-                                                       vertex[(i < kvertexnumber ? i : i-kvertexnumber)]->Y());
-  TGeoRotation* carbonfiberjunctionrot = 
-                                               new TGeoRotation("CarbonFiberJunctionRot",
-                                                                                 180.,
-                                                                                 180.,
-                                                                                 180-2.*fgkCarbonFiberJunctionAngle[0]); 
-  TGeoVolume* carbonfiberjunctionpiece = 
-                                               new TGeoVolume("CarbonFiberJunctionPiece",
-                                               carbonfiberjunctionshapepiece,fSSDCarbonFiberMedium);
-  TGeoVolume* carbonfiberjunction = 
-                                               new TGeoVolumeAssembly("CarbonFiberJunction");
-  carbonfiberjunctionpiece->SetLineColor(fColorCarbonFiber);
-  carbonfiberjunction->AddNode(carbonfiberjunctionpiece,1);
-  carbonfiberjunction->AddNode(carbonfiberjunctionpiece,2,carbonfiberjunctionrot);
-  return carbonfiberjunction;
-}
-/////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberJunctionAssembly(){
+  TGeoXtru* ssdflexmothershape = new TGeoXtru(2);
+  ssdflexmothershape->DefinePolygon(kmothervertexnumber,xmothervertex,
+                                                                   ymothervertex);
+  ssdflexmothershape->DefineSection(0,-1.5*fgkSSDFlexHeight[0]-2.*fgkSSDFlexHeight[1]);
+  ssdflexmothershape->DefineSection(1, 0.5*fgkSSDFlexHeight[0]);
+  TGeoVolumeAssembly* ssdflexmother = new TGeoVolumeAssembly("SSDFlexMother");
+//  TGeoVolume* ssdflexmother = new TGeoVolume("SSDFlexMother",ssdflexmothershape,
+//                                                                                      fSSDAir);
   /////////////////////////////////////////////////////////////
-  // Method generating SSD Carbon Fiber Junction Assembly    
+  // SSDFlex Layer Shapes
   /////////////////////////////////////////////////////////////
-  SetCarbonFiberJunctionCombiTransMatrix();
-  TGeoVolume* carbonfiberjunctionassembly = 
-                                                 new TGeoVolumeAssembly("CarbonFiberJunctionAssembly");
-  TGeoVolume* carbonfiberjunction = 
-                                                 GetCarbonFiberJunction(fgkCarbonFiberJunctionWidth);
-  for(Int_t i=0; i<fgkCarbonFiberJunctionCombiTransNumber;i++) 
-    carbonfiberjunctionassembly->AddNode(carbonfiberjunction,i+1,
-                                                                                fCarbonFiberJunctionCombiTransMatrix[i]);
-  return carbonfiberjunctionassembly;
+  for(Int_t i=0; i<kssdflexlayernumber; i++){
+       ssdflexshape[i]->DefinePolygon(kmothervertexnumber,xmothervertex,
+                                                                  ymothervertex);
+    ssdflexshape[i]->DefineSection(0,-0.5*fgkSSDFlexHeight[i]);
+       ssdflexshape[i]->DefineSection(1, 0.5*fgkSSDFlexHeight[i]);
+  }
+  /////////////////////////////////////
+  // Setting Layers into Mother Volume
+  /////////////////////////////////////
+  Int_t ssdflexcolor[kssdflexlayernumber] = {fColorAl,fColorPolyhamide};
+  TGeoMedium* ssdflexmed[kssdflexlayernumber] = {fSSDAlTraceFlexMedium,
+                                                                                                fSSDKaptonFlexMedium};
+  const char* ssdflexname[2*kssdflexlayernumber] = {"AlFlexLay1","KaptonFlexLay1",
+                                                                                                       "AlFlexLay2","KaptonFlexLay2"};
+  TGeoVolume* ssdflex[2*kssdflexlayernumber];
+  TGeoTranslation* ssdflextrans[2*kssdflexlayernumber];
+  for(Int_t i=0; i<2*kssdflexlayernumber; i++){
+       ssdflex[i] = new TGeoVolume(ssdflexname[i],
+                                                               i%2==0 ? ssdflexshape[0] : ssdflexshape[1],
+                                                               i%2==0 ? ssdflexmed[0]   : ssdflexmed[1]);
+       ssdflex[i]->SetLineColor(i%2==0 ? ssdflexcolor[0] : ssdflexcolor[1]);
+    ssdflextrans[i]  = new TGeoTranslation(0.,0.,-0.5*i*(fgkSSDFlexHeight[0]
+                                        +                                         fgkSSDFlexHeight[1])); 
+    ssdflexmother->AddNode(ssdflex[i],1,ssdflextrans[i]);
+  }
+  return ssdflexmother;
 }
 /////////////////////////////////////////////////////////////////////////////////
-TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelength){
-  /////////////////////////////////////////////////////////////
-  // Method returning a List containing pointers to Ladder Cable Volumes    
+TGeoVolume* AliITSv11GeometrySSD::GetSSDEndFlex(){
   /////////////////////////////////////////////////////////////
-  const Int_t kladdercablesegmentnumber = 2;
+  // Method generating SSD End Flex   
   /////////////////////////////////////////
-  // LadderSegmentBBox Volume
+  Double_t ssdflexradiusmax = (fgkSSDFlexLength[3]-fgkSSDFlexLength[2])
+                                                       /  TMath::Tan(fgkSSDFlexAngle*TMath::DegToRad());
+  Double_t ssdflexboxlength = fgkSSDFlexFullLength-2.*fgkSSDFlexAngle
+                                               * TMath::DegToRad()*ssdflexradiusmax
+                                               - fgkSSDFlexLength[2]-TMath::Pi()
+                                               * fgkSSDStiffenerHeight-fgkSSDFlexLength[0]
+                                                       - 0.1*fgkSSDFlexFullLength;
+  const Int_t knedges = 20;  
+  const Int_t karcnumber = 2;
+  TVector3* vertexposition[karcnumber*(knedges+1)];
+  Double_t deltangle[karcnumber] = {2.*fgkSSDFlexAngle/knedges,180.0/knedges}; 
+  Double_t angle[karcnumber] = {90.-2.*fgkSSDFlexAngle,180.0}; 
+  Double_t radius[karcnumber] = {ssdflexradiusmax-fgkSSDStiffenerHeight,fgkSSDStiffenerHeight};
+  Double_t referenceangle[karcnumber] = {-180.0*TMath::DegToRad(),
+                                                                                - 90.0*TMath::DegToRad()};
+  TVector3* referencetrans[karcnumber];
+  referencetrans[0] = new TVector3(ssdflexboxlength*CosD(2.*fgkSSDFlexAngle)
+                                       +                          radius[0]*SinD(2.*fgkSSDFlexAngle),
+                                  radius[0], 0);
+  referencetrans[1] = new TVector3(referencetrans[0]->X()
+                                       +              fgkSSDFlexLength[2],
+                                  -              fgkSSDStiffenerHeight, 0);
+for(Int_t i=0; i<karcnumber; i++){
+       for(Int_t j=0; j<knedges+1; j++){
+               vertexposition[j+i*(knedges+1)] = new TVector3(radius[i]*CosD(angle[i]),
+                                                        radius[i]*SinD(angle[i]), 0);
+               angle[i] +=  deltangle[i]*(1.0-2.0*i);
+       }       
+  }
+  ///////////////////////
+  // Setting the vertices 
+  ///////////////////////
+  const Int_t kendflexlayernumber = 4;
+  const Int_t kendflexvertexnumber = 4*(knedges+1)+2;
+  TVector3** vertex[kendflexlayernumber];
+  for(Int_t i=0; i<kendflexlayernumber; i++) 
+                                       vertex[i] = new TVector3*[kendflexvertexnumber];
+  TVector3* transvector[kendflexlayernumber+1];
+  TVector3* deltatransvector = new TVector3(); 
+  for(Int_t i=0; i<kendflexlayernumber+1; i++) transvector[i] = new TVector3();        
+  transvector[0]->SetXYZ(0.0,ssdflexboxlength*SinD(2.*fgkSSDFlexAngle)
+                               +                radius[0]*(1.0-CosD(2.*fgkSSDFlexAngle)),0.0);
+  for(Int_t i=1; i<kendflexlayernumber+1; i++){        
+       deltatransvector->SetXYZ((i%2!=0?fgkSSDFlexHeight[0]:fgkSSDFlexHeight[1])
+                                       *                 CosD(fgkSSDFlexAngle),
+                                                         (i%2!=0?fgkSSDFlexHeight[0]:fgkSSDFlexHeight[1])
+                                       *         SinD(fgkSSDFlexAngle),0.0);   
+       *transvector[i] = *transvector[i-1]+*deltatransvector;
+  }
+  Double_t ratioradius[karcnumber][kendflexlayernumber+1];
+  ratioradius[0][0] = 1., ratioradius[1][0] = 1.;
+  for(Int_t i=0; i<karcnumber; i++){
+       for(Int_t j=1; j<kendflexlayernumber+1; j++){
+               ratioradius[i][j] = ratioradius[i][j-1]-TMath::Power(-1.0,i)
+                                                 * (j%2!=0?fgkSSDFlexHeight[0]:fgkSSDFlexHeight[1])
+                                             /radius[i];
+       }
+  }
+  for(Int_t i=0; i<kendflexlayernumber; i++){
+    vertex[i][0] = new TVector3(transvector[i]->X(),transvector[i]->Y(),0);
+    vertex[i][1] = new TVector3(transvector[i+1]->X(),transvector[i+1]->Y(),0);
+       for(Int_t j=0; j<karcnumber*(knedges+1); j++){
+               if(j<(knedges+1)){
+                       vertex[i][j+2] = new TVector3(vertexposition[j]->X()*ratioradius[0][i+1],
+                                               vertexposition[j]->Y()*ratioradius[0][i+1], 0);
+                       vertex[i][j+2]->RotateZ(referenceangle[0]);
+                       *vertex[i][j+2] += *referencetrans[0];
+                       vertex[i][4*(knedges+1)-j+1] = 
+                                                        new TVector3(vertexposition[j]->X()*ratioradius[0][i],
+                                vertexposition[j]->Y()*ratioradius[0][i], 0);
+                       vertex[i][4*(knedges+1)-j+1]->RotateZ(referenceangle[0]);
+                       *vertex[i][4*(knedges+1)-j+1] += *referencetrans[0];
+               }
+               else{
+               
+                       vertex[i][j+2] = new TVector3(vertexposition[j]->X()*ratioradius[1][i+1],
+                                               vertexposition[j]->Y()*ratioradius[1][i+1],0);
+                       vertex[i][j+2]->RotateZ(referenceangle[1]);
+                       *vertex[i][j+2] += *referencetrans[1];
+                       vertex[i][4*(knedges+1)-j+1] = 
+                                                        new TVector3(vertexposition[j]->X()*ratioradius[1][i],
+                                      vertexposition[j]->Y()*ratioradius[1][i],
+                                      0);
+                       vertex[i][4*(knedges+1)-j+1]->RotateZ(referenceangle[1]);
+                       *vertex[i][4*(knedges+1)-j+1] += *referencetrans[1];
+          }
+       }
+  }
+  /////////////////////////////////////////////////////////////
+  // First Mother Volume containing SSDEndFlex
+  /////////////////////////////////////////////////////////////
+  TGeoXtru* ssdendflexmothershape = new TGeoXtru(2);
+  Double_t xmothervertex[kendflexvertexnumber];
+  Double_t ymothervertex[kendflexvertexnumber];
+  xmothervertex[0] = vertex[0][0]->X();        
+  ymothervertex[0] = vertex[0][0]->Y();
+  for(Int_t i=1; i<kendflexvertexnumber; i++){
+       if(i<2*(knedges+1)+2){
+               xmothervertex[i] = vertex[3][i]->X();
+               ymothervertex[i] = vertex[3][i]->Y();
+       }
+       else{
+               xmothervertex[i] = vertex[0][i]->X();
+               ymothervertex[i] = vertex[0][i]->Y();
+       }
+  }
+  ssdendflexmothershape->DefinePolygon(kendflexvertexnumber,
+                                                                          xmothervertex,ymothervertex);
+  ssdendflexmothershape->DefineSection(0,-0.5*fgkSSDFlexWidth[0]);
+  ssdendflexmothershape->DefineSection(1, 0.5*fgkSSDFlexWidth[0]);
+//  TGeoVolume* ssdendflexmother = new TGeoVolume("SSDEndFlexMother",
+//                                                              ssdendflexmothershape,fSSDAir);        
+  TGeoVolumeAssembly* ssdendflexmother = new TGeoVolumeAssembly("SSDEndFlexMother");
+  //////////////////////////////////////
+  // End Flex TGeoXtru Layer Definition 
+  //////////////////////////////////////
+  TGeoXtru* ssdendflexshape[kendflexlayernumber];
+  TGeoVolume* ssdendflex[kendflexlayernumber];
+  for(Int_t i=0; i<kendflexlayernumber; i++) ssdendflexshape[i] = new TGeoXtru(2);
+  Double_t xvertex[kendflexlayernumber][kendflexvertexnumber];
+  Double_t yvertex[kendflexlayernumber][kendflexvertexnumber];
+  Int_t ssdendflexcolor[kendflexlayernumber] = {fColorAl,fColorPolyhamide};
+  TGeoMedium* ssdendflexmed[kendflexlayernumber] = {fSSDAlTraceFlexMedium,
+                                                                                                       fSSDKaptonFlexMedium};
+  const char* ssdendflexname[kendflexlayernumber] = {"AlEndFlexLay1","KaptonEndFlexLay1",
+                                                                                                        "AlEndFlexLay2","KaptonEndFlexLay2"};
+  for(Int_t i=0; i<kendflexlayernumber; i++){
+       for(Int_t j=0; j<4*(knedges+1)+2; j++){
+               xvertex[i][j] = vertex[i][j]->X();
+               yvertex[i][j] = vertex[i][j]->Y();
+       }
+  ssdendflexshape[i]->DefinePolygon(kendflexvertexnumber,xvertex[i],yvertex[i]);
+  ssdendflexshape[i]->DefineSection(0,-0.5*fgkSSDFlexWidth[0]);
+  ssdendflexshape[i]->DefineSection(1, 0.5*fgkSSDFlexWidth[0]);
+  ssdendflex[i] = new TGeoVolume(ssdendflexname[i],ssdendflexshape[i],
+                                                                i%2==0 ? ssdendflexmed[0] : ssdendflexmed[1]);
+  ssdendflex[i]->SetLineColor(i%2==0 ? ssdendflexcolor[0] : ssdendflexcolor[1]);
+  ssdendflexmother->AddNode(ssdendflex[i],1);
+  }
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<karcnumber*(knedges+1); i++) delete vertexposition[i];
+  for(Int_t i=0; i<karcnumber; i++) delete referencetrans[i];
+  for(Int_t i=0; i<kendflexlayernumber; i++){
+       for(Int_t j=0; j<kendflexvertexnumber; j++) delete vertex[i][j];
+       delete [] vertex[i];
+  }
+  for(Int_t i=0; i<kendflexlayernumber+1; i++) delete transvector[i];  
+  delete deltatransvector;
+  /////////////////////////////////////////////////////////////
+  //ssdendflexmother->CheckOverlaps(0.01);
+  return ssdendflexmother;
+}
+///////////////////////////////////////////////////////////////////////////////
+TGeoVolume* AliITSv11GeometrySSD::GetSSDMountingBlock(){
+  /////////////////////////////////////////////////////////////
+  // Method generating the Mounting Block
+  /////////////////////////////////////////////////////////////  
+  const Int_t kvertexnumber = 8;
+  Double_t xvertex[kvertexnumber];
+  Double_t yvertex[kvertexnumber];
+  xvertex[0] = -0.25*(fgkSSDMountingBlockLength[0]-fgkSSDMountingBlockLength[1]); 
+  xvertex[1] = xvertex[0];
+  xvertex[2] = -xvertex[0];
+  xvertex[3] = xvertex[2];
+  xvertex[4] = xvertex[3]+0.5*(fgkSSDMountingBlockLength[1]
+                        -                                 fgkSSDMountingBlockLength[2]);
+  xvertex[5] = xvertex[4];
+  xvertex[6] = 0.5*fgkSSDMountingBlockLength[0]-xvertex[2]
+                        - 0.5*fgkSSDMountingBlockScrewHoleEdge
+                        -     fgkSSDMountingBlockScrewHoleRadius[0];
+  xvertex[7] = xvertex[6];
+  yvertex[0] = -0.5*fgkCoolingTubeSupportHeight-fgkSSDModuleCoolingBlockToSensor
+                        +      fgkSSDMountingBlockHeight[1]-0.5*fgkSSDMountingBlockHeight[0];
+  yvertex[1] = 0.5*fgkSSDMountingBlockHeight[0];
+  yvertex[2] = yvertex[1]; 
+  yvertex[3] = fgkSSDMountingBlockHeight[1]-yvertex[1];
+  yvertex[4] = yvertex[3];
+  yvertex[5] = yvertex[2]+fgkSSDMountingBlockHeight[2]
+                        - fgkSSDMountingBlockHeight[0];
+  yvertex[6] = yvertex[5];
+  yvertex[7] = yvertex[0];
+
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXTru Volume definition for Mounting Block Part
+  ///////////////////////////////////////////////////////////////////////
+  TGeoXtru* ssdmountingblockshape = new TGeoXtru(2);
+  ssdmountingblockshape->DefinePolygon(kvertexnumber,xvertex,yvertex);
+  ssdmountingblockshape->DefineSection(0,-0.5*fgkSSDMountingBlockWidth);
+  ssdmountingblockshape->DefineSection(1,0.5*fgkSSDMountingBlockWidth);
+  TGeoVolume* ssdmountingblock = new TGeoVolume("SSDMountingBlock",
+                                                                         ssdmountingblockshape,
+                                                                                 fSSDMountingBlockMedium);
+  ssdmountingblock->SetLineColor(fColorG10);
+  TGeoCombiTrans* mountingblockcombitrans = new TGeoCombiTrans();
+  mountingblockcombitrans->SetTranslation(2.*xvertex[2]+fgkSSDMountingBlockLength[1],0.,0.);
+  TGeoRotation* mountingblockrot = new TGeoRotation();
+  mountingblockrot->SetAngles(90.,180.,-90.);
+  mountingblockcombitrans->SetRotation(*mountingblockrot);
+  /////////////////////////////////////////////////////////////
+  // Generating the Mounting Block Screw Vertices 
+  /////////////////////////////////////////////////////////////  
+  const Int_t kscrewvertexnumber = 15;
+  Double_t alpha = TMath::ACos(0.5*(fgkSSDMountingBlockHeight[1]
+                                -                                      fgkSSDMountingBlockScrewHoleEdge)
+                                /                              fgkSSDMountingBlockScrewHoleRadius[0])
+                                * TMath::RadToDeg();
+  Double_t phi0 = 90.+alpha;
+  Double_t phi = 270.-2*alpha;
+  Double_t deltaphi = phi/kscrewvertexnumber;  
+  TVector3* screwvertex[kscrewvertexnumber+1];
+  for(Int_t i=0; i<kscrewvertexnumber+1; i++)  
+       screwvertex[i] = new TVector3(fgkSSDMountingBlockScrewHoleRadius[0]
+                                  *CosD(phi0+i*deltaphi),
+                                  fgkSSDMountingBlockScrewHoleRadius[0]
+                                     *SinD(phi0+i*deltaphi), 0);
+  Double_t xscrewvertex[kscrewvertexnumber+6];
+  Double_t yscrewvertex[kscrewvertexnumber+6];
+  xscrewvertex[0] = - fgkSSDMountingBlockScrewHoleRadius[0];   
+  yscrewvertex[0] = -0.5*(fgkSSDMountingBlockWidth
+                                 -               fgkSSDMountingBlockScrewHoleEdge);
+  xscrewvertex[1] = xscrewvertex[0];
+  yscrewvertex[1] = 0.5*fgkSSDMountingBlockScrewHoleEdge;
+  xscrewvertex[2] = screwvertex[0]->X();
+  yscrewvertex[2] = yscrewvertex[1];
+  for(Int_t i=0; i<kscrewvertexnumber+1; i++){
+       xscrewvertex[i+3] = screwvertex[i]->X();        
+       yscrewvertex[i+3] = screwvertex[i]->Y();        
+  } 
+  xscrewvertex[kscrewvertexnumber+4] = 0.5*fgkSSDMountingBlockScrewHoleEdge;   
+  yscrewvertex[kscrewvertexnumber+4] = yscrewvertex[kscrewvertexnumber+3];     
+  xscrewvertex[kscrewvertexnumber+5] = xscrewvertex[kscrewvertexnumber+4];
+  yscrewvertex[kscrewvertexnumber+5] = yscrewvertex[0];
+  TGeoXtru* ssdmountingblockscrewshape = new TGeoXtru(2);
+  ssdmountingblockscrewshape->DefinePolygon(kscrewvertexnumber+6,xscrewvertex,yscrewvertex);
+  ssdmountingblockscrewshape->DefineSection(0,yvertex[0]);
+  ssdmountingblockscrewshape->DefineSection(1,-0.5*fgkSSDMountingBlockHeight[0]
+                                                       +                                  fgkSSDMountingBlockHeight[2]);
+  TGeoVolume* ssdmountingblockscrew = new TGeoVolume("SSDMountingBlockScrew",
+                                                                               ssdmountingblockscrewshape,
+                                                                                           fSSDMountingBlockMedium);
+  ssdmountingblockscrew->SetLineColor(fColorG10);
+  TGeoCombiTrans* ssdmountingblockscrewcombitrans[4];
+  for(Int_t i=0; i<4; i++) ssdmountingblockscrewcombitrans[i] = new TGeoCombiTrans();
+  ssdmountingblockscrewcombitrans[0]->SetTranslation(-0.5*fgkSSDMountingBlockScrewHoleEdge,
+                                                                       -                                yscrewvertex[1],
+                                                                                                        0.5*fgkSSDMountingBlockHeight[0]
+                                                                       -                                fgkSSDMountingBlockHeight[2]
+                                                                       +                                0.5*(-0.5*fgkSSDMountingBlockHeight[0]
+                                                                       +                                fgkSSDMountingBlockHeight[2]
+                                                                       -                                yvertex[0]));
+  ssdmountingblockscrewcombitrans[1]->SetTranslation(0.5*fgkSSDMountingBlockScrewHoleEdge,
+                                                                                                       -0.5*fgkSSDMountingBlockScrewHoleEdge,
+                                                                                                                yscrewvertex[1]
+                                                                                                       -0.5*(-0.5*fgkSSDMountingBlockHeight[0]
+                                                                                                        +fgkSSDMountingBlockHeight[2]
+                                                                                                        -yvertex[0]));
+  ssdmountingblockscrewcombitrans[2]->SetTranslation(-0.5*fgkSSDMountingBlockScrewHoleEdge,
+                                                                                                         yscrewvertex[1],
+                                                                       -                                 0.5*fgkSSDMountingBlockHeight[0]
+                                                                       +                                 fgkSSDMountingBlockHeight[2]
+                                                                       -                                 0.5*(-0.5*fgkSSDMountingBlockHeight[0]
+                                                                       +                                 fgkSSDMountingBlockHeight[2]
+                                                                       -                                 yvertex[0]));
+  ssdmountingblockscrewcombitrans[3]->SetTranslation(0.5*fgkSSDMountingBlockScrewHoleEdge,
+                                                                                                        yscrewvertex[1],
+                                                                       -                                yscrewvertex[1]
+                                                                       +                                0.5*(-0.5*fgkSSDMountingBlockHeight[0]
+                                                                       +                                fgkSSDMountingBlockHeight[2]
+                                                                       -                                yvertex[0]));
+  TGeoRotation* ssdmountingblockscrewrot[4];
+  for(Int_t i=0; i<4; i++) ssdmountingblockscrewrot[i] = new TGeoRotation();
+       ssdmountingblockscrewrot[1]->SetAngles(90.,-180.,-90.); 
+    ssdmountingblockscrewrot[2]->SetAngles(0.,180.,0.);        
+    ssdmountingblockscrewrot[3]->SetAngles(180.,0.,0.);        
+  for(Int_t i=1; i<4; i++) 
+       ssdmountingblockscrewcombitrans[i]->SetRotation(*ssdmountingblockscrewrot[i]);
+  TGeoRotation* ssdmountingblockglobalrot = new TGeoRotation();
+  ssdmountingblockglobalrot->SetAngles(0.,90.,0.);     
+  TGeoTranslation* ssdmountingblockglobaltrans = new TGeoTranslation();
+  ssdmountingblockglobaltrans->SetTranslation(0.5*fgkSSDMountingBlockLength[0]
+                                                        +                                xvertex[0],yscrewvertex[1]
+                                                        -                                0.5*(-0.5*fgkSSDMountingBlockHeight[0]
+                                                        +                                fgkSSDMountingBlockHeight[2]
+                                                        -                                yvertex[0]),0.);      
+  TGeoHMatrix* ssdmountingblockscrewmatrix[4];
+  for(Int_t i=0; i<4; i++){
+       ssdmountingblockscrewmatrix[i] = 
+               new TGeoHMatrix((*ssdmountingblockglobalrot)*(*ssdmountingblockscrewcombitrans[i])); 
+       ssdmountingblockscrewmatrix[i]->MultiplyLeft(ssdmountingblockglobaltrans);
+  }
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXtru for Mother Volume 
+  ///////////////////////////////////////////////////////////////////////
+  const Int_t kvertexmothernumber = 12;
+  Double_t xmothervertex[kvertexmothernumber];
+  Double_t ymothervertex[kvertexmothernumber];
+  for(Int_t i=0; i<6; i++){
+       xmothervertex[i] = xvertex[i];
+       ymothervertex[i] = yvertex[i];
+  } 
+  xmothervertex[6]  = xvertex[5]+fgkSSDMountingBlockLength[2];
+  ymothervertex[6]  = ymothervertex[5];
+  xmothervertex[7]  = xmothervertex[6];
+  ymothervertex[7]  = ymothervertex[4] - fgkSSDTolerance;
+  xmothervertex[8]  = xmothervertex[7]
+                                       + 0.5*(fgkSSDMountingBlockLength[1]
+                                       -          fgkSSDMountingBlockLength[2]);
+  ymothervertex[8]  = ymothervertex[7];
+  xmothervertex[9]  = xmothervertex[8];
+  ymothervertex[9]  = ymothervertex[2];
+  xmothervertex[10] = xvertex[0]+fgkSSDMountingBlockLength[0];
+  ymothervertex[10] = ymothervertex[1];
+  xmothervertex[11] = xmothervertex[10];
+  ymothervertex[11] = ymothervertex[0];  
+  TGeoXtru* ssdmountingblockmothershape = new TGeoXtru(2);
+  ssdmountingblockmothershape->DefinePolygon(kvertexmothernumber,xmothervertex,ymothervertex);
+  ssdmountingblockmothershape->DefineSection(0,-0.5*fgkSSDMountingBlockWidth);
+  ssdmountingblockmothershape->DefineSection(1,0.5*fgkSSDMountingBlockWidth);
+  TGeoVolume* ssdmountingblockmother = new TGeoVolume("SSDMountingBlockMother",
+                                                                         ssdmountingblockmothershape,
+                                                                                 fSSDAir);
+  /////////////////////////////////////////////////////////////
+  // Placing the Volumes into Mother Volume 
+  /////////////////////////////////////////////////////////////
+  ssdmountingblockmother->AddNode(ssdmountingblock,1);
+  ssdmountingblockmother->AddNode(ssdmountingblock,2,mountingblockcombitrans);
+  for(Int_t i=0; i<4; i++) 
+       ssdmountingblockmother->AddNode(ssdmountingblockscrew,i+1,
+                                                                       ssdmountingblockscrewmatrix[i]);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete mountingblockrot;
+  for(Int_t i=0; i<4; i++) delete ssdmountingblockscrewrot[i];
+  delete ssdmountingblockglobalrot; 
+  delete ssdmountingblockglobaltrans; 
+  /////////////////////////////////////////////////////////////
+  return ssdmountingblockmother;
+}
+///////////////////////////////////////////////////////////////////////////////
+ TGeoVolume* AliITSv11GeometrySSD::GetMountingBlockClip() const {
+  /////////////////////////////////////////////////////////////
+  // Method generating the Mounting Block Clip 
+  /////////////////////////////////////////////////////////////  
+  const Int_t kmothervertexnumber = 10;
+  Double_t xmothervertex[kmothervertexnumber];
+  Double_t ymothervertex[kmothervertexnumber];
+  xmothervertex[0] = -0.25*(fgkSSDMountingBlockLength[0]-fgkSSDMountingBlockLength[1])
+                                  - 0.5*(fgkSSDSensorWidth-fgkSSDMountingBlockLength[0]); 
+  xmothervertex[1] = xmothervertex[0];
+  xmothervertex[2] = xmothervertex[0]+0.5*(fgkMountingBlockClibScrewPosition
+                                  - fgkMountingBlockClibScrewRadius);
+  xmothervertex[3] = xmothervertex[2]; 
+  xmothervertex[4] = xmothervertex[3]+2.*fgkMountingBlockClibScrewRadius; 
+  xmothervertex[5] = xmothervertex[4]; 
+  xmothervertex[6] = xmothervertex[0]+fgkMountingBlockClipLength; 
+  xmothervertex[7] = xmothervertex[6]; 
+  xmothervertex[8] = -0.25*(fgkSSDMountingBlockLength[0]-fgkSSDMountingBlockLength[1]); 
+  xmothervertex[9] = xmothervertex[8]; 
+  ymothervertex[0] = -0.5*fgkCoolingTubeSupportHeight-fgkSSDModuleCoolingBlockToSensor
+                              + fgkSSDMountingBlockHeight[1]-0.5*fgkSSDMountingBlockHeight[0];
+  ymothervertex[1] = 0.5*fgkSSDMountingBlockHeight[0]+fgkMountingBlockClipThickness;
+  ymothervertex[2] = ymothervertex[1];
+  ymothervertex[3] = ymothervertex[2]+(fgkSSDMountingBlockHeight[1]
+                                  - fgkSSDMountingBlockHeight[0]-fgkMountingBlockClipThickness
+                                  - 0.5*fgkCoolingTubeSupportHeight-fgkCoolingTubeSupportRmax);
+  ymothervertex[4] = ymothervertex[3];
+  ymothervertex[5] = ymothervertex[2];
+  ymothervertex[6] = ymothervertex[5];
+  ymothervertex[7] = ymothervertex[6]-fgkMountingBlockClipThickness;
+  ymothervertex[8] = ymothervertex[7];
+  ymothervertex[9] = ymothervertex[0];
+
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXTru Volume definition for Mounting Block Clip Part
+  ///////////////////////////////////////////////////////////////////////
+  TGeoXtru* ssdmountingblockclipshape = new TGeoXtru(2);
+  ssdmountingblockclipshape->DefinePolygon(kmothervertexnumber,xmothervertex,ymothervertex);
+  ssdmountingblockclipshape->DefineSection(0,0.5*fgkSSDMountingBlockWidth-fgkMountingBlockSupportWidth[0]);
+  ssdmountingblockclipshape->DefineSection(1,0.5*fgkSSDMountingBlockWidth);
+  TGeoVolume* ssdmountingblockclip = new TGeoVolume("SSDMountingBlockClip",
+                                                                         ssdmountingblockclipshape,fSSDAir);
+  ssdmountingblockclip->SetLineColor(4);
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXTru Volume definition for Clip 
+  ///////////////////////////////////////////////////////////////////////
+  const Int_t kclipvertexnumber = 6;
+  Double_t xclipvertex[kclipvertexnumber];
+  Double_t yclipvertex[kclipvertexnumber];
+  xclipvertex[0] = xmothervertex[0];
+  xclipvertex[1] = xclipvertex[0];
+  xclipvertex[2] = xmothervertex[6];
+  xclipvertex[3] = xclipvertex[2];
+  xclipvertex[4] = xclipvertex[0]+fgkMountingBlockClipThickness;
+  xclipvertex[5] = xclipvertex[4];
+  yclipvertex[0] = ymothervertex[0];
+  yclipvertex[1] = ymothervertex[1];
+  yclipvertex[2] = yclipvertex[1];
+  yclipvertex[3] = yclipvertex[1]-fgkMountingBlockClipThickness;
+  yclipvertex[4] = yclipvertex[3];
+  yclipvertex[5] = yclipvertex[0];
+  TGeoXtru* clipshape = new TGeoXtru(2);
+  clipshape->DefinePolygon(kclipvertexnumber,xclipvertex,yclipvertex);
+  clipshape->DefineSection(0,0.5*fgkSSDMountingBlockWidth-fgkMountingBlockClibWidth);
+  clipshape->DefineSection(1,0.5*fgkSSDMountingBlockWidth-fgkMountingBlockSupportWidth[0]
+                                                        +   fgkMountingBlockClibWidth);
+  TGeoVolume* clip = new TGeoVolume("SSDClip",clipshape,fSSDMountingBlockMedium);
+  clip->SetLineColor(18);
+  ///////////////////////////////////////////////////////////////////////
+  // Ladder Support Piece  
+  ///////////////////////////////////////////////////////////////////////
+  const Int_t ksupportvertexnumber = 4;
+  Double_t xsupportvertex[ksupportvertexnumber];
+  Double_t ysupportvertex[ksupportvertexnumber];
+  xsupportvertex[0] = xclipvertex[5];
+  xsupportvertex[1] = xsupportvertex[0];
+  xsupportvertex[2] = xmothervertex[9];
+  xsupportvertex[3] = xsupportvertex[2];
+  ysupportvertex[0] = yclipvertex[0];
+  ysupportvertex[1] = yclipvertex[3];
+  ysupportvertex[2] = ysupportvertex[1];
+  ysupportvertex[3] = ysupportvertex[0];
+  TGeoXtru* supportshape = new TGeoXtru(2);
+  supportshape->DefinePolygon(ksupportvertexnumber,xsupportvertex,ysupportvertex);
+  supportshape->DefineSection(0,0.5*fgkSSDMountingBlockWidth-fgkMountingBlockSupportWidth[0]);
+  supportshape->DefineSection(1,0.5*fgkSSDMountingBlockWidth);
+  TGeoVolume* support = new TGeoVolume("RingSupport",supportshape,fSSDMountingBlockMedium);
+  support->SetLineColor(9);
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXTru Volume definition for Screw   
+  ///////////////////////////////////////////////////////////////////////
+  Double_t radius[2] = {fgkMountingBlockClibScrewRadius,
+                                               0.5*fgkMountingBlockClibScrewRadius};
+  Int_t edgesnumber[2] = {50,6};
+  Double_t section[2] = {-0.5*(ymothervertex[3]-ymothervertex[2]),
+                                                +0.5*(ymothervertex[3]-ymothervertex[2])};
+  TGeoShape* clipscrewshape = GetScrewShape(radius,edgesnumber,section);
+  TGeoVolume* clipscrew = new TGeoVolume("ClipScrewShape",clipscrewshape,fSSDSupportRingAl);
+  clipscrew->SetLineColor(12);
+  TGeoRotation* screwrot = new TGeoRotation();
+  screwrot->SetAngles(0.,90.,0.);
+  TGeoTranslation* screwtrans = new TGeoTranslation();
+  screwtrans->SetTranslation(xmothervertex[3]+fgkMountingBlockClibScrewRadius,
+                                                        0.5*(ymothervertex[3]+ymothervertex[2]),
+                                                        0.5*fgkSSDMountingBlockWidth+
+                                                       -0.5*fgkMountingBlockSupportWidth[0]);
+  TGeoCombiTrans* screwcombitrans = new TGeoCombiTrans(*screwtrans,*screwrot);
+  ///////////////////////////////////////////////////////////////////////
+  // Placing the Volumes
+  ///////////////////////////////////////////////////////////////////////
+  ssdmountingblockclip->AddNode(clip,1);
+  ssdmountingblockclip->AddNode(support,1);
+  ssdmountingblockclip->AddNode(clipscrew,1,screwcombitrans);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////  
+  delete screwtrans;
+  delete screwrot;
+  /////////////////////////////////////////////////////////////
+  return ssdmountingblockclip;
+}
+///////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::CreateCoolingTubes() {
+  /////////////////////////////////////////////////////////////
+  // Method generating the Cooling Tube 
+  // sets fcoolingtube and returns list for endladdercoolingtube
+  /////////////////////////////////////////////////////////////  
+  TGeoTube *coolingtubeshape[2];
+  // Ladder Cooling Tubes
+
+  // MvL: Simplified cooling tubes
+  coolingtubeshape[0] = new TGeoTube(fgkCoolingTubeRmin,fgkCoolingTubeRmax,0.5*fgkCoolingTubeLength);
+  coolingtubeshape[1] = new TGeoTube(0.0,fgkCoolingTubeRmin,coolingtubeshape[0]->GetDz());
+
+  // End Ladder Cooling Tubes  
+  TGeoTube** endladdercoolingtubeshape[fgkendladdercoolingtubenumber];
+  for(Int_t i=0; i<fgkendladdercoolingtubenumber; i++) 
+    endladdercoolingtubeshape[i] = new TGeoTube*[2];
+
+  Double_t sensZshift = 0.5*fgkCarbonFiberJunctionWidth - fgkCarbonFiberLowerSupportWidth - fgkLowerSupportToSensorZ;
+  endladdercoolingtubeshape[0][0] = new TGeoTube(fgkCoolingTubeRmin,fgkCoolingTubeRmax,
+                                                0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[0] - sensZshift));
+  endladdercoolingtubeshape[0][1] = new TGeoTube(0.0,fgkCoolingTubeRmin,
+                                                endladdercoolingtubeshape[0][0]->GetDz());
+  endladdercoolingtubeshape[1][0] = new TGeoTube(fgkCoolingTubeRmin,fgkCoolingTubeRmax,
+                                                0.5*(fgkEndLadderCarbonFiberLowerJunctionLength[1] + sensZshift));
+  endladdercoolingtubeshape[1][1] = new TGeoTube(0.0,fgkCoolingTubeRmin,
+                                                endladdercoolingtubeshape[1][0]->GetDz()-0.5*fgkSSDTolerance);
+  // Ladder Cooling Tubes
+  TGeoVolume* coolingtube[2];
+  coolingtube[0] = new TGeoVolume("OuterCoolingTube1",coolingtubeshape[0], fSSDCoolingTubePhynox);
+  coolingtube[1] = new TGeoVolume("InnerCoolingTube1",coolingtubeshape[1], fSSDCoolingTubeWater);
+  coolingtube[0]->SetLineColor(fColorPhynox);
+  coolingtube[1]->SetLineColor(fColorWater);
+
+  // End Ladder Cooling Tubes  
+  TGeoVolume** endladdercoolingtube[fgkendladdercoolingtubenumber];
+  for(Int_t i=0; i<fgkendladdercoolingtubenumber; i++) 
+    endladdercoolingtube[i] = new TGeoVolume*[2];
+  endladdercoolingtube[0][0] = new TGeoVolume("OuterEndLadderCoolingTube1",
+                                             endladdercoolingtubeshape[0][0],
+                                             fSSDCoolingTubePhynox);
+  endladdercoolingtube[0][1] = new TGeoVolume("InnerEndlLadderCoolingTube1",
+                                             endladdercoolingtubeshape[0][1],
+                                             fSSDCoolingTubeWater);
+  endladdercoolingtube[1][0] = new TGeoVolume("OuterEndLadderCoolingTube2",
+                                             endladdercoolingtubeshape[1][0],
+                                             fSSDCoolingTubePhynox);
+  endladdercoolingtube[1][1] = new TGeoVolume("InnerEndlLadderCoolingTube2",
+                                             endladdercoolingtubeshape[1][1],
+                                             fSSDCoolingTubeWater);
+  for(Int_t i=0; i<fgkendladdercoolingtubenumber; i++){
+    endladdercoolingtube[i][0]->SetLineColor(fColorPhynox);
+    endladdercoolingtube[i][1]->SetLineColor(fColorWater);
+  }
+  
+  /////////////////////////////////////////////////////////////
+  // Virtual Volume containing Cooling Tubes
+  /////////////////////////////////////////////////////////////
+  // Ladder Cooling Tubes
+  TGeoTube* virtualcoolingtubeshape = new TGeoTube(coolingtubeshape[1]->GetRmin(),
+                                                  coolingtubeshape[0]->GetRmax(),
+                                                  coolingtubeshape[0]->GetDz());
+  fcoolingtube = new TGeoVolume("CoolingTube1",virtualcoolingtubeshape, fSSDAir);
+  fcoolingtube->AddNode(coolingtube[0],1);
+  fcoolingtube->AddNode(coolingtube[1],1);
+
+  // End Ladder Cooling Tubes
+  TGeoTube* endladdervirtualcoolingtubeshape[fgkendladdercoolingtubenumber];
+  for(Int_t i=0; i<fgkendladdercoolingtubenumber; i++)
+    endladdervirtualcoolingtubeshape[i] = new TGeoTube(endladdercoolingtubeshape[i][1]->GetRmin(),
+                                                      endladdercoolingtubeshape[i][0]->GetRmax(),
+                                                      endladdercoolingtubeshape[i][0]->GetDz());
+  fendladdercoolingtube[0] = new TGeoVolume("EndLadderCoolingTube1",
+                                           endladdervirtualcoolingtubeshape[0],
+                                           fSSDAir);
+  fendladdercoolingtube[1] = new TGeoVolume("EndLadderCoolingTube2",
+                                           endladdervirtualcoolingtubeshape[1],
+                                           fSSDAir);
+  fendladdercoolingtube[0]->AddNode(endladdercoolingtube[0][0],1);
+  fendladdercoolingtube[0]->AddNode(endladdercoolingtube[0][1],1);
+  fendladdercoolingtube[1]->AddNode(endladdercoolingtube[1][0],1);
+  fendladdercoolingtube[1]->AddNode(endladdercoolingtube[1][1],1);  
+}
+///////////////////////////////////////////////////////////////////////////////
+TGeoVolume* AliITSv11GeometrySSD::GetSSDCoolingBlock(Int_t nedges){
+  /////////////////////////////////////////////////////////////
+  // Method generating SSD Cooling Block    
+  /////////////////////////////////////////////////////////////
+  const Int_t kvertexnumber = 8;
+  ///////////////////////////////////////
+  // Vertex Positioning for TGeoXTru
+  ///////////////////////////////////////
+  TVector3** vertexposition = new TVector3*[2*kvertexnumber+nedges+1];
+  vertexposition[0] = new TVector3(0.0,0.0, 0.);
+  vertexposition[1] = new TVector3(0.0,fgkSSDCoolingBlockHeight[1],0);
+  vertexposition[2] = new TVector3(fgkSSDCoolingBlockHoleLength[1],
+                                  vertexposition[1]->Y(),0);
+  vertexposition[3] = new TVector3(vertexposition[2]->X(),
+                                  vertexposition[2]->Y()+fgkSSDCoolingBlockHeight[2],0);
+  vertexposition[4] = new TVector3(vertexposition[1]->X(),vertexposition[3]->Y(),0);
+  vertexposition[5] = new TVector3(vertexposition[4]->X(),
+                                  + vertexposition[3]->Y()+fgkSSDCoolingBlockHoleRadius[1],0);
+  vertexposition[6] = new TVector3(Xfrom2Points(vertexposition[5]->X(),
+                                         vertexposition[5]->Y(),0.5*(fgkSSDCoolingBlockLength
+                                       - fgkSSDCoolingBlockHoleLength[0]
+                                       - 4.*fgkSSDCoolingBlockHoleRadius[1]),
+                                         fgkSSDCoolingBlockHeight[0]
+                                       - fgkSSDCoolingBlockHoleRadius[1],
+                                               fgkSSDCoolingBlockHeight[0]),fgkSSDCoolingBlockHeight[0], 0);
+  vertexposition[7] = new TVector3(0.5*(fgkSSDCoolingBlockLength
+                                       - fgkSSDCoolingBlockHoleLength[0]),
+                                  vertexposition[6]->Y(), 0);
+  Double_t alpha = TMath::ACos(0.5*fgkSSDCoolingBlockHoleLength[0]
+                          / fgkSSDCoolingBlockHoleRadius[0])*TMath::RadToDeg();
+  Double_t phi = 180.-alpha;
+  Double_t psi = 180.+2.*alpha;
+  Double_t deltapsi = psi/nedges;
+  Double_t radius = fgkSSDCoolingBlockHoleRadius[0]/CosD(0.5*deltapsi);
+  TVector3* transvector = new TVector3(0.5*fgkSSDCoolingBlockLength,
+                                      fgkSSDCoolingBlockHoleCenter, 0);
+  for(Int_t i=0; i<nedges+1; i++){
+       vertexposition[kvertexnumber+i] = new TVector3(radius*CosD(phi+i*deltapsi),
+                                                  radius*SinD(phi+i*deltapsi),
+                                                  0);
+   *vertexposition[kvertexnumber+i] += (*transvector);
+  }
+  Double_t param[4] = {1.0,0.0,0.0,-0.5*fgkSSDCoolingBlockLength};  
+  for(Int_t i=0; i<kvertexnumber; i++)
+    vertexposition[kvertexnumber+nedges+1+i] = 
+                                               GetReflection(vertexposition[kvertexnumber-1-i],param);
+  ///////////////////////////////////////////////////////////////////////
+  // TGeoXTru Volume definition for Cooling Tube Support Arc Part
+  ///////////////////////////////////////////////////////////////////////
+  TGeoXtru* ssdcoolingblockshape = new TGeoXtru(2);    
+  Double_t* xvertexpoints = new Double_t[2*kvertexnumber+nedges+1]; 
+  Double_t* yvertexpoints = new Double_t[2*kvertexnumber+nedges+1];
+  for(Int_t i=0; i<2*kvertexnumber+nedges+1; i++){
+       xvertexpoints[i] = vertexposition[i]->X();
+       yvertexpoints[i] = vertexposition[i]->Y();
+  } 
+  ssdcoolingblockshape->DefinePolygon(2*kvertexnumber+nedges+1,xvertexpoints,
+                                                                                       yvertexpoints);
+  ssdcoolingblockshape->DefineSection(0,-0.5*fgkSSDCoolingBlockWidth);
+  ssdcoolingblockshape->DefineSection(1,0.5*fgkSSDCoolingBlockWidth);
+  TGeoVolume* ssdcoolingblock = new TGeoVolume("SSDCoolingBlock",
+                                                                         ssdcoolingblockshape,
+                                                                                 fSSDAlCoolBlockMedium);
+  ssdcoolingblock->SetLineColor(fColorAl);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete [] vertexposition;
+  delete [] xvertexpoints;
+  delete [] yvertexpoints;
+  /////////////////////////////////////////////////////////////
+  return ssdcoolingblock;
+}
+/////////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::GetSSDChipCables(TGeoVolume *&cableL, TGeoVolume *&cableR, Double_t SSDChipCablesHeight, Int_t nedges){
+  ///////////////////////////////////////////////////////
+  static const Int_t kssdchipcablesnumber    = 2;  // Number of cables: left and right
+  static const Int_t kssdchipcableslaynumber = 2;  // Number of layers: Al and Kapton
+  static const Int_t kvertexnumber                       = 4*(nedges+1)+4;
+  Int_t ssdchipcablescolor[kssdchipcableslaynumber] = {fColorAl,fColorPolyhamide};
+  Double_t ssdchipcablesradius[kssdchipcableslaynumber];
+  ssdchipcablesradius[0] = 0.25*(SSDChipCablesHeight
+                                                -  fgkSSDChipCablesHeight[0]
+                                                -  fgkSSDChipCablesHeight[1]);
+  ssdchipcablesradius[1] = ssdchipcablesradius[0]-fgkSSDChipCablesHeight[0];
+  Double_t ssdchipcablespiecelength[kssdchipcablesnumber];
+  ssdchipcablespiecelength[0] = 0.5*(fgkSSDChipCablesWidth[0]
+                                                         - 2.*TMath::Pi()*ssdchipcablesradius[0]
+                                                         - ssdchipcablesradius[0]
+                                                         - fgkSSDChipCablesWidth[1]
+                                                         - fgkSSDChipCablesWidth[2]);
+  ssdchipcablespiecelength[1] = ssdchipcablespiecelength[0]
+                                                         - 0.5*(fgkSSDModuleStiffenerPosition[1]                                                         
+                                                         +      fgkSSDChipCablesHeight[1]
+                                                         +      fgkSSDSensorHeight);
+  ///////////////////////////////////////////////////////
+  // Vertex Positioning for TGeoXTrue Layer 1 and Layer 2
+  ///////////////////////////////////////////////////////
+  TVector3** vertexposition[kssdchipcableslaynumber];
+  for(Int_t i=0; i<kssdchipcableslaynumber; i++) vertexposition[i] = 
+                                                                                                 new TVector3*[4*(nedges+1)+4];
+  Double_t ratio[4];
+  ratio[0] = ssdchipcablesradius[1]/ssdchipcablesradius[0]; 
+  ratio[1] = (ssdchipcablesradius[1]-fgkSSDChipCablesHeight[1])
+                  /  ssdchipcablesradius[0]; 
+  ratio[2] = (ssdchipcablesradius[0]+fgkSSDChipCablesHeight[0])
+                  /  ssdchipcablesradius[0];
+  ratio[3] = (ssdchipcablesradius[0]+fgkSSDChipCablesHeight[0]
+                  +  fgkSSDChipCablesHeight[1])
+                  /  ssdchipcablesradius[0];
+  Double_t phi = 180.;
+  Double_t deltaphi = 180./nedges;
+  Double_t angle = 0.0;
+
+  Double_t xvertexpoints[kssdchipcableslaynumber][kvertexnumber];
+  Double_t yvertexpoints[kssdchipcableslaynumber][kvertexnumber];
+
+  TVector3* vertex = new TVector3();
+  TVector3* transvector[kssdchipcableslaynumber];
+  transvector[0] = new TVector3(fgkSSDChipWidth,
+                               SSDChipCablesHeight-ssdchipcablesradius[0], 0);
+  transvector[1] = new TVector3();
+  TGeoXtru* ssdchipcableshape[kssdchipcableslaynumber*kssdchipcablesnumber];
+  TGeoVolume* ssdchipcable[kssdchipcableslaynumber*kssdchipcablesnumber];
+  const char* ssdchipcablename[kssdchipcableslaynumber*kssdchipcablesnumber] = 
+               {"SSDChipcableAllay1Left","SSDChipcableKaptonlay2Left",
+                "SSDChipcableAllay1Right","SSDChipcableKaptonlay2Right"};
+  for(Int_t k=0; k<kssdchipcablesnumber; k++){
+       transvector[1]->SetX(fgkSSDChipWidth-ssdchipcablespiecelength[k]);
+       transvector[1]->SetY(ssdchipcablesradius[0]
+                                +               fgkSSDChipCablesHeight[0]
+                                +               fgkSSDChipCablesHeight[1]);  
+       for(Int_t i=0; i<kssdchipcableslaynumber; i++){
+               vertexposition[i][0] = new TVector3(0.,SSDChipCablesHeight
+                                             - fgkSSDChipCablesHeight[0]-i*fgkSSDChipCablesHeight[1], 0);
+               vertexposition[i][1] = new TVector3(0.,SSDChipCablesHeight
+                                                   - i*fgkSSDChipCablesHeight[0], 0);
+               vertexposition[i][2*(nedges+1)+2] = 
+                                       new TVector3(fgkSSDChipWidth+ssdchipcablesradius[0]
+                               +                                fgkSSDChipCablesWidth[1]
+                               +                                fgkSSDChipCablesWidth[2],
+                                                               ((1.-i)*fgkSSDChipCablesHeight[i]
+                               + fgkSSDChipCablesHeight[1]), 0);
+        vertexposition[i][2*(nedges+1)+3] = 
+                                       new TVector3(vertexposition[i][2*(nedges+1)+2]->X(),
+                                                                vertexposition[i][2*(nedges+1)+2]->Y()
+                      - fgkSSDChipCablesHeight[i], 0);
+           for(Int_t j=0; j<nedges+1; j++){            
+                   angle = 0.5*phi+TMath::Power(-1,i+1)*j*deltaphi;
+                       vertex->SetX(ssdchipcablesradius[0]*CosD(angle));
+                       vertex->SetY(ssdchipcablesradius[0]*SinD(angle));
+                       vertexposition[0][(nedges+1)*i+j+2] = 
+                                               new TVector3(*vertex+*transvector[i]);
+                       vertexposition[1][(nedges+1)*i+j+2] = 
+                                               new TVector3(vertex->X()*ratio[2*i]+transvector[i]->X(),
+                                      vertex->Y()*ratio[2*i]+transvector[i]->Y(), 0);
+                       vertexposition[0][(4-i)*(nedges+1)+4-j-1] = 
+                                               new TVector3(*vertexposition[1][(nedges+1)*i+j+2]);
+                       vertexposition[1][(4-i)*(nedges+1)+4-j-1] = 
+                                               new TVector3(vertex->X()*ratio[2*i+1]
+                                                       +                        transvector[i]->X(),
+                                                                                vertex->Y()*ratio[2*i+1]
+                                      + transvector[i]->Y(), 0);
+               }
+       }
+       for(Int_t i=0; i<kssdchipcableslaynumber; i++){
+               for(Int_t j=0; j<kvertexnumber; j++){   
+                       xvertexpoints[i][j] = vertexposition[i][j]->X();
+                       yvertexpoints[i][j] = vertexposition[i][j]->Y();
+               }
+               ssdchipcableshape[kssdchipcablesnumber*k+i] = new TGeoXtru(2);
+               ssdchipcableshape[kssdchipcablesnumber*k+i]->DefinePolygon(kvertexnumber,
+                                                                               xvertexpoints[i],yvertexpoints[i]);
+               ssdchipcableshape[kssdchipcablesnumber*k+i]->DefineSection(0,-0.5*fgkSSDChipCablesLength[1]);
+               ssdchipcableshape[kssdchipcablesnumber*k+i]->DefineSection(1,+0.5*fgkSSDChipCablesLength[1]);
+               ssdchipcable[kssdchipcablesnumber*k+i] = 
+                               new TGeoVolume(ssdchipcablename[kssdchipcablesnumber*k+i],
+                                                          ssdchipcableshape[kssdchipcablesnumber*k+i],
+                                                         (kssdchipcablesnumber*k+i)%2==0?
+                                                          fSSDAlTraceChipCableMedium:fSSDKaptonChipCableMedium);
+               ssdchipcable[kssdchipcablesnumber*k+i]->SetLineColor(ssdchipcablescolor[i]);
+       }
+       for(Int_t i=0; i<kssdchipcableslaynumber; i++)
+               for(Int_t j=0; j<kvertexnumber; j++) delete vertexposition[i][j];
+  }
+  /////////////////////////////////////////////////////////////
+  // Mother Volume definition 
+  /////////////////////////////////////////////////////////////
+  static const Int_t kmothervertexnumber = 8;
+  Double_t xmothervertex[kmothervertexnumber];
+  Double_t ymothervertex[kmothervertexnumber];
+  xmothervertex[0] = xvertexpoints[0][1];
+  ymothervertex[0] = yvertexpoints[0][1];
+  xmothervertex[1] = xvertexpoints[0][2+nedges/2];
+  ymothervertex[1] = yvertexpoints[0][1];
+  xmothervertex[2] = xvertexpoints[0][2+nedges/2];
+  ymothervertex[2] = yvertexpoints[0][2+nedges];
+  xmothervertex[3] = xvertexpoints[0][3+nedges];
+  ymothervertex[3] = yvertexpoints[0][3+nedges];
+  xmothervertex[4] = xvertexpoints[0][3+2*nedges];
+  ymothervertex[4] = yvertexpoints[0][3+2*nedges]+fgkSSDTolerance;
+  xmothervertex[5] = xvertexpoints[0][4+2*nedges];
+  ymothervertex[5] = yvertexpoints[0][4+2*nedges]+fgkSSDTolerance;
+  xmothervertex[6] = xvertexpoints[1][5+2*nedges];
+  ymothervertex[6] = yvertexpoints[1][5+2*nedges];
+  xmothervertex[7] = xvertexpoints[0][1];
+  ymothervertex[7] = yvertexpoints[1][5+2*nedges];
+  TGeoXtru *ssdchipcablemothershape = new TGeoXtru(2);
+  ssdchipcablemothershape->DefinePolygon(kmothervertexnumber,xmothervertex,ymothervertex);
+  ssdchipcablemothershape->DefineSection(0,-0.5*fgkSSDChipCablesLength[1]);
+  ssdchipcablemothershape->DefineSection(1,+0.5*fgkSSDChipCablesLength[1]);
+
+  cableL = new TGeoVolume("SSDChipCableMotherLeft",ssdchipcablemothershape,fSSDAir);
+  cableR = new TGeoVolume("SSDChipCableMotherRight",ssdchipcablemothershape,fSSDAir);
+
+  cableL->AddNode(ssdchipcable[0],1);
+  cableL->AddNode(ssdchipcable[1],1);
+  cableR->AddNode(ssdchipcable[2],1);
+  cableR->AddNode(ssdchipcable[3],1);  
+
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<kssdchipcableslaynumber; i++) delete [] vertexposition[i];
+  for(Int_t i=0; i<kssdchipcableslaynumber; i++) delete transvector[i];
+  delete vertex; 
+  /////////////////////////////////////////////////////////////
+}
+//_____________________________________________________________________________
+TGeoVolume* AliITSv11GeometrySSD::GetSSDChip() const{
+  /////////////////////////////////////////////////////////////
+  // SSD Chip Assembly Generation    
+  /////////////////////////////////////////////////////////////
+  TGeoBBox* ssdchipcompshape[2];
+  ssdchipcompshape[0] =  new TGeoBBox("SSDChipCompShape",
+                                                                               0.5*fgkSSDChipLength,
+                                                                               0.5*fgkSSDChipWidth,
+                                                                               0.5*(fgkSSDChipHeight-fgkSSDChipGlueHeight));
+  ssdchipcompshape[1] =  new TGeoBBox("SSDChipGlueCompShape",
+                                                                               0.5*fgkSSDChipLength,
+                                                                               0.5*fgkSSDChipWidth,
+                                                                               0.5*fgkSSDChipGlueHeight);
+  TGeoVolume* ssdchipcomp[2];
+  ssdchipcomp[0] = new TGeoVolume("SSDChipComp",ssdchipcompshape[0],fSSDChipMedium);
+  ssdchipcomp[1] = new TGeoVolume("SSDChipGlueComp",ssdchipcompshape[1],
+                                                                 fSSDChipGlueMedium);
+  ssdchipcomp[0]->SetLineColor(fColorSilicon);  
+  ssdchipcomp[1]->SetLineColor(fColorEpoxy);
+  TGeoTranslation* ssdchipcomptrans[2];
+  ssdchipcomptrans[0] = new TGeoTranslation(0.,0.,-ssdchipcompshape[1]->GetDZ());
+  ssdchipcomptrans[1] = new TGeoTranslation(0.,0.,ssdchipcompshape[0]->GetDZ());
+  /////////////////////////////////////////////////////////////
+  // Virtual Volume containing SSDChip   
+  /////////////////////////////////////////////////////////////
+  TGeoBBox* ssdvirtualchipshape = new TGeoBBox("SSDChipShape",0.5*fgkSSDChipLength,
+                                                                                                                0.5*fgkSSDChipWidth,
+                                                                                                                0.5*fgkSSDChipHeight);
+  TGeoVolume* ssdchip = new TGeoVolume("SSDChip",ssdvirtualchipshape,fSSDAir);
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<2; i++) ssdchip->AddNode(ssdchipcomp[i],1,ssdchipcomptrans[i]);
+  return ssdchip;
+}
+/////////////////////////////////////////////////////////////////////////////////
+TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelength){
+  /////////////////////////////////////////////////////////////
+  // Method returning a List containing pointers to Ladder Cable Volumes    
+  //
+  // Return list contains 3 assemblies: cable box, cable arb shape and the end part of the cable
+  //                                    each contains 2 volumes, one for polyamide and one for aluminium
+  /////////////////////////////////////////////////////////////
+  const Int_t kladdercablesegmentnumber = 2;
+  /////////////////////////////////////////
+  // LadderSegmentBBox Volume
   /////////////////////////////////////////
-  TGeoBBox* laddercablesegmentbboxshape[kladdercablesegmentnumber];
+  static TGeoBBox* laddercablesegmentbboxshape[kladdercablesegmentnumber] = {0,0};
   const char* laddercablesegmentbboxshapename[kladdercablesegmentnumber] = 
                                {"LadderCableSegmentBBoxShape1","LadderCableSegmentBBoxShape2"};
+
+
+  const char* laddercablesegmentbboxname[kladdercablesegmentnumber] = 
+                                                 {"LadderCableSegmentBBox1","LadderCableSegmentBBox2"};
+  static TGeoVolume* laddercablesegmentbbox[kladdercablesegmentnumber];
+
+  static TGeoTranslation* laddercablesegmentbboxtrans[kladdercablesegmentnumber] = {
+                                                  new TGeoTranslation("LadderCableSegmentBBoxTrans1",
+                                                                                          0.5*fgkSSDFlexWidth[0],
+                                                                                          0.5*fgkSSDLadderCableWidth,
+                                                                      0.5*fgkSSDLadderCableHeight[0]),
+                                                  new TGeoTranslation("LadderCableSegmentBBoxTrans2",
+                                                                                          0.5*fgkSSDFlexWidth[0],
+                                                                                          0.5*fgkSSDLadderCableWidth,
+                                                                                          fgkSSDLadderCableHeight[0]
+                                                                                          +0.5*fgkSSDLadderCableHeight[1])
+                                                                                   };
+  static TGeoVolume* laddercablesegmentbboxassembly =                                             new TGeoVolumeAssembly("LadderCableSegmentBBoxAssembly") ;
+  static TGeoVolume* laddercablesegmentarbassembly = 
+                                                  new TGeoVolumeAssembly("LadderCableSegmentArbAssembly"); 
+
+  static TGeoArb8* laddercablesegmentarbshape[kladdercablesegmentnumber];
+  static TGeoVolume* laddercablesegmentarb[kladdercablesegmentnumber];
+
+  if (laddercablesegmentbboxshape[0] == 0) { 
+    // Initialise static shapes and volumes 
   for(Int_t i=0; i<kladdercablesegmentnumber; i++) laddercablesegmentbboxshape[i] = 
                                                  new TGeoBBox(laddercablesegmentbboxshapename[i],
                                                                           0.5*fgkSSDFlexWidth[0],
                                                                           0.5*fgkSSDLadderCableWidth,
-                                                                          0.5*fgkSSDFlexHeight[i]); 
-  const char* laddercablesegmentbboxname[kladdercablesegmentnumber] = 
-                                                 {"LadderCableSegmentBBox1","LadderCableSegmentBBox2"};
-  TGeoVolume* laddercablesegmentbbox[kladdercablesegmentnumber];
+                                                                          0.5*fgkSSDLadderCableHeight[i]); 
+
   for(Int_t i=0; i<kladdercablesegmentnumber; i++){ 
                        laddercablesegmentbbox[i] =
                                                  new TGeoVolume(laddercablesegmentbboxname[i],
@@ -2305,20 +3548,7 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
                        laddercablesegmentbbox[i]->SetLineColor(i==0 ? fColorAl : 
                                                                                                                   fColorPolyhamide);
   }
-  TGeoTranslation* laddercablesegmentbboxtrans[kladdercablesegmentnumber];                                                                               
-  laddercablesegmentbboxtrans[0] = 
-                                                  new TGeoTranslation("LadderCableSegmentBBoxTrans1",
-                                                                                          0.5*fgkSSDFlexWidth[0],
-                                                                                          0.5*fgkSSDLadderCableWidth,
-                                                                                          0.5*fgkSSDFlexHeight[0]);
-  laddercablesegmentbboxtrans[1] = 
-                                                  new TGeoTranslation("LadderCableSegmentBBoxTrans2",
-                                                                                          0.5*fgkSSDFlexWidth[0],
-                                                                                          0.5*fgkSSDLadderCableWidth,
-                                                                                          fgkSSDFlexHeight[0]
-                                                                                          +0.5*fgkSSDFlexHeight[1]);
-  TGeoVolume* laddercablesegmentbboxassembly = 
-                                                  new TGeoVolumeAssembly("LadderCableSegmentBBoxAssembly"); 
+  
   for(Int_t i=0; i<kladdercablesegmentnumber; i++)  
                laddercablesegmentbboxassembly->AddNode(laddercablesegmentbbox[i],1,
                                                                                            laddercablesegmentbboxtrans[i]);
@@ -2331,21 +3561,21 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
                                                                                                  new TVector3*[kvertexnumber];
 //Shape Vertex Positioning
   for(Int_t i=0; i<kladdercablesegmentnumber; i++){
-       laddercablesegmentvertexposition[i][0] = new TVector3(0.,i*fgkSSDFlexHeight[0]);
+    laddercablesegmentvertexposition[i][0] = new TVector3(0.,i*fgkSSDFlexHeight[0], 0);
        laddercablesegmentvertexposition[i][1] = new TVector3(fgkSSDLadderCableWidth,
-                                                                                                                 i*fgkSSDFlexHeight[0]);
+                                                             i*fgkSSDFlexHeight[0], 0);
        laddercablesegmentvertexposition[i][2] = new TVector3(0.,fgkSSDFlexHeight[0]
                                                                                   +                         fgkSSDFlexHeight[1]
-                                                                                  +                      i*fgkSSDFlexHeight[0]);
+                                                             + i*fgkSSDFlexHeight[0], 0);
        laddercablesegmentvertexposition[i][3] = 
                                                   new TVector3(laddercablesegmentvertexposition[i][1]->X(),
-                                                                               laddercablesegmentvertexposition[i][2]->Y());
+                                                               laddercablesegmentvertexposition[i][2]->Y(), 0);
   }
   Double_t laddercablesegmentwidth[2][2] = {{fgkSSDFlexHeight[0],fgkSSDFlexHeight[0]},
                                                                            {fgkSSDFlexHeight[1],fgkSSDFlexHeight[1]}}; 
-  char* laddercablesegmentarbshapename[kladdercablesegmentnumber] = 
+  const char* laddercablesegmentarbshapename[kladdercablesegmentnumber] = 
                                        {"LadderCableSegmentArbShape1","LadderCableSegmentArbShape2"};
-  TGeoArb8* laddercablesegmentarbshape[kladdercablesegmentnumber];
+
   for(Int_t i = 0; i< kladdercablesegmentnumber; i++) laddercablesegmentarbshape[i] = 
                                        GetArbShape(laddercablesegmentvertexposition[i],
                                                                laddercablesegmentwidth[i],
@@ -2353,7 +3583,7 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
                                                                laddercablesegmentarbshapename[i]);
   const char* laddercablesegmentarbname[kladdercablesegmentnumber] = 
                                                  {"LadderCableSegmentArb1","LadderCableSegmentArb2"};
-  TGeoVolume* laddercablesegmentarb[kladdercablesegmentnumber];
+
   for(Int_t i=0; i<kladdercablesegmentnumber; i++){
                         laddercablesegmentarb[i] =
                                                   new TGeoVolume(laddercablesegmentarbname[i],
@@ -2374,13 +3604,13 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
                                                         + fgkSSDFlexWidth[0],0.,0.,
                                                   new TGeoRotation((*laddercablesegmentarbrot[1])
                                                     *(*laddercablesegmentarbrot[0])));
-  TGeoVolume* laddercablesegmentarbassembly = 
-                                                  new TGeoVolumeAssembly("LadderCableSegmentArbAssembly"); 
   for(Int_t i=0; i<kladdercablesegmentnumber; i++)
   laddercablesegmentarbassembly->AddNode(laddercablesegmentarb[i],1,
                                                                                   laddercablesegmentarbcombitrans);
+  }  // End of static initialisations
 /////////////////////////////////////////
 // End Ladder Cable Volume
+// Note: this part depends explicitly on the length passed as an argument to the function
 /////////////////////////////////////////
   TGeoBBox* ladderendcablesegmentbboxshape[kladdercablesegmentnumber];
   const char* ladderendcablesegmentbboxshapename[kladdercablesegmentnumber] = 
@@ -2389,7 +3619,7 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
                                                  new TGeoBBox(ladderendcablesegmentbboxshapename[i],
                                                                           0.5*ssdendladdercablelength,
                                                                           0.5*fgkSSDLadderCableWidth,
-                                                                          0.5*fgkSSDFlexHeight[i]);
+                                                                          0.5*fgkSSDLadderCableHeight[i]);
   const char* ladderendcablesegmentbboxname[kladdercablesegmentnumber] = 
                                                  {"LadderEndCableSegmentBBox1","LadderEndCableSegmentBBox2"};
   TGeoVolume* ladderendcablesegmentbbox[kladdercablesegmentnumber];
@@ -2407,13 +3637,13 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
                                                   new TGeoTranslation("LadderEndCableSegmentBBoxTrans0",
                                                                                           0.5*ssdendladdercablelength,
                                                                                           0.5*fgkSSDLadderCableWidth,
-                                                                                          0.5*fgkSSDFlexHeight[0]);
+                                                                                          0.5*fgkSSDLadderCableHeight[0]);
   ladderendcablesegmentbboxtrans[1] = 
                                                   new TGeoTranslation("LadderEndCableSegmentBBoxTrans1",
                                                                                           0.5*ssdendladdercablelength,
                                                                                           0.5*fgkSSDLadderCableWidth,
-                                                                                          fgkSSDFlexHeight[0]
-                                                                                          +0.5*fgkSSDFlexHeight[1]);
+                                                                                          fgkSSDLadderCableHeight[0]
+                                                                                          +0.5*fgkSSDLadderCableHeight[1]);
   TGeoVolume* ladderendcablesegmentbboxassembly = 
                                                   new TGeoVolumeAssembly("LadderEndCableSegmentBBoxAssembly"); 
   for(Int_t i=0; i<kladdercablesegmentnumber; i++)  
@@ -2425,11 +3655,13 @@ TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t ssdendladdercablelen
   laddercablesegmentlist->Add(laddercablesegmentarbassembly);
   laddercablesegmentlist->Add(ladderendcablesegmentbboxassembly);
   return laddercablesegmentlist;
-  }
+}
+
 /////////////////////////////////////////////////////////////////////////////////
 TGeoVolume* AliITSv11GeometrySSD::GetLadderCable(Int_t n, Double_t ssdendladdercablelength){
   /////////////////////////////////////////////////////////////
-  // Method generating Ladder Cable Volumes Assemblies    
+  // Method generating Ladder Cable of given length (n modules + end)
+  // Called by GetLadderCableAssembly
   /////////////////////////////////////////////////////////////
   TList* laddercablesegmentlist = GetLadderCableSegment(ssdendladdercablelength);
   TGeoVolume* laddercable = new TGeoVolumeAssembly("LadderCable"); 
@@ -2437,43 +3669,48 @@ TGeoVolume* AliITSv11GeometrySSD::GetLadderCable(Int_t n, Double_t ssdendladderc
         TGeoTranslation* laddercabletrans = new TGeoTranslation(
                                                        i*(fgkCarbonFiberJunctionWidth),
                                                        fgkSSDLadderCableWidth-fgkSSDFlexWidth[0],
-                                                       i*(fgkSSDFlexHeight[0]+fgkSSDFlexHeight[1]));
+                                                       i*(fgkSSDLadderCableHeight[0]+fgkSSDLadderCableHeight[1]));
     laddercable->AddNode((TGeoVolume*)laddercablesegmentlist->At(0),i+1,laddercabletrans);  
-       if(i!=n-1) laddercable->AddNode((TGeoVolume*)laddercablesegmentlist->At(1),i+1,laddercabletrans);  
+    if(i!=n-1) laddercable->AddNode((TGeoVolume*)laddercablesegmentlist->At(1),i+1,laddercabletrans);  
   }
   TGeoTranslation* endladdercabletrans = new TGeoTranslation("EndLadderCableTrans",
                                          (n-1)*fgkCarbonFiberJunctionWidth+fgkSSDFlexWidth[0],
-                                                                fgkSSDLadderCableWidth-fgkSSDFlexWidth[0],
-                                         (n-1)*(fgkSSDFlexHeight[0]+fgkSSDFlexHeight[1]));
+                                                            fgkSSDLadderCableWidth-fgkSSDFlexWidth[0],
+                                                            (n-1)*(fgkSSDLadderCableHeight[0]+fgkSSDLadderCableHeight[1]));
   laddercable->AddNode((TGeoVolume*)laddercablesegmentlist->At(2),1,endladdercabletrans);
   return laddercable;
 }
 /////////////////////////////////////////////////////////////////////////////////
 TGeoVolume* AliITSv11GeometrySSD::GetLadderCableAssembly(Int_t n, Double_t ssdendladdercablelength){
-  /////////////////////////////////////////////////////////////
-  // Method generating Ladder Cable Volumes Assembly   
-  /////////////////////////////////////////////////////////////
-  TGeoVolume* laddercableassembly = new TGeoVolumeAssembly("LadderCableAssembly");
-  char laddercabletransname[30];
+  ///////////////////////////////////////////////////////////////////
+  // Main method generating Ladder Cable bundles containing n cables
+  ///////////////////////////////////////////////////////////////////
+  Double_t totalLength = ssdendladdercablelength+(n-1)*fgkCarbonFiberJunctionWidth+fgkSSDFlexWidth[0];
+  Double_t cableOrig[3] = {0.5*totalLength,1.5*fgkSSDLadderCableWidth-fgkSSDFlexWidth[0],0.5*n*(fgkSSDLadderCableHeight[0]+fgkSSDLadderCableHeight[1])};
+  TGeoBBox *laddercableshape = new TGeoBBox(0.5*totalLength,0.5*fgkSSDLadderCableWidth,0.5*n*(fgkSSDLadderCableHeight[0]+fgkSSDLadderCableHeight[1]),cableOrig);
+  TGeoVolume* laddercable = new TGeoVolume("LadderCableMother", laddercableshape, fSSDAir);
+  char laddercabletransname[100];
   for(Int_t i=0; i<n; i++){ 
-       sprintf(laddercabletransname,"LadderCableTrans%i",i+1);
-    laddercableassembly->AddNode(GetLadderCable(n-i,ssdendladdercablelength),i+1,
-       new TGeoTranslation(laddercabletransname,i*fgkCarbonFiberJunctionWidth,0.,0.));
+    snprintf(laddercabletransname,100,"LadderCableTrans%i",i+1);
+    laddercable->AddNode(GetLadderCable(n-i,ssdendladdercablelength),i+1,
+                        new TGeoTranslation(laddercabletransname,i*fgkCarbonFiberJunctionWidth,0,0));
   }
-  return laddercableassembly;
+  return laddercable;
 }
 /////////////////////////////////////////////////////////////////////////////////
 TList* AliITSv11GeometrySSD::GetLadderCableAssemblyList(Int_t n, Double_t ssdendladdercablelength){
   /////////////////////////////////////////////////////////////
   // Method generating Ladder Cable List Assemblies  
+  // containing two cables bundles, i.e. P+N readout for one endcap
   /////////////////////////////////////////////////////////////  
-  const Int_t kladdercableassemblynumber = 2;
+  const Int_t kladdercableassemblynumber = 2; 
   TGeoVolume* laddercableassembly = GetLadderCableAssembly(n,ssdendladdercablelength);
   TGeoVolume* ladderCable[kladdercableassemblynumber];
-  char laddercableassemblyname[30];
+  char laddercableassemblyname[100];
   TList* laddercableassemblylist = new TList();
   for(Int_t i=0; i<kladdercableassemblynumber; i++){ 
-       sprintf(laddercableassemblyname,"LadderCableAssembly%i",i+1);
+    snprintf(laddercableassemblyname,100,"LadderCableAssembly%i",i+1);
        ladderCable[i] = new TGeoVolumeAssembly(laddercableassemblyname);
        ladderCable[i]->AddNode(laddercableassembly,i+1,i==0 ? NULL :
                                         new TGeoCombiTrans((n-1)
@@ -2484,778 +3721,409 @@ TList* AliITSv11GeometrySSD::GetLadderCableAssemblyList(Int_t n, Double_t ssdend
 }
   return laddercableassemblylist;
 }
-/////////////////////////////////////////////////////////////////////////////////
-TList* AliITSv11GeometrySSD::GetEndLadderCarbonFiberJunctionAssembly(){
+///////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::SetLadderSegment(){
   /////////////////////////////////////////////////////////////
-  // Method generating the End Ladder Carbon Fiber Junction Assembly   
-  /////////////////////////////////////////////////////////////  
-  const Int_t kendlabbercarbonfiberjunctionumber = 2;
-  TGeoVolume* endladdercarbonfiberjunctionassembly[kendlabbercarbonfiberjunctionumber];
-  endladdercarbonfiberjunctionassembly[0] = 
-                               new TGeoVolumeAssembly("EndLadderCarbonFiberJunctionAssembly1");
-  endladdercarbonfiberjunctionassembly[1] = 
-                               new TGeoVolumeAssembly("EndLadderCarbonFiberJunctionAssembly2");
-  TGeoVolume** endladdercarbonfiberjunction[kendlabbercarbonfiberjunctionumber];
-  for(Int_t i=0; i<kendlabbercarbonfiberjunctionumber; i++) 
-                                                  endladdercarbonfiberjunction[i] = new TGeoVolume*[2];
-  for(Int_t i=0; i<kendlabbercarbonfiberjunctionumber; i++){
-    endladdercarbonfiberjunction[i][0] = 
-                 GetCarbonFiberJunction(fgkEndLadderCarbonFiberLowerJunctionLength[i]);
-    endladdercarbonfiberjunction[i][1] = 
-                 GetCarbonFiberJunction(fgkEndLadderCarbonFiberUpperJunctionLength[i]);
-  }
-  TList* endladdercarbonfiberjunctionlist = new TList();
-  for(Int_t i=0; i<kendlabbercarbonfiberjunctionumber; i++){
-    SetEndLadderCarbonFiberJunctionCombiTransMatrix(i);
-    for(Int_t j=0; j<fgkCarbonFiberJunctionCombiTransNumber; j++)
-      endladdercarbonfiberjunctionassembly[i]->AddNode(j==2 ? 
-                                                endladdercarbonfiberjunction[i][1] : 
-                                                endladdercarbonfiberjunction[i][0],
-                                                j+1,fEndLadderCarbonFiberJunctionCombiTransMatrix[j]);
-    endladdercarbonfiberjunctionlist->Add(endladdercarbonfiberjunctionassembly[i]);
-  }
-  return endladdercarbonfiberjunctionlist;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberSupport(){
+  // Method Generating Ladder Segment Array
   /////////////////////////////////////////////////////////////
-  // Method generating the Carbon Fiber Support   
-  /////////////////////////////////////////////////////////////  
-  const Int_t kvertexnumber = 4;
-  const Int_t kshapesnumber = 2;
-  TVector3** vertexposition[kshapesnumber];
-  for(Int_t i=0; i<kshapesnumber; i++) vertexposition[i] = new TVector3*[kvertexnumber];
-  Double_t carbonfibersupportxaxisEdgeproj = 
-               fgkCarbonFiberSupportEdgeLength*TMath::Cos(fgkCarbonFiberJunctionAngle[0]
-       *       TMath::DegToRad());
-  Double_t theta = TMath::ATan(fgkCarbonFiberSupportYAxisLength
-                                /                         fgkCarbonFiberSupportXAxisLength);
-  /////////////////////
-  //Vertex Positioning
-  ////////////////////
-  vertexposition[0][0] = new TVector3();
-  vertexposition[0][1] = new TVector3(fgkCarbonFiberSupportXAxisLength,
-                                                                         fgkCarbonFiberSupportYAxisLength);
-  vertexposition[0][2] = new TVector3(carbonfibersupportxaxisEdgeproj,
-                                                                         carbonfibersupportxaxisEdgeproj
-                                          *                      TMath::Tan(theta));
-  vertexposition[0][3] = new TVector3(fgkCarbonFiberSupportXAxisLength
-                                          -                      carbonfibersupportxaxisEdgeproj,
-                                                                         fgkCarbonFiberSupportYAxisLength
-                                          -                      vertexposition[0][2]->Y());
-  ////////////////////////////////////////////////////
-  //Setting the parameters for Isometry Transformation
-  ////////////////////////////////////////////////////
-  Double_t symmetryplaneposition = (fgkCarbonFiberSupportYAxisLength
-                                                                +      fgkCarbonFiberSupportTopEdgeDist[0]
-                                                                +      fgkCarbonFiberSupportWidth);
-  Double_t* param = new Double_t[4]; 
-  param[0] = 0., param[1] = 1., param[2] = 0., param[3] = -symmetryplaneposition;
-  for(Int_t j=0; j<kvertexnumber; j++) vertexposition[1][j] = 
-                                 new TVector3((GetReflection(vertexposition[0][j],param))->X(),
-                                                         (GetReflection(vertexposition[0][j],param))->Y());
-  char* carbonfibersupportshapename[kshapesnumber] = 
-                                               {"CarbonFiberSupportShape1","CarbonFiberSupportShape2"};
-  TGeoArb8* carbonfibersupportshape[kshapesnumber]; 
-  Double_t width[2] = {fgkCarbonFiberSupportWidth,fgkCarbonFiberSupportWidth};
-  Double_t carbonfibersupportheight = 
-         carbonfibersupportxaxisEdgeproj*TMath::Tan(fgkCarbonFiberJunctionAngle[0]
-         *TMath::DegToRad());
-  for(Int_t i = 0; i< kshapesnumber; i++) carbonfibersupportshape[i] = 
-                                       GetArbShape(vertexposition[i],width,carbonfibersupportheight,
-                                                                       carbonfibersupportshapename[i],i==0 ? 1: -1);
-  /////////////////////////////////////
-  //Setting Translations and Rotations: 
-  /////////////////////////////////////
-  TGeoTranslation* carbonfibersupporttrans = 
-                                                 new TGeoTranslation("CarbonFiberSupportTrans",
-                                                                                         0.0,0.0,0.5*carbonfibersupportheight);
-  carbonfibersupporttrans->RegisterYourself();
-  TGeoRotation* carbonfibercompshaperot[2];
-  carbonfibercompshaperot[0] = new TGeoRotation("CarbonFiberCompShapeRot1",
-                                                                                         0.0,180.0,0.0);
-  carbonfibercompshaperot[1] = new TGeoRotation("CarbonFiberCompShapeRot2",
-                                                                                 90.,-fgkCarbonFiberTriangleAngle,-90.);
-  Double_t transvector[3] = {fgkCarbonFiberTriangleLength
-                                                 *  TMath::Cos(fgkCarbonFiberTriangleAngle
-                                                 *      TMath::DegToRad()),0.,-fgkCarbonFiberTriangleLength
-                                                 *      TMath::Sin(fgkCarbonFiberTriangleAngle
-                                                 *      TMath::DegToRad())};
-  TGeoCombiTrans* carbonfibersupportcombitrans = 
-                                                          new TGeoCombiTrans("CarbonFiberSupportCombiTrans",
-                                                          transvector[0],2.*symmetryplaneposition
-                                                 +        transvector[1],transvector[2],
-                                                          new TGeoRotation((*carbonfibercompshaperot[1])
-                                                 *        (*carbonfibercompshaperot[0])));
-  carbonfibersupportcombitrans->RegisterYourself();
-////////////////////////////////////////////////////////////////////////////////
-  TGeoCompositeShape* carbonfibersupportcompshape = 
-                                                       new TGeoCompositeShape("CarbonFiberSupportCompShape",
-                                                       "CarbonFiberSupportShape1:CarbonFiberSupportTrans+"
-                                                       "CarbonFiberSupportShape2:CarbonFiberSupportTrans");
-  TGeoVolume* carbonfibersupport = new TGeoVolume("CarbonFiberSupport",
-                                                  carbonfibersupportcompshape,fSSDCarbonFiberMedium);
-  carbonfibersupport->SetLineColor(fColorCarbonFiber);
-  TGeoVolume* carbonfibersupportassembly = 
-                                                   new TGeoVolumeAssembly("CarbonFiberSupportAssembly");
-  carbonfibersupportassembly->AddNode(carbonfibersupport,1);
-  carbonfibersupportassembly->AddNode(carbonfibersupport,2,
-                                                                         carbonfibersupportcombitrans);
-  return carbonfibersupportassembly;
+  fladdersegment[0] = new TGeoVolumeAssembly("LadderSegment1");        
+  fladdersegment[1] = new TGeoVolumeAssembly("LadderSegment2");        
+
+  /* MvL: tried to create mother volume. Requires changes in all rotations, bc xtru is always along z-axis
+  TGeoXtru *laddersegmentshape = new TGeoXtru(2);
+  static const Int_t ntrianglevtx = 3;
+  Double_t xtrianglevtx[ntrianglevtx]={-0.5*fgkCarbonFiberTriangleLength,fgkCarbonFiberTriangleLength, 0};
+  Double_t ytrianglevtx[ntrianglevtx]={0, 0, fgkCarbonFiberTriangleLength * TMath::Sin(fgkCarbonFiberTriangleAngle*TMath::DegToRad())};
+  laddersegmentshape->DefinePolygon(ntrianglevtx,xtrianglevtx,ytrianglevtx);
+  laddersegmentshape->DefineSection(0,0);
+  laddersegmentshape->DefineSection(1,fgkCarbonFiberJunctionWidth);  // MVL
+  fladdersegment[0] = new TGeoVolume("LadderSegment1",laddersegmentshape,fSSDAir);     
+  fladdersegment[1] = new TGeoVolume("LadderSegment2",laddersegmentshape,fSSDAir);     
+  */
+
+  if(!fCreateMaterials) CreateMaterials();
+  if(!fTransformationMatrices) CreateTransformationMatrices();
+  if(!fBasicObjects) CreateBasicObjects();
+  for(Int_t i=0; i<fgkladdersegmentnumber; i++){
+  // Placing Carbon Fiber Support      
+       for(Int_t j=0; j<fgkcarbonfibersupportnumber; j++){ 
+               fladdersegment[i]->AddNode(fcarbonfibersupport[0],j+1,
+                                                                                       fcarbonfibersupportmatrix[j]);  
+               fladdersegment[i]->AddNode(fcarbonfibersupport[1],j+1,
+                                                                                       fcarbonfibersupportmatrix[j]);
+  }
+  // Placing Carbon Fiber Junction
+       for(Int_t j=0; j<fgkcarbonfiberjunctionumber; j++) {
+        fladdersegment[i]->AddNode(fcarbonfiberjunction,j+1,
+                                                                  fcarbonfiberjunctionmatrix[j]);
+  }
+  // Placing Carbon Fiber Lower Support
+    for(Int_t j=0; j<fgkcarbonfiberlowersupportnumber; j++) {
+               fladdersegment[i]->AddNode(fcarbonfiberlowersupport[j],j+1,
+                                                          fcarbonfiberlowersupportrans[j]);    
+    }
+  // Placing SSD Sensor Support
+    for(Int_t j=0; j<fgkssdsensorsupportnumber; j++) 
+        fladdersegment[i]->AddNode(j<2 ? fssdsensorsupport[0][i] :
+                                                                    fssdsensorsupport[1][i],
+                                                          j+1,fssdsensorsupportmatrix[j]);
+  // Placing SSD Cooling Tube Support 
+       for(Int_t j=0; j<fgkcoolingtubesupportnumber; j++)
+               fladdersegment[i]->AddNode(fcoolingtubesupport,j+1,
+                                                                  fcoolingtubesupportmatrix[j]);
+  // Placing SSD Cooling Tube  
+       fladdersegment[i]->AddNode(fcoolingtube,1,fcoolingtubematrix[0]);
+       fladdersegment[i]->AddNode(fcoolingtube,2,fcoolingtubematrix[1]);
+  // Placing SSD Hybrid
+    switch(i){
+       case 0: 
+               fladdersegment[i]->AddNode(fssdhybridcomponent[0],1,fhybridmatrix);
+               fladdersegment[i]->AddNode(fssdhybridcomponent[2],1,fhybridmatrix);
+               break;
+    case 1:
+               fladdersegment[i]->AddNode(fssdhybridcomponent[1],1,fhybridmatrix);
+               fladdersegment[i]->AddNode(fssdhybridcomponent[2],1,fhybridmatrix);
+               break;
+       }
+       // Placing Cooling Block System
+      fladdersegment[i]->AddNode(fssdcoolingblocksystem,1,fcoolingblocksystematrix);
+       // Placing SSD Flex
+      for(Int_t j=0; j<fgkflexnumber; j++){
+       fladdersegment[i]->AddNode(fssdstiffenerflex,j+1,fstiffenerflexmatrix[j]);
+       fladdersegment[i]->AddNode(fssdendflex,j+1,fendflexmatrix[j]);
+      }
+   }
 }
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberLowerSupport(Int_t ikind, Bool_t EndLadder){
+///////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::SetEndLadderSegment(){
   /////////////////////////////////////////////////////////////
-  // Method generating the Carbon Fiber Lower Support   
-  /////////////////////////////////////////////////////////////  
-  const Int_t kvertexnumber = 4;
-  const Int_t kshapesnumber = 2;
-  Double_t width[2] = {fgkCarbonFiberLowerSupportWidth,
-                                                               fgkCarbonFiberLowerSupportWidth};
-  TVector3** vertexposition[kshapesnumber];
-  for(Int_t i = 0; i<kshapesnumber; i++) vertexposition[i] = 
-                                                new TVector3*[kvertexnumber];
-  //First Shape Vertex Positioning
-  vertexposition[0][0] = new TVector3(fgkCarbonFiberLowerSupportLowerLenght);
-  vertexposition[0][1] = new TVector3(fgkCarbonFiberTriangleLength
-                                          -            fgkCarbonFiberLowerSupportLowerLenght);
-  vertexposition[0][2] = new TVector3();
-  vertexposition[0][3] = new TVector3(fgkCarbonFiberTriangleLength);
-  //Second Shape Vertex Positioning
-  Double_t theta = TMath::ATan((fgkCarbonFiberLowerSupportVolumePosition[1]
-                                -                              fgkCarbonFiberLowerSupportVolumePosition[0])
-                                /                              fgkCarbonFiberTriangleLength);
-  vertexposition[1][0] = new TVector3(vertexposition[0][0]->X(),
-                                                               vertexposition[0][0]->X()*TMath::Tan(theta)
-                                +                              fgkCarbonFiberLowerSupportVolumePosition[0]);
-  vertexposition[1][1] = new TVector3(vertexposition[0][1]->X(),
-                                                               vertexposition[0][1]->X()*TMath::Tan(theta)
-                                +                              fgkCarbonFiberLowerSupportVolumePosition[0]);
-  vertexposition[1][2] = new TVector3(0.,fgkCarbonFiberLowerSupportVolumePosition[0]);
-  vertexposition[1][3] = new TVector3(fgkCarbonFiberTriangleLength,
-                                                               fgkCarbonFiberLowerSupportVolumePosition[1]);
-  char* carbonfiberlowersupportname[kshapesnumber] = 
-                         {"CarbonFiberLowerSupportShape1","CarbonFiberLowerSupportShape2"};
-  TGeoArb8* carbonfiberlowersupportshape[kshapesnumber];
-  for(Int_t i = 0; i< kshapesnumber; i++) carbonfiberlowersupportshape[i] = 
-                                                               GetArbShape(vertexposition[i],width,
-                                                                                       fgkCarbonFiberLowerSupportHeight,
-                                                                                       carbonfiberlowersupportname[i]);
-  ///////////////////////////////////////////////////////
-  TGeoTranslation* carbonfiberlowersupporttrans[kshapesnumber];
-  carbonfiberlowersupporttrans[0] = 
-                                               new TGeoTranslation("CarbonFiberLowerSupportTrans1",
-                                               0.0,
-                                               vertexposition[1][3]->Y()+vertexposition[1][2]->Y(),
-                                               0.0);
-  carbonfiberlowersupporttrans[1] = 
-                                               new TGeoTranslation("CarbonFiberLowerSupportTrans2",
-                                               0.0,
-                               -               vertexposition[1][3]->Y()-vertexposition[1][2]->Y(),
-                                               0.0);
-  for(Int_t i = 0; i< kshapesnumber; i++) 
-                                               carbonfiberlowersupporttrans[i]->RegisterYourself(); 
-  ///////////////////////////////////////////////////////
-  TGeoCompositeShape* carbonfiberlowersupportcompshape; 
-  if(EndLadder==false)
-    carbonfiberlowersupportcompshape = 
-                               new TGeoCompositeShape("CarbonFiberLowerSupportCompShape",
-                               "CarbonFiberLowerSupportShape2+"
-                               "CarbonFiberLowerSupportShape1:CarbonFiberLowerSupportTrans1");
-  else
-    if(ikind==0)
-      carbonfiberlowersupportcompshape = 
-                                                 (TGeoCompositeShape*)carbonfiberlowersupportshape[0];
-    else
-      carbonfiberlowersupportcompshape = 
-       new TGeoCompositeShape("CarbonFiberLowerSupportCompShape",
-                                "CarbonFiberLowerSupportShape1+"
-                                "CarbonFiberLowerSupportShape1:CarbonFiberLowerSupportTrans1"); 
-  TGeoVolume* carbonfiberlowersupport = new TGeoVolume("CarbonFiberLowerSupport",
-                                         carbonfiberlowersupportcompshape,fSSDCarbonFiberMedium);
-  carbonfiberlowersupport->SetLineColor(fColorCarbonFiber);
-  return carbonfiberlowersupport;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberAssemblySupport(){
+  // Method Generating End Ladder
   /////////////////////////////////////////////////////////////
-  // Method generating the Carbon Fiber Assembly Support   
-  /////////////////////////////////////////////////////////////  
-  SetCarbonFiberAssemblyCombiTransMatrix();
-  TGeoVolume* carbonfiberassemblysupport = 
-                                               new TGeoVolumeAssembly("CarbonFiberAssembly");
-  TGeoVolume* carbonfiberassemblyvolumes[fgkCarbonFiberAssemblyCombiTransNumber];
-  carbonfiberassemblyvolumes[0] = GetCarbonFiberJunctionAssembly();
-  carbonfiberassemblyvolumes[1] = GetCarbonFiberSupport();
-  carbonfiberassemblyvolumes[2] = GetCarbonFiberLowerSupport();
-  for(Int_t i=0; i<fgkCarbonFiberAssemblyCombiTransNumber;i++) 
-    carbonfiberassemblysupport->AddNode(carbonfiberassemblyvolumes[i],1,
-                                               fCarbonFiberAssemblyCombiTransMatrix[i]);
-  return carbonfiberassemblysupport;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeSupport(){
+  // End Ladder Carbon Fiber Junction 
   /////////////////////////////////////////////////////////////
-  // Method generating the Cooling Tube Support
-  /////////////////////////////////////////////////////////////  
-  const Int_t kvertexnumber = 3;
-  Double_t phi = TMath::ASin(0.5*fgkCoolingTubeSupportHeight
-                          /                     fgkCoolingTubeSupportRmax)*TMath::RadToDeg();
-                                               new TGeoTubeSeg("CoolingTubeSegShape",0.0,
-                                                       fgkCoolingTubeSupportRmax,
-                                                       0.5*fgkCoolingTubeSupportWidth,phi,
-                                                       360-phi);
-                                               new TGeoTube("CoolingTubeHoleShape",0.0,
-                                                       fgkCoolingTubeSupportRmin,
-                                                       0.5*fgkCoolingTubeSupportWidth);
-  TVector3* vertexposition[kvertexnumber];
-  ///////////////////////////
-  //Shape Vertex Positioning
-  ///////////////////////////
-  vertexposition[0] = new TVector3();
-  vertexposition[1] = new TVector3(fgkCoolingTubeSupportRmax
-                                       *               TMath::Cos(phi*TMath::DegToRad()),
-                                                       fgkCoolingTubeSupportRmax
-                                       *               TMath::Sin(phi*TMath::DegToRad()));
-  vertexposition[2] = new TVector3(vertexposition[1]->X(),
-                                       -                          vertexposition[1]->Y());
-  GetTriangleShape(vertexposition,
-                                                                          fgkCoolingTubeSupportWidth,
-                                                                          "CoolingTubeTriangleShape");
-  Double_t* boxorigin = new Double_t[3];
-  Double_t boxlength = fgkCoolingTubeSupportLength-fgkCoolingTubeSupportRmax
-                                        - vertexposition[1]->X();
-  boxorigin[0] = vertexposition[1]->X()+0.5*boxlength, boxorigin[1] = boxorigin[2] = 0.;
-                                               new TGeoBBox("CoolingTubeBoxShape",0.5*boxlength,
-                                                       0.5*fgkCoolingTubeSupportHeight,
-                                                       0.5*fgkCoolingTubeSupportWidth,boxorigin);
-  TGeoCompositeShape* coolingtubesupportshape = 
-                                               new TGeoCompositeShape("CoolingTubeSupportShape",
-                                                "(CoolingTubeSegShape+CoolingTubeTriangleShape"
-                                                "+CoolingTubeBoxShape)-CoolingTubeHoleShape"); 
-  TGeoVolume* coolingtubesupport = new TGeoVolume("CoolingTubeSupport",
-                                                coolingtubesupportshape,fSSDTubeHolderMedium);
-  return coolingtubesupport;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeSupportAssembly(){
+  fendladdersegment[0] = new TGeoVolumeAssembly("EndLadder1");
+  fendladdersegment[1] = new TGeoVolumeAssembly("EndLadder2");
+  if(!fCreateMaterials) CreateMaterials();
+  if(!fTransformationMatrices) CreateTransformationMatrices();
+  if(!fBasicObjects) CreateBasicObjects();
+  for(Int_t i=0; i<fgkendlabbercarbonfiberjunctionumber; i++){
+       for(Int_t j=0; j<fgkendladdercarbonfiberjunctionmatrixnumber; j++)
+               fendladdersegment[i]->AddNode(j==2 ? 
+                                                       fendladdercarbonfiberjunction[i][1] : 
+                                                       fendladdercarbonfiberjunction[i][0],
+                                                       j+1,fendladdercarbonfiberjunctionmatrix[i][j]);
+  }
   /////////////////////////////////////////////////////////////
-  // Method generating the Cooling Tube Support Assembly
-  /////////////////////////////////////////////////////////////  
-  TGeoVolume* coolingtubesupportassembly = 
-                                                  new TGeoVolumeAssembly("CoolingTubeSupportAssembly");
-  TGeoVolume* coolingtubesupport = GetCoolingTubeSupport();
-  SetCoolingTubeSupportCombiTransMatrix();
-  for(Int_t i=0; i<fgkCoolingTubeSupportCombiTransNumber;i++) 
-    coolingtubesupportassembly->AddNode(coolingtubesupport,i+1,
-                                                                                fCoolingTubeSupportCombiTransMatrix[i]);
-  return coolingtubesupportassembly;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCoolingTube() const{
+  // End Ladder Carbon Fiber Support 
   /////////////////////////////////////////////////////////////
-  // Method generating the Cooling Tube 
-  /////////////////////////////////////////////////////////////  
-  TGeoVolume* coolingtubeassembly = new TGeoVolumeAssembly("CoolingTubeAssembly");
-  TGeoTube *coolingtubeshape = new TGeoTube("CoolingTubeShape", fgkCoolingTubeRmin, 
-                                               fgkCoolingTubeRmax, fgkCoolingTubeLength/2.0);
-  TGeoVolume* coolingtube = new TGeoVolume("CoolingTube",
-                                                coolingtubeshape,fSSDCoolingTubePhynox);
-  TGeoTube *coolingtubeinteriorshape = new TGeoTube("CoolingTubeInteriorShape", 
-                                               0, fgkCoolingTubeRmin, 
-                                               fgkCoolingTubeLength/2.0);
-  TGeoVolume *coolingtubeinterior = new TGeoVolume("CoolingTubeInterior",
-                                                  coolingtubeinteriorshape,fSSDCoolingTubeWater);
-  coolingtubeassembly->AddNode(coolingtube,1);
-  coolingtubeassembly->AddNode(coolingtubeinterior,2);
-  return coolingtubeassembly;
-}  
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeAssembly(){
+  for(Int_t i=0; i<fgkcarbonfibersupportnumber; i++)
+      for(Int_t j=0; j<fgkendladdercarbonfibermatrixnumber; j++){
+                 fendladdersegment[i]->AddNode(fcarbonfibersupport[0],j+1,
+                  fendladdercarbonfibermatrix[i][j]);  
+          fendladdersegment[i]->AddNode(fcarbonfibersupport[1],j+1,
+                  fendladdercarbonfibermatrix[i][j]);  
+      }
   /////////////////////////////////////////////////////////////
-  // Method generating the Cooling Tube Assembly
-  /////////////////////////////////////////////////////////////  
-  TGeoVolume* coolingtubeassembly =   new TGeoVolumeAssembly("CoolingTubeAssembly");
-  TGeoVolume* coolingtube = GetCoolingTube();
-  SetCoolingTubeCombiTransMatrix();
-  for(Int_t i=0; i<fgkCoolingTubeCombiTransNumber;i++) 
-    coolingtubeassembly->AddNode(coolingtube,i+1,fCoolingTubeTransMatrix[i]);
-  return coolingtubeassembly;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetLadderSegment(Int_t iChipCablesHeight){
+  // End Ladder Mounting Block
   /////////////////////////////////////////////////////////////
-  // Method generating the basic Ladder Segment element which will be replicated   
-  /////////////////////////////////////////////////////////////  
-  TGeoVolume*laddersegment = new TGeoVolumeAssembly("LadderSegment");
-  TGeoVolume* laddersegmentvolumes[fgkLadderSegmentCombiTransNumber];
-  laddersegmentvolumes[0] = GetCarbonFiberAssemblySupport();
-  laddersegmentvolumes[1] = GetSSDModule(iChipCablesHeight);
-  laddersegmentvolumes[2] = GetSSDSensorSupportAssembly(iChipCablesHeight);
-  laddersegmentvolumes[3] = GetCoolingTubeSupportAssembly();
-        laddersegmentvolumes[4] = GetCoolingTubeAssembly(); 
-  SetLadderSegmentCombiTransMatrix();
-  for(Int_t i=0; i<fgkLadderSegmentCombiTransNumber; i++) 
-   laddersegment->AddNode(laddersegmentvolumes[i],1,
-                                                        fLadderSegmentCombiTransMatrix[i]);
-  return laddersegment;
- }
-////////////////////////////////////////////////////////////////////////////////
-TList* AliITSv11GeometrySSD::GetEndLadderSegment(){
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++)
+       fendladdersegment[i]->AddNode(fendladdermountingblock,i+1,
+                                    fendladdermountingblockcombitrans[i]);
   /////////////////////////////////////////////////////////////
-  // Method generating the Terminal Ladder Segment  
-  /////////////////////////////////////////////////////////////  
-  const Int_t kendladdersegmentnumber = 2;
-  TList* endladdercarbonfiberjunctionlist = GetEndLadderCarbonFiberJunctionAssembly();
-  TGeoVolume* endladdersegment[kendladdersegmentnumber];
-  endladdersegment[0] = new TGeoVolumeAssembly("EndLadderSegment1");
-  endladdersegment[1] = new TGeoVolumeAssembly("EndLadderSegment2");
-  TGeoVolume** laddersegmentvolumes[kendladdersegmentnumber];
-  const Int_t kladdersegmentvolumenumber = 4;
-  for(Int_t i=0; i<kendladdersegmentnumber; i++) laddersegmentvolumes[i] = 
-                                               new TGeoVolume*[kladdersegmentvolumenumber];
-  laddersegmentvolumes[0][0] = (TGeoVolume*)endladdercarbonfiberjunctionlist->At(0);
-  laddersegmentvolumes[0][1] = GetCarbonFiberSupport();
-  laddersegmentvolumes[0][2] = GetSSDMountingBlock();
-  laddersegmentvolumes[0][3] = GetCarbonFiberLowerSupport(0,true);
-  laddersegmentvolumes[1][0] = (TGeoVolume*)endladdercarbonfiberjunctionlist->At(1);
-  laddersegmentvolumes[1][1] = laddersegmentvolumes[0][1];
-  laddersegmentvolumes[1][2] = laddersegmentvolumes[0][2];
-  laddersegmentvolumes[1][3] = GetCarbonFiberLowerSupport(1,true);
-  TList* endladdersegmentlist = new TList();
-  for(Int_t i=0; i<kendladdersegmentnumber; i++){
-    SetEndLadderSegmentCombiTransMatrix(i);
-    for(Int_t j=0; j<kladdersegmentvolumenumber; j++)
-      endladdersegment[i]->AddNode(laddersegmentvolumes[i][j],1,
-                                                                  fEndLadderSegmentCombiTransMatrix[j]);
-    endladdersegmentlist->Add(endladdersegment[i]);
-  }
-  return endladdersegmentlist;
-}
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetSSDMountingBlock(){
+  // End Ladder Mounting Block Clip
   /////////////////////////////////////////////////////////////
-  // Method generating the Mounting Block   
-  /////////////////////////////////////////////////////////////  
-  // Mounting Block Boxes Shapes
-  ///////////////////////////////////////
-  const Int_t kmountingblockboxnumber = 3;
-  TGeoBBox* mountingblockboxshape[kmountingblockboxnumber];
-  mountingblockboxshape[0] = new TGeoBBox("MountingBlockBoxShape0",
-                                                       0.25*(fgkSSDMountingBlockLength[0]
-                                               -       fgkSSDMountingBlockLength[1]),
-                                                       0.5*fgkSSDMountingBlockWidth,
-                                                       0.5*fgkSSDMountingBlockHeight[0]);
-  mountingblockboxshape[1] = new TGeoBBox("MountingBlockBoxShape1",
-                                                       0.25*(fgkSSDMountingBlockLength[1]
-                                               -       fgkSSDMountingBlockLength[2]),
-                                                       0.5*fgkSSDMountingBlockWidth,
-                                                       0.5*(fgkSSDMountingBlockHeight[1]
-                                               -       fgkSSDMountingBlockHeight[3]));
-  mountingblockboxshape[2] = new TGeoBBox("MountingBlockBoxShape2",
-                                                       0.5*fgkSSDMountingBlockLength[2],
-                                                       0.5*fgkSSDMountingBlockWidth,
-                                                       0.5*(fgkSSDMountingBlockHeight[2]
-                                               -       fgkSSDMountingBlockHeight[3]));
-  TGeoTranslation* mountingblockboxtrans[kmountingblockboxnumber+2];
-  mountingblockboxtrans[0] = new TGeoTranslation("MountingBlockBoxTrans0",0.,0.,0.);
-  mountingblockboxtrans[1] = new TGeoTranslation("MountingBlockBoxTrans1",
-                                                       mountingblockboxshape[0]->GetDX()
-                                               +       mountingblockboxshape[1]->GetDX(),
-                                                       0.0,
-                                                       mountingblockboxshape[1]->GetDZ()
-                                               -       mountingblockboxshape[0]->GetDZ()
-                                               +       fgkSSDMountingBlockHeight[3]);
-  mountingblockboxtrans[2] = new TGeoTranslation("MountingBlockBoxTrans2",
-                                                       mountingblockboxshape[0]->GetDX()
-                                               +       2.*mountingblockboxshape[1]->GetDX()
-                                               +       mountingblockboxshape[2]->GetDX(),
-                                                       0.0,
-                                                       mountingblockboxshape[2]->GetDZ()
-                                               -       mountingblockboxshape[0]->GetDZ()
-                                               +       fgkSSDMountingBlockHeight[3]);
-  mountingblockboxtrans[3] = new TGeoTranslation("MountingBlockBoxTrans3",
-                                                       mountingblockboxshape[0]->GetDX()
-                                               +       mountingblockboxshape[1]->GetDX()
-                                               +       2.*(mountingblockboxshape[1]->GetDX()
-                                               +       mountingblockboxshape[2]->GetDX()),
-                                                       0.0,
-                                                       mountingblockboxshape[1]->GetDZ()
-                                               -       mountingblockboxshape[0]->GetDZ()
-                                               +       fgkSSDMountingBlockHeight[3]);
-  mountingblockboxtrans[4] = new TGeoTranslation("MountingBlockBoxTrans4",
-                                                       2.*(mountingblockboxshape[0]->GetDX()
-                                               +       2.*mountingblockboxshape[1]->GetDX()
-                                               +   mountingblockboxshape[2]->GetDX()),
-                                                       0.0,
-                                                       0.0);
-  for(Int_t i=0; i<kmountingblockboxnumber+2; i++) 
-                                                                       mountingblockboxtrans[i]->RegisterYourself();
-  ///////////////////////////////////////
-  // Mounting Block Trapezoid Hole Shapes
-  ///////////////////////////////////////
-  const Int_t kholetrapezoidvertexnumber = 4;
-  TVector3* holetrapezoidvertex[kholetrapezoidvertexnumber];
-  holetrapezoidvertex[0] = new TVector3();
-  holetrapezoidvertex[1] = new TVector3(fgkSSDMountingBlockHoleTrapezoidHeight);
-  holetrapezoidvertex[2] = new TVector3(*holetrapezoidvertex[0]);
-  holetrapezoidvertex[3] = new TVector3(*holetrapezoidvertex[1]);
-  Double_t holetrapezoidwidth[2] = {fgkSSDMountingBlockHoleTrapezoidUpBasis
-                                               +       2.*mountingblockboxshape[1]->GetDX()
-                                               *       TMath::Tan(fgkSSDMountingBlockHoleTrapezoidAngle
-                                               *       TMath::DegToRad()),
-                                                       fgkSSDMountingBlockHoleTrapezoidUpBasis}; 
-  GetArbShape(holetrapezoidvertex,
-                                                       holetrapezoidwidth,
-                                                       2.*mountingblockboxshape[1]->GetDX(),
-                                                       "HoleTrapezoidShape");
-  TGeoRotation* holetrapezoidshaperot[2];
-  holetrapezoidshaperot[0] = new TGeoRotation("HoleTrapezoidShapeRot0",
-                                                       90.,-90.,-90.);
-  holetrapezoidshaperot[1] = new TGeoRotation("HoleTrapezoidShapeRot1",
-                                                       -180.,0.,0.);
-  TGeoCombiTrans* holetrapezoidshapecombitrans = 
-                                                       new TGeoCombiTrans("HoleTrapezoidShapeCombiTrans",
-                                                       mountingblockboxshape[0]->GetDX()
-                                               +       3.*mountingblockboxshape[1]->GetDX()
-                                               +       2.*mountingblockboxshape[2]->GetDX(),
-                                                       0.5*fgkSSDMountingBlockWidth,
-                                               -       fgkSSDMountingBlockHoleTrapezoidHeight
-                                               +       2.*mountingblockboxshape[1]->GetDZ()
-                                               -       mountingblockboxshape[0]->GetDZ()
-                                               +       fgkSSDMountingBlockHeight[3],
-                                                       new TGeoRotation((*holetrapezoidshaperot[1])
-                                               *       (*holetrapezoidshaperot[0])));
-  holetrapezoidshapecombitrans->RegisterYourself();
-  ///////////////////////////////////
-  // Mounting Block Screw Hole Shapes
-  ///////////////////////////////////
-  const Int_t kmountingblocktubenumber = 2;
-  TGeoTube* mountingblocktubeshape[kmountingblocktubenumber];
-  mountingblocktubeshape[0] = new TGeoTube("MountingBlockTubeShape0",0.0,
-                                                       fgkSSDMountingBlockHoleRadius,
-                                                       mountingblockboxshape[0]->GetDZ());
-  mountingblocktubeshape[1] = new TGeoTube("MountingBlockTubeShape1",0.0,
-                                                       fgkSSDMountingBlockHoleRadius,
-                                                       mountingblockboxshape[2]->GetDZ());
-  TGeoTranslation* mountingblocktubetrans[2*kmountingblocktubenumber];
-  mountingblocktubetrans[0] = new TGeoTranslation("MountingBlockTubeTrans0",
-                                               -       0.5*(fgkSSDMountingBlockLength[0]
-                                               -       fgkSSDMountingBlockHoleTubeLength[0]),
-                                                       0.5*fgkSSDMountingBlockWidth
-                                               -       fgkSSDMountingBlockHoleTubeWidth[0],0.);
-  mountingblocktubetrans[1] = new TGeoTranslation("MountingBlockTubeTrans1",
-                                               -       0.5*(fgkSSDMountingBlockLength[0]
-                                               -       fgkSSDMountingBlockHoleTubeLength[0])
-                                               +       fgkSSDMountingBlockHoleTubeLength[0],
-                                               -       0.5*fgkSSDMountingBlockWidth
-                                               +       fgkSSDMountingBlockHoleTubeWidth[0],
-                                                       0.);
-  mountingblocktubetrans[2] = new TGeoTranslation("MountingBlockTubeTrans2",
-                                               -       mountingblockboxshape[0]->GetDX()
-                                               +       0.5*fgkSSDMountingBlockLength[0]
-                                               -       fgkSSDMountingBlockHoleTubeLength[1],
-                                                       0.5*fgkSSDMountingBlockWidth
-                                               -       fgkSSDMountingBlockHoleTubeWidth[0],
-                                                       mountingblockboxshape[2]->GetDZ()
-                                               -       mountingblockboxshape[0]->GetDZ()
-                                               +       fgkSSDMountingBlockHeight[3]);
-  mountingblocktubetrans[3] = new TGeoTranslation("MountingBlockTubeTrans3",
-                                               -       mountingblockboxshape[0]->GetDX()
-                                               +       0.5*fgkSSDMountingBlockLength[0],
-                                               -       0.5*fgkSSDMountingBlockWidth
-                                               +       fgkSSDMountingBlockHoleTubeWidth[1],
-                                                       mountingblockboxshape[2]->GetDZ()
-                                               -       mountingblockboxshape[0]->GetDZ()
-                                               +       fgkSSDMountingBlockHeight[3]);
-  for(Int_t i=0; i<2*kmountingblocktubenumber; i++) 
-                                               mountingblocktubetrans[i]->RegisterYourself();
-                                               new TGeoCompositeShape("MountingBlockMainShape",
-                                               "MountingBlockBoxShape0:MountingBlockBoxTrans0+"
-                                               "MountingBlockBoxShape1:MountingBlockBoxTrans1+"
-                                               "MountingBlockBoxShape2:MountingBlockBoxTrans2+"
-                                               "MountingBlockBoxShape1:MountingBlockBoxTrans3+"
-                                               "MountingBlockBoxShape0:MountingBlockBoxTrans4");
-  ////////////////////////////////////////////
-  // Mounting Block Screw Composite Hole Shapes
-  ////////////////////////////////////////////
-  const Int_t kmountingblockholetubesegnumber = 4;
-                                               new TGeoTubeSeg("MountingBlockHoleTubeSegShape",
-                                               0.0,
-                                               fgkSSDMountingBlockScrewHoleRadius[0],
-                                               0.5*fgkSSDMountingBlockScrewHoleHeigth,-90.,180.);
-  TGeoCombiTrans* mountingblockholetubesegcombitrans[kmountingblockholetubesegnumber];
-  char* mountingblockholetubesegcombitransname[kmountingblockholetubesegnumber] = 
-                                       {       "MountingBlockHoleTubeSegCombiTrans0",
-                                               "MountingBlockHoleTubeSegCombiTrans1",
-                                               "MountingBlockHoleTubeSegCombiTrans2",
-                                               "MountingBlockHoleTubeSegCombiTrans3"};
-  for(Int_t i=0; i<kmountingblockholetubesegnumber; i++){
-    mountingblockholetubesegcombitrans[i] =
-      new TGeoCombiTrans(mountingblockholetubesegcombitransname[i],
-                                               0.5*fgkSSDMountingBlockScrewHoleEdge*TMath::Sqrt(2)
-                                       *       TMath::Cos(45*(2*i+1)*TMath::DegToRad()),
-                                               0.5*fgkSSDMountingBlockScrewHoleEdge*TMath::Sqrt(2)
-                                       *       TMath::Sin(45*(2*i+1)*TMath::DegToRad()),
-                                               0.0,
-                                               new TGeoRotation("",90.*i,0.,0.));
-    mountingblockholetubesegcombitrans[i]->RegisterYourself();
-  }
-  TGeoBBox* mountingblockholeboxshape = 
-                                               new TGeoBBox("MountingBlockHoleBoxShape",
-                                               0.5*fgkSSDMountingBlockScrewHoleEdge,
-                                               0.5*fgkSSDMountingBlockScrewHoleEdge,
-                                               0.5*fgkSSDMountingBlockScrewHoleHeigth);
-  TGeoCompositeShape* mountingblockscrewhole[2];
-  mountingblockscrewhole[0] = 
-                       new TGeoCompositeShape("MountingBlockScrewHole0",
-                       "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans0+"
-                       "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans1+"
-                       "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans2+"
-                       "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans3+"
-                       "MountingBlockHoleBoxShape");
-                       new TGeoTubeSeg("MountingBlockLowerHoleTubeSegShape",
-                                               0.0,
-                                               fgkSSDMountingBlockScrewHoleRadius[1],
-                                               0.5*(fgkSSDMountingBlockHoleTubeWidth[0]
-                                       -       fgkSSDMountingBlockScrewHoleHeigth
-                                       -       fgkSSDMountingBlockHeight[3]),0.,90.); 
-  TGeoCombiTrans* mountingblocklowerholetubesegcombitrans[kmountingblockholetubesegnumber];
-  char* mountingblocklowerholetubesegcombitransname[kmountingblockholetubesegnumber] =
-                                       {       "MountingBlockLowerHoleTubeSegCombiTrans0",
-                                               "MountingBlockLowerHoleTubeSegCombiTrans1",
-                                               "MountingBlockLowerHoleTubeSegCombiTrans2",
-                                               "MountingBlockLowerHoleTubeSegCombiTrans3"};
-  for(Int_t i=0; i<kmountingblockholetubesegnumber; i++){
-    mountingblocklowerholetubesegcombitrans[i] =
-                       new TGeoCombiTrans(mountingblocklowerholetubesegcombitransname[i],
-                                               0.5*(fgkSSDMountingBlockScrewHoleEdge
-                                       -       2.*fgkSSDMountingBlockScrewHoleRadius[1])
-                                       *       TMath::Sqrt(2)*TMath::Cos(45*(2*i+1)*TMath::DegToRad()),
-                                               0.5*(fgkSSDMountingBlockScrewHoleEdge
-                                       -       2.0*fgkSSDMountingBlockScrewHoleRadius[1])
-                                       *       TMath::Sqrt(2)*TMath::Sin(45*(2*i+1)*TMath::DegToRad()),0.,
-                                               new TGeoRotation("",90.*i,0.,0.));
-                                       mountingblocklowerholetubesegcombitrans[i]->RegisterYourself();
-  }
-  Double_t fgkSSDMountingBlockLowerScrewHoleEdge = fgkSSDMountingBlockScrewHoleEdge
-                                       -       2.*fgkSSDMountingBlockScrewHoleRadius[1];
-  TGeoBBox* mountingblocklowerholeboxshape[2];
-  mountingblocklowerholeboxshape[0] = 
-                       new TGeoBBox("MountingBlockLowerHoleBoxShape0",
-                                               0.5*fgkSSDMountingBlockLowerScrewHoleEdge,
-                                               0.5*fgkSSDMountingBlockLowerScrewHoleEdge,
-                                               0.5*(fgkSSDMountingBlockHoleTubeWidth[0]
-                                       -       fgkSSDMountingBlockScrewHoleHeigth
-                                       -       fgkSSDMountingBlockHeight[3]));
-  mountingblocklowerholeboxshape[1] = 
-                       new TGeoBBox("MountingBlockLowerHoleBoxShape1",
-                                               0.5*fgkSSDMountingBlockLowerScrewHoleEdge,
-                                               0.5*fgkSSDMountingBlockScrewHoleRadius[1],
-                                               0.5*(fgkSSDMountingBlockHoleTubeWidth[0]
-                                       -       fgkSSDMountingBlockScrewHoleHeigth
-                                       -       fgkSSDMountingBlockHeight[3]));
-  TGeoCombiTrans* mountingblocklowerholeBoxcombitrans[kmountingblockholetubesegnumber];
-  char* mountingBlockLowerHoleBoxCombiTransName[kmountingblockholetubesegnumber] = 
-                                       {       "MountingBlockLowerHoleBoxCombiTrans0",
-                                               "MountingBlockLowerHoleBoxCombiTrans1",
-                                               "MountingBlockLowerHoleBoxCombiTrans2",
-                                               "MountingBlockLowerHoleBoxCombiTrans3"};
-  for(Int_t i=0; i<kmountingblockholetubesegnumber; i++){
-    mountingblocklowerholeBoxcombitrans[i] =
-                       new TGeoCombiTrans(mountingBlockLowerHoleBoxCombiTransName[i],
-                                               0.5*(fgkSSDMountingBlockLowerScrewHoleEdge
-                                       +       fgkSSDMountingBlockScrewHoleRadius[1])
-                                       *       TMath::Cos(90*(i+1)*TMath::DegToRad()),
-                                               0.5*(fgkSSDMountingBlockLowerScrewHoleEdge
-                                       +       fgkSSDMountingBlockScrewHoleRadius[1])
-                                       *       TMath::Sin(90*(i+1)*TMath::DegToRad()),0.,
-                                               new TGeoRotation("",90.*i,0.,0.));
-    mountingblocklowerholeBoxcombitrans[i]->RegisterYourself();
-  }
-  mountingblockscrewhole[1] = new TGeoCompositeShape("MountingBlockScrewHole1",
-       "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans0+"
-       "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans1+"
-       "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans2+"
-       "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans3+"
-       "MountingBlockLowerHoleBoxShape0+"
-       "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans0+"
-       "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans1+"
-       "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans2+"
-       "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans3");
-  TGeoTranslation* mountingblockscrewhole1trans = 
-                       new TGeoTranslation("MountingBlockScrewHole1Trans",0.,0.,
-                                       -       mountingblocklowerholeboxshape[0]->GetDZ()
-                                       -       mountingblockholeboxshape->GetDZ());
-  mountingblockscrewhole1trans->RegisterYourself();
-                       new TGeoCompositeShape("MountingBlockHole",
-       "MountingBlockScrewHole0+MountingBlockScrewHole1:MountingBlockScrewHole1Trans");
-  TGeoTranslation* mountingblockholetrans = new TGeoTranslation("MountingBlockHoleTrans",
-                                               0.5*fgkSSDMountingBlockLength[0]
-                                       -       mountingblockboxshape[0]->GetDZ(),
-                                               0.0,
-                                               2.*mountingblockboxshape[2]->GetDZ()
-                                       -       mountingblockboxshape[0]->GetDZ()
-                                       +       fgkSSDMountingBlockHeight[3]
-                                       -       mountingblockholeboxshape->GetDZ());
-  mountingblockholetrans->RegisterYourself();
-  TGeoCompositeShape* mountingblockshape = new TGeoCompositeShape("MountingBlockShape",
-                       "MountingBlockMainShape-(MountingBlockTubeShape0:MountingBlockTubeTrans0+"
-                       "MountingBlockTubeShape0:MountingBlockTubeTrans1+"
-                       "MountingBlockTubeShape1:MountingBlockTubeTrans2+"
-                       "MountingBlockTubeShape1:MountingBlockTubeTrans3+"
-                       "HoleTrapezoidShape:HoleTrapezoidShapeCombiTrans+"
-                       "MountingBlockHole:MountingBlockHoleTrans)");
-  TGeoVolume* ssdmountingblock = new TGeoVolume("SSDMountingBlock",
-                       mountingblockshape,fSSDMountingBlockMedium);
-  return ssdmountingblock;
+  for(Int_t i=0; i<fgkendladdermountingblocknumber; i++)
+       for(Int_t j=0; j<2; j++)
+               fendladdersegment[i]->AddNode(fendladdermountingblockclip,j+1,
+                                             fendladdermountingblockclipmatrix[i][j]);
+  /////////////////////////////////////////////////////////////
+  // End Ladder Lower Supports
+  /////////////////////////////////////////////////////////////
+  fendladdersegment[0]->AddNode(fcarbonfiberlowersupport[0],1,
+                               fendladderlowersupptrans[0]);
+  fendladdersegment[1]->AddNode(fcarbonfiberlowersupport[0],2,
+                               fendladderlowersupptrans[1]);
+  fendladdersegment[1]->AddNode(fcarbonfiberlowersupport[0],3,
+                               fendladderlowersupptrans[2]);
+  /////////////////////////////////////////////////////////////
+  // End Ladder Cooling Tube Support
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<2; i++) 
+       for(Int_t j=0; j<(i==0?4:2); j++)   
+               fendladdersegment[i]->AddNode(fcoolingtubesupport,j+1,
+                                             fendladdercoolingtubesupportmatrix[i][j]);
+  /////////////////////////////////////////////////////////////
+  // End Ladder Cooling Tube Support
+  /////////////////////////////////////////////////////////////
+  fendladdersegment[0]->AddNode(fendladdercoolingtube[0],1,fendladdercoolingtubematrix[0][0]); 
+  fendladdersegment[0]->AddNode(fendladdercoolingtube[0],2,fendladdercoolingtubematrix[0][1]);
+  fendladdersegment[1]->AddNode(fendladdercoolingtube[1],1,fendladdercoolingtubematrix[1][0]);
+  fendladdersegment[1]->AddNode(fendladdercoolingtube[1],2,fendladdercoolingtubematrix[1][1]); 
 }
-////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetLadder(Int_t iLayer){
+///////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::SetLadder(){
   /////////////////////////////////////////////////////////////
-  // Method generating the Layer5 or Layer6 Ladder  
+  // Method Generating Ladder of Layer 5 and 6
   /////////////////////////////////////////////////////////////  
-  TGeoVolume* ladder = new TGeoVolumeAssembly(iLayer==5 ? "ITSssdLay5Ladd" 
-                                                                                                               : "ITSssdLay6Ladd");
-  TGeoVolume* laddersegment[2];
-  laddersegment[0] = GetLadderSegment(0);
-  laddersegment[1] = GetLadderSegment(1);
-  TList* endladdersegmentlist = GetEndLadderSegment();
-  Double_t beamaxistransvector = fgkCarbonFiberJunctionWidth;
-  Int_t ssdlaysensorsnumber = (iLayer==5 ? 
-                                               fgkSSDLay5SensorsNumber : 
-                                               fgkSSDLay6SensorsNumber);
-  for(Int_t i=0; i<ssdlaysensorsnumber; i++) ladder->AddNode(i%2==0 ? 
-                                               laddersegment[iLayer==5 ? 0 : 1] : 
-                                               laddersegment[iLayer==5 ? 1 : 0],
-                                               ssdlaysensorsnumber-i-1,new TGeoTranslation(-0.5*fgkCarbonFiberTriangleLength,
-                                               beamaxistransvector*i,0.));
-  ladder->AddNode((TGeoVolume*)endladdersegmentlist->At(0),1,
-                                               new TGeoTranslation("",-0.5*fgkCarbonFiberTriangleLength,
-                                               fgkCarbonFiberJunctionWidth*ssdlaysensorsnumber,0.));
-  ladder->AddNode((TGeoVolume*)endladdersegmentlist->At(1),1,
-                                               new TGeoCombiTrans("",0.5*fgkCarbonFiberTriangleLength,
-                                               0.,0.,new TGeoRotation("",180.,0.,0.)));
+  Int_t ssdlaysensorsnumber[fgkladdernumber] = {fgkSSDLay5SensorsNumber,
+                                                                                               fgkSSDLay6SensorsNumber};
+  /////////////////////////////////////////////////////////////////////////////                                                
+  /// Generating Ladder Mother Volume Containing Ladder 
+  /////////////////////////////////////////////////////////////////////////////                 
+  TGeoXtru* laddershape[fgkladdernumber];      
+  for(Int_t i=0; i<fgkladdernumber; i++) laddershape[i] = new TGeoXtru(2);
+  const Int_t kmothervertexnumber = 8;  
+  Double_t xmothervertex[fgkladdernumber][kmothervertexnumber];
+  Double_t ymothervertex[fgkladdernumber][kmothervertexnumber];
+  ///////////////////////
+  // Setting the vertices 
+  ///////////////////////
+  Double_t laddercablethickness = (fgkSSDLay6SensorsNumber+2)
+                                                               * (fgkSSDLadderCableHeight[0]+fgkSSDLadderCableHeight[1]);
+  xmothervertex[0][0] = -0.5*fgkSSDSensorWidth;
+  ymothervertex[0][0] = -0.5*fgkCoolingTubeSupportHeight-fgkSSDModuleCoolingBlockToSensor;
+  xmothervertex[0][1] = xmothervertex[0][0];
+  ymothervertex[0][1] = -0.5*fgkCoolingTubeSupportHeight; // 0.0; MvL 20-apr-2010
+  xmothervertex[0][2] = - 0.5*fgkSSDModuleSensorSupportDistance-2.*fgkCoolingTubeSupportRmax
+                                               - laddercablethickness/SinD(2.*fgkSSDFlexAngle);
+  ymothervertex[0][2] = ymothervertex[0][1];
+  ymothervertex[0][3] = 0.5*fgkCarbonFiberTriangleLength*TanD(2.*fgkSSDFlexAngle);
+  xmothervertex[0][3] = xmothervertex[0][2]+ymothervertex[0][3]/TanD(2.*fgkSSDFlexAngle);              
+  xmothervertex[0][4] = -xmothervertex[0][3];
+  ymothervertex[0][4] = ymothervertex[0][3];
+  xmothervertex[0][5] = -xmothervertex[0][2];
+  ymothervertex[0][5] = ymothervertex[0][2];
+  xmothervertex[0][6] = -xmothervertex[0][1];
+  ymothervertex[0][6] = ymothervertex[0][1];
+  xmothervertex[0][7] = -xmothervertex[0][0];
+  ymothervertex[0][7] = ymothervertex[0][0];
+  for(Int_t i=0; i<kmothervertexnumber; i++){
+       xmothervertex[1][i] = xmothervertex[0][i];
+       ymothervertex[1][i] = ymothervertex[0][i];
+  }
+///////////////////////////////////////////////////////////////////////////
+// Disalignement Mother Volume corrections 25/08/08
+///////////////////////////////////////////////////////////////////////////
+  TGeoXtru* leftladdershape1[fgkladdernumber]; 
+  TGeoXtru* leftladdershape2[fgkladdernumber]; 
+  TGeoXtru* centersensorladdershape[fgkladdernumber];  
+  TGeoXtru* rightladdershape1[fgkladdernumber];        
+  TGeoXtru* rightladdershape2[fgkladdernumber];        
+  for(Int_t i=0; i<fgkladdernumber; i++){
+    leftladdershape1[i] = new TGeoXtru(2);
+    leftladdershape2[i] = new TGeoXtru(2);
+    centersensorladdershape[i] = new TGeoXtru(2);
+    rightladdershape1[i] = new TGeoXtru(2);
+    rightladdershape2[i] = new TGeoXtru(2);
+  }
+  //////////////////////////////////////
+  // Setting the names for shapes  
+  //////////////////////////////////////
+  leftladdershape1[0]->SetName("Lay5Left1LadderSegmentContainer");
+  leftladdershape2[0]->SetName("Lay5Left2LadderSegmentContainer");
+  leftladdershape1[1]->SetName("Lay6Left1LadderSegmentContainer");
+  leftladdershape2[1]->SetName("Lay6Left2LadderSegmentContainer");
+  centersensorladdershape[0]->SetName("Lay5CenterSensorContainer");
+  centersensorladdershape[1]->SetName("Lay6CenterSensorContainer");
+  rightladdershape1[0]->SetName("Lay5Right1LadderSegmentContainer");
+  rightladdershape2[0]->SetName("Lay5Right2LadderSegmentContainer");
+  rightladdershape1[1]->SetName("Lay6Right1LadderSegmentContainer");
+  rightladdershape2[1]->SetName("Lay6Right2LadderSegmentContainer");
+  //////////////////////////////////////
+  Double_t xend1laddervertex[fgkladdernumber][kmothervertexnumber];
+  Double_t yend1laddervertex[fgkladdernumber][kmothervertexnumber];
+  Double_t xcentersensorvertex[fgkladdernumber][kmothervertexnumber];
+  Double_t ycentersensorvertex[fgkladdernumber][kmothervertexnumber];
+  Double_t xend2laddervertex[fgkladdernumber][kmothervertexnumber];
+  Double_t yend2laddervertex[fgkladdernumber][kmothervertexnumber];
+  for(Int_t i=0; i<fgkladdernumber; i++) {
+    for(Int_t j=0; j<kmothervertexnumber; j++){
+      xcentersensorvertex[i][j] = xmothervertex[i][j];
+      ycentersensorvertex[i][j] = ymothervertex[i][j];
+      xend1laddervertex[i][j] = xmothervertex[i][j];
+      yend1laddervertex[i][j] = ymothervertex[i][j];
+      xend2laddervertex[i][j] = xmothervertex[i][j];
+      yend2laddervertex[i][j] = ymothervertex[i][j];
+    }
+    // Add some space around sensors to accommodate misalignments
+    xcentersensorvertex[i][0] -= fgkSSDModuleSideDisalignment; 
+    xcentersensorvertex[i][1] =  xcentersensorvertex[0][0];
+    xcentersensorvertex[i][6] = -xcentersensorvertex[0][1];
+    xcentersensorvertex[i][7] = -xcentersensorvertex[0][0];
+    
+    ycentersensorvertex[i][0] -= fgkSSDModuleVerticalDisalignment;     
+    ycentersensorvertex[i][7] = ycentersensorvertex[0][0];
+    
+    // Center Ladder Piece
+    centersensorladdershape[i]->DefinePolygon(kmothervertexnumber,xcentersensorvertex[i],
+                                             ycentersensorvertex[i]);
+    centersensorladdershape[i]->DefineSection(0, - fgkEndLadderCarbonFiberLowerJunctionLength[1]
+                                                + 1.45*fgkSSDMountingBlockWidth);
+    centersensorladdershape[i]->DefineSection(1,   ssdlaysensorsnumber[i] * fgkCarbonFiberJunctionWidth
+                                                + fgkEndLadderCarbonFiberLowerJunctionLength[0]
+                                                - 2.4*fgkSSDMountingBlockWidth);
+
+    // Left and Right Ladder Pieces: Mother volumes around ladder mounting areas 
+
+    // Cuts off first corner (neg x)
+    xend1laddervertex[i][0] = -0.5*fgkSSDMountingBlockLength[0];
+    xend1laddervertex[i][1] = -0.5*fgkSSDMountingBlockLength[0];
+    // Cuts off last part (pos x)
+    xend2laddervertex[i][6] = 0.5*fgkSSDMountingBlockLength[0];
+    xend2laddervertex[i][7] = 0.5*fgkSSDMountingBlockLength[0];
+
+    leftladdershape1[i]->DefinePolygon(kmothervertexnumber,xend1laddervertex[i],  
+                                      yend1laddervertex[i]);
+    leftladdershape1[i]->DefineSection(0,-fgkEndLadderCarbonFiberLowerJunctionLength[1]);
+    leftladdershape1[i]->DefineSection(1,  fendladdersegmentmatrix[0][i]->GetTranslation()[2]    
+                                        - fgkEndLadderMountingBlockPosition[0]);
+    
+    leftladdershape2[i]->DefinePolygon(kmothervertexnumber,xend2laddervertex[i],  
+                                      yend2laddervertex[i]);
+    leftladdershape2[i]->DefineSection(0,  fendladdersegmentmatrix[0][i]->GetTranslation()[2]    
+                                        - fgkEndLadderMountingBlockPosition[0]); 
+    leftladdershape2[i]->DefineSection(1,- fgkEndLadderCarbonFiberLowerJunctionLength[1] 
+                                      + 1.45*fgkSSDMountingBlockWidth);  // connect to main volume at -1.6725 cm
+
+    rightladdershape1[i]->DefinePolygon(kmothervertexnumber,xend1laddervertex[i],
+                                       yend1laddervertex[i]);
+    rightladdershape1[i]->DefineSection(0,ssdlaysensorsnumber[i]*fgkCarbonFiberJunctionWidth
+                                       +fgkEndLadderCarbonFiberLowerJunctionLength[0]
+                                       -2.4*fgkSSDMountingBlockWidth);
+    rightladdershape1[i]->DefineSection(1,fendladdersegmentmatrix[1][i]->GetTranslation()[2]
+                                       + fgkEndLadderMountingBlockPosition[1]);
+
+    rightladdershape2[i]->DefinePolygon(kmothervertexnumber,xend2laddervertex[i],
+                                       yend2laddervertex[i]);
+    rightladdershape2[i]->DefineSection(0, fendladdersegmentmatrix[1][i]->GetTranslation()[2]
+                                          + fgkEndLadderMountingBlockPosition[1]);
+    rightladdershape2[i]->DefineSection(1,  ssdlaysensorsnumber[i]*fgkCarbonFiberJunctionWidth
+                                         + fgkEndLadderCarbonFiberLowerJunctionLength[0]);
+  }
+  TGeoCompositeShape* laddershapecontainer[2];
+  laddershapecontainer[0] = new TGeoCompositeShape("Lay5LadderCompositeShape",
+                                                  "Lay5Left1LadderSegmentContainer+Lay5Left2LadderSegmentContainer"
+                                                  "+Lay5CenterSensorContainer"
+                                                  "+Lay5Right1LadderSegmentContainer+Lay5Right2LadderSegmentContainer");
+  laddershapecontainer[1] = new TGeoCompositeShape("Lay6LadderCompositeShape",
+                                                  "Lay6Left1LadderSegmentContainer+Lay6Left2LadderSegmentContainer"
+                                                  "+Lay6CenterSensorContainer"
+                                                  "+Lay6Right1LadderSegmentContainer+Lay6Right2LadderSegmentContainer");
+  const char* laddername[fgkladdernumber] = {"ITSssdLay5Ladd","ITSssdLay6Ladd"};
+  for(Int_t i=0; i<fgkladdernumber; i++){
+    fladder[i] = new TGeoVolume(laddername[i],laddershapecontainer[i],fSSDAir);
+    fladder[i]->SetLineColor(4);
+  }
+///////////////////////////////////////////////////////////////////////////
+ if(!fCreateMaterials) CreateMaterials();
+ if(!fTransformationMatrices) CreateTransformationMatrices();
+ if(!fBasicObjects) CreateBasicObjects();
+ SetLadderSegment(); 
+ SetEndLadderSegment();
+  for(Int_t i=0; i<fgkladdernumber; i++){
+       for(Int_t j=0; j<ssdlaysensorsnumber[i]; j++){
+       //////////////////////////                                              
+       /// Placing Ladder Segment
+       //////////////////////////              
+               fladder[i]->AddNode(j%2==0 ? fladdersegment[i==0 ? 0 : 1] :
+                                                                    fladdersegment[i==0 ? 1 : 0],
+                                                                        ssdlaysensorsnumber[i]-j-1,fladdermatrix[i][j]);
+       //////////////////////////                                              
+       /// Placing SSD Sensor
+       //////////////////////////              
+        if(i==0&&ssdlaysensorsnumber[i]-j-1==13) fSSDSensor5->SetLineColor(kRed);
+               fladder[i]->AddNode(i==0?fSSDSensor5:fSSDSensor6,ssdlaysensorsnumber[i]-j-1,
+                                                       fssdsensormatrix[i][j]);
+       }
+       ///////////////////////////////                                         
+       /// Placing End Ladder Segment
+       ///////////////////////////////         
+       fladder[i]->AddNode(fendladdersegment[0],1,fendladdersegmentmatrix[0][i]);
+       fladder[i]->AddNode(fendladdersegment[1],1,fendladdersegmentmatrix[1][i]);
+   }
 /////////////////////////////////////////////////////////////////////////////                                          
 /// Placing Ladder Cables
 /////////////////////////////////////////////////////////////////////////////          
-  SetLadderCableCombiTransMatrix(iLayer);
-  Int_t sidecablenumber[2] = {0,0};
-  switch(iLayer){
-       case 5: 
-               sidecablenumber[0] = fgkSSDLay5SensorsNumber/2+1; 
-               sidecablenumber[1] = sidecablenumber[0]-2;
-               break;
-    case 6:
-               sidecablenumber[0] = (fgkSSDLay6SensorsNumber-1)/2+1;
-               sidecablenumber[1] = sidecablenumber[0]-1;
-               break;
-  }
-  const Double_t* carbonfibertomoduleposition = 
-                                                        fLadderSegmentCombiTransMatrix[1]->GetTranslation();
+  Int_t sidecablenumber[2][2];
+  sidecablenumber[0][0] = fgkSSDLay5SensorsNumber/2+1; 
+  sidecablenumber[0][1] = sidecablenumber[0][0]-2;
+  sidecablenumber[1][0] = (fgkSSDLay6SensorsNumber-1)/2+1;
+  sidecablenumber[1][1] = sidecablenumber[1][0]-1;
+  Double_t carbonfibertomoduleposition[3];
+  carbonfibertomoduleposition[0] = -0.5*(fgkSSDSensorWidth-fgkCarbonFiberTriangleLength);
+  carbonfibertomoduleposition[1] = - (2.*fgkSSDSensorLength-fgkSSDSensorOverlap)+
+                        fgkSSDModuleStiffenerPosition[1]+fgkSSDStiffenerWidth
+        +               0.5*fgkSSDFlexHoleLength+2.*fgkCarbonFiberJunctionWidth
+        -               0.5*(fgkCarbonFiberLowerSupportWidth+fgkSSDSensorCenterSupportLength
+        -            fgkSSDSensorCenterSupportThickness[0]);
+  carbonfibertomoduleposition[2] = - (fgkSSDModuleCoolingBlockToSensor
+                                                                +   0.5*fgkCoolingTubeSupportHeight
+        -         fgkSSDSensorHeight-fgkSSDChipCablesHeight[3]-fgkSSDChipHeight);      
+  const Double_t kendladdercablecorrection = 1.72*fgkmm; //this has to be tuned
   Double_t ssdendladdercablelength[4];
   ssdendladdercablelength[0] = carbonfibertomoduleposition[1]
                                                         + fgkSSDSensorLength
                                                         - fgkSSDModuleStiffenerPosition[1]
                                                         - fgkSSDStiffenerWidth 
                                                         - fgkSSDFlexWidth[0]
-                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[1];
+                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[1]-0.000001*kendladdercablecorrection;
   ssdendladdercablelength[1] = carbonfibertomoduleposition[1]
                                                         + fgkSSDModuleStiffenerPosition[1]
                                                         + fgkSSDStiffenerWidth
-                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[1];
+                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[1]-0.000001*kendladdercablecorrection;
   ssdendladdercablelength[2] = ssdendladdercablelength[1]
                                                         - fgkEndLadderCarbonFiberLowerJunctionLength[1]
-                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[0];
+                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[0]
+                                                        - kendladdercablecorrection;
   ssdendladdercablelength[3] = fgkCarbonFiberJunctionWidth-(fgkSSDSensorLength
                                                         + carbonfibertomoduleposition[1]
                                                         - fgkSSDModuleStiffenerPosition[1]
                                                         - fgkSSDStiffenerWidth)
-                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[1];
+                                                        + fgkEndLadderCarbonFiberLowerJunctionLength[0]-0.000001*kendladdercablecorrection;
+
   TList* laddercableassemblylist[4];
   const Int_t kendladdercablesnumber = 4;
-  for(Int_t i=0; i<kendladdercablesnumber; i++){
-         laddercableassemblylist[i] = 
-         GetLadderCableAssemblyList(sidecablenumber[i<2?0:1],
-                                                                  ssdendladdercablelength[i]);
-         ladder->AddNode((TGeoVolume*)laddercableassemblylist[i]->At(i%2==0?0:1),
-                                                                       i<2?1:2,fLadderCableCombiTransMatrix[i]);
-  }
-  return ladder;
-}                                                                
+  TGeoRotation *laddercablerot = new TGeoRotation();
+  laddercablerot->SetAngles(90.,60.,-90.);
+  for(Int_t i=0; i<fgkladdercablesnumber; i++)
+       for(Int_t j=0; j<kendladdercablesnumber; j++){
+               laddercableassemblylist[j] = 
+               GetLadderCableAssemblyList(sidecablenumber[i][j<2?0:1],
+                                                                  ssdendladdercablelength[j]);
+                       fladder[i]->AddNode((TGeoVolume*)laddercableassemblylist[j]->At(j%2==0?0:1),
+                                                                       j<2?1:2,fladdercablematrix[i][j]);
+  }
+}
+////////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::SetLayer(){
 ////////////////////////////////////////////////////////////////////////////////
-TGeoVolume* AliITSv11GeometrySSD::GetLayer(Int_t iLayer){
+  // Creating Ladder of Layer 5 and Layer 6
   /////////////////////////////////////////////////////////////
-  // Method generating the Layer5 or Layer6  
-  /////////////////////////////////////////////////////////////  
-  TGeoVolume* layer = new TGeoVolumeAssembly(iLayer==5 ? "ITSssdLayer5" 
-                                                                                                          : "ITSssdLayer6");
-  TGeoVolume* ladder = GetLadder(iLayer);
-  /////////////////////////////////////////////////////
-  // Setting the CombiTransformation to pass ITS center 
-  /////////////////////////////////////////////////////
-  Double_t itscentertransz = iLayer==5 ? fgkSSDLay5LadderLength
-                           -             fgkLay5CenterITSPosition: 
-                                         fgkSSDLay6LadderLength
-                           -             fgkLay6CenterITSPosition;
-  Double_t itssensorytrans = fgkSSDModuleCoolingBlockToSensor
-                           + 0.5*        fgkCoolingTubeSupportHeight
-                           -(iLayer==5 ? fgkSSDSensorSideSupportHeight[1]
-                           -             fgkSSDSensorSideSupportHeight[0]: 0.);
-  TGeoRotation* itscenterrot[3];
-  itscenterrot[0] = new TGeoRotation("ITSCenterRot0",90.,180.,-90.);
-  itscenterrot[1] = new TGeoRotation("ITSCenterRot1",0.,90.,0.);
-  itscenterrot[2] = new TGeoRotation((*itscenterrot[1])*(*itscenterrot[0]));
-  TGeoCombiTrans* itscentercombitrans = new TGeoCombiTrans("ITSCenterCombiTrans",0.,
-                                        fgkSSDMountingBlockHeight[1]+itssensorytrans,
-                                        fgkEndLadderCarbonFiberLowerJunctionLength[1]
-                                      - itscentertransz,itscenterrot[2]);
-  /////////////////////////////////////////////////////
-  // Setting the Ladder into the Layer 
-  /////////////////////////////////////////////////////
-  TGeoCombiTrans* lay5laddercombitrans[fgkSSDLay5LadderNumber];
-  TGeoCombiTrans* lay6laddercombitrans[fgkSSDLay6LadderNumber];
-  TGeoHMatrix* lay5ladderhmatrix[fgkSSDLay5LadderNumber];
-  TGeoHMatrix* lay6ladderhmatrix[fgkSSDLay6LadderNumber];
-  if(iLayer==5){
-      Double_t lay5ladderangleposition = 360./fgkSSDLay5LadderNumber;    
-      char lay5laddercombitransname[30], lay5ladderrotname[30];
-      for(Int_t i=0; i<fgkSSDLay5LadderNumber;i++){
-      sprintf(lay5laddercombitransname,"Lay5LadderCombiTrans%i",i);
-      sprintf(lay5ladderrotname,"Lay5LaddeRot%i",i);
-      Double_t lay5layerradius = (i%2==0 ? fgkSSDLay5RadiusMin: fgkSSDLay5RadiusMax);
-      lay5laddercombitrans[i] = new TGeoCombiTrans(lay5laddercombitransname,
-                                lay5layerradius *      TMath::Cos((i+1)
-                              * lay5ladderangleposition*TMath::DegToRad()),
-                                lay5layerradius *      TMath::Sin((i+1)
-                              * lay5ladderangleposition*TMath::DegToRad()),0.,
-                                new TGeoRotation(lay5ladderrotname,(i+1)
-                              * lay5ladderangleposition-90,0.,0.));
-      lay5ladderhmatrix[i] = new TGeoHMatrix((*lay5laddercombitrans[i])
-                           * (*itscentercombitrans));
-      layer->AddNode(ladder,i,lay5ladderhmatrix[i]);            
-      }
-  }
-  else{
-      Double_t lay6ladderangleposition = 360./fgkSSDLay6LadderNumber;    
-      char lay6laddercombitransname[30], lay6ladderrotname[30];
-      for(Int_t i=0; i<fgkSSDLay6LadderNumber;i++){
-      sprintf(lay6laddercombitransname,"Lay6LadderCombiTrans%i",i);
-      sprintf(lay6ladderrotname,"Lay6LaddeRot%i",i);
-      Double_t lay6layerradius = (i%2==0 ? fgkSSDLay6RadiusMin: fgkSSDLay6RadiusMax);
-      lay6laddercombitrans[i] = new TGeoCombiTrans(lay6laddercombitransname,
-                                lay6layerradius *      TMath::Cos((i+1)
-                              * lay6ladderangleposition*TMath::DegToRad()),
-                                lay6layerradius *      TMath::Sin((i+1)
-                              * lay6ladderangleposition*TMath::DegToRad()),0.,
-                                new TGeoRotation(lay6ladderrotname,(i+1)
-                              * lay6ladderangleposition-90,0.,0.));
-      lay6ladderhmatrix[i] = new TGeoHMatrix((*lay6laddercombitrans[i])
-                           * (*itscentercombitrans));
-      layer->AddNode(ladder,i,lay6ladderhmatrix[i]);            
-      }
-  }
-  return layer;
+  if(!fCreateMaterials) CreateMaterials();
+  if(!fTransformationMatrices) CreateTransformationMatrices();
+  if(!fBasicObjects) CreateBasicObjects();
+  SetLadder(); // Generating the ladder of Layer5 and Layer6
+  const Int_t kssdlayladdernumber[fgklayernumber] = 
+                       {fgkSSDLay5LadderNumber,fgkSSDLay6LadderNumber};
+  /////////////////////////////////////////////////////////////
+  // Generating mother volumes for Layer5 and Layer6
+  /////////////////////////////////////////////////////////////
+  fSSDLayer5 = new TGeoVolumeAssembly("ITSssdLayer5");  
+  fSSDLayer6 = new TGeoVolumeAssembly("ITSssdLayer6");  
+  Int_t *ladderindex[fgklayernumber];
+  Int_t index[fgklayernumber] = {8,9};
+  for(Int_t i=0; i<fgklayernumber; i++) ladderindex[i] = new Int_t[kssdlayladdernumber[i]];
+  for(Int_t i=0; i<fgklayernumber; i++)        
+       for(Int_t j=0; j<kssdlayladdernumber[i]; j++){
+               ladderindex[i][j] = ((j>=0)&&(j<=kssdlayladdernumber[i]-index[i]-1)) ? 
+                                                         j+index[i] : j+index[i]-kssdlayladdernumber[i]; 
+               i ==0 ? fSSDLayer5->AddNode(fladder[0],ladderindex[i][j],flayermatrix[i][j]) : 
+                       fSSDLayer6->AddNode(fladder[1],ladderindex[i][j],flayermatrix[i][j]);
+       }
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgklayernumber; i++) delete [] ladderindex[i];
 }
 ////////////////////////////////////////////////////////////////////////////////
 void AliITSv11GeometrySSD::Layer5(TGeoVolume* moth){
@@ -3263,11 +4131,14 @@ void AliITSv11GeometrySSD::Layer5(TGeoVolume* moth){
   // Insert the layer 5 in the mother volume. 
   /////////////////////////////////////////////////////////////
   if (! moth) {
-    printf("Error::AliITSv11GeometrySSD: Can't insert layer5, mother is null!\n");
+    AliError("Can't insert layer5, mother is null!\n");
     return;
   };
-        fMotherVol = moth;
-        moth->AddNode(GetLayer(5),1,0);
+  if(!fSSDLayer5) SetLayer();
+  fMotherVol = moth;
+  TGeoTranslation* centerITSlayer5trans = new TGeoTranslation(0.,0.,-0.5*fgkSSDLay5LadderLength
+                                                                               + fgkLay5CenterITSPosition);
+  moth->AddNode(fSSDLayer5,1,centerITSlayer5trans);
  }
 ////////////////////////////////////////////////////////////////////////////////
 void AliITSv11GeometrySSD::Layer6(TGeoVolume* moth){
@@ -3275,86 +4146,4014 @@ void AliITSv11GeometrySSD::Layer6(TGeoVolume* moth){
   // Insert the layer 6 in the mother volume. 
   /////////////////////////////////////////////////////////////
   if (! moth) {
-    printf("Error::AliITSv11GeometrySSD: Can't insert layer6, mother is null!\n");
+    AliError("AliITSv11GeometrySSD: Can't insert layer6, mother is null!\n");
     return;
   };
-        fMotherVol = moth;
-        moth->AddNode(GetLayer(6),1,0);
+  if(!fSSDLayer6) SetLayer();
+  fMotherVol = moth;
+  TGeoTranslation* centerITSlayer6trans = new TGeoTranslation(0.,0.,-0.5*fgkSSDLay6LadderLength
+                                                                               + fgkLay6CenterITSPosition);
+  moth->AddNode(fSSDLayer6,1,centerITSlayer6trans);
  }
-////////////////////////////////////////////////////////////////////////////////
-TGeoArb8* AliITSv11GeometrySSD::GetTrapezoidShape(TVector3* vertexpos[], 
-                                                       Double_t* width, Double_t height, char* shapename) const{
+ ////////////////////////////////////////////////////////////////////////////////
+ TList* AliITSv11GeometrySSD::GetMountingBlockSupport(Int_t nedges){
   /////////////////////////////////////////////////////////////
-  // Method generating a trapezoid shape 
+  // Method generating the Arc structure of Ladder Support 
   /////////////////////////////////////////////////////////////
-  const Int_t kvertexnumber = 4;
-  const Int_t ktransvectnumber = 2;
-  TVector3* vertex[kvertexnumber];
-  TVector3* transvector[2];
-  for(Int_t i=0; i<ktransvectnumber; i++) 
-                                                                       transvector[i] = new TVector3(0.,width[i]);
-  /////////////////////////////////////////////////////////////
-  //Setting the vertices
-  /////////////////////////////////////////////////////////////
-  vertex[0] = new TVector3(*vertexpos[0]);
-  vertex[1] = new TVector3(*vertexpos[1]);
-  vertex[2] = new TVector3(*vertex[1]+*transvector[1]);
-  vertex[3] = new TVector3(*vertex[0]+*transvector[0]);
-  TGeoArb8* trapezoidshape = new TGeoArb8(shapename,0.5*height);
-  for(Int_t i=0; i<2*kvertexnumber; i++) 
-       trapezoidshape->SetVertex(i,vertex[(i<kvertexnumber ? i : i-kvertexnumber)]->X(),
-                                                               vertex[(i<kvertexnumber ? i : i-kvertexnumber)]->Y()); 
-  return trapezoidshape;
+  const Int_t kssdlayladdernumber[fgklayernumber] = 
+                       {fgkSSDLay5LadderNumber,fgkSSDLay6LadderNumber};
+  Double_t mountingsupportedge[fgklayernumber];
+  Double_t mountingblockratio[fgklayernumber];
+  Double_t theta[fgklayernumber];
+  Double_t phi[fgklayernumber];
+  Double_t psi0[fgklayernumber];
+  Double_t deltapsi[fgklayernumber];
+  TVector3* mountingsupportedgevector[fgklayernumber];
+  for(Int_t i=0; i<fgklayernumber; i++){
+       mountingblockratio[i] = fgkSSDMountingBlockLength[0]/fgkMountingBlockSupportRadius[i];
+    mountingsupportedge[i]    = 0.5*fgkMountingBlockSupportRadius[i]
+                                                          * (TMath::Sqrt((2.-mountingblockratio[i])*(2.+mountingblockratio[i]))
+                                                         * TMath::Sin(2.0*TMath::Pi()/kssdlayladdernumber[i])
+                                                         - mountingblockratio[i]*(1.0+TMath::Cos(2.0*TMath::Pi()
+                                                         / kssdlayladdernumber[i])));
+    theta[i] = TMath::ASin(0.5*mountingblockratio[i]+mountingsupportedge[i]/fgkMountingBlockSupportRadius[i]);
+    phi[i]   = TMath::ASin(0.5*mountingblockratio[i]);
+       mountingsupportedgevector[i] = new TVector3();
+        mountingsupportedgevector[i]->SetX(-0.5*fgkSSDMountingBlockLength[0]);
+       mountingsupportedgevector[i]->SetY(fgkMountingBlockSupportRadius[i]*TMath::Sqrt(
+                                                       (1.-mountingsupportedgevector[i]->X()/fgkMountingBlockSupportRadius[i])*
+                                                       (1.+mountingsupportedgevector[i]->X()/fgkMountingBlockSupportRadius[i])));
+    psi0[i] = 0.5*TMath::Pi()-phi[i];  
+    deltapsi[i] = (theta[i]+phi[i])/nedges;
+  }
+  TVector3** vertex[fgklayernumber];
+  TList* vertexlist[fgklayernumber];
+  Int_t indexedge[fgklayernumber] = {0,0};
+  for(Int_t i=0; i<fgklayernumber; i++){
+       vertex[i] = new TVector3*[nedges+1];
+       vertexlist[i] = new TList();
+  } 
+  for(Int_t i=0; i<fgklayernumber; i++){
+       for(Int_t j=0; j<nedges+1; j++){
+               vertex[i][j] = new TVector3(fgkMountingBlockSupportRadius[i]*TMath::Cos(psi0[i]+j*deltapsi[i]),
+                                           fgkMountingBlockSupportRadius[i]*TMath::Sin(psi0[i]+j*deltapsi[i]), 0);
+               if(vertex[i][j]->X()>mountingsupportedgevector[i]->X()) indexedge[i]++;
+               vertexlist[i]->Add(vertex[i][j]);
+       }
+       vertexlist[i]->AddAt(mountingsupportedgevector[i],indexedge[i]);
+  }
+  Double_t** xsidevertex = new Double_t*[fgklayernumber]; 
+  Double_t** ysidevertex = new Double_t*[fgklayernumber]; 
+  Double_t** xcentervertex = new Double_t*[fgklayernumber]; 
+  Double_t** ycentervertex = new Double_t*[fgklayernumber]; 
+  Double_t** xsidelowervertex = new Double_t*[fgklayernumber];
+  Double_t** ysidelowervertex = new Double_t*[fgklayernumber];  
+  Double_t** xcenterlowervertex = new Double_t*[fgklayernumber];
+  Double_t** ycenterlowervertex = new Double_t*[fgklayernumber];  
+  for(Int_t i=0; i<fgklayernumber; i++){
+    xsidevertex[i] = new Double_t[vertexlist[i]->GetSize()+2];
+    ysidevertex[i] = new Double_t[vertexlist[i]->GetSize()+2];
+    xcentervertex[i] = new Double_t[indexedge[i]+3];
+    ycentervertex[i] = new Double_t[indexedge[i]+3];
+       xsidelowervertex[i] = new Double_t[vertexlist[i]->GetSize()+1];
+       ysidelowervertex[i] = new Double_t[vertexlist[i]->GetSize()+1];
+       xcenterlowervertex[i] = new Double_t[indexedge[i]+3];
+       ycenterlowervertex[i] = new Double_t[indexedge[i]+3];
+       for(Int_t j=0; j<vertexlist[i]->GetSize(); j++){
+               xsidevertex[i][j!=vertexlist[i]->GetSize()-1?j+3:0] = 
+                                                                               ((TVector3*)vertexlist[i]->At(j))->X();
+               ysidevertex[i][j!=vertexlist[i]->GetSize()-1?j+3:0] = 
+                                                                               ((TVector3*)vertexlist[i]->At(j))->Y();
+               xsidelowervertex[i][j] = ((TVector3*)vertexlist[i]->At(vertexlist[i]->GetSize()-1-j))->X();
+               ysidelowervertex[i][j] = ((TVector3*)vertexlist[i]->At(vertexlist[i]->GetSize()-1-j))->Y();
+               if(j<indexedge[i]+1){
+                       xcentervertex[i][j!=indexedge[i]?j+3:0] = 
+                                                                               ((TVector3*)vertexlist[i]->At(j))->X();
+                       ycentervertex[i][j!=indexedge[i]?j+3:0] = 
+                                                                               ((TVector3*)vertexlist[i]->At(j))->Y();
+                       xcenterlowervertex[i][j+1] = ((TVector3*)vertexlist[i]->At(indexedge[i]-j))->X();
+                       ycenterlowervertex[i][j+1] = ((TVector3*)vertexlist[i]->At(indexedge[i]-j))->Y();
+               }
+       }
+       xsidevertex[i][1] = xsidevertex[i][0]; 
+       ysidevertex[i][1] = fgkMountingBlockSupportRadius[i]; 
+       xsidevertex[i][2] = xsidevertex[i][3]; 
+       ysidevertex[i][2] = fgkMountingBlockSupportRadius[i]; 
+       xcentervertex[i][1] = xcentervertex[i][0]; 
+       ycentervertex[i][1] = fgkMountingBlockSupportRadius[i]; 
+       xcentervertex[i][2] = xcentervertex[i][3]; 
+       ycentervertex[i][2] = fgkMountingBlockSupportRadius[i]; 
+       xsidelowervertex[i][vertexlist[i]->GetSize()] = xsidelowervertex[i][vertexlist[i]->GetSize()-1];
+       ysidelowervertex[i][vertexlist[i]->GetSize()] = ysidelowervertex[i][0];
+       xcenterlowervertex[i][0] = xcenterlowervertex[i][1];
+       ycenterlowervertex[i][0] = ysidevertex[i][0];
+       xcenterlowervertex[i][indexedge[i]+2] = xsidelowervertex[i][vertexlist[i]->GetSize()];
+       ycenterlowervertex[i][indexedge[i]+2] = ycenterlowervertex[i][0];
+  }
+  /////////////////////////////////////////////////////////////
+  // Building the Arc Structure of Ladder Supports 
+  /////////////////////////////////////////////////////////////
+  TGeoXtru* sidemountingblocksupportshape[fgklayernumber];
+  TGeoXtru* centermountingsupportshape[fgklayernumber];
+  TGeoXtru* sideladdersupportpieceshape[fgklayernumber];
+  TGeoXtru* centerladdersupportpieceshape[fgklayernumber];
+  TGeoVolume* sidemountingblocksupport[fgklayernumber];
+  TGeoVolume* centermountingblocksupport[fgklayernumber];
+  TGeoVolume* sideladdersupportpiece[fgklayernumber];
+  TGeoVolume* centerladdersupportpiece[fgklayernumber];
+  char sidemountingblockname[100];
+  char centermountingblockname[100];
+  char sideladdersupportpiecename[100];
+  char centerladdersupportpiecename[100];
+  for(Int_t i=0; i<fgklayernumber; i++){ 
+    snprintf(sidemountingblockname,100,"MountingBlockSupportSideLay%dArc",i+5);
+    snprintf(centermountingblockname,100,"MountingBlockSupportCenterLay%dArc",i+5);
+    snprintf(sideladdersupportpiecename,100,"SideLadderSupportPieceLay%d",i+5);
+    snprintf(centerladdersupportpiecename,100,"CenterLadderSupportPieceLay%d",i+5);
+    sidemountingblocksupportshape[i] = new TGeoXtru(2);
+    sidemountingblocksupportshape[i]->DefinePolygon(vertexlist[i]->GetSize()+2,
+                                                                                               xsidevertex[i],ysidevertex[i]);
+    sidemountingblocksupportshape[i]->DefineSection(0,fgkMountingBlockSupportWidth[1]
+                                                                                                        -fgkMountingBlockSupportWidth[0]);
+    sidemountingblocksupportshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+    sidemountingblocksupport[i] = new TGeoVolume(sidemountingblockname,
+                                                                         sidemountingblocksupportshape[i],
+                                                                                 fSSDAlCoolBlockMedium);
+       sidemountingblocksupport[i]->SetLineColor(9);
+       centermountingsupportshape[i] = new TGeoXtru(2);
+    centermountingsupportshape[i]->DefinePolygon(indexedge[i]+3,
+                                                                                               xcentervertex[i],ycentervertex[i]);
+       centermountingsupportshape[i]->DefineSection(0,0.);
+    centermountingsupportshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]
+                                                                                                 -fgkMountingBlockSupportWidth[0]);
+
+    centermountingblocksupport[i] = new TGeoVolume(centermountingblockname,
+                                                                         centermountingsupportshape[i],
+                                                                                 fSSDAlCoolBlockMedium);
+       centermountingblocksupport[i]->SetLineColor(9);
+       sideladdersupportpieceshape[i] = new TGeoXtru(2);
+    sideladdersupportpieceshape[i]->DefinePolygon(vertexlist[i]->GetSize()+1,
+                                                                                               xsidelowervertex[i],ysidelowervertex[i]);
+       sideladdersupportpieceshape[i]->DefineSection(0,fgkMountingBlockSupportWidth[1]
+                                                                                                        -fgkMountingBlockSupportWidth[0]);
+    sideladdersupportpieceshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+    sideladdersupportpiece[i] = new TGeoVolume(sideladdersupportpiecename,
+                                                                         sideladdersupportpieceshape[i],
+                                                                                 fSSDCarbonFiberMedium);
+       sideladdersupportpiece[i]->SetLineColor(fColorAl);
+       centerladdersupportpieceshape[i] = new TGeoXtru(2);
+    centerladdersupportpieceshape[i]->DefinePolygon(indexedge[i]+3,
+                                                                                               xcenterlowervertex[i],ycenterlowervertex[i]);
+       centerladdersupportpieceshape[i]->DefineSection(0,0.0);
+    centerladdersupportpieceshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]
+                                                                                                 -fgkMountingBlockSupportWidth[0]);
+    centerladdersupportpiece[i] = new TGeoVolume(centerladdersupportpiecename,
+                                                                         centerladdersupportpieceshape[i],
+                                                                                 fSSDCarbonFiberMedium);
+       centerladdersupportpiece[i]->SetLineColor(fColorAl);
+  }
+  /////////////////////////////////////////////////////////////
+  // Building the Up Structure of Ladder Supports 
+  /////////////////////////////////////////////////////////////
+  TGeoBBox** mountingblocksupportboxupshape[fgklayernumber];   
+  for(Int_t i=0; i<fgklayernumber; i++) mountingblocksupportboxupshape[i] = new TGeoBBox*[2];
+  TGeoBBox** mountingblocksupportboxdownshape[fgklayernumber]; 
+  for(Int_t i=0; i<fgklayernumber; i++) mountingblocksupportboxdownshape[i] = new TGeoBBox*[2];
+  TGeoVolume** mountingblocksupportboxdown[fgklayernumber];
+  //////////////////////////////////////////////////////////
+  // Setting the volume for TGeoXtru Mounting Block Piece  
+  //////////////////////////////////////////////////////////
+  TGeoVolume** mountingblocksupportboxup[fgklayernumber];
+  TGeoXtru* mountingblockpiecedownshape[fgklayernumber];
+  TGeoVolume* mountingblockpiecedown[fgklayernumber];
+  TGeoXtru* mountingblockpieceupshape[fgklayernumber];
+  TGeoVolume* mountingblockpieceup[fgklayernumber];
+  Double_t mountingblockpieceupxvertex[fgklayernumber][8];
+  Double_t mountingblockpieceupyvertex[fgklayernumber][8];
+  Double_t mountingblockpiecedownxvertex[fgklayernumber][8];
+  Double_t mountingblockpiecedownyvertex[fgklayernumber][8];
+  char mountingblockpiecedownname[100];
+  char mountingblockpieceupname[100];
+  for(Int_t i=0; i<fgklayernumber; i++){
+    ///////////////////////////
+    // Mounting Block Down Vertex
+    ///////////////////////////
+       mountingblockpiecedownshape[i] = new TGeoXtru(2);
+       snprintf(mountingblockpiecedownname,100,"MountingBlockPieceDownLay%d",i+5);
+       mountingblockpiecedownxvertex[i][0] = -0.5*fgkSSDMountingBlockLength[0];        
+       mountingblockpiecedownyvertex[i][0] = fgkMountingBlockSupportRadius[i]
+                                             + fgkMountingBlockSupportDownHeight 
+                                              - fgkSSDLadderVerticalDisalignment;
+       mountingblockpiecedownxvertex[i][1] = mountingblockpiecedownxvertex[i][0];      
+       mountingblockpiecedownyvertex[i][1] = mountingblockpiecedownyvertex[i][0]
+                                                                               + fgkSSDMountingBlockHeight[1]
+                                                                               - 0.5*fgkCoolingTubeSupportHeight
+                                                                               - fgkSSDModuleCoolingBlockToSensor;
+       mountingblockpiecedownxvertex[i][2] = 0.5*fgkSSDMountingBlockLength[0]; 
+       mountingblockpiecedownyvertex[i][2] = mountingblockpiecedownyvertex[i][1];
+       mountingblockpiecedownxvertex[i][3] = mountingblockpiecedownxvertex[i][2];      
+       mountingblockpiecedownyvertex[i][3] = mountingblockpiecedownyvertex[i][0];
+       mountingblockpiecedownxvertex[i][4] = 0.5*fgkSSDMountingBlockLength[1];
+       mountingblockpiecedownyvertex[i][4] = mountingblockpiecedownyvertex[i][0];
+       mountingblockpiecedownxvertex[i][5] = mountingblockpiecedownxvertex[i][4];
+       mountingblockpiecedownyvertex[i][5] = mountingblockpiecedownyvertex[i][4]
+                                                                               + fgkSSDMountingBlockHeight[2]
+                                                                               - fgkSSDMountingBlockHeight[0];
+       mountingblockpiecedownxvertex[i][6] = -mountingblockpiecedownxvertex[i][4];
+       mountingblockpiecedownyvertex[i][6] = mountingblockpiecedownyvertex[i][5];
+       mountingblockpiecedownxvertex[i][7] = mountingblockpiecedownxvertex[i][6];      
+       mountingblockpiecedownyvertex[i][7] = mountingblockpiecedownyvertex[i][0];
+       mountingblockpiecedownshape[i]->DefinePolygon(8,mountingblockpiecedownxvertex[i],
+                                                                                                        mountingblockpiecedownyvertex[i]);
+       mountingblockpiecedownshape[i]->DefineSection(0,0.0);
+       mountingblockpiecedownshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+       mountingblockpiecedown[i] = new TGeoVolume(mountingblockpiecedownname,
+                                                                mountingblockpiecedownshape[i],fSSDMountingBlockMedium);
+       mountingblockpiecedown[i]->SetLineColor(fColorG10);
+
+    ///////////////////////////
+    // Mounting Block Up Vertex
+    ///////////////////////////
+       mountingblockpieceupshape[i] = new TGeoXtru(2);
+       snprintf(mountingblockpieceupname,100,"MountingBlockPieceUpLay%d",i+5);
+       mountingblockpieceupxvertex[i][0] = -0.5*fgkSSDMountingBlockLength[0];  
+       mountingblockpieceupyvertex[i][0] = fgkMountingBlockSupportRadius[i]
+                                                                               + fgkMountingBlockSupportUpHeight[i]
+                                              - fgkSSDLadderVerticalDisalignment;
+       mountingblockpieceupxvertex[i][1] = mountingblockpieceupxvertex[i][0];  
+       mountingblockpieceupyvertex[i][1] = mountingblockpieceupyvertex[i][0]
+                                                                               + fgkSSDMountingBlockHeight[1]
+                                                                               - 0.5*fgkCoolingTubeSupportHeight
+                                                                               - fgkSSDModuleCoolingBlockToSensor;
+       mountingblockpieceupxvertex[i][2] = 0.5*fgkSSDMountingBlockLength[0];   
+       mountingblockpieceupyvertex[i][2] = mountingblockpieceupyvertex[i][1];
+       mountingblockpieceupxvertex[i][3] = mountingblockpieceupxvertex[i][2];  
+       mountingblockpieceupyvertex[i][3] = mountingblockpieceupyvertex[i][0];
+       mountingblockpieceupxvertex[i][4] = 0.5*fgkSSDMountingBlockLength[1];
+       mountingblockpieceupyvertex[i][4] = mountingblockpieceupyvertex[i][0];
+       mountingblockpieceupxvertex[i][5] = mountingblockpieceupxvertex[i][4];
+       mountingblockpieceupyvertex[i][5] = mountingblockpieceupyvertex[i][4]
+                                                                               + fgkSSDMountingBlockHeight[2]
+                                                                               - fgkSSDMountingBlockHeight[0];
+       mountingblockpieceupxvertex[i][6] = -mountingblockpieceupxvertex[i][4];
+       mountingblockpieceupyvertex[i][6] = mountingblockpieceupyvertex[i][5];
+       mountingblockpieceupxvertex[i][7] = mountingblockpieceupxvertex[i][6];  
+       mountingblockpieceupyvertex[i][7] = mountingblockpieceupyvertex[i][0];
+
+       mountingblockpieceupshape[i]->DefinePolygon(8,mountingblockpieceupxvertex[i],
+                                                                                                        mountingblockpieceupyvertex[i]);
+       mountingblockpieceupshape[i]->DefineSection(0,0.0);
+       mountingblockpieceupshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+       mountingblockpieceup[i] = new TGeoVolume(mountingblockpieceupname,
+                                                               mountingblockpieceupshape[i],fSSDMountingBlockMedium);
+       mountingblockpieceup[i]->SetLineColor(fColorG10);
+ }
+  ///////////////////////////////////////////////////////////////////
+  // Setting the volume for TGeoXtru Mounting Block Support Trapezoid  
+  ///////////////////////////////////////////////////////////////////
+  TGeoXtru* mountingblocksupportrapezoidownshape[fgklayernumber];
+  TGeoXtru* mountingblocksupportrapezoidupshape[fgklayernumber];
+  TGeoVolume* mountingblocksupportrapezoidown[fgklayernumber];
+  TGeoVolume* mountingblocksupportrapezoidup[fgklayernumber];
+  Double_t mountingblocksupportrapezoidownxvertex[fgklayernumber][5];
+  Double_t mountingblocksupportrapezoidownyvertex[fgklayernumber][5];
+  Double_t mountingblocksupportrapezoidupxvertex[fgklayernumber][5];
+  Double_t mountingblocksupportrapezoidupyvertex[fgklayernumber][5];
+  char mountingblocksupportrapezoidowname[100];
+  char mountingblocksupportrapezoidupname[100];
+  Double_t scalefactor = 3./4.;
+  for(Int_t i=0; i<fgklayernumber; i++){
+  ////////////////////////////////////////////
+  // Mounting Block Support Down Trapezoid Vertex 
+  ////////////////////////////////////////////
+       mountingblocksupportrapezoidownshape[i] = new TGeoXtru(2);
+       mountingblocksupportrapezoidownxvertex[i][0] = -0.5*fgkSSDMountingBlockLength[0]
+                                                                                                - mountingsupportedge[i];
+       mountingblocksupportrapezoidownyvertex[i][0] = mountingblockpiecedownyvertex[i][0];
+       mountingblocksupportrapezoidownxvertex[i][1] = 
+                                                                               mountingblocksupportrapezoidownxvertex[i][0];
+       mountingblocksupportrapezoidownyvertex[i][1] = mountingblockpiecedownyvertex[i][0]
+                                                                                                + scalefactor*(mountingblockpiecedownyvertex[i][1]
+                                                                                            - mountingblockpiecedownyvertex[i][0]);
+       mountingblocksupportrapezoidownxvertex[i][2] = -0.5*fgkSSDSensorWidth;
+       mountingblocksupportrapezoidownyvertex[i][2] = mountingblockpiecedownyvertex[i][1]; 
+       mountingblocksupportrapezoidownxvertex[i][3] = mountingblockpiecedownxvertex[i][0];
+       mountingblocksupportrapezoidownyvertex[i][3] = mountingblocksupportrapezoidownyvertex[i][2];
+       mountingblocksupportrapezoidownxvertex[i][4] = mountingblocksupportrapezoidownxvertex[i][3];
+       mountingblocksupportrapezoidownyvertex[i][4] = mountingblocksupportrapezoidownyvertex[i][0];
+
+       mountingblocksupportrapezoidownshape[i]->DefinePolygon(5,mountingblocksupportrapezoidownxvertex[i],
+                                                                                                              mountingblocksupportrapezoidownyvertex[i]);
+       mountingblocksupportrapezoidownshape[i]->DefineSection(0,fgkMountingBlockSupportWidth[1]
+                                                                                                                       -fgkMountingBlockSupportWidth[0]);
+       mountingblocksupportrapezoidownshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+       snprintf(mountingblocksupportrapezoidowname,100,"MountingBlockSuppTrapezoidDownLay%d",i+5);
+       mountingblocksupportrapezoidown[i] = new TGeoVolume(mountingblocksupportrapezoidowname,
+                                                               mountingblocksupportrapezoidownshape[i],fSSDCarbonFiberMedium);
+       mountingblocksupportrapezoidown[i]->SetLineColor(9);
+  ////////////////////////////////////////////
+  // Mounting Block Support Up Trapezoid Vertex 
+  ////////////////////////////////////////////
+       mountingblocksupportrapezoidupshape[i] = new TGeoXtru(2);
+       mountingblocksupportrapezoidupxvertex[i][0] = -0.5*fgkSSDMountingBlockLength[0]
+                                                                                                - mountingsupportedge[i];
+       mountingblocksupportrapezoidupyvertex[i][0] = mountingblockpieceupyvertex[i][0];
+       mountingblocksupportrapezoidupxvertex[i][1] = 
+                                                                               mountingblocksupportrapezoidupxvertex[i][0];
+       mountingblocksupportrapezoidupyvertex[i][1] = 
+                                                                                              mountingblockpieceupyvertex[i][0]
+                                                                                                + scalefactor*(mountingblockpieceupyvertex[i][1]
+                                                                                            - mountingblockpieceupyvertex[i][0]);
+       mountingblocksupportrapezoidupxvertex[i][2] = -0.5*fgkSSDSensorWidth;
+       mountingblocksupportrapezoidupyvertex[i][2] = mountingblockpieceupyvertex[i][1]; 
+       mountingblocksupportrapezoidupxvertex[i][3] = mountingblockpieceupxvertex[i][0];
+       mountingblocksupportrapezoidupyvertex[i][3] = mountingblocksupportrapezoidupyvertex[i][2];
+       mountingblocksupportrapezoidupxvertex[i][4] = mountingblocksupportrapezoidupxvertex[i][3];
+       mountingblocksupportrapezoidupyvertex[i][4] = mountingblocksupportrapezoidupyvertex[i][0];
+
+       mountingblocksupportrapezoidupshape[i]->DefinePolygon(5,mountingblocksupportrapezoidupxvertex[i],
+                                                                                                              mountingblocksupportrapezoidupyvertex[i]);
+       mountingblocksupportrapezoidupshape[i]->DefineSection(0,fgkMountingBlockSupportWidth[1]
+                                                                                                                       -fgkMountingBlockSupportWidth[0]);
+       mountingblocksupportrapezoidupshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+       snprintf(mountingblocksupportrapezoidupname,100,"MountingBlockSuppTrapezoidUpLay%d",i+5);
+       mountingblocksupportrapezoidup[i] = new TGeoVolume(mountingblocksupportrapezoidupname,
+                                                               mountingblocksupportrapezoidupshape[i],fSSDCarbonFiberMedium);
+       mountingblocksupportrapezoidup[i]->SetLineColor(9);
+  }
+  ///////////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgklayernumber; i++) mountingblocksupportboxdown[i] = new TGeoVolume*[3];
+  for(Int_t i=0; i<fgklayernumber; i++) mountingblocksupportboxup[i] = new TGeoVolume*[3];
+  Double_t boxoriginup[fgklayernumber][2][3];
+  Double_t boxorigindown[fgklayernumber][2][3];
+  char mountingblocksupportboxdownname[100];
+  char mountingblocksupportboxupname[100];
+  TGeoRotation* mountingblocksupportrot = new TGeoRotation();
+  mountingblocksupportrot->SetAngles(90.,180.,-90);
+  TGeoRotation* globalrefladdersupportrot = new TGeoRotation();
+  globalrefladdersupportrot->SetAngles(0.,90.,0.);
+  TGeoHMatrix* laddersupportmatrix[2];
+  laddersupportmatrix[0] = new TGeoHMatrix(*globalrefladdersupportrot);
+  laddersupportmatrix[1] = new TGeoHMatrix((*globalrefladdersupportrot)*(*mountingblocksupportrot));
+  /////////////////////////////////////////////////////////////
+  // Creating Mother Volume for Containment
+  /////////////////////////////////////////////////////////////
+  Double_t *xmothervertex[fgklayernumber];
+  Double_t *ymothervertex[fgklayernumber];
+  for(Int_t i=0; i<fgklayernumber; i++){
+       xmothervertex[i] = new Double_t[8];
+       ymothervertex[i] = new Double_t[8];
+  }  
+  TGeoXtru* downmotherladdersupportshape[fgklayernumber];
+  TGeoVolume* downmotherladdersupport[fgklayernumber]; 
+  TGeoXtru* upmotherladdersupportshape[fgklayernumber];
+  TGeoVolume* upmotherladdersupport[fgklayernumber]; 
+  char upmotheladdersupportname[100];
+  char downmotheladdersupportname[100];
+  for(Int_t i=0; i<fgklayernumber; i++){
+       xmothervertex[i][0] = -0.5*fgkSSDMountingBlockLength[0]
+                                                   -  mountingsupportedge[i];
+       ymothervertex[i][0] = -fgkMountingBlockSupportWidth[1];
+       xmothervertex[i][1] = xmothervertex[i][0];
+       ymothervertex[i][1] = -fgkMountingBlockSupportWidth[1]
+                                                       + fgkMountingBlockSupportWidth[0];
+       xmothervertex[i][2] = -0.5*fgkSSDMountingBlockLength[0];
+       ymothervertex[i][2] = ymothervertex[i][1];
+       xmothervertex[i][3] = xmothervertex[i][2];
+       ymothervertex[i][3] = -ymothervertex[i][0];
+       xmothervertex[i][4] = -xmothervertex[i][0];
+       ymothervertex[i][4] = ymothervertex[i][3];
+       xmothervertex[i][5] = xmothervertex[i][4];
+       ymothervertex[i][5] = -ymothervertex[i][1];
+       xmothervertex[i][6] = -xmothervertex[i][2];
+       ymothervertex[i][6] = ymothervertex[i][5];
+       xmothervertex[i][7] = xmothervertex[i][6];
+       ymothervertex[i][7] = ymothervertex[i][0];
+
+       snprintf(downmotheladdersupportname,100,"LadderSupportDownLay%d",i+5);
+       snprintf(upmotheladdersupportname,100,"LadderSupportUpLay%d",i+5);
+
+       downmotherladdersupportshape[i] = new TGeoXtru(2);
+       downmotherladdersupportshape[i]->DefinePolygon(8,xmothervertex[i],ymothervertex[i]);
+       downmotherladdersupportshape[i]->DefineSection(0,ysidevertex[i][0]);
+       downmotherladdersupportshape[i]->DefineSection(1,ysidevertex[i][1]
+                                                                  +                       fgkMountingBlockSupportDownHeight
+                                                                  +                       fgkSSDMountingBlockHeight[1]
+                                                                  -                       0.5*fgkCoolingTubeSupportHeight
+                                                                  -                       fgkSSDModuleCoolingBlockToSensor
+                                                      - fgkSSDLadderVerticalDisalignment);
+       
+//                                                - fgkSSDModuleVerticalDisalignment);
+       //downmotherladdersupport[i] = new TGeoVolumeAssembly(downmotheladdersupportname);
+
+        downmotherladdersupport[i] = new TGeoVolume(downmotheladdersupportname,
+                                                                         downmotherladdersupportshape[i],fSSDAir);
+    upmotherladdersupportshape[i] = new TGeoXtru(2);
+       upmotherladdersupportshape[i]->DefinePolygon(8,xmothervertex[i],ymothervertex[i]);
+       upmotherladdersupportshape[i]->DefineSection(0,ysidevertex[i][0]);
+    upmotherladdersupportshape[i]->DefineSection(1,ysidevertex[i][1]
+                                                                  +                       fgkMountingBlockSupportUpHeight[i]
+                                                                  +                       fgkSSDMountingBlockHeight[1]
+                                                                  -                       0.5*fgkCoolingTubeSupportHeight
+                                                                  -                       fgkSSDModuleCoolingBlockToSensor
+                                                - fgkSSDLadderVerticalDisalignment);
+
+     upmotherladdersupport[i] = new TGeoVolume(upmotheladdersupportname,
+                                                                                         upmotherladdersupportshape[i],fSSDAir);
+  }
+  for(Int_t i=0; i<fgklayernumber; i++){
+       /////////////////////////
+       // Setting the box origin
+       /////////////////////////
+       boxorigindown[i][0][0] = -0.5*mountingsupportedge[i];
+       boxorigindown[i][0][1] =  fgkMountingBlockSupportRadius[i]
+                                                  +  0.5*fgkMountingBlockSupportDownHeight
+                                 - 0.5*fgkSSDLadderVerticalDisalignment;
+       boxorigindown[i][0][2] =  fgkMountingBlockSupportWidth[1]
+                                                  -  0.5*fgkMountingBlockSupportWidth[0];
+  
+       boxorigindown[i][1][0] = 0.0;
+       boxorigindown[i][1][1] = boxorigindown[i][0][1];
+       boxorigindown[i][1][2] = 0.5*(fgkMountingBlockSupportWidth[1]
+                                                  -      fgkMountingBlockSupportWidth[0]);
+                                                  
+       boxoriginup[i][0][0] = -0.5*mountingsupportedge[i];
+       boxoriginup[i][0][1] = fgkMountingBlockSupportRadius[i]
+                              + 0.5*fgkMountingBlockSupportUpHeight[i]
+                              - 0.5*fgkSSDLadderVerticalDisalignment;
+       boxoriginup[i][0][2] = fgkMountingBlockSupportWidth[1]
+                                                - 0.5*fgkMountingBlockSupportWidth[0];
+  
+       boxoriginup[i][1][0] = 0.0;
+       boxoriginup[i][1][1] = boxoriginup[i][0][1];
+       boxoriginup[i][1][2] = 0.5*(fgkMountingBlockSupportWidth[1]
+                                                - fgkMountingBlockSupportWidth[0]);
+  
+       /////////////////////////
+    // Setting the boxes    
+       /////////////////////////
+       mountingblocksupportboxdownshape[i][0] = new TGeoBBox(0.5*(mountingsupportedge[i]
+                                                                                +  fgkSSDMountingBlockLength[0]),
+                                                                                       0.5*fgkMountingBlockSupportDownHeight - 0.5*fgkSSDLadderVerticalDisalignment,
+                                                                                       0.5*fgkMountingBlockSupportWidth[0],
+                                                                                       boxorigindown[i][0]);
+       mountingblocksupportboxdownshape[i][1] = new TGeoBBox(0.5*fgkSSDMountingBlockLength[0],
+                                                                                       0.5*fgkMountingBlockSupportDownHeight - 0.5*fgkSSDLadderVerticalDisalignment,
+                                                                                       0.5*(fgkMountingBlockSupportWidth[1]
+                                                                                -  fgkMountingBlockSupportWidth[0]),
+                                                                                       boxorigindown[i][1]);
+                                                                                       
+       mountingblocksupportboxupshape[i][0] = new TGeoBBox(0.5*(mountingsupportedge[i]
+                                                                                +  fgkSSDMountingBlockLength[0]),
+                                                                                       0.5*fgkMountingBlockSupportUpHeight[i] - 0.5*fgkSSDLadderVerticalDisalignment,
+                                                                                       0.5*fgkMountingBlockSupportWidth[0],
+                                                                                       boxoriginup[i][0]);
+
+       mountingblocksupportboxupshape[i][1] = new TGeoBBox(0.5*fgkSSDMountingBlockLength[0],
+                                                                                       0.5*fgkMountingBlockSupportUpHeight[i] - 0.5*fgkSSDLadderVerticalDisalignment,
+                                                                                       0.5*(fgkMountingBlockSupportWidth[1]
+                                                                    -  fgkMountingBlockSupportWidth[0]),
+                                                                                       boxoriginup[i][1]);
+       ///////////////////////////////////////
+       // Adding the Volumes to Mother Volume    
+       ///////////////////////////////////////
+       for(Int_t j=0; j<2; j++){
+         snprintf(mountingblocksupportboxdownname,100,"MountingBlockSuppDownLay%dBox%d",i+5,j+1);
+         snprintf(mountingblocksupportboxupname,100,"MountingBlockSuppUpLay%dBox%d",i+5,j+1);
+         mountingblocksupportboxdown[i][j] = new TGeoVolume(mountingblocksupportboxdownname,
+                                                            mountingblocksupportboxdownshape[i][j],
+                                                            fSSDCarbonFiberMedium);
+         mountingblocksupportboxup[i][j] = new TGeoVolume(mountingblocksupportboxupname,
+                                                          mountingblocksupportboxupshape[i][j],
+                                                          fSSDCarbonFiberMedium);
+               mountingblocksupportboxdown[i][j]->SetLineColor(9);
+               mountingblocksupportboxup[i][j]->SetLineColor(9);
+               for(Int_t k=0; k<2; k++){
+                       downmotherladdersupport[i]->AddNode(mountingblocksupportboxdown[i][j],k+1,laddersupportmatrix[k]);
+                       upmotherladdersupport[i]->AddNode(mountingblocksupportboxup[i][j],k+1,laddersupportmatrix[k]);
+               }
+       }
+       for(Int_t k=0; k<2; k++){
+               downmotherladdersupport[i]->AddNode(centermountingblocksupport[i],k+1,laddersupportmatrix[k]);
+               downmotherladdersupport[i]->AddNode(sidemountingblocksupport[i],k+1,laddersupportmatrix[k]);
+               downmotherladdersupport[i]->AddNode(sideladdersupportpiece[i],k+1,laddersupportmatrix[k]);
+               downmotherladdersupport[i]->AddNode(centerladdersupportpiece[i],k+1,laddersupportmatrix[k]);
+               downmotherladdersupport[i]->AddNode(mountingblockpiecedown[i],k+1,laddersupportmatrix[k]);
+               downmotherladdersupport[i]->AddNode(mountingblocksupportrapezoidown[i],k+1,laddersupportmatrix[k]);
+               upmotherladdersupport[i]->AddNode(centermountingblocksupport[i],k+1,laddersupportmatrix[k]);
+               upmotherladdersupport[i]->AddNode(sidemountingblocksupport[i],k+1,laddersupportmatrix[k]);
+               upmotherladdersupport[i]->AddNode(sideladdersupportpiece[i],k+1,laddersupportmatrix[k]);
+               upmotherladdersupport[i]->AddNode(centerladdersupportpiece[i],k+1,laddersupportmatrix[k]);
+               upmotherladdersupport[i]->AddNode(mountingblockpieceup[i],k+1,laddersupportmatrix[k]);
+               upmotherladdersupport[i]->AddNode(mountingblocksupportrapezoidup[i],k+1,laddersupportmatrix[k]);
+       }
+  }
+  TList* laddersupportlist = new TList();
+  laddersupportlist->Add(downmotherladdersupport[0]); 
+  laddersupportlist->Add(upmotherladdersupport[0]); 
+  laddersupportlist->Add(downmotherladdersupport[1]); 
+  laddersupportlist->Add(upmotherladdersupport[1]); 
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgklayernumber; i++){
+       for(Int_t j=0; j<nedges+1; j++)
+               delete vertex[i][j];
+       delete mountingsupportedgevector[i];
+       delete [] vertex[i];
+       delete vertexlist[i];
+       delete [] xsidevertex[i];
+       delete [] ysidevertex[i];
+       delete [] xcentervertex[i];
+       delete [] ycentervertex[i];
+       delete [] xsidelowervertex[i];
+       delete [] ysidelowervertex[i];
+       delete [] xcenterlowervertex[i];
+       delete [] ycenterlowervertex[i];
+       delete [] xmothervertex[i];
+       delete [] ymothervertex[i];
+  }
+  delete [] xsidevertex;
+  delete [] ysidevertex;
+  delete [] xcentervertex;
+  delete [] ycentervertex;
+  delete [] xsidelowervertex;
+  delete [] ysidelowervertex;
+  delete [] xcenterlowervertex;
+  delete [] ycenterlowervertex;
+  delete globalrefladdersupportrot;
+  delete mountingblocksupportrot;
+  /////////////////////
+  return laddersupportlist;    
 }
+ ////////////////////////////////////////////////////////////////////////////////
+void AliITSv11GeometrySSD::SetLadderSupport(Int_t nedges){ 
+//////////////////////////////////////////
+// Method Generating Ladder Support Ring
+//////////////////////////////////////////
+  if(!fCreateMaterials) CreateMaterials();
+  if(!fTransformationMatrices) CreateTransformationMatrices();
+  if(!fBasicObjects) CreateBasicObjects();
+  fLay5LadderSupportRing = new TGeoVolumeAssembly("Lay5LadderSupportRing");
+  fLay6LadderSupportRing = new TGeoVolumeAssembly("Lay6LadderSupportRing");
+    const Int_t kssdlayladdernumber[fgklayernumber] = 
+                       {fgkSSDLay5LadderNumber,fgkSSDLay6LadderNumber};
+  Double_t mountingsupportedge[fgklayernumber];
+  Double_t mountingblockratio[fgklayernumber];
+  Double_t theta[fgklayernumber];
+  Double_t phi[fgklayernumber];
+  for(Int_t i=0; i<fgklayernumber; i++){
+       mountingblockratio[i] = fgkSSDMountingBlockLength[0]/fgkMountingBlockSupportRadius[i];
+    mountingsupportedge[i]    = 0.5*fgkMountingBlockSupportRadius[i]
+                                                          *(TMath::Sqrt((2.-mountingblockratio[i])*(2.+mountingblockratio[i]))
+                                                         * TMath::Sin(2.0*TMath::Pi()/kssdlayladdernumber[i])
+                                                         - mountingblockratio[i]*(1.0+TMath::Cos(2.0*TMath::Pi()
+                                                         / kssdlayladdernumber[i])));
+    theta[i] = TMath::ASin(0.5*mountingblockratio[i]+mountingsupportedge[i]
+                        / fgkMountingBlockSupportRadius[i]);
+    phi[i]   = TMath::ASin(0.5*mountingblockratio[i]);
+  }
+  TGeoRotation* globalrot = new TGeoRotation();
+  globalrot->SetAngles(0.,-90.,0.); 
+  TGeoRotation** laddersupportrot[fgklayernumber];
+  TGeoHMatrix**  laddersupportmatrix[fgklayernumber];
+  for(Int_t i=0; i<fgklayernumber; i++){               
+       laddersupportrot[i] = new TGeoRotation*[kssdlayladdernumber[i]];
+       laddersupportmatrix[i] = new TGeoHMatrix*[kssdlayladdernumber[i]];
+       for(Int_t j=0; j<kssdlayladdernumber[i]; j++){
+               laddersupportrot[i][j] = new TGeoRotation();
+               laddersupportrot[i][j]->SetAngles(j*(phi[i]+theta[i])*TMath::RadToDeg(),0.,0.);
+               switch(i){
+                       case 0: //Ladder of Layer5  
+                               laddersupportmatrix[i][j] = new TGeoHMatrix((*laddersupportrot[i][j])*(*globalrot));
+                               fLay5LadderSupportRing->AddNode(j%2==0?fLay5LadderSupport[0]:fLay5LadderSupport[1],j+1,
+                                                                           laddersupportmatrix[i][j]); 
+                       break;
+                       case 1: //Ladder of Layer6 
+                               laddersupportmatrix[i][j] = new TGeoHMatrix((*laddersupportrot[i][j])*(*globalrot));
+                               fLay6LadderSupportRing->AddNode(j%2==0?fLay6LadderSupport[0]:fLay6LadderSupport[1],j+1,
+                                                                             laddersupportmatrix[i][j]); 
+                       break;
+               }
+    }
+  }
+  /////////////////////////////////////////////////////////////
+  // Creating Lower Ladder Support 
+  /////////////////////////////////////////////////////////////
+  TVector3** ringsupportvertex[fgklayernumber];        
+  Double_t angle = 360./nedges;
+  for(Int_t i=0; i<fgklayernumber; i++){
+    ringsupportvertex[i] = new TVector3*[2*kssdlayladdernumber[i]+3+nedges];   
+       ringsupportvertex[i][0] = new TVector3(0.,fgkMountingBlockSupportRadius[i]
+                                          * TMath::Cos(theta[i]), 0);
+       ringsupportvertex[i][1] = new TVector3(-0.5*fgkSSDMountingBlockLength[0]
+                                                       -                          mountingsupportedge[i],
+                                              ringsupportvertex[i][0]->Y(), 0);
+       ringsupportvertex[i][2] = new TVector3(0.5*fgkSSDMountingBlockLength[0],
+                                              ringsupportvertex[i][1]->Y(),0);                                                                                 
+    ringsupportvertex[i][2]->RotateZ(theta[i]+phi[i]);
+       for(Int_t j=1; j<kssdlayladdernumber[i]; j++){
+          ringsupportvertex[i][2*j+1] = new TVector3(*ringsupportvertex[i][1]);        
+          ringsupportvertex[i][2*j+1]->RotateZ(j*(theta[i]+phi[i]));   
+          ringsupportvertex[i][2*j+2] = new TVector3(*ringsupportvertex[i][2]);        
+          ringsupportvertex[i][2*j+2]->RotateZ(j*(theta[i]+phi[i]));   
+       }
+       ringsupportvertex[i][2*kssdlayladdernumber[i]+1] = new TVector3(*ringsupportvertex[i][0]);
+    for(Int_t j=0; j<nedges+1; j++){
+               ringsupportvertex[i][2*kssdlayladdernumber[i]+2+j] = 
+                       new TVector3((ringsupportvertex[i][0]->Y()-fgkLadderSupportHeight)*CosD(90.0-j*angle),
+                              (ringsupportvertex[i][0]->Y()-fgkLadderSupportHeight)*SinD(90.0-j*angle), 0);
+       }
+  }
+  Double_t **xmothervertex = new Double_t*[fgklayernumber];
+  Double_t **ymothervertex = new Double_t*[fgklayernumber];
+  for(Int_t i=0; i<fgklayernumber; i++){
+       xmothervertex[i] = new Double_t[2*kssdlayladdernumber[i]+3+nedges];
+       ymothervertex[i] = new Double_t[2*kssdlayladdernumber[i]+3+nedges];
+       for(Int_t j=0; j<2*kssdlayladdernumber[i]+3+nedges; j++){
+               xmothervertex[i][j] = ringsupportvertex[i][j]->X();
+               ymothervertex[i][j] = ringsupportvertex[i][j]->Y();
+       }
+  }
+////////////////////////////////////////////////////////////////////////////////
+// Start Corrections 13/06/08
+////////////////////////////////////////////////////////////////////////////////
+  char lowerladderpconsupportname[100];
+  TGeoPcon* lowerladderpconsupportshape[fgklayernumber];
+  TGeoVolume* lowerladderpconsupport[fgklayernumber]; 
+  Double_t lowerladderpconezsection[2] = {0.,fgkMountingBlockSupportWidth[1]};
+  Double_t lowerladderpconradiusmax[fgklayernumber];
+  Double_t lowerladderpconradiusmin[fgklayernumber];
+  TGeoRotation* lowerladdersupportrot = new TGeoRotation();
+  lowerladdersupportrot->SetAngles(90.,180.,-90);
+  for(Int_t i=0; i<fgklayernumber; i++){
+       lowerladderpconradiusmax[i] = fgkMountingBlockSupportRadius[i]
+                                                               *                          TMath::Cos(theta[i]);
+    lowerladderpconradiusmin[i] = lowerladderpconradiusmax[i]-fgkLadderSupportHeight;
+  } 
+  for(Int_t i=0; i<fgklayernumber; i++){
+///////////////////////////  Modified Version ?///////////////////
+    lowerladderpconsupportshape[i] = new TGeoPcon(0.,360.,2);
+       for(Int_t j=0; j<2; j++) lowerladderpconsupportshape[i]->DefineSection(j,
+                                                        lowerladderpconezsection[j],lowerladderpconradiusmin[i],
+                                                        lowerladderpconradiusmax[i]);
+       snprintf(lowerladderpconsupportname,100,"LowerLadderPConSupportNameLay%d",i+5);
+       lowerladderpconsupport[i] = new TGeoVolume(lowerladderpconsupportname,lowerladderpconsupportshape[i],fSSDSupportRingAl);
+    lowerladderpconsupport[i]->SetLineColor(fColorAl);
+       (i==0 ? fLay5LadderSupportRing: fLay6LadderSupportRing)->AddNode(lowerladderpconsupport[i],1);
+       (i==0 ? fLay5LadderSupportRing: fLay6LadderSupportRing)->AddNode(lowerladderpconsupport[i],2,lowerladdersupportrot);
+ }
 ////////////////////////////////////////////////////////////////////////////////
-TGeoArb8* AliITSv11GeometrySSD::GetArbShape(TVector3* vertexpos[], Double_t* width, 
-                                                                       Double_t height, char* shapename, Int_t isign) const{
+// End Corrections 13/06/08
+////////////////////////////////////////////////////////////////////////////////
+  /*char lowerladdersupportname[30];
+  TGeoXtru* lowerladdersupportshape[fgklayernumber];
+  TGeoVolume* lowerladdersupport[fgklayernumber];
+  TGeoRotation* lowerladdersupportrot = new TGeoRotation();
+  lowerladdersupportrot->SetAngles(90.,180.,-90);
+  for(Int_t i=0; i<fgklayernumber; i++){
+       lowerladdersupportshape[i] = new TGeoXtru(2);
+       lowerladdersupportshape[i]->DefinePolygon(2*kssdlayladdernumber[i]+3+nedges,
+                                                                                         xmothervertex[i],ymothervertex[i]);
+       lowerladdersupportshape[i]->DefineSection(0,0.);
+    lowerladdersupportshape[i]->DefineSection(1,fgkMountingBlockSupportWidth[1]);
+       sprintf(lowerladdersupportname,"LowerLadderSupportNameLay%d",i+5);
+    lowerladdersupport[i] = new TGeoVolume(lowerladdersupportname,
+                                                       lowerladdersupportshape[i],fSSDSupportRingAl);
+       lowerladdersupport[i]->SetLineColor(fColorAl);
+       (i==0 ? fLay5LadderSupportRing: fLay6LadderSupportRing)->AddNode(lowerladdersupport[i],1);
+       (i==0 ? fLay5LadderSupportRing: fLay6LadderSupportRing)->AddNode(lowerladdersupport[i],2,lowerladdersupportrot);
+  }*/
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<fgklayernumber; i++){
+       for(Int_t j=0; j<2*kssdlayladdernumber[i]+3+nedges; j++)
+               delete ringsupportvertex[i][j];
+       delete [] ringsupportvertex[i];
+  }
+  for(Int_t i=0; i<fgklayernumber; i++){
+       delete [] xmothervertex[i];
+       delete [] ymothervertex[i];
+  }
+  delete [] xmothervertex;
+  delete [] ymothervertex; 
+  delete globalrot;
+  for(Int_t i=0; i<fgklayernumber; i++){
+       for(Int_t j=0; j<kssdlayladdernumber[i]; j++)
+               delete laddersupportrot[i][j];
+       delete [] laddersupportrot[i];
+  }
+ }  
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume* AliITSv11GeometrySSD::GetEndCapCoverPlate(){
+  /////////////////////////////////////////////////////////////
+  // Method generating Endcap CoverPlate
+  /////////////////////////////////////////////////////////////
+  // Holes Definition 
+  ///////////////////
+  Int_t nendcapcoverplateholedges = 30;
+  const Int_t kendcapcoverplatesmallholenumber[2] = {4,9}; 
+  Double_t holesection[2] = {-0.5*fgkEndCapCoverPlateThickness,
+                                                         0.5*fgkEndCapCoverPlateThickness};
+  TGeoShape* endcapcoverplatesmallholeshape = GetHoleShape(fgkEndCapCoverPlateSmallHoleRadius,
+                                                                                                             nendcapcoverplateholedges,holesection);
+  TGeoVolume* endcapcoverplatesmallhole = new TGeoVolume("EndCapCoverPlateSmallHole",
+                                                                                 endcapcoverplatesmallholeshape,fSSDAlCoolBlockMedium);
+  endcapcoverplatesmallhole->SetLineColor(6);
+  TGeoShape* endcapcoverplatebigholeshape = GetHoleShape(fgkEndCapCoverPlateBigHoleRadius,
+                                                                                                             nendcapcoverplateholedges,holesection);
+  TGeoVolume* endcapcoverplatebighole = new TGeoVolume("EndCapCoverPlateBigHole",
+                                                                                 endcapcoverplatebigholeshape,fSSDAlCoolBlockMedium);
+  endcapcoverplatebighole->SetLineColor(6);
+  //////////////////////////
+  // Screw Piece Definition 
+  //////////////////////////
+  Double_t smallscrewangle = 360.0/nendcapcoverplateholedges;
+  TGeoTube* endcapsmallscrewpieceshape = new TGeoTube(0.0,fgkEndCapCoverPlateSmallHoleRadius*
+                                                                                                     CosD(0.5*smallscrewangle),
+                                                                                                     0.5*fgkEndCapCoverPlateThickness);
+  TGeoVolume* endcapsmallscrewpiece = new TGeoVolume("EndCapCoverPlateSmallScrewPiece",
+                                                                                               endcapsmallscrewpieceshape,
+                                                                                               fSSDCoolingTubePhynox);
+  endcapsmallscrewpiece->SetLineColor(fColorPhynox);
+  ///////////////////
+  // Box Definition 
+  ///////////////////
+  TGeoBBox* endcapcoverplateboxshape[4];
+  TGeoVolume* endcapcoverplatebox[4];
+  Double_t boxorigin[5][3];
+  boxorigin[0][0] = 0.;
+  boxorigin[0][1] = 0.5*fgkEndCapCoverPlateSmallHoleSeparation[2];
+  boxorigin[0][2] = 0.;
+
+  boxorigin[1][0] = 0.5*fgkEndCapCoverPlateSmallHoleSeparation[0];
+  boxorigin[1][1] = 4.*fgkEndCapCoverPlateSmallHoleSeparation[2];
+  boxorigin[1][2] = 0.;
+
+  boxorigin[2][0] = 1.5*fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                 + fgkEndCapCoverPlateSmallHoleSeparation[1];
+  boxorigin[2][1] = boxorigin[1][1];
+  boxorigin[2][2] = 0.;
+
+  boxorigin[3][0] = fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                 + 0.5*fgkEndCapCoverPlateSmallHoleSeparation[1];
+  boxorigin[3][1] = boxorigin[1][1];
+  boxorigin[3][2] = 0.;
+
+  endcapcoverplateboxshape[0] = new TGeoBBox(fgkEndCapCoverPlateSmallHoleRadius,
+                                                                               0.5*(fgkEndCapCoverPlateSmallHoleSeparation[2]
+                                                -              2.*fgkEndCapCoverPlateSmallHoleRadius),
+                                                                           0.5*fgkEndCapCoverPlateThickness,boxorigin[0]);
+
+  endcapcoverplateboxshape[1] = new TGeoBBox(0.5*(fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                                                       -2.*fgkEndCapCoverPlateSmallHoleRadius),
+                                                                                    4.*fgkEndCapCoverPlateSmallHoleSeparation[2]
+                                                         +                              fgkEndCapCoverPlateSmallHoleRadius,
+                                                                                0.5*fgkEndCapCoverPlateThickness,boxorigin[1]);
+
+  endcapcoverplateboxshape[2] = new TGeoBBox(0.5*(fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                                                       -2.*fgkEndCapCoverPlateSmallHoleRadius),
+                                                                                    4.*fgkEndCapCoverPlateSmallHoleSeparation[2]
+                                                         +                              fgkEndCapCoverPlateSmallHoleRadius,
+                                                                                0.5*fgkEndCapCoverPlateThickness,boxorigin[2]);
+
+  endcapcoverplateboxshape[3] = new TGeoBBox(0.5*(fgkEndCapCoverPlateSmallHoleSeparation[1]
+                                                                       -2.*fgkEndCapCoverPlateSmallHoleRadius),
+                                                                                    4.*fgkEndCapCoverPlateSmallHoleSeparation[2]
+                                                         +                              fgkEndCapCoverPlateSmallHoleRadius,
+                                                                                0.5*fgkEndCapCoverPlateThickness,boxorigin[3]);
+  
+  endcapcoverplatebox[0] = new TGeoVolume("EndCapCoverPlateBox1",endcapcoverplateboxshape[0],
+                                                                          fSSDAlCoolBlockMedium);
+  endcapcoverplatebox[1] = new TGeoVolume("EndCapCoverPlateBox2",endcapcoverplateboxshape[1],
+                                                                          fSSDAlCoolBlockMedium);
+  endcapcoverplatebox[2] = new TGeoVolume("EndCapCoverPlateBox3",endcapcoverplateboxshape[2],
+                                                                          fSSDAlCoolBlockMedium);
+  endcapcoverplatebox[3] = new TGeoVolume("EndCapCoverPlateBox4",endcapcoverplateboxshape[3],
+                                                                          fSSDAlCoolBlockMedium);
+  endcapcoverplatebox[0]->SetLineColor(6);
+  endcapcoverplatebox[1]->SetLineColor(6);
+  endcapcoverplatebox[2]->SetLineColor(6);
+  endcapcoverplatebox[3]->SetLineColor(6);
+  Double_t endcapfillingboxorigin[3] = {fgkEndCapCoverPlateSmallHoleSeparation[0],0.,0.};
+  TGeoBBox* endcapfillingboxshape = new TGeoBBox(fgkEndCapCoverPlateSmallHoleRadius,
+                                                                                       fgkEndCapCoverPlateSmallHoleRadius,
+                                                                                       0.5*fgkEndCapCoverPlateThickness,
+                                                                                       endcapfillingboxorigin);
+  TGeoVolume* endcapfillingbox = new TGeoVolume("EndCapFillingBox",endcapfillingboxshape,
+                                                                          fSSDAlCoolBlockMedium);
+  endcapfillingbox->SetLineColor(6);
+  ////////////////////////////
+  // Contour shape Definition 
+  ////////////////////////////
+  const Int_t kcontourvertexnumber = 10;
+  Double_t xcontourvertex[kcontourvertexnumber];
+  Double_t ycontourvertex[kcontourvertexnumber];
+  xcontourvertex[0] = -fgkEndCapCoverPlateLength[0];
+  xcontourvertex[1] = xcontourvertex[0];
+  xcontourvertex[2] = fgkEndCapCoverPlateLength[1]-xcontourvertex[0];
+  xcontourvertex[3] = xcontourvertex[2];
+  xcontourvertex[4] = -fgkEndCapCoverPlateSmallHoleRadius;
+  xcontourvertex[5] = xcontourvertex[4];
+  xcontourvertex[6] = fgkEndCapCoverPlateLength[1]+fgkEndCapCoverPlateSmallHoleRadius;
+  xcontourvertex[7] = xcontourvertex[6];
+  xcontourvertex[8] = xcontourvertex[4];
+  xcontourvertex[9] = xcontourvertex[8];
+  ycontourvertex[0] = -0.5*(fgkEndCapCoverPlateWidth[0]-fgkEndCapCoverPlateWidth[2]
+                                       - (kendcapcoverplatesmallholenumber[1]-1)
+                                       * fgkEndCapCoverPlateSmallHoleSeparation[2]);
+  ycontourvertex[1] = (kendcapcoverplatesmallholenumber[1]-1)
+                                       * fgkEndCapCoverPlateSmallHoleSeparation[2]-ycontourvertex[0];
+  ycontourvertex[2] = ycontourvertex[1];
+  ycontourvertex[3] = ycontourvertex[0];
+  ycontourvertex[4] = ycontourvertex[3];
+  ycontourvertex[5] = -fgkEndCapCoverPlateSmallHoleRadius;
+  ycontourvertex[6] = ycontourvertex[5];
+  ycontourvertex[7] = (kendcapcoverplatesmallholenumber[1]-1)
+                                       * fgkEndCapCoverPlateSmallHoleSeparation[2]
+                                       + fgkEndCapCoverPlateSmallHoleRadius;
+  ycontourvertex[8] = ycontourvertex[7];
+  ycontourvertex[9] = ycontourvertex[0];
+
+  Double_t xboxin, dxboxin, yboxin, dyboxin;
+  Double_t xboxout, dxboxout, yboxout, dyboxout;
+  Double_t coordmin, coordmax;
+  coordmin = -fgkEndCapCoverPlateLength[0];
+  coordmax = fgkEndCapCoverPlateLength[1]-xcontourvertex[0];
+  xboxout = 0.5*(coordmin+coordmax);
+  dxboxout = 0.5*(coordmax-coordmin);
+  coordmin = -0.5*(fgkEndCapCoverPlateWidth[0]-fgkEndCapCoverPlateWidth[2]
+                                       - (kendcapcoverplatesmallholenumber[1]-1)
+                                       * fgkEndCapCoverPlateSmallHoleSeparation[2]);
+  coordmax = (kendcapcoverplatesmallholenumber[1]-1)
+                                       * fgkEndCapCoverPlateSmallHoleSeparation[2]-ycontourvertex[0];
+  yboxout = 0.5*(coordmin+coordmax);
+  dyboxout = 0.5*(coordmax-coordmin);
+  coordmin = -fgkEndCapCoverPlateSmallHoleRadius;
+  coordmax = fgkEndCapCoverPlateLength[1]+fgkEndCapCoverPlateSmallHoleRadius;
+  xboxin = 0.5*(coordmin+coordmax);
+  dxboxin = 0.5*(coordmax-coordmin);
+  coordmin = -fgkEndCapCoverPlateSmallHoleRadius;
+  coordmax = (kendcapcoverplatesmallholenumber[1]-1)
+                                       * fgkEndCapCoverPlateSmallHoleSeparation[2]
+                                       + fgkEndCapCoverPlateSmallHoleRadius;
+  yboxin = 0.5*(coordmin+coordmax);
+  dyboxin = 0.5*(coordmax-coordmin);
+  new TGeoBBox("EndCapCoverPlateContourBoxOut", dxboxout, dyboxout, 0.5*fgkEndCapCoverPlateThickness);
+  TGeoTranslation *trendCapCoverPlateContourboxout = new TGeoTranslation("SSD_trEndCapCoverPlateContourBoxOut",
+                                                         xboxout, yboxout, 0.);
+  trendCapCoverPlateContourboxout->RegisterYourself();
+  new TGeoBBox("EndCapCoverPlateContourBoxIn",  dxboxin, dyboxin, 0.5*fgkEndCapCoverPlateThickness+0.01);
+  TGeoTranslation *trendCapCoverPlateContourboxin = new TGeoTranslation("SSD_trEndCapCoverPlateContourBoxIn",
+                                                         xboxin, yboxin, 0.);
+  trendCapCoverPlateContourboxin->RegisterYourself();
+  TGeoCompositeShape *contourshape = new TGeoCompositeShape("contourShape", 
+        "EndCapCoverPlateContourBoxOut:SSD_trEndCapCoverPlateContourBoxOut-EndCapCoverPlateContourBoxIn:SSD_trEndCapCoverPlateContourBoxIn");
+
+  TGeoVolume* contour = new TGeoVolume("EndCapCoverPlateContour",contourshape,
+                                                                          fSSDAlCoolBlockMedium);
+  contour->SetLineColor(6);
+  /////////////////////////////
+  // Hole Contour Shape Definition 
+  ////////////////////////////
+  coordmin = xcontourvertex[0];
+  coordmax = coordmin+fgkEndCapCoverPlateLength[2];
+  xboxout = 0.5*(coordmin+coordmax);
+  dxboxout = 0.5*(coordmax-coordmin);
+  coordmin = ycontourvertex[1];
+  coordmax = ycontourvertex[1]+fgkEndCapCoverPlateWidth[2];
+  yboxout = 0.5*(coordmin+coordmax);
+  dyboxout = 0.5*(coordmax-coordmin);
+  coordmin = xcontourvertex[0]+ 0.5*(fgkEndCapCoverPlateLength[2]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  coordmax = coordmin + 2.*fgkEndCapCoverPlateBigHoleRadius;
+  xboxin = 0.5*(coordmin+coordmax);
+  dxboxin = 0.5*(coordmax-coordmin);
+  coordmin = ycontourvertex[1]+0.5*(fgkEndCapCoverPlateWidth[2]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);;
+  coordmax = coordmin +2.*fgkEndCapCoverPlateBigHoleRadius;
+  yboxin = 0.5*(coordmin+coordmax);
+  dyboxin = 0.5*(coordmax-coordmin);
+  new TGeoBBox("EndCapCoverPlateContourBoxOut1", dxboxout, dyboxout, 0.5*fgkEndCapCoverPlateThickness);
+  TGeoTranslation *trendCapCoverPlateContourboxout1 = new TGeoTranslation("SSD_trEndCapCoverPlateContourBoxOut1",
+                                                         xboxout, yboxout, 0.);
+  trendCapCoverPlateContourboxout1->RegisterYourself();
+  new TGeoBBox("EndCapCoverPlateContourBoxIn1",  dxboxin, dyboxin, 0.5*fgkEndCapCoverPlateThickness+0.01);
+  TGeoTranslation *trendCapCoverPlateContourboxin1 = new TGeoTranslation("SSD_trEndCapCoverPlateContourBoxIn1",
+                                                         xboxin, yboxin, 0.);
+  trendCapCoverPlateContourboxin1->RegisterYourself();
+  TGeoCompositeShape *contourshape1 = new TGeoCompositeShape("contourShape1", 
+        "EndCapCoverPlateContourBoxOut1:SSD_trEndCapCoverPlateContourBoxOut1-EndCapCoverPlateContourBoxIn1:SSD_trEndCapCoverPlateContourBoxIn1");
+
+
+  coordmin = xcontourvertex[0]+fgkEndCapCoverPlateLength[5];
+  coordmax = coordmin+fgkEndCapCoverPlateLength[2];
+  xboxout = 0.5*(coordmin+coordmax);
+  dxboxout = 0.5*(coordmax-coordmin);
+  coordmin = ycontourvertex[0]-(fgkEndCapCoverPlateWidth[1]
+                                                  - fgkEndCapCoverPlateWidth[0]);
+  coordmax = ycontourvertex[0];
+  yboxout = 0.5*(coordmin+coordmax);
+  dyboxout = 0.5*(coordmax-coordmin);
+  coordmin = xcontourvertex[0]+fgkEndCapCoverPlateLength[5]+ 0.5*(fgkEndCapCoverPlateLength[2]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  coordmax = coordmin + 2.*fgkEndCapCoverPlateBigHoleRadius;
+  xboxin = 0.5*(coordmin+coordmax);
+  dxboxin = 0.5*(coordmax-coordmin);
+  coordmin = ycontourvertex[0]-(fgkEndCapCoverPlateWidth[1]
+                                                  - fgkEndCapCoverPlateWidth[0])+0.5*(fgkEndCapCoverPlateWidth[1]
+                                                  - fgkEndCapCoverPlateWidth[0]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  coordmax = coordmin+2.*fgkEndCapCoverPlateBigHoleRadius;
+  yboxin = 0.5*(coordmin+coordmax);
+  dyboxin = 0.5*(coordmax-coordmin);
+  new TGeoBBox("EndCapCoverPlateContourBoxOut2", dxboxout, dyboxout, 0.5*fgkEndCapCoverPlateThickness);
+  TGeoTranslation *trendCapCoverPlateContourboxout2 = new TGeoTranslation("SSD_trEndCapCoverPlateContourBoxOut2",
+                                                         xboxout, yboxout, 0.);
+  trendCapCoverPlateContourboxout2->RegisterYourself();
+  new TGeoBBox("EndCapCoverPlateContourBoxIn2",  dxboxin, dyboxin, 0.5*fgkEndCapCoverPlateThickness+0.01);
+  TGeoTranslation *trendCapCoverPlateContourboxin2 = new TGeoTranslation("SSD_trEndCapCoverPlateContourBoxIn2",
+                                                         xboxin, yboxin, 0.);
+  trendCapCoverPlateContourboxin2->RegisterYourself();
+  TGeoCompositeShape *contourshape2 = new TGeoCompositeShape("contourShape2", 
+        "EndCapCoverPlateContourBoxOut2:SSD_trEndCapCoverPlateContourBoxOut2-EndCapCoverPlateContourBoxIn2:SSD_trEndCapCoverPlateContourBoxIn2");
+  
+//  const Int_t kholecontourvertexnumber = 10;
+
+  Double_t xholecontourvertex[2][kcontourvertexnumber];
+  Double_t yholecontourvertex[2][kcontourvertexnumber];
+  xholecontourvertex[0][0] = xcontourvertex[0];
+  xholecontourvertex[0][1] = xholecontourvertex[0][0];
+  xholecontourvertex[0][2] = xholecontourvertex[0][1]+fgkEndCapCoverPlateLength[2];
+  xholecontourvertex[0][3] = xholecontourvertex[0][2];
+  xholecontourvertex[0][4] = xholecontourvertex[0][0]
+                                                  + 0.5*(fgkEndCapCoverPlateLength[2]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  xholecontourvertex[0][5] = xholecontourvertex[0][4];
+  xholecontourvertex[0][6] = xholecontourvertex[0][5]
+                                                  + 2.*fgkEndCapCoverPlateBigHoleRadius;
+  xholecontourvertex[0][7] = xholecontourvertex[0][6];
+  xholecontourvertex[0][8] = xholecontourvertex[0][4];
+  xholecontourvertex[0][9] = xholecontourvertex[0][8];
+  
+  yholecontourvertex[0][0] = ycontourvertex[1];
+  yholecontourvertex[0][1] = yholecontourvertex[0][0]+fgkEndCapCoverPlateWidth[2];
+  yholecontourvertex[0][2] = yholecontourvertex[0][1];
+  yholecontourvertex[0][3] = yholecontourvertex[0][0];
+  yholecontourvertex[0][4] = yholecontourvertex[0][3];
+  yholecontourvertex[0][5] = yholecontourvertex[0][4]+0.5*(fgkEndCapCoverPlateWidth[2]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  yholecontourvertex[0][6] = yholecontourvertex[0][5];
+  yholecontourvertex[0][7] = yholecontourvertex[0][6]+2.*fgkEndCapCoverPlateBigHoleRadius;
+  yholecontourvertex[0][8] = yholecontourvertex[0][7];
+  yholecontourvertex[0][9] = yholecontourvertex[0][0];
+
+  xholecontourvertex[1][0] = xcontourvertex[0]+fgkEndCapCoverPlateLength[5];
+  xholecontourvertex[1][1] = xholecontourvertex[1][0];
+  xholecontourvertex[1][2] = xholecontourvertex[1][1]+fgkEndCapCoverPlateLength[2];
+  xholecontourvertex[1][3] = xholecontourvertex[1][2];
+  xholecontourvertex[1][4] = xholecontourvertex[1][0]
+                                                  + 0.5*(fgkEndCapCoverPlateLength[2]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  xholecontourvertex[1][5] = xholecontourvertex[1][4];
+  xholecontourvertex[1][6] = xholecontourvertex[1][5]
+                                                  + 2.*fgkEndCapCoverPlateBigHoleRadius;
+  xholecontourvertex[1][7] = xholecontourvertex[1][6];
+  xholecontourvertex[1][8] = xholecontourvertex[1][4];
+  xholecontourvertex[1][9] = xholecontourvertex[1][8];
+  
+  yholecontourvertex[1][0] = ycontourvertex[0]-(fgkEndCapCoverPlateWidth[1]
+                                                  - fgkEndCapCoverPlateWidth[0]);
+  yholecontourvertex[1][1] = ycontourvertex[0];
+  yholecontourvertex[1][2] = yholecontourvertex[1][1];
+  yholecontourvertex[1][3] = yholecontourvertex[1][0];
+  yholecontourvertex[1][4] = yholecontourvertex[1][3];
+  yholecontourvertex[1][5] = yholecontourvertex[1][4]+0.5*(fgkEndCapCoverPlateWidth[1]
+                                                  - fgkEndCapCoverPlateWidth[0]
+                                                  - 2.*fgkEndCapCoverPlateBigHoleRadius);
+  yholecontourvertex[1][6] = yholecontourvertex[1][5];
+  yholecontourvertex[1][7] = yholecontourvertex[1][6]+2.*fgkEndCapCoverPlateBigHoleRadius;
+  yholecontourvertex[1][8] = yholecontourvertex[1][7];
+  yholecontourvertex[1][9] = yholecontourvertex[1][0];
+
+  TGeoVolume* holecontour[2];
+  holecontour[0] = new TGeoVolume("EndCapCoverPlateContour1",contourshape1,
+                                                                 fSSDAlCoolBlockMedium);
+  holecontour[0]->SetLineColor(6);
+  holecontour[1] = new TGeoVolume("EndCapCoverPlateContour2",contourshape2,
+                                                                 fSSDAlCoolBlockMedium);
+  holecontour[1]->SetLineColor(6);
+  TGeoTranslation* holecontourtrans = new TGeoTranslation(fgkEndCapCoverPlateLength[3]
+                                                                       +     fgkEndCapCoverPlateLength[2],0.,0.);
+  TGeoTranslation*  bigholetrans[3];
+  bigholetrans[0] = new TGeoTranslation(xholecontourvertex[0][4]+fgkEndCapCoverPlateBigHoleRadius,
+                                                                               yholecontourvertex[0][7]-fgkEndCapCoverPlateBigHoleRadius,0.0);
+  bigholetrans[1] = new TGeoTranslation(xholecontourvertex[0][4]+fgkEndCapCoverPlateBigHoleRadius
+                                 +                     fgkEndCapCoverPlateLength[4],yholecontourvertex[0][7]
+                                 -                                             fgkEndCapCoverPlateBigHoleRadius,0.0);
+  bigholetrans[2] = new TGeoTranslation(xholecontourvertex[1][4]+fgkEndCapCoverPlateBigHoleRadius,
+                                                                               yholecontourvertex[1][5]+fgkEndCapCoverPlateBigHoleRadius,0.0);
+  /////////////////////////////////
+  // Mother Volume Xtru Definition 
+  /////////////////////////////////
+  const Int_t kmothervertexnumber = 12;
+  Double_t xmothervertex[kmothervertexnumber];  
+  Double_t ymothervertex[kmothervertexnumber];  
+  xmothervertex[0]  = xcontourvertex[0];
+  xmothervertex[1]  = xmothervertex[0];
+  xmothervertex[2]  = xmothervertex[1]+fgkEndCapCoverPlateLength[2];
+  xmothervertex[3]  = xmothervertex[2];
+  xmothervertex[4]  = xmothervertex[3]+fgkEndCapCoverPlateLength[3];
+  xmothervertex[5]  = xmothervertex[4];
+  xmothervertex[6]  = xmothervertex[5]+fgkEndCapCoverPlateLength[2];
+  xmothervertex[7]  = xmothervertex[6];
+  xmothervertex[8]  = xmothervertex[0]+fgkEndCapCoverPlateLength[5]
+                                       + fgkEndCapCoverPlateLength[2]; 
+  xmothervertex[9]  = xmothervertex[8];
+  xmothervertex[10] = xmothervertex[9]-fgkEndCapCoverPlateLength[2];
+  xmothervertex[11] = xmothervertex[10];
+  
+  ymothervertex[0]  = ycontourvertex[0];
+  ymothervertex[1]  = ymothervertex[0]+fgkEndCapCoverPlateWidth[0];
+  ymothervertex[2]  = ymothervertex[1];
+  ymothervertex[3]  = ycontourvertex[1];
+  ymothervertex[4]  = ymothervertex[3];
+  ymothervertex[5]  = ymothervertex[1];
+  ymothervertex[6]  = ymothervertex[5];
+  ymothervertex[7]  = ymothervertex[0];
+  ymothervertex[8]  = ymothervertex[7];
+  ymothervertex[9]  = ymothervertex[8]
+                                  - (fgkEndCapCoverPlateWidth[1]-fgkEndCapCoverPlateWidth[0]);
+  ymothervertex[10] = ymothervertex[9];
+  ymothervertex[11] = ymothervertex[8];
+  TGeoXtru* mothercoverplateshape = new TGeoXtru(2);
+  mothercoverplateshape->DefinePolygon(kmothervertexnumber,xmothervertex,ymothervertex);  
+  mothercoverplateshape->DefineSection(0,-0.5*fgkEndCapCoverPlateThickness);
+  mothercoverplateshape->DefineSection(1,+0.5*fgkEndCapCoverPlateThickness);
+  TGeoVolume* mothercoverplate = new TGeoVolume("EndCapCoverPlateMother",mothercoverplateshape,fSSDAir);
+  ////////////////////////////////////////
+  // Adding Nodes
+  ////////////////////////////////////////
+//  TGeoTranslation** endcapcoverplatesmallholetrans[kendcapcoverplatesmallholenumber[0]]; 
+  TGeoTranslation*** endcapcoverplatesmallholetrans;
+  endcapcoverplatesmallholetrans = new TGeoTranslation**[kendcapcoverplatesmallholenumber[0]]; 
+  Double_t transx[4] = {0,
+                                               fgkEndCapCoverPlateSmallHoleSeparation[0],
+                                               fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                        +  fgkEndCapCoverPlateSmallHoleSeparation[1],
+                                        2.*fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                        +  fgkEndCapCoverPlateSmallHoleSeparation[1]};
+  Int_t index = 0;
+  for(Int_t i=0; i<kendcapcoverplatesmallholenumber[0]; i++){
+       endcapcoverplatesmallholetrans[i] = 
+                                       new TGeoTranslation*[kendcapcoverplatesmallholenumber[1]];
+    for(Int_t j=0; j<kendcapcoverplatesmallholenumber[1]; j++){
+               index = kendcapcoverplatesmallholenumber[1]*i+j+1;
+           endcapcoverplatesmallholetrans[i][j] = 
+               new TGeoTranslation(transx[i],
+                                                       j*fgkEndCapCoverPlateSmallHoleSeparation[2],0.);
+           if(index!=10){ 
+                       mothercoverplate->AddNode(endcapcoverplatesmallhole,
+                                                                         index,endcapcoverplatesmallholetrans[i][j]);
+                       mothercoverplate->AddNode(endcapsmallscrewpiece,
+                                                                         index,endcapcoverplatesmallholetrans[i][j]);
+               }
+               if(j<kendcapcoverplatesmallholenumber[1]-1) 
+                       mothercoverplate->AddNode(endcapcoverplatebox[0],
+                                                                         index,endcapcoverplatesmallholetrans[i][j]);
+    }
+  }
+  mothercoverplate->AddNode(endcapcoverplatebox[1],1);
+  mothercoverplate->AddNode(endcapcoverplatebox[2],1);
+  mothercoverplate->AddNode(endcapcoverplatebox[3],1);
+  mothercoverplate->AddNode(endcapfillingbox,1);
+  mothercoverplate->AddNode(endcapcoverplatebighole,1,bigholetrans[0]);
+  mothercoverplate->AddNode(endcapcoverplatebighole,2,bigholetrans[1]);
+  mothercoverplate->AddNode(endcapcoverplatebighole,3,bigholetrans[2]);
+  mothercoverplate->AddNode(holecontour[0],1);
+  mothercoverplate->AddNode(holecontour[0],2,holecontourtrans);
+  mothercoverplate->AddNode(holecontour[1],1);  
+  mothercoverplate->AddNode(contour,1);
+  
+  for (Int_t i = 0; i < kendcapcoverplatesmallholenumber[0]; i++) 
+    delete [] endcapcoverplatesmallholetrans[i];
+  delete [] endcapcoverplatesmallholetrans;
+  /////////////////////////////////
+  return mothercoverplate;     
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume* AliITSv11GeometrySSD::GetEndCapCoolingTube(){
+  /////////////////////////////////////////////////////////////
+  // Getting EndCap Cooling Tube 
+  /////////////////////////////////////////////////////////////
+  TGeoTorus* endcapcoolingtubetorushape[5];
+  TGeoVolume* endcapcoolingtubetorus[5];
+  TGeoTube* endcapcoolingtubeshape[4];
+  TGeoVolume* endcapcoolingtube[4];
+  char endcapcoolingtubetorusname[100];
+  char endcapcoolingtubename[100];
+  TGeoTorus* endcapcoolingwatertubetorushape[5];
+  TGeoVolume* endcapcoolingwatertubetorus[5];
+  TGeoTube* endcapcoolingwatertubeshape[4];
+  TGeoVolume* endcapcoolingwatertube[4];
+  char endcapcoolingwatertubetorusname[100];
+  char endcapcoolingwatertubename[100];
+  for(Int_t i=0; i<5; i++){
+    snprintf(endcapcoolingtubetorusname,100,"EndCapCoolingTubeTorus%d",i+1);
+    snprintf(endcapcoolingtubename,100,"EndCapCoolingTube%d",i+1);
+    snprintf(endcapcoolingwatertubetorusname,100,"EndCapCoolingWaterTubeTorus%d",i+1);
+    snprintf(endcapcoolingwatertubename,100,"EndCapCoolingWaterTube%d",i+1);
+    if(i==3){
+      endcapcoolingtubetorushape[i] = new TGeoTorus(fgkEndCapCoolingTubeAxialRadius[0],
+                                                   fgkEndCapCoolingTubeRadiusMin,
+                                                   fgkEndCapCoolingTubeRadiusMax,
+                                                   90.0,fgkEndCapCoolingTubeAngle[3]);
+      endcapcoolingwatertubetorushape[i] = new TGeoTorus(fgkEndCapCoolingTubeAxialRadius[0],
+                                                        0.,fgkEndCapCoolingTubeRadiusMin,
+                                                        90.0,fgkEndCapCoolingTubeAngle[3]);
+    }
+    else{
+      endcapcoolingtubetorushape[i] = new TGeoTorus(i!=4?fgkEndCapCoolingTubeAxialRadius[0]
+                                                   :fgkEndCapCoolingTubeAxialRadius[1],
+                                                   fgkEndCapCoolingTubeRadiusMin,
+                                                   fgkEndCapCoolingTubeRadiusMax,
+                                                   0.,fgkEndCapCoolingTubeAngle[i]);
+      endcapcoolingwatertubetorushape[i] = new TGeoTorus(i!=4?fgkEndCapCoolingTubeAxialRadius[0]
+                                                        :fgkEndCapCoolingTubeAxialRadius[1],
+                                                        0.,fgkEndCapCoolingTubeRadiusMin,
+                                                        0.,fgkEndCapCoolingTubeAngle[i]);
+    }
+       endcapcoolingtubetorus[i] = new TGeoVolume(endcapcoolingtubetorusname,
+                                                                                          endcapcoolingtubetorushape[i],
+                                                                                          fSSDCoolingTubePhynox);
+       endcapcoolingwatertubetorus[i] = new TGeoVolume(endcapcoolingwatertubetorusname,
+                                                                                                       endcapcoolingwatertubetorushape[i],
+                                                                                                       fSSDCoolingTubeWater);
+    endcapcoolingtubetorus[i]->SetLineColor(fColorPhynox);
+    endcapcoolingwatertubetorus[i]->SetLineColor(fColorWater);
+    if(i<4){
+               endcapcoolingtubeshape[i] = new TGeoTube(fgkEndCapCoolingTubeRadiusMin,
+                                                                 fgkEndCapCoolingTubeRadiusMax,
+                                                         0.5*fgkEndCapCoolingTubeLength[i]);
+               endcapcoolingwatertubeshape[i] = new TGeoTube(0.,fgkEndCapCoolingTubeRadiusMin,
+                                                         0.5*fgkEndCapCoolingTubeLength[i]);
+        endcapcoolingtube[i] = new TGeoVolume(endcapcoolingtubename,
+                                                        endcapcoolingtubeshape[i],fSSDCoolingTubePhynox);
+        endcapcoolingwatertube[i] = new TGeoVolume(endcapcoolingwatertubename,
+                                                        endcapcoolingwatertubeshape[i],fSSDCoolingTubeWater);
+               endcapcoolingtube[i]->SetLineColor(fColorPhynox);
+               endcapcoolingwatertube[i]->SetLineColor(fColorWater);
+       }
+  }
+  TGeoVolumeAssembly* endcapcoolingtubemother = new TGeoVolumeAssembly("MotherEndCapCoolingTube");
+  /////////////////////////////////////////
+  // Transformation for Volume Positioning 
+  /////////////////////////////////////////
+  TGeoCombiTrans* coolingtubecombitrans[6];
+  TGeoRotation* coolingtuberot[8];
+  TGeoTranslation* coolingtubetrans[6];
+  TGeoHMatrix* coolingtubematrix[4];
+  TGeoCombiTrans* torustubecombitrans[4];
+  TGeoRotation* torustuberot[7];
+  TGeoTranslation* torustubetrans[4];
+  TGeoHMatrix* torustubematrix[5];
+  TGeoCombiTrans* coolingwatertubecombitrans[6];
+  TGeoRotation* coolingwatertuberot[8];
+  TGeoTranslation* coolingwatertubetrans[6];
+  TGeoHMatrix* coolingwatertubematrix[4];
+  TGeoCombiTrans* toruswatertubecombitrans[4];
+  TGeoRotation* toruswatertuberot[7];
+  TGeoTranslation* toruswatertubetrans[4];
+  TGeoHMatrix* toruswatertubematrix[5];
+  for(Int_t i=0; i<8; i++){
+    if(i<6){
+        coolingtubetrans[i] = new TGeoTranslation();
+        coolingwatertubetrans[i] = new TGeoTranslation();
+    }
+    if(i<8){
+        coolingtuberot[i] = new TGeoRotation();
+        coolingwatertuberot[i] = new TGeoRotation();
+    }
+    if(i<4){
+        torustubetrans[i] = new TGeoTranslation();
+        toruswatertubetrans[i] = new TGeoTranslation();
+    }
+    if(i<7){
+        torustuberot[i] = new TGeoRotation();
+        toruswatertuberot[i] = new TGeoRotation();
+       }
+  }
+  /////////////////////////////////////////
+  // Transformation for Inox Volume Positioning 
+  /////////////////////////////////////////
+  coolingtubetrans[0]->SetTranslation(fgkEndCapCoolingTubeAxialRadius[0],
+                                                                         -endcapcoolingtubeshape[0]->GetDz(),0.);
+  coolingtuberot[0]->SetAngles(0.,90.,0.);
+  coolingtubecombitrans[0] = new TGeoCombiTrans(*coolingtubetrans[0],
+                                                                                               *coolingtuberot[0]);
+                                                                                               
+  coolingtubetrans[1]->SetTranslation(0.,-endcapcoolingtubeshape[1]->GetDz(),0.);
+  coolingtuberot[1]->SetAngles(0.,90.,0.);
+  coolingtubecombitrans[1] = new TGeoCombiTrans(*coolingtubetrans[1],
+                                                                                               *coolingtuberot[1]);
+
+  coolingtubetrans[2]->SetTranslation(fgkEndCapCoolingTubeAxialRadius[0]
+                                                                        *CosD(fgkEndCapCoolingTubeAngle[0]),
+                                                                         fgkEndCapCoolingTubeAxialRadius[0]
+                                                                        *SinD(fgkEndCapCoolingTubeAngle[0]),
+                                                                         0.);
+  coolingtuberot[2]->SetAngles(fgkEndCapCoolingTubeAngle[0]-180.,0.,0.);
+  coolingtubecombitrans[2] = new TGeoCombiTrans(*coolingtubetrans[2],
+                                                                                               *coolingtuberot[2]);
+
+  coolingtubematrix[0] = new TGeoHMatrix((*coolingtubecombitrans[2])
+                                          *                             (*coolingtubecombitrans[1]));
+
+  torustubetrans[0]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[0],0.,
+                                                                        endcapcoolingtubeshape[1]->GetDz());
+  torustuberot[0]->SetAngles(0.,90.,0.); 
+  torustubecombitrans[0] = new TGeoCombiTrans(*torustubetrans[0],*torustuberot[0]);
+
+  torustubematrix[0] = new TGeoHMatrix((*coolingtubematrix[0])*(*torustubecombitrans[0]));
+
+  coolingtubetrans[3]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[0],
+                                                                         -endcapcoolingtubeshape[2]->GetDz(),0.);
+  coolingtuberot[3]->SetAngles(0.,90.,0.);
+  coolingtubecombitrans[3] = new TGeoCombiTrans(*coolingtubetrans[3],
+                                                                                               *coolingtuberot[3]);
+  coolingtuberot[4]->SetAngles(-180.+fgkEndCapCoolingTubeAngle[1],0.,0.);
+  coolingtubematrix[1] = new TGeoHMatrix((*coolingtuberot[4])*(*coolingtubecombitrans[3]));
+  coolingtubematrix[1]->MultiplyLeft(torustubematrix[0]);
+  
+  torustubetrans[1]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[0],0.,
+                                                                       endcapcoolingtubeshape[2]->GetDz());
+  torustuberot[1]->SetAngles(0.,90.,0.); 
+  torustubecombitrans[1] = new TGeoCombiTrans(*torustubetrans[1],*torustuberot[1]);
+  torustuberot[2]->SetAngles(180.,0.,0.); 
+  torustubematrix[2] = new TGeoHMatrix((*torustuberot[2])*(*torustubecombitrans[1]));
+  torustubematrix[2]->MultiplyLeft(coolingtubematrix[1]);
+
+  torustubetrans[2]->SetTranslation(0.,fgkEndCapCoolingTubeAxialRadius[0],
+                                                                       -fgkEndCapCoolingTubeAxialRadius[0]);
+  torustuberot[3]->SetAngles(0.,90.,0.); 
+  torustubecombitrans[2] = new TGeoCombiTrans(*torustubetrans[2],*torustuberot[3]);
+  torustuberot[4]->SetAngles(fgkEndCapCoolingTubeAngle[2]-90.,0.,0.); 
+  torustubematrix[3] = new TGeoHMatrix((*torustuberot[4])*(*torustubecombitrans[2]));
+  torustubematrix[3]->MultiplyLeft(torustubematrix[2]);
+
+  coolingtubetrans[4]->SetTranslation(-endcapcoolingtubeshape[3]->GetDz(),
+                                                                         fgkEndCapCoolingTubeAxialRadius[0],0.);
+  coolingtuberot[5]->SetAngles(90.,90.,-90.);
+  coolingtubecombitrans[4] = new TGeoCombiTrans(*coolingtubetrans[4],
+                                                                                               *coolingtuberot[5]);
+  coolingtuberot[6]->SetAngles(fgkEndCapCoolingTubeAngle[3],0.,0.);
+  coolingtubematrix[2] = new TGeoHMatrix((*coolingtuberot[6])*(*coolingtubecombitrans[4]));
+  coolingtubematrix[2]->MultiplyLeft(torustubematrix[3]);
+  
+  torustubetrans[3]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[1],0.,
+                                                                       endcapcoolingtubeshape[0]->GetDz());
+  torustuberot[5]->SetAngles(0.,90.,0.); 
+  torustubecombitrans[3] = new TGeoCombiTrans(*torustubetrans[3],*torustuberot[5]);
+  torustuberot[6]->SetAngles(-90.,0.,0.); 
+  torustubematrix[4] = new TGeoHMatrix((*torustuberot[6])*(*torustubecombitrans[3]));
+  torustubematrix[4]->MultiplyLeft(coolingtubecombitrans[0]);
+  
+  coolingtubetrans[5]->SetTranslation(fgkEndCapCoolingTubeAxialRadius[1],
+                                                                         endcapcoolingtubeshape[3]->GetDz(),0.);
+  coolingtuberot[6]->SetAngles(0.,90.,0.);
+  coolingtubecombitrans[5] = new TGeoCombiTrans(*coolingtubetrans[5],
+                                                                                               *coolingtuberot[6]);
+  coolingtuberot[7]->SetAngles(fgkEndCapCoolingTubeAngle[4],0.,0.);
+  coolingtubematrix[3] = new TGeoHMatrix((*coolingtuberot[7])*(*coolingtubecombitrans[5]));
+  coolingtubematrix[3]->MultiplyLeft(torustubematrix[4]);
+    /////////////////////////////////////////
+  // Transformation for Water Volume Positioning 
+  /////////////////////////////////////////
+  coolingwatertubetrans[0]->SetTranslation(fgkEndCapCoolingTubeAxialRadius[0],
+                                                                         -endcapcoolingwatertubeshape[0]->GetDz(),0.);
+  coolingwatertuberot[0]->SetAngles(0.,90.,0.);
+  coolingwatertubecombitrans[0] = new TGeoCombiTrans(*coolingwatertubetrans[0],
+                                                                                                    *coolingwatertuberot[0]);
+
+  coolingwatertubetrans[1]->SetTranslation(0.,-endcapcoolingwatertubeshape[1]->GetDz(),0.);
+  coolingwatertuberot[1]->SetAngles(0.,90.,0.);
+  coolingwatertubecombitrans[1] = new TGeoCombiTrans(*coolingwatertubetrans[1],
+                                                                                                    *coolingwatertuberot[1]);
+
+  coolingwatertubetrans[2]->SetTranslation(fgkEndCapCoolingTubeAxialRadius[0]
+                                                                                 *CosD(fgkEndCapCoolingTubeAngle[0]),
+                                                                                 fgkEndCapCoolingTubeAxialRadius[0]
+                                                                                 *SinD(fgkEndCapCoolingTubeAngle[0]),
+                                                                             0.);
+  coolingwatertuberot[2]->SetAngles(fgkEndCapCoolingTubeAngle[0]-180.,0.,0.);
+  coolingwatertubecombitrans[2] = new TGeoCombiTrans(*coolingwatertubetrans[2],
+                                                                                                   *coolingwatertuberot[2]);
+
+  coolingwatertubematrix[0] = new TGeoHMatrix((*coolingwatertubecombitrans[2])
+                                          *                                 (*coolingwatertubecombitrans[1]));
+                                          
+  toruswatertubetrans[0]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[0],0.,
+                                                                        endcapcoolingwatertubeshape[1]->GetDz());
+  toruswatertuberot[0]->SetAngles(0.,90.,0.); 
+  toruswatertubecombitrans[0] = new TGeoCombiTrans(*toruswatertubetrans[0],
+                                                                                                  *toruswatertuberot[0]);
+
+  toruswatertubematrix[0] = new TGeoHMatrix((*coolingwatertubematrix[0])
+                                                 *                                     (*toruswatertubecombitrans[0]));
+
+  coolingwatertubetrans[3]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[0],
+                                                                         -endcapcoolingwatertubeshape[2]->GetDz(),0.);
+  coolingwatertuberot[3]->SetAngles(0.,90.,0.);
+  coolingwatertubecombitrans[3] = new TGeoCombiTrans(*coolingwatertubetrans[3],
+                                                                                                    *coolingwatertuberot[3]);
+  coolingwatertuberot[4]->SetAngles(-180.+fgkEndCapCoolingTubeAngle[1],0.,0.);
+  coolingwatertubematrix[1] = new TGeoHMatrix((*coolingwatertuberot[4])
+                                                       *                                 (*coolingwatertubecombitrans[3]));
+  coolingwatertubematrix[1]->MultiplyLeft(toruswatertubematrix[0]);
+
+  toruswatertubetrans[1]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[0],0.,
+                                                                       endcapcoolingwatertubeshape[2]->GetDz());
+  toruswatertuberot[1]->SetAngles(0.,90.,0.); 
+  toruswatertubecombitrans[1] = new TGeoCombiTrans(*toruswatertubetrans[1],
+                                                                                                  *toruswatertuberot[1]);
+  toruswatertuberot[2]->SetAngles(180.,0.,0.); 
+  toruswatertubematrix[2] = new TGeoHMatrix((*toruswatertuberot[2])
+                                                 *                 (*toruswatertubecombitrans[1]));
+  toruswatertubematrix[2]->MultiplyLeft(coolingwatertubematrix[1]);
+  
+  toruswatertubetrans[2]->SetTranslation(0.,fgkEndCapCoolingTubeAxialRadius[0],
+                                                                                  -fgkEndCapCoolingTubeAxialRadius[0]);
+  toruswatertuberot[3]->SetAngles(0.,90.,0.); 
+  toruswatertubecombitrans[2] = new TGeoCombiTrans(*toruswatertubetrans[2],
+                                                                                                  *toruswatertuberot[3]);
+  toruswatertuberot[4]->SetAngles(fgkEndCapCoolingTubeAngle[2]-90.,0.,0.); 
+  toruswatertubematrix[3] = new TGeoHMatrix((*toruswatertuberot[4])
+                                                 *                                     (*toruswatertubecombitrans[2]));
+  toruswatertubematrix[3]->MultiplyLeft(toruswatertubematrix[2]);
+
+  coolingwatertubetrans[4]->SetTranslation(-endcapcoolingwatertubeshape[3]->GetDz(),
+                                                                               fgkEndCapCoolingTubeAxialRadius[0],0.);
+  coolingwatertuberot[5]->SetAngles(90.,90.,-90.);
+  coolingwatertubecombitrans[4] = new TGeoCombiTrans(*coolingwatertubetrans[4],
+                                                                                                    *coolingwatertuberot[5]);
+  coolingwatertuberot[6]->SetAngles(fgkEndCapCoolingTubeAngle[3],0.,0.);
+  coolingwatertubematrix[2] = new TGeoHMatrix((*coolingwatertuberot[6])
+                                                       *                                 (*coolingwatertubecombitrans[4]));
+  coolingwatertubematrix[2]->MultiplyLeft(toruswatertubematrix[3]);
+  
+  toruswatertubetrans[3]->SetTranslation(-fgkEndCapCoolingTubeAxialRadius[1],0.,
+                                                                             endcapcoolingwatertubeshape[0]->GetDz());
+  toruswatertuberot[5]->SetAngles(0.,90.,0.); 
+  toruswatertubecombitrans[3] = new TGeoCombiTrans(*toruswatertubetrans[3],
+                                                                                                  *toruswatertuberot[5]);
+  toruswatertuberot[6]->SetAngles(-90.,0.,0.); 
+  toruswatertubematrix[4] = new TGeoHMatrix((*toruswatertuberot[6])
+                                                 *                 (*toruswatertubecombitrans[3]));
+  toruswatertubematrix[4]->MultiplyLeft(coolingwatertubecombitrans[0]);
+  
+  coolingwatertubetrans[5]->SetTranslation(fgkEndCapCoolingTubeAxialRadius[1],
+                                                                         endcapcoolingwatertubeshape[3]->GetDz(),0.);
+  coolingwatertuberot[6]->SetAngles(0.,90.,0.);
+  coolingwatertubecombitrans[5] = new TGeoCombiTrans(*coolingwatertubetrans[5],
+                                                                                                    *coolingwatertuberot[6]);
+  coolingwatertuberot[7]->SetAngles(fgkEndCapCoolingTubeAngle[4],0.,0.);
+  coolingwatertubematrix[3] = new TGeoHMatrix((*coolingwatertuberot[7])
+                                                       *                                 (*coolingwatertubecombitrans[5]));
+  coolingwatertubematrix[3]->MultiplyLeft(toruswatertubematrix[4]);
+  /////////////////////////////////////////
+  // Positioning Volumes
+  /////////////////////////////////////////
+  endcapcoolingtubemother->AddNode(endcapcoolingtubetorus[0],1);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertubetorus[0],1);
+  
+  endcapcoolingtubemother->AddNode(endcapcoolingtube[0],1,coolingtubecombitrans[0]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertube[0],1,coolingwatertubecombitrans[0]);
+
+  endcapcoolingtubemother->AddNode(endcapcoolingtube[1],1,coolingtubematrix[0]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertube[1],1,coolingwatertubematrix[0]);
+  endcapcoolingtubemother->AddNode(endcapcoolingtubetorus[1],1,torustubematrix[0]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertubetorus[1],1,toruswatertubematrix[0]);
+
+  endcapcoolingtubemother->AddNode(endcapcoolingtube[2],1,coolingtubematrix[1]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertube[2],1,coolingwatertubematrix[1]);
+
+  endcapcoolingtubemother->AddNode(endcapcoolingtubetorus[2],1,torustubematrix[2]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertubetorus[2],1,toruswatertubematrix[2]);
+
+  endcapcoolingtubemother->AddNode(endcapcoolingtubetorus[3],1,torustubematrix[3]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertubetorus[3],1,toruswatertubematrix[3]);
+
+  endcapcoolingtubemother->AddNode(endcapcoolingtube[3],1,coolingtubematrix[2]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertube[3],1,coolingwatertubematrix[2]);
+  
+  endcapcoolingtubemother->AddNode(endcapcoolingtubetorus[4],1,torustubematrix[4]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertubetorus[4],1,toruswatertubematrix[4]);
+  endcapcoolingtubemother->AddNode(endcapcoolingtube[3],2,coolingtubematrix[3]);
+  endcapcoolingtubemother->AddNode(endcapcoolingwatertube[3],2,coolingwatertubematrix[3]);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<8; i++){
+    if(i<6){
+        delete coolingtubetrans[i];
+        delete coolingwatertubetrans[i];
+        if(i!=0){
+         delete coolingtubecombitrans[i];
+         delete coolingwatertubecombitrans[i];
+        }
+       }
+    if(i<8){
+         delete coolingtuberot[i];
+         delete coolingwatertuberot[i];
+    }
+    if(i<4){
+               delete torustubetrans[i];
+               delete toruswatertubetrans[i];
+               delete torustubecombitrans[i];
+               delete toruswatertubecombitrans[i];
+       } 
+    if(i<7){
+        delete torustuberot[i];
+        delete toruswatertuberot[i];
+       }
+  }
+  /////////////////////////////////////////////////////////////
+  return endcapcoolingtubemother;
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume* AliITSv11GeometrySSD::GetEndCapSideCover() const {
+  /////////////////////////////////////////////////////////////
+  // Getting EndCap Cover Side 
+  /////////////////////////////////////////////////////////////
+  const Int_t kendcapcoverholenumber[2] = {7,5}; 
+  const Int_t kvertexnumber = 15; 
+  Double_t xvertex[kvertexnumber], yvertex[kvertexnumber];
+  xvertex[0]  = 0.0;
+  xvertex[1]  = xvertex[0];
+  xvertex[2]  = fgkEndCapSideCoverLength[0];
+  xvertex[3]  = fgkEndCapSideCoverLength[1];
+  xvertex[4]  = xvertex[3];
+  xvertex[5]  = fgkEndCapSideCoverLength[2];
+  xvertex[6]  = xvertex[5];
+  xvertex[7]  = xvertex[2];
+  xvertex[8]  = xvertex[7];
+  xvertex[9]  = xvertex[6]-fgkEndCapSideCoverLength[0];
+  xvertex[10] = xvertex[9];
+  xvertex[11] = xvertex[5]-fgkEndCapSideCoverLength[0]-kendcapcoverholenumber[1]
+                         * fgkEndCapSideCoverLength[3]-(kendcapcoverholenumber[1]-1)
+                         * fgkEndCapSideCoverLength[4];
+  xvertex[12] = xvertex[11];
+  xvertex[13] = xvertex[5]-fgkEndCapSideCoverLength[0]-kendcapcoverholenumber[0]
+                         * fgkEndCapSideCoverLength[3]-(kendcapcoverholenumber[0]-1)
+                         * fgkEndCapSideCoverLength[4];
+  xvertex[14] = xvertex[13];
+  yvertex[0]  = 0.0;
+  yvertex[1]  = fgkEndCapSideCoverWidth[0];
+  yvertex[2]  = fgkEndCapSideCoverWidth[1]-fgkEndCapSideCoverWidth[2];
+  yvertex[3]  = yvertex[2];
+  yvertex[4]  = fgkEndCapSideCoverWidth[1];
+  yvertex[5]  = yvertex[4];
+  yvertex[6]  = yvertex[0];
+  yvertex[7]  = yvertex[6];
+  yvertex[8]  = fgkEndCapSideCoverWidth[6];
+  yvertex[9]  = yvertex[8];
+  yvertex[10] = fgkEndCapSideCoverWidth[1]-fgkEndCapSideCoverWidth[3];
+  yvertex[11] = yvertex[10];
+  yvertex[12] = yvertex[9]+2.*fgkEndCapSideCoverWidth[5]+fgkEndCapSideCoverLength[4]; 
+  yvertex[13] = yvertex[12];
+  yvertex[14] = yvertex[6];
+  TGeoXtru* endcapsidecovershapeout = new TGeoXtru(2);
+  endcapsidecovershapeout->SetName("endcapsidecovershapeout");
+  endcapsidecovershapeout->DefinePolygon(7,xvertex,yvertex); 
+  endcapsidecovershapeout->DefineSection(0,-0.5*fgkEndCapSideCoverThickness);
+  endcapsidecovershapeout->DefineSection(1,0.5*fgkEndCapSideCoverThickness);
+  TGeoXtru* endcapsidecovershapein = new TGeoXtru(2);
+  endcapsidecovershapein->SetName("endcapsidecovershapein");
+  endcapsidecovershapein->DefinePolygon(6,&xvertex[8],&yvertex[8]); 
+  endcapsidecovershapein->DefineSection(0,-0.5*fgkEndCapSideCoverThickness-0.01);
+  endcapsidecovershapein->DefineSection(1,0.5*fgkEndCapSideCoverThickness+0.01);
+
+
+  TGeoCompositeShape* endcapsidecovershape = new TGeoCompositeShape("endcapsidecovershape", "endcapsidecovershapeout-endcapsidecovershapein");
+  TGeoVolume* endcapsidecover = new TGeoVolume("EndCapSideCover",
+                                                               endcapsidecovershape,fSSDCoolingTubePhynox);
+  endcapsidecover->SetLineColor(fColorPhynox);
+  ////////////////////////////////////////////
+  // Defininition of Mother Volume
+  ////////////////////////////////////////////
+  const Int_t kmothervertexnumber = 7;
+  Double_t xmothervertex[kmothervertexnumber]; 
+  Double_t ymothervertex[kmothervertexnumber]; 
+  for(Int_t i=0; i<kmothervertexnumber; i++){
+       xmothervertex[i] = xvertex[i];
+       ymothervertex[i] = yvertex[i];
+  }
+  TGeoXtru* endcapsidecovermothershape = new TGeoXtru(2);
+  endcapsidecovermothershape->DefinePolygon(kmothervertexnumber,xmothervertex,ymothervertex); 
+  endcapsidecovermothershape->DefineSection(0,-0.5*fgkEndCapSideCoverThickness);
+  endcapsidecovermothershape->DefineSection(1,0.5*fgkEndCapSideCoverThickness);
+  TGeoVolume* endcapsidecovermother = new TGeoVolume("EndCapSideCoverMother",
+                                                               endcapsidecovermothershape,fSSDAir);
+  ////////////////////////////////////////////
+  endcapsidecovermother->AddNode(endcapsidecover,1);
+  TGeoBBox* endcapsidecoverboxshape[4];
+  endcapsidecoverboxshape[0] = new TGeoBBox(0.5*(kendcapcoverholenumber[0]*fgkEndCapSideCoverLength[3]
+                                                        +     (kendcapcoverholenumber[0]-1)*fgkEndCapSideCoverLength[4]),
+                                                              0.5*fgkEndCapSideCoverLength[4],
+                                                                  0.5*fgkEndCapSideCoverThickness); 
+  endcapsidecoverboxshape[1] = new TGeoBBox(0.5*(kendcapcoverholenumber[1]*fgkEndCapSideCoverLength[3]
+                                                        +     (kendcapcoverholenumber[1]-1)*fgkEndCapSideCoverLength[4]),
+                                                              0.5*(fgkEndCapSideCoverWidth[4]-2.*fgkEndCapSideCoverWidth[5]
+                                                        -     fgkEndCapSideCoverLength[4]),
+                                                                  0.5*fgkEndCapSideCoverThickness); 
+  endcapsidecoverboxshape[2] = new TGeoBBox(endcapsidecoverboxshape[1]->GetDX(),
+                                                              0.5*fgkEndCapSideCoverLength[4],
+                                                                  0.5*fgkEndCapSideCoverThickness); 
+  endcapsidecoverboxshape[3] = new TGeoBBox(0.5*fgkEndCapSideCoverLength[4],
+                                                              0.5*fgkEndCapSideCoverWidth[5],
+                                                                  0.5*fgkEndCapSideCoverThickness); 
+  TGeoVolume* endcapsidecoverbox[4];
+  endcapsidecoverbox[0] = new TGeoVolume("EndCapSideCoverBox1",endcapsidecoverboxshape[0],fSSDCoolingTubePhynox);
+  endcapsidecoverbox[1] = new TGeoVolume("EndCapSideCoverBox2",endcapsidecoverboxshape[1],fSSDCoolingTubePhynox);
+  endcapsidecoverbox[2] = new TGeoVolume("EndCapSideCoverBox3",endcapsidecoverboxshape[2],fSSDCoolingTubePhynox);
+  endcapsidecoverbox[3] = new TGeoVolume("EndCapSideCoverBox4",endcapsidecoverboxshape[3],fSSDCoolingTubePhynox);
+  for(Int_t i=0; i<4; i++)   endcapsidecoverbox[i]->SetLineColor(fColorPhynox);
+//  TGeoTranslation* endcapsidecoverboxtrans[3+2*(kendcapcoverholenumber[0]-1)+2*(kendcapcoverholenumber[1]-1)];
+  TGeoTranslation** endcapsidecoverboxtrans;
+  endcapsidecoverboxtrans = new TGeoTranslation*[3+2*(kendcapcoverholenumber[0]-1)+2*(kendcapcoverholenumber[1]-1)];
+  endcapsidecoverboxtrans[0] = new TGeoTranslation(endcapsidecoverboxshape[0]->GetDX()
+                                                        +                                         fgkEndCapSideCoverLength[0],
+                                                                                                  endcapsidecoverboxshape[0]->GetDY()
+                                                        +                     yvertex[9]+fgkEndCapSideCoverWidth[5],0.);
+  endcapsidecoverboxtrans[1] = new TGeoTranslation(endcapsidecoverboxshape[1]->GetDX()
+                                                        +                     xvertex[11],
+                                                                                                  endcapsidecoverboxshape[1]->GetDY()
+                                                        +                     yvertex[12],0.);
+  endcapsidecoverboxtrans[2] = new TGeoTranslation(endcapsidecoverboxshape[2]->GetDX()
+                                                        +                     xvertex[11],
+                                                                                                  endcapsidecoverboxshape[2]->GetDY()
+                                                        +                     yvertex[12]
+                                                        +                                         2.*endcapsidecoverboxshape[1]->GetDY() 
+                                                        +                     fgkEndCapSideCoverWidth[5],0.);
+  endcapsidecovermother->AddNode(endcapsidecoverbox[0],1,endcapsidecoverboxtrans[0]);
+  endcapsidecovermother->AddNode(endcapsidecoverbox[1],1,endcapsidecoverboxtrans[1]);
+  endcapsidecovermother->AddNode(endcapsidecoverbox[2],1,endcapsidecoverboxtrans[2]);
+  for(Int_t i=0; i<2; i++)
+       for(Int_t j=0; j<kendcapcoverholenumber[0]-1; j++){
+               endcapsidecoverboxtrans[i*(kendcapcoverholenumber[0]-1)+j+3] = 
+                       new TGeoTranslation(endcapsidecoverboxshape[3]->GetDX()+fgkEndCapSideCoverLength[0]
+                                                               +(j+1)*fgkEndCapSideCoverLength[3]+j*fgkEndCapSideCoverLength[4],
+                                                               endcapsidecoverboxshape[3]->GetDY()+fgkEndCapSideCoverWidth[6]
+                                                               +i*(fgkEndCapSideCoverWidth[5]+fgkEndCapSideCoverLength[4]),0.0);
+               endcapsidecovermother->AddNode(endcapsidecoverbox[3],i*(kendcapcoverholenumber[0]-1)+j+1,
+                                                               endcapsidecoverboxtrans[i*(kendcapcoverholenumber[0]-1)+j+3]);
+       }
+  for(Int_t i=0; i<2; i++)
+       for(Int_t j=0; j<kendcapcoverholenumber[1]-1; j++){
+               endcapsidecoverboxtrans[2*(kendcapcoverholenumber[0]-1)+3+i*(kendcapcoverholenumber[1]-1)+j] = 
+               new TGeoTranslation(endcapsidecoverboxshape[3]->GetDX()+xvertex[12]
+                                                       +(j+1)*fgkEndCapSideCoverLength[3]+j*fgkEndCapSideCoverLength[4],
+                                                       endcapsidecoverboxshape[3]->GetDY()+fgkEndCapSideCoverWidth[6]
+                                                       +fgkEndCapSideCoverWidth[4]+i*(fgkEndCapSideCoverWidth[5]
+                                                       +fgkEndCapSideCoverLength[4]),0.0);
+               endcapsidecovermother->AddNode(endcapsidecoverbox[3],
+                                                               2*(kendcapcoverholenumber[0]-1)+3+i*(kendcapcoverholenumber[1]-1)+j,
+                                                               endcapsidecoverboxtrans[2*(kendcapcoverholenumber[0]-1)+3
+                                                               +i*(kendcapcoverholenumber[1]-1)+j]);
+       }
+  delete [] endcapsidecoverboxtrans;
+  return endcapsidecovermother;
+ } 
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume** AliITSv11GeometrySSD::GetEndCapCards() const { 
+ ////////////////////////////////////////////////////////////////////////////////
+ // Method returning Interface Card A, Interface Card B, Supply Card 
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////
+ // Supply Card
+ /////////////////////
+ // Electronic Board Back Al Plane
+ const Int_t kelectboardbackvertexnumber = 8;
+ Double_t xelectboardback[kelectboardbackvertexnumber];
+ Double_t yelectboardback[kelectboardbackvertexnumber];
+ xelectboardback[0] = 0.0;
+ xelectboardback[1] = xelectboardback[0];
+ xelectboardback[2] = fgkEndCapCardElectBoardBackLength[0];
+ xelectboardback[3] = xelectboardback[2];
+ xelectboardback[4] = xelectboardback[3]-fgkEndCapCardElectBoardBackLength[1];
+ xelectboardback[5] = xelectboardback[4];
+ xelectboardback[6] = fgkEndCapCardElectBoardBackLength[1];
+ xelectboardback[7] = xelectboardback[6];
+ yelectboardback[0] = 0.0;
+ yelectboardback[1] = fgkEndCapCardElectBoardBackWidth[0];
+ yelectboardback[2] = yelectboardback[1];
+ yelectboardback[3] = yelectboardback[0];
+ yelectboardback[4] = yelectboardback[3];
+ yelectboardback[5] = yelectboardback[4]+fgkEndCapCardElectBoardBackWidth[1];
+ yelectboardback[6] = yelectboardback[5];
+ yelectboardback[7] = yelectboardback[4];
+ TGeoXtru* electboardbackshape = new TGeoXtru(2);
+ electboardbackshape->DefinePolygon(kelectboardbackvertexnumber,
+                                                                       xelectboardback,yelectboardback); 
+ electboardbackshape->DefineSection(0,0.0);
+ electboardbackshape->DefineSection(1,fgkEndCapCardElectBoardBackThickness);
+ TGeoVolume* electboardback = new TGeoVolume("EndCapCardElectBoardBackPlane",
+                                                                                        electboardbackshape,fSSDSupportRingAl);
+ electboardback->SetLineColor(fColorAl);
+ // Electronic Board Kapton Layer
+ const Int_t kelectlayervertexnumber = 8;
+ Double_t xelectlayer[kelectlayervertexnumber];
+ Double_t yelectlayer[kelectlayervertexnumber];
+ xelectlayer[0] = fgkEndCapCardElectBoardBackLength[0]-fgkEndCapCardElectBoardLength;
+ xelectlayer[1] = xelectlayer[0];
+ xelectlayer[2] = fgkEndCapCardElectBoardLength;
+ xelectlayer[3] = xelectlayer[2];
+ for(Int_t i=4; i<kelectlayervertexnumber; i++) xelectlayer[i] = xelectboardback[i]; 
+     
+ yelectlayer[0] = 0.0;
+ yelectlayer[1] = fgkEndCapCardElectBoardLayerWidth[0];
+ yelectlayer[2] = yelectlayer[1];
+ yelectlayer[3] = yelectlayer[0];
+ yelectlayer[4] = yelectlayer[3];
+ yelectlayer[5] = yelectlayer[4]+fgkEndCapCardElectBoardLayerWidth[1];
+ yelectlayer[6] = yelectlayer[5];
+ yelectlayer[7] = yelectlayer[4];
+ TGeoXtru* electlayershape = new TGeoXtru(2);
+ electlayershape->DefinePolygon(kelectlayervertexnumber,xelectlayer,yelectlayer); 
+ electlayershape->DefineSection(0,0.0);
+ electlayershape->DefineSection(1,fgkEndCapCardElectBoardLayerThickness);
+ TGeoVolume* electlayer = new TGeoVolume("EndCapCardElectBoardLayer",
+                                                                                        electlayershape,fSSDKaptonFlexMedium);
+ electlayer->SetLineColor(fColorKapton);
+ // JMD Connector Female
+ const Int_t kjmdconnectorvertexnumber = 6;
+ Double_t xjmdconnectorvertex[kjmdconnectorvertexnumber]; 
+ Double_t yjmdconnectorvertex[kjmdconnectorvertexnumber]; 
+ xjmdconnectorvertex[0] = 0.0; 
+ xjmdconnectorvertex[1] = xjmdconnectorvertex[0]; 
+ xjmdconnectorvertex[2] = fgkEndCapCardJMDConnectorLength[1]; 
+ xjmdconnectorvertex[3] = xjmdconnectorvertex[2];  
+ xjmdconnectorvertex[4] = fgkEndCapCardJMDConnectorLength[0]; 
+ xjmdconnectorvertex[5] = xjmdconnectorvertex[4]; 
+
+ yjmdconnectorvertex[0] = 0.0; 
+ yjmdconnectorvertex[1] = fgkEndCapCardJMDConnectorWidth[0]; 
+ yjmdconnectorvertex[2] = yjmdconnectorvertex[1]; 
+ yjmdconnectorvertex[3] = yjmdconnectorvertex[2]+fgkEndCapCardJMDConnectorWidth[1]; 
+ yjmdconnectorvertex[4] = yjmdconnectorvertex[3]; 
+ yjmdconnectorvertex[5] = yjmdconnectorvertex[0]; 
+ TGeoXtru* jmdconnectorshape = new TGeoXtru(2);
+ jmdconnectorshape->DefinePolygon(kjmdconnectorvertexnumber,xjmdconnectorvertex,
+                                                                 yjmdconnectorvertex); 
+ jmdconnectorshape->DefineSection(0,0.0);
+ jmdconnectorshape->DefineSection(1,fgkEndCapCardJMDConnectorThickness);
+ TGeoVolume* jmdconnector = new TGeoVolume("EndCapCardJMDConnector",
+                                                                                  jmdconnectorshape,fSSDMountingBlockMedium);
+ jmdconnector->SetLineColor(fColorG10);
+ // Top Cable Connector
+ const Int_t kcableconnectorvertexnumber = 8;
+ Double_t xconnectorvertex[kcableconnectorvertexnumber]; 
+ Double_t yconnectorvertex[kcableconnectorvertexnumber]; 
+ xconnectorvertex[0] = 0.0;
+ xconnectorvertex[1] = xconnectorvertex[0];
+ xconnectorvertex[2] = xconnectorvertex[1]+fgkEndCapCardCableConnectorLength[1];
+ xconnectorvertex[3] = xconnectorvertex[2];
+ xconnectorvertex[4] = fgkEndCapCardCableConnectorLength[0]
+                                        - fgkEndCapCardCableConnectorLength[2];
+ xconnectorvertex[5] = xconnectorvertex[4];
+ xconnectorvertex[6] = fgkEndCapCardCableConnectorLength[0];
+ xconnectorvertex[7] = xconnectorvertex[6];
+
+ yconnectorvertex[0] = 0.0;
+ yconnectorvertex[1] = fgkEndCapCardCableConnectorWidth[0];
+ yconnectorvertex[2] = yconnectorvertex[1];
+ yconnectorvertex[3] = fgkEndCapCardCableConnectorWidth[1];
+ yconnectorvertex[4] = yconnectorvertex[3];
+ yconnectorvertex[5] = yconnectorvertex[1];
+ yconnectorvertex[6] = yconnectorvertex[5];
+ yconnectorvertex[7] = yconnectorvertex[0];
+ TGeoXtru* cableconnectorshape = new TGeoXtru(2);
+ cableconnectorshape->DefinePolygon(kcableconnectorvertexnumber,xconnectorvertex,
+                                                                   yconnectorvertex); 
+ cableconnectorshape->DefineSection(0,0.0);
+ cableconnectorshape->DefineSection(1,fgkEndCapCardCableConnectorThickness);
+ TGeoVolume* cableconnector = new TGeoVolume("EndCapCardTopCableConnector",
+                                                                                  cableconnectorshape,fSSDMountingBlockMedium);
+ cableconnector->SetLineColor(fColorG10);
+ // Strip Connection
+ TGeoBBox* endcapstripconnectionshape = 
+                                                               new TGeoBBox(0.5*fgkEndCapStripConnectionLength,
+                                                                                        0.5*fgkEndCapStripConnectionThickness,
+                                                                                        0.5*fgkEndCapStripConnectionWidth);
+ TGeoVolume* endcapstripconnection = new TGeoVolume("EndCapStripConnection",
+                                                                                                       endcapstripconnectionshape,
+                                                                                                       fSSDSupportRingAl);
+ endcapstripconnection->SetLineColor(fColorAl);
+ // Interface Card B
+ const Int_t kcardBvertexnumber = 12; 
+ Double_t xcardBvertexnumber[kcardBvertexnumber];
+ Double_t ycardBvertexnumber[kcardBvertexnumber];
+
+ xcardBvertexnumber[0]  = 0.0;
+ xcardBvertexnumber[1]  = xcardBvertexnumber[0];
+ xcardBvertexnumber[2]  = xcardBvertexnumber[1]+fgkEndCapInterfaceCardBLength[0];
+ xcardBvertexnumber[3]  = xcardBvertexnumber[2];
+ xcardBvertexnumber[4]  = xcardBvertexnumber[1];
+ xcardBvertexnumber[5]  = xcardBvertexnumber[4];
+ xcardBvertexnumber[6]  = xcardBvertexnumber[5]+fgkEndCapInterfaceCardBLength[1];
+ xcardBvertexnumber[7]  = xcardBvertexnumber[6];
+ xcardBvertexnumber[8]  = xcardBvertexnumber[7]-fgkEndCapInterfaceCardBLength[0];
+ xcardBvertexnumber[9]  = xcardBvertexnumber[8];
+ xcardBvertexnumber[10] = xcardBvertexnumber[7];
+ xcardBvertexnumber[11] = xcardBvertexnumber[10];
+ ycardBvertexnumber[0]  = 0.0;
+ ycardBvertexnumber[1]  = fgkEndCapInterfaceCardBWidth[0];
+ ycardBvertexnumber[2]  = ycardBvertexnumber[1];
+ ycardBvertexnumber[3]  = ycardBvertexnumber[2]+fgkEndCapInterfaceCardBWidth[1];
+ ycardBvertexnumber[4]  = ycardBvertexnumber[3];
+ ycardBvertexnumber[5]  = ycardBvertexnumber[4]+fgkEndCapInterfaceCardBWidth[2];
+ ycardBvertexnumber[6]  = ycardBvertexnumber[5];
+ ycardBvertexnumber[7]  = ycardBvertexnumber[4];
+ ycardBvertexnumber[8]  = ycardBvertexnumber[7];
+ ycardBvertexnumber[9]  = ycardBvertexnumber[1];
+ ycardBvertexnumber[10] = ycardBvertexnumber[9];
+ ycardBvertexnumber[11] = ycardBvertexnumber[0];
+
+ TGeoXtru* interfacecardBshape = new TGeoXtru(2);
+ interfacecardBshape->DefinePolygon(kcardBvertexnumber,xcardBvertexnumber,ycardBvertexnumber);
+ interfacecardBshape->DefineSection(0,0.);
+ interfacecardBshape->DefineSection(1,fgkEndCapInterfaceCardBThickness);
+ TGeoVolume* interfacecardB = new TGeoVolume("EndCapInterfaceCardB",interfacecardBshape,
+                                                                                        fSSDMountingBlockMedium);
+ interfacecardB->SetLineColor(46);
+ // Interface Card B Electronic Board
+ const Int_t kelectboardcardBvertexnumber = 14; 
+ Double_t xelectboardcardBvertex[kelectboardcardBvertexnumber];
+ Double_t yelectboardcardBvertex[kelectboardcardBvertexnumber];
+
+ xelectboardcardBvertex[0]  = xcardBvertexnumber[0]+fgkEndCapInterfaceCardBLength[2];
+ xelectboardcardBvertex[1]  = xelectboardcardBvertex[0]; 
+ xelectboardcardBvertex[2]  = xelectboardcardBvertex[1]+fgkEndCapInterfaceCardBLength[3];
+ xelectboardcardBvertex[3]  = xelectboardcardBvertex[2]; 
+ xelectboardcardBvertex[4]  = xelectboardcardBvertex[3]+fgkEndCapInterfaceCardBLength[4];
+ xelectboardcardBvertex[5]  = xelectboardcardBvertex[4];
+ xelectboardcardBvertex[6]  = xelectboardcardBvertex[5]+fgkEndCapInterfaceCardBLength[5];
+ xelectboardcardBvertex[7]  = xelectboardcardBvertex[6];
+ xelectboardcardBvertex[8]  = xelectboardcardBvertex[7]+8.0*fgkEndCapInterfaceCardBLength[4];
+ xelectboardcardBvertex[9]  = xelectboardcardBvertex[8];
+ xelectboardcardBvertex[10] = xelectboardcardBvertex[9]+fgkEndCapInterfaceCardBLength[6];
+ xelectboardcardBvertex[11] = xelectboardcardBvertex[10];
+ xelectboardcardBvertex[12] = xelectboardcardBvertex[11]-9.0*fgkEndCapInterfaceCardBLength[4];
+ xelectboardcardBvertex[13] = xelectboardcardBvertex[12];
+
+ yelectboardcardBvertex[0]  = ycardBvertexnumber[0]+fgkEndCapInterfaceCardBWidth[1];
+ yelectboardcardBvertex[1]  = yelectboardcardBvertex[0]+fgkEndCapInterfaceCardBWidth[3];
+ yelectboardcardBvertex[2]  = yelectboardcardBvertex[1];
+ yelectboardcardBvertex[3]  = yelectboardcardBvertex[2]+fgkEndCapInterfaceCardBWidth[3];
+ yelectboardcardBvertex[4]  = yelectboardcardBvertex[3];
+ yelectboardcardBvertex[5]  = yelectboardcardBvertex[2];
+ yelectboardcardBvertex[6]  = yelectboardcardBvertex[5];
+ yelectboardcardBvertex[7]  = yelectboardcardBvertex[6]+fgkEndCapInterfaceCardBWidth[4];
+ yelectboardcardBvertex[8]  = yelectboardcardBvertex[7];
+ yelectboardcardBvertex[9]  = yelectboardcardBvertex[8]-fgkEndCapInterfaceCardBWidth[3];
+ yelectboardcardBvertex[10] = yelectboardcardBvertex[9];
+ yelectboardcardBvertex[11] = yelectboardcardBvertex[10]-fgkEndCapInterfaceCardBWidth[3];
+ yelectboardcardBvertex[12] = yelectboardcardBvertex[11];
+ yelectboardcardBvertex[13] = yelectboardcardBvertex[0];
+
+ TGeoXtru* electboardcardBshape = new TGeoXtru(2);
+ electboardcardBshape->DefinePolygon(kelectboardcardBvertexnumber,
+                                                                        xelectboardcardBvertex,yelectboardcardBvertex);
+ electboardcardBshape->DefineSection(0,fgkEndCapInterfaceCardBThickness);
+ electboardcardBshape->DefineSection(1,fgkEndCapInterfaceCardBThickness
+                                                                        + fgkEndCapInterfaceElectBoardCardBThickness);
+ TGeoVolume* electboardcardB = new TGeoVolume("EndCapInterfaceElectBoardCardB",electboardcardBshape,
+                                                                                         fSSDSupportRingAl);
+ electboardcardB->SetLineColor(fColorAl);
+ // Generating Stiffener 2
+ TGeoBBox* endcapstiffenershape = new TGeoBBox(0.5*fgkEndCapStiffenerWidth,
+                                                                                          0.5*fgkEndCapStiffenerThickness,
+                                                                                          0.5*fgkEndCapStiffenerLength);
+ TGeoVolume* endcapstiffener = new TGeoVolume("EndCapStiffener",endcapstiffenershape,fSSDSupportRingAl);
+ endcapstiffener->SetLineColor(fColorAl);   
+ // Generating Mother Interface Card B Container
+ const Int_t kinterfacecardBmothervertexnumber = 10;
+ Double_t xinterfacecardBmothervertex[kinterfacecardBmothervertexnumber];
+ Double_t yinterfacecardBmothervertex[kinterfacecardBmothervertexnumber];
+
+ xinterfacecardBmothervertex[0] = 0.0;
+ xinterfacecardBmothervertex[1] = xinterfacecardBmothervertex[0];
+ xinterfacecardBmothervertex[2] = xinterfacecardBmothervertex[1]
+                                                               + fgkEndCapInterfaceCardBThickness;
+ xinterfacecardBmothervertex[3] = xinterfacecardBmothervertex[2];
+ xinterfacecardBmothervertex[4] = xinterfacecardBmothervertex[3]
+                                                               + fgkEndCapInterfaceElectBoardCardBThickness;
+ xinterfacecardBmothervertex[5] = xinterfacecardBmothervertex[4];
+ xinterfacecardBmothervertex[6] = xinterfacecardBmothervertex[3];
+ xinterfacecardBmothervertex[7] = xinterfacecardBmothervertex[6];
+ xinterfacecardBmothervertex[8] = xinterfacecardBmothervertex[7]
+                                                               + fgkEndCapCardJMDConnectorLength[0];
+ xinterfacecardBmothervertex[9] = xinterfacecardBmothervertex[8];
+
+ yinterfacecardBmothervertex[0] = 0.0;
+ yinterfacecardBmothervertex[1] = fgkEndCapInterfaceCardBWidth[0]
+                                                               + fgkEndCapInterfaceCardBWidth[1]
+                                                               + fgkEndCapInterfaceCardBWidth[2];
+ yinterfacecardBmothervertex[2] = yinterfacecardBmothervertex[1];
+ yinterfacecardBmothervertex[3] = yelectboardcardBvertex[3];
+ yinterfacecardBmothervertex[4] = yinterfacecardBmothervertex[3];
+ yinterfacecardBmothervertex[5] = yelectboardcardBvertex[11];
+ yinterfacecardBmothervertex[6] = yinterfacecardBmothervertex[5];
+ yinterfacecardBmothervertex[7] = fgkEndCapCardElectBoardLayerWidth[1]
+                                                               + fgkEndCapCardJMDConnectorWidth[0]
+                                                               + fgkEndCapCardJMDConnectorWidth[1];
+ yinterfacecardBmothervertex[8] = yinterfacecardBmothervertex[7];
+ yinterfacecardBmothervertex[9] = yinterfacecardBmothervertex[0];
+ TGeoXtru* interfacecardBmothershape = new TGeoXtru(2);
+ interfacecardBmothershape->DefinePolygon(kinterfacecardBmothervertexnumber,
+                                                                                 xinterfacecardBmothervertex,
+                                                                                 yinterfacecardBmothervertex);
+ interfacecardBmothershape->DefineSection(0,-1.e-15);
+ interfacecardBmothershape->DefineSection(1,fgkEndCapInterfaceCardBLength[1]);
+ TGeoVolume* interfacecardBmother = new TGeoVolume("EndCapInterfaceCardBMother",
+                                                                                                  interfacecardBmothershape,fSSDAir);
+ electboardcardB->SetLineColor(fColorAl);
+ // Positioning Volumes Mother Interface Card B Container 
+ TGeoRotation* interfacecardBrot = new TGeoRotation();
+ TGeoTranslation* interfacecardBtrans = new TGeoTranslation(); 
+ interfacecardBrot->SetAngles(90.,-90.,-90.);
+ interfacecardBtrans->SetTranslation(fgkEndCapInterfaceCardBThickness,0.,0.);
+ TGeoCombiTrans* interfacecardBcombitrans = new TGeoCombiTrans(*interfacecardBtrans,*interfacecardBrot);
+ TGeoRotation* electboardcardBrot = new TGeoRotation();
+ TGeoTranslation* electboardcardBtrans = new TGeoTranslation(); 
+ electboardcardBrot->SetAngles(90.,90.,-90.);
+ electboardcardBtrans->SetTranslation(0.,0.,fgkEndCapInterfaceCardBLength[1]);
+ TGeoCombiTrans* electboardcardBcombitrans = 
+                                 new TGeoCombiTrans(*electboardcardBtrans,*electboardcardBrot);
+ interfacecardBmother->AddNode(interfacecardB,1,interfacecardBcombitrans);
+ interfacecardBmother->AddNode(electboardcardB,1,electboardcardBcombitrans);
+ TGeoRotation* jmdconnectorcardBrot = new TGeoRotation();
+ jmdconnectorcardBrot->SetAngles(90.,180.,-90.);
+ TGeoTranslation* jmdconnectorcardBtrans[3];
+ TGeoCombiTrans* jmdconnectorcardBcombitrans[3];
+ for(Int_t i=0; i<3; i++){
+   jmdconnectorcardBtrans[i] = new TGeoTranslation(fgkEndCapInterfaceCardBThickness
+                                                        + fgkEndCapCardJMDConnectorLength[0], 
+                                                          fgkEndCapCardElectBoardLayerWidth[1],
+                                                          0.5*fgkEndCapCardJMDConnectorThickness
+                                                        + 0.5*(fgkEndCapInterfaceCardBLength[1]
+                                                        - 2.*fgkEndCapInterfaceCardBJMDConnectorSeparation)
+                                                        + i *fgkEndCapInterfaceCardBJMDConnectorSeparation);    
+   jmdconnectorcardBcombitrans[i] = new TGeoCombiTrans(*jmdconnectorcardBtrans[i],
+                                                                                                          *jmdconnectorcardBrot);
+   interfacecardBmother->AddNode(jmdconnector,i+1,jmdconnectorcardBcombitrans[i]);
+ }
+ // Mother Supply Card Container 
+ TGeoVolumeAssembly* mothersupplycard = new TGeoVolumeAssembly("EndCapCardMotherSupply");
+ // Interface Card Container
+ TGeoVolumeAssembly* motherinterfacecardcontainer = new TGeoVolumeAssembly("EndCapMotherInterfaceCardA");
+ // Placing Volumes in Mother Supply Card Container
+ // JMD Connector Positioning
+ TGeoTranslation* jmdconnectortrans[2];
+ for(Int_t i=0; i<2; i++) jmdconnectortrans[i] = new TGeoTranslation();
+ jmdconnectortrans[0]->SetTranslation(0.,fgkEndCapCardElectBoardLayerWidth[1],
+                                                                                       fgkEndCapCardElectBoardBackLength[0]
+                                         -                                             fgkEndCapCardJMDConnectorThickness
+                                         -                                             fgkEndCapCardJMDConnectorToLayer);
+ TGeoRotation* jmdconnectorot = new TGeoRotation();
+ jmdconnectortrans[1]->SetTranslation(fgkEndCapCardElectBoardBackThickness
+                                                                + 2.*fgkEndCapCardJMDConnectorLength[0]
+                                                                + 2.*fgkEndCapCardElectBoardLayerThickness,
+                                                                         fgkEndCapCardElectBoardLayerWidth[1],
+                                                                     fgkEndCapCardJMDConnectorThickness
+                                                                +    fgkEndCapCardJMDConnectorToLayer);
+ jmdconnectorot->SetAngles(90.,180.,-90);
+ TGeoCombiTrans* jmdconnectorcombitrans = new TGeoCombiTrans(*jmdconnectortrans[1],
+                                                                               * jmdconnectorot);
+ mothersupplycard->AddNode(jmdconnector,1,jmdconnectortrans[0]);
+ mothersupplycard->AddNode(jmdconnector,2,jmdconnectorcombitrans);
+ // Top Cable Connector Placing
+ TGeoRotation* cableconnectorot[2];
+ for(Int_t i=0; i<2; i++) cableconnectorot[i] = new TGeoRotation();
+ TGeoTranslation* cableconnectortrans[3];
+ for(Int_t i=0; i<3; i++) cableconnectortrans[i] = new TGeoTranslation();
+ cableconnectorot[0]->SetAngles(90.,0.,0.); 
+ cableconnectorot[1]->SetAngles(0.,-90.,0.); 
+ cableconnectortrans[0]->SetTranslation(fgkEndCapCardJMDConnectorLength[0],0.,0.);
+ TGeoCombiTrans* cableconnectorcombitrans = new TGeoCombiTrans(*cableconnectortrans[0],
+                                                                                                                          *cableconnectorot[0]);
+ TGeoHMatrix* cableconnectormatrix[2];
+ for(Int_t i=0; i<2; i++) cableconnectormatrix[i] =
+                                                       new TGeoHMatrix((*cableconnectorot[1])
+                                                                                  *(*cableconnectorcombitrans));
+ cableconnectortrans[1]->SetTranslation(0.,fgkEndCapCardElectBoardLayerWidth[0]
+                                          -                               fgkEndCapCardCableConnectorThickness,
+                                                                               fgkEndCapCardCableConnectorLength[0]
+                                          +                            fgkEndCapCardCableConnectorToLayer);
+ cableconnectortrans[2]->SetTranslation(0.,fgkEndCapCardElectBoardLayerWidth[0]
+                                          -                2.*fgkEndCapCardCableConnectorThickness
+                                          -                            fgkEndCapCardCableConnectorDistance,
+                                                                               fgkEndCapCardCableConnectorLength[0]
+                                          +                            fgkEndCapCardCableConnectorToLayer);
+ for(Int_t i=0; i<2; i++){
+       cableconnectormatrix[i]->MultiplyLeft(cableconnectortrans[i+1]);
+    mothersupplycard->AddNode(cableconnector,i+1,cableconnectormatrix[i]);
+ }
+ TGeoRotation* electboardbackrot = new TGeoRotation(); 
+ TGeoTranslation* electboardbacktrans = new TGeoTranslation();
+ electboardbackrot->SetAngles(90.,-90.,-90.);
+ electboardbacktrans->SetTranslation(fgkEndCapCardElectBoardBackThickness
+                                                       +                fgkEndCapCardJMDConnectorLength[0]
+                                                       +                fgkEndCapCardElectBoardLayerThickness,0.,0.);
+ TGeoCombiTrans* electboardbackcombitrans = new TGeoCombiTrans(*electboardbacktrans,
+                                                                                                                          *electboardbackrot);
+ mothersupplycard->AddNode(electboardback,1,electboardbackcombitrans);
+ // Electronic Board Kapton Layer Positioning
+ TGeoRotation* electlayerrot = new TGeoRotation();
+ TGeoTranslation* electlayertrans[2];
+ TGeoCombiTrans* electlayercombitrans[2];
+ for(Int_t i=0; i<2; i++) electlayertrans[i] = new TGeoTranslation();
+ electlayerrot->SetAngles(90.,-90.,-90.);
+ electlayertrans[0]->SetTranslation(fgkEndCapCardJMDConnectorLength[0]
+                                                                + fgkEndCapCardElectBoardLayerThickness,0.,0.);
+ electlayertrans[1]->SetTranslation(fgkEndCapCardJMDConnectorLength[0]
+                                                                + 2.*fgkEndCapCardElectBoardLayerThickness
+                                                                + fgkEndCapCardElectBoardBackThickness,0.,0.);
+ for(Int_t i=0; i<2; i++){
+       electlayercombitrans[i] = new TGeoCombiTrans(*electlayertrans[i],*electlayerrot);
+       mothersupplycard->AddNode(electlayer,i+1,electlayercombitrans[i]);
+ }
+ // Placing Volumes in Mother Interface Card Container
+ motherinterfacecardcontainer->AddNode(jmdconnector,1,jmdconnectorcombitrans);
+ motherinterfacecardcontainer->AddNode(electboardback,1,electboardbackcombitrans);
+ for(Int_t i=0; i<2; i++){
+       motherinterfacecardcontainer->AddNode(electlayer,i+1,electlayercombitrans[i]);
+ }
+ /////////////////////////////////////////////////////////////
+ // Generation of Card Interface Container
+ /////////////////////////////////////////////////////////////
+ Double_t stiffenertransx = fgkEndCapKaptonFoilWidth-fgkEndCapStiffenerWidth
+                                                 - fgkEndCapCardJMDConnectorLength[0]
+                                                 - fgkEndCapInterfaceCardBThickness
+                                                 - 9.*fgkEndCapStripConnectionThickness
+                                                 - 8.*fgkEndCapCardElectBoardBackThickness;
+ const Int_t kcardinterfacecontainervertexnumber = 14;
+ Double_t xcardinterfacecontainervertex[kcardinterfacecontainervertexnumber];
+ Double_t ycardinterfacecontainervertex[kcardinterfacecontainervertexnumber];
+ xcardinterfacecontainervertex[0]  =-6.5*fgkEndCapCardElectBoardBackThickness
+                                                                  - 7.0*fgkEndCapStripConnectionThickness;
+ xcardinterfacecontainervertex[1]  = xcardinterfacecontainervertex[0];
+ xcardinterfacecontainervertex[2]  = xcardinterfacecontainervertex[1]
+                                                                  + fgkEndCapStripConnectionThickness
+                                                                  - fgkEndCapCardElectBoardLayerThickness
+                                                                  - fgkEndCapCardCableConnectorWidth[0];
+ xcardinterfacecontainervertex[3]  = xcardinterfacecontainervertex[2];
+ xcardinterfacecontainervertex[4]  = xcardinterfacecontainervertex[1];
+ xcardinterfacecontainervertex[5]  = xcardinterfacecontainervertex[4];
+ xcardinterfacecontainervertex[6]  = 1.5*fgkEndCapCardElectBoardBackThickness
+                                                                  + 2.0*fgkEndCapStripConnectionThickness;
+ xcardinterfacecontainervertex[7]  = xcardinterfacecontainervertex[6];
+ xcardinterfacecontainervertex[8]  = xcardinterfacecontainervertex[7]
+                                                                  + fgkEndCapInterfaceCardBThickness;
+ xcardinterfacecontainervertex[9]  = xcardinterfacecontainervertex[8];
+ xcardinterfacecontainervertex[10] = xcardinterfacecontainervertex[9]
+                                                                  + fgkEndCapInterfaceElectBoardCardBThickness;
+ xcardinterfacecontainervertex[11] = xcardinterfacecontainervertex[10];
+ xcardinterfacecontainervertex[12] = xcardinterfacecontainervertex[11]
+                                   - fgkEndCapInterfaceElectBoardCardBThickness
+                                                                  + fgkEndCapCardJMDConnectorLength[0]
+                                                                  + stiffenertransx+fgkEndCapStiffenerWidth;
+ xcardinterfacecontainervertex[13] = xcardinterfacecontainervertex[12];                                                                   
+
+ ycardinterfacecontainervertex[0]  = 0.;
+ ycardinterfacecontainervertex[1]  = fgkEndCapCardElectBoardLayerWidth[1]
+                                                                  + fgkEndCapCardJMDConnectorWidth[0]
+                                                                  + fgkEndCapCardJMDConnectorWidth[1];
+ ycardinterfacecontainervertex[2]  = ycardinterfacecontainervertex[1];
+ ycardinterfacecontainervertex[3]  = fgkEndCapCardElectBoardBackWidth[0]
+                                                                  - fgkEndCapStripConnectionWidth;
+ ycardinterfacecontainervertex[4]  = ycardinterfacecontainervertex[3];
+ ycardinterfacecontainervertex[5]  = fgkEndCapCardElectBoardBackWidth[0];
+ ycardinterfacecontainervertex[6]  = ycardinterfacecontainervertex[5];
+ ycardinterfacecontainervertex[7]  = fgkEndCapInterfaceCardBWidth[0]
+                                                                  + fgkEndCapInterfaceCardBWidth[1]
+                                                                  + fgkEndCapInterfaceCardBWidth[2];
+ ycardinterfacecontainervertex[8]  = ycardinterfacecontainervertex[7];
+ ycardinterfacecontainervertex[9]  = yelectboardcardBvertex[3];
+ ycardinterfacecontainervertex[10] = ycardinterfacecontainervertex[9];
+ ycardinterfacecontainervertex[11] = ycardinterfacecontainervertex[1];
+ ycardinterfacecontainervertex[12] = ycardinterfacecontainervertex[11];
+ ycardinterfacecontainervertex[13] = ycardinterfacecontainervertex[0];
+ TGeoXtru* interfacecardmothershape = new TGeoXtru(2);
+ interfacecardmothershape->DefinePolygon(kcardinterfacecontainervertexnumber,
+                                                                                 xcardinterfacecontainervertex,
+                                                                                 ycardinterfacecontainervertex);
+ interfacecardmothershape->DefineSection(0,-1.e-15-0.5*(fgkEndCapStiffenerLength
+                                                                          -    fgkEndCapCardElectBoardBackLength[0]));
+ interfacecardmothershape->DefineSection(1,0.5*(fgkEndCapStiffenerLength
+                                                                          +    fgkEndCapCardElectBoardBackLength[0]));
+ TGeoVolume** cardinterfacecontainer;
+ cardinterfacecontainer = new TGeoVolume*[4];
+ cardinterfacecontainer[0] = new TGeoVolume("EndCapCardsContainerLayer5Sx",
+                                                                                       interfacecardmothershape,fSSDAir); 
+ cardinterfacecontainer[1] = new TGeoVolume("EndCapCardsContainerLayer5Dx",
+                                                                                       interfacecardmothershape,fSSDAir); 
+ cardinterfacecontainer[2] = new TGeoVolume("EndCapCardsContainerLayer6Sx",
+                                                                                       interfacecardmothershape,fSSDAir); 
+ cardinterfacecontainer[3] = new TGeoVolume("EndCapCardsContainerLayer6Dx",
+                                                                                       interfacecardmothershape,fSSDAir); 
+ /////////////////////////////////
+ // cardinterfacecontainer[0]: Card Container End Cap Layer 5 Bellegarde Side
+ // cardinterfacecontainer[1]: Card Container End Cap Layer 5 Gex Side
+ // cardinterfacecontainer[2]: Card Container End Cap Layer 6 Bellegarde Side
+ // cardinterfacecontainer[3]: Card Container End Cap Layer 6 Gex Side
+ /////////////////////////////////
+ TGeoRotation* endcapstripconnectionrot[2];
+ for(Int_t i=0; i<2; i++) endcapstripconnectionrot[i] = new TGeoRotation();
+ endcapstripconnectionrot[0]->SetAngles(0.,90.,0.);
+ endcapstripconnectionrot[1]->SetAngles(90.,90.,-90.);
+ TGeoHMatrix* endcapstripconnectionmatrix = new TGeoHMatrix((*endcapstripconnectionrot[1])
+                                                                       *                                 (*endcapstripconnectionrot[0]));
+ TGeoTranslation* endcapstripconnectiontrans = new TGeoTranslation();
+ endcapstripconnectiontrans->SetTranslation(-endcapstripconnectionshape->GetDY()
+                                                                                       -0.5*fgkEndCapCardElectBoardBackThickness,
+                                                                                        fgkEndCapCardElectBoardBackWidth[0]
+                                                                                       -endcapstripconnectionshape->GetDZ(),
+                                                                                        0.5*fgkEndCapCardElectBoardBackLength[0]);
+ endcapstripconnectionmatrix->MultiplyLeft(endcapstripconnectiontrans);
+ TGeoTranslation* cardinterfacetrans[9];
+ TGeoHMatrix* cardinterfacematrix[9]; 
+ for(Int_t i=0; i<7; i++){ 
+       cardinterfacetrans[i] = new TGeoTranslation(-i*(fgkEndCapStripConnectionThickness
+                                                 +                                                     fgkEndCapCardElectBoardBackThickness),
+                                                                                               0.0,0.0);  
+       cardinterfacematrix[i] = new TGeoHMatrix((*cardinterfacetrans[i])
+                                                  *                             (*endcapstripconnectionmatrix));
+ }
+ cardinterfacetrans[7] = new TGeoTranslation((fgkEndCapStripConnectionThickness
+                                                 +                                             fgkEndCapCardElectBoardBackThickness),
+                                                                                               0.0,0.0);  
+ cardinterfacematrix[7] = new TGeoHMatrix((*cardinterfacetrans[7])
+                                               *                                 (*endcapstripconnectionmatrix));
+ cardinterfacetrans[8] = new TGeoTranslation(2.*(fgkEndCapStripConnectionThickness
+                                                 +                                             fgkEndCapCardElectBoardBackThickness),
+                                                                                               0.0,0.0);  
+ cardinterfacematrix[8] = new TGeoHMatrix((*cardinterfacetrans[8])
+                                               *                                 (*endcapstripconnectionmatrix));
+
+ for(Int_t i=0; i<4; i++){
+       cardinterfacecontainer[i]->AddNode(endcapstripconnection,1,
+                                                                          cardinterfacematrix[7]);                             
+       cardinterfacecontainer[i]->AddNode(endcapstripconnection,2,
+                                                                          cardinterfacematrix[8]);                             
+ }
+ TGeoTranslation* mothersupplycardtrans = 
+                                       new TGeoTranslation(-0.5*(fgkEndCapCardElectBoardBackThickness
+                                                                               + 2.*fgkEndCapCardJMDConnectorLength[0]
+                                                                               + 2.*fgkEndCapCardElectBoardLayerThickness),0.0,0.0);
+ TGeoHMatrix* mothersupplycardmatrix[7];
+ Int_t index[4] = {1,1,1,1};
+ for(Int_t i=0; i<7; i++){
+       mothersupplycardmatrix[i] = new TGeoHMatrix((*cardinterfacetrans[i])
+                                                       *                                 (*mothersupplycardtrans));
+       for(Int_t j=0; j<4; j++){
+               switch(j){
+                       case 0: //Layer5 EndCap Left Side  
+                               cardinterfacecontainer[j]->AddNode(endcapstripconnection,i+3,
+                                                                                                  cardinterfacematrix[i]);                             
+                               if(i!=0){
+                                       cardinterfacecontainer[j]->AddNode(mothersupplycard,index[j],
+                                                                                                          mothersupplycardmatrix[i]);                  
+                                       index[j]++;
+
+                               }
+                       break;
+                       case 1: //Layer5 EndCap Rigth Side  
+                               cardinterfacecontainer[j]->AddNode(endcapstripconnection,i+3,
+                                                                                                  cardinterfacematrix[i]);                     
+                               if(i>0&&i<6){
+                                       cardinterfacecontainer[j]->AddNode(mothersupplycard,index[j],
+                                                                                                          mothersupplycardmatrix[i]);                  
+                                       index[j]++;
+                               }
+                       break;
+                       case 2: //Layer6 EndCap Left Side  
+                               cardinterfacecontainer[j]->AddNode(endcapstripconnection,i+3,
+                                                                                                  cardinterfacematrix[i]);                             
+                               if(i!=6){
+                                       cardinterfacecontainer[j]->AddNode(mothersupplycard,index[j],
+                                                                                                          mothersupplycardmatrix[i]);                  
+                                       index[j]++;
+                               }
+                       break;
+                       case 3: //Layer6 EndCap Right Side  
+                               cardinterfacecontainer[j]->AddNode(endcapstripconnection,i+3,
+                                                                                                  cardinterfacematrix[i]);                             
+                               cardinterfacecontainer[j]->AddNode(mothersupplycard,index[j],
+                                                                                                  mothersupplycardmatrix[i]);                  
+                               index[j]++;
+                       break;
+               }
+       }
+ }
+ // Positioning Interface 
+ TGeoTranslation* motherinterfacecardtrans = 
+               new TGeoTranslation( -fgkEndCapCardJMDConnectorLength[0]
+                                                        +0.5*fgkEndCapCardElectBoardBackThickness
+                                                        -fgkEndCapCardElectBoardLayerThickness
+                                                        +fgkEndCapStripConnectionThickness,0.,0.);
+ for(Int_t i=0; i<4; i++) cardinterfacecontainer[i]->AddNode(
+                                       motherinterfacecardcontainer,i+1,motherinterfacecardtrans);
+ // Positioning Interface Card B 
+ TGeoTranslation* interfacecardBmothertrans = 
+                                       new TGeoTranslation(0.5 * fgkEndCapCardElectBoardBackThickness
+                                                                               + 2.*fgkEndCapStripConnectionThickness
+                                                                                       + fgkEndCapCardElectBoardBackThickness,0.,
+                                                                          -0.5 * (fgkEndCapInterfaceCardBLength[1]
+                                                                                       -  fgkEndCapCardElectBoardBackLength[0]));                              
+ for(Int_t i=0; i<4; i++) cardinterfacecontainer[i]->AddNode(interfacecardBmother,1,
+                                                                                                                        interfacecardBmothertrans);
+ // Positioning Stiffener 
+ TGeoTranslation* endcapstiffenertrans = 
+                                               new TGeoTranslation(1.5*fgkEndCapCardElectBoardBackThickness
+                                                                          +    2.0*fgkEndCapStripConnectionThickness
+                                                                          +    fgkEndCapInterfaceCardBThickness
+                                                                          +    fgkEndCapCardJMDConnectorLength[0]
+                                                                          +    stiffenertransx
+                                                                          +    endcapstiffenershape->GetDX(),endcapstiffenershape->GetDY(),
+                                                                                       endcapstiffenershape->GetDZ()
+                                                                          -    0.5*(fgkEndCapStiffenerLength
+                                                                          -    fgkEndCapCardElectBoardBackLength[0]));
+ for(Int_t i=0; i<4; i++) cardinterfacecontainer[i]->AddNode(endcapstiffener,1,endcapstiffenertrans);  
+ /////////////////////////////////////////////////////////////
+ // Deallocating memory
+ /////////////////////////////////////////////////////////////
+ delete interfacecardBrot;
+ delete interfacecardBtrans;
+ delete electboardcardBtrans;
+ delete electboardcardBrot; 
+ delete jmdconnectorcardBrot;
+ for(Int_t i=0; i<3; i++) delete jmdconnectorcardBtrans[i];
+ delete jmdconnectorot;
+ delete jmdconnectortrans[1];
+ for(Int_t i=0; i<2; i++) delete cableconnectorot[i];
+ delete cableconnectorcombitrans;
+ delete electboardbacktrans;
+ delete electboardbackrot;
+ delete electlayerrot;
+ for(Int_t i=0; i<2; i++) delete electlayertrans[i];
+ for(Int_t i=0; i<2; i++) delete endcapstripconnectionrot[i];
+ delete mothersupplycardtrans;
+ for(Int_t i=0; i<7; i++) delete cardinterfacetrans[i];
+ /////////////////////////////////////////////////////////////
+ return cardinterfacecontainer;
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume** AliITSv11GeometrySSD::GetEndCapAssembly(){ 
+  /////////////////////////////////////////////////////////////
+  // Method returning EndCap Mother Volume
+  /////////////////////////////////////////////////////////////
+  const Int_t kendcapcoverplatesmallholenumber = 9;
+  Double_t endcapmotherorigin[3];
+  endcapmotherorigin[0] = -fgkEndCapCoverPlateLength[0]
+                                               +  0.5 *(fgkEndCapCoverPlateLength[3]
+                                           +  2.0 * fgkEndCapCoverPlateLength[2]);
+  endcapmotherorigin[1] = - 0.5 * (fgkEndCapCoverPlateWidth[0]
+                                         -                      fgkEndCapCoverPlateWidth[2]
+                                         -       (kendcapcoverplatesmallholenumber-1)
+                                         *        fgkEndCapCoverPlateSmallHoleSeparation[2])
+                                         +  0.5*(fgkEndCapSideCoverLength[2]
+                                         +               fgkEndCapCoverPlateWidth[1]
+                                         -       fgkEndCapCoverPlateWidth[0])
+                                         -      (fgkEndCapCoverPlateWidth[1]
+                                         -       fgkEndCapCoverPlateWidth[0]);
+  endcapmotherorigin[2] = 0.5*fgkEndCapCoverPlateThickness
+                                               + 2.*fgkEndCapCoolingTubeRadiusMax
+                                               - 0.5*(2.*fgkEndCapCoolingTubeRadiusMax
+                                               +      fgkEndCapSideCoverWidth[1]
+                                               +      fgkEndCapSideCoverThickness
+                                               +      fgkEndCapKaptonFoilThickness);
+  TGeoBBox* endcapmothershape = new TGeoBBox(0.5*(fgkEndCapCoverPlateLength[3]
+                                                         +                              2.0* fgkEndCapCoverPlateLength[2]
+                                                         +              2.0* fgkEndCapSideCoverThickness),
+                                                                        0.5* (fgkEndCapSideCoverLength[2]
+                                                         +                    fgkEndCapCoverPlateWidth[1]
+                                                         -                                        fgkEndCapCoverPlateWidth[0]),
+                                                                                        0.5* (2.*fgkEndCapCoolingTubeRadiusMax
+                                                     +                                    fgkEndCapSideCoverWidth[1]
+                                                         +                                       fgkEndCapSideCoverThickness
+                                                     +                                   fgkEndCapKaptonFoilThickness),
+                                                                                        endcapmotherorigin);
+  TGeoVolume** endcapassembly;  
+  endcapassembly = new TGeoVolume*[4];
+  endcapassembly[0] = new TGeoVolume("EndCapContainerLayer5Sx",
+                                                                                       endcapmothershape,fSSDAir); 
+  endcapassembly[1] = new TGeoVolume("EndCapContainerLayer5Dx",
+                                                                                       endcapmothershape,fSSDAir); 
+  endcapassembly[2] = new TGeoVolume("EndCapContainerLayer6Sx",
+                                                                                       endcapmothershape,fSSDAir); 
+  endcapassembly[3] = new TGeoVolume("EndCapContainerLayer6Dx",
+                                                                                       endcapmothershape,fSSDAir); 
+ /////////////////////////////////
+ // endcapassembly[0]:  Container End Cap Layer 5 Bellegarde Side
+ // endcapassembly[1]:  Container End Cap Layer 5 Gex Side
+ // endcapassembly[2]:  Container End Cap Layer 6 Bellegarde Side
+ // endcapassembly[3]:  Container End Cap Layer 6 Gex Side
+ /////////////////////////////////
+  /////////////////////////////////////////////////////
+  // Placing Endcap Cover Plate
+  /////////////////////////////////////////////////////
+  TGeoVolume* endcapcoverplate = GetEndCapCoverPlate();
+  TGeoRotation* endcapcoverplaterot = new TGeoRotation();
+  endcapcoverplaterot->SetAngles(90.0,180.0,-90.0);
+  TGeoCombiTrans* endcapcoverplatecombitrans = 
+                                                 new TGeoCombiTrans(-0.5*fgkEndCapCoverPlateLength[1],0.,0.,
+                                                                                        endcapcoverplaterot);
+  TGeoTranslation* endcapcoverplatetrans = 
+                                                 new TGeoTranslation(1.5*fgkEndCapCoverPlateLength[1],0.,0.);
+  TGeoHMatrix* endcapcoverplatematrix = 
+                                                 new TGeoHMatrix((*endcapcoverplatetrans)
+                                                                         *       (*endcapcoverplatecombitrans));
+  for(Int_t i=0; i<4; i++) endcapassembly[i]->AddNode(endcapcoverplate,1,endcapcoverplatematrix);
+  /////////////////////////////////////////////////////
+  // Placing Endcap Side Cover
+  /////////////////////////////////////////////////////
+  TGeoVolume* endcapsidecover = GetEndCapSideCover();
+  TGeoRotation* endcapsidecoverot[2];
+  TGeoCombiTrans* endcapsidecovercombitrans[3];
+  for(Int_t i=0; i<2; i++) endcapsidecoverot[i] = new TGeoRotation();
+  endcapsidecoverot[0]->SetAngles(-90.,0.,0.);
+  endcapsidecovercombitrans[0] = new TGeoCombiTrans(0.0,
+                                                                                       - 0.5*(fgkEndCapCoverPlateWidth[0]
+                                                                                       - fgkEndCapCoverPlateWidth[2]
+                                                                                   - (kendcapcoverplatesmallholenumber-1)
+                                                                                       * fgkEndCapCoverPlateSmallHoleSeparation[2])
+                                                                                       + 0.*fgkEndCapCoverPlateWidth[0]
+                                                                                       + fgkEndCapSideCoverLength[2],
+                                                                                         0.5*(fgkEndCapSideCoverThickness
+                                                                                       + fgkEndCapCoverPlateThickness)
+                                                                                       - 0.5*fgkEndCapCoverPlateThickness,
+                                                                                         endcapsidecoverot[0]);
+  endcapsidecoverot[1]->SetAngles(90.,-90.,-90.); 
+  endcapsidecovercombitrans[1] = new TGeoCombiTrans(-fgkEndCapCoverPlateLength[0],0.0,
+                                                                                                       0.5*fgkEndCapCoverPlateThickness
+                                                                                                       -fgkEndCapSideCoverWidth[1],
+                                                                                                       endcapsidecoverot[1]);
+  endcapsidecovercombitrans[2] = new TGeoCombiTrans(-fgkEndCapCoverPlateLength[0]
+                                                                                                       +fgkEndCapCoverPlateLength[3]
+                                                                                                       +2.*fgkEndCapCoverPlateLength[2]
+                                                                                                       +fgkEndCapSideCoverThickness,0.0,
+                                                                                                       0.5*fgkEndCapCoverPlateThickness
+                                                                                                       -fgkEndCapSideCoverWidth[1],
+                                                                                                       endcapsidecoverot[1]);
+  TGeoHMatrix* endcapsidecovermatrix[2];
+  for(Int_t i=0; i<2; i++){
+   endcapsidecovermatrix[i] = new TGeoHMatrix((*endcapsidecovercombitrans[i+1])
+                                                       *                                 (*endcapsidecovercombitrans[0]));
+       for(Int_t k=0; k<4; k++) endcapassembly[k]->AddNode(endcapsidecover,i+1,
+                                                                                                               endcapsidecovermatrix[i]);
+  }
+  /////////////////////////////////////////////////////
+  // Placing Endcap Cooling Tube
+  /////////////////////////////////////////////////////
+  TGeoVolume* endcapcoolingtube = GetEndCapCoolingTube();
+  TGeoRotation* endcapcoolingtuberot = new TGeoRotation();
+  endcapcoolingtuberot->SetAngles(0.,180.,0.); 
+  TGeoCombiTrans* endcapccolingtubecombitrans 
+                                               = new TGeoCombiTrans(-0.5*(fgkEndCapCoolingTubeAxialRadius[0]
+                                               + fgkEndCapCoolingTubeAxialRadius[1])
+                                               + fgkEndCapCoverPlateLength[0]+fgkEndCapCoverPlateLength[1]
+                                               - fgkEndCapCoolingTubeToCoverSide,
+                                                 fgkEndCapCoolingTubeAxialRadius[0],fgkEndCapCoolingTubeRadiusMax
+                                               + 0.5*fgkEndCapCoverPlateThickness,endcapcoolingtuberot);
+  for(Int_t i=0; i<4; i++) endcapassembly[i]->AddNode(endcapcoolingtube,1,
+                                                                                                         endcapccolingtubecombitrans);
+  /////////////////////////////////////////////////////
+  // Placing Screws 
+  /////////////////////////////////////////////////////
+  Double_t screwcoverplateradius[2] = {fgkEndCapCoverPlateScrewRadiusMax,
+                                                                          fgkEndCapCoverPlateScrewRadiusMin};
+  Int_t screwcoverplatedgesnumber[2] = {20,20};
+  Double_t screwcoverplatesection[2] = {0.5*fgkEndCapCoverPlateThickness,
+                                                                               fgkEndCapCoverPlateThickness
+                                                                        +  fgkEndCapCoolingTubeRadiusMax};
+  TGeoShape* screwcoverplateshape = GetScrewShape(screwcoverplateradius,
+                                                                                                screwcoverplatedgesnumber,
+                                                                                                screwcoverplatesection);
+  TGeoVolume* screwcoverplate = new TGeoVolume("EndCapScrewCoverPlate",
+                                                                                          screwcoverplateshape,
+                                                                                          fSSDCoolingTubePhynox); 
+  screwcoverplate->SetLineColor(12);
+  Double_t transx[4] = {0,
+                                               fgkEndCapCoverPlateSmallHoleSeparation[0],
+                                               fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                        +  fgkEndCapCoverPlateSmallHoleSeparation[1],
+                                        2.*fgkEndCapCoverPlateSmallHoleSeparation[0]
+                                        +  fgkEndCapCoverPlateSmallHoleSeparation[1]};
+  const Int_t kendcapcoverplatescrewnumber[2] = {4,9}; 
+//  TGeoTranslation** endcapcoverplatescrewtrans[kendcapcoverplatescrewnumber[0]]; 
+  TGeoTranslation*** endcapcoverplatescrewtrans;
+  endcapcoverplatescrewtrans = new TGeoTranslation**[kendcapcoverplatescrewnumber[0]]; 
+  Int_t index = 0;
+  for(Int_t i=0; i<kendcapcoverplatescrewnumber[0]; i++){
+       endcapcoverplatescrewtrans[i] = 
+                                       new TGeoTranslation*[kendcapcoverplatescrewnumber[1]];
+    for(Int_t j=0; j<kendcapcoverplatescrewnumber[1]; j++){
+               index = kendcapcoverplatescrewnumber[1]*i+j+1;
+        if(index==1||index==9||index==28||index==36){
+                       endcapcoverplatescrewtrans[i][j] = 
+                               new TGeoTranslation(transx[i],
+                                                                       j*fgkEndCapCoverPlateSmallHoleSeparation[2],
+                                                                       fgkEndCapSideCoverThickness);
+               }
+               else{
+                       endcapcoverplatescrewtrans[i][j] = 
+                               new TGeoTranslation(transx[i],
+                                                                       j*fgkEndCapCoverPlateSmallHoleSeparation[2],
+                                                                       0.);
+               }
+           if(index!=19) 
+               for(Int_t k=0; k<4; k++) endcapassembly[k]->AddNode(screwcoverplate,index,
+                                                                                         endcapcoverplatescrewtrans[i][j]);
+       }
+  }
+  /////////////////////////////////////////////////////
+  // Placing Cover Plate Clips 
+  /////////////////////////////////////////////////////
+  TGeoBBox* endcapcoverplateclipshape = new TGeoBBox(0.5*fgkEndCapCoverPlateClipLength,
+                                                                                                        0.5*fgkEndCapCoverPlateClipWidth,
+                                                                                                        0.5*fgkEndCapSideCoverThickness);
+  TGeoVolume* endcapcoverplateclip = new TGeoVolume("EndCapCoverPlateUpClip",
+                                                                                                       endcapcoverplateclipshape,
+                                                                                                       fSSDCoolingTubePhynox);
+  TGeoBBox* endcapcoverplatedownclipshape = new TGeoBBox(0.5*fgkEndCapCoverPlateDownClipLength,
+                                                                                                        0.5*fgkEndCapCoverPlateDownClipWidth,
+                                                                                                        0.5*fgkEndCapSideCoverThickness);
+  TGeoVolume* endcapcoverplatedownclip = new TGeoVolume("EndCapCoverPlateDownClip",
+                                                                                                       endcapcoverplatedownclipshape,
+                                                                                                       fSSDCoolingTubePhynox);
+  TGeoTranslation* endcapcoverplatecliptrans[4];
+  endcapcoverplatecliptrans[0] = new TGeoTranslation(0.5*fgkEndCapCoverPlateClipLength
+                                                          -                     fgkEndCapCoverPlateLength[0]
+                                                          -                     fgkEndCapSideCoverThickness,
+                                                                                                        0.0,
+                                                                                                0.5*(fgkEndCapSideCoverThickness
+                                                          +                                              fgkEndCapCoverPlateThickness));
+  endcapcoverplatecliptrans[1] = new TGeoTranslation(0.5*fgkEndCapCoverPlateClipLength
+                                                          -                     fgkEndCapCoverPlateLength[0]
+                                                          -                     fgkEndCapSideCoverThickness,
+                                                                                                        (kendcapcoverplatescrewnumber[1]-1)
+                                                          *                                     fgkEndCapSideCoverWidth[5],
+                                                                                                0.5*(fgkEndCapSideCoverThickness
+                                                          +                                              fgkEndCapCoverPlateThickness));
+  endcapcoverplatecliptrans[2] = new TGeoTranslation(0.5*fgkEndCapCoverPlateClipLength
+                                                          -                     fgkEndCapCoverPlateLength[0]
+                                                          +                                     fgkEndCapCoverPlateLength[1]
+                                                          +                              2.*fgkEndCapCoverPlateLength[0]
+                                                          -                                     fgkEndCapCoverPlateClipLength
+                                                          +                                 fgkEndCapSideCoverThickness,
+                                                                                                        0.0,
+                                                                                                0.5*(fgkEndCapSideCoverThickness
+                                                          +                                              fgkEndCapCoverPlateThickness));
+  endcapcoverplatecliptrans[3] = new TGeoTranslation(0.5*fgkEndCapCoverPlateClipLength
+                                                          -                     fgkEndCapCoverPlateLength[0]
+                                                          +                                     fgkEndCapCoverPlateLength[1]
+                                                          +                              2.*fgkEndCapCoverPlateLength[0]
+                                                          -                                     fgkEndCapCoverPlateClipLength
+                                                          +                                 fgkEndCapSideCoverThickness,
+                                                                                                        (kendcapcoverplatescrewnumber[1]-1)
+                                                          *                                     fgkEndCapSideCoverWidth[5],
+                                                                                                0.5*(fgkEndCapSideCoverThickness
+                                                          +                                              fgkEndCapCoverPlateThickness));
+  endcapcoverplateclip->SetLineColor(fColorPhynox);
+  endcapcoverplatedownclip->SetLineColor(fColorPhynox);  
+  for(Int_t i=0; i<4; i++) 
+       for(Int_t j=0; j<4; j++) endcapassembly[j]->AddNode(endcapcoverplateclip,i+1,
+                                                                                                  endcapcoverplatecliptrans[i]);  
+  TGeoTranslation* endcapcoverplatedowncliptrans[4];
+  endcapcoverplatedowncliptrans[0] = new TGeoTranslation(0.5*fgkEndCapCoverPlateDownClipLength
+                                                                  -                     fgkEndCapCoverPlateLength[0]
+                                                                  -                     fgkEndCapSideCoverThickness,
+                                                                                   0.5*(fgkEndCapCoverPlateDownClipWidth
+                                                                  -                                 fgkEndCapCoverPlateClipWidth),
+                                                                                                       0.5*(fgkEndCapSideCoverThickness
+                                                              +                                         fgkEndCapCoverPlateThickness)
+                                                                  -                     fgkEndCapSideCoverWidth[1]
+                                                                  -                                     fgkEndCapSideCoverThickness);
+  endcapcoverplatedowncliptrans[1] = new TGeoTranslation(0.5*fgkEndCapCoverPlateDownClipLength
+                                                                  -                     fgkEndCapCoverPlateLength[0]
+                                                                  -                     fgkEndCapSideCoverThickness,
+                                                                                   0.5*(fgkEndCapCoverPlateDownClipWidth
+                                                                  -                                 fgkEndCapCoverPlateClipWidth)
+                                                                  +                            fgkEndCapSideCoverLength[2]
+                                                                  -                            fgkEndCapCoverPlateDownClipWidth,
+                                                                                                       0.5*(fgkEndCapSideCoverThickness
+                                                              +                                         fgkEndCapCoverPlateThickness)
+                                                                  -                     fgkEndCapSideCoverWidth[1]
+                                                                  -                                     fgkEndCapSideCoverThickness);
+  endcapcoverplatedowncliptrans[2] = new TGeoTranslation(0.5*fgkEndCapCoverPlateDownClipLength
+                                                                  -                     fgkEndCapCoverPlateLength[0]
+                                                                  +                     fgkEndCapSideCoverThickness
+                                                                  +                     fgkEndCapCoverPlateLength[1]
+                                                                  +                 2.0*fgkEndCapCoverPlateLength[0]
+                                                                  -                     fgkEndCapCoverPlateDownClipLength,
+                                                                                   0.5*(fgkEndCapCoverPlateDownClipWidth
+                                                                  -                                 fgkEndCapCoverPlateClipWidth),
+                                                                                                       0.5*(fgkEndCapSideCoverThickness
+                                                              +                                         fgkEndCapCoverPlateThickness)
+                                                                  -                     fgkEndCapSideCoverWidth[1]
+                                                                  -                                     fgkEndCapSideCoverThickness);
+  endcapcoverplatedowncliptrans[3] = new TGeoTranslation(0.5*fgkEndCapCoverPlateDownClipLength
+                                                                  -                     fgkEndCapCoverPlateLength[0]
+                                                                  +                     fgkEndCapSideCoverThickness
+                                                                  +                     fgkEndCapCoverPlateLength[1]
+                                                                  +                 2.0*fgkEndCapCoverPlateLength[0]
+                                                                  -                     fgkEndCapCoverPlateDownClipLength,
+                                                                                   0.5*(fgkEndCapCoverPlateDownClipWidth
+                                                                  -                                 fgkEndCapCoverPlateClipWidth)
+                                                                  +                                 fgkEndCapSideCoverLength[2]
+                                                                  -                                 fgkEndCapCoverPlateDownClipWidth,
+                                                                                                       0.5*(fgkEndCapSideCoverThickness
+                                                              +                                         fgkEndCapCoverPlateThickness)
+                                                                  -                     fgkEndCapSideCoverWidth[1]
+                                                                  -                                     fgkEndCapSideCoverThickness);
+  for(Int_t i=0; i<4; i++)
+       for(Int_t k=0; k<4; k++) endcapassembly[k]->AddNode(endcapcoverplatedownclip,i+1,
+                                                                                                  endcapcoverplatedowncliptrans[i]);
+  /////////////////////////////////////////////////////
+  // Placing Kapton Foil
+  /////////////////////////////////////////////////////
+  TGeoBBox* endcapkaptonfoilshape = new TGeoBBox(0.5*fgkEndCapKaptonFoilLength,
+                                                                                                0.5*fgkEndCapKaptonFoilWidth,
+                                                                                                0.5*fgkEndCapKaptonFoilThickness); 
+  TGeoVolume* endcapkaptonfoil = new TGeoVolume("EndCapKaptonFoil",
+                                                                                               endcapkaptonfoilshape,
+                                                                                               fSSDKaptonFlexMedium);
+  endcapkaptonfoil->SetLineColor(8);
+  TGeoTranslation* endcapkaptonfoiltrans = new TGeoTranslation(0.5*fgkEndCapCoverPlateLength[1],
+                                                                                                                          0.5*fgkEndCapKaptonFoilWidth
+                                                                                -                     0.5*fgkEndCapCoverPlateClipWidth,
+                                                                                                                          0.5*fgkEndCapCoverPlateThickness
+                                                                                -                     0.5*fgkEndCapKaptonFoilThickness
+                                                                            -                     fgkEndCapSideCoverWidth[1]
+                                                                                -                     fgkEndCapSideCoverThickness);
+  for(Int_t i=0; i<4; i++) endcapassembly[i]->AddNode(endcapkaptonfoil,1,endcapkaptonfoiltrans);
+  /////////////////////////////////////////////////////////////
+  // Placing Electronic Tubes
+  /////////////////////////////////////////////////////////////
+  Double_t endcapeffectivecableswidth[2] = {fgkEndCapKaptonFoilWidth
+                                                                            - fgkEndCapInterfaceCardBThickness
+                                                                            - 9.*fgkEndCapStripConnectionThickness
+                                                                            - 8.*fgkEndCapCardElectBoardBackThickness,
+                                                                              fgkEndCapKaptonFoilWidth
+                                                                            - fgkEndCapInterfaceCardBThickness
+                                                                            - 9.*fgkEndCapStripConnectionThickness
+                                                                            - 8.*fgkEndCapCardElectBoardBackThickness
+                                                                                - fgkEndCapInterfaceElectBoardCardBThickness};
+  TGeoVolume* endcapeffectivecables[2];
+  endcapeffectivecables[0] = GetEndCapEffectiveCables(fgkEndCapEffectiveCableRadiusMin,
+                                                                                        fgkEndCapEffectiveCableRadiusMax,
+                                                                                        endcapeffectivecableswidth[0],
+                                                                                        10,"EndCapEffectiveCables1"); 
+  endcapeffectivecables[1] = GetEndCapEffectiveCables(fgkEndCapEffectiveCableRadiusMin,
+                                                                                        fgkEndCapEffectiveCableRadiusMax,
+                                                                                        endcapeffectivecableswidth[1],
+                                                                                        25,"EndCapEffectiveCables2"); 
+  TGeoRotation* endcapeffectivecablesrot = new TGeoRotation();
+  TGeoTranslation* endcapeffectivecablestrans[2];
+  endcapeffectivecablestrans[0] = new TGeoTranslation(0.5*fgkEndCapCoverPlateLength[1],
+                                         -                                                        0.5*endcapeffectivecableswidth[0]
+                                         -                            0.5*(fgkEndCapCoverPlateWidth[0]
+                                         -                                                               fgkEndCapCoverPlateWidth[2]
+                                         -                                             (kendcapcoverplatesmallholenumber-1)
+                                         *                                             fgkEndCapCoverPlateSmallHoleSeparation[2])
+                                         +                                             fgkEndCapSideCoverLength[2],
+                                         -                     0.5*fgkEndCapCoverPlateThickness
+                                         -                                             (fgkEndCapCardElectBoardBackWidth[0]
+                                         -                                              fgkEndCapInterfaceCardBWidth[0]
+                                         -                                              fgkEndCapInterfaceCardBWidth[1]));
+  endcapeffectivecablestrans[1] = new TGeoTranslation(0.5*fgkEndCapCoverPlateLength[1],
+                                         -                                                        0.5*endcapeffectivecableswidth[1]
+                                         -                            0.5*(fgkEndCapCoverPlateWidth[0]
+                                         -                                                               fgkEndCapCoverPlateWidth[2]
+                                         -                                             (kendcapcoverplatesmallholenumber-1)
+                                         *                                             fgkEndCapCoverPlateSmallHoleSeparation[2])
+                                         +                                         fgkEndCapSideCoverLength[2],
+                                         -                     0.5*fgkEndCapCoverPlateThickness
+                                         -                                             (fgkEndCapCardElectBoardBackWidth[0]
+                                         -                                              fgkEndCapInterfaceCardBWidth[0])
+                                         -                     0.5*fgkEndCapInterfaceCardBWidth[2]);
+  endcapeffectivecablesrot->SetAngles(0.,90.,0.);
+  TGeoCombiTrans* endcapeffectivecablescombitrans[2];
+  endcapeffectivecablescombitrans[0]  = new TGeoCombiTrans(*endcapeffectivecablestrans[0],
+                                                                                                                  *endcapeffectivecablesrot);
+  endcapeffectivecablescombitrans[1]  = new TGeoCombiTrans(*endcapeffectivecablestrans[1],
+                                                                                                                  *endcapeffectivecablesrot);
+//  for(Int_t i=0; i<4; i++) endcapassembly[i]->AddNode(endcapeffectivecables[0],1,
+//                                                                                                       endcapeffectivecablescombitrans[0]);
+  for(Int_t i=0; i<4; i++) endcapassembly[i]->AddNode(endcapeffectivecables[1],1,
+                                                                                                         endcapeffectivecablescombitrans[1]);
+  /////////////////////////////////////////////////////////////
+  // Placing End Cap Cards
+  /////////////////////////////////////////////////////////////
+  TGeoVolume** endcapcards = GetEndCapCards();
+  TGeoRotation* endcapcardsrot[2];
+  for(Int_t i=0; i<2; i++) endcapcardsrot[i] = new TGeoRotation();
+  endcapcardsrot[0]->SetAngles(90.,0.,0.); 
+  TGeoTranslation* endcapcardstrans[2]; 
+  endcapcardstrans[0] = new TGeoTranslation(0.,0.,0.5*(fgkEndCapInterfaceCardBLength[1]
+                                                                                       -  fgkEndCapCardElectBoardBackLength[0]));
+  TGeoCombiTrans* endcapcardscombitrans = new TGeoCombiTrans(*endcapcardstrans[0],*endcapcardsrot[0]);
+  endcapcardsrot[1]->SetAngles(90.,90.,-90.); 
+  TGeoHMatrix* endcapcardsmatrix[2];
+  endcapcardsmatrix[0] = new TGeoHMatrix((*endcapcardsrot[1])*(*endcapcardscombitrans));
+  Double_t stiffenertransx = fgkEndCapKaptonFoilWidth-fgkEndCapStiffenerWidth
+                                                 - fgkEndCapCardJMDConnectorLength[0]
+                                                 - fgkEndCapInterfaceCardBThickness
+                                                 - 9.*fgkEndCapStripConnectionThickness
+                                                 - 8.*fgkEndCapCardElectBoardBackThickness;  
+  endcapcardstrans[1] = new TGeoTranslation(-0.5*fgkEndCapStiffenerLength
+                                         -                                             fgkEndCapCoverPlateLength[0]
+                                         + 0.5 *              (fgkEndCapCoverPlateLength[3]
+                                         + 2.0 *                               fgkEndCapCoverPlateLength[2]),  
+                                         -                                                     stiffenertransx-fgkEndCapStiffenerWidth
+                                         -                                                               fgkEndCapCardJMDConnectorLength[0]
+                                         -                                                               fgkEndCapInterfaceCardBThickness
+                                         -     2.0 *                                             fgkEndCapStripConnectionThickness
+                                         - 1.5 *                                             fgkEndCapInterfaceCardBThickness
+                                         - 0.5 *                                                (fgkEndCapCoverPlateWidth[0]
+                                         -                                                               fgkEndCapCoverPlateWidth[2]
+                                         -                                             (kendcapcoverplatesmallholenumber-1)
+                                         *                                             fgkEndCapCoverPlateSmallHoleSeparation[2])
+                                         +                     fgkEndCapKaptonFoilWidth,
+                                                                                         0.5*fgkEndCapCoverPlateThickness
+                                         -                                                     fgkEndCapSideCoverWidth[1]);
+  endcapcardsmatrix[1] = new TGeoHMatrix((*endcapcardstrans[1])*(*endcapcardsmatrix[0]));
+  for(Int_t i=0; i<4; i++) endcapassembly[i]->AddNode(endcapcards[i],1,endcapcardsmatrix[1]);
+   /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete endcapcoverplaterot;
+  delete endcapcoverplatecombitrans;
+  delete endcapcoverplatetrans;
+  for(Int_t i=0; i<3; i++){
+   delete endcapsidecovercombitrans[i];
+   if(i<2) delete endcapsidecoverot[i];        
+  }
+  for(Int_t i=0; i<2; i++) delete endcapcardsrot[i];
+  for(Int_t i=0; i<2; i++) delete endcapcardstrans[i];
+  delete endcapcardsmatrix[0];
+  return endcapassembly;
+ } 
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume* AliITSv11GeometrySSD::GetEndCapEffectiveCables(Double_t radiusmin, 
+                                                                                                                       Double_t radiusmax, 
+                                                                                                                       Double_t width, 
+                                                                                                                       Int_t ncables,
+                                                                                                                       const char* volname){
+  /////////////////////////////////////////////////////////////
+  // Generating EndCap High Voltage Tubes 
+  /////////////////////////////////////////////////////////////
+  Double_t effectiveinneradius = TMath::Sqrt(ncables)*radiusmin;
+  Double_t effectiveouteradius = TMath::Sqrt(effectiveinneradius*effectiveinneradius+(radiusmax-radiusmin)*(radiusmax-radiusmin));
+
+  TGeoTube* effectiveinnertubeshape = new TGeoTube(0.,effectiveinneradius,0.5*width);
+  TGeoTube* effectiveoutertubeshape = new TGeoTube(effectiveinneradius,
+                                                                                                  effectiveouteradius,0.5*width);
+  TGeoVolume* effectiveinnertube = new TGeoVolume("EffectiveEndCapInnerTube",
+                                                                                               effectiveinnertubeshape,
+                                                                                               fSSDStiffenerConnectorMedium);
+  effectiveinnertube->SetLineColor(41);
+  TGeoVolume* effectiveoutertube = new TGeoVolume("EffectiveEndCapOuterTube",
+                                                                                               effectiveoutertubeshape,
+                                                                                               fSSDKaptonChipCableMedium);
+  effectiveoutertube->SetLineColor(39);
+  TGeoTube* effectivemothertubeshape = new TGeoTube(0.,effectiveouteradius,0.5*width);  
+  TGeoVolume* effectivemothertube = new TGeoVolume(volname,effectivemothertubeshape,fSSDAir);
+  effectivemothertube->AddNode(effectiveinnertube,1);
+  effectivemothertube->AddNode(effectiveoutertube,1);
+  return effectivemothertube;
+ } 
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume** AliITSv11GeometrySSD::EndCapSupport(){ 
+  /////////////////////////////////////////////////////////////
+  // Generating EndCap Support Layer 5 and Layer 6 
+  /////////////////////////////////////////////////////////////
+  const Int_t knedges = 5;
+  ///////////////////////////////////////////////
+  // Setting the vertices for TGeoXtru Up Volume
+  ///////////////////////////////////////////////
+  const Int_t klayernumber = 2;
+  Double_t xupvertex[klayernumber][knedges+3];
+  Double_t yupvertex[klayernumber][knedges+3];
+  Double_t upedgeangle[klayernumber] = {360./fgkSSDLay5LadderNumber,360./fgkSSDLay6LadderNumber};
+  Double_t middledgeangle[klayernumber] = {0.0,0.0};
+  Double_t middlepsi[klayernumber] = {0.0,0.0};
+  for(Int_t i=0; i<klayernumber; i++){
+       xupvertex[i][0] = -fgkEndCapSupportMiddleRadius[i]*SinD(0.5*upedgeangle[i]);
+       xupvertex[i][1] = -0.5*fgkEndCapSupportLength[i];
+       xupvertex[i][2] = -xupvertex[i][1];
+       xupvertex[i][3] = -xupvertex[i][0];
+
+       yupvertex[i][0] =  fgkEndCapSupportMiddleRadius[i]*CosD(0.5*upedgeangle[i]);
+       yupvertex[i][1] =  0.5*fgkEndCapSupportLength[i]/TanD(0.5*upedgeangle[i]);
+       yupvertex[i][2] =  yupvertex[i][1];
+       yupvertex[i][3] =  yupvertex[i][0];
+       
+    middledgeangle[i] = upedgeangle[i]/knedges;
+    middlepsi[i] = 90.0-0.5*upedgeangle[i];
+    for(Int_t j=1; j<knedges; j++){
+               xupvertex[i][j+3] = fgkEndCapSupportMiddleRadius[i]*CosD(middlepsi[i]+j*middledgeangle[i]);
+               yupvertex[i][j+3] = fgkEndCapSupportMiddleRadius[i]*SinD(middlepsi[i]+j*middledgeangle[i]);
+       }
+  }
+  ////////////////////////////////////
+  // Generating Up TGeoXtru
+  ////////////////////////////////////
+  TGeoXtru* upendcapsupportshape[klayernumber];
+  TGeoVolume* upendcapsupport[klayernumber]; 
+  char upendcapsupportname[100]; 
+  for(Int_t i=0; i<klayernumber; i++){
+   upendcapsupportshape[i] = new TGeoXtru(2);
+   snprintf(upendcapsupportname,100,"UpEndCapSupportPieceLayer%i",i+5);
+   upendcapsupportshape[i]->DefinePolygon(knedges+3,xupvertex[i],yupvertex[i]); 
+   upendcapsupportshape[i]->DefineSection(0,0.);
+   upendcapsupportshape[i]->DefineSection(1,fgkEndCapSupportHighWidth);
+   upendcapsupport[i] = new TGeoVolume(upendcapsupportname,upendcapsupportshape[i],
+                                                                       fSSDSupportRingAl);
+   upendcapsupport[i]->SetLineColor(5);
+  }
+  ///////////////////////////////////////////////
+  // Setting the vertices for TGeoXtru Down Volume
+  ///////////////////////////////////////////////
+  Double_t xdownvertex[klayernumber][2*(knedges+1)];
+  Double_t ydownvertex[klayernumber][2*(knedges+1)];
+  for(Int_t i=0; i<klayernumber; i++){
+       xdownvertex[i][0] = -fgkEndCapSupportLowRadius[i]*SinD(0.5*upedgeangle[i]);
+       xdownvertex[i][1] =  xupvertex[i][0];
+       ydownvertex[i][0] = fgkEndCapSupportLowRadius[i]*CosD(0.5*upedgeangle[i]);
+       ydownvertex[i][1] =  yupvertex[i][0];
+       for(Int_t j=0; j<knedges; j++){
+               xdownvertex[i][j+2] = xupvertex[i][knedges+2-j];
+               ydownvertex[i][j+2] = yupvertex[i][knedges+2-j];
+       } 
+       for(Int_t j=0; j<knedges; j++){
+               xdownvertex[i][knedges+j+2] = fgkEndCapSupportLowRadius[i]
+                                                                       * CosD(middlepsi[i]+j*middledgeangle[i]);
+               ydownvertex[i][knedges+j+2] = fgkEndCapSupportLowRadius[i]
+                                                                       * SinD(middlepsi[i]+j*middledgeangle[i]);
+       }
+  }
+  ////////////////////////////////////
+  // Generating Down TGeoXtru
+  ////////////////////////////////////  
+  TGeoXtru* downendcapsupportshape[klayernumber];
+  TGeoVolume* downendcapsupport[klayernumber]; 
+  char downendcapsupportname[100]; 
+  for(Int_t i=0; i<klayernumber; i++){
+       downendcapsupportshape[i] = new TGeoXtru(2);
+       snprintf(downendcapsupportname,100,"DownEndCapSupportPieceLayer%i",i+5);
+       downendcapsupportshape[i] = new TGeoXtru(2);
+       downendcapsupportshape[i]->DefinePolygon(2*(knedges+1),xdownvertex[i],ydownvertex[i]); 
+    if(i==0){
+               downendcapsupportshape[i]->DefineSection(0,0.);
+               downendcapsupportshape[i]->DefineSection(1,fgkEndCapSupportLowWidth[i]);
+    }
+       else{
+               downendcapsupportshape[i]->DefineSection(0,fgkEndCapSupportHighWidth
+                                                                -                 fgkEndCapSupportLowWidth[i]);
+               downendcapsupportshape[i]->DefineSection(1,fgkEndCapSupportHighWidth);
+       }
+    downendcapsupport[i] = new TGeoVolume(downendcapsupportname,
+                                                               downendcapsupportshape[i],fSSDSupportRingAl);
+       downendcapsupport[i]->SetLineColor(5);
+  }
+  ///////////////////////////////////////////////
+  // Setting TGeoPgon Volume
+  ///////////////////////////////////////////////
+  const Int_t kssdlayladdernumber[klayernumber] = {fgkSSDLay5LadderNumber,
+                                                                                                  fgkSSDLay6LadderNumber};
+  TGeoPgon* endcapsupportmothershape[klayernumber];
+  TGeoVolume** endcapsupportmother;
+  endcapsupportmother = new TGeoVolume*[klayernumber];
+  char endcapsupportmothername[100];
+  for(Int_t i=0; i<klayernumber; i++){
+       endcapsupportmothershape[i] = new TGeoPgon(0.0,360.0,kssdlayladdernumber[i],2);
+       snprintf(endcapsupportmothername,100,"EndCapSupportMotherLayer%i",i+5);
+       endcapsupportmothershape[i]->DefineSection(0,0.,ydownvertex[i][0],yupvertex[i][1]);     
+    endcapsupportmothershape[i]->DefineSection(1,fgkEndCapSupportHighWidth,
+                                                                                         ydownvertex[i][0],yupvertex[i][1]);
+    endcapsupportmother[i] = new TGeoVolume(endcapsupportmothername,endcapsupportmothershape[i],
+                                                                                       fSSDAir);       
+  }
+  ////////////////////////////////////
+  TGeoRotation** endcapsupportrot[klayernumber];
+  for(Int_t i=0; i<2; i++){
+       endcapsupportrot[i] = new TGeoRotation*[kssdlayladdernumber[i]];        
+       for(Int_t j=0; j<kssdlayladdernumber[i]; j++){
+          endcapsupportrot[i][j] = new TGeoRotation();
+          endcapsupportrot[i][j]->SetAngles(j*upedgeangle[i],0.,0.);
+       endcapsupportmother[i]->AddNode(upendcapsupport[i],j+1,endcapsupportrot[i][j]);
+       endcapsupportmother[i]->AddNode(downendcapsupport[i],j+1,endcapsupportrot[i][j]);
+       }
+  }
+  return endcapsupportmother;
+ } 
+ ////////////////////////////////////////////////////////////////////////////////
+ void AliITSv11GeometrySSD::SetEndCapSupportAssembly(){
+  /////////////////////////////////////////////////////////////
+  // Setting End Cap Support Layer 5 and 6. 
+  /////////////////////////////////////////////////////////////
+  const Int_t kendcapcoverplatesmallholenumber = 9;
+  const Int_t klayernumber = 2;
+  const Int_t kssdlayladdernumber[klayernumber] = {fgkSSDLay5LadderNumber,
+                                                                                                  fgkSSDLay6LadderNumber};
+  Double_t upedgeangle[klayernumber] = {360.0/kssdlayladdernumber[0],
+                                                                               360.0/kssdlayladdernumber[1]};
+  TGeoVolume** endcapsupport = EndCapSupport();
+  TGeoVolume** endcapassembly = GetEndCapAssembly();
+  TGeoPgon* endcapsupportshape[klayernumber];
+  Double_t* radiusmin[klayernumber];
+  Double_t* radiusmax[klayernumber];
+  for(Int_t i=0; i<klayernumber; i++){
+    endcapsupportshape[i] = (TGeoPgon*)endcapsupport[i]->GetShape();
+       radiusmin[i] = endcapsupportshape[i]->GetRmin();
+       radiusmax[i] = endcapsupportshape[i]->GetRmax();
+  }  
+  TGeoBBox* endcapassemblyshape = (TGeoBBox*)endcapassembly[0]->GetShape();
+  Double_t endcapassemblycenter[3] = {endcapassemblyshape->GetDX(),
+                                                                         endcapassemblyshape->GetDY(),
+                                                                         endcapassemblyshape->GetDZ()};
+  ///////////////////////////////////////////////
+  // Setting TGeoPgon Volume for Mother Container
+  ///////////////////////////////////////////////
+  TGeoPgon* endcapsupportsystemshape[klayernumber];
+  char endcapsupportsystemothername[100];
+  for(Int_t i=0; i<klayernumber; i++){
+       endcapsupportsystemshape[i] = new TGeoPgon(0.0,360.0,kssdlayladdernumber[i],2);
+       snprintf(endcapsupportsystemothername,100,"EndCapSupportSystemLayer%i",i+5);
+       endcapsupportsystemshape[i]->DefineSection(0,-(fgkEndCapCoverPlateWidth[1]
+                                                                                            - fgkEndCapCoverPlateWidth[0]),*radiusmin[i],
+                                                                                         (*radiusmax[i]*CosD(0.5*upedgeangle[i])
+                                                                                          +2.*endcapassemblycenter[2])
+                                                                                          /CosD(0.5*upedgeangle[i]));  
+    endcapsupportsystemshape[i]->DefineSection(1,2.*endcapassemblycenter[1]
+                                                                                                -(fgkEndCapCoverPlateWidth[1]
+                                                                                            - fgkEndCapCoverPlateWidth[0]),
+                                                                                          *radiusmin[i],
+                                                                                         (*radiusmax[i]*CosD(0.5*upedgeangle[i])
+                                                                                          +2.*endcapassemblycenter[2])
+                                                                                          /CosD(0.5*upedgeangle[i]));
+  }
+  fgkEndCapSupportSystem = new TGeoVolume*[4];
+  fgkEndCapSupportSystem[0] = new TGeoVolume("EndCapSupportSystemLayer5Sx",
+                                                                         endcapsupportsystemshape[0],fSSDAir); 
+  fgkEndCapSupportSystem[1] = new TGeoVolume("EndCapSupportSystemLayer5Dx",
+                                                                         endcapsupportsystemshape[0],fSSDAir); 
+  fgkEndCapSupportSystem[2] = new TGeoVolume("EndCapSupportSystemLayer6Sx",
+                                                                         endcapsupportsystemshape[1],fSSDAir); 
+  fgkEndCapSupportSystem[3] = new TGeoVolume("EndCapSupportSystemLayer6Dx",
+                                                                         endcapsupportsystemshape[1],fSSDAir); 
+  ///////////////////////////////////////////////
+  TGeoTranslation* endcapassemblytrans[klayernumber];
+  for(Int_t i=0; i<klayernumber; i++)
+       endcapassemblytrans[i] = new TGeoTranslation(-fgkEndCapCoverPlateLength[0]
+                                                                          -  fgkEndCapSideCoverThickness
+                                                                          +  endcapassemblycenter[0],
+                                                                          -  0.5*fgkEndCapCoverPlateThickness
+                                                                          -  2.0*fgkEndCapCoolingTubeRadiusMax
+                                                                          +  2.0*endcapassemblycenter[2]
+                                                                          +  0.5*fgkEndCapSupportLength[i]
+                                                                          /  TanD(0.5*upedgeangle[i]),
+                                                                                 0.5*(fgkEndCapCoverPlateWidth[0]
+                                                                          -  fgkEndCapCoverPlateWidth[2]
+                                                                          - (kendcapcoverplatesmallholenumber-1)
+                                                                          *  fgkEndCapCoverPlateSmallHoleSeparation[2]));
+  TGeoRotation** endcapassemblyrot[klayernumber];
+  TGeoHMatrix** endcapassemblymatrix[klayernumber];
+  for(Int_t i=0; i<klayernumber; i++){
+   endcapassemblyrot[i] = new TGeoRotation*[kssdlayladdernumber[i]+2];
+   endcapassemblymatrix[i] = new TGeoHMatrix*[kssdlayladdernumber[i]+2];       
+   for(Int_t j=0; j<kssdlayladdernumber[i]+2; j++) endcapassemblyrot[i][j] = new TGeoRotation();
+   endcapassemblyrot[i][0]->SetAngles(0.,-90.,0.);     
+   endcapassemblyrot[i][1]->SetAngles(90.,180.,-90.);  
+   endcapassemblymatrix[i][0] = new TGeoHMatrix((*endcapassemblyrot[i][1])*(*endcapassemblyrot[i][0]));
+   endcapassemblymatrix[i][1] = new TGeoHMatrix((*endcapassemblytrans[i])*(*endcapassemblymatrix[i][0]));
+   for(Int_t j=0; j<kssdlayladdernumber[i]; j++){
+       endcapassemblyrot[i][j+2]->SetAngles(j*upedgeangle[i],0.,0.); 
+       endcapassemblymatrix[i][j+2] = new TGeoHMatrix((*endcapassemblyrot[i][j+2])*(*endcapassemblymatrix[i][1]));
+   }
+  }
+  TGeoTranslation* lay6endcapassemblytrans = new TGeoTranslation(0.,0.,
+                                                       fgkEndCapKaptonFoilWidth-fgkEndCapSupportHighWidth);
+  for(Int_t i=0; i<2*klayernumber; i++){
+       for(Int_t j=0; j<(i<2? kssdlayladdernumber[0]:kssdlayladdernumber[1]); j++){
+               fgkEndCapSupportSystem[i]->AddNode(endcapassembly[i],j+1,i<2?endcapassemblymatrix[0][j+2]:
+                                                                                                                                          endcapassemblymatrix[1][j+2]);
+       }
+       fgkEndCapSupportSystem[i]->AddNode(i<2?endcapsupport[0]:endcapsupport[1],1,i<2?0:lay6endcapassemblytrans);
+  }
+   /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<klayernumber; i++){
+       for(Int_t j=0; j<kssdlayladdernumber[i]+2; j++){
+               delete endcapassemblyrot[i][j];
+       }
+       delete [] endcapassemblyrot[i];
+       delete endcapassemblymatrix[i][0];
+       delete endcapassemblymatrix[i][1];
+  }
+  /////////////////////////////////////////////////////////////
+  }
+  void AliITSv11GeometrySSD::EndCapSupportSystemLayer5(TGeoVolume* moth){
+  /////////////////////////////////////////////////////////////
+  // Setting End Cap Support + End Cap Assembly of Layer 5. 
+  /////////////////////////////////////////////////////////////
+  if (! moth) {
+    AliError("Can't insert end cap support of layer5, mother is null!\n");
+    return;
+  };
+  if(!fgkEndCapSupportSystem) SetEndCapSupportAssembly();
+  TGeoTranslation* endcapsupportsystemITSCentertrans[2];
+  endcapsupportsystemITSCentertrans[0] = new TGeoTranslation(0.,0.,
+                                                                                               fgkEndCapSupportCenterLay5ITSPosition
+                                                                          +            fgkEndCapSupportCenterLay5Position
+                                                                          -            fgkEndCapSideCoverLength[2]);
+  endcapsupportsystemITSCentertrans[1] = new TGeoTranslation(0.,0.,
+                                                                                               fgkEndCapSideCoverLength[2]
+                                                                          -        fgkEndCapSupportCenterLay5Position
+                                                                          -        fgkEndCapSupportCenterLay5ITSPosition);
+  TGeoRotation* endcapsupportsystemrot = new TGeoRotation();
+  endcapsupportsystemrot->SetAngles(90.,180.,-90.);
+  TGeoCombiTrans* endcapsupportsystemITSCentercombitrans = 
+       new TGeoCombiTrans(*endcapsupportsystemITSCentertrans[1],*endcapsupportsystemrot);
+  moth->AddNode(fgkEndCapSupportSystem[0],1,endcapsupportsystemITSCentertrans[0]);
+  moth->AddNode(fgkEndCapSupportSystem[1],1,endcapsupportsystemITSCentercombitrans);
+   /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete endcapsupportsystemrot;
+  delete endcapsupportsystemITSCentertrans[1];
+ }
+  /////////////////////////////////////////////////////////////
+  void AliITSv11GeometrySSD::EndCapSupportSystemLayer6(TGeoVolume* moth){
+  /////////////////////////////////////////////////////////////
+  // Setting End Cap Support + End Cap Assembly of Layer 6. 
+  /////////////////////////////////////////////////////////////
+  if (! moth) {
+    AliError("Can't insert end cap support of layer6, mother is null!\n");
+    return;
+  };
+  if(!fgkEndCapSupportSystem) SetEndCapSupportAssembly();
+  TGeoTranslation* endcapsupportsystemITSCentertrans[2];
+  endcapsupportsystemITSCentertrans[0] = new TGeoTranslation(0.,0.,
+                                                                                               fgkEndCapSupportCenterLay6ITSPosition
+                                                                          +            fgkEndCapSupportCenterLay6Position
+                                                                          -            fgkEndCapSideCoverLength[2]);
+  endcapsupportsystemITSCentertrans[1] = new TGeoTranslation(0.,0.,
+                                                                                               fgkEndCapSideCoverLength[2]
+                                                                          -        fgkEndCapSupportCenterLay6Position
+                                                                          -        fgkEndCapSupportCenterLay6ITSPosition);
+  TGeoRotation* endcapsupportsystemrot = new TGeoRotation();
+  endcapsupportsystemrot->SetAngles(90.,180.,-90.);
+  TGeoCombiTrans* endcapsupportsystemITSCentercombitrans = 
+       new TGeoCombiTrans(*endcapsupportsystemITSCentertrans[1],*endcapsupportsystemrot);
+  moth->AddNode(fgkEndCapSupportSystem[2],1,endcapsupportsystemITSCentertrans[0]);
+  moth->AddNode(fgkEndCapSupportSystem[3],1,endcapsupportsystemITSCentercombitrans);
+   /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete endcapsupportsystemrot;
+  delete endcapsupportsystemITSCentertrans[1];
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ void AliITSv11GeometrySSD::LadderSupportLayer5(TGeoVolume* moth){
+  /////////////////////////////////////////////////////////////
+  // Setting Ladder Support of Layer 5. 
+  /////////////////////////////////////////////////////////////
+  if (! moth) {
+    AliError("Can't insert ladder lupport of layer5, mother is null!\n");
+    return;
+  };
+  if(!fLay5LadderSupportRing) SetLadderSupport(100);
+  fMotherVol = moth;
+  TGeoTranslation* centerITSRingSupportLay5trans[2];
+  for(Int_t i=0; i<2; i++){
+       centerITSRingSupportLay5trans[i] = 
+               new TGeoTranslation(0.,0.,TMath::Power(-1.,i)*fgkLadderSupportRingLay5Position);
+    moth->AddNode(fLay5LadderSupportRing,i+1,centerITSRingSupportLay5trans[i]);
+  }
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ void AliITSv11GeometrySSD::LadderSupportLayer6(TGeoVolume* moth){
+  /////////////////////////////////////////////////////////////
+  // Setting Ladder Support of Layer 6. 
+  /////////////////////////////////////////////////////////////
+  if (! moth) {
+    AliError("Can't insert ladder lupport of layer6, mother is null!\n");
+    return;
+  };
+  if(!fLay6LadderSupportRing) SetLadderSupport(100);
+  fMotherVol = moth;
+  TGeoTranslation* centerITSRingSupportLay6trans[2];
+  for(Int_t i=0; i<2; i++){
+       centerITSRingSupportLay6trans[i] = 
+               new TGeoTranslation(0.,0.,TMath::Power(-1.,i)*fgkLadderSupportRingLay6Position);
+    moth->AddNode(fLay6LadderSupportRing,i+1,centerITSRingSupportLay6trans[i]);
+  }
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ void AliITSv11GeometrySSD::SSDCone(TGeoVolume* moth){
+  /////////////////////////////////////////////////////////////
+  // Setting Ladder Support of Layer 6. 
+  /////////////////////////////////////////////////////////////
+  if (! moth) {
+    AliError("Can't insert SSD Cone, mother is null!\n");
+    return;
+  };
+  if(!fSSDCone) SetSSDCone();
+  TGeoTranslation* ssdconetrans = new TGeoTranslation(0.,0.,0.5*fgkSSDCentralSupportLength
+                                                               +                                         fgkSSDCentralAL3SupportLength);
+    moth->AddNode(fSSDCone,1,ssdconetrans);
+}
+ ////////////////////////////////////////////////////////////////////////////////
+ void AliITSv11GeometrySSD::SetSSDCone(){
+  /////////////////////////////////////////////////////////////
+  // Method generating SSDCone 
+  /////////////////////////////////////////////////////////////
+  if(!fCreateMaterials) CreateMaterials();
+  fSSDCone = new TGeoVolumeAssembly("ITSssdCone");
+  Double_t ssdpconesectionradiusmax[16];
+  Double_t ssdpconesectionradiusmin[16];
+  Double_t ssdpconezsection[16];
+  TGeoPcon* ssdpconelittleholeshape[8];
+  TGeoVolume* ssdpconelittlehole[8];
+  ssdpconezsection[0] = (fgkSSDPConeZLength[0]-fgkSSDPConeZLength[1]);
+  ssdpconesectionradiusmin[0] = fgkSSDLowerPConeRadius;
+  ssdpconesectionradiusmax[0] = ssdpconezsection[0]*CosD(fgkSSDPConeAngle)
+                                                     / SinD(fgkSSDPConeAngle)
+                                                         + ssdpconesectionradiusmin[0];
+  ssdpconesectionradiusmin[1] = fgkSSDPConeLittleHoleRadius
+                                                         - ssdpconezsection[0]*CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle);
+  ssdpconesectionradiusmax[1] = fgkSSDPConeLittleHoleRadius; 
+  ssdpconezsection[1] = (ssdpconesectionradiusmin[1]-ssdpconesectionradiusmin[0])
+                                         * TanD(fgkSSDPConeAngle)+ssdpconezsection[0];
+  ssdpconelittleholeshape[0] = new TGeoPcon(0.,360.,2);    
+  for(Int_t i=0; i<2;i++) ssdpconelittleholeshape[0]->DefineSection(i,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[0] = new TGeoVolume("SSDConeLittleHole1",ssdpconelittleholeshape[0],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[0]->SetLineColor(4);
+  /////////////////////////////////////////////////////////////
+  ssdpconezsection[2] = ssdpconezsection[1];  
+  ssdpconesectionradiusmin[2] = ssdpconesectionradiusmin[1];
+  ssdpconesectionradiusmax[2] = ssdpconesectionradiusmax[1];
+  ssdpconesectionradiusmin[3] = fgkSSDPConeLittleHoleRadius+fgkSSDPConeLittleHoleLength
+                                                         - ssdpconezsection[0]*CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle);
+  ssdpconesectionradiusmax[3] = ssdpconezsection[0]*CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle)+ssdpconesectionradiusmin[3];
+  ssdpconezsection[3] = (ssdpconesectionradiusmin[3]-ssdpconesectionradiusmin[2])
+                                         * TanD(fgkSSDPConeAngle)+ssdpconezsection[2];
+  Double_t ssdpconelittleholeangle = fgkSSDPConeLittleHoleLength/fgkSSDPConeLittleHoleRadius
+                                                                  * TMath::RadToDeg();
+  ssdpconelittleholeshape[1] = new TGeoPcon(30.+0.5*ssdpconelittleholeangle,
+                                                                                                         60.-ssdpconelittleholeangle,2);    
+  for(Int_t i=2;i<4;i++) ssdpconelittleholeshape[1]->DefineSection(i-2,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[1] = new TGeoVolume("SSDConeLittleHole2",ssdpconelittleholeshape[1],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[1]->SetLineColor(4);
+  TGeoRotation* ssdconelittleholerot[6];
+  for(Int_t i=0; i<6; i++){
+       ssdconelittleholerot[i] = new TGeoRotation();
+    ssdconelittleholerot[i]->SetAngles(i*60,0.,0.);
+  }
+  /////////////////////////////////////////////////////////////
+  ssdpconezsection[4] = ssdpconezsection[3];  
+  ssdpconesectionradiusmin[4] = ssdpconesectionradiusmin[3];
+  ssdpconesectionradiusmax[4] = ssdpconesectionradiusmax[3];
+  ssdpconesectionradiusmin[5] = fgkSSDConeMiddleRadius-ssdpconezsection[0]
+                                                         * CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle);
+  ssdpconesectionradiusmax[5] = fgkSSDConeMiddleRadius;
+  ssdpconezsection[5] = (ssdpconesectionradiusmin[5]-ssdpconesectionradiusmin[4])
+                                         * TanD(fgkSSDPConeAngle)+ssdpconezsection[4];
+  ssdpconelittleholeshape[2] = new TGeoPcon(0.,360.,2);
+  for(Int_t i=4; i<6;i++) ssdpconelittleholeshape[2]->DefineSection(i-4,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[2] = new TGeoVolume("SSDConeLittleHole3",ssdpconelittleholeshape[2],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[2]->SetLineColor(4);
+  ///////////////////////////////////////////////////
+  ssdpconezsection[6] = ssdpconezsection[5];  
+  ssdpconesectionradiusmin[6] = ssdpconesectionradiusmin[5];
+  ssdpconesectionradiusmax[6] = ssdpconesectionradiusmax[5];
+  ssdpconesectionradiusmin[7] = fgkSSDConeMiddleRadius+fgkSSDPConeMiddleLength
+                                                         -ssdpconezsection[0]
+                                                         * CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle);
+  ssdpconesectionradiusmax[7] = fgkSSDConeMiddleRadius+fgkSSDPConeMiddleLength;
+  ssdpconezsection[7] = (ssdpconesectionradiusmin[7]-ssdpconesectionradiusmin[6])
+                                         * TanD(fgkSSDPConeAngle)+ssdpconezsection[6];
+  Double_t ssdpconemiddleholeangle = fgkSSDPConeMiddleWidth/fgkSSDConeMiddleRadius
+                                                                  * TMath::RadToDeg();
+  ssdpconelittleholeshape[3] = new TGeoPcon(22.5+0.5*ssdpconemiddleholeangle,
+                                                                                                         45.-ssdpconemiddleholeangle,2);    
+  for(Int_t i=6;i<8;i++) ssdpconelittleholeshape[3]->DefineSection(i-6,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[3] = new TGeoVolume("SSDConeLittleHole4",ssdpconelittleholeshape[3],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[3]->SetLineColor(4);
+  TGeoRotation* ssdconemiddleholerot[8];
+  for(Int_t i=0; i<8; i++){
+       ssdconemiddleholerot[i] = new TGeoRotation();
+    ssdconemiddleholerot[i]->SetAngles(i*45,0.,0.);
+  }
+  /////////////////////////////////////////////////////////////
+  ssdpconezsection[8] = ssdpconezsection[7];  
+  ssdpconesectionradiusmin[8] = ssdpconesectionradiusmin[7];
+  ssdpconesectionradiusmax[8] = ssdpconesectionradiusmax[7];
+  ssdpconesectionradiusmin[9] = fgkSSDPConeUpRadius-ssdpconezsection[0]
+                                                         * CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle);
+  ssdpconesectionradiusmax[9] = fgkSSDPConeUpRadius;
+  ssdpconezsection[9] = (ssdpconesectionradiusmin[9]-ssdpconesectionradiusmin[8])
+                                         * TanD(fgkSSDPConeAngle)+ssdpconezsection[8];
+  ssdpconelittleholeshape[4] = new TGeoPcon(0.,360.,2);
+  for(Int_t i=8; i<10;i++) ssdpconelittleholeshape[4]->DefineSection(i-8,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[4] = new TGeoVolume("SSDConeLittleHole5",ssdpconelittleholeshape[4],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[4]->SetLineColor(4);
+  /////////////////////////////////////////////////////////////
+  Double_t ssdconetrapezoidheight = fgkSSDPConeUpMaxRadius-fgkSSDPConeUpRadius;
+  Double_t ssdconetrapezoidbasis = fgkSSDPConeTrapezoidBasis-2.0
+                                                                * (0.5*ssdconetrapezoidheight/TanD(fgkSSDPConeTrapezoidAngle)
+                                                                -  0.5*ssdconetrapezoidheight/(fgkSSDPConeUpMaxRadius
+                                                                -  0.5*ssdconetrapezoidheight)*(0.5*fgkSSDPConeTrapezoidBasis
+                                                                -  0.5*ssdconetrapezoidheight/TanD(fgkSSDPConeTrapezoidAngle)));
+  Double_t ssdconetrapezoidsection = (2.0*TMath::Pi()*fgkSSDPConeUpMaxRadius-8.0*ssdconetrapezoidbasis)/8.;
+  Double_t ssdpconetrapezoidsectionangle = ssdconetrapezoidsection/fgkSSDPConeUpMaxRadius
+                                                                                * TMath::RadToDeg();
+  ssdpconezsection[10] = ssdpconezsection[9];
+  ssdpconesectionradiusmin[10] = ssdpconesectionradiusmin[9];
+  ssdpconesectionradiusmax[10] = ssdpconesectionradiusmax[9];
+  ssdpconesectionradiusmin[11] = fgkSSDPConeUpMaxRadius-ssdpconezsection[0]
+                                                         * CosD(fgkSSDPConeAngle)
+                                                         / SinD(fgkSSDPConeAngle);
+  ssdpconesectionradiusmax[11] = fgkSSDPConeUpMaxRadius;
+  ssdpconezsection[11] = (ssdpconesectionradiusmin[11]-ssdpconesectionradiusmin[10])
+                                          * TanD(fgkSSDPConeAngle)+ssdpconezsection[10];
+  ssdpconelittleholeshape[5] = new TGeoPcon(90.-0.5*ssdpconetrapezoidsectionangle,
+                                                                                       ssdpconetrapezoidsectionangle,2);    
+  for(Int_t i=10;i<12;i++) ssdpconelittleholeshape[5]->DefineSection(i-10,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[5] = new TGeoVolume("SSDConeLittleHole6",ssdpconelittleholeshape[5],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[5]->SetLineColor(4);
+  TGeoRotation* ssdconeupradiusrot[8];
+  for(Int_t i=0; i<8; i++){
+       ssdconeupradiusrot[i] = new TGeoRotation();
+    ssdconeupradiusrot[i]->SetAngles(i*45,0.,0.);
+  }
+  /////////////////////////////////////////////////////////////
+  ssdpconezsection[12] = ssdpconezsection[11];
+  ssdpconezsection[13] = ssdpconezsection[12]+fgkSSDPConeRadiusWidth;  
+  ssdpconesectionradiusmin[12] = ssdpconesectionradiusmin[11]; 
+  ssdpconesectionradiusmax[12] = fgkSSDPConeExternalRadius;
+  ssdpconesectionradiusmin[13] = ssdpconesectionradiusmin[12];
+  ssdpconesectionradiusmax[13] = fgkSSDPConeExternalRadius;
+  ssdpconelittleholeshape[6] = new TGeoPcon(0.,360.,2);
+  for(Int_t i=12; i<14;i++) ssdpconelittleholeshape[6]->DefineSection(i-12,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[6] = new TGeoVolume("SSDConeLittleHole7",ssdpconelittleholeshape[6],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[6]->SetLineColor(4);
+  /////////////////////////////////////////////////////////////
+  ssdpconezsection[14] = 0.0;
+  ssdpconezsection[15] = ssdpconezsection[0];
+  ssdpconesectionradiusmin[14] = ssdpconesectionradiusmin[0];
+  ssdpconesectionradiusmax[14] = ssdpconesectionradiusmin[14];
+  ssdpconesectionradiusmin[15] = ssdpconesectionradiusmin[0];
+  ssdpconesectionradiusmax[15] = ssdpconesectionradiusmax[0];
+  ssdpconelittleholeshape[7] = new TGeoPcon(0.,360.,2);
+  for(Int_t i=14; i<16;i++) ssdpconelittleholeshape[7]->DefineSection(i-14,ssdpconezsection[i],
+                                                 ssdpconesectionradiusmin[i],ssdpconesectionradiusmax[i]); 
+  ssdpconelittlehole[7] = new TGeoVolume("SSDConeLittleHole8",ssdpconelittleholeshape[7],fSSDCarbonFiberMedium);
+  ssdpconelittlehole[7]->SetLineColor(4);
+  /////////////////////////////////////////////////////////////
+  TGeoTube* ssdtubeconeshape[2];
+  TGeoVolume* ssdtubecone[2];
+  TGeoTranslation* ssdtubeconetrans[2];
+  ssdtubeconeshape[0] = new TGeoTube(fgkSSDPConeUpMiddleRadius,
+                                                                          fgkSSDPConeExternalRadius,
+                                                                          0.5*(fgkSSDPConeLength-ssdpconezsection[13]));
+  ssdtubeconeshape[1] = new TGeoTube(fgkSSDPConeDownRadius,ssdpconesectionradiusmin[0],
+                                                                          0.5*ssdpconezsection[0]); 
+  ssdtubecone[0] = new TGeoVolume("SSDConeTube1",ssdtubeconeshape[0],fSSDSupportRingAl);
+  ssdtubecone[1] = new TGeoVolume("SSDConeTube2",ssdtubeconeshape[1],fSSDSupportRingAl);
+  ssdtubeconetrans[0] = new TGeoTranslation(0.,0.,
+                                               0.5*(fgkSSDPConeLength-ssdpconezsection[13])
+                                         + ssdpconezsection[13]);
+  ssdtubeconetrans[1] = new TGeoTranslation(0.,0.,0.5*ssdpconezsection[0]);
+  ssdtubecone[0]->SetLineColor(4);
+  ssdtubecone[1]->SetLineColor(4);
+  /////////////////////////////////////////////////////////////
+  // Mother Volume Container
+  /////////////////////////////////////////////////////////////
+  Double_t ssdconemotherradiusmin[8];
+  Double_t ssdconemotherradiusmax[8];
+  Double_t ssdconemothersection[8]; 
+  ssdconemotherradiusmin[0] = fgkSSDPConeDownRadius;
+  ssdconemotherradiusmax[0] = ssdpconesectionradiusmin[0];
+  ssdconemotherradiusmin[1] = fgkSSDPConeDownRadius;
+  ssdconemotherradiusmax[1] = ssdpconesectionradiusmax[0];
+  ssdconemotherradiusmin[2] = ssdpconesectionradiusmin[0];
+  ssdconemotherradiusmax[2] = ssdpconesectionradiusmax[0];
+  ssdconemotherradiusmin[3] = ssdpconesectionradiusmin[11];
+  ssdconemotherradiusmax[3] = ssdpconesectionradiusmax[11];
+  ssdconemotherradiusmin[4] = ssdpconesectionradiusmin[12];
+  ssdconemotherradiusmax[4] = ssdpconesectionradiusmax[12];
+  ssdconemotherradiusmin[5] = ssdpconesectionradiusmin[13];
+  ssdconemotherradiusmax[5] = ssdpconesectionradiusmax[13];
+  ssdconemotherradiusmin[6] = fgkSSDPConeUpMiddleRadius;
+  ssdconemotherradiusmax[6] = fgkSSDPConeExternalRadius;
+  ssdconemotherradiusmin[7] = fgkSSDPConeUpMiddleRadius;
+  ssdconemotherradiusmax[7] = fgkSSDPConeExternalRadius;
+  ssdconemothersection[0] = 0.0;
+  ssdconemothersection[1] = ssdpconezsection[0];
+  ssdconemothersection[2] = ssdpconezsection[0];
+  ssdconemothersection[3] = ssdpconezsection[11];
+  ssdconemothersection[4] = ssdpconezsection[11];
+  ssdconemothersection[5] = ssdpconezsection[13];
+  ssdconemothersection[6] = ssdpconezsection[13];
+  ssdconemothersection[7] = fgkSSDPConeLength;
+  TGeoPcon* ssdconemothershape = new TGeoPcon(0.,360,8);
+  for(Int_t i=0; i<8; i++) ssdconemothershape->DefineSection(i,ssdconemothersection[i],
+                                                                       ssdconemotherradiusmin[i],ssdconemotherradiusmax[i]);
+  TGeoVolume* ssdconemother = new TGeoVolume("SSDMotherCone",ssdconemothershape,fSSDAir);
+  /////////////////////////////////////////////////////////////
+  //Placing the Volumes into Mother 
+  /////////////////////////////////////////////////////////////
+  ssdconemother->AddNode(ssdpconelittlehole[0],1);
+  for(Int_t i=0; i<6; i++){
+       ssdconemother->AddNode(ssdpconelittlehole[1],i+1,ssdconelittleholerot[i]);
+  }
+  ssdconemother->AddNode(ssdpconelittlehole[2],1);
+  for(Int_t i=0; i<8; i++){
+    ssdconemother->AddNode(ssdpconelittlehole[3],i+1,ssdconemiddleholerot[i]);
+  }
+  ssdconemother->AddNode(ssdpconelittlehole[4],1);
+  for(Int_t i=0; i<8; i++){
+    ssdconemother->AddNode(ssdpconelittlehole[5],i+1,ssdconeupradiusrot[i]);
+  }
+  ssdconemother->AddNode(ssdpconelittlehole[6],1);
+  ssdconemother->AddNode(ssdpconelittlehole[7],1);
+  ssdconemother->AddNode(ssdtubecone[0],1,ssdtubeconetrans[0]);
+  ssdconemother->AddNode(ssdtubecone[1],1,ssdtubeconetrans[1]);
+  /////////////////////////////////////////////////////////////
+  // ITS General Support
+  /////////////////////////////////////////////////////////////
+  TGeoTube* ssdcentralsupportshape = new TGeoTube(fgkSSDCentralSupportRadius-fgkSSDCentralSupportWidth,
+                                                               fgkSSDCentralSupportRadius,0.5*fgkSSDCentralSupportLength); 
+  TGeoVolume* ssdcentralsupport = new TGeoVolume("SSDCentralSupport",ssdcentralsupportshape,fSSDRohaCellCone);
+  TGeoTranslation* ssdcentralsupportrans = new TGeoTranslation(0.,0.,-0.5*fgkSSDCentralSupportLength
+                                                                            - fgkSSDCentralAL3SupportLength);
+  ssdcentralsupport->SetLineColor(4);
+  fSSDCone->AddNode(ssdcentralsupport,1,ssdcentralsupportrans);
+  TGeoTube* ssdcentralal3supportshape = new TGeoTube(fgkSSDCentralSupportRadius-fgkSSDCentralSupportWidth,
+                                                               fgkSSDCentralSupportRadius,0.25*fgkSSDCentralAL3SupportLength);
+  TGeoVolume* ssdcentralal3support = new TGeoVolume("SSDCentralAl3Support",ssdcentralal3supportshape,fSSDSupportRingAl);
+  TGeoTranslation* ssdcentralal3supportrans[3]; 
+  ssdcentralal3supportrans[0] = new TGeoTranslation(0.,0.,-0.75*fgkSSDCentralAL3SupportLength);
+  ssdcentralal3supportrans[1] = new TGeoTranslation(0.,0.,-fgkSSDCentralSupportLength
+                                                         - 1.25*fgkSSDCentralAL3SupportLength);
+  ssdcentralal3support->SetLineColor(4);
+  fSSDCone->AddNode(ssdcentralal3support,1,ssdcentralal3supportrans[0]);
+  fSSDCone->AddNode(ssdcentralal3support,2,ssdcentralal3supportrans[1]);
+  TGeoPcon* ssdpconcentralal3shape = new TGeoPcon(0.,360.,2);
+  Double_t ssdpconcentralradiusmin[2];
+  Double_t ssdpconcentralradiusmax[2];
+  Double_t ssdpconcentralsection[2];
+  ssdpconcentralradiusmin[0] = fgkSSDCentralSupportRadius-fgkSSDCentralSupportWidth;  
+  ssdpconcentralradiusmin[1] = fgkSSDCentralSupportRadius-fgkSSDCentralAL3SupportWidth;  
+  ssdpconcentralradiusmax[0] = fgkSSDCentralSupportRadius;
+  ssdpconcentralradiusmax[1] = fgkSSDCentralSupportRadius;
+  ssdpconcentralsection[0] = -0.5*fgkSSDCentralAL3SupportLength; 
+  ssdpconcentralsection[1] = 0.;
+  for(Int_t i=0; i<2;i++) ssdpconcentralal3shape->DefineSection(i,ssdpconcentralsection[i],
+                                                 ssdpconcentralradiusmin[i],ssdpconcentralradiusmax[i]); 
+  TGeoVolume* ssdpconcentralal3 = new TGeoVolume("SSDPConeCentralAl3",ssdpconcentralal3shape,fSSDSupportRingAl);
+  ssdpconcentralal3->SetLineColor(4);
+  fSSDCone->AddNode(ssdpconcentralal3,1);
+  TGeoRotation* ssdcentralal3supportrot = new TGeoRotation();
+  ssdcentralal3supportrot->SetAngles(90.,180,-90.);
+  ssdcentralal3supportrans[2] = new TGeoTranslation(0.,0.,-fgkSSDCentralSupportLength
+                                                               -2.*fgkSSDCentralAL3SupportLength);
+  TGeoCombiTrans* ssdcentralal3supporcombitrans = new TGeoCombiTrans(*ssdcentralal3supportrans[2],
+                                                                                                                    *ssdcentralal3supportrot);
+  fSSDCone->AddNode(ssdpconcentralal3,2,ssdcentralal3supporcombitrans);
+  TGeoRotation* ssdconemotherot = new TGeoRotation();
+  ssdconemotherot->SetAngles(90.,180.,-90.);
+  TGeoTranslation* ssdconemothertrans = new TGeoTranslation(0.,0.,-fgkSSDCentralSupportLength
+                                                                                                                       -2.*fgkSSDCentralAL3SupportLength);
+  TGeoCombiTrans* ssdconemothercombitrans = new TGeoCombiTrans(*ssdconemothertrans,*ssdconemotherot);
+  fSSDCone->AddNode(ssdconemother,1);
+  fSSDCone->AddNode(ssdconemother,2,ssdconemothercombitrans);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete ssdcentralal3supportrot;
+  delete ssdcentralal3supportrans[2];
+  delete ssdconemotherot;
+  delete ssdconemothertrans;
+  /////////////////////////////////////////////////////////////
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+ void AliITSv11GeometrySSD::SSDCables(TGeoVolume* moth){
+  /////////////////////////////////////////////////////////////
+  // Setting SSD Cables
+  /////////////////////////////////////////////////////////////
+  if (! moth) {
+    AliError("Can't insert SSD Cables, mother is null!\n");
+    return;
+  };
+  TGeoVolume* ssdcables = SetSSDCables();
+  moth->AddNode(ssdcables,1);
+}
+ ////////////////////////////////////////////////////////////////////////////////
+ TGeoVolume* AliITSv11GeometrySSD::SetSSDCables(){
+   /////////////////////////////////////////////////////////////
+   // Method generating SSDCables
+   /////////////////////////////////////////////////////////////
+
+   /////////////////////////////////////////////////////////////////////////////////
+   // SSD Cables Parameters (lengths are in mm and angles in degrees)
+   /////////////////////////////////////////////////////////////////////////////////
+   
+   const Double_t kSSDCablesLay5TubeRadiusMin = 11.9*fgkmm;
+   const Double_t kSSDCablesLay6TubeRadiusMin = 11.9*fgkmm;
+   
+   // Cable thickness for rings at outer Z
+   // Average: 9/2 = 4.5 cables per quadrant
+   // Ideally 1/16 * 38(34) cables, but take factor to (1/8) to accomodate kinks and loops (there are only 2 different cable lengths); 21 mm^2 Cu each
+
+   const Double_t kSSDCablesLay5RingArea = 21.*34./8.*fgkmm*fgkmm;  // to be fixed in order to reproduce material budget
+   const Double_t kSSDCablesLay6RingArea = 21.*38./8.*fgkmm*fgkmm;  // to be fixed in order to reproduce material budget
+   
+   
+   const Double_t kSSDCablesHeight = 3.2*fgkmm;  // 3.2 mm*13 cm width = 18 cables, 185g/m each Add fudge factor of 2 to get to ~25 kg measured
+
+   const Double_t kSSDCableAngle = 22.5;
+   // MvL: remove water?
+   const Double_t kSSDCablesLay5RightSideWaterHeight = 2.5*fgkmm;  // to be fixed in order to reproduce material budget
+   const Double_t kSSDCablesPatchPanel2RB26Angle[2] = {25.0,53.2};
+   const Double_t kSSDCablesPatchPanel2RB24Angle[2] = {23.0,53.6};
+   const Double_t kSSDPatchPanel2RB26ITSDistance = 975.0*fgkmm;
+   const Double_t kSSDPatchPanel2RB24ITSDistance = 1020.0*fgkmm;
+   const Double_t kSSDPatchPanel2RB26Radius = 451.3*fgkmm;
+   const Double_t kSSDPatchPanel2RB24Radius = 451.3*fgkmm;
+   const Double_t kSSDPatchPanelHeight = 87.5*fgkmm;
+   
+   // SSD Layer 5 Cables
+   //////////////////////////////////////////////////////////////////////////////////////////////////
+   TGeoVolumeAssembly* ssdcablesmother = new TGeoVolumeAssembly("SSDCables");
+   Double_t ssdcablelayvertical = 0.05; // Internal variables to control overlapping with SDD cables
+   Double_t ssdcablelaylateral = 0.55;   // Internal variables to control overlapping with SDD cables
+   //////////////////////////////////////////////////////////////////////////////////////////////////
+  // Printf(Form("Cable ring: rad min: %g length %g thick %g", ssdcableslay5rigthsideradiusmin, ssdcablelay5rightsidelength, kSSDCablesLay5RingArea/ssdcablelay5rightsidelength));
+  
+
+  
+  ////////////////////////////////////
+  //  Double_t cablescapacity[20];
+  //  cablescapacity[0] = ssdcablelay5rightubeshape->Capacity();
+  ////////////////////////////////////
+  //ssdcablesmother->AddNode(ssdcablelay5righttube,1,ssdcablelay5rightrans);
+  ////////////////////////////////////
+  // TGeoPCone Volumes
+  ///////////////////////////////////
+  TGeoPcon* ssdcableslay5pconshape[3];
+  TGeoVolume* ssdcableslay5pcon[3]; 
+  ssdcableslay5pconshape[0] = new TGeoPcon(0.,360.,2);   
+  Double_t ssdcableslay5pconzsection[6];
+  Double_t ssdcableslay5pconrmin[6];
+  Double_t ssdcableslay5pconrmax[6];
+  ssdcableslay5pconrmin[0] = fgkEndCapSupportMiddleRadius[0]+kSSDCablesLay5TubeRadiusMin;
+  ssdcableslay5pconrmin[1] = fgkSSDPConeUpRadius*(1.0+ssdcablelayvertical);
+
+  ssdcableslay5pconzsection[0] = fgkEndCapSupportCenterLay5ITSPosition
+                                 + fgkEndCapSupportCenterLay5Position;
+                                //+ 2.*ssdcablelay5rightsidelength;  // removing this generates overlap with the water ring 
+                                // Keeping it generates overlap with the cones...
+  // SSDCables/SSDCableLay5RightSideWaterTube_2 ovlp=0.0939792
+  ssdcableslay5pconzsection[1] = 0.5*fgkSSDCentralSupportLength
+                                                          + fgkSSDCentralAL3SupportLength
+                                                          + (fgkSSDPConeUpRadius-fgkSSDLowerPConeRadius)
+                                                          * TanD(fgkSSDPConeAngle);      
+  Double_t dz = ssdcableslay5pconzsection[1]-ssdcableslay5pconzsection[0];
+  Double_t pconethickness = kSSDCablesLay5RingArea/TMath::Abs(dz);
+  ssdcableslay5pconrmax[0] = ssdcableslay5pconrmin[0]+pconethickness;
+  ssdcableslay5pconrmax[1] = ssdcableslay5pconrmin[1]+pconethickness;
+  //Printf(Form("pcone: r1 %g  r2 %g z1 %g z2 %g thickness %g", ssdcableslay5pconrmax[0], ssdcableslay5pconrmax[1], 
+  //         ssdcableslay5pconzsection[0],ssdcableslay5pconzsection[1],pconethickness));
+  
+  for(Int_t i=0; i<2;i++) ssdcableslay5pconshape[0]->DefineSection(i,ssdcableslay5pconzsection[i],
+                                                 ssdcableslay5pconrmin[i],ssdcableslay5pconrmax[i]); 
+  ssdcableslay5pcon[0] = new TGeoVolume("SSDCableLay5RightSidePCon1",
+                                                          ssdcableslay5pconshape[0],fSSDCopper);
+  ssdcableslay5pcon[0]->SetLineColor(9);
+  ssdcablesmother->AddNode(ssdcableslay5pcon[0],1);
+
+  Double_t totvol = ssdcableslay5pcon[0]->Capacity();
+  // Printf(Form("Cables, lay5, pCone,volume: %g", ssdcableslay5pcon[0]->Capacity()));
+////////////////////////////////////
+//  cablescapacity[1] = ssdcableslay5pconshape[0]->Capacity();
+////////////////////////////////////
+
+  //
+  //   PCon 2 and 3 are cables going through/towards holes in supports
+  //
+  ssdcableslay5pconzsection[2] = ssdcableslay5pconzsection[1];
+  ssdcableslay5pconzsection[3] = 0.5*fgkSSDCentralSupportLength
+                                                          + fgkSSDCentralAL3SupportLength
+                                                          + 0.25*TanD(fgkSSDPConeAngle)*(fgkSSDPConeUpMaxRadius
+                                                          + 3.*fgkSSDPConeUpRadius-4.*fgkSSDLowerPConeRadius);
+  Double_t ssdcableangle = (fgkSSDPConeTrapezoidBasis-2.*(fgkSSDPConeUpMaxRadius
+                                            -  fgkSSDPConeUpRadius)/TanD(fgkSSDPConeTrapezoidAngle))
+                                                /  fgkSSDPConeUpRadius*TMath::RadToDeg()*2;
+  ssdcableslay5pconshape[1] = new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,
+                                                                                  ssdcableangle,2);
+  // Printf(Form("PCon2, phi %g dphi %g ",90.0-kSSDCableAngle-0.5*ssdcableangle, ssdcableangle));
+  ssdcableslay5pconrmin[2] = ssdcableslay5pconrmin[1];
+  ssdcableslay5pconrmax[2] = ssdcableslay5pconrmax[1]; 
+  ssdcableslay5pconrmin[3] = 0.25*(fgkSSDPConeUpMaxRadius+3.*fgkSSDPConeUpRadius
+                                                  - 4.*fgkSSDLowerPConeRadius)+fgkSSDLowerPConeRadius;
+  ssdcableslay5pconrmin[3]*=(1.0+ssdcablelayvertical);
+  ssdcableslay5pconrmax[3] = ssdcableslay5pconrmin[3] + kSSDCablesHeight; 
+  for(Int_t i=0; i<2;i++) ssdcableslay5pconshape[1]->DefineSection(i,ssdcableslay5pconzsection[i+2],
+                                                 ssdcableslay5pconrmin[i+2],ssdcableslay5pconrmax[i+2]); 
+  ssdcableslay5pcon[1] = new TGeoVolume("SSDCableLay5RightSidePCon2",ssdcableslay5pconshape[1],fSSDCopper);
+  ssdcableslay5pcon[1]->SetLineColor(9);
+  ////////////////////////////////////
+  ssdcableslay5pconshape[2] = new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,
+                                                                                  ssdcableangle,2);   
+  ssdcableslay5pconrmin[4] = ssdcableslay5pconrmin[3];
+  ssdcableslay5pconrmax[4] = ssdcableslay5pconrmax[3];
+  ssdcableslay5pconrmin[5] = ssdcableslay5pconrmin[4];
+  ssdcableslay5pconrmax[5] = ssdcableslay5pconrmax[4];
+  ssdcableslay5pconzsection[4] = ssdcableslay5pconzsection[3];
+  ssdcableslay5pconzsection[5] = (ssdcableslay5pconrmin[5]-fgkSSDLowerPConeRadius)
+                                                          * TanD(fgkSSDPConeAngle)
+                                                          + 0.5*fgkSSDCentralSupportLength
+                                                          + fgkSSDCentralAL3SupportLength;
+  ssdcableslay5pconzsection[5]-= ssdcablelaylateral;
+  for(Int_t i=0; i<2;i++) ssdcableslay5pconshape[2]->DefineSection(i,ssdcableslay5pconzsection[i+4],
+                                                 ssdcableslay5pconrmin[i+4],ssdcableslay5pconrmax[i+4]); 
+  ssdcableslay5pcon[2] = new TGeoVolume("SSDCableLay5RightSidePCon3",ssdcableslay5pconshape[2],fSSDCopper);
+  ssdcableslay5pcon[2]->SetLineColor(9);
+////////////////////////////////////
+  TGeoRotation* ssdcableslay5pconrot[4];       
+  for(Int_t i=0; i<4; i++){
+   ssdcableslay5pconrot[i] = new TGeoRotation();
+   ssdcableslay5pconrot[i]->SetAngles(90.0*i,0.,0.);
+   ssdcablesmother->AddNode(ssdcableslay5pcon[1],i+1,ssdcableslay5pconrot[i]);
+   ssdcablesmother->AddNode(ssdcableslay5pcon[2],i+1,ssdcableslay5pconrot[i]);         
+   // Printf(Form("Pcon2, Pcon3, vol %g %g",ssdcableslay5pcon[1]->Capacity(),ssdcableslay5pcon[2]->Capacity()));
+   totvol += ssdcableslay5pcon[1]->Capacity()+ssdcableslay5pcon[2]->Capacity();
+  }
+  ////////////////////////////////////
+  //cablescapacity[2] = 4.0*ssdcableslay5pconshape[1]->Capacity();
+  //cablescapacity[3] = 4.0*ssdcableslay5pconshape[2]->Capacity();
+  ////////////////////////////////////
+  // Positioning Left SSD Cables Part
+  ////////////////////////////////////
+  TGeoRotation* ssdcablesLay5RightPConToLeftRot = new TGeoRotation();
+  ssdcablesLay5RightPConToLeftRot->SetAngles(90.,180.,-90);
+  ssdcablesmother->AddNode(ssdcableslay5pcon[0],2,ssdcablesLay5RightPConToLeftRot);  
+  TGeoHMatrix* ssdcablesLay5RightPConToLeftMatrix[4];  
+  for(Int_t i=0; i<4; i++){ ssdcablesLay5RightPConToLeftMatrix[i] = 
+       new TGeoHMatrix((*ssdcablesLay5RightPConToLeftRot)*(*ssdcableslay5pconrot[i]));
+       ssdcablesmother->AddNode(ssdcableslay5pcon[1],i+5,ssdcablesLay5RightPConToLeftMatrix[i]);
+    ssdcablesmother->AddNode(ssdcableslay5pcon[2],i+5,ssdcablesLay5RightPConToLeftMatrix[i]);          
+  }
+  ////////////////////////////////////
+  //cablescapacity[4] = ssdcablelay5rightubeshape->Capacity();
+  //cablescapacity[5] = ssdcableslay5pconshape[0]->Capacity();
+  //cablescapacity[6] = 4.*ssdcableslay5pconshape[1]->Capacity();
+  //cablescapacity[7] = 4.*ssdcableslay5pconshape[2]->Capacity();
+  /////////////////////////////////////////////////////////////
+  // Water Tubes Layer 5
+  /////////////////////////
+  /*  Remove ring; could be replaced with a PCone next to/on top of the cables
+
+   //
+   // MvL: Remove ring; put everything in PCone
+   //
+   // Need to keep dimensions for water ring...
+
+   Double_t ssdcablesfactor = 0.5;     // Internal variables to control overlapping with SDD cables
+
+  Double_t ssdcableslay5rigthsideradiusmin = fgkEndCapSupportMiddleRadius[0]+kSSDCablesLay5TubeRadiusMin;  
+  Double_t ssdcableslay5endconedistance = (ssdcableslay5rigthsideradiusmin
+                                                                           -  fgkSSDLowerPConeRadius)
+                                                                           * TanD(fgkSSDPConeAngle);
+  Double_t ssdcableslay5startconedistance = fgkEndCapSupportCenterLay5ITSPosition
+                                                                             + fgkEndCapSupportCenterLay5Position
+                                                                             - 0.5*fgkSSDCentralSupportLength-fgkSSDCentralAL3SupportLength;
+  Double_t ssdcablelay5rightsidelength = ssdcableslay5endconedistance
+                                                                          - ssdcableslay5startconedistance; 
+  ssdcablelay5rightsidelength *= ssdcablesfactor;
+  Double_t ssdcableslay5rightsideradiusmax = ssdcableslay5rigthsideradiusmin+kSSDCablesLay5RingArea/ssdcablelay5rightsidelength; 
+
+
+  TGeoTranslation* ssdcablelay5rightrans = 
+                                         new TGeoTranslation(0.,0.,fgkEndCapSupportCenterLay5ITSPosition
+                                                                   + fgkEndCapSupportCenterLay5Position
+                                                                   + 0.5*ssdcablelay5rightsidelength);
+
+  TGeoTranslation* ssdcablesLay5RightTubeToLeftrans = new TGeoTranslation(0.,0.,
+                                                                                                       - 0.5*ssdcablelay5rightsidelength
+                                                                                                       - fgkEndCapSupportCenterLay5Position
+                                                                                                   - fgkEndCapSupportCenterLay5ITSPosition);
+
+  TGeoTube* ssdcablelay5rightubewatershape = new TGeoTube(ssdcableslay5rightsideradiusmax,
+                                                                                    ssdcableslay5rightsideradiusmax
+                                                                              + kSSDCablesLay5RightSideWaterHeight,
+                                                                                    0.5*ssdcablelay5rightsidelength); 
+  TGeoVolume* ssdcablelay5rightwatertube = new TGeoVolume("SSDCableLay5RightSideWaterTube",
+                                                                                                        ssdcablelay5rightubewatershape,
+                                                                                                        fSSDCoolingTubeWater);
+  ssdcablelay5rightwatertube->SetLineColor(7);
+  ssdcablesmother->AddNode(ssdcablelay5rightwatertube,1,ssdcablelay5rightrans);
+  ssdcablesmother->AddNode(ssdcablelay5rightwatertube,2,ssdcablesLay5RightTubeToLeftrans);
+  */
+  ////////////////////////////////////
+  // TGeoPCone Water Volumes Layer 
+  ///////////////////////////////////
+  TGeoPcon* ssdcableslay5pconwatershape[3];
+  TGeoVolume* ssdcableslay5pconwater[3]; 
+  ssdcableslay5pconwatershape[0] = new TGeoPcon(0.,360.,2);   
+  Double_t ssdcableslay5pconwaterzsection[6];
+  Double_t ssdcableslay5pcwateronrmin[6];
+  Double_t ssdcableslay5pconwaterrmax[6];
+  ssdcableslay5pcwateronrmin[0] = ssdcableslay5pconrmax[0];
+  ssdcableslay5pconwaterrmax[0] = ssdcableslay5pcwateronrmin[0]
+                                                               + kSSDCablesLay5RightSideWaterHeight;
+  ssdcableslay5pcwateronrmin[1] = ssdcableslay5pconrmax[1];
+  ssdcableslay5pconwaterrmax[1] = ssdcableslay5pcwateronrmin[1]
+                                                               + kSSDCablesLay5RightSideWaterHeight;
+  ssdcableslay5pconwaterzsection[0] = ssdcableslay5pconzsection[0];
+  ssdcableslay5pconwaterzsection[1] = ssdcableslay5pconzsection[1];
+  for(Int_t i=0; i<2;i++) ssdcableslay5pconwatershape[0]->DefineSection(i,ssdcableslay5pconwaterzsection[i],
+                                                 ssdcableslay5pcwateronrmin[i],ssdcableslay5pconwaterrmax[i]); 
+  ssdcableslay5pconwater[0] = new TGeoVolume("SSDCableLay5RightSidePConWater1",
+                                                          ssdcableslay5pconwatershape[0],fSSDCoolingTubeWater);
+  ssdcableslay5pconwater[0]->SetLineColor(7);
+  ssdcablesmother->AddNode(ssdcableslay5pconwater[0],1);
+  ssdcablesmother->AddNode(ssdcableslay5pconwater[0],2,ssdcablesLay5RightPConToLeftRot);
+////////////////////////////////////
+  ssdcableslay5pconwaterzsection[2] = ssdcableslay5pconzsection[2];
+  ssdcableslay5pconwaterzsection[3] = ssdcableslay5pconzsection[3];
+  ssdcableslay5pconwatershape[1] = new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,
+                                                                                               ssdcableangle,2);   
+  ssdcableslay5pcwateronrmin[2] = ssdcableslay5pconrmax[1];
+  ssdcableslay5pconwaterrmax[2] = ssdcableslay5pcwateronrmin[2]
+                                                               + kSSDCablesLay5RightSideWaterHeight;
+  ssdcableslay5pcwateronrmin[3] = ssdcableslay5pconrmax[3];
+  ssdcableslay5pconwaterrmax[3] = ssdcableslay5pcwateronrmin[3]
+                                                               + kSSDCablesLay5RightSideWaterHeight;
+  for(Int_t i=0; i<2;i++) ssdcableslay5pconwatershape[1]->DefineSection(i,ssdcableslay5pconwaterzsection[i+2],
+                                                 ssdcableslay5pcwateronrmin[i+2],ssdcableslay5pconwaterrmax[i+2]); 
+  ssdcableslay5pconwater[1] = new TGeoVolume("SSDCableLay5RightSidePConWater2",
+                                                          ssdcableslay5pconwatershape[1],fSSDCoolingTubeWater);
+  ssdcableslay5pconwater[1]->SetLineColor(7);
+////////////////////////////////////
+  ssdcableslay5pconwatershape[2] = new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,
+                                                                                               ssdcableangle,2);   
+  ssdcableslay5pcwateronrmin[4] = ssdcableslay5pconrmax[3];
+  ssdcableslay5pconwaterrmax[4] = ssdcableslay5pcwateronrmin[4]
+                                                               + kSSDCablesLay5RightSideWaterHeight;
+  ssdcableslay5pcwateronrmin[5] = ssdcableslay5pconrmax[4];
+  ssdcableslay5pconwaterrmax[5] = ssdcableslay5pcwateronrmin[4]
+                                                               + kSSDCablesLay5RightSideWaterHeight;
+  ssdcableslay5pconwaterzsection[4] = ssdcableslay5pconzsection[4];
+  ssdcableslay5pconwaterzsection[5] = ssdcableslay5pconzsection[5];
+  for(Int_t i=0; i<2;i++) ssdcableslay5pconwatershape[2]->DefineSection(i,ssdcableslay5pconwaterzsection[i+4],
+                                                 ssdcableslay5pcwateronrmin[i+4],ssdcableslay5pconwaterrmax[i+4]); 
+  ssdcableslay5pconwater[2] = new TGeoVolume("SSDCableLay5RightSidePConWater3",
+                                                          ssdcableslay5pconwatershape[2],fSSDCoolingTubeWater);
+  ssdcableslay5pconwater[2]->SetLineColor(7);
+////////////////////////////////////
+  TGeoRotation* ssdcableslay5pconwaterot[4];   
+  TGeoHMatrix* ssdcablesLay5RightPConWaterToLeftMatrix[4];  
+  for(Int_t i=0; i<4; i++){
+   ssdcableslay5pconwaterot[i] = new TGeoRotation();
+   ssdcableslay5pconwaterot[i]->SetAngles(90.0*i+45.0,0.,0.);
+   ssdcablesLay5RightPConWaterToLeftMatrix[i] = 
+       new TGeoHMatrix((*ssdcablesLay5RightPConToLeftRot)*(*ssdcableslay5pconwaterot[i]));
+       ssdcablesmother->AddNode(ssdcableslay5pconwater[1],i+1,ssdcableslay5pconwaterot[i]);
+       ssdcablesmother->AddNode(ssdcableslay5pconwater[1],i+5,ssdcablesLay5RightPConWaterToLeftMatrix[i]);
+       ssdcablesmother->AddNode(ssdcableslay5pconwater[2],i+1,ssdcableslay5pconwaterot[i]);
+       ssdcablesmother->AddNode(ssdcableslay5pconwater[2],i+5,ssdcablesLay5RightPConWaterToLeftMatrix[i]);
+  }
+  /////////////////////////
+  // SSD Layer 6 Cables
+  /////////////////////////
+  Double_t ssdcableslay6rigthsideradiusmin = fgkEndCapSupportMiddleRadius[1]+kSSDCablesLay6TubeRadiusMin;  
+  Double_t ssdcablelay6rightsidelength = 2.; // cm  was 2.*ssdcablelay5rightsidelength;
+  Double_t ssdcableslay6rightsideradiusmax = ssdcableslay6rigthsideradiusmin+kSSDCablesLay6RingArea/ssdcablelay6rightsidelength;
+  // Printf(Form("Lay 6 cables, length %g, radius %g, thickness %g", ssdcablelay6rightsidelength, ssdcableslay6rigthsideradiusmin, kSSDCablesLay6RingArea/ssdcablelay6rightsidelength));
+  TGeoTube* ssdcablelay6rightubeshape = new TGeoTube(ssdcableslay6rigthsideradiusmin,
+                                                                                               ssdcableslay6rightsideradiusmax,
+                                                                                               0.5*ssdcablelay6rightsidelength); 
+  TGeoVolume* ssdcablelay6righttube = new TGeoVolume("SSDCableLay6RightSideTube",
+                                                                                                        ssdcablelay6rightubeshape,
+                                                                                                        fSSDCopper);
+  ssdcablelay6righttube->SetLineColor(9);
+  TGeoTranslation* ssdcablelay6rightrans = 
+                                         new TGeoTranslation(0.,0.,fgkEndCapSupportCenterLay6ITSPosition
+                                                                                +              fgkEndCapSupportCenterLay6Position
+                                                                                +      0.5*ssdcablelay6rightsidelength);
+  TGeoTranslation* ssdcablesLay6RightTubeToLeftrans = new TGeoTranslation(0.,0.,
+                                                                                                       - 0.5*ssdcablelay6rightsidelength
+                                                                                                       - fgkEndCapSupportCenterLay6Position
+                                                                                                   - fgkEndCapSupportCenterLay6ITSPosition);
+  ssdcablesmother->AddNode(ssdcablelay6righttube,1,ssdcablelay6rightrans);
+  ssdcablesmother->AddNode(ssdcablelay6righttube,2,ssdcablesLay6RightTubeToLeftrans);
+  // Printf(Form("Cables; ring layer 6, volume: %g",ssdcablelay6rightubeshape->Capacity()));
+  totvol += ssdcablelay6rightubeshape->Capacity();
+  ////////////////////////////////////
+  //cablescapacity[8] = 2.*ssdcablelay6rightubeshape->Capacity();
+  ////////////////////////////////////
+  // MvL: PCon is part of connection to patch panels;
+  // removed since current volume is too thick; now absorbed in rings+connections
+  /*
+  TGeoPcon* ssdcableslay6pconshape = new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,
+                                                                                  ssdcableangle,2);   
+  TGeoVolume* ssdcableslay6pcon;
+  Double_t ssdcableslay6pconrmin[2];
+  Double_t ssdcableslay6pconrmax[2];
+  Double_t ssdcableslay6pconzsection[2];
+  ssdcableslay6pconrmin[0] = ssdcableslay6rigthsideradiusmin;
+  ssdcableslay6pconrmax[0] = ssdcableslay6rightsideradiusmax;
+  ssdcableslay6pconrmin[1] = ssdcableslay6pconrmin[0];
+  ssdcableslay6pconrmax[1] = ssdcableslay6pconrmax[0];
+  ssdcableslay6pconzsection[0] = fgkEndCapSupportCenterLay6ITSPosition
+                                                          + fgkEndCapSupportCenterLay6Position
+                                                          + ssdcablelay6rightsidelength;
+  ssdcableslay6pconzsection[1] = ssdcableslay5pconwaterzsection[5];
+  for(Int_t i=0; i<2;i++) ssdcableslay6pconshape->DefineSection(i,ssdcableslay6pconzsection[i],
+                                                 ssdcableslay6pconrmin[i],ssdcableslay6pconrmax[i]); 
+  
+  ssdcableslay6pcon = new TGeoVolume("SSDCableLay6RightSidePCon",
+                                                          ssdcableslay6pconshape,fSSDCopper);
+  ssdcableslay6pcon->SetLineColor(9);
+  for(Int_t i=0; i<4; i++){
+   ssdcablesmother->AddNode(ssdcableslay6pcon,i+1,ssdcableslay5pconrot[i]);
+   ssdcablesmother->AddNode(ssdcableslay6pcon,i+5,ssdcablesLay5RightPConToLeftMatrix[i]);
+  }
+  */
+  ////////////////////////////////////
+  //cablescapacity[9] = 8.*ssdcableslay6pconshape->Capacity();
+  /////////////////////////
+  // Water Tubes Layer 6
+  /////////////////////////
+  TGeoTube* ssdcablelay6righwatertubeshape = new TGeoTube(ssdcableslay6rightsideradiusmax,
+                                                                                                                 ssdcableslay6rightsideradiusmax
+                                                                                  +                      kSSDCablesLay5RightSideWaterHeight,
+                                                                                                                 0.5*ssdcablelay6rightsidelength); 
+  TGeoVolume* ssdcablelay6rightwatertube = new TGeoVolume("SSDCableLay6RightSideWaterTube",
+                                                                                                        ssdcablelay6righwatertubeshape,
+                                                                                                        fSSDCoolingTubeWater);
+  ssdcablelay6rightwatertube->SetLineColor(7);
+  ssdcablesmother->AddNode(ssdcablelay6rightwatertube,1,ssdcablelay6rightrans);
+  ssdcablesmother->AddNode(ssdcablelay6rightwatertube,2,ssdcablesLay6RightTubeToLeftrans);
+  TGeoPcon* ssdcableslay6waterpconshape = new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,
+                                                                                  ssdcableangle,2);   
+  TGeoVolume* ssdcableslay6waterpcon;
+  Double_t ssdcableslay6waterpconrmin[2];
+  Double_t ssdcableslay6waterpconrmax[2];
+  Double_t ssdcableslay6waterpconzsection[2];
+  ssdcableslay6waterpconrmin[0] = ssdcableslay6rightsideradiusmax;
+  ssdcableslay6waterpconrmax[0] = ssdcableslay6rightsideradiusmax
+                                                           + kSSDCablesLay5RightSideWaterHeight;
+  ssdcableslay6waterpconrmin[1] = ssdcableslay6waterpconrmin[0];
+  ssdcableslay6waterpconrmax[1] = ssdcableslay6waterpconrmax[0];
+  ssdcableslay6waterpconzsection[0] = fgkEndCapSupportCenterLay6ITSPosition
+                                                          + fgkEndCapSupportCenterLay6Position
+                                                          + ssdcablelay6rightsidelength;
+  ssdcableslay6waterpconzsection[1] = ssdcableslay5pconwaterzsection[5];
+  for(Int_t i=0; i<2;i++) ssdcableslay6waterpconshape->DefineSection(i,ssdcableslay6waterpconzsection[i],
+                                                 ssdcableslay6waterpconrmin[i],ssdcableslay6waterpconrmax[i]); 
+  ssdcableslay6waterpcon = new TGeoVolume("SSDCableLay6RightSideWaterPCon",
+                                                          ssdcableslay6waterpconshape,fSSDCoolingTubeWater);
+  ssdcableslay6waterpcon->SetLineColor(7);
+  TGeoRotation* ssdcableslay6pconwaterot[4];   
+  TGeoRotation* ssdcablesLay6RightPConToLeftRot = new TGeoRotation();
+  ssdcablesLay6RightPConToLeftRot->SetAngles(90.,180.,-90);
+  TGeoHMatrix* ssdcablesLay6RightPConToLeftMatrix[4];  
+  for(Int_t i=0; i<4; i++){
+   ssdcableslay6pconwaterot[i] = new TGeoRotation();
+   ssdcableslay6pconwaterot[i]->SetAngles(90.0*i+45.0,0.,0.);
+   ssdcablesLay6RightPConToLeftMatrix[i] = new TGeoHMatrix((*ssdcablesLay6RightPConToLeftRot)
+                                                                                * (*ssdcableslay6pconwaterot[i]));   
+   ssdcablesmother->AddNode(ssdcableslay6waterpcon,i+1,ssdcableslay6pconwaterot[i]);
+   ssdcablesmother->AddNode(ssdcableslay6waterpcon,i+5,ssdcablesLay6RightPConToLeftMatrix[i]);
+  }
+  ////////////////////////////////////////
+  // From ITS Ring to Patch Panel3-RB26
+  ////////////////////////////////////////
+  Double_t ssdcablepatchpanel3BB26radiusmin[2];
+  Double_t ssdcablepatchpanel3BB26radiusmax[2];
+  Double_t ssdcablepatchpanel3RB26zsection[2];
+  ssdcablepatchpanel3BB26radiusmin[0] = ssdcableslay5pconrmin[3]-0.5*kSSDPatchPanelHeight;// +2.8+0.003;//Avoid small overlap with SPDshieldring;
+  ssdcablepatchpanel3BB26radiusmax[0] = ssdcablepatchpanel3BB26radiusmin[0]
+                                        + kSSDCablesHeight;
+  ssdcablepatchpanel3BB26radiusmin[1] = kSSDPatchPanel2RB26Radius;
+  ssdcablepatchpanel3BB26radiusmax[1] = ssdcablepatchpanel3BB26radiusmin[1]
+                                       + kSSDCablesHeight;
+  ssdcablepatchpanel3RB26zsection[0] = 0.5*fgkSSDCentralSupportLength
+                                       + fgkSSDCentralAL3SupportLength
+                                                                                + fgkSSDPConeZLength[0];
+  ssdcablepatchpanel3RB26zsection[1] = kSSDPatchPanel2RB26ITSDistance;  
+  // Printf(Form("RB26 cable length %g",ssdcablepatchpanel3RB26zsection[1]-ssdcablepatchpanel3RB26zsection[0]));
+  // Printf(Form("Angular range %g",ssdcableangle));
+
+  TGeoPcon* ssdcablepatchpanel3RB26pconshape = 
+                                                               new TGeoPcon(90.0-kSSDCablesPatchPanel2RB26Angle[0]
+                                                                                               - 0.5*ssdcableangle,ssdcableangle,2);   
+  for(Int_t i=0; i<2;i++) ssdcablepatchpanel3RB26pconshape->DefineSection(i,ssdcablepatchpanel3RB26zsection[i],
+                                                 ssdcablepatchpanel3BB26radiusmin[i],ssdcablepatchpanel3BB26radiusmax[i]); 
+  TGeoVolume* ssdcablepatchpanel3RB26pcon = new TGeoVolume("SSDCablePatchPanel3RB26",
+                                                                                               ssdcablepatchpanel3RB26pconshape,fSSDCopper);
+  ssdcablepatchpanel3RB26pcon->SetLineColor(9);
+  TGeoRotation* ssdcablepatchpanel3B26rot[4];
+  for(Int_t i=0; i<4; i++) ssdcablepatchpanel3B26rot[i] = new TGeoRotation();
+  ssdcablepatchpanel3B26rot[0]->SetAngles(0.0,0.0,0.0);
+  ssdcablepatchpanel3B26rot[1]->SetAngles(kSSDCablesPatchPanel2RB26Angle[0]
+                                         + kSSDCablesPatchPanel2RB26Angle[1]+6.0,0.0,0.0);
+  ssdcablepatchpanel3B26rot[2]->SetAngles(180.0,0.0,0.0);
+  ssdcablepatchpanel3B26rot[3]->SetAngles(180.0 + kSSDCablesPatchPanel2RB26Angle[0]
+                                               + kSSDCablesPatchPanel2RB26Angle[1]+6.0,0.0,0.0);
+  for(Int_t i=0; i<4; i++) ssdcablesmother->AddNode(ssdcablepatchpanel3RB26pcon,i+1,ssdcablepatchpanel3B26rot[i]);
+  // Printf(Form("Cable to patch panels RB26 volume: %g (x4)",ssdcablepatchpanel3RB26pcon->Capacity()));
+  ////////////////////////////////////
+  //cablescapacity[10] = 4.*ssdcablepatchpanel3RB26pconshape->Capacity();
+  ////////////////////////////////////////
+  //  ITS Ring Cables RB26 Part
+  ////////////////////////////////////////
+  Double_t ssdcableitsring3BB26pconzsection[2];
+  Double_t ssdcableitsring3BB26pconrmin[2];
+  Double_t ssdcableitsring3BB26pconrmax[2];
+  ssdcableitsring3BB26pconzsection[0] = 0.5*fgkSSDCentralSupportLength
+                                                                         + fgkSSDCentralAL3SupportLength
+                                                                         + (4.0/5.0)*fgkSSDPConeZLength[0];
+  ssdcableitsring3BB26pconzsection[1] = ssdcablepatchpanel3RB26zsection[0];
+  ssdcableitsring3BB26pconrmin[0] = fgkSSDPConeUpRadius-0.5*kSSDPatchPanelHeight;
+  ssdcableitsring3BB26pconrmax[0] = ssdcableitsring3BB26pconrmin[0] + 2.5*kSSDCablesHeight; // widths of cable bunch is about half of patch panels; need factor 2.5
+
+  ssdcableitsring3BB26pconrmin[1] = ssdcablepatchpanel3BB26radiusmin[0];
+  ssdcableitsring3BB26pconrmax[1] = ssdcablepatchpanel3BB26radiusmax[0];
+  TGeoPcon* ssdcableitsring3BB26pconshape[4];
+  ssdcableitsring3BB26pconshape[0] = new TGeoPcon(90.0 - kSSDCablesPatchPanel2RB26Angle[0]
+                                                                  -              0.5*ssdcableangle,ssdcableangle
+                                                                  +                            (kSSDCablesPatchPanel2RB26Angle[0]
+                                                                  -                             kSSDCableAngle),2);
+  ssdcableitsring3BB26pconshape[1] = new TGeoPcon(90.0 + kSSDCablesPatchPanel2RB26Angle[1]
+                                                                  -              0.5*ssdcableangle,ssdcableangle
+                                                                  +                      3.0*kSSDCableAngle
+                                                                  -                      kSSDCablesPatchPanel2RB26Angle[1],2);
+  ssdcableitsring3BB26pconshape[2] = new TGeoPcon(270-kSSDCablesPatchPanel2RB26Angle[0]
+                                                                  -              0.5*ssdcableangle,ssdcableangle
+                                                                  -                      kSSDCableAngle
+                                                                  +                      kSSDCablesPatchPanel2RB26Angle[0],2);
+  ssdcableitsring3BB26pconshape[3] = new TGeoPcon(270.0+kSSDCablesPatchPanel2RB26Angle[1]
+                                                                  -              0.5*ssdcableangle,ssdcableangle
+                                                                  +                      3.0*kSSDCableAngle
+                                                                  -                      kSSDCablesPatchPanel2RB26Angle[1],2);
+  for(Int_t i=0;i<4;i++)
+       for(Int_t j=0; j<2; j++) ssdcableitsring3BB26pconshape[i]->DefineSection(j,ssdcableitsring3BB26pconzsection[j],
+                                                        ssdcableitsring3BB26pconrmin[j],
+                                                        ssdcableitsring3BB26pconrmax[j]); 
+  TGeoVolume* ssdcableitsring3BB26pcon[4];
+  ssdcableitsring3BB26pcon[0] = new TGeoVolume("SSDCableITSRing3RB26Part1",
+                                                                                               ssdcableitsring3BB26pconshape[0],fSSDCopper);
+  ssdcableitsring3BB26pcon[1] = new TGeoVolume("SSDCableITSRing3RB26Part2",
+                                                                                               ssdcableitsring3BB26pconshape[1],fSSDCopper);
+  ssdcableitsring3BB26pcon[2] = new TGeoVolume("SSDCableITSRing3RB26Part3",
+                                                                                               ssdcableitsring3BB26pconshape[2],fSSDCopper);
+  ssdcableitsring3BB26pcon[3] = new TGeoVolume("SSDCableITSRing3RB26Part4",
+                                                                                               ssdcableitsring3BB26pconshape[3],fSSDCopper);
+  for(Int_t i=0;i<4;i++){
+       ssdcableitsring3BB26pcon[i]->SetLineColor(9);
+       ssdcablesmother->AddNode(ssdcableitsring3BB26pcon[i],1);
+       //Printf(Form("Cable to patch panels RB26 volume part 2: %g (%d)",ssdcableitsring3BB26pcon[i]->Capacity(),i));
+}
+
+  ////////////////////////////////////
+  //cablescapacity[11] = ssdcableitsring3BB26pconshape[0]->Capacity()
+  //                            + ssdcableitsring3BB26pconshape[1]->Capacity() 
+  //                            + ssdcableitsring3BB26pconshape[2]->Capacity() 
+  //                            + ssdcableitsring3BB26pconshape[3]->Capacity(); 
+  ////////////////////////////////////////
+  // From ITS Ring to Patch Panel2-RB24
+  ////////////////////////////////////////
+  Double_t ssdcablepatchpanel3BB24radiusmin[2];
+  Double_t ssdcablepatchpanel3BB24radiusmax[2];
+  Double_t ssdcablepatchpanel3RB24zsection[2];
+  ssdcablepatchpanel3BB24radiusmin[0] = ssdcablepatchpanel3BB26radiusmin[0];
+  ssdcablepatchpanel3BB24radiusmax[0] = ssdcablepatchpanel3BB26radiusmax[0];
+  ssdcablepatchpanel3BB24radiusmin[1] = kSSDPatchPanel2RB24Radius;
+  ssdcablepatchpanel3BB24radiusmax[1] = ssdcablepatchpanel3BB24radiusmin[1]
+                                        + kSSDCablesHeight;
+  ssdcablepatchpanel3RB24zsection[0] = -0.5*fgkSSDCentralSupportLength
+                                                                        -  fgkSSDCentralAL3SupportLength
+                                                                        -  fgkSSDPConeZLength[0];
+  ssdcablepatchpanel3RB24zsection[1] = -kSSDPatchPanel2RB24ITSDistance;  
+  //Printf(Form("RB24 cable length %g",ssdcablepatchpanel3RB24zsection[1]-ssdcablepatchpanel3RB24zsection[0]));
+  TGeoPcon* ssdcablepatchpanel3RB24pconshape = 
+                                                               new TGeoPcon(90.0-kSSDCablesPatchPanel2RB24Angle[1]
+                                                                                               - 0.5*ssdcableangle,ssdcableangle,2);   
+  for(Int_t i=0; i<2;i++) ssdcablepatchpanel3RB24pconshape->DefineSection(i,ssdcablepatchpanel3RB24zsection[i],
+                                                 ssdcablepatchpanel3BB24radiusmin[i],ssdcablepatchpanel3BB24radiusmax[i]); 
+  TGeoVolume* ssdcablepatchpanel3RB24pcon = new TGeoVolume("SSDCablePatchPanel3RB24",
+                                                                                               ssdcablepatchpanel3RB24pconshape,
+                                                                                               fSSDCopper);
+  ssdcablepatchpanel3RB24pcon->SetLineColor(9);
+  TGeoRotation* ssdcablepatchpanel3B24rot[4];
+  for(Int_t i=0; i<4; i++) ssdcablepatchpanel3B24rot[i] = new TGeoRotation();
+  ssdcablepatchpanel3B24rot[0]->SetAngles(-6.0,0.0,0.0);
+  ssdcablepatchpanel3B24rot[1]->SetAngles(kSSDCablesPatchPanel2RB24Angle[0]
+                                         + kSSDCablesPatchPanel2RB24Angle[1],0.0,0.0);
+  ssdcablepatchpanel3B24rot[2]->SetAngles(174.0,0.0,0.0);
+  ssdcablepatchpanel3B24rot[3]->SetAngles(180.0+kSSDCablesPatchPanel2RB24Angle[0]
+                                         + kSSDCablesPatchPanel2RB24Angle[1],0.0,0.0);
+  for(Int_t i=0; i<4; i++) ssdcablesmother->AddNode(ssdcablepatchpanel3RB24pcon,i+1,ssdcablepatchpanel3B24rot[i]);
+  //Printf(Form("Cable to patch panels RB24 volume: %g (x4)",ssdcablepatchpanel3RB24pcon->Capacity()));
+  ////////////////////////////////////
+  //cablescapacity[12] = 4.*ssdcablepatchpanel3RB24pconshape->Capacity();
+  ////////////////////////////////////////
+  //  ITS Ring Cables RB24 Part
+  ////////////////////////////////////////
+  Double_t ssdcableitsring3BB24pconzsection[2];
+  Double_t ssdcableitsring3BB24pconrmin[2];
+  Double_t ssdcableitsring3BB24pconrmax[2];
+  ssdcableitsring3BB24pconzsection[0] = -ssdcableitsring3BB26pconzsection[0];
+  ssdcableitsring3BB24pconzsection[1] = ssdcablepatchpanel3RB24zsection[0];
+  ssdcableitsring3BB24pconrmin[0] = fgkSSDPConeUpRadius-0.5*kSSDPatchPanelHeight;
+  ssdcableitsring3BB24pconrmax[0] = ssdcableitsring3BB24pconrmin[0] + 2.5*kSSDCablesHeight;  // Cable bunch width smaller; make it thicker
+
+  ssdcableitsring3BB24pconrmin[1] = ssdcablepatchpanel3BB24radiusmin[0];
+  ssdcableitsring3BB24pconrmax[1] = ssdcablepatchpanel3BB24radiusmax[0];
+  TGeoPcon* ssdcableitsring3BB24pconshape[4];
+  ssdcableitsring3BB24pconshape[0] = new TGeoPcon(kSSDCableAngle-0.5*ssdcableangle,ssdcableangle
+                                                              + (90.0-kSSDCablesPatchPanel2RB24Angle[1]
+                                                                  - kSSDCableAngle),2);
+  ssdcableitsring3BB24pconshape[1] = new TGeoPcon(90.0+kSSDCableAngle-0.5*ssdcableangle,
+                                                                    ssdcableangle-kSSDCableAngle
+                                                                  + kSSDCablesPatchPanel2RB24Angle[0],2);
+  ssdcableitsring3BB24pconshape[2] = new TGeoPcon(180.0+kSSDCableAngle-0.5*ssdcableangle,ssdcableangle
+                                                                  - kSSDCableAngle
+                                                                  + 90.0 - kSSDCablesPatchPanel2RB24Angle[1],2);
+  ssdcableitsring3BB24pconshape[3] = new TGeoPcon(270.0+kSSDCableAngle-0.5*ssdcableangle,
+                                                                  ssdcableangle-kSSDCableAngle
+                                                                  + kSSDCablesPatchPanel2RB24Angle[0],2);
+  for(Int_t i=0;i<4;i++)
+       for(Int_t j=0; j<2; j++) ssdcableitsring3BB24pconshape[i]->DefineSection(j,ssdcableitsring3BB24pconzsection[j],
+                                                        ssdcableitsring3BB24pconrmin[j],
+                                                        ssdcableitsring3BB24pconrmax[j]); 
+  TGeoVolume* ssdcableitsring3BB24pcon[4];
+  ssdcableitsring3BB24pcon[0] = new TGeoVolume("SSDCableITSRing3RB24Part1",
+                                                                                               ssdcableitsring3BB24pconshape[0],fSSDCopper);
+  ssdcableitsring3BB24pcon[1] = new TGeoVolume("SSDCableITSRing3RB24Part2",
+                                                                                               ssdcableitsring3BB24pconshape[1],fSSDCopper);
+  ssdcableitsring3BB24pcon[2] = new TGeoVolume("SSDCableITSRing3RB24Part3",
+                                                                                               ssdcableitsring3BB24pconshape[2],fSSDCopper);
+  ssdcableitsring3BB24pcon[3] = new TGeoVolume("SSDCableITSRing3RB24Part4",
+                                                                                               ssdcableitsring3BB24pconshape[3],fSSDCopper);
+  for(Int_t i=0;i<4;i++){
+       ssdcableitsring3BB24pcon[i]->SetLineColor(9);
+       ssdcablesmother->AddNode(ssdcableitsring3BB24pcon[i],1);
+       // Printf(Form("Cable to patch panels RB24 (part 2) volume: %g (%d)",ssdcableitsring3BB24pcon[i]->Capacity(),i));
+}
+
+  ////////////////////////////////////
+  //cablescapacity[13] = ssdcableitsring3BB24pconshape[0]->Capacity()
+  //                                    + ssdcableitsring3BB24pconshape[1]->Capacity()
+  //                                    + ssdcableitsring3BB24pconshape[2]->Capacity()
+  //                                    + ssdcableitsring3BB24pconshape[3]->Capacity();
+
+  // MvL: Pcon are connection to patch panels (part of)
+  // Removed; do not contribute much; put into ring structure
+  /*
+  TGeoPcon* ssdcablelay6materialbudgetpconshape = 
+                                       new TGeoPcon(90.0-kSSDCableAngle-0.5*ssdcableangle,ssdcableangle,2); 
+  TGeoVolume* ssdcablelay6materialbudgetpcon;
+  Double_t ssdcablelay6materialbudgetpconrmin[2];
+  Double_t ssdcablelay6materialbudgetpconrmax[2];
+  Double_t ssdcablelay6materialbudgetpconzsection[2];
+  ssdcablelay6materialbudgetpconrmin[0] = ssdcableslay6rightsideradiusmax
+                                                                               + kSSDCablesLay5RightSideWaterHeight;
+  ssdcablelay6materialbudgetpconrmax[0] = ssdcablelay6materialbudgetpconrmin[0]
+                                                                               + kSSDCableMaterialBudgetHeight;
+  ssdcablelay6materialbudgetpconrmin[1] = ssdcablelay6materialbudgetpconrmin[0];
+  ssdcablelay6materialbudgetpconrmax[1] = ssdcablelay6materialbudgetpconrmax[0];
+  ssdcablelay6materialbudgetpconzsection[0] = fgkEndCapSupportCenterLay6ITSPosition
+                                                                                       + fgkEndCapSupportCenterLay6Position
+                                                                                       + ssdcablelay6rightsidelength;
+  ssdcablelay6materialbudgetpconzsection[1] = ssdcableslay5pconwaterzsection[5];
+  for(Int_t i=0; i<2;i++) ssdcablelay6materialbudgetpconshape->DefineSection(i,
+                                                 ssdcablelay6materialbudgetpconzsection[i],
+                                                 ssdcablelay6materialbudgetpconrmin[i],
+                                                 ssdcablelay6materialbudgetpconrmax[i]); 
+  ssdcablelay6materialbudgetpcon = new TGeoVolume("SSDCableLay6MaterialBudgetPCon",
+                                                          ssdcablelay6materialbudgetpconshape,fSSDCopper);
+  ssdcablelay6materialbudgetpcon->SetLineColor(9);
+  for(Int_t i=0; i<4; i++){
+   ssdcablesmother->AddNode(ssdcablelay6materialbudgetpcon,i+1,ssdcableslay5pconrot[i]);
+   ssdcablesmother->AddNode(ssdcablelay6materialbudgetpcon,i+5,ssdcablesLay5RightPConToLeftMatrix[i]);
+  }
+  */
+////////////////////////////////////
+ /* cablescapacity[14] = 2.*ssdcablelay6materialbudgetubeshape->Capacity();
+  cablescapacity[15] = 2.*ssdcablelay6materialbudgetpconshape->Capacity();
+  Double_t ssdcablesvolume = 0.0;
+  for(Int_t i=0;i<16;i++) ssdcablesvolume+=cablescapacity[i];
+  std::cout << ssdcablesvolume << std::endl;*/
+  // Printf(Form("Total volume (one side; without conn to patch panel): %g",totvol));
+  return ssdcablesmother;
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+TGeoArb8* AliITSv11GeometrySSD::GetArbShape(TVector3 const * const vertexpos[4] , const Double_t* width, 
+                                            Double_t height, const char* shapename, Int_t isign) const{
   /////////////////////////////////////////////////////////////
   // Method generating an Arb shape 
   /////////////////////////////////////////////////////////////
   const Int_t kvertexnumber = 8;
   const Int_t ktransvectnumber = 2;
-  TVector3* vertex[kvertexnumber];
-  TVector3* transvector[2];
-  for(Int_t i=0; i<ktransvectnumber; i++) transvector[i] = new TVector3(0.,width[i]);
+  TVector3 vertex[kvertexnumber];
+  TVector3 transvector[2];
+  for(Int_t i=0; i<ktransvectnumber; i++) transvector[i].SetY(width[i]);
   /////////////////////////////////////////////////////////////
   //Setting the vertices for TGeoArb8
   /////////////////////////////////////////////////////////////
-  vertex[0] = new TVector3(*vertexpos[0]);
-  vertex[1] = new TVector3(*vertexpos[1]);
-  vertex[2] = new TVector3(*vertex[1]+isign*(*transvector[0]));
-  vertex[3] = new TVector3(*vertex[0]+isign*(*transvector[0]));
-  vertex[4] = new TVector3(*vertexpos[2]);
-  vertex[5] = new TVector3(*vertexpos[3]);
-  vertex[6] = new TVector3(*vertex[5]+isign*(*transvector[1]));
-  vertex[7] = new TVector3(*vertex[4]+isign*(*transvector[1]));
+  vertex[0] = *vertexpos[0];
+  vertex[1] = *vertexpos[1];
+  vertex[2] = vertex[1]; 
+  vertex[3] = vertex[0]; 
+  vertex[4] = *vertexpos[2];
+  vertex[5] = *vertexpos[3];
+  vertex[6] = vertex[5];
+  vertex[7] = vertex[4];
+
+  // NB: order of points is clockwise
+  if (isign < 0) {
+    vertex[2] -= transvector[0];
+    vertex[3] -= transvector[0];
+    vertex[6] -= transvector[1];
+    vertex[7] -= transvector[1];
+  }
+  else {
+    vertex[0] += transvector[0];
+    vertex[1] += transvector[0];
+    vertex[4] += transvector[1];
+    vertex[5] += transvector[1];
+  }
+
   /////////////////////////////////////////////////////////////
   TGeoArb8* arbshape = new TGeoArb8(shapename,0.5*height);
-  for(Int_t i = 0; i<kvertexnumber;i++) 
-                                                       arbshape->SetVertex(i,vertex[i]->X(),vertex[i]->Y());
+  for(Int_t i = 0; i<kvertexnumber;i++) {
+    arbshape->SetVertex(i,vertex[i].X(),vertex[i].Y());
+  }
+
   return arbshape;
 } 
-////////////////////////////////////////////////////////////////////////////////
-TGeoArb8* AliITSv11GeometrySSD::GetTriangleShape(TVector3* vertexpos[]
-                                                                                         Double_t height, char* shapename) const{
+///////////////////////////////////////////////////////////////////////////////
+TGeoXtru* AliITSv11GeometrySSD::GetArcShape(Double_t phi, Double_t rmin
+                                                               Double_t rmax, Int_t nedges, Double_t height){
   /////////////////////////////////////////////////////////////
-  // Method generating a triangle shape 
+  // Method generating Arc shape 
   /////////////////////////////////////////////////////////////
-  const Int_t kvertexnumber = 4;
-  TVector3* vertex[kvertexnumber];
-//////////////////////////////////////
-  //Setting the vertices for TGeoArb8
-  ////////////////////////////////////
-  for(Int_t i = 0; i<kvertexnumber; i++)  
-  vertex[i] = new TVector3(i!=kvertexnumber-1?*vertexpos[i]:*vertex[kvertexnumber-1-i]);
-  TGeoArb8* triangleshape = new TGeoArb8(shapename,0.5*height);
-  for(Int_t i = 0; i<2*kvertexnumber; i++) 
-       triangleshape->SetVertex(i,vertex[(i < kvertexnumber ? i: i-kvertexnumber)]->X(),
-                                                          vertex[(i < kvertexnumber ? i : i-kvertexnumber)]->Y());
-  return triangleshape;
+       const Int_t kvertexnumber = 2*nedges+2;
+       TGeoXtru* arcshape = new TGeoXtru(2);   
+       TVector3** vertexposition[2];
+       for(Int_t i=0; i<2; i++) vertexposition[i] = new TVector3*[nedges+1];
+       Double_t angle = 0.;
+    for(Int_t i=0; i<nedges+1; i++){ 
+               angle = 90.+0.5*phi-i*(phi/nedges);
+               vertexposition[0][i] = new TVector3(rmin*CosD(angle),rmin*SinD(angle),0);
+               vertexposition[1][i] = new TVector3(rmax*CosD(angle),rmax*SinD(angle),0);
+       }
+       Double_t *xvertexpoints = new Double_t[kvertexnumber];
+       Double_t *yvertexpoints = new Double_t[kvertexnumber];
+       for(Int_t i=0; i<kvertexnumber; i++){ 
+               if(i==0){ xvertexpoints[i] = vertexposition[0][i]->X(),
+                                 yvertexpoints[i] = vertexposition[0][i]->Y(); 
+               }
+               else if(i>=1&&i<nedges+2)
+               {
+                       xvertexpoints[i] = vertexposition[1][i-1]->X(); 
+                       yvertexpoints[i] = vertexposition[1][i-1]->Y(); 
+               }
+        else
+               {
+                       xvertexpoints[i] = vertexposition[0][kvertexnumber-i]->X(); 
+                       yvertexpoints[i] = vertexposition[0][kvertexnumber-i]->Y(); 
+               }
+    }
+  arcshape->DefinePolygon(kvertexnumber,xvertexpoints,yvertexpoints);
+  arcshape->DefineSection(0,-0.5*height);
+  arcshape->DefineSection(1,0.5*height);
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  for(Int_t i=0; i<2; i++){
+       for(Int_t j=0; j<nedges+1; j++)
+               delete vertexposition[i][j];
+       delete [] vertexposition[i];
+  }
+  delete [] xvertexpoints;
+  delete [] yvertexpoints;
+  /////////////////////////////////////////////////////////////
+       return arcshape;
+}
+////////////////////////////////////////////////////////////////////////////////
+TGeoShape* AliITSv11GeometrySSD::GetScrewShape(const Double_t* radius,const Int_t* edgesnumber,const Double_t* section) const {
+  ///////////////////////////////////////////////////////////////////////
+  // Method Generating the Screw Shape  
+  // radius[0]: outer radius
+  // radius[1]: inner radius
+  // edgesnumber[0]: outer number of edges
+  // edgesnumber[1]: inner number of edges
+  // section[0]: lower section position
+  // section[1]: higher section position
+  ///////////////////////////////////////////////////////////////////////
+  Double_t outradius = radius[0];
+  Double_t inradius = radius[1];
+  Int_t outvertexnumber = edgesnumber[0];
+  Int_t invertexnumber = edgesnumber[1];
+  Double_t* xscrewvertex = new Double_t[outvertexnumber+invertexnumber];
+  Double_t* yscrewvertex = new Double_t[outvertexnumber+invertexnumber];
+  for(Int_t i=0; i<outvertexnumber; i++){
+       xscrewvertex[i] = outradius*CosD(90.+i*360./outvertexnumber);
+       yscrewvertex[i] = outradius*SinD(90.+i*360./outvertexnumber);
+  }
+  for(Int_t i=0; i<invertexnumber; i++){
+       xscrewvertex[outvertexnumber+i] = inradius*CosD(90.+i*360./invertexnumber);
+       yscrewvertex[outvertexnumber+i] = inradius*SinD(90.+i*360./invertexnumber);
+  }
+  TGeoXtru* screwshapeout = new TGeoXtru(2);
+  screwshapeout->DefinePolygon(outvertexnumber,xscrewvertex,yscrewvertex);
+  screwshapeout->DefineSection(0,section[0]);
+  screwshapeout->DefineSection(1,section[1]);
+  TGeoXtru* screwshapein = new TGeoXtru(2);
+  screwshapein->DefinePolygon(invertexnumber,&xscrewvertex[outvertexnumber],&yscrewvertex[outvertexnumber]);
+  screwshapein->DefineSection(0,section[0]-0.01); // make inner part bigger in Z
+  screwshapein->DefineSection(1,section[1]+0.01); // safer when we subtract it
+  TGeoSubtraction *snode = new TGeoSubtraction(screwshapeout, screwshapein);
+  TGeoCompositeShape *screwshape = new TGeoCompositeShape("", snode);
+  
+  delete [] xscrewvertex;
+  delete [] yscrewvertex;
+  return screwshape;
 }
 ////////////////////////////////////////////////////////////////////////////////
-TVector3* AliITSv11GeometrySSD::GetReflection(TVector3* vector,Double_t* param) const{
+TGeoShape* AliITSv11GeometrySSD::GetHoleShape(Double_t radius, Int_t nedges, const Double_t *section) const {
+  ///////////////////////////////////////////////////////////////////////
+  // Method Generating the Hole Shape  
+  // radius of the Hole
+  // nedges: number of edges to approximate the circle
+  ///////////////////////////////////////////////////////////////////////
+  Double_t* xholevertex = new Double_t[nedges];
+  Double_t* yholevertex = new Double_t[nedges];
+  Double_t z  = 0.5*(section[0]+section[1]);
+  Double_t dz = 0.5*(section[1]-section[0]);
+  TGeoTranslation *tr = 0;
+  if (TMath::Abs(z) > TGeoShape::Tolerance()) {
+     tr = new TGeoTranslation(0.,0.,z);
+     tr->RegisterYourself();
+  }   
+  TGeoBBox *box = new TGeoBBox("",radius,radius,dz);
+  for(Int_t i=0; i<nedges; i++){
+       xholevertex[i] = radius*CosD(i*360./nedges);
+       yholevertex[i] = radius*SinD(i*360./nedges);
+  }
+  TGeoXtru* holeshapeout = new TGeoXtru(2);
+  holeshapeout->DefinePolygon(nedges,xholevertex,yholevertex);
+  holeshapeout->DefineSection(0,section[0]-0.01); // make subtracted part larger in Z
+  holeshapeout->DefineSection(1,section[1]+0.01);
+  TGeoSubtraction *snode = new TGeoSubtraction(box,holeshapeout,tr);
+  TGeoCompositeShape *holeshape = new TGeoCompositeShape("", snode);
+  
+  delete [] xholevertex;
+  delete [] yholevertex;
+  return holeshape;
+}
+////////////////////////////////////////////////////////////////////////////////
+TVector3* AliITSv11GeometrySSD::GetReflection(const TVector3* vector,const Double_t* param) const{
   /////////////////////////////////////////////////////////////
   // Given an axis specified by param, it gives the reflection of the point
   // respect to the axis
@@ -3362,154 +8161,42 @@ TVector3* AliITSv11GeometrySSD::GetReflection(TVector3* vector,Double_t* param)
   TVector3* n = new TVector3(param[0],param[1],param[2]);
   Double_t d = ((*vector)*(*n)+param[3])/n->Mag2();
   TVector3* reflectedvector = new TVector3(*vector-2*d*(*n));
+  /////////////////////////////////////////////////////////////
+  // Deallocating memory
+  /////////////////////////////////////////////////////////////
+  delete n;
+  /////////////////////////////////////////////////////////////
   return reflectedvector;
 }
 ////////////////////////////////////////////////////////////////////////////////
-TGeoCombiTrans* AliITSv11GeometrySSD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
+TGeoHMatrix* AliITSv11GeometrySSD::AddTranslationToHMatrix(const TGeoHMatrix* ct,
                                                        Double_t dx,
                                                        Double_t dy,
                                                        Double_t dz) const{
   /////////////////////////////////////////////////////////////
   // Add a dx,dy,dz translation to the initial TGeoCombiTrans
   /////////////////////////////////////////////////////////////
-  TGeoCombiTrans* combiTrans = new TGeoCombiTrans(*ct);
-  const Double_t *vect = combiTrans->GetTranslation();
+  TGeoHMatrix* hmatrix = new TGeoHMatrix(*ct);
+  const Double_t *vect = hmatrix->GetTranslation();
   Double_t newvect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
-  combiTrans->SetTranslation(newvect);
-  return combiTrans;
+  hmatrix->SetTranslation(newvect);
+  TGeoHMatrix* matrix = new TGeoHMatrix(*hmatrix);
+  delete hmatrix;
+  return matrix;
 }
 ////////////////////////////////////////////////////////////////////////////////
 TGeoMedium* AliITSv11GeometrySSD::GetMedium(const char* mediumName) {
   /////////////////////////////////////////////////////////////
   // Method returning the Medium type 
   /////////////////////////////////////////////////////////////
-  char ch[30];
-  sprintf(ch, "ITS_%s",mediumName);
+  char ch[100];
+  snprintf(ch,100, "ITS_%s",mediumName);
   TGeoMedium* medium =  gGeoManager->GetMedium(ch);
   if (! medium)
-    printf("Error(AliITSv11GeometrySSD)::medium %s not found !\n", mediumName);
+    AliError(Form("medium %s not found !\n", mediumName));
   return medium;
 }
 ////////////////////////////////////////////////////////////////////////////////
-//To be interfaced with AliRoot Materials file
-////////////////////////////////////////////////////////////////////////////////
-/*void AliITSv11GeometrySSD::CreateMaterials(){
-///////////////////////////////////
-// This part has to be modified
-///////////////////////////////////
-//  Float_t ifield =  2.000;
-//  Float_t fieldm = 10.000;
-//    Int_t   ifield = gAlice->Field()->Integ();
-//    Float_t fieldm = gAlice->Field()->Max();
-  ///////////////////////////////////
-  // Silicon for Sensor
-  /////////////////////////////////// 
-  Int_t SINumber = 0;
-  TGeoMaterial* SiMaterial = new TGeoMaterial("SiMaterial");
-  TGeoMedium* Silicon = new TGeoMedium("Silicon",SINumber,SiMaterial);
-  fSSDSensorMedium = Silicon;
-  ///////////////////////////////////
-  // Silicon Mixture for Sensor
-  /////////////////////////////////// 
-  Int_t SiMixtureNumber = 1;
-  TGeoMaterial* SiMixtureMaterial = new TGeoMaterial("SiMixtureMaterial");
-  TGeoMedium* SiliconMixture = new TGeoMedium("SiliconMixture",SiMixtureNumber,SiMixtureMaterial);
-  fSSDChipMedium = SiliconMixture;
-  ///////////////////////////////////
-  // Stiffener Components Materials
-  /////////////////////////////////// 
-  Int_t K1100Number = 2;
-  TGeoMaterial* K1100Material = new TGeoMaterial("K1100Material");
-  TGeoMedium* K1100 = new TGeoMedium("K1100",K1100Number,K1100Material);
-  fSSDStiffenerMedium = K1100;
-  ///////////////////////////  
-  // Stiffener Connectors 
-  ///////////////////////////  
-  Int_t SnMaterialNumber = 3;
-  TGeoMaterial* SnMaterial = new TGeoMaterial("SnMaterial");
-  TGeoMedium* SnMedium = new TGeoMedium("SnMedium",SnMaterialNumber,
-                                                SnMaterial);
-  fSSDStiffenerConnectorMedium = SnMedium;
-  ////////////////////////////////  
-  // Stiffener 0603-1812 Capacitor
-  ////////////////////////////////  
-  Int_t Al2O3Number = 4;
-  TGeoMaterial* Al2O3Material = new TGeoMaterial("Al2O3Material");
-  TGeoMedium* Al2O3Medium = new TGeoMedium("Al2O3Medium",
-                                                Al2O3Number,
-                                                Al2O3Material);
-  fSSDStiffener0603CapacitorMedium = Al2O3Medium;
-  fSSDStiffener1812CapacitorMedium = Al2O3Medium;
-  ///////////////////////////  
-  // Stiffener Hybrid Wire 
-  ///////////////////////////  
-  Int_t CuHybridWireNumber = 5;
-  TGeoMaterial* CuHybridWireMaterial = new TGeoMaterial("CuHybridWireMaterial");
-  TGeoMedium* CuHybridWireMedium = new TGeoMedium("CuHybridWireMedium",
-                                                CuHybridWireNumber,
-                                                CuHybridWireMaterial);
-  fSSDStiffenerHybridWireMedium = CuHybridWireMedium;
-  ///////////////////////////  
-  // Al for Cooling Block
-  ///////////////////////////  
-  Int_t AlCoolBlockNumber = 6;
-  TGeoMaterial* AlCoolBlockMaterial = new TGeoMaterial("AlCoolBlockMaterial");
-  TGeoMedium* AlCoolBlockMedium = new TGeoMedium("AlCoolBlockMedium",
-                                                AlCoolBlockNumber,
-                                                AlCoolBlockMaterial);
-  fSSDAlCoolBlockMedium = AlCoolBlockMedium;
-  //////////////////////////////////////////////////////  
-  // Kapton and Al for Chip Cable Flex and Ladder Cables
-  //////////////////////////////////////////////////////  
-  Int_t KaptonBlockNumber = 7;
-  TGeoMaterial* KaptonMaterial = new TGeoMaterial("KaptonMaterial");
-  TGeoMedium* KaptonMedium = new TGeoMedium("KaptonMedium",
-                                                KaptonBlockNumber,
-                                                KaptonMaterial);
-  Int_t AlTraceBlockNumber = 8;
-  TGeoMaterial* AlTraceMaterial = new TGeoMaterial("AlTraceMaterial");
-  TGeoMedium* AlTraceMedium = new TGeoMedium("AlTraceMedium",
-                                                AlTraceBlockNumber,
-                                                AlTraceMaterial);
-  fSSDKaptonChipCableMedium = KaptonMedium;
-  fSSDAlTraceChipCableMedium = AlTraceMedium;
-  fSSDKaptonFlexMedium = KaptonMedium;
-  fSSDAlTraceFlexMedium = AlTraceMedium;
-  fSSDKaptonLadderCableMedium = KaptonMedium;
-  fSSDAlTraceLadderCableMedium = AlTraceMedium;
-  /////////////////////////////////////////////////////////////////  
-  // M55J for Carbon Fiber, CarbonFiber Lower Support and Junction
-  //////////////////////////////////////////////////////////////////  
-  Int_t M55JNumber = 9;
-  TGeoMaterial* M55JMaterial = new TGeoMaterial("M55JMaterial");
-  TGeoMedium* M55JMedium = new TGeoMedium("M55JMedium",M55JNumber,
-                                           M55JMaterial);
-  fSSDCarbonFiberMedium = M55JMedium;
-  fSSDMountingBlockMedium = M55JMedium;
-  /////////////////////////////////////////////////////////////////  
-  // G10 for Detector Leg, TubeHolder
-  //////////////////////////////////////////////////////////////////  
-  Int_t G10Number = 10;
-  TGeoMaterial* G10Material = new TGeoMaterial("G10Material");
-  TGeoMedium* G10Medium = new TGeoMedium("G10Medium",G10Number,
-                                           G10Material);
-  fSSDTubeHolderMedium = G10Medium;
-  fSSDSensorSupportMedium = G10Medium;
-  /////////////////////////////////////////////////////////////////  
-  // Water and Phynox for Cooling Tube
-  //////////////////////////////////////////////////////////////////  
-  Int_t WaterNumber = 11;
-  TGeoMaterial* WaterMaterial = new TGeoMaterial("WaterMaterial");
-  TGeoMedium* WaterMedium = new TGeoMedium("WaterMedium",WaterNumber,
-                                           WaterMaterial);
-  fSSDCoolingTubeWater = WaterMedium;
-  Int_t PhynoxNumber = 12;
-  TGeoMaterial* PhynoxMaterial = new TGeoMaterial("PhynoxMaterial");
-  TGeoMedium* PhynoxMedium = new TGeoMedium("PhynoxMedium",PhynoxNumber,
-                                           PhynoxMaterial);
-  fSSDCoolingTubePhynox = PhynoxMedium;
-}
-*/
 void AliITSv11GeometrySSD::CreateMaterials(){
 ///////////////////////////////////
 // This part has to be modified
@@ -3517,7 +8204,7 @@ void AliITSv11GeometrySSD::CreateMaterials(){
   ///////////////////////////////////
   // Silicon for Sensor
   /////////////////////////////////// 
-  fSSDSensorMedium = GetMedium("Si");
+  fSSDSensorMedium = GetMedium("SI$");
   ///////////////////////////////////
   // Silicon Mixture for Sensor
   /////////////////////////////////// 
@@ -3526,33 +8213,34 @@ void AliITSv11GeometrySSD::CreateMaterials(){
   ///////////////////////////////////
   // Stiffener Components Materials
   /////////////////////////////////// 
-  fSSDStiffenerMedium = GetMedium("ITSsddCarbonM55J");
+  fSSDStiffenerMedium = GetMedium("SDD C AL (M55J)$");
   ///////////////////////////  
   // Stiffener Connectors 
   ///////////////////////////  
-  fSSDStiffenerConnectorMedium = GetMedium("COPPER");
+  fSSDStiffenerConnectorMedium = GetMedium("COPPER$");
   ////////////////////////////////  
   // Stiffener 0603-1812 Capacitor
   ////////////////////////////////  
-  fSSDStiffener0603CapacitorMedium = GetMedium("SDD ruby sph. Al2O3");
-  fSSDStiffener1812CapacitorMedium = GetMedium("SDD ruby sph. Al2O3");
+  fSSDStiffener0603CapacitorMedium = GetMedium("SDD ruby sph. Al2O3$");
+  fSSDStiffener1812CapacitorMedium = GetMedium("SDD ruby sph. Al2O3$");
+  fSSDStiffenerCapacitorCapMedium = GetMedium("NiSn$");
   ///////////////////////////  
   // Stiffener Hybrid Wire 
   ///////////////////////////  
-  fSSDStiffenerHybridWireMedium = GetMedium("COPPER");
+  fSSDStiffenerHybridWireMedium = GetMedium("COPPER$");
   ///////////////////////////  
   // Al for Cooling Block
   ///////////////////////////  
-  fSSDAlCoolBlockMedium = GetMedium("ITSal");
+  fSSDAlCoolBlockMedium = GetMedium("AL$");
   //////////////////////////////////////////////////////  
   // Kapton and Al for Chip Cable Flex and Ladder Cables
   //////////////////////////////////////////////////////  
-  fSSDKaptonChipCableMedium = GetMedium("KAPTONH(POLYCH2)");
-  fSSDAlTraceChipCableMedium = GetMedium("ITSal");
-  fSSDKaptonFlexMedium = GetMedium("KAPTONH(POLYCH2)");
-  fSSDAlTraceFlexMedium = GetMedium("ITSal");
-  fSSDKaptonLadderCableMedium = GetMedium("KAPTONH(POLYCH2)");
-  fSSDAlTraceLadderCableMedium = GetMedium("ITSal");
+  fSSDKaptonChipCableMedium = GetMedium("KAPTONH(POLYCH2)$");
+  fSSDAlTraceChipCableMedium = GetMedium("AL$");
+  fSSDKaptonFlexMedium = GetMedium("KAPTONH(POLYCH2)$");
+  fSSDAlTraceFlexMedium = GetMedium("AL$");
+  fSSDKaptonLadderCableMedium = GetMedium("KAPTONH(POLYCH2)$");
+  fSSDAlTraceLadderCableMedium = GetMedium("AL$");
   /////////////////////////////////////////////////////////////////  
   // M55J for Carbon Fiber, CarbonFiber Lower Support and Junction
   //////////////////////////////////////////////////////////////////  
@@ -3567,8 +8255,18 @@ void AliITSv11GeometrySSD::CreateMaterials(){
   /////////////////////////////////////////////////////////////////  
   // Water and Phynox for Cooling Tube
   //////////////////////////////////////////////////////////////////  
-  fSSDCoolingTubeWater = GetMedium("WATER");
+  fSSDCoolingTubeWater = GetMedium("WATER$");
   fSSDCoolingTubePhynox = GetMedium("INOX$");
+  /////////////////////////////////////////////////////////////////////
+  // Material for Support Rings
+  /////////////////////////////////////////////////////////////////////
+  fSSDSupportRingAl = GetMedium("AL$");
+  fSSDRohaCellCone = GetMedium("ROHACELL$");
+  /////////////////////////////////////////////////////////////////////
+  fSSDAir = GetMedium("SDD AIR$");
+  fSSDCopper = GetMedium("COPPER$");
+  fSSDSn = GetMedium("Sn$");
+  fCreateMaterials = kTRUE;
 }
 /////////////////////////////////////////////////////////////////////