New TRD files from C.Blume.
[u/mrichter/AliRoot.git] / TRD / AliTRDv2.cxx
index 2dcfed76923703a0d08061f72a643428e940cf21..868564393fa614c0fe0974ee863c99d3141edddf 100644 (file)
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <TMath.h>
-#include <TRandom.h>
 #include <TVector.h>
-#include <TGeometry.h>
-#include <TNode.h>
-#include <TPGON.h> 
 
-#include "GParticle.h"
 #include "AliTRDv2.h"
 #include "AliRun.h"
-#include "AliConst.h"
 #include "AliMC.h"
+#include "AliConst.h"
 
 ClassImp(AliTRDv2)
 
@@ -33,10 +28,20 @@ AliTRDv2::AliTRDv2(const char *name, const char *title)
   //
   // Standard constructor for Transition Radiation Detector version 2
   //
-  fIdSenO1 = fIdSenO2 = fIdSenO3 = fIdSenO4 = fIdSenO5 = fIdSenO6 = 0;
-  fIdSenI1 = fIdSenI2 = fIdSenI3 = fIdSenI4 = fIdSenI5 = fIdSenI6 = 0;
+  for (Int_t icham = 0; icham < ncham; ++icham) {
+    fIdSensI[icham] = 0;
+    fIdSensN[icham] = 0;
+    fIdSensO[icham] = 0;
+  }
+  fDeltaE = NULL;
+
   SetBufferSize(128000);
 }
+
+AliTRDv2::~AliTRDv2()
+{
+   if (fDeltaE)  delete fDeltaE;
+}
  
 //_____________________________________________________________________________
 void AliTRDv2::CreateGeometry()
@@ -44,6 +49,30 @@ void AliTRDv2::CreateGeometry()
   //
   // Create geometry for the Transition Radiation Detector version 2
   // This version covers the full azimuth. 
+  // --- Author :  Christoph Blume (GSI) 20/5/99 
+  //
+  // --- Volume names : 
+  //       TRD         --> Mother TRD volume                              (Al) 
+  //       UTRS        --> Sectors of the sub-detector                    (Al)
+  //       UTRI        --> Inner part of the detector frame               (Air) 
+  //     The chambers 
+  //       UCI1-6      --> The frame of the inner chambers                (C) 
+  //       UCN1-6      --> The frame of the neighbouring chambers         (C) 
+  //       UCO1-6      --> The frame of the outer chambers                (C) 
+  //       UII1-6      --> The inner part of the inner chambers           (Air) 
+  //       UIN1-6      --> The inner part of the neighbouring chambers    (Air) 
+  //       UIO1-6      --> The inner part of the outer chambers           (Air) 
+  //     The layers inside a chamber 
+  //       UT0I(N,O)   --> Radiator seal                                  (G10)
+  //       UT1I(N,O)   --> Radiator                                       (CO2)
+  //       UT2I(N,O)   --> Polyethylene of radiator                       (PE)
+  //       UT3I(N,O)   --> Entrance window                                (Mylar)
+  //       UXI(N,O)1-6 --> Gas volume (sensitive)                         (Xe/Isobutane)
+  //       UT5I(N,O)   --> Pad plane                                      (Cu)
+  //       UT6I(N,O)   --> Support structure                              (G10)
+  //       UT7I(N,O)   --> FEE + signal lines                             (Cu)
+  //       UT8I(N,O)   --> Polyethylene of cooling device                 (PE)
+  //       UT9I(N,O)   --> Cooling water                                  (Water)
   //
   //Begin_Html
   /*
@@ -55,267 +84,328 @@ void AliTRDv2::CreateGeometry()
     <img src="gif/AliTRDv2Tree.gif">
   */
   //End_Html
+  
+  Float_t xpos, ypos, zpos;
+  Int_t   idmat[2];
 
+  const Int_t nparmo = 10;
+  const Int_t nparfr =  4;
+  const Int_t nparch =  3;
+  const Int_t nparic =  4;
+  const Int_t nparnc =  4;
+  const Int_t nparoc = 11;
 
-  // --- Name Conventions : 
-  
-  //     The mother volume and the support structure 
-  //        TRD     --> Mother TRD volume                          (Air) 
-  //        UTRS    --> The sectors of the detector                (Air) 
-  //        UTSP    --> The aluminum part of the support structure (Al) 
-  //        UTII(O) --> The inner parts of the support structure   (Air) 
-  
-  //     The chambers 
-  //        UCI1-6  --> The frame of the inner chambers            (C) 
-  //        UCO1-6  --> The frame of the outer chambers            (C) 
-  //        UII1-6  --> The inner part of the inner chambers       (Air) 
-  //        UIO1-6  --> The inner part of the outer chambers       (Air) 
-  
-  //     The layers inside a chamber 
-  //        UT1I(O) --> Radiator layer                             (CO2) 
-  //        UT2I(O) --> Polyethylene layer                         (PE) 
-  //        UT3I(O) --> Mylar layer                                (Mylar) 
-  //        UXI1-6  --> Xe/C02 layer in the inner chambers         (Xe/C02) 
-  //        UXO1-6  --> Xe/C02 layer in the outer chambers         (Xe/C02) 
-  //        UT5I(O) --> Cu layer (pads/sensitive)                  (Cu) 
-  //        UT6I(O) --> Kapton layer                               (Kapton) 
-  //        UT7I(O) --> NOMEX layer                                (C) 
-  //        UT8I(O) --> Readout layer                              (Al) 
-  
-  
-  // --- Contains geometry information 
-  
-  // --- Number of sectors in the full detector 
-  // --- Number of modules in each sector 
-  // --- z-Coordinates of the TRD-frame 
-  // --- r-Coordinates of the TRD-frame 
-  // --- Thickness of the aluminium of the support frame 
-  // --- Thickness of the interior of the support frame 
-  // --- Thickness of the carbon chamber frame 
-  // --- Thickness and z-position of the PE-layer in the radiator 
-  // --- Thickness and z-position of the radiator 
-  // --- Thickness and z-position of the mylar-layer 
-  // --- Thickness and z-position of the Xe/C02-layer 
-  // --- Thickness and z-position of the Cu-layer (Pads) 
-  // --- Thickness and z-position of the kapton-layer 
-  // --- Thickness and z-position of the NOMEX-layer 
-  //     Simple C-layer for the time being 
-  // --- Thickness and z-position of the readout-layer 
-  // --- Parameter for the arrays 
-  // --- Number of different chambers 
-  // --- Number of rotation matrices 
+  Float_t par_mo[nparmo];
+  Float_t par_fr[nparfr];
+  Float_t par_ch[nparch];
+  Float_t par_ic[nparic];
+  Float_t par_nc[nparnc];
+  Float_t par_oc[nparoc];
 
-  AliMC* pMC = AliMC::GetMC();
-  
-  Float_t xpos, ypos, zpos;
-  Int_t icham;
-  Int_t idmat[2];
-  Float_t widma, widmi;
-  Float_t lendifc, widdifc, heightc;
-  Float_t par_ic[3], par_oc[3], par_mo[10], par_sp[4], par_ch[3];
-  
   Int_t *idtmed = gAlice->Idtmed();
   
-  //************************************************************************
-  
+  AliMC* pMC = AliMC::GetMC();
+
+  //////////////////////////////////////////////////////////////////////////
   //     Definition of Volumes 
+  //////////////////////////////////////////////////////////////////////////
   
-  //************************************************************************
-  
-  const Int_t ncham = 6; //Number of different chambers
-  
-  widmi  = rmin*TMath::Sin(kPI/nsect);
-  widma  = rmax*TMath::Sin(kPI/nsect);
-  // --- Some parameter for the chambers 
-  lendifc = (zmax1-zmax2)/nmodul;
-  heightc = (rmax-rmin)/nmodul;
-  widdifc = (widma - widmi)/nmodul;
-  // --- Definition of the Mother volume for the TRD (Air) 
-  par_mo[0] = 0.;
+  // Definition of the mother volume for the TRD (Al) 
+  par_mo[0] =   0.;
   par_mo[1] = 360.;
   par_mo[2] = nsect;
   par_mo[3] = 2.;
   par_mo[4] = -zmax1;
   par_mo[5] = rmin;
   par_mo[6] = rmax;
-  par_mo[7] = zmax1;
+  par_mo[7] =  zmax1;
   par_mo[8] = rmin;
   par_mo[9] = rmax;
-  pMC->Gsvolu("TRD ", "PGON", idtmed[1301], par_mo, 10);
-  // --- Divide the mother volume into sectors 
+  pMC->Gsvolu("TRD ", "PGON", idtmed[1301-1], par_mo, nparmo);
   pMC->Gsdvn("UTRS", "TRD ", nsect, 2);
-  // --- Definition of the aluminum part of the support structure (Al) 
-  par_sp[0] = widmi - inframe/2;
-  par_sp[1] = widma - inframe/2;
-  par_sp[2] = zmax1/2;
-  par_sp[3] = (rmax-rmin)/2;
-  pMC->Gsvolu("UTSP", "TRD1", idtmed[1300], par_sp, 4);
-  // --- Definition of the inner part of the support structure (Air) 
-  par_sp[0] = widmi - inframe/2 - alfram1/2;
-  par_sp[1] = widma - inframe/2 - alfram1/2;
-  par_sp[2] = zmax1/4 -alfram2/2;
-  par_sp[3] = (rmax-rmin)/2;
-  pMC->Gsvolu("UTII", "TRD1", idtmed[1301], par_sp, 4);
-  pMC->Gsvolu("UTIO", "TRD1", idtmed[1301], par_sp, 4);
-  // --- Definition of the chambers 
-  char ctagc[5], ctagi[5], ctagx[5];
-  for (icham = 1; icham <= ncham; ++icham) {
-    // --- Carbon frame of the inner chambers (C) 
-    par_ch[0] = widmi + (icham-1) * widdifc - (inframe+alfram1)/2;
-    par_ch[1] = zmax1/4 -alfram2/2;
-    par_ch[2] = heightc/2.;
+
+  // The minimal width of a sector in rphi-direction
+  Float_t widmi = rmin * TMath::Sin(kPI/nsect);
+  // The maximal width of a sector in rphi-direction
+  Float_t widma = rmax * TMath::Sin(kPI/nsect);
+  // The total thickness of the spaceframe (Al + Air)
+  Float_t frame = widmi - (widpl1 / 2);
+
+  // Definition of the inner part of the detector frame (Air) 
+  par_fr[0] = widmi - alframe / 2.;
+  par_fr[1] = widma - alframe / 2.;
+  par_fr[2] = zmax1;
+  par_fr[3] = (rmax - rmin) / 2;
+  pMC->Gsvolu("UTRI", "TRD1", idtmed[1302-1], par_fr, nparfr); 
+
+  // Some parameter for the chambers 
+  Float_t lendifc = (zmax1 - zmax2) / nmodul;
+  Float_t heightc = (rmax  - rmin ) / nmodul;
+  Float_t widdifc = (widma - widmi) / nmodul;
+
+  // Definition of the chambers 
+  Char_t ctagc[5], ctagi[5];
+  for (Int_t icham = 1; icham <= ncham; ++icham) {
+
+    // Carbon frame of the inner chambers (C) 
+    par_ch[0] = widmi + (icham-1) * widdifc - frame;
+    par_ch[1] = zleni   / 2.;
+    par_ch[2] = heightc / 2.;
     sprintf(ctagc,"UCI%1d",icham);
-    pMC->Gsvolu(ctagc, "BOX ", idtmed[1306], par_ch, 3);
-    // --- Inner part of the inner chambers (Air) 
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1307-1], par_ch, nparch);
+    // Inner part of the inner chambers (Air) 
     par_ch[0] -= ccframe;
     par_ch[1] -= ccframe;
-    sprintf(ctagi,"UII%1d",icham);
-    pMC->Gsvolu(ctagi, "BOX ", idtmed[1301], par_ch, 3);
-    // --- Carbon frame of the outer chambers (C) 
-    par_ch[0] = widmi + (icham - 1) * widdifc - 2.;
-    par_ch[1] = (icham - 6) * lendifc / 2. + zmax1/4 -alfram2/2;
+    sprintf(ctagc,"UII%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1302-1], par_ch, nparch);
+
+    // Carbon frame of the neighbouring chambers (C) 
+    par_ch[0] = widmi + (icham-1) * widdifc - frame;
+    par_ch[1] = zlenn   / 2.;
+    par_ch[2] = heightc / 2.;
+    sprintf(ctagc,"UCN%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1307-1], par_ch, nparch);
+    // Inner part of the neighbouring chambers (Air) 
+    par_ch[0] -= ccframe;
+    par_ch[1] -= ccframe;
+    sprintf(ctagc,"UIN%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1302-1], par_ch, nparch);
+
+    // Carbon frame of the outer chambers (C) 
+    par_ch[0] = widmi + (icham-1) * widdifc - frame;
+    par_ch[1] = (icham - 6) * lendifc / 2. + zleno   / 2.;
     par_ch[2] = heightc / 2.;
     sprintf(ctagc,"UCO%1d",icham);
-    pMC->Gsvolu(ctagc, "BOX ", idtmed[1306], par_ch, 3);
-    // --- Inner part of the outer chambers (Air) 
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1307-1], par_ch, nparch);
+    // Inner part of the outer chambers (Air) 
     par_ch[0] -= ccframe;
     par_ch[1] -= ccframe;
-    sprintf(ctagi,"UIO%1d",icham);
-    pMC->Gsvolu(ctagi, "BOX ", idtmed[1301], par_ch, 3);
+    sprintf(ctagc,"UIO%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1302-1], par_ch, nparch);
+
   }
-  // --- Definition of the layers in each inner chamber 
+
+  // Definition of the layers in each inner chamber 
   par_ic[0] = -1.;
   par_ic[1] = -1.;
-  // --- Radiator layer 
-  par_ic[2] = rathick/2;;
-  pMC->Gsvolu("UT1I", "BOX ", idtmed[1311], par_ic, 3);
-  // --- Polyethylene layer 
-  par_ic[2] = pethick/2;
-  pMC->Gsvolu("UT2I", "BOX ", idtmed[1302], par_ic, 3);
-  // --- Mylar layer 
-  par_ic[2] = mythick/2;
-  pMC->Gsvolu("UT3I", "BOX ", idtmed[1307], par_ic, 3);
-  // --- Xe/CO2 layer 
-  par_ic[2] = 1.8;
-  for (icham = 1; icham <= 6; ++icham) {
-    sprintf(ctagx,"UXI%1d",icham);
-    pMC->Gsvolu(ctagx, "BOX ", idtmed[1308], par_ic, 3);
+  // G10 layer (radiator layer)
+  par_ic[2] = sethick / 2;
+  pMC->Gsvolu("UT0I", "BOX ", idtmed[1313-1], par_ic, nparic);
+  // CO2 layer (radiator)
+  par_ic[2] = rathick / 2;
+  pMC->Gsvolu("UT1I", "BOX ", idtmed[1312-1], par_ic, nparic);
+  // PE layer (radiator)
+  par_ic[2] = pethick / 2;
+  pMC->Gsvolu("UT2I", "BOX ", idtmed[1303-1], par_ic, nparic);
+  // Mylar layer (entrance window + HV cathode) 
+  par_ic[2] = mythick / 2;
+  pMC->Gsvolu("UT3I", "BOX ", idtmed[1308-1], par_ic, nparic);
+  // Xe/Isobutane layer (gasvolume) 
+  par_ic[2] = xethick / 2.;
+  for (Int_t icham = 1; icham <= 6; ++icham) {
+    sprintf(ctagc,"UXI%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1309-1], par_ic, nparic);
   }
-  // --- Cu layer 
-  par_ic[2] = cuthick/2;
-  pMC->Gsvolu("UT5I", "BOX ", idtmed[1304], par_ic, 3);
-  // --- Kapton layer 
-  par_ic[2] = kathick/2;
-  pMC->Gsvolu("UT6I", "BOX ", idtmed[1310], par_ic, 3);
-  // --- NOMEX layer 
-  par_ic[2] = nothick/2;
-  pMC->Gsvolu("UT7I", "BOX ", idtmed[1309], par_ic, 3);
-  // --- Read out layer 
-  par_ic[2] = rothick/2;
-  pMC->Gsvolu("UT8I", "BOX ", idtmed[1305], par_ic, 3);
-  // --- Definition of the layers in each outer chamber 
+  // Cu layer (pad plane)
+  par_ic[2] = cuthick / 2;
+  pMC->Gsvolu("UT5I", "BOX ", idtmed[1305-1], par_ic, nparic);
+  // G10 layer (support structure)
+  par_ic[2] = suthick / 2;
+  pMC->Gsvolu("UT6I", "BOX ", idtmed[1313-1], par_ic, nparic);
+  // Cu layer (FEE + signal lines)
+  par_ic[2] = fethick / 2;
+  pMC->Gsvolu("UT7I", "BOX ", idtmed[1305-1], par_ic, nparic);
+  // PE layer (cooling devices)
+  par_ic[2] = cothick / 2;
+  pMC->Gsvolu("UT8I", "BOX ", idtmed[1303-1], par_ic, nparic);
+  // Water layer (cooling)
+  par_ic[2] = wathick / 2;
+  pMC->Gsvolu("UT9I", "BOX ", idtmed[1314-1], par_ic, nparic);
+
+  // Definition of the layers in each neighbouring chamber 
+  par_nc[0] = -1.;
+  par_nc[1] = -1.;
+  // G10 layer (radiator layer)
+  par_nc[2] = sethick / 2;
+  pMC->Gsvolu("UT0N", "BOX ", idtmed[1313-1], par_nc, nparnc);
+  // CO2 layer (radiator)
+  par_nc[2] = rathick / 2;
+  pMC->Gsvolu("UT1N", "BOX ", idtmed[1312-1], par_nc, nparnc);
+  // PE layer (radiator)
+  par_nc[2] = pethick / 2;
+  pMC->Gsvolu("UT2N", "BOX ", idtmed[1303-1], par_nc, nparnc);
+  // Mylar layer (entrance window + HV cathode) 
+  par_nc[2] = mythick / 2;
+  pMC->Gsvolu("UT3N", "BOX ", idtmed[1308-1], par_nc, nparnc);
+  // Xe/Isobutane layer (gasvolume) 
+  par_nc[2] = xethick / 2.;
+  for (Int_t icham = 1; icham <= 6; ++icham) {
+    sprintf(ctagc,"UXN%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1309-1], par_nc, nparnc);
+  }
+  // Cu layer (pad plane)
+  par_nc[2] = cuthick / 2;
+  pMC->Gsvolu("UT5N", "BOX ", idtmed[1305-1], par_nc, nparnc);
+  // G10 layer (support structure)
+  par_nc[2] = suthick / 2;
+  pMC->Gsvolu("UT6N", "BOX ", idtmed[1313-1], par_nc, nparnc);
+  // Cu layer (FEE + signal lines)
+  par_nc[2] = fethick / 2;
+  pMC->Gsvolu("UT7N", "BOX ", idtmed[1305-1], par_nc, nparnc);
+  // PE layer (cooling devices)
+  par_nc[2] = cothick / 2;
+  pMC->Gsvolu("UT8N", "BOX ", idtmed[1303-1], par_nc, nparnc);
+  // Water layer (cooling)
+  par_nc[2] = wathick / 2;
+  pMC->Gsvolu("UT9N", "BOX ", idtmed[1314-1], par_nc, nparnc);
+
+  // Definition of the layers in each outer chamber 
   par_oc[0] = -1.;
   par_oc[1] = -1.;
-  // --- Radiator layer 
-  par_oc[2] = rathick/2;;
-  pMC->Gsvolu("UT1O", "BOX ", idtmed[1311], par_oc, 3);
-  // --- Polyethylene layer 
-  par_oc[2] = pethick/2;
-  pMC->Gsvolu("UT2O", "BOX ", idtmed[1302], par_oc, 3);
-  // --- Mylar layer 
-  par_oc[2] = mythick/2;
-  pMC->Gsvolu("UT3O", "BOX ", idtmed[1307], par_oc, 3);
-  // --- Xe/CO2 layer 
-  par_oc[2] = xethick/2;
-  for (icham = 1; icham <= ncham; ++icham) {
-    sprintf(ctagx,"UXO%1d",icham);
-    pMC->Gsvolu(ctagx, "BOX ", idtmed[1308], par_oc, 3);
+  // G10 layer (radiator layer)
+  par_oc[2] = sethick / 2;
+  pMC->Gsvolu("UT0O", "BOX ", idtmed[1313-1], par_oc, nparoc);
+  // CO2 layer (radiator)
+  par_oc[2] = rathick / 2;
+  pMC->Gsvolu("UT1O", "BOX ", idtmed[1312-1], par_oc, nparoc);
+  // PE layer (radiator)
+  par_oc[2] = pethick / 2;
+  pMC->Gsvolu("UT2O", "BOX ", idtmed[1303-1], par_oc, nparoc);
+  // Mylar layer (entrance window + HV cathode) 
+  par_oc[2] = mythick / 2;
+  pMC->Gsvolu("UT3O", "BOX ", idtmed[1308-1], par_oc, nparoc);
+  // Xe/Isobutane layer (gasvolume) 
+  par_oc[2] = xethick / 2.;
+  for (Int_t icham = 1; icham <= 6; ++icham) {
+    sprintf(ctagc,"UXO%1d",icham);
+    pMC->Gsvolu(ctagc, "BOX ", idtmed[1309-1], par_oc, nparoc);
   }
-  // --- Cu layer 
-  par_oc[2] = cuthick/2;
-  pMC->Gsvolu("UT5O", "BOX ", idtmed[1304], par_oc, 3);
-  // --- Kapton layer 
-  par_oc[2] = kathick/2;
-  pMC->Gsvolu("UT6O", "BOX ", idtmed[1310], par_oc, 3);
-  // --- NOMEX layer 
-  par_oc[2] = nothick/2;
-  pMC->Gsvolu("UT7O", "BOX ", idtmed[1309], par_oc, 3);
-  // --- Read out layer 
-  par_oc[2] = rothick/2;
-  pMC->Gsvolu("UT8O", "BOX ", idtmed[1305], par_oc, 3);
-  //*************************************************************************
-  
-  //     Positioning of Volumes 
-  
-  //************************************************************************
-  // --- The rotation matrices 
-  AliMatrix(idmat[0], 90., 90., 180., 0., 90., 0.);
-  AliMatrix(idmat[1], 90., 90.,   0., 0., 90., 0.);
-  // --- Position of the layers in a chamber 
-  for (icham = 1; icham <= ncham; ++icham) {
-    // --- The inner chambers 
+  // Cu layer (pad plane)
+  par_oc[2] = cuthick / 2;
+  pMC->Gsvolu("UT5O", "BOX ", idtmed[1305-1], par_oc, nparoc);
+  // G10 layer (support structure)
+  par_oc[2] = suthick / 2;
+  pMC->Gsvolu("UT6O", "BOX ", idtmed[1313-1], par_oc, nparoc);
+  // Cu layer (FEE + signal lines)
+  par_oc[2] = fethick / 2;
+  pMC->Gsvolu("UT7O", "BOX ", idtmed[1305-1], par_oc, nparoc);
+  // PE layer (cooling devices)
+  par_oc[2] = cothick / 2;
+  pMC->Gsvolu("UT8O", "BOX ", idtmed[1303-1], par_oc, nparoc);
+  // Water layer (cooling)
+  par_oc[2] = wathick / 2;
+  pMC->Gsvolu("UT9O", "BOX ", idtmed[1314-1], par_oc, nparoc);
+
+  //////////////////////////////////////////////////////////////////////////
+  //     Positioning of Volumes   
+  //////////////////////////////////////////////////////////////////////////
+
+  // The rotation matrices 
+  AliMatrix(idmat[0],  90.,  90., 180.,   0.,  90.,   0.);
+  AliMatrix(idmat[1],  90.,  90.,   0.,   0.,  90.,   0.);
+
+  // Position of the layers in a chamber 
+  pMC->Gspos("UT2I", 1, "UT1I", 0., 0., pezpos, 0, "ONLY");
+  pMC->Gspos("UT2N", 1, "UT1N", 0., 0., pezpos, 0, "ONLY");
+  pMC->Gspos("UT2O", 1, "UT1O", 0., 0., pezpos, 0, "ONLY");
+  for (Int_t icham = 1; icham <= ncham; ++icham) {
+    // The inner chambers 
     sprintf(ctagi,"UII%1d",icham);
-    sprintf(ctagx,"UXI%1d",icham);
-    pMC->Gspos("UT8I", icham, ctagi, 0., 0., rozpos, 0, "ONLY");
-    pMC->Gspos("UT7I", icham, ctagi, 0., 0., nozpos, 0, "ONLY");
-    pMC->Gspos("UT6I", icham, ctagi, 0., 0., kazpos, 0, "ONLY");
+    sprintf(ctagc,"UXI%1d",icham);
+    pMC->Gspos("UT9I", icham, ctagi, 0., 0., wazpos, 0, "ONLY");
+    pMC->Gspos("UT8I", icham, ctagi, 0., 0., cozpos, 0, "ONLY");
+    pMC->Gspos("UT7I", icham, ctagi, 0., 0., fezpos, 0, "ONLY");
+    pMC->Gspos("UT6I", icham, ctagi, 0., 0., suzpos, 0, "ONLY");
     pMC->Gspos("UT5I", icham, ctagi, 0., 0., cuzpos, 0, "ONLY");
-    pMC->Gspos(ctagx,  1,     ctagi, 0., 0., xezpos, 0, "ONLY");
+    pMC->Gspos(ctagc ,     1, ctagi, 0., 0., xezpos, 0, "ONLY");
     pMC->Gspos("UT3I", icham, ctagi, 0., 0., myzpos, 0, "ONLY");
     pMC->Gspos("UT1I", icham, ctagi, 0., 0., razpos, 0, "ONLY");
-    // --- The outer chambers 
-    sprintf(ctagi,"UIO%d",icham);
-    sprintf(ctagx,"UXO%d",icham);
-    pMC->Gspos("UT8O", icham, ctagi, 0., 0., rozpos, 0, "ONLY");
-    pMC->Gspos("UT7O", icham, ctagi, 0., 0., nozpos, 0, "ONLY");
-    pMC->Gspos("UT6O", icham, ctagi, 0., 0., kazpos, 0, "ONLY");
+    pMC->Gspos("UT0I", icham, ctagi, 0., 0., sezpos, 0, "ONLY");
+    // The neighbouring chambers 
+    sprintf(ctagi,"UIN%1d",icham);
+    sprintf(ctagc,"UXN%1d",icham);
+    pMC->Gspos("UT9N", icham, ctagi, 0., 0., wazpos, 0, "ONLY");
+    pMC->Gspos("UT8N", icham, ctagi, 0., 0., cozpos, 0, "ONLY");
+    pMC->Gspos("UT7N", icham, ctagi, 0., 0., fezpos, 0, "ONLY");
+    pMC->Gspos("UT6N", icham, ctagi, 0., 0., suzpos, 0, "ONLY");
+    pMC->Gspos("UT5N", icham, ctagi, 0., 0., cuzpos, 0, "ONLY");
+    pMC->Gspos(ctagc ,     1, ctagi, 0., 0., xezpos, 0, "ONLY");
+    pMC->Gspos("UT3N", icham, ctagi, 0., 0., myzpos, 0, "ONLY");
+    pMC->Gspos("UT1N", icham, ctagi, 0., 0., razpos, 0, "ONLY");
+    pMC->Gspos("UT0N", icham, ctagi, 0., 0., sezpos, 0, "ONLY");
+    // The outer chambers 
+    sprintf(ctagi,"UIO%1d",icham);
+    sprintf(ctagc,"UXO%1d",icham);
+    pMC->Gspos("UT9O", icham, ctagi, 0., 0., wazpos, 0, "ONLY");
+    pMC->Gspos("UT8O", icham, ctagi, 0., 0., cozpos, 0, "ONLY");
+    pMC->Gspos("UT7O", icham, ctagi, 0., 0., fezpos, 0, "ONLY");
+    pMC->Gspos("UT6O", icham, ctagi, 0., 0., suzpos, 0, "ONLY");
     pMC->Gspos("UT5O", icham, ctagi, 0., 0., cuzpos, 0, "ONLY");
-    pMC->Gspos(ctagx,  1,     ctagi, 0., 0., xezpos, 0, "ONLY");
+    pMC->Gspos(ctagc ,     1, ctagi, 0., 0., xezpos, 0, "ONLY");
     pMC->Gspos("UT3O", icham, ctagi, 0., 0., myzpos, 0, "ONLY");
     pMC->Gspos("UT1O", icham, ctagi, 0., 0., razpos, 0, "ONLY");
+    pMC->Gspos("UT0O", icham, ctagi, 0., 0., sezpos, 0, "ONLY");
   }
-  pMC->Gspos("UT2I", 1, "UT1I", 0., 0., 0., 0, "ONLY");
-  pMC->Gspos("UT2O", 1, "UT1O", 0., 0., 0., 0, "ONLY");
-  // --- Position of the inner part of the chambers in the carbon-frames 
-  for (icham = 1; icham <= ncham; ++icham) {
-    // --- The inner chambers 
+
+  // Position of the inner part of the chambers in the carbon-frames 
+  for (Int_t icham = 1; icham <= ncham; ++icham) {
+    xpos = 0.;
+    ypos = 0.;
+    zpos = 0.;
+    // The inner chambers 
     sprintf(ctagi,"UII%1d",icham);
     sprintf(ctagc,"UCI%1d",icham);
-    pMC->Gspos(ctagi, 1, ctagc, 0., 0., 0., 0, "ONLY");
-    // --- The outer chambers 
+    pMC->Gspos(ctagi, 1, ctagc, xpos, ypos, zpos, 0, "ONLY");
+    // The neighbouring chambers 
+    sprintf(ctagi,"UIN%1d",icham);
+    sprintf(ctagc,"UCN%1d",icham);
+    pMC->Gspos(ctagi, 1, ctagc, xpos, ypos, zpos, 0, "ONLY");
+    // The outer chambers 
     sprintf(ctagi,"UIO%1d",icham);
     sprintf(ctagc,"UCO%1d",icham);
-    pMC->Gspos(ctagi, 1, ctagc, 0., 0., 0., 0, "ONLY");
+    pMC->Gspos(ctagi, 1, ctagc, xpos, ypos, zpos, 0, "ONLY");
   }
-  // --- Position of the chambers in the full TRD-setup 
-  for (icham = 1; icham <= ncham; ++icham) {
-    // --- The inner chambers 
+
+  // Position of the chambers in the full TRD-setup 
+  for (Int_t icham = 1; icham <= ncham; ++icham) {
+    // The inner chambers
     xpos = 0.;
     ypos = 0.;
-    zpos = (icham - .5) * heightc - (rmax-rmin)/2;
+    zpos = (icham-0.5) * heightc - (rmax - rmin) / 2;
     sprintf(ctagc,"UCI%1d",icham);
-    pMC->Gspos(ctagc, 1, "UTII", xpos, ypos, zpos, 0, "ONLY");
-    // --- The outer chambers 
+    pMC->Gspos(ctagc, 1, "UTRI", xpos, ypos, zpos, 0, "ONLY");
+    // The neighbouring chambers
     xpos = 0.;
-    ypos = 0. - (icham - 6) * lendifc / 2.;
-    zpos = (icham - .5) * heightc - (rmax-rmin)/2;
+    ypos = (zleni + zlenn) / 2.;
+    zpos = (icham-0.5) * heightc - (rmax - rmin) / 2;
+    sprintf(ctagc,"UCN%1d",icham);
+    pMC->Gspos(ctagc, 1, "UTRI", xpos, ypos, zpos, 0, "ONLY");
+    ypos = -ypos;
+    sprintf(ctagc,"UCN%1d",icham);
+    pMC->Gspos(ctagc, 2, "UTRI", xpos, ypos, zpos, 0, "ONLY");
+    // The outer chambers 
+    xpos = 0.;
+    ypos = (zleni / 2. + zlenn + zmax2 + (icham-1) * lendifc) / 2.;
+    zpos = (icham-0.5) * heightc - (rmax-rmin)/2;
+    sprintf(ctagc,"UCO%1d",icham);
+    pMC->Gspos(ctagc, 1, "UTRI", xpos, ypos, zpos, 0, "ONLY");
+    ypos = -ypos;
     sprintf(ctagc,"UCO%1d",icham);
-    pMC->Gspos(ctagc, 1, "UTIO", xpos, ypos, zpos, 0, "ONLY");
+    pMC->Gspos(ctagc, 2, "UTRI", xpos, ypos, zpos, 0, "ONLY");
   }
-  // --- Position of the inner parts of the support frame 
-  xpos = 0.;
-  ypos = zmax1/4;
+
+  // Position of the inner part of the detector frame
+  xpos = (rmax + rmin) / 2;
+  ypos = 0.;
   zpos = 0.;
-  pMC->Gspos("UTIO", 1, "UTSP", xpos,-ypos, zpos, 0, "ONLY");
-  pMC->Gspos("UTII", 1, "UTSP", xpos, ypos, zpos, 0, "ONLY");
-  // --- Position of the support frame in the TRD-sectors 
-  xpos = (rmax+rmin)/2;
+  pMC->Gspos("UTRI", 1, "UTRS", xpos, ypos, zpos, idmat[0], "ONLY");
+
+  // Position of the TRD mother volume in the ALICE experiment 
+  xpos = 0.;
   ypos = 0.;
-  zpos = zmax1/2;
-  pMC->Gspos("UTSP", 1, "UTRS", xpos, ypos, zpos, idmat[0], "ONLY");
-  pMC->Gspos("UTSP", 2, "UTRS", xpos, ypos,-zpos, idmat[1], "ONLY");
-  // --- Position of TRD mother volume in ALICE experiment 
-  pMC->Gspos("TRD ", 1, "ALIC", 0., 0., 0., 0, "ONLY");
+  zpos = 0.;
+  pMC->Gspos("TRD ", 1, "ALIC", xpos, ypos, zpos,        0, "ONLY");
+
 }
 
 //_____________________________________________________________________________
@@ -329,55 +419,39 @@ void AliTRDv2::DrawModule()
   
   // Set everything unseen
   pMC->Gsatt("*", "seen", -1);
-  // 
+   
   // Set ALIC mother transparent
   pMC->Gsatt("ALIC","SEEN",0);
-  //
+  
   // Set the volumes visible
-  pMC->Gsatt("TRD","SEEN",0);
+  pMC->Gsatt("TRD ","SEEN",0);
   pMC->Gsatt("UTRS","SEEN",0);
-  pMC->Gsatt("UTSP","SEEN",0);
-  pMC->Gsatt("UTII","SEEN",0);
-  pMC->Gsatt("UTIO","SEEN",0);
-  pMC->Gsatt("UCI1","SEEN",0);
-  pMC->Gsatt("UII1","SEEN",0);
-  pMC->Gsatt("UCO1","SEEN",0);
-  pMC->Gsatt("UIO1","SEEN",0);
-  pMC->Gsatt("UCI2","SEEN",0);
-  pMC->Gsatt("UII2","SEEN",0);
-  pMC->Gsatt("UCO2","SEEN",0);
-  pMC->Gsatt("UIO2","SEEN",0);
-  pMC->Gsatt("UCI3","SEEN",0);
-  pMC->Gsatt("UII3","SEEN",0);
-  pMC->Gsatt("UCO3","SEEN",0);
-  pMC->Gsatt("UIO3","SEEN",0);
-  pMC->Gsatt("UCI4","SEEN",0);
-  pMC->Gsatt("UII4","SEEN",0);
-  pMC->Gsatt("UCO4","SEEN",0);
-  pMC->Gsatt("UIO4","SEEN",0);
-  pMC->Gsatt("UCI5","SEEN",0);
-  pMC->Gsatt("UII5","SEEN",0);
-  pMC->Gsatt("UCO5","SEEN",0);
-  pMC->Gsatt("UIO5","SEEN",0);
-  pMC->Gsatt("UCI6","SEEN",0);
-  pMC->Gsatt("UII6","SEEN",0);
-  pMC->Gsatt("UCO6","SEEN",0);
-  pMC->Gsatt("UIO6","SEEN",0);
+  pMC->Gsatt("UTRI","SEEN",0);
+  Char_t ctag[5];
+  for (Int_t icham = 0; icham < ncham; ++icham) {
+    sprintf(ctag,"UCI%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",0);
+    sprintf(ctag,"UCN%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",0);
+    sprintf(ctag,"UCO%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",0);
+    sprintf(ctag,"UII%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",0);
+    sprintf(ctag,"UIN%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",0);
+    sprintf(ctag,"UIO%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",0);
+    sprintf(ctag,"UXI%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",1);
+    sprintf(ctag,"UXN%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",1);
+    sprintf(ctag,"UXO%1d",icham+1);
+    pMC->Gsatt(ctag,"SEEN",1);
+  }
   pMC->Gsatt("UT1I","SEEN",1);
-  pMC->Gsatt("UXI1","SEEN",1);
-  pMC->Gsatt("UXI2","SEEN",1);
-  pMC->Gsatt("UXI3","SEEN",1);
-  pMC->Gsatt("UXI4","SEEN",1);
-  pMC->Gsatt("UXI5","SEEN",1);
-  pMC->Gsatt("UXI6","SEEN",1);
+  pMC->Gsatt("UT1N","SEEN",1);
   pMC->Gsatt("UT1O","SEEN",1);
-  pMC->Gsatt("UXO1","SEEN",1);
-  pMC->Gsatt("UXO2","SEEN",1);
-  pMC->Gsatt("UXO3","SEEN",1);
-  pMC->Gsatt("UXO4","SEEN",1);
-  pMC->Gsatt("UXO5","SEEN",1);
-  pMC->Gsatt("UXO6","SEEN",1);
-  //
+
   pMC->Gdopt("hide", "on");
   pMC->Gdopt("shad", "on");
   pMC->Gsatt("*", "fill", 7);
@@ -396,7 +470,6 @@ void AliTRDv2::CreateMaterials()
   //
   // Create materials for the Transition Radiation Detector version 2
   //
-  printf("TRD: Slow simulation with fine geometry\n");
   AliTRD::CreateMaterials();
 }
 
@@ -406,21 +479,33 @@ void AliTRDv2::Init()
   //
   // Initialise Transition Radiation Detector after geometry has been built
   //
+
+  // First ionization potential (eV) for the gas mixture (90% Xe + 10% CO2)
+  const Float_t kPoti = 12.1;
+  // Maximum energy (50 keV);
+  const Float_t kEend = 50000.0;
+
   AliTRD::Init();
+
   AliMC* pMC = AliMC::GetMC();
-  fIdSenI1 = pMC->VolId("UXI1");
-  fIdSenI2 = pMC->VolId("UXI2");
-  fIdSenI3 = pMC->VolId("UXI3");
-  fIdSenI4 = pMC->VolId("UXI4");
-  fIdSenI5 = pMC->VolId("UXI5");
-  fIdSenI6 = pMC->VolId("UXI6");
-  
-  fIdSenO1 = pMC->VolId("UXO1");
-  fIdSenO2 = pMC->VolId("UXO2");
-  fIdSenO3 = pMC->VolId("UXO3");
-  fIdSenO4 = pMC->VolId("UXO4");
-  fIdSenO5 = pMC->VolId("UXO5");
-  fIdSenO6 = pMC->VolId("UXO6");
+
+  // Get the sensitive volumes
+  Char_t ctag[5];
+  for (Int_t icham = 0; icham < ncham; ++icham) {
+    sprintf(ctag,"UXI%1d",icham+1);
+    fIdSensI[icham] = pMC->VolId(ctag);
+    sprintf(ctag,"UXN%1d",icham+1);
+    fIdSensN[icham] = pMC->VolId(ctag);
+    sprintf(ctag,"UXO%1d",icham+1);
+    fIdSensO[icham] = pMC->VolId(ctag);
+  }
+
+  Float_t Poti = TMath::Log(kPoti);
+  Float_t Eend = TMath::Log(kEend);
+
+  // Ermilova distribution for the delta-ray spectrum
+  fDeltaE  = new TF1("deltae",Ermilova,Poti,Eend,0);
+
 }
 
 //_____________________________________________________________________________
@@ -429,133 +514,237 @@ void AliTRDv2::StepManager()
   //
   // Called at every step in the Transition Radiation Detector version 2
   //
-  Int_t          idSens, icSens;
+
+  Int_t          idSens, icSens, id;
   Int_t          iPla, iCha, iSec;
   Int_t          iOut;
   Int_t          vol[3]; 
   Int_t          iPid;
-  
-  const Float_t  kBig   = 1.0E+12;
-  
+
+  const Double_t kBig = 1.0E+12;
+
+  Float_t        hits[4];
+  Float_t        mom[4];
   Float_t        random[1];
   Float_t        charge;
-  Float_t        betaGamma, pp;
   Float_t        aMass;
-  Float_t        eLos, qTot;
-  Float_t        hits[4];
-  Float_t        mom[4];
-  Float_t        pTot;
-  
+
+  Double_t       pTot;
+  Double_t       qTot;
+  Double_t       eDelta;
+  Double_t       betaGamma, pp;
+
   TClonesArray  &lhits = *fHits;
-  
+
   AliMC* pMC = AliMC::GetMC();
-  
+
   // Ionization energy
-  // taken from: Ionization Measurements in High Energy Physics, Springer
-  const Double_t kWion    = 23.0E-9;
+  const Float_t kWion    = 22.04;
   // Maximum energy for e+ e- g for the step-size calculation
-  const Float_t  kPTotMax = 0.002;
+  const Float_t kPTotMax = 0.002;
   // Plateau value of the energy-loss for electron in xenon
   // taken from: Allison + Comb, Ann. Rev. Nucl. Sci. (1980), 30, 253
-  const Float_t  kPlateau = 1.70;
+  //const Double_t kPlateau = 1.70;
+  // the averaged value (26/3/99)
+  const Float_t kPlateau = 1.55;
   // dN1/dx|min for the gas mixture (90% Xe + 10% CO2)
-  // taken from: Ionization Measurements in High Energy Physics, Springer
-  const Float_t  kPrim    = 43.68;
-  
+  const Float_t kPrim    = 48.0;
+  // First ionization potential (eV) for the gas mixture (90% Xe + 10% CO2)
+  const Float_t kPoti    = 12.1;
+
   // Set the maximum step size to a very large number for all 
   // neutral particles and those outside the driftvolume
   pMC->SetMaxStep(kBig); 
-  
+
   // Use only charged tracks 
   if (( pMC->TrackCharge()   ) &&
       (!pMC->TrackStop()     ) && 
       (!pMC->TrackDisappear())) {
-    
+
     // Find the sensitive volume
     idSens = pMC->CurrentVol(0,icSens);
     iPla   = 0;
     iOut   = 0;
-    if      (idSens == fIdSenI1) iPla = 1; 
-    else if (idSens == fIdSenI2) iPla = 2;
-    else if (idSens == fIdSenI3) iPla = 3;
-    else if (idSens == fIdSenI4) iPla = 4;
-    else if (idSens == fIdSenI5) iPla = 5;
-    else if (idSens == fIdSenI6) iPla = 6;
-    else if (idSens == fIdSenO1) {
-      iPla = 1;
-      iOut = 1; }
-    else if (idSens == fIdSenO2) {
-      iPla = 2;
-      iOut = 1; }
-    else if (idSens == fIdSenO3) {
-      iPla = 3;
-      iOut = 1; }
-    else if (idSens == fIdSenO4) {
-      iPla = 4;
-      iOut = 1; }
-    else if (idSens == fIdSenO5) {
-      iPla = 5;
-      iOut = 1; }
-    else if (idSens == fIdSenO6) {
-      iPla = 6;
-      iOut = 1; }
-    
+    for (Int_t icham = 0; icham < ncham; ++icham) {
+      if (idSens == fIdSensI[icham]) {
+        iOut = 0;
+        iPla = icham + 1;
+      }
+      if (idSens == fIdSensN[icham]) {
+        iOut = 1;
+        iPla = icham + 1;
+      }
+      if (idSens == fIdSensO[icham]) {
+        iOut = 2;
+        iPla = icham + 1;
+      }
+    }
+
     // Inside a sensitive volume?
     if (iPla) {
-      
-      // Calculate the energy loss 
-      // ((1/E^2.0) distribution for the fluctuations)
-      pMC->Rndm(random,1);
-      eLos = Eloss(random[0]);
-      
-      // The amount of charge created
-      qTot = (Float_t) ((Int_t) (eLos / kWion) + 1);
-      
+
+      // Calculate the energy of the delta-electrons
+      eDelta = TMath::Exp(fDeltaE->GetRandom()) - kPoti;
+      eDelta = TMath::Max(eDelta,0.0);
+
+      // The number of secondary electrons created
+      qTot = (Double_t) ((Int_t) (eDelta / kWion) + 1);
+
       // The sector number
-      pMC->CurrentVolOff(5,0,iSec);
-      
+      id = pMC->CurrentVolOff(4,0,iSec);
+
       // The chamber number
-      pMC->CurrentVolOff(4,0,iCha);
-      if (iOut) 
-        iCha = (iCha - 1) * 3 + 1;
-      else      
-        iCha =  iCha + 1;
-      
+      //   1: outer left
+      //   2: neighbouring left
+      //   3: inner
+      //   4: neighbouring right
+      //   5: outer right
+      id = pMC->CurrentVolOff(2,0,iCha);
+      if (iCha == 1) 
+        iCha = 3 + iOut;
+      else
+        iCha = 3 - iOut;
+
       vol[0]  = iSec;
       vol[1]  = iCha;
       vol[2]  = iPla;
 
-      pMC->TrackPosition(hits);
-      hits[3] = qTot;
-      
-      // Add the hit
-      new(lhits[fNhits++]) AliTRDhit(fIshunt,gAlice->CurrentTrack(),vol,hits);
-      
-      pMC->TrackMomentum(mom);
-      pTot = mom[3];
+      // Check on selected volumes
+      Int_t addthishit = 1;
+      if (fSensSelect) {
+        if ((fSensPlane)   && (vol[2] != fSensPlane  )) addthishit = 0;
+        if ((fSensChamber) && (vol[1] != fSensChamber)) addthishit = 0;
+        if ((fSensSector)  && (vol[0] != fSensSector )) addthishit = 0;
+      }
+
+      if (addthishit) {
+
+        // Add this hit
+        pMC->TrackPosition(hits);
+        hits[3] = qTot;
+        new(lhits[fNhits++]) AliTRDhit(fIshunt,gAlice->CurrentTrack(),vol,hits);
+
+        // The energy loss according to Bethe Bloch
+        pMC->TrackMomentum(mom);
+        pTot = mom[3];
+        iPid = pMC->TrackPid();
+        if ( (iPid >  3) ||
+           ((iPid <= 3) && (pTot < kPTotMax))) {
+          aMass     = pMC->TrackMass();
+          betaGamma = pTot / aMass;
+          pp        = kPrim * BetheBloch(betaGamma);
+         // Take charge > 1 into account
+          charge = pMC->TrackCharge();
+          if (TMath::Abs(charge) > 1) pp = pp * charge*charge;
+        }
+        // Electrons above 20 Mev/c are at the plateau
+        else {
+          pp = kPrim * kPlateau;
+        }
       
-      // New step size for electrons only if momentum is small enough
-      iPid = pMC->TrackPid();
-      if ( (iPid >  3) ||
-          ((iPid <= 3) && (pTot < kPTotMax))) {
-        aMass     = pMC->TrackMass();
-        betaGamma = pTot / aMass;
-        pp        = kPrim * BetheBloch(betaGamma);
-       // Take charge > 1 into account
-        charge = pMC->TrackCharge();
-        if (TMath::Abs(charge) > 1) pp = pp * charge*charge;
+        // Calculate the maximum step size for the next tracking step
+        if (pp > 0) {
+          do 
+            pMC->Rndm(random,1);
+          while ((random[0] == 1.) || (random[0] == 0.));
+          pMC->SetMaxStep( - TMath::Log(random[0]) / pp);
+       }
+
       }
-      // Electrons above 20 Mev/c are at the plateau
       else {
-        pp = kPrim * kPlateau;
+        // set step size to maximal value
+        pMC->SetMaxStep(kBig); 
       }
-      
-      // Calculate the maximum step size for the next tracking step
-      do 
-        pMC->Rndm(random,1);
-      while ((random[0] == 1.) || (random[0] == 0.));
-      pMC->SetMaxStep( - TMath::Log(random[0]) / pp);
-      
+
     }
+
+  }
+
+}
+
+//_____________________________________________________________________________
+Double_t AliTRDv2::BetheBloch(Double_t bg) 
+{
+  //
+  // Parametrization of the Bethe-Bloch-curve
+  // The parametrization is the same as for the TPC and is taken from Lehrhaus.
+  //
+
+  // The parameters have been adjusted to Xe-data found in:
+  // Allison & Cobb, Ann. Rev. Nucl. Sci. (1980), 30, 253
+  //const Double_t kP1 = 0.76176E-1;
+  //const Double_t kP2 = 10.632;
+  //const Double_t kP3 = 3.17983E-6;
+  //const Double_t kP4 = 1.8631;
+  //const Double_t kP5 = 1.9479;
+
+  // This parameters have been adjusted to averaged values from GEANT
+  const Double_t kP1 = 7.17960e-02;
+  const Double_t kP2 = 8.54196;
+  const Double_t kP3 = 1.38065e-06;
+  const Double_t kP4 = 5.30972;
+  const Double_t kP5 = 2.83798;
+
+  if (bg > 0) {
+    Double_t yy = bg / TMath::Sqrt(1. + bg*bg);
+    Double_t aa = TMath::Power(yy,kP4);
+    Double_t bb = TMath::Power((1./bg),kP5);
+             bb = TMath::Log(kP3 + bb);
+    return ((kP2 - aa - bb)*kP1 / aa);
   }
+  else
+    return 0;
+
+}
+
+//_____________________________________________________________________________
+Double_t Ermilova(Double_t *x, Double_t *par)
+{
+  //
+  // Calculates the delta-ray energy distribution according to Ermilova
+  // Logarithmic scale !
+  //
+
+  Double_t energy;
+  Double_t dpos;
+  Double_t dnde;
+
+  Int_t    pos1, pos2;
+
+  const Int_t nV = 31;
+
+  Float_t vxe[nV] = { 2.3026, 2.9957, 3.4012, 3.6889, 3.9120  
+                    , 4.0943, 4.2485, 4.3820, 4.4998, 4.6052
+                    , 4.7005, 5.0752, 5.2983, 5.7038, 5.9915
+                    , 6.2146, 6.5221, 6.9078, 7.3132, 7.6009
+                    , 8.0064, 8.5172, 8.6995, 8.9872, 9.2103
+                    , 9.4727, 9.9035,10.3735,10.5966,10.8198
+                    ,11.5129 };
+
+  Float_t vye[nV] = { 80.0  , 31.0  , 23.3  , 21.1  , 21.0
+                    , 20.9  , 20.8  , 20.0  , 16.0  , 11.0
+                    ,  8.0  ,  6.0  ,  5.2  ,  4.6  ,  4.0
+                    ,  3.5  ,  3.0  ,  1.4  ,  0.67 ,  0.44
+                    ,  0.3  ,  0.18 ,  0.12 ,  0.08 ,  0.056
+                    ,  0.04 ,  0.023,  0.015,  0.011,  0.01
+                   ,  0.004 };
+
+  energy = x[0];
+
+  // Find the position 
+  pos1 = pos2 = 0;
+  dpos = 0;
+  do {
+    dpos = energy - vxe[pos2++];
+  } 
+  while (dpos > 0);
+  pos2--; 
+  if (pos2 > nV) pos2 = nV;
+  pos1 = pos2 - 1;
+
+  // Differentiate between the sampling points
+  dnde = (vye[pos1] - vye[pos2]) / (vxe[pos2] - vxe[pos1]);
+
+  return dnde;
+
 }