]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HMPID/AliHMPIDv3.cxx
When geometry is loaded, the call to MeanMaterialBudget will lead to AliFatal
[u/mrichter/AliRoot.git] / HMPID / AliHMPIDv3.cxx
index 125dc969c3b13424632ec20d750195dcbaa0d1e8..fd84ee67581b666c947d1f52599f87eab6bc4d77 100644 (file)
 #include <AliMC.h>              //StepManager()      
 #include <AliRun.h>             //CreateMaterials()    
 #include <AliMagF.h>            //CreateMaterials()
-#include <TGeoManager.h>        //CreateGeometry()
+#include "AliGeomManager.h"   //AddAlignableVolumes()
+#include <AliCDBEntry.h>        //CreateMaterials()
+#include <AliCDBManager.h>      //CreateMaterials()
 #include <TF1.h>                //DefineOpticalProperties()
 #include <TF2.h>                //DefineOpticalProperties()
-#include <TLorentzVector.h>     //IsLostByFresnel() 
-#include <AliCDBManager.h>      //CreateMaterials()
-#include <AliCDBEntry.h>        //CreateMaterials()
+#include <TGeoCompositeShape.h> //CradleBaseVolume()
+#include <TGeoGlobalMagField.h>
 #include <TGeoPhysicalNode.h>   //AddAlignableVolumes()
 #include <TGeoXtru.h>           //CradleBaseVolume()
-#include <TGeoCompositeShape.h> //CradleBaseVolume()
+#include <TLorentzVector.h>     //IsLostByFresnel() 
 #include <TString.h>            //StepManager()
+#include <TTree.h>
+
 ClassImp(AliHMPIDv3)    
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 void AliHMPIDv3::AddAlignableVolumes()const
@@ -47,6 +50,9 @@ void AliHMPIDv3::AddAlignableVolumes()const
 // Arguments: none
 //   Returns: none   
   
+  AliGeomManager::ELayerID idHMPID = AliGeomManager::kHMPID;
+  Int_t modUID, modnum = 0;
+
   TGeoHMatrix *pGm = new TGeoHMatrix;
   Double_t trans[3]={0.5*131.24,0.5*126.16,0};                            //translation from LORS to TGeo RS (half size AllX, half size allY,0)
   pGm->SetTranslation(trans);
@@ -54,26 +60,21 @@ void AliHMPIDv3::AddAlignableVolumes()const
   Double_t ph[7]={10.,10., 30.,30.,30. ,50.,50};
 
   for(Int_t iCh=AliHMPIDParam::kMinCh;iCh<=AliHMPIDParam::kMaxCh;iCh++) {
-      gGeoManager->SetAlignableEntry(Form("/HMPID/Chamber%i",iCh),Form("ALIC_1/Hmp%i_0",iCh));  //aligment without AliCluster3D
-      //Get Tracking To Local matrcies for alignment with AliCluster3D
-      TGeoPNEntry *eCh = gGeoManager->GetAlignableEntry(Form("/HMPID/Chamber%i",iCh));
-      if (eCh) {
-       const char *path = eCh->GetTitle();
-       if (!gGeoManager->cd(path)) {
-         AliFatal(Form("Volume path %s not valid!",path));
-       }
-      TGeoHMatrix *globMatrix = gGeoManager->GetCurrentMatrix();
-      //Double_t phi = 20.0 * ((iCh+1) / 3) + 10.0;
-      Double_t phi = ph[iCh];
-      TGeoHMatrix *t2l  = new TGeoHMatrix();
-      t2l->RotateZ(phi);
-      t2l->MultiplyLeft(&(globMatrix->Inverse()));
-      eCh->SetMatrix(t2l);
-    }//eCh
-    else {
-       AliError(Form("Alignable entry /HMPID/Chamber%i is not valid!",iCh));
-      }
-    }//iCh loop
+    modUID = AliGeomManager::LayerToVolUID(idHMPID,modnum++);
+    if(!gGeoManager->SetAlignableEntry(Form("/HMPID/Chamber%i",iCh),Form("ALIC_1/Hmp%i_0",iCh),modUID))
+           AliError("AliHMPIDv3::Unable to set alignable entry!!");  //aligment without AliCluster3D
+    //Get Tracking To Local matricies for alignment with AliCluster3D
+    TGeoPNEntry *eCh = gGeoManager->GetAlignableEntryByUID(modUID);
+    TGeoHMatrix *globMatrix = eCh->GetGlobalOrig();
+
+    //Double_t phi = 20.0 * ((iCh+1) / 3) + 10.0;
+    Double_t phi = ph[iCh];
+    TGeoHMatrix *t2l  = new TGeoHMatrix();
+    t2l->RotateZ(phi);
+    t2l->MultiplyLeft(&(globMatrix->Inverse()));
+    eCh->SetMatrix(t2l);
+  }//iCh loop
+  
 }
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 void AliHMPIDv3::CreateMaterials()
@@ -100,8 +101,8 @@ void AliHMPIDv3::CreateMaterials()
 
     Int_t   matId=0;                           //tmp material id number
     Int_t   unsens =  0, sens=1;               //sensitive or unsensitive medium
-    Int_t   itgfld = gAlice->Field()->Integ(); //type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
-    Float_t maxfld = gAlice->Field()->Max();   //max field value
+    Int_t   itgfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ(); //type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
+    Float_t maxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();   //max field value
     Float_t tmaxfd = -10.0;                    //max deflection angle due to magnetic field in one step
     Float_t deemax = - 0.2;                    //max fractional energy loss in one step   
     Float_t stemax = - 0.1;                    //max step allowed [cm]
@@ -132,13 +133,11 @@ void AliHMPIDv3::CreateMaterials()
     AliMaterial(++matId,"W"   ,aW   ,zW   ,dW   ,radW   ,absW   );  AliMedium(kW   ,"W"   , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
     AliMaterial(++matId,"Al"  ,aAl  ,zAl  ,dAl  ,radAl  ,absAl  );  AliMedium(kAl  ,"Al"  , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
     AliMaterial(++matId,"Ar"  ,aAr  ,zAr  ,dAr  ,radAr  ,absAr  );  AliMedium(kAr  ,"Ar"  , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
-
-    InitProperties();
         
 }//void AliHMPID::CreateMaterials()
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void AliHMPIDv3::InitProperties()
-{
+//void AliHMPIDv3::InitProperties()
+//{
 /*
 * HMPID
 * ====
@@ -156,7 +155,7 @@ HMPID  9  1.e-5 1.e-5 1.e-4  -1.   1.e-4 -1.   -1.    5.e-5 5.e-5 -1.  -1   -1
 HMPID  6  1.e-5 1.e-5 1.e-4  -1.   1.e-4 -1.   -1.    5.e-5 5.e-5 -1.  -1   -1   -1   -1   1    -1   1    -1   -1   -1   -1 
 * PCB backplane   (>  50 keV delta-electrons)
 HMPID 12  1.e-5 1.e-5 1.e-4  -1.   1.e-4 -1.   -1.    5.e-5 5.e-5 -1.  -1   -1   -1   -1   1    -1   1    -1   -1   -1   -1 
-*/
+
     Int_t *idtmed = fIdtmed->GetArray();
     Int_t imed;
     
@@ -237,7 +236,7 @@ HMPID 12  1.e-5 1.e-5 1.e-4  -1.   1.e-4 -1.   -1.    5.e-5 5.e-5 -1.  -1   -1
     gMC->Gstpar(idtmed[imed], "DRAY",1);    
     gMC->Gstpar(idtmed[imed], "LOSS",1);    
     
-}
+}*/
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 void AliHMPIDv3::CreateGeometry()
 {
@@ -336,8 +335,8 @@ TGeoVolume * AliHMPIDv3::CreateChamber(Int_t number)
 
 
   TGeoVolume *proxgap1 = gGeoManager->MakeBox("Hproxgap1",ch4,1407*mm/2 , 1366.00*mm/2 ,(9.-7.5)*mm/2.);//methane volume between quartz and fr4
-  TGeoVolume *proxgap2 = gGeoManager->MakeBox("Hproxgap2",ch4,1407*mm/2 , 1366.00*mm/2 ,(81.7-6.2-9.-7.5)*mm/2.);//methane volume between fr4 and Hgap
-
+  TGeoVolume *proxgap2 = gGeoManager->MakeBox("Hproxgap2",ch4,1407*mm/2 , 1366.00*mm/2 ,(81.7-6.2-34.-9.-7.5)*mm/2.);//methane volume between fr4 and Hgap(tot height(81.7) - Hsec (6.2)   - proxygap2 (34) - upper bound of fr4 (9+7.5))
+  
 
 // ^ Y   z=         z=-12mm      z=98.25mm               ALIC->7xHmp (virtual)-->1xHsbo (virtual) --->2xHcov (real) 2072P1
 // |  ____________________________________                                    |                   |-->1xHhon (real) 2072P1
@@ -394,11 +393,10 @@ TGeoVolume * AliHMPIDv3::CreateChamber(Int_t number)
                fr1->AddNode(fr1perUpBig,1,new TGeoTranslation(0.,-(1385-37-35)*mm/2.,(58.3*mm-20.00*2*mm-10.0*mm)/2.));
                fr1->AddNode(fr1perUpSma,1,new TGeoTranslation(-(1426-37-35)*mm/2.,0.,(58.3*mm-20.00*2*mm-10.0*mm)/2.));
                
-         fr1->AddNode(fr1perDowBig,0,new TGeoTranslation(0.,(1385-37-46)*mm/2.,(-58.3*mm+2.3*mm)/2.));
-               fr1->AddNode(fr1perDowSma,0,new TGeoTranslation((1426-37-46)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
-         fr1->AddNode(fr1perDowBig,1,new TGeoTranslation(0.,-(1385-37-46)*mm/2.,(-58.3*mm+2.3*mm)/2.));
-               fr1->AddNode(fr1perDowSma,1,new TGeoTranslation(-(1426-37-46)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
-               
+         fr1->AddNode(fr1perDowBig,0,new TGeoTranslation(0.,(1385-37)*mm/2.,(-58.3*mm+2.3*mm)/2.));
+               fr1->AddNode(fr1perDowSma,0,new TGeoTranslation((1426-37)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
+         fr1->AddNode(fr1perDowBig,1,new TGeoTranslation(0.,-(1385-37)*mm/2.,(-58.3*mm+2.3*mm)/2.));
+               fr1->AddNode(fr1perDowSma,1,new TGeoTranslation(-(1426-37)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));             
                        
          fr1->AddNode(ppf,4,new TGeoTranslation(-335*mm,433*mm,(-58.3+38.3)*mm/2.));  fr1->AddNode(ppf,5,new TGeoTranslation(335*mm,433*mm,(-58.3+38.3)*mm/2.));       
          fr1->AddNode(ppf,2,new TGeoTranslation(-335*mm,0.,(-58.3+38.3)*mm/2.));      fr1->AddNode(ppf,3,new TGeoTranslation(335*mm,0.,(-58.3+38.3)*mm/2.));
@@ -415,10 +413,11 @@ TGeoVolume * AliHMPIDv3::CreateChamber(Int_t number)
          TGeoVolume *busext   = gGeoManager->MakeTubs("Hbusext",csi,29*mm,30*mm,40*mm/2.,0.,180); //in Hext
          TGeoVolume *ext = new TGeoVolumeAssembly("Hext");
          
+         rect->AddNode(gassipl2,1,new TGeoTranslation(0.,0.,0));
+         
           for(Int_t hor=0; hor< 10; hor++){
             for(Int_t vert=0; vert < 8; vert++){
              cufoil->AddNode(rect,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 + vert*interdisty-425.*mm/2.,0.));
-            cufoil->AddNode(gassipl2,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 + vert*interdisty-425.*mm/2.,0.));
             fr1upcard->AddNode(gassipl3,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 + vert*interdisty-425.*mm/2.,0.));
             ext->AddNode(gassipl4,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 +
             vert*interdisty-425.*mm/2.,0));
@@ -442,7 +441,7 @@ TGeoVolume * AliHMPIDv3::CreateChamber(Int_t number)
 
        
  hmp->AddNode(proxgap1,0,new TGeoTranslation(0.,0.,(9.-7.5)*mm/2.));//due to the TGeoVolumeAssembly definition the ch4 volume must be inserted around the collecting wires             
- hmp->AddNode(proxgap2,0,new TGeoTranslation(0.,0.,(9+7.5)*mm + (81.7-6.2-9.-7.5)*mm/2.));             
+ hmp->AddNode(proxgap2,0,new TGeoTranslation(0.,0.,(9+7.5 +34)*mm + (81.7-6.2-34.-9.-7.5)*mm/2.));// tot height(81.7) - Hsec - proxygap2 - top edge fr4 at (9+7.5) mm                  
                
 // ^ Y  single cell                                                5.5mm CH4 = 1*mm CsI + 4.45*mm CsI x cath +0.05*mm safety margin         
 // |      ______________________________           
@@ -493,7 +492,8 @@ TGeoVolume * AliHMPIDv3::CreateChamber(Int_t number)
   ppf->AddNode(smo,7,new TGeoTranslation(+ 65.0*mm,+151.875*mm,  0.*mm)); 
   
 
-hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(80.-29.)*mm-34.*mm/2));
+//hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(81.7-29.)*mm-34.*mm/2));
+ hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(9.+7.5)*mm+34.*mm/2));
          fr3->AddNode( fr3up,1,    new TGeoTranslation(0.,  0.,  7*mm));
         fr3->AddNode(fr3down,1,new TGeoTranslation(0.,  0., -10*mm));  
 
@@ -508,16 +508,18 @@ void AliHMPIDv3::Init()
 // Arguments: none
 //   Returns: none      
   AliDebug(1,"Start v2 HMPID.");    
-  fIdPad     = gMC->VolId("Hpad");
-  fIdCell    = gMC->VolId("Hcel");
+  //InitProperties();
   AliDebug(1,"Stop v2 HMPID.");    
 }
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 void AliHMPIDv3::DefineOpticalProperties() 
 {
+  AliDebug(1,"");    
+
 // Optical properties definition.
-  const Int_t kNbins=30;       //number of photon energy points
-  Float_t emin=5.5,emax=8.5;         //Photon energy range,[eV]
+  const Int_t kNbins=30;                 //number of photon energy points
+  Float_t emin=5.5,emax=8.5;             //Photon energy range,[eV]
+  Float_t deltaE = (emax - emin)/kNbins;
   Float_t aEckov [kNbins]; 
   Double_t dEckov [kNbins]; 
   Float_t aAbsRad[kNbins], aAbsWin[kNbins], aAbsGap[kNbins], aAbsMet[kNbins];
@@ -540,7 +542,7 @@ void AliHMPIDv3::DefineOpticalProperties()
   Bool_t isFlatIdx=title.Contains("FlatIdx"); 
   
   for(Int_t i=0;i<kNbins;i++){
-    Float_t eV=emin+0.1*i;  //Ckov energy in eV
+    Float_t eV=emin+deltaE*i;  //Ckov energy in eV
     aEckov [i] =1e-9*eV;    //Ckov energy in GeV
     dEckov [i] = aEckov[i];
     aAbsRad[i]=pRaAF->Eval(eV); (isFlatIdx)? aIdxRad[i]=1.292: aIdxRad[i]=pRaIF->Eval(eV,20);     
@@ -549,7 +551,7 @@ void AliHMPIDv3::DefineOpticalProperties()
     aQeAll[i] =1;                     //QE for all other materials except for PC must be 1.  
     aAbsMet[i] =0.0001;                aIdxMet[i]=0;                                             //metal ref idx must be 0 in order to reflect photon
                                        aIdxPc [i]=1;           aQePc [i]=pQeF->Eval(eV);         //PC ref idx must be 1 in order to apply photon to QE conversion 
-    dQePc [i]=pQeF->Eval(eV);
+    dQePc [i]= pQeF->Eval(eV);
     dReflMet[i] = 0.;     // no reflection on the surface of the pc (?)                                       
   }
   gMC->SetCerenkov((*fIdtmed)[kC6F14]    , kNbins, aEckov, aAbsRad  , aQeAll , aIdxRad );    
@@ -561,10 +563,11 @@ void AliHMPIDv3::DefineOpticalProperties()
   gMC->SetCerenkov((*fIdtmed)[kAl]       , kNbins, aEckov, aAbsMet  , aQeAll , aIdxMet );    
 
   // Define a skin surface for the photocatode to enable 'detection' in G4
-  gMC->DefineOpSurface("surfPc", kGlisur /*kUnified*/,kDielectric_metal,kPolished, 0.);
-  gMC->SetMaterialProperty("surfPc", "EFFICIENCY", kNbins, dEckov, dQePc);
-  gMC->SetMaterialProperty("surfPc", "REFLECTIVITY", kNbins, dEckov, dReflMet);
-  gMC->SetSkinSurface("skinPc", "Rpc", "surfPc");
+  for(Int_t i=0; i<7; i++){
+  gMC->DefineOpSurface(Form("surfPc%i",i), kGlisur /*kUnified*/,kDielectric_metal,kPolished, 0.);
+  gMC->SetMaterialProperty(Form("surfPc%i",i), "EFFICIENCY", kNbins, dEckov, dQePc);
+  gMC->SetMaterialProperty(Form("surfPc%i",i), "REFLECTIVITY", kNbins, dEckov, dReflMet);
+  gMC->SetSkinSurface(Form("skinPc%i",i), Form("Hpad%i",i),Form("surfPc%i",i)); }
 
   delete pRaAF;delete pWiAF;delete pGaAF; delete pRaIF; delete pWiIF; delete pGaIF; delete pQeF;
 }
@@ -603,7 +606,7 @@ void AliHMPIDv3::GenFee(Float_t qtot)
     gMC->GetRandom()->RndmArray(2,ranf);    //Sample direction
     cthf=ranf[0]*2-1.0;
     if(cthf<0) continue;
-    sthf = TMath::Sqrt((1 - cthf) * (1 + cthf));
+    sthf = TMath::Sqrt((1. - cthf) * (1. + cthf));
     phif = ranf[1] * 2 * TMath::Pi();
     
     if(Double_t randomNumber=gMC->GetRandom()->Rndm()<=0.57)
@@ -743,7 +746,7 @@ Float_t AliHMPIDv3::Fresnel(Float_t ene,Float_t pdoti, Bool_t pola)
     //FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
     //W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
 
-    Float_t sinin=TMath::Sqrt(1-pdoti*pdoti);
+    Float_t sinin=TMath::Sqrt((1.-pdoti)*(1.+pdoti));
     Float_t tanin=sinin/pdoti;
 
     Float_t c1=cn*cn-ck*ck-sinin*sinin;
@@ -831,12 +834,13 @@ void AliHMPIDv3::StepHistory()
   }
 
   TString flag="fanny combination";
-  if(gMC->IsTrackAlive())
-      if(gMC->IsTrackEntering())      flag="enters to";
-      else if(gMC->IsTrackExiting())  flag="exits from";
-      else if(gMC->IsTrackInside())   flag="inside";
-  else
-      if(gMC->IsTrackStop())          flag="stoped in";        
+  if(gMC->IsTrackAlive()) {
+    if(gMC->IsTrackEntering())      flag="enters to";
+    else if(gMC->IsTrackExiting())  flag="exits from";
+    else if(gMC->IsTrackInside())   flag="inside";
+  } else {
+    if(gMC->IsTrackStop())          flag="stopped in";
+  }
   
   Int_t vid=0,copy=0;
   TString path=gMC->CurrentVolName(); path.Prepend("-");path.Prepend(gMC->CurrentVolOffName(1));//current volume and his mother are always there
@@ -890,9 +894,10 @@ void AliHMPIDv3::StepManager()
       Int_t   pid=     gMC->TrackPid();                                                          //take PID
       Float_t etot=    gMC->Etot();                                                              //total hpoton energy, [GeV] 
       Double_t x[3];   gMC->TrackPosition(x[0],x[1],x[2]);                                       //take MARS position at entrance to PC
-    TString tmpname = volname; tmpname.Remove(0,4); Int_t idch = tmpname.Atoi();                 //retrieve the chamber number
-    Float_t xl,yl;   AliHMPIDParam::Instance()->Mars2Lors(idch,x,xl,yl);                         //take LORS position 
-      new((*fHits)[fNhits++])AliHMPIDHit(idch,etot,pid,tid,xl,yl,x);                             //HIT for photon, position at P, etot will be set to Q
+      Float_t hitTime= (Float_t)gMC->TrackTime();                                                //hit formation time       
+      TString tmpname = volname; tmpname.Remove(0,4); Int_t idch = tmpname.Atoi();               //retrieve the chamber number
+      Float_t xl,yl;   AliHMPIDParam::Instance()->Mars2Lors(idch,x,xl,yl);                       //take LORS position 
+      new((*fHits)[fNhits++])AliHMPIDHit(idch,etot,pid,tid,xl,yl,hitTime,x);                             //HIT for photon, position at P, etot will be set to Q
       if(fDoFeed) GenFee(etot);                                                                  //generate feedback photons etot is modified in hit ctor to Q of hit
     }//photon hit PC and DE >0 
   }//photon hit PC
@@ -915,13 +920,16 @@ void AliHMPIDv3::StepManager()
       Int_t tid=          gMC->GetStack()->GetCurrentTrackNumber();                               //take TID
       Int_t pid=          gMC->TrackPid();                                                        //take PID
       Double_t out[3];    gMC->TrackPosition(out[0],out[1],out[2]);                               //take MARS position at exit
+      Float_t hitTime= (Float_t)gMC->TrackTime();                                                         //hit formation time       
       out[0]=0.5*(out[0]+in[0]);                                                                  //
       out[1]=0.5*(out[1]+in[1]);                                                                  //take hit position at the anod plane
       out[2]=0.5*(out[2]+in[2]);
       TString tmpname = volname;  tmpname.Remove(0,4);  Int_t idch = tmpname.Atoi();              //retrieve the chamber number
       Float_t xl,yl;AliHMPIDParam::Instance()->Mars2Lors(idch,out,xl,yl);                         //take LORS position
-      new((*fHits)[fNhits++])AliHMPIDHit(idch,eloss,pid,tid,xl,yl,out);                           //HIT for MIP, position near anod plane, eloss will be set to Q 
-      if(fDoFeed) GenFee(eloss);                                                                  //generate feedback photons 
+      if(eloss>0) {
+        new((*fHits)[fNhits++])AliHMPIDHit(idch,eloss,pid,tid,xl,yl,hitTime,out);                           //HIT for MIP, position near anod plane, eloss will be set to Q 
+        if(fDoFeed) GenFee(eloss);                                                                  //generate feedback photons 
+      }
     }else                                                                                         //just going inside
       eloss          += gMC->Edep();                                                              //collect this step eloss 
   }//MIP in GAP
@@ -1012,7 +1020,8 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   TGeoMedium *med   =gGeoManager->GetMedium("HMPID_Al");  
   TGeoVolume *cradle=new TGeoVolumeAssembly("Hcradle");
   
-  Double_t baselong[7]={6037*mm-2*60*mm, 6037*mm-2*60*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
+  //Double_t baselong[7]={6037*mm-2*60*mm, 6037*mm-2*60*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
+  Double_t baselong[7]={6037*mm-2*100*mm, 6037*mm-2*100*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
   TGeoVolume *lbase = CradleBaseVolume(med,baselong,"cradleLbase");
   lbase->SetLineColor(kGray);
 
@@ -1025,7 +1034,7 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   Double_t height = 30.*mm; //30 = 2*(1488/2-729) (2CRE2112P3)
   Double_t tubeheight = 50.*mm; Double_t heightred = 5.*mm; Double_t zred = 5.*mm;
   Double_t oneshift = tubeheight/TMath::Tan(TMath::DegToRad()*20.)+(1458.-35)*mm/2 - (1607-35)*mm/2;
-  Double_t linclined[7] = {1458.*mm-params[6],1607.*mm-params[6],tubeheight,oneshift, height ,heightred,zred}; //3.5 is for not correct measurements in 2CRE2112P3<=> 597!=inclined*sin(20) 
+  Double_t linclined[7] = {1458.*mm-params[6]-0.5,1607.*mm-params[6]-0.5,tubeheight,oneshift, height ,heightred,zred}; //3.5 is for not correct measurements in 2CRE2112P3<=> 597!=inclined*sin(20) 
   TGeoVolume *inclin = CradleBaseVolume(med,linclined,"inclinedbar");
   inclin->SetLineColor(kGray);
   Double_t lhorizontal[7] = {1641.36*mm+params[7],1659.*mm+params[7],tubeheight,0, height ,heightred,zred};
@@ -1033,18 +1042,18 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   horiz->SetLineColor(kGray);
   
   //inner bars, they are named as the numbering in 2CRE2112P3
-  Double_t fourshift = tubeheight/TMath::Tan(TMath::DegToRad()*55.);
-  Double_t lfour[7] = {594*mm,594*mm,tubeheight,fourshift,height,heightred,zred};  
+  Double_t fourshift = tubeheight/TMath::Tan(TMath::DegToRad()*55.);  
+  Double_t lfour[7] = {592*mm,592*mm,tubeheight,fourshift,height,heightred,zred};  
   TGeoVolume *four = CradleBaseVolume(med,lfour,"bar4");
   four->SetLineColor(kGray);
 
   Double_t fiveshift = tubeheight/TMath::Tan(TMath::DegToRad()*75);
-  Double_t lfive[7] = {503.7*mm,503.7*mm,tubeheight,fiveshift,height,heightred,zred};  
+  Double_t lfive[7] = {500.*mm,500.*mm,tubeheight,fiveshift,height,heightred,zred};  
   TGeoVolume *five = CradleBaseVolume(med,lfive,"bar5");
   five->SetLineColor(kGray);
   
-  Double_t sixshift = tubeheight/TMath::Tan(TMath::DegToRad()*55)+459*mm/2-480*mm/2;
-  Double_t lsix[7] = {459*mm,480*mm,tubeheight,sixshift,height,heightred,zred};  
+  Double_t sixshift = tubeheight/TMath::Tan(TMath::DegToRad()*55)+459*mm/2-480*mm/2;  
+  Double_t lsix[7] = {456*mm,477*mm,tubeheight,sixshift,height,heightred,zred};  
   TGeoVolume *six = CradleBaseVolume(med,lsix,"bar6");
   six->SetLineColor(kGray);
   
@@ -1059,7 +1068,7 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   eight->SetLineColor(kGray);
 
   Double_t nineshift = -tubeheight/TMath::Tan(TMath::DegToRad()*71)+83.*mm/2-66.*mm/2;
-  Double_t lnine[7] = {66.*mm,83.*mm,tubeheight,nineshift,height,heightred,zred};  
+  Double_t lnine[7] = {59.5*mm,76.5*mm,tubeheight,nineshift,height,heightred,zred};  
   TGeoVolume *nine = CradleBaseVolume(med,lnine,"bar9");
   nine->SetLineColor(kGray);
 
@@ -1069,32 +1078,35 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   ten->SetLineColor(kGray);
   
   Double_t elevenshift = (-tubeheight/TMath::Tan(TMath::DegToRad()*70) -338.*mm/2+315.*mm/2);
-  Double_t leleven[7] = {315.*mm,338.*mm,tubeheight,elevenshift,height,heightred,zred};  
+  Double_t leleven[7] = {308.*mm,331.*mm,tubeheight,elevenshift,height,heightred,zred};  
   TGeoVolume *eleven = CradleBaseVolume(med,leleven,"bar11");
   eleven->SetLineColor(kGray);
     
   Double_t twelveshift = (-tubeheight/TMath::Tan(TMath::DegToRad()*60) -538.*mm/2+508.*mm/2);
-  Double_t ltwelve[7] = {508.*mm,538.*mm,tubeheight,twelveshift,height,heightred,zred};  
+  Double_t ltwelve[7] = {507.*mm,537.*mm,tubeheight,twelveshift,height,heightred,zred};  
   TGeoVolume *twelve = CradleBaseVolume(med,ltwelve,"bar12");
   twelve->SetLineColor(kGray);
 
-  Double_t thirteenshift = tubeheight/TMath::Tan(TMath::DegToRad()*43);
-  Double_t lthirteen[7] = {712.5*mm,712.5*mm,tubeheight,thirteenshift,height,heightred,zred};  
+  Double_t thirteenshift = tubeheight/TMath::Tan(TMath::DegToRad()*43); 
+  Double_t lthirteen[7] = {708.*mm,708.*mm,tubeheight,thirteenshift,height,heightred,zred};  
   TGeoVolume *thirteen = CradleBaseVolume(med,lthirteen,"bar13");
   thirteen->SetLineColor(kGray); 
   
   
   //vertical rectangles
-   TGeoVolume *vbox=gGeoManager->MakeBox ("Hvbox",med  , 1488*mm/2 , 487.*mm/2 , 50.*mm/2);
+   TGeoVolume *vbox= new TGeoVolumeAssembly("Hvbox");
    vbox->SetLineColor(kViolet);
    Double_t width = 50.*mm;
+   
+   TGeoVolume *vboxlast= new TGeoVolumeAssembly("Hvboxlast");//vertical structure on the short base
+   vboxlast->SetLineColor(kViolet);
   
   Double_t barheight = 100.*mm; 
   Double_t lAfourteen[7] = {1488.*mm,1488.*mm,barheight,0,width,heightred,zred};  
   TGeoVolume *afourteen = CradleBaseVolume(med,lAfourteen,"bar14top");
   afourteen->SetLineColor(kGray); 
  
-  Double_t lBfourteen[7] = {382.*mm,382.*mm,barheight,0,width,heightred,zred};  
+  Double_t lBfourteen[7] = {387*mm,387.*mm,barheight,0,width,heightred,zred};  
   TGeoVolume *bfourteen = CradleBaseVolume(med,lBfourteen,"bar14vert");
   bfourteen->SetLineColor(kGray);
    
@@ -1102,27 +1114,38 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   TGeoVolume *cfourteen = CradleBaseVolume(med,lCfourteen,"bar14bot");
   cfourteen->SetLineColor(kGray);
 
-  Double_t oblshift = 50.*mm/ TMath::Tan(TMath::DegToRad()*35);
-  Double_t lDfourteen[7] = {610.*mm,610.*mm,50.*mm,oblshift,width,heightred,zred};  
+  Double_t oblshift = 50.*mm/ TMath::Tan(TMath::DegToRad()*35); 
+  Double_t lDfourteen[7] = {603.*mm,603.*mm,50.*mm,oblshift,width,heightred,zred}; 
   TGeoVolume *dfourteen = CradleBaseVolume(med,lDfourteen,"bar14incl");
   dfourteen->SetLineColor(kGray);
   
+  
+  Double_t lDfourteenlast[7] = {667.*mm,667.*mm,50.*mm,oblshift,width,heightred,zred};  
+  TGeoVolume *dfourteenlast = CradleBaseVolume(med,lDfourteenlast,"bar14incllast");
+  dfourteenlast->SetLineColor(kGray);
+  
   vbox->AddNode(afourteen,1,new TGeoTranslation(0.,487.*mm/2 -100.*mm/2,0.));
   TGeoRotation *vinrot = new TGeoRotation("vertbar"); vinrot->RotateZ(90);
   vbox->AddNode(bfourteen,1,new TGeoCombiTrans(1488*mm/2-100.*mm/2,-100.*mm/2,0.,vinrot));
   vbox->AddNode(bfourteen,2,new TGeoCombiTrans(-1488*mm/2+100.*mm/2,-100.*mm/2,0.,vinrot)); 
   TGeoRotation *rotboxbar = new TGeoRotation("rotboxbar"); rotboxbar->RotateZ(-35);
   TGeoRotation *arotboxbar = new TGeoRotation("arotboxbar"); arotboxbar->RotateZ(-35); arotboxbar->RotateY(180);
-   vbox->AddNode(dfourteen,1,new TGeoCombiTrans(-1488*mm/4,-1,0.,rotboxbar)); 
-   vbox->AddNode(dfourteen,2,new TGeoCombiTrans(+1488*mm/4,-1,0.,arotboxbar));
+  vbox->AddNode(dfourteen,1,new TGeoCombiTrans(-1488*mm/4,-1,0.4,rotboxbar)); 
+  vbox->AddNode(dfourteen,2,new TGeoCombiTrans(+1488*mm/4,-1,0.4,arotboxbar));
+ //vertical box on the short base of the cradle  
+  vboxlast->AddNode(afourteen,1,new TGeoTranslation(0.,487.*mm/2 -100.*mm/2,0.));
+  vboxlast->AddNode(bfourteen,1,new TGeoCombiTrans(1488*mm/2-100.*mm/2,-100.*mm/2,0.,vinrot));
+  vboxlast->AddNode(bfourteen,2,new TGeoCombiTrans(-1488*mm/2+100.*mm/2,-100.*mm/2,0.,vinrot)); 
+  vboxlast->AddNode(dfourteenlast,1,new TGeoCombiTrans(-1488*mm/4+1.7,-3.,0.,rotboxbar)); 
+  vboxlast->AddNode(dfourteenlast,2,new TGeoCombiTrans(+1488*mm/4-1.7,-3.,0.,arotboxbar));
    
 
   //POSITIONING IN THE VIRTUAL VOLUME "cradle" 
   
   //long base
   TGeoRotation *rotl=new TGeoRotation("Clongbase"); rotl->RotateX(90);  
-  cradle->AddNode(lbase,1,new TGeoCombiTrans (   0*mm,   (1488-100)*mm/2, -(597-60)*mm/2,rotl)); 
-  cradle->AddNode(lbase,2,new TGeoCombiTrans (   0*mm,   -(1488-100)*mm/2, -(597-60)*mm/2,rotl)); 
+  cradle->AddNode(lbase,0,new TGeoCombiTrans (   0*mm,   (1488-100)*mm/2, -(597-60)*mm/2,rotl)); 
+  cradle->AddNode(lbase,1,new TGeoCombiTrans (   0*mm,   -(1488-100)*mm/2, -(597-60)*mm/2,rotl)); 
   //short base
   TGeoRotation *rots=new TGeoRotation("Cshortbase"); rots->RotateX(90); rots->RotateZ(90);
   cradle->AddNode(sbase,1,new TGeoCombiTrans ((6037-100)*mm/2, 0.,-(597-60)*mm/2,rots));
@@ -1136,13 +1159,13 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   Double_t dx =(1607-35)*mm*TMath::Cos(TMath::DegToRad()*20)/2-tubeheight/2*TMath::Sin(TMath::DegToRad()*20)+params[5];
   
   
-  cradle->AddNode(inclin,1,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,729*mm,params[0],rot1));
+  cradle->AddNode(inclin,1,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,729*mm,params[0]+0.4,rot1));//+0.7 added
   cradle->AddNode(horiz,1,new TGeoCombiTrans( origintrapstructure,729*mm, 597*mm/2 - tubeheight/2,rot2));//correctly positioned
   TGeoRotation *rot1mirror=new TGeoRotation("inclmirrot"); rot1mirror->RotateX(90); rot1mirror->RotateY(200); rot1mirror->RotateZ(180);
-  cradle->AddNode(inclin,2,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,729*mm,params[0],rot1mirror));
-  cradle->AddNode(inclin,3,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,-729*mm,params[0],rot1));
+  cradle->AddNode(inclin,2,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,729*mm,params[0]+0.4,rot1mirror));//+0.7 added
+  cradle->AddNode(inclin,3,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,-729*mm,params[0]+0.4,rot1));//0.7 added
   cradle->AddNode(horiz,2,new TGeoCombiTrans( origintrapstructure,-729*mm, 597*mm/2 - tubeheight/2,rot2));//correctly positioned
-  cradle->AddNode(inclin,4,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,-729*mm,params[0],rot1mirror));
+  cradle->AddNode(inclin,4,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,-729*mm,params[0]+0.4,rot1mirror));//0.7 added
   
   //inner pieces on one side
   TGeoRotation *rot4=new TGeoRotation("4rot"); rot4->RotateX(-90); rot4->RotateY(-55); rot4->RotateZ(180);
@@ -1175,18 +1198,17 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
   TGeoRotation *rot9a=new TGeoRotation("9arot"); rot9a->RotateX(-90); rot9a->RotateY(-90); rot9a->RotateZ(180);
   cradle->AddNode(nine,1,new TGeoCombiTrans(origintrapstructure+1960*mm+2.5+3.,-729.*mm,-20.,rot9));
   cradle->AddNode(nine,2,new TGeoCombiTrans(origintrapstructure-1960*mm-2.5-3.,-729.*mm,-20.,rot9a));
  //inner pieces on the other side  
   TGeoRotation *rot10=new TGeoRotation("10rot"); rot10->RotateX(-90); rot10->RotateY(-120);
   TGeoRotation *rot10a=new TGeoRotation("10arot"); rot10a->RotateX(-90); rot10a->RotateY(-120); rot10a->RotateZ(180);
 
- cradle->AddNode(ten,1,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-2,+729.*mm,-13.,rot10));
- cradle->AddNode(ten,2,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+2,+729.*mm,-13.,rot10a));
 cradle->AddNode(ten,1,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-2,+729.*mm,-13.,rot10));
 cradle->AddNode(ten,2,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+2,+729.*mm,-13.,rot10a));
  
   TGeoRotation *rot11=new TGeoRotation("11rot"); rot11->RotateX(-90); rot11->RotateY(50);
   TGeoRotation *rot11a=new TGeoRotation("11arot"); rot11a->RotateX(-90); rot11a->RotateY(50); rot11a->RotateZ(180);
-  cradle->AddNode(eleven,1,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+352.*mm,+729.*mm,-12.5,rot11));
-  cradle->AddNode(eleven,2,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-352.*mm,+729.*mm,-12.5,rot11a));
+  cradle->AddNode(eleven,1,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+352.*mm,+729.*mm,-12.7,rot11));
+  cradle->AddNode(eleven,2,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-352.*mm,+729.*mm,-12.7,rot11a));
  
   TGeoRotation *rot12=new TGeoRotation("12rot"); rot12->RotateX(-90); rot12->RotateY(-120);
   TGeoRotation *rot12a=new TGeoRotation("12arot"); rot12a->RotateX(-90); rot12a->RotateY(-120); rot12a->RotateZ(180);
@@ -1201,8 +1223,7 @@ TGeoVolume* AliHMPIDv3::CreateCradle()
 
 //vertical structures
   TGeoRotation *vrot = new TGeoRotation("vertbox"); vrot->RotateX(90); vrot->RotateZ(90);
-  cradle->AddNode(vbox,1,new TGeoCombiTrans(-6037*mm/2+50.*mm/2,0.,0.5,vrot));
-  cradle->AddNode(cfourteen,1,new TGeoCombiTrans(-6037*mm/2+50.*mm/2,0.,-477.*mm/2 -20.*mm/2,vrot));
+  cradle->AddNode(vboxlast,1,new TGeoCombiTrans(-6037*mm/2+50.*mm/2,0.,0.5,vrot));//vertial box on the short cradle base
   
   cradle->AddNode(vbox,2,new TGeoCombiTrans(-6037*mm/2+50.*mm/2+990.*mm,0.,0.5,vrot));
   cradle->AddNode(cfourteen,2,new TGeoCombiTrans(-6037*mm/2+50.*mm/2+990.*mm,0.,-477.*mm/2 -20.*mm/2,vrot));
@@ -1217,7 +1238,7 @@ return cradle;
 }//CreateCradle()
 
 
-TGeoVolume * AliHMPIDv3::CradleBaseVolume(TGeoMedium *med, Double_t l[7],char *name)
+TGeoVolume * AliHMPIDv3::CradleBaseVolume(TGeoMedium *med, Double_t l[7],const char *name)
 {
 /*
 The trapezoid is build in the xy plane
@@ -1248,20 +1269,16 @@ The trapezoid is build in the xy plane
   xv[1] =  l[0]/2 + l[3];   yv[1] =  l[2]/2;
   xv[2] =  l[1]/2; yv[2] = -l[2]/2;
   xv[3] = -l[1]/2; yv[3] = -l[2]/2;
-  Double_t ang1 = 90, ang2 = 90;
-   if(xv[0]-xv[3]!=0) ang1 = TMath::RadToDeg()*TMath::ATan((yv[0]-yv[3])/(xv[0]-xv[3]));
-   if(xv[1]-xv[2]!=0) ang2 = TMath::RadToDeg()*TMath::ATan((yv[1]-yv[2])/(xv[1]-xv[2]));
-  AliDebug(1,Form("name %s     x0 - x2 = %f  angoli alla base maggiore: %f  %f",xtruIn->GetName(),xv[0] - xv[2],ang1,ang2));
   
   xtruOut->DefinePolygon(4, xv, yv);
-  xtruOut->DefineSection(0, -l[4]/2., 0., 0., 1.0);//0=  I piano z; (0.,0.) = spostamento rispetto al centro; 1.=fattore di scala della forma 
-  xtruOut->DefineSection(1,  +l[4]/2., 0., 0., 1.0);//1= II piano z;
+  xtruOut->DefineSection(0, -l[4]/2., 0., 0., 1.0);//0=  I plane z; (0.,0.) = shift wrt centre; 1.= shape scale factor 
+  xtruOut->DefineSection(1, +l[4]/2., 0., 0., 1.0);//1= II plane z;
   
   Double_t tgalpha = 0;
-   if(xv[3]-xv[0] == 0 ) tgalpha = 9999999999
+   if(xv[3]-xv[0] == 0 ) tgalpha = 999999; 
    else tgalpha =  l[2]/TMath::Abs(xv[3]-xv[0]);
   Double_t tgbeta = 0;
-  if(xv[2]-xv[1]==0) tgbeta = 9999999999;
+  if(xv[2]-xv[1]==0) tgbeta = 999999;
   else tgbeta = l[2]/TMath::Abs(xv[2]-xv[1]);
   
   xv[0] = xv[0]-l[5]/tgalpha; yv[0] =  l[2]/2 - l[5];