]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOS.cxx
Introducing Raw data format (T. Kuhr)
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.cxx
index 8ba14011401b8a13150adc9a29790ea4ba9e19e2..e49219de24021d4f6f936e39939b47b9f41a43b7 100644 (file)
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
+/* $Id$ */
+
+//_________________________________________________________________________
+// Base Class for PHOS description:
+//   PHOS consists of a PbWO4 calorimeter (EMCA) and a gazeous charged 
+//    particles detector (CPV or PPSD).
+//   The only provided method here is CreateMaterials, 
+//    which defines the materials common to all PHOS versions.   
+// 
+//*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) 
+//////////////////////////////////////////////////////////////////////////////
 
-/*
-$Log$
-Revision 1.9  1999/11/08 07:12:31  fca
-Minor corrections thanks to I.Hrivnacova
-
-Revision 1.8  1999/09/29 09:24:23  fca
-Introduction of the Copyright and cvs Log
-
-*/
 
-////////////////////////////////////////////////
-//  Manager and hits classes for set:PHOS     //
-////////////////////////////////////////////////
 // --- ROOT system ---
-#include "TH1.h"
-#include "TRandom.h"
-#include "TFile.h"
-#include "TTree.h"
-#include "TBRIK.h"
-#include "TNode.h"
-#include "TMath.h"
+class TFile;
+#include <TFolder.h> 
+#include <TTree.h>
+#include <TVirtualMC.h> 
 
 // --- Standard library ---
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <iostream.h>
 
-// --- galice header files ---
+// --- AliRoot header files ---
+#include "AliMagF.h"
 #include "AliPHOS.h"
+#include "AliPHOSLoader.h"
 #include "AliRun.h"
-
-//______________________________________________________________________________
-
+#include "AliPHOSDigitizer.h"
+#include "AliPHOSSDigitizer.h"
+#include "AliPHOSDigit.h"
+#include "AliAltroBuffer.h"
 
 ClassImp(AliPHOS)
-
-//______________________________________________________________________________
-
-AliPHOS::~AliPHOS(void)
-{
-  delete fHits;                        // 28.12.1998
-  delete fTreePHOS;            // 28.12.1998
-  fCradles->Delete();
-  delete fCradles;
-}
-
-//______________________________________________________________________________
-
-AliPHOS::AliPHOS() :
-         fDebugLevel            (0),
-         fTreePHOS              (NULL),
-         fBranchNameOfCradles   ("AliPHOSCradles"),
-         fTreeName              ("PHOS")
-{
-   fIshunt   = 0;
-
-  if( NULL==(fCradles=new TObjArray) )
-  {
-    Error("AliPHOS","Can not create fCradles");
-    exit(1);
-  }
-  DefPars();
-}
-//______________________________________________________________________________
-
-AliPHOS::AliPHOS(const char *name, const char *title)
-       : AliDetector            (name,title),
-         fDebugLevel            (0),
-         fTreePHOS              (NULL),
-         fBranchNameOfCradles   ("AliPHOSCradles"),
-         fTreeName              ("PHOS")
+//____________________________________________________________________________
+AliPHOS:: AliPHOS() : AliDetector()
 {
-//Begin_Html
-/*
-<img src="picts/aliphos.gif">
-*/
-//End_Html
-   fHits   = new TClonesArray("AliPHOShit",  405);
-   fIshunt     =  0;
-
-   SetMarkerColor(kGreen);
-   SetMarkerStyle(2);
-   SetMarkerSize(0.4);
-
-  if( NULL==(fCradles=new TObjArray) ) {
-     Error("AliPHOS","Can not create fCradles");
-     exit(1);
-  }
-  DefPars();
+  // Default ctor
+  fName="PHOS";
+  fQATask = 0;
+  fTreeQA = 0;
+  fDebug  = 0; 
 }
 
-//______________________________________________________________________________
-
-void AliPHOS::DefPars()
-{ 
-      PHOSflags[0]=0;
-      PHOSflags[1]=1;
-      PHOSflags[2]=0;
-      PHOSflags[3]=0;
-      PHOSflags[4]=0;
-      PHOSflags[5]=0;
-      PHOSflags[6]=0;
-      PHOSflags[7]=0;
-      PHOSflags[8]=0;
-      PHOScell[0]=2.2;
-      PHOScell[1]=18.;
-      PHOScell[2]=0.01;
-      PHOScell[3]=0.01;
-      PHOScell[4]=1.0;
-      PHOScell[5]=0.1;
-      PHOScell[6]=0.;
-      PHOScell[7]=0.;
-      PHOScell[8]=0.;
-      PHOSradius=460.;
-      PHOSsize[0]=104;
-      PHOSsize[1]=88;
-      PHOSsize[2]=4;
-      PHOScradlesA=0.;
-      PHOSextra[0]=0.001;
-      PHOSextra[1]=6.95;
-      PHOSextra[2]=4.;
-      PHOSextra[3]=5.;
-      PHOSextra[4]=2.;
-      PHOSextra[5]=0.06;
-      PHOSextra[6]=10.;
-      PHOSextra[7]=3.;
-      PHOSextra[8]=1.;
-      PHOSTXW[0]=209.;
-      PHOSTXW[1]=71.;
-      PHOSTXW[2]=250.;
-      PHOSAIR[0]=206.;
-      PHOSAIR[1]=66.;
-      PHOSAIR[2]=244.;
-      PHOSFTI[0]=214.6;
-      PHOSFTI[1]=80.;
-      PHOSFTI[2]=260.;
-      PHOSFTI[3]=467.;
-}
-//______________________________________________________________________________
-
-void AliPHOS::AddHit(Int_t track, Int_t *vol, Float_t *hits)
+//____________________________________________________________________________
+AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title) 
 {
-  TClonesArray &lhits = *fHits;
-  new(lhits[fNhits++]) AliPHOShit(fIshunt,track,vol,hits);
+  //   ctor : title is used to identify the layout
+  
+  fQATask = 0;
+  fTreeQA = 0;
+  fDebug =  0; 
 }
-//___________________________________________
-void AliPHOS::BuildGeometry()
-{
 
-  TNode *Node, *Top;
-
-  const int kColorPHOS = kRed;
-  //
-  Top=gAlice->GetGeometry()->GetNode("alice");
-
-
-  // PHOS
-  Float_t pphi=12.9399462;
-  new TRotMatrix("rot988","rot988",90,-3*pphi,90,90-3*pphi,0,0);
-  new TRotMatrix("rot989","rot989",90,-  pphi,90,90-  pphi,0,0);
-  new TRotMatrix("rot990","rot990",90,   pphi,90,90+  pphi,0,0);
-  new TRotMatrix("rot991","rot991",90, 3*pphi,90,90+3*pphi,0,0);
-  new TBRIK("S_PHOS","PHOS box","void",107.3,40,130);
-  Top->cd();
-  Node = new TNode("PHOS1","PHOS1","S_PHOS",-317.824921,-395.014343,0,"rot988");
-  Node->SetLineColor(kColorPHOS);
-  fNodes->Add(Node);
-  Top->cd();
-  Node = new TNode("PHOS2","PHOS2","S_PHOS",-113.532333,-494.124908,0,"rot989");
-  fNodes->Add(Node);
-  Node->SetLineColor(kColorPHOS);
-  Top->cd();
-  Node = new TNode("PHOS3","PHOS3","S_PHOS", 113.532333,-494.124908,0,"rot990");
-  Node->SetLineColor(kColorPHOS);
-  fNodes->Add(Node);
-  Top->cd();
-  Node = new TNode("PHOS4","PHOS4","S_PHOS", 317.824921,-395.014343,0,"rot991");
-  Node->SetLineColor(kColorPHOS);
-  fNodes->Add(Node);
-}
-//___________________________________________
-void AliPHOS::CreateMaterials()
-{
-// *** DEFINITION OF AVAILABLE PHOS MATERIALS *** 
-
-// CALLED BY : PHOS_MEDIA 
-// ORIGIN    : NICK VAN EIJNDHOVEN 
-
-
-
-    Int_t   ISXFLD = gAlice->Field()->Integ();
-    Float_t SXMGMX = gAlice->Field()->Max();
-    
-// --- The PbWO4 crystals --- 
-    Float_t ax[3] = { 207.19,183.85,16. };
-    Float_t zx[3] = { 82.,74.,8. };
-    Float_t wx[3] = { 1.,1.,4. };
-    Float_t dx    = 8.28;
-// --- Stainless Steel --- 
-    Float_t as[5] = { 55.847,12.011,51.9961,58.69,28.0855 };
-    Float_t zs[5] = { 26.,6.,24.,28.,14. };
-    Float_t ws[5] = { .6392,8e-4,.2,.14,.02 };
-    Float_t ds    = 8.;
-// --- The polysterene scintillator (CH) --- 
-    Float_t ap[2] = { 12.011,1.00794 };
-    Float_t zp[2] = { 6.,1. };
-    Float_t wp[2] = { 1.,1. };
-    Float_t dp    = 1.032;
-// --- Tyvek (CnH2n) 
-    Float_t at[2] = { 12.011,1.00794 };
-    Float_t zt[2] = { 6.,1. };
-    Float_t wt[2] = { 1.,2. };
-    Float_t dt    = .331;
-// --- Polystyrene foam --- 
-    Float_t af[2] = { 12.011,1.00794 };
-    Float_t zf[2] = { 6.,1. };
-    Float_t wf[2] = { 1.,1. };
-    Float_t df    = .12;
-//--- Foam thermo insulation (actual chemical composition unknown yet!) ---
-    Float_t ati[2] = { 12.011,1.00794 };
-    Float_t zti[2] = { 6.,1. };
-    Float_t wti[2] = { 1.,1. };
-    Float_t dti    = .1;
-// --- Textolit (actual chemical composition unknown yet!) --- 
-    Float_t atx[2] = { 12.011,1.00794 };
-    Float_t ztx[2] = { 6.,1. };
-    Float_t wtx[2] = { 1.,1. };
-    Float_t dtx    = 1.83;
-
-    Int_t *idtmed = fIdtmed->GetArray()-699;
-
-    AliMixture(  0, "PbWO4$",          ax, zx, dx, -3, wx);
-    AliMixture(  1, "Polystyrene$",    ap, zp, dp, -2, wp);
-    AliMaterial( 2, "Al$",             26.98, 13., 2.7, 8.9, 999);
-// ---                                Absorption length^ is ignored --- 
-    AliMixture(  3, "Tyvek$",           at, zt, dt, -2, wt);
-    AliMixture(  4, "Foam$",            af, zf, df, -2, wf);
-    AliMixture(  5, "Stainless Steel$", as, zs, ds, 5, ws);
-    AliMaterial( 6, "Si$",              28.09, 14., 2.33, 9.36, 42.3);
-    AliMixture(  7, "Thermo Insul.$",   ati, zti, dti, -2, wti);
-    AliMixture(  8, "Textolit$",        atx, ztx, dtx, -2, wtx);
-    AliMaterial(99, "Air$",             14.61, 7.3, .001205, 30420., 67500);
-
-    AliMedium(0, "PHOS Xtal    $", 0, 1, ISXFLD, SXMGMX, 10., .1, .1, .1, .1);
-    AliMedium(2, "Al parts     $", 2, 0, ISXFLD, SXMGMX, 10., .1, .1, .001, .001);
-    AliMedium(3, "Tyvek wrapper$", 3, 0, ISXFLD, SXMGMX, 10., .1, .1, .001, .001);
-    AliMedium(4, "Polyst. foam $", 4, 0, ISXFLD, SXMGMX, 10., .1, .1, .1, .1);
-    AliMedium(5, "Steel cover  $", 5, 0, ISXFLD, SXMGMX, 10., .1, .1, 1e-4, 1e-4);
-    AliMedium(6, "Si PIN       $", 6, 0, ISXFLD, SXMGMX, 10., .1, .1, .01, .01);
-    AliMedium(7, "Thermo Insul.$", 7, 0, ISXFLD, SXMGMX, 10., .1, .1, .1, .1);
-    AliMedium(8, "Textolit     $", 8, 0, ISXFLD, SXMGMX, 10., .1, .1, .1, .1);
-    AliMedium(99, "Air          $",99, 0, ISXFLD, SXMGMX, 10., 1., .1, .1, 10);
-
-// --- Generate explicitly delta rays in the steel cover --- 
-    gMC->Gstpar(idtmed[704], "LOSS", 3.);
-    gMC->Gstpar(idtmed[704], "DRAY", 1.);
-// --- and in aluminium parts --- 
-    gMC->Gstpar(idtmed[701], "LOSS", 3.);
-    gMC->Gstpar(idtmed[701], "DRAY", 1.);
+//____________________________________________________________________________
+AliPHOS::~AliPHOS() 
+{  
+  
 }
-//______________________________________________________________________________
 
-void AliPHOS::AddPHOSCradles()
+//____________________________________________________________________________
+void AliPHOS::Copy(AliPHOS & phos)
 {
-  Int_t i;
-  for(i=0;i<GetCradlesAmount();i++) {
-    
-    int n = fCradles->GetEntries();
-    fCradles->Add(new AliPHOSCradle( IsVersion(),            // geometry.
-                                    GetCrystalSideSize    (),
-                                    GetCrystalLength      (),
-                                    GetWrapThickness      (),
-                                    GetAirThickness       (),
-                                    GetPIN_SideSize       (),
-                                    GetPIN_Length         (),
-                                    GetRadius             (),
-                                    GetNz                 (),
-                                    GetNphi               (),
-                                    GetCradleAngle        (i)));
-    
-    if( n+1 != fCradles->GetEntries() || NULL == fCradles->At(n) )
-      {
-       cout << "  Can not create or add AliPHOSCradle.\n";
-       exit(1);
-      }
-  }
+  // copy method to be used byy the cpy ctor
+  TObject::Copy(phos) ; 
+  //  fQATask = AliPHOSQAChecker::Copy(*(phos.fQATask)) ; 
+  phos.fTreeQA = fTreeQA->CloneTree() ; 
 }
 
-//______________________________________________________________________________
-
-Int_t AliPHOS::DistancetoPrimitive(Int_t , Int_t )
+//____________________________________________________________________________
+AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
 {
-   return 9999;
+  return new AliPHOSDigitizer(manager);
 }
-//___________________________________________
-void AliPHOS::Init()
-{
-  Int_t i;
-  //
-  printf("\n");
-  for(i=0;i<35;i++) printf("*");
-  printf(" PHOS_INIT ");
-  for(i=0;i<35;i++) printf("*");
-  printf("\n");
-  //
-  // Here the ABSO initialisation code (if any!)
-  for(i=0;i<80;i++) printf("*");
-  printf("\n");
-}
-
-//______________________________________________________________________________
 
-void AliPHOS::MakeBranch(Option_t *)
+//____________________________________________________________________________
+void AliPHOS::CreateMaterials()
 {
-// ROOT output initialization to ROOT file.
-// 
-// AliDetector::MakeBranch()  is always called.
-//
-// There will be also special tree "PHOS" with one branch "AliPHOSCradles"
-// if it was set next flag in the galice card file:
-//  * PHOSflags:    YES: X<>0   NO: X=0
-//  * PHOSflags(1) : -----X.  Create branch for TObjArray of AliPHOSCradle
-//     Examples:
-//     PHOSflags      1.
-//     PHOSflags 636301.
-// In that case special bit CradlesBranch_Bit will be set for AliPHOS
-
-  AliDetector::MakeBranch();
-  
-  int i;
-  float t = GetPHOS_flag(0)/10;
-  i = (int) t;
-  i = (int) ((t-i)*10);
-  if( !i )
-    return;
+  // Definitions of materials to build PHOS and associated tracking media.
+  // media number in idtmed are 699 to 798.
 
-  SetBit(CradlesBranch_Bit);
+  // --- The PbWO4 crystals ---
+  Float_t aX[3] = {207.19, 183.85, 16.0} ;
+  Float_t zX[3] = {82.0, 74.0, 8.0} ;
+  Float_t wX[3] = {1.0, 1.0, 4.0} ;
+  Float_t dX = 8.28 ;
 
-  if( NULL==(fTreePHOS=new TTree(fTreeName.Data(),"PHOS events tree")) )
-  {
-    Error("MakeBranch","Can not create TTree");
-    exit(1);
-  }
+  AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
 
-  if( NULL==fTreePHOS->GetCurrentFile() )
-  {
-    Error("MakeBranch","There is no opened ROOT file");
-    exit(1);
-  }
 
-  // Create a new branch in the current Root Tree.
+  // --- The polysterene scintillator (CH) ---
+  Float_t aP[2] = {12.011, 1.00794} ;
+  Float_t zP[2] = {6.0, 1.0} ;
+  Float_t wP[2] = {1.0, 1.0} ;
+  Float_t dP = 1.032 ;
 
-  if( NULL==fTreePHOS->Branch(fBranchNameOfCradles.Data(),"TObjArray",&fCradles,4000,0) )
-  {
-    Error("MakeBranch","Can not create branch");
-    exit(1);
-  }
+  AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
 
-  printf("The branch %s has been created\n",fBranchNameOfCradles.Data());
-}
+  // --- Aluminium ---
+  AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
+  // ---         Absorption length is ignored ^
 
-//______________________________________________________________________________
-
-void AliPHOS::SetTreeAddress(void)
-{
-// ROOT input initialization.
-//
-// AliDetector::SetTreeAddress()  is always called.
-//
-// If CradlesBranch_Bit is set (see AliPHOS::MakeBranch) than fTreePHOS is
-// initilized.
-
-  AliDetector::SetTreeAddress();
-
-  if( !TestBit(CradlesBranch_Bit) )
-    return;
+ // --- Tyvek (CnH2n) ---
+  Float_t aT[2] = {12.011, 1.00794} ;
+  Float_t zT[2] = {6.0, 1.0} ;
+  Float_t wT[2] = {1.0, 2.0} ;
+  Float_t dT = 0.331 ;
 
-  if( NULL==(fTreePHOS=(TTree*)gDirectory->Get((char*)(fTreeName.Data()))  ) )
-  {
-    Error("SetTreeAddress","Can not find Tree \"%s\"\n",fTreeName.Data());
-    exit(1);
-  }
+  AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
 
-  TBranch *branch = fTreePHOS->GetBranch(fBranchNameOfCradles.Data());
-  if( NULL==branch )
-  {
-    Error("SetTreeAddress","Can not find branch %s in TTree:%s",fBranchNameOfCradles.Data(),fTreeName.Data());
-    exit(1);
-  }
+  // --- Polystyrene foam ---
+  Float_t aF[2] = {12.011, 1.00794} ;
+  Float_t zF[2] = {6.0, 1.0} ;
+  Float_t wF[2] = {1.0, 1.0} ;
+  Float_t dF = 0.12 ;
 
-  branch->SetAddress(&fCradles);
-}
+  AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
 
-//______________________________________________________________________________
+ // --- Titanium ---
+  Float_t aTIT[3] = {47.88, 26.98, 54.94} ;
+  Float_t zTIT[3] = {22.0, 13.0, 25.0} ;
+  Float_t wTIT[3] = {69.0, 6.0, 1.0} ;
+  Float_t dTIT = 4.5 ;
 
-AliPHOSCradle *AliPHOS::GetCradleOfTheParticle(const TVector3 &p,const TVector3 &v) const
-{
-// For a given direction 'p' and source point 'v' returns pointer to AliPHOSCradle
-// in that direction or NULL if AliPHOSCradle was not found.
+  AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
 
-  for( int m=0; m<fCradles->GetEntries(); m++ )
-  {
-    AliPHOS *PHOS = (AliPHOS *)this;     // Removing 'const'...
-    AliPHOSCradle *cradle = (AliPHOSCradle *)PHOS->fCradles->operator[](m);
+ // --- Silicon ---
+  AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
 
-    float x,y,l;
-    const float d = cradle->GetRadius();
-    cradle->GetXY(p,v,d,x,y,l);
 
-    if( l>0 && TMath::Abs(x)<cradle->GetNz  ()*cradle->GetCellSideSize()/2 
-            && TMath::Abs(y)<cradle->GetNphi()*cradle->GetCellSideSize()/2 )
-      return cradle;
-  }
 
-  return NULL;
-}
+  // --- Foam thermo insulation ---
+  Float_t aTI[2] = {12.011, 1.00794} ;
+  Float_t zTI[2] = {6.0, 1.0} ;
+  Float_t wTI[2] = {1.0, 1.0} ;
+  Float_t dTI = 0.04 ;
 
-//______________________________________________________________________________
+  AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
 
-void AliPHOS::Reconstruction(Float_t signal_step, UInt_t min_signal_reject)
-{
-// Call AliPHOSCradle::Reconstruction(Float_t signal_step, UInt_t min_signal_reject)
-// for all AliPHOSCradles.
+  // --- Textolitn ---
+  Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794} ;
+  Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0} ;
+  Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0} ;
+  Float_t dTX    = 1.75 ;
 
-  for( int i=0; i<fCradles->GetEntries(); i++ )
-    GetCradle(i).Reconstruction(signal_step,min_signal_reject);
-}
+  AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
 
-//______________________________________________________________________________
+  //--- FR4  ---
+  Float_t aFR[3] = {28.0855, 15.9994, 17.749} ; 
+  Float_t zFR[3] = {14., 8., 8.875} ; 
+  Float_t wFR[3] = {.28, .32, .4} ;
+  Float_t dFR = 1.8 ; 
 
-void AliPHOS::ResetDigits(void)
-{
-  AliDetector::ResetDigits();
+  AliMixture(9, "FR4$", aFR, zFR, dFR, -3, wFR) ;
 
-  for( int i=0; i<fCradles->GetEntries(); i++ )
-    ((AliPHOSCradle*)(*fCradles)[i]) -> Clear();
-}
+  // --- The Composite Material for  micromegas (so far polyetylene) ---                                       
+  Float_t aCM[2] = {12.01, 1.} ; 
+  Float_t zCM[2] = {6., 1.} ; 
+  Float_t wCM[2] = {1., 2.} ; 
+  Float_t dCM = 0.935 ; 
 
-//______________________________________________________________________________
+  AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
 
-void AliPHOS::FinishEvent(void)
-{
-// Called at the end of each 'galice' event.
+  // --- Copper ---                                                                    
+  AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
+  // --- G10 : Printed Circuit material ---                                                  
+  Float_t aG10[4] = { 12., 1., 16., 28.} ;
+  Float_t zG10[4] = { 6., 1., 8., 14.} ;
+  Float_t wG10[4] = { .259, .288, .248, .205} ;
+  Float_t dG10  = 1.7 ;
+  
+  AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
 
-  if( NULL!=fTreePHOS )
-    fTreePHOS->Fill();
-}
+  // --- Lead ---                                                                     
+  AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
 
-//______________________________________________________________________________
+ // --- The gas mixture ---                                                                
+ // Co2
+  Float_t aCO[2] = {12.0, 16.0} ; 
+  Float_t zCO[2] = {6.0, 8.0} ; 
+  Float_t wCO[2] = {1.0, 2.0} ; 
+  Float_t dCO = 0.001977 ; 
 
-void AliPHOS::FinishRun(void)
-{
-}
+  AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
 
-//______________________________________________________________________________
+ // Ar
+  Float_t dAr = 0.001782 ; 
+  AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;   
+ // ArCo2
+  Char_t namate[21]="";
+  Float_t aGM[2] ; 
+  Float_t zGM[2] ; 
+  Float_t wGM[2] ; 
+  Float_t dGM ; 
 
-void AliPHOS::Print(Option_t *opt)
-{
-// Print PHOS information.
-// For each AliPHOSCradle the function AliPHOSCradle::Print(opt) is called.
+  Float_t absL, radL, density ;
+  Float_t buf[1] ;
+  Int_t nbuf ;
 
-  AliPHOS &PHOS = *(AliPHOS *)this;     // Removing 'const'...
+  gMC->Gfmate((*fIdmate)[15], namate, aGM[0], zGM[0], density, radL, absL, buf, nbuf) ; // Get properties of Ar 
+  gMC->Gfmate((*fIdmate)[14], namate, aGM[1], zGM[1], density, radL, absL, buf, nbuf) ; // Get properties of CO2 
 
-  for( int i=0; i<fCradles->GetEntries(); i++ )
-  {
-    printf("PHOS cradle %d from %d\n",i+1, fCradles->GetEntries());
-    PHOS.GetCradle(i).Print(opt);
-    printf( "---------------------------------------------------\n");
-  }
-}
 
-//______________________________________________________________________________
-void AliPHOS::SetFlags(Float_t p1,Float_t p2,Float_t p3,Float_t p4,
-                       Float_t p5,Float_t p6,Float_t p7,Float_t p8,Float_t p9)
-{
-  PHOSflags[0]=p1;
-  PHOSflags[1]=p2;
-  PHOSflags[2]=p3;
-  PHOSflags[3]=p4;
-  PHOSflags[4]=p5;
-  PHOSflags[5]=p6;
-  PHOSflags[6]=p7;
-  PHOSflags[7]=p8;
-  PHOSflags[8]=p9;
-}
+  // Create gas mixture 
 
-//______________________________________________________________________________
-void AliPHOS::SetCell(Float_t p1,Float_t p2,Float_t p3,Float_t p4,
-                       Float_t p5,Float_t p6,Float_t p7,Float_t p8,Float_t p9)
-{
-  PHOScell[0]=p1;
-  PHOScell[1]=p2;
-  PHOScell[2]=p3;
-  PHOScell[3]=p4;
-  PHOScell[4]=p5;
-  PHOScell[5]=p6;
-  PHOScell[6]=p7;
-  PHOScell[7]=p8;
-  PHOScell[8]=p9;
-}
+  Float_t arContent    = 0.80 ;  // Ar-content of the Ar/CO2-mixture (80% / 20%) 
+  wGM[0] = arContent;
+  wGM[1] = 1. - arContent ;
+  dGM    = wGM[0] * dAr + wGM[1] * dCO;
 
-//______________________________________________________________________________
-void AliPHOS::SetRadius(Float_t radius)
-{
-   PHOSradius=radius;
-}
+  
+  AliMixture(16, "ArCO2$", aGM, zGM, dGM,  2, wGM) ;
 
-//______________________________________________________________________________
-void AliPHOS::SetCradleSize(Int_t nz, Int_t nphi, Int_t ncradles)
-{
-   PHOSsize[0]=nz;
-   PHOSsize[1]=nphi;
-   PHOSsize[2]=ncradles;
-}
+  // --- Stainless steel (let it be pure iron) ---
+  AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
 
-//______________________________________________________________________________
-void AliPHOS::SetCradleA(Float_t angle)
-{
-   PHOScradlesA=angle;
-}
 
-//______________________________________________________________________________
-void AliPHOS::SetExtra(Float_t p1,Float_t p2,Float_t p3,Float_t p4,
-                       Float_t p5,Float_t p6,Float_t p7,Float_t p8,Float_t p9)
-{
-   PHOSextra[0] = p1;
-   PHOSextra[1] = p2;
-   PHOSextra[2] = p3;
-   PHOSextra[3] = p4;
-   PHOSextra[4] = p5;
-   PHOSextra[5] = p6;
-   PHOSextra[6] = p7;
-   PHOSextra[7] = p8;
-   PHOSextra[8] = p9;
-}
+  // --- Fiberglass ---
+  Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794} ;
+  Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0} ;
+  Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0} ;
+  Float_t dFG    = 1.9 ;
 
-//______________________________________________________________________________
-void AliPHOS::SetTextolitWall(Float_t dx, Float_t dy, Float_t dz)
-{
-   PHOSTXW[0] = dx;
-   PHOSTXW[1] = dy;
-   PHOSTXW[2] = dz;
-}
+  AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
 
-//______________________________________________________________________________
-void AliPHOS::SetInnerAir(Float_t dx, Float_t dy, Float_t dz)
-{
-   PHOSAIR[0] = dx;
-   PHOSAIR[1] = dy;
-   PHOSAIR[2] = dz;
-}
+  // --- Cables in Air box  ---
+  // SERVICES
 
-//______________________________________________________________________________
-void AliPHOS::SetFoam(Float_t dx, Float_t dy, Float_t dz, Float_t dr)
-{
-   PHOSFTI[0] = dx;
-   PHOSFTI[1] = dy;
-   PHOSFTI[2] = dz;
-   PHOSFTI[3] = dr;
-}
+  Float_t aCA[4] = { 1.,12.,55.8,63.5 };
+  Float_t zCA[4] = { 1.,6.,26.,29. }; 
+  Float_t wCA[4] = { .014,.086,.42,.48 };
+  Float_t dCA    = 0.8 ;  //this density is raw estimation, if you know better - correct
 
-ClassImp(AliPHOSCradle)
-
-//______________________________________________________________________________
-
-AliPHOSCradle::AliPHOSCradle(void) {}
-
-//______________________________________________________________________________
-
-AliPHOSCradle::AliPHOSCradle( int   Geometry           ,
-                              float CrystalSideSize    ,
-                              float CrystalLength      ,
-                              float WrapThickness      ,
-                              float AirThickness       ,
-                              float PIN_SideSize       ,
-                              float PIN_Length         ,
-                              float Radius             ,
-                              int   Nz                 ,
-                              int   Nphi               ,
-                              float Angle              ) :
-    fGeometry                   (Geometry),
-//  fCellEnergy                 (),
-//  fChargedTracksInPIN         (),
-    fCrystalSideSize            (CrystalSideSize),
-    fCrystalLength              (CrystalLength),
-    fWrapThickness              (WrapThickness),
-    fAirThickness               (AirThickness),
-    fPIN_SideSize               (PIN_SideSize),
-    fPIN_Length                 (PIN_Length),
-    fRadius                     (Radius),
-    fNz                         (Nz),
-    fNphi                       (Nphi),
-    fPhi                        (Angle)
-{
-        fCellEnergy         = TH2F("CellE","Energy deposition in a cells",fNz,0,fNz,fNphi,0,fNphi);
-        fCellEnergy           .SetDirectory(0);
-        fChargedTracksInPIN = TH2S("PINCtracks","Amount of charged tracks in PIN",fNz,0,fNz,fNphi,0,fNphi);
-        fChargedTracksInPIN   .SetDirectory(0);
-}
+  AliMixture(19, "Cables  $", aCA, zCA, dCA, -4, wCA) ;
 
-//______________________________________________________________________________
 
-AliPHOSCradle::~AliPHOSCradle(void)        // 28.12.1998
-{
-  fGammasReconstructed.Delete();
-  fParticles          .Delete();
-}
+  // --- Air ---
+  Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
+  Float_t zAir[4]={6.,7.,8.,18.};
+  Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
+  Float_t dAir = 1.20479E-3;
+  AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
 
-//______________________________________________________________________________
+  // DEFINITION OF THE TRACKING MEDIA
 
-void AliPHOSCradle::Clear(Option_t *)
-{
-// Clear digit. information.
+  // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
+  Int_t * idtmed = fIdtmed->GetArray() - 699 ; 
+  Int_t   isxfld = gAlice->Field()->Integ() ;
+  Float_t sxmgmx = gAlice->Field()->Max() ;
 
-  fCellEnergy              .Reset();
-  fChargedTracksInPIN      .Reset();
-  GetParticles()           .Delete();
-  GetParticles()           .Compress();
-  GetGammasReconstructed() .Delete();
-  GetGammasReconstructed() .Compress();
+  // The scintillator of the calorimeter made of PBW04                              -> idtmed[699]
+  AliMedium(0, "PHOS Xtal    $", 0, 1,
+           isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-}
+  // The scintillator of the CPV made of Polystyrene scintillator                   -> idtmed[700]
+  AliMedium(1, "CPV scint.   $", 1, 1,
+           isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-//______________________________________________________________________________
+  // Various Aluminium parts made of Al                                             -> idtmed[701]
+  AliMedium(2, "Al parts     $", 2, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
 
-void AliPHOSCradle::GetXY(const TVector3 &p,const TVector3 &v,float R,float &x,float &y,float &l) const
-{
-// This function calculates hit position (x,y) in the CRADLE cells plain from particle in
-// the direction given by 'p' (not required to be normalized) and start point
-// given by 3-vector 'v'. So the particle trajectory is   t(l) = v + p*l
-// were 'l' is a number (distance from 'v' to CRADLE cells plain) and 't' is resulting
-// three-vector of trajectory point.
-// 
-// After the call to this function user should test that l>=0 (the particle HITED the
-// plain) and (x,y) are in the region of CRADLE:
-// 
-// Example:
-//   AliPHOSCradle cradle(......);
-//   TVector3 p(....), v(....);
-//   Float_t x,y,l;
-//   cradle.GetXY(p,v,x,y,l);
-//   if( l<0 || TMath::Abs(x)>cradle.GetNz()  *cradle.GetCellSideSize()/2
-//           || TMath::Abs(y)>cradle.GetNphi()*cradle.GetCellSideSize()/2 )
-//     cout << "Outside the CRADLE.\n";
-
-  // We have to create three vectors:
-  //    s  - central point on the PHOS surface
-  //    n1 - first vector in CRADLE plain
-  //    n2 - second vector in CRADLE plain
-  // This three vectors are orthonormalized.
-
-  double phi = fPhi/180*TMath::Pi();
-  TVector3        n1(   0.0      ,   0.0      , 1.0 ),   // Z direction (X)
-                  n2(  -sin(phi) ,   cos(phi) , 0 ),   // around beam (Y)
-                  s ( R*cos(phi) , R*sin(phi) , 0 );   // central point
-
-  const double l1_min = 1e-2;
-  double l1,
-         p_n1 = p*n1,        // * - scalar product.
-         p_n2 = p*n2,
-         v_n1 = v*n1,
-         v_n2 = v*n2,
-         s_n1 = s*n1, // 0
-         s_n2 = s*n2; // 0
-  
-  if      ( TMath::Abs(l1=p.X()-n1.X()*p_n1-n2.X()*p_n2)>l1_min )
-    { l = (-v.X()+s.X()+n1.X()*(v_n1-s_n1)+n2.X()*(v_n2-s_n2))/l1; }
-  else if ( TMath::Abs(l1=p.Y()-n1.Y()*p_n1-n2.Y()*p_n2)>l1_min )
-    { l = (-v.Y()+s.Y()+n1.Y()*(v_n1-s_n1)+n2.Y()*(v_n2-s_n2))/l1; }
-  else if ( TMath::Abs(l1=p.Z()-n1.Z()*p_n1-n2.Z()*p_n2)>l1_min )
-    { l = (-v.Z()+s.Z()+n1.Z()*(v_n1-s_n1)+n2.Z()*(v_n2-s_n2))/l1; }
-
-//         double lx = (-v.X()+s.X()+n1.X()*(v.dot(n1)-s.dot(n1))+n2.X()*(v.dot(n2)-s.dot(n2)))/
-//                     (p.X()-n1.X()*p.dot(n1)-n2.X()*p.dot(n2)),
-//                ly = (-v.Y()+s.Y()+n1.Y()*(v.dot(n1)-s.dot(n1))+n2.Y()*(v.dot(n2)-s.dot(n2)))/
-//                     (p.Y()-n1.Y()*p.dot(n1)-n2.Y()*p.dot(n2)),
-//                lz = (-v.Z()+s.Z()+n1.Z()*(v.dot(n1)-s.dot(n1))+n2.Z()*(v.dot(n2)-s.dot(n2)))/
-//                     (p.Z()-n1.Z()*p.dot(n1)-n2.Z()*p.dot(n2));
-//         cout.form("x: %g %g %g %g\n",lx,-v.X()+s.X()+n1.X()*(v.dot(n1)-s.dot(n1))+n2.X()*(v.dot(n2)-s.dot(n2)),p.X()-n1.X()*p.dot(n1)-n2.X()*p.dot(n2));
-//         cout.form("y: %g %g %g %g\n",lx,-v.Y()+s.Y()+n1.Y()*(v.dot(n1)-s.dot(n1))+n2.Y()*(v.dot(n2)-s.dot(n2)),p.Y()-n1.Y()*p.dot(n1)-n2.Y()*p.dot(n2));
-//         cout.form("z: %g %g %g %g\n",lx,-v.Z()+s.Z()+n1.Z()*(v.dot(n1)-s.dot(n1))+n2.Z()*(v.dot(n2)-s.dot(n2)),p.Z()-n1.Z()*p.dot(n1)-n2.Z()*p.dot(n2));
-//         cout.form("lx,ly,lz =   %g,%g,%g\n",lx,ly,lz);
-
-  x = p_n1*l + v_n1 - s_n1;
-  y = p_n2*l + v_n2 - s_n2;
-}
+  // The Tywek which wraps the calorimeter crystals                                 -> idtmed[702]
+  AliMedium(3, "Tyvek wrapper$", 3, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
 
-//______________________________________________________________________________
+  // The Polystyrene foam around the calorimeter module                             -> idtmed[703]
+  AliMedium(4, "Polyst. foam $", 4, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-void AliPHOSCradle::Print(Option_t *opt)
-{
-// Print AliPHOSCradle information.
-// 
-// options:  'd' - print energy deposition for EVERY cell
-//           'p' - print particles list that hit the cradle
-//           'r' - print list of reconstructed particles
-
-  AliPHOSCradle *cr = (AliPHOSCradle *)this;     // Removing 'const'...
-
-  printf("AliPHOSCradle:  Nz=%d  Nphi=%d, fPhi=%f, E=%g\n",fNz,fNphi,fPhi,
-       cr->fCellEnergy.GetSumOfWeights());
-
-  if( NULL!=strchr(opt,'d') )
-  {
-    printf("\n\nCells Energy (in MeV):\n\n   |");
-    for( int x=0; x<fNz; x++ )
-      printf(" %4d|",x+1);
-    printf("\n");
-
-    for( int y=fNphi-1; y>=0; y-- )
-    {
-      printf("%3d|",y+1);
-      for( int x=0; x<fNz; x++ )
-        printf("%6d",(int)(cr->fCellEnergy.GetBinContent(cr->fCellEnergy.GetBin(x,y))*1000));
-      printf("\n");
-    }
-    printf("\n");
-  }
+  // The Titanium around the calorimeter crystal                                    -> idtmed[704]
+  AliMedium(5, "Titan. cover $", 5, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0) ;
 
-  if( NULL!=strchr(opt,'p') )
-  {
-    printf("This cradle was hit by %d particles\n",
-         ((AliPHOSCradle*)this)->GetParticles().GetEntries());
-    TObjArray &p=((AliPHOSCradle*)this)->GetParticles();
-    for( int i=0; i<p.GetEntries(); i++ )
-      ((AliPHOSgamma*)(p[i]))->Print();
-  }
+  // The Silicon of the pin diode to read out the calorimeter crystal               -> idtmed[705] 
+ AliMedium(6, "Si PIN       $", 6, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0) ;
 
-  if( NULL!=strchr(opt,'p') )
-  {
-    printf("Amount of reconstructed gammas is %d\n",
-         ((AliPHOSCradle*)this)->GetGammasReconstructed().GetEntries());
+ // The thermo insulating material of the box which contains the calorimeter module -> idtmed[706]
+  AliMedium(7, "Thermo Insul.$", 7, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-    TObjArray &p=((AliPHOSCradle*)this)->GetGammasReconstructed();
-    for( int i=0; i<p.GetEntries(); i++ )
-      ((AliPHOSgamma*)(p[i]))->Print();
-  }
-}
+  // The Textolit which makes up the box which contains the calorimeter module      -> idtmed[707]
+  AliMedium(8, "Textolit     $", 8, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-//______________________________________________________________________________
+  // FR4: The Plastic which makes up the frame of micromegas                        -> idtmed[708]
+  AliMedium(9, "FR4 $", 9, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ; 
 
-void AliPHOSCradle::Distortion(const TH2F *Noise, const TH2F *Stochastic, const TH2F *Calibration)
-{
-// This function changes histogram of cell energies fCellEnergy on the base of input
-// histograms Noise, Stochastic, Calibration. The histograms must have
-// size Nz x Nphi. 
 
-  //////////////////////////////////
-  // Testing the histograms size. //
-  //////////////////////////////////
-  
-  if( fNz!=fCellEnergy.GetNbinsX() || fNphi!=fCellEnergy.GetNbinsY() )
-  {
-    printf      ("Bad size of CellEnergy!   Must be:   Nz x Nphi = %d x %d\n"
-                 "but size of CellEnergy is:  %d x %d\n",
-                 fNz,fNphi,fCellEnergy.GetNbinsX(),fCellEnergy.GetNbinsY());
-    exit(1);
-  }
+  // The Composite Material for  micromegas                                         -> idtmed[709]
+  AliMedium(10, "CompoMat   $", 10, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-  if( fNz!=fChargedTracksInPIN.GetNbinsX() || fNphi!=fChargedTracksInPIN.GetNbinsY() )
-  {
-    printf      ("Bad size of ChargedTracksInPIN!   Must be:   Nz x Nphi = %d x %d\n"
-                 "but size of ChargedTracksInPIN is:  %d x %d\n",
-                 fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY());
-    exit(1);
-  }
+  // Copper                                                                         -> idtmed[710]
+  AliMedium(11, "Copper     $", 11, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
 
-  if( NULL!=Noise && (fNz!=Noise->GetNbinsX() || fNphi!=Noise->GetNbinsX()) )
-  {
-    printf      ("Bad size of Noise!   Must be:   Nz x Nphi = %d x %d\n"
-                 "but size of Noise is:  %d x %d\n",
-                 fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY());
-    exit(1);
-  }
+  // G10: Printed Circuit material                                                  -> idtmed[711]
+  AliMedium(12, "G10        $", 12, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
 
-  if( NULL!=Stochastic && (fNz!=Stochastic->GetNbinsX() || fNphi!=Stochastic->GetNbinsX()) )
-  {
-    printf      ("Bad size of Stochastic!   Must be:   Nz x Nphi = %d x %d\n"
-                 "but size of Stochastic is:  %d x %d\n",
-                 fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY());
-    exit(1);
-  }
+  // The Lead                                                                       -> idtmed[712]
+  AliMedium(13, "Lead      $", 13, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-  if( NULL!=Calibration && (fNz!=Calibration->GetNbinsX() || fNphi!=Calibration->GetNbinsX()) )
-  {
-    printf      ("Bad size of Calibration!   Must be:   Nz x Nphi = %d x %d\n"
-                 "but size of Calibration is:  %d x %d\n",
-                 fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY());
-    exit(1);
-  }
+  // The gas mixture: ArCo2                                                         -> idtmed[715]
+  AliMedium(16, "ArCo2      $", 16, 1,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
+  // Stainless steel                                                                -> idtmed[716]
+  AliMedium(17, "Steel     $", 17, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
 
-  ////////////////////
-  // Do distortion! //
-  ////////////////////
+  // Fibergalss                                                                     -> idtmed[717]
+  AliMedium(18, "Fiberglass$", 18, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-  for( int y=0; y<fNphi; y++ )
-    for( int x=0; x<fNz; x++ )
-    {
-      const int n = fCellEnergy.GetBin(x,y);   // Bin number
-      static TRandom r;
-    
-      Float_t   E_old=fCellEnergy.GetBinContent(n),   E_new=E_old;
+  // Cables in air                                                                  -> idtmed[718]
+  AliMedium(19, "Cables    $", 19, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-      if( NULL!=Stochastic )
-        E_new   = r.Gaus(E_old,sqrt(E_old)*GetDistortedValue(Stochastic,n));
+  // Air                                                                            -> idtmed[798] 
+  AliMedium(99, "Air          $", 99, 0,
+            isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0) ;
 
-      if( NULL!=Calibration )
-        E_new  *=  GetDistortedValue(Calibration,n);
+  // --- Set decent energy thresholds for gamma and electron tracking
 
-      if( NULL!=Noise )
-        E_new  +=  GetDistortedValue(Noise,n);
+  // Tracking threshold for photons and electrons in the scintillator crystal 
+  gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ; 
+  gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ;
+  // --- Generate explicitly delta rays in the titan cover ---
+  gMC->Gstpar(idtmed[704], "LOSS",3.) ;
+  gMC->Gstpar(idtmed[704], "DRAY",1.) ;
+  // --- and in aluminium parts ---
+  gMC->Gstpar(idtmed[701], "LOSS",3.) ;
+  gMC->Gstpar(idtmed[701], "DRAY",1.) ;
+  // --- and in PIN diode
+  gMC->Gstpar(idtmed[705], "LOSS",3) ;
+  gMC->Gstpar(idtmed[705], "DRAY",1) ;
+  // --- and in the passive convertor
+  gMC->Gstpar(idtmed[712], "LOSS",3) ;
+  gMC->Gstpar(idtmed[712], "DRAY",1) ;
+  // Tracking threshold for photons and electrons in the gas ArC02 
+  gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ; 
+  gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ;
+  gMC->Gstpar(idtmed[715], "LOSS",2.) ;
+  gMC->Gstpar(idtmed[715], "DRAY",0.) ;
+  gMC->Gstpar(idtmed[715], "STRA",2.) ;
+
+}
+
+//____________________________________________________________________________
+void AliPHOS::Hits2SDigits()  
+{ 
+// create summable digits
 
-      fCellEnergy.SetBinContent(n,E_new);
-    }
+  AliPHOSSDigitizer* phosDigitizer = 
+    new AliPHOSSDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
+  phosDigitizer->SetEventRange(0, -1) ; // do all the events
+  phosDigitizer->ExecuteTask("all") ;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
-TH2F* AliPHOSCradle::CreateHistForDistortion(const char *name, const char *title,
-                                             Int_t Nx, Int_t Ny,
-                                             Float_t MU_mu,    Float_t MU_sigma,
-                                             Float_t SIGMA_mu, Float_t SIGMA_sigma)
+//____________________________________________________________________________
+AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
 {
-// Create (new TH2F(...)) histogram with information (for every bin) that will
-// be used for VALUE creation.
-// Two values will be created for each bin:
-// MU    = TRandom::Gaus(MU_mu,MU_sigma)
-// and
-// SIGMA = TRandom::Gaus(SIGMA_mu,SIGMA_sigma)
-// The VALUE in a particluar bin will be equal
-// VALUE = TRandom::Gaus(MU,SIGMA)
-// 
-// Do not forget to delete the histogram at the end of the work.
+//different behaviour than standard (singleton getter)
+// --> to be discussed and made eventually coherent
+ fLoader = new AliPHOSLoader(GetName(),topfoldername);
+ return fLoader;
+}
 
-  TH2F *h = new TH2F( name,title, Nx,1,Nx, Ny,1,Ny );
-  if( h==NULL )
-  {
-    Error("CreateHistForDistortion","Can not create the histogram");
-    exit(1);
+//____________________________________________________________________________
+void AliPHOS::SetTreeAddress()
+{ 
+  // Links Hits in the Tree to Hits array
+  TBranch *branch;
+  char branchname[20];
+  sprintf(branchname,"%s",GetName());
+  
+  // Branch address for hit tree
+  TTree *treeH = TreeH();
+  if (treeH) {
+    branch = treeH->GetBranch(branchname);
+    if (branch) 
+     { 
+       if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
+       //Info("SetTreeAddress","<%s> Setting Hits Address",GetName());
+       branch->SetAddress(&fHits);
+     }
   }
-  h->SetDirectory(0);
-
-  for( int y=0; y<Ny; y++ )
-    for( int x=0; x<Nx; x++ )
-    {
-      const int n = h->GetBin(x,y);
-      h->SetBinContent(n,r.Gaus(   MU_mu,   MU_sigma));
-      h->SetBinError  (n,r.Gaus(SIGMA_mu,SIGMA_sigma));
-    }
-
-  return h;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
-Float_t AliPHOSCradle::GetDistortedValue(const TH2F *h, UInt_t n)
+//____________________________________________________________________________
+void AliPHOS::WriteQA()
 {
-  return r.Gaus(((TH2F*)h)->GetBinContent(n),n);
-}
 
-////////////////////////////////////////////////////////////////////////////////
-//______________________________________________________________________________
+  // Make TreeQA in the output file. 
 
-#ifdef WIN32
-  #define common_for_event_storing COMMON_FOR_EVENT_STORING
-#else
-  #define common_for_event_storing common_for_event_storing_
-#endif
+  if(fTreeQA == 0)
+    fTreeQA = new TTree("TreeQA", "QA Alarms") ;    
+  // Create Alarms branches
+  Int_t bufferSize = 32000 ;    
+  Int_t splitlevel = 0 ; 
 
-/* extern "C" */ struct
-{
-  enum { crystals_matrix_amount_max=4, crystals_in_matrix_amount_max=40000 };
-
-  // Event-independent information
-  UShort_t      crystals_matrix_amount_PHOS,
-                crystal_matrix_type,
-                amount_of_crystals_on_Z,
-                amount_of_crystals_on_PHI;
-  Float_t       radius,
-                crystal_size,
-                crystal_length,
-                matrix_coordinate_Z             [crystals_matrix_amount_max],
-                matrix_coordinate_PHI           [crystals_matrix_amount_max];
-  UInt_t        event_number;
-  UShort_t      crystals_amount_with_amplitudes [crystals_matrix_amount_max],
-                crystals_amplitudes_Iad         [crystals_matrix_amount_max]
-                                                [crystals_in_matrix_amount_max][2];
-} common_for_event_storing;
-
-//       integer*4 crystals_amount_max,crystals_in_matrix_amount_max,
-//      +          crystals_matrix_amount_max
-//       parameter (crystals_matrix_amount_max=4)
-//       parameter (crystals_in_matrix_amount_max=40000)
-//       parameter (crystals_amount_max =crystals_matrix_amount_max*
-//      +                                crystals_in_matrix_amount_max)
-// 
-// * All units are in GeV, cm, radian
-//       real       crystal_amplitudes_unit, radius_unit,
-//      +           crystal_size_unit, crystal_length_unit,
-//      +           matrix_coordinate_Z_unit, matrix_coordinate_PHI_unit
-//       integer    crystal_amplitudes_in_units_min
-//       parameter (crystal_amplitudes_in_units_min        = 1)
-//       parameter (crystal_amplitudes_unit                = 0.001 ) ! 1.0  MeV
-//       parameter (radius_unit                            = 0.1   ) ! 0.1  cm
-//       parameter (crystal_size_unit                      = 0.01  ) ! 0.01 cm
-//       parameter (crystal_length_unit                    = 0.01  ) ! 0.01 cm
-//       parameter (matrix_coordinate_Z_unit               = 0.1   ) ! 0.1  cm
-//       parameter (matrix_coordinate_PHI_unit             = 1e-4  ) ! 1e-4 radian
-// 
-//       integer*2 crystals_matrix_amount_PHOS, crystal_matrix_type,
-//      +          amount_of_crystals_on_Z, amount_of_crystals_on_PHI,
-//      +          crystals_amount_with_amplitudes, crystals_amplitudes_Iad
-//       integer*4 event_number
-// 
-//       real      radius, crystal_size, crystal_length,
-//      +          matrix_coordinate_Z, matrix_coordinate_PHI
-// 
-//       real      crystals_amplitudes, crystals_energy_total
-//       integer   event_file_unit_number
-// 
-//       common /common_for_event_storing/
-//      + ! Event-independent information
-//      +        crystals_matrix_amount_PHOS,
-//      +        crystal_matrix_type,
-//      +        amount_of_crystals_on_Z,
-//      +        amount_of_crystals_on_PHI,
-//      +        radius,
-//      +        crystal_size,
-//      +        crystal_length,
-//      +        matrix_coordinate_Z     (crystals_matrix_amount_max),
-//      +        matrix_coordinate_PHI   (crystals_matrix_amount_max),
-//      +
-//      + ! Event-dependent information
-//      +        event_number,
-//      +        crystals_amount_with_amplitudes
-//      +                                (crystals_matrix_amount_max),
-//      +        crystals_amplitudes_Iad (2,crystals_in_matrix_amount_max,
-//      +                                 crystals_matrix_amount_max),
-//      +        
-//      + ! These information don't store in data file
-//      +        crystals_amplitudes     (crystals_amount_max),
-//      +        crystals_energy_total,
-//      +        event_file_unit_number
-
-
-//     parameter (NGp=1000,nsps=10,nvertmax=1000)
-//         COMMON /GAMMA/KG,MW(ngp),ID(ngp),JD(ngp),E(ngp),E4(ngp),
-//      ,  XW(ngp),YW(ngp),ES(nsps,ngp),ET(nsps,ngp),ISsd(ngp),
-//      ,  IGDEV(ngp),ZGDEV(ngp),sigexy(3,ngp),Emimx(2,nsps,ngp),
-//      ,  kgfix,igfix(ngp),cgfix(3,ngp),sgfix(3,ngp),hiw(ngp),
-//      ,  wsw(nsps,ngp),h1w(ngp),h0w(ngp),raxay(5,ngp),
-//      ,  sigmaes0(nsps,ngp),dispeces(nsps,ngp),
-//      ,  igamvert(ngp)
-
-
-#ifdef WIN32
-#define rcgamma RCGAMMA
-#else
-#define rcgamma rcgamma_
-#endif
-
-/* extern "C" */ struct
-{
-  enum {NGP=1000, nsps=10, nvertmax=1000};
-  int   recons_gammas_amount, mw[NGP],ID[NGP],JD[NGP];
-  float E[NGP], E4[NGP], XW[NGP], YW[NGP], ES[NGP][nsps],ET[NGP][nsps],ISsd[NGP],
-        igdev[NGP],Zgdev[NGP];
-//      sigexy(3,ngp),Emimx(2,nsps,ngp),
-//   ,  kgfix,igfix(ngp),cgfix(3,ngp),sgfix(3,ngp),hiw(ngp),
-//   ,  wsw(nsps,ngp),h1w(ngp),h0w(ngp),raxay(5,ngp),
-//   ,  sigmaes0(nsps,ngp),dispeces(nsps,ngp),
-//   ,  igamvert(ngp)
-} rcgamma;
-
-#ifdef WIN32
-#define reconsfirst RECONSFIRST
-#define type_of_call _stdcall
-#else
-#define reconsfirst reconsfirst_
-#define type_of_call
-#endif
-
-extern "C" void type_of_call reconsfirst(const float &,const float &);
-
-void AliPHOSCradle::Reconstruction(Float_t signal_step, UInt_t min_signal_reject)
-{
-// Call of PHOS reconstruction program.
-// signal_step=0.001  GeV (1MeV)
-// min_signal_reject = 15 or 30 MeV
-
-
-  common_for_event_storing.event_number                       = 0;  // We do not know event number?
-  common_for_event_storing.crystals_matrix_amount_PHOS        = 1;
-  common_for_event_storing.crystal_matrix_type                = 1; // 1 - rectangular
-  common_for_event_storing.amount_of_crystals_on_Z            = fNz;
-  common_for_event_storing.amount_of_crystals_on_PHI          = fNphi;
-
-  common_for_event_storing.radius                             = fRadius;
-  common_for_event_storing.crystal_size                       = GetCellSideSize();
-  common_for_event_storing.crystal_length                     = fCrystalLength;
-
-  common_for_event_storing.matrix_coordinate_Z            [0] = 0;
-  common_for_event_storing.matrix_coordinate_PHI          [0] = fPhi;
-
-  #define  k    common_for_event_storing.crystals_amount_with_amplitudes[0] 
-  k=0;
-
-  for( int y=0; y<fNphi; y++ )
-    for( int x=0; x<fNz; x++ )
-    {
-      UInt_t    n       = fCellEnergy.GetBin(x,y);
-      UInt_t    signal  = (int) (fCellEnergy.GetBinContent(n)/signal_step);
-      if( signal>=min_signal_reject )
-      {
-        common_for_event_storing.crystals_amplitudes_Iad[0][k][0] = signal;
-        common_for_event_storing.crystals_amplitudes_Iad[0][k][1] = x + y*fNz;
-        k++;
-      }
-    }
-  #undef  k
+  TFolder* topfold = GetLoader()->GetTopFolder(); //get top aliroot folder; skowron
+  TString phosqafn(AliConfig::Instance()->GetQAFolderName()+"/"); //get name of QAaut folder relative to top event; skowron
+  phosqafn+=GetName(); //hard wired string!!! add the detector name to the pathname; skowron 
+  TFolder * alarmsF = (TFolder*)topfold->FindObjectAny(phosqafn); //get the folder
+  if (alarmsF == 0x0)
+   {
+     Error("WriteQA","Can not find folder with qa alarms");
+     return;
+   }
+  TString branchName(alarmsF->GetName());
+  TBranch * alarmsBranch = fTreeQA->Branch(branchName,"TFolder", &alarmsF, bufferSize, splitlevel);
+  TString branchTitle = branchName + " QA alarms" ; 
+  alarmsBranch->SetTitle(branchTitle);
+  alarmsBranch->Fill() ; 
+
+  //fTreeQA->Fill() ; 
+}
+
+//____________________________________________________________________________
+void AliPHOS::Digits2Raw()
+{
+// convert digits of the current event to raw data
+
+  // get the digits
+  ((AliPHOSLoader*) fLoader)->LoadDigits();
+  TClonesArray* digits = ((AliPHOSLoader*) fLoader)->Digits();
+  if (!digits) {
+    Error("Digits2Raw", "no digits");
+    return;
+  }
 
-  GetGammasReconstructed().Delete();
-  GetGammasReconstructed().Compress();
+  // get the geometry
+  AliPHOSGeometry* geom = GetGeometry();
+  if (!geom) {
+    Error("Digits2Raw", "no geometry");
+    return;
+  }
 
-  const float   stochastic_term   = 0.03,        // per cents over sqrt(E);  E in GeV
-                electronic_noise  = 0.01;        // GeV
-  reconsfirst(stochastic_term,electronic_noise); // Call of reconstruction program.
+  // some digitization constants
+  const Int_t    kDDLOffset = 0x600;
+  const Double_t kTimeMax = 1.28E-5;
+  const Int_t    kTimeBins = 256;
+  const Double_t kTimePeak = 2.0E-6;
+  const Double_t kTimeRes = 1.5E-6;
+  const Int_t    kThreshold = 3;
+  const Int_t    kHighGainFactor = 40;
+  const Int_t    kHighGainOffset = 0x200;
+
+  AliAltroBuffer* buffer = NULL;
+  Int_t prevDDL = -1;
+  Int_t adcValuesLow[kTimeBins];
+  Int_t adcValuesHigh[kTimeBins];
+
+  // loop over digits (assume ordered digits)
+  for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
+    AliPHOSDigit* digit = (AliPHOSDigit*) digits->At(iDigit);
+    if (digit->GetAmp() < kThreshold) continue;
+    Int_t relId[4];
+    geom->AbsToRelNumbering(digit->GetId(), relId);
+    Int_t module = relId[0];
+    if (relId[1] != 0) continue;    // ignore digits from CPV
+    Int_t iDDL = 4 * (module - 1) + (4 * (relId[2] - 1)) / geom->GetNPhi();
+
+    // new DDL
+    if (iDDL != prevDDL) {
+      // write real header and close previous file
+      if (buffer) {
+       buffer->Flush();
+       buffer->WriteDataHeader(kFALSE, kFALSE);
+       delete buffer;
+      }
 
-  for( int i=0; i<rcgamma.recons_gammas_amount; i++ )
-  {
-//     new (GetGammasReconstructed().UncheckedAt(i) ) AliPHOSgamma;
-//     AliPHOSgamma &g = *(AliPHOSgamma*)(GetGammasReconstructed().UncheckedAt(i));
+      // open new file and write dummy header
+      char fileName[256];
+      sprintf(fileName, "PHOS_%d.ddl", iDDL + kDDLOffset); 
+      buffer = new AliAltroBuffer(fileName, 1);
+      buffer->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
 
-    AliPHOSgamma *gggg = new AliPHOSgamma;
-    if( NULL==gggg )
-    {
-      Error("Reconstruction","Can not create AliPHOSgamma");
-      exit(1);
+      prevDDL = iDDL;
     }
 
-    GetGammasReconstructed().Add(gggg);
-    AliPHOSgamma &g=*gggg;
-    
-    Float_t thetta, alpha, betta, R=fRadius+rcgamma.Zgdev[i]/10;
-
-    g.fX      = rcgamma.YW[i]/10;
-    g.fY      = rcgamma.XW[i]/10;
-    g.fE      = rcgamma.E [i];
-
-    thetta      = atan(g.fX/R);
-
-    alpha = atan(g.fY/R);
-    betta = fPhi/180*TMath::Pi() + alpha;
+    // out of time range signal (?)
+    if (digit->GetTime() > kTimeMax) {
+      buffer->FillBuffer(digit->GetAmp());
+      buffer->FillBuffer(kTimeBins);  // time bin
+      buffer->FillBuffer(3);          // bunch length
+      buffer->WriteTrailer(3, relId[3], relId[2], module);  // trailer
+      
+    // simulate linear rise and gaussian decay of signal
+    } else {
+      Bool_t highGain = kFALSE;
+
+      // fill time bin values
+      for (Int_t iTime = 0; iTime < kTimeBins; iTime++) {
+       Double_t time = iTime * kTimeMax/kTimeBins;
+       Int_t signal = 0;
+       if (time < digit->GetTime() + kTimePeak) {
+         signal = Int_t(0.5 + digit->GetAmp() * 
+                        (time - digit->GetTime()) / kTimePeak);
+       } else {
+         signal = Int_t(0.5 + digit->GetAmp() * 
+                 TMath::Gaus(time, digit->GetTime() + kTimePeak, kTimeRes));
+       }
+       if (signal < 0) signal = 0;
+       adcValuesLow[iTime] = signal;
+       if (signal > 0x3FF) adcValuesLow[iTime] = 0x3FF;
+       adcValuesHigh[iTime] = signal / kHighGainFactor;
+       if (adcValuesHigh[iTime] > 0) highGain = kTRUE;
+      }
 
-    g.fPx = g.fE * cos(thetta) * cos(betta);
-    g.fPy = g.fE * cos(thetta) * sin(betta);
-    g.fPz = g.fE * sin(thetta);
+      // write low and eventually high gain channel
+      buffer->WriteChannel(relId[3], relId[2], module, 
+                          kTimeBins, adcValuesLow, kThreshold);
+      if (highGain) {
+       buffer->WriteChannel(relId[3], relId[2], module + kHighGainOffset, 
+                            kTimeBins, adcValuesHigh, 1);
+      }
+    }
   }
-}
-
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-
-ClassImp(AliPHOSgamma)
-
-//______________________________________________________________________________
-
-void AliPHOSgamma::Print(Option_t *)
-{
-  float mass = fE*fE - fPx*fPx - fPy*fPy - fPz*fPz;
 
-  if( mass>=0 )
-    mass =  sqrt( mass);
-  else
-    mass = -sqrt(-mass);
-
-  printf("XY=(%+7.2f,%+7.2f)  (%+7.2f,%+7.2f,%+7.2f;%7.2f)  mass=%8.4f  Ipart=%2d\n",
-          fX,fY,fPx,fPy,fPz,fE,mass,fIpart);
-}
-
-//______________________________________________________________________________
+  // write real header and close last file
+  if (buffer) {
+    buffer->Flush();
+    buffer->WriteDataHeader(kFALSE, kFALSE);
+    delete buffer;
+  }
 
-AliPHOSgamma &AliPHOSgamma::operator=(const AliPHOSgamma &g)
-{
-  fX           = g.fX;
-  fY           = g.fY;
-  fE           = g.fE;
-  fPx          = g.fPx;
-  fPy          = g.fPy;
-  fPz          = g.fPz;
-  fIpart       = g.fIpart;
-
-  return *this;
+  fLoader->UnloadDigits();
 }
 
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-
-ClassImp(AliPHOShit)
-
-//______________________________________________________________________________
-
-AliPHOShit::AliPHOShit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits):
-AliHit(shunt, track)
-{
-   Int_t i;
-   for (i=0;i<5;i++) fVolume[i] = vol[i];
-   fX       = hits[0];
-   fY       = hits[1];
-   fZ       = hits[2];
-   fELOS    = hits[3];
-}
-//______________________________________________________________________________