]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOS.cxx
fixing wrong define
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.cxx
index 1705999b77b5b37dae3356c4f8da44c3ba6edffd..8aecbb2211ce001cd7e2982a2a8ae63935ff03ac 100644 (file)
-////////////////////////////////////////////////
-//  Manager and hits classes for set:PHOS     //
-////////////////////////////////////////////////
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+/* $Id$ */
+/* History of cvs commits:
+ *
+ * $Log$
+ * Revision 1.99  2006/06/28 11:36:09  cvetan
+ * New detector numbering scheme (common for DAQ/HLT/Offline). All the subdetectors shall use the AliDAQ class for the sim and rec of the raw data. The AliDAQ and raw reader classes now provide all the necessary interfaces to write and select the detector specific raw-data payload. Look into the AliDAQ.h and AliRawReader.h for more details.
+ *
+ * Revision 1.98  2006/05/11 11:30:48  cvetan
+ * Major changes in AliAltroBuffer. Now it can be used only for writing of raw data. All the corresponding read method are removed. It is based now on AliFstream in order to avoid endianess problems. The altro raw data is written always with little endian
+ *
+ * Revision 1.97  2006/04/22 10:30:17  hristov
+ * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
+ *
+ * Revision 1.96  2006/04/07 08:41:59  hristov
+ * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
+ *
+ * Revision 1.95  2006/03/14 19:40:41  kharlov
+ * Remove De-digitizing of raw data and digitizing the raw data fit
+ *
+ * Revision 1.94  2006/03/07 18:56:25  kharlov
+ * CDB is passed via environment variable
+ *
+ * Revision 1.93  2005/11/22 08:45:11  kharlov
+ * Calibration is read from CDB if any (Boris Polichtchouk)
+ *
+ * Revision 1.92  2005/11/03 13:09:19  hristov
+ * Removing meaningless const declarations (linuxicc)
+ *
+ * Revision 1.91  2005/07/27 15:08:53  kharlov
+ * Mixture ArCO2 is corrected
+ *
+ * Revision 1.90  2005/06/17 07:39:07  hristov
+ * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
+ *
+ * Revision 1.89  2005/05/28 12:10:07  schutz
+ * Copy constructor is corrected (by T.P.)
+ *
+ */
+
+//_________________________________________________________________________
+// 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) 
+//////////////////////////////////////////////////////////////////////////////
+
+
 // --- 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> 
+#include <TH1F.h> 
+#include <TF1.h> 
+#include <TRandom.h> 
 
 // --- Standard library ---
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
 
-// --- galice header files ---
+// --- AliRoot header files ---
+#include "AliMagF.h"
 #include "AliPHOS.h"
+#include "AliPHOSGetter.h"
 #include "AliRun.h"
-
-//______________________________________________________________________________
-
+#include "AliPHOSDigitizer.h"
+#include "AliPHOSSDigitizer.h"
+#include "AliPHOSDigit.h"
+#include "AliAltroBuffer.h"
+#include "AliLog.h"
+#include "AliCDBManager.h"
+#include "AliCDBEntry.h"
+#include "AliCDBStorage.h"
+#include "AliPHOSCalibData.h"
+#include "AliDAQ.h"
 
 ClassImp(AliPHOS)
 
-//______________________________________________________________________________
+Double_t AliPHOS::fgCapa        = 1.;        // 1pF 
+Int_t    AliPHOS::fgOrder       = 2 ;
+Double_t AliPHOS::fgTimeMax     = 2.56E-5 ;  // each sample is over 100 ns fTimeMax/fTimeBins
+Double_t AliPHOS::fgTimePeak    = 4.1E-6 ;   // 4 micro seconds
+Double_t AliPHOS::fgTimeTrigger = 100E-9 ;      // 100ns, just for a reference
 
-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;
+Double_t AliPHOS::fgHighCharge  = 8.2;       // adjusted for a high gain range of 5.12 GeV (10 bits)
+Double_t AliPHOS::fgHighGain    = 6.64;
+Double_t AliPHOS::fgHighLowGainFactor = 16.; // adjusted for a low gain range of 82 GeV (10 bits) 
 
-  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);
+  // Default ctor
+  fName   = "PHOS" ;
 
-  if( NULL==(fCradles=new TObjArray) ) {
-     Error("AliPHOS","Can not create fCradles");
-     exit(1);
-  }
-  DefPars();
-}
-
-//______________________________________________________________________________
-
-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
 }
-//___________________________________________
-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(TObject &obj)const
 {
-  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 by the cpy ctor
+  TObject::Copy(obj);
 }
 
-//______________________________________________________________________________
-
-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 ^
 
-//______________________________________________________________________________
+ // --- 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 ;
 
-void AliPHOS::SetTreeAddress(void)
-{
-// ROOT input initialization.
-//
-// AliDetector::SetTreeAddress()  is always called.
-//
-// If CradlesBranch_Bit is set (see AliPHOS::MakeBranch) than fTreePHOS is
-// initilized.
+  AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
 
-  AliDetector::SetTreeAddress();
+  // --- 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 ;
 
-  if( !TestBit(CradlesBranch_Bit) )
-    return;
+  AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
 
-  if( NULL==(fTreePHOS=(TTree*)gDirectory->Get((char*)(fTreeName.Data()))  ) )
-  {
-    Error("SetTreeAddress","Can not find Tree \"%s\"\n",fTreeName.Data());
-    exit(1);
-  }
+ // --- 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 ;
 
-  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);
-  }
+  AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
 
-  branch->SetAddress(&fCradles);
-}
+ // --- Silicon ---
+  AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
 
-//______________________________________________________________________________
 
-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.
 
-  for( int m=0; m<fCradles->GetEntries(); m++ )
-  {
-    AliPHOS *PHOS = (AliPHOS *)this;     // Removing 'const'...
-    AliPHOSCradle *cradle = (AliPHOSCradle *)PHOS->fCradles->operator[](m);
+  // --- 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 ;
 
-    float x,y,l;
-    const float d = cradle->GetRadius();
-    cradle->GetXY(p,v,d,x,y,l);
+  AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
 
-    if( l>0 && TMath::Abs(x)<cradle->GetNz  ()*cradle->GetCellSideSize()/2 
-            && TMath::Abs(y)<cradle->GetNphi()*cradle->GetCellSideSize()/2 )
-      return cradle;
-  }
+  // --- Textolith ---
+  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 ;
 
-  return NULL;
-}
+  AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
 
-//______________________________________________________________________________
+  //--- FR4  ---
+  Float_t aFR[4] = {16.0, 28.09, 12.011, 1.00794} ;
+  Float_t zFR[4] = {8.0, 14.0, 6.0, 1.0} ;
+  Float_t wFR[4] = {292.0, 68.0, 462.0, 736.0} ;
+  Float_t dFR = 1.8 ; 
 
-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.
+  AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
 
-  for( int i=0; i<fCradles->GetEntries(); i++ )
-    GetCradle(i).Reconstruction(signal_step,min_signal_reject);
-}
+  // --- 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::ResetDigits(void)
-{
-  AliDetector::ResetDigits();
+  // --- 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);
 
-  for( int i=0; i<fCradles->GetEntries(); i++ )
-    ((AliPHOSCradle*)(*fCradles)[i]) -> Clear();
-}
+  // --- 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::FinishEvent(void)
-{
-// Called at the end of each 'galice' event.
+  AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
 
-  if( NULL!=fTreePHOS )
-    fTreePHOS->Fill();
-}
+ // Ar
+  Float_t dAr = 0.001782 ; 
+  AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;   
+  // Ar+CO2 Mixture (80% / 20%)
+  Float_t arContent = 0.80 ;  // Ar-content of the ArCO2-mixture
+  Float_t aArCO[3]  = {39.948, 12.0, 16.0} ;
+  Float_t zArCO[3]  = {18.0  ,  6.0,  8.0} ;
+  Float_t wArCO[3];
+  wArCO[0] = arContent;
+  wArCO[1] = (1-arContent)*1;
+  wArCO[2] = (1-arContent)*2;
+  Float_t dArCO = arContent*dAr + (1-arContent)*dCO ;
+  AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO,  -3, wArCO) ;
 
-//______________________________________________________________________________
+  // --- Stainless steel (let it be pure iron) ---
+  AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
 
-void AliPHOS::FinishRun(void)
-{
-}
 
-//______________________________________________________________________________
+  // --- 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::Print(Option_t *opt)
-{
-// Print PHOS information.
-// For each AliPHOSCradle the function AliPHOSCradle::Print(opt) is called.
+  AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
 
-  AliPHOS &PHOS = *(AliPHOS *)this;     // Removing 'const'...
+  // --- Cables in Air box  ---
+  // SERVICES
 
-  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");
-  }
-}
+  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
 
-//______________________________________________________________________________
-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;
-}
+  AliMixture(19, "Cables  $", aCA, zCA, dCA, -4, wCA) ;
 
-//______________________________________________________________________________
-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;
-}
 
-//______________________________________________________________________________
-void AliPHOS::SetRadius(Float_t radius)
-{
-   PHOSradius=radius;
-}
+  // --- 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) ;
 
-//______________________________________________________________________________
-void AliPHOS::SetCradleSize(Int_t nz, Int_t nphi, Int_t ncradles)
-{
-   PHOSsize[0]=nz;
-   PHOSsize[1]=nphi;
-   PHOSsize[2]=ncradles;
-}
+  // DEFINITION OF THE TRACKING MEDIA
 
-//______________________________________________________________________________
-void AliPHOS::SetCradleA(Float_t angle)
-{
-   PHOScradlesA=angle;
-}
+  // 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() ;
 
-//______________________________________________________________________________
-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;
-}
+  // 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) ;
 
-//______________________________________________________________________________
-void AliPHOS::SetTextolitWall(Float_t dx, Float_t dy, Float_t dz)
-{
-   PHOSTXW[0] = dx;
-   PHOSTXW[1] = dy;
-   PHOSTXW[2] = dz;
-}
+  // 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) ;
 
-//______________________________________________________________________________
-void AliPHOS::SetInnerAir(Float_t dx, Float_t dy, Float_t dz)
-{
-   PHOSAIR[0] = dx;
-   PHOSAIR[1] = dy;
-   PHOSAIR[2] = dz;
-}
+  // 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 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;
-}
+  // 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) ;
 
-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);
-}
+  // 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) ;
 
-//______________________________________________________________________________
+  // 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) ;
 
-AliPHOSCradle::~AliPHOSCradle(void)        // 28.12.1998
-{
-  fGammasReconstructed.Delete();
-  fParticles          .Delete();
-}
+  // 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) ;
 
-//______________________________________________________________________________
+ // 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) ;
 
-void AliPHOSCradle::Clear(Option_t *)
-{
-// Clear digit. information.
+  // 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) ;
 
-  fCellEnergy              .Reset();
-  fChargedTracksInPIN      .Reset();
-  GetParticles()           .Delete();
-  GetParticles()           .Compress();
-  GetGammasReconstructed() .Delete();
-  GetGammasReconstructed() .Compress();
+  // 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) ; 
 
-}
 
-//______________________________________________________________________________
+  // 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) ;
 
-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;
-}
+  // Copper                                                                         -> idtmed[710]
+  AliMedium(11, "Copper     $", 11, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
 
-//______________________________________________________________________________
+  // 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) ;
 
-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 Lead                                                                       -> idtmed[712]
+  AliMedium(13, "Lead      $", 13, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 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 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) ;
 
-  if( NULL!=strchr(opt,'p') )
-  {
-    printf("Amount of reconstructed gammas is %d\n",
-         ((AliPHOSCradle*)this)->GetGammasReconstructed().GetEntries());
+  // Fibergalss                                                                     -> idtmed[717]
+  AliMedium(18, "Fiberglass$", 18, 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();
-  }
-}
+  // Cables in air                                                                  -> idtmed[718]
+  AliMedium(19, "Cables    $", 19, 0,
+            isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
 
-//______________________________________________________________________________
+  // Air                                                                            -> idtmed[798] 
+  AliMedium(99, "Air          $", 99, 0,
+            isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 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. 
+  // --- Set decent energy thresholds for gamma and electron tracking
 
-  //////////////////////////////////
-  // Testing the histograms size. //
-  //////////////////////////////////
+  // 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::Digits2Raw()
+{
+// convert digits of the current event to raw data
   
-  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);
-  }
+  AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ; 
 
-  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);
-  }
+  // get the digits
+  loader->LoadDigits();
+  TClonesArray* digits = loader->Digits() ;
 
-  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);
-  }
-
-  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);
+  if (!digits) {
+    AliError(Form("No digits found !"));
+    return;
   }
 
-  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);
+  // get the geometry
+  AliPHOSGeometry* geom = GetGeometry();
+  if (!geom) {
+    AliError(Form("No geometry found !"));
+    return;
   }
 
-  ////////////////////
-  // Do distortion! //
-  ////////////////////
-
-  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;
-
-      if( NULL!=Stochastic )
-        E_new   = r.Gaus(E_old,sqrt(E_old)*GetDistortedValue(Stochastic,n));
+  // some digitization constants
+//   const Int_t    kThreshold = 1; // skip digits below this threshold // YVK
+  const Float_t    kThreshold = 0.001; // skip digits below 1 MeV
+  const Int_t      kAdcThreshold = 1;  // Lower ADC threshold to write to raw data
+
+  AliAltroBuffer* buffer = NULL;
+  Int_t prevDDL = -1;
+  Int_t adcValuesLow[fkTimeBins];
+  Int_t adcValuesHigh[fkTimeBins];
+
+  // loop over digits (assume ordered digits)
+  for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
+    AliPHOSDigit* digit = dynamic_cast<AliPHOSDigit *>(digits->At(iDigit)) ;
+    if (digit->GetEnergy() < kThreshold) 
+      continue;
+    Int_t relId[4];
+    geom->AbsToRelNumbering(digit->GetId(), relId);
+    Int_t module = relId[0];
+   // Begin FIXME 
+    if (relId[1] != 0) 
+      continue;    // ignore digits from CPV
+   // End FIXME 
+
+    // PHOS EMCA has 4 DDL per module. Splitting is done based on the row number
+    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;
+      }
 
-      if( NULL!=Calibration )
-        E_new  *=  GetDistortedValue(Calibration,n);
+      // open new file and write dummy header
+      TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
+      buffer = new AliAltroBuffer(fileName.Data());
+      buffer->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
 
-      if( NULL!=Noise )
-        E_new  +=  GetDistortedValue(Noise,n);
+      prevDDL = iDDL;
+    }
 
-      fCellEnergy.SetBinContent(n,E_new);
+    // out of time range signal (?)
+    if (digit->GetTimeR() > GetRawFormatTimeMax() ) {
+      buffer->FillBuffer((Int_t)digit->GetEnergy());
+      buffer->FillBuffer(GetRawFormatTimeBins() );  // time bin
+      buffer->FillBuffer(3);          // bunch length      
+      buffer->WriteTrailer(3, relId[3], relId[2], module);  // trailer
+      
+    // calculate the time response function
+    } else {
+      Double_t energy = 0 ;
+      Int_t   module = relId[0];
+      if ( digit->GetId() <= geom->GetNModules() *  geom->GetNCristalsInModule()) {
+       energy=digit->GetEnergy();
+      }
+      else {
+//     energy = digit->GetAmp()*digitizer->GetCPVchannel()+digitizer->GetCPVpedestal();
+       energy = 0; // CPV raw data format is now know yet
+      }        
+      Bool_t lowgain = RawSampledResponse(digit->GetTimeR(), energy, adcValuesHigh, adcValuesLow) ; 
+      
+      if (lowgain) 
+       buffer->WriteChannel(relId[3], relId[2], module + GetGeometry()->GetNModules() + 1, 
+                            GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
+      else 
+       buffer->WriteChannel(relId[3], relId[2], module, 
+                            GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
+      
     }
+  }
+  
+  // write real header and close last file
+  if (buffer) {
+    buffer->Flush();
+    buffer->WriteDataHeader(kFALSE, kFALSE);
+    delete buffer;
+  }
+  
+  loader->UnloadDigits();
 }
 
-////////////////////////////////////////////////////////////////////////////////
-
-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)
-{
-// 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.
-
-  TH2F *h = new TH2F( name,title, Nx,1,Nx, Ny,1,Ny );
-  if( h==NULL )
-  {
-    Error("CreateHistForDistortion","Can not create the histogram");
-    exit(1);
-  }
-  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));
-    }
+//____________________________________________________________________________
+void AliPHOS::Hits2SDigits()  
+{ 
+// create summable digits
 
-  return h;
+  AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
+  phosDigitizer.SetEventRange(0, -1) ; // do all the events
+  phosDigitizer.ExecuteTask("all") ; 
 }
 
-////////////////////////////////////////////////////////////////////////////////
+//____________________________________________________________________________
+AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
+{
+//different behaviour than standard (singleton getter)
+// --> to be discussed and made eventually coherent
+ fLoader = new AliPHOSLoader(GetName(),topfoldername);
+ return fLoader;
+}
 
-Float_t AliPHOSCradle::GetDistortedValue(const TH2F *h, UInt_t n)
+//__________________________________________________________________
+Double_t AliPHOS::RawResponseFunction(Double_t *x, Double_t *par) 
 {
-  return r.Gaus(((TH2F*)h)->GetBinContent(n),n);
+  // Shape of the electronics raw reponse:
+  // It is a semi-gaussian, 2nd order Gamma function of the general form
+  // v(t) = n**n * Q * A**n / C *(t/tp)**n * exp(-n * t/tp) with 
+  // tp : peaking time par[0]
+  // n  : order of the function
+  // C  : integrating capacitor in the preamplifier
+  // A  : open loop gain of the preamplifier
+  // Q  : the total APD charge to be measured Q = C * energy
+  
+  Double_t signal ;
+  Double_t xx = x[0] - ( fgTimeTrigger + par[3] ) ; 
+
+  if (xx < 0 || xx > fgTimeMax) 
+    signal = 0. ;  
+  else { 
+    Double_t fac = par[0] * TMath::Power(fgOrder, fgOrder) * TMath::Power(par[1], fgOrder) / fgCapa ; 
+    signal = fac * par[2] * TMath::Power(xx / fgTimePeak, fgOrder) * TMath::Exp(-fgOrder * (xx / fgTimePeak)) ; 
+  }
+  return signal ;  
 }
 
-////////////////////////////////////////////////////////////////////////////////
-//______________________________________________________________________________
+//__________________________________________________________________
+Double_t AliPHOS::RawResponseFunctionMax(Double_t charge, Double_t gain) 
+{
+  return ( charge * TMath::Power(fgOrder, fgOrder) * TMath::Power(gain, fgOrder) 
+     / ( fgCapa * TMath::Exp(fgOrder) ) );  
 
-#ifdef WIN32
-  #define common_for_event_storing COMMON_FOR_EVENT_STORING
-#else
-  #define common_for_event_storing common_for_event_storing_
-#endif
+}
 
-extern "C" struct
+//__________________________________________________________________
+Bool_t AliPHOS::RawSampledResponse(Double_t dtime, Double_t damp, Int_t * adcH, Int_t * adcL) const 
 {
-  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
-
-  GetGammasReconstructed().Delete();
-  GetGammasReconstructed().Compress();
+  // for a start time dtime and an amplitude damp given by digit, 
+  // calculates the raw sampled response AliPHOS::RawResponseFunction
+  // Input: dtime - signal start time
+  //        damp  - signal amplitude (energy)
+  // Output: adcH - array[fkTimeBins] of 10-bit samples for high-gain channel
+  //         adcL - array[fkTimeBins] of 10-bit samples for low-gain channel
 
-  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.
+  const Int_t kRawSignalOverflow = 0x3FF ; 
+  Bool_t lowGain = kFALSE ; 
 
-  for( int i=0; i<rcgamma.recons_gammas_amount; i++ )
-  {
-//     new (GetGammasReconstructed().UncheckedAt(i) ) AliPHOSgamma;
-//     AliPHOSgamma &g = *(AliPHOSgamma*)(GetGammasReconstructed().UncheckedAt(i));
+  TF1 signalF("signal", RawResponseFunction, 0, GetRawFormatTimeMax(), 4);
 
-    AliPHOSgamma *gggg = new AliPHOSgamma;
-    if( NULL==gggg )
-    {
-      Error("Reconstruction","Can not create AliPHOSgamma");
-      exit(1);
+  for (Int_t iTime = 0; iTime < GetRawFormatTimeBins(); iTime++) {
+    signalF.SetParameter(0, GetRawFormatHighCharge() ) ; 
+    signalF.SetParameter(1, GetRawFormatHighGain() ) ; 
+    signalF.SetParameter(2, damp) ; 
+    signalF.SetParameter(3, dtime) ; 
+    Double_t time = iTime * GetRawFormatTimeMax() / GetRawFormatTimeBins() ;
+    Double_t signal = signalF.Eval(time) ;     
+    if ( static_cast<Int_t>(signal+0.5) > kRawSignalOverflow ){  // larger than 10 bits 
+      signal = kRawSignalOverflow ;
+      lowGain = kTRUE ; 
     }
+    adcH[iTime] =  static_cast<Int_t>(signal + 0.5) ;
 
-    GetGammasReconstructed().Add(gggg);
-    AliPHOSgamma &g=*gggg;
-    
-    Float_t thetta, alpha, betta, R=fRadius+rcgamma.Zgdev[i]/10;
+    signalF.SetParameter(0, GetRawFormatLowCharge() ) ;     
+    signalF.SetParameter(1, GetRawFormatLowGain() ) ; 
+    signal = signalF.Eval(time) ;  
+    if ( static_cast<Int_t>(signal+0.5) > kRawSignalOverflow)  // larger than 10 bits 
+      signal = kRawSignalOverflow ;
+    adcL[iTime] = static_cast<Int_t>(0.5 + signal ) ; 
 
-    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;
-
-    g.fPx = g.fE * cos(thetta) * cos(betta);
-    g.fPy = g.fE * cos(thetta) * sin(betta);
-    g.fPz = g.fE * sin(thetta);
   }
+  return lowGain ; 
 }
 
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-
-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);
-}
-
-//______________________________________________________________________________
-
-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;
+//____________________________________________________________________________
+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);
+       //AliInfo(Form("<%s> Setting Hits Address",GetName()));
+       branch->SetAddress(&fHits);
+     }
+  }
 }
 
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-
-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];
-}
-//______________________________________________________________________________