ROOT logo
/**************************************************************************
 * 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.116  2007/10/10 09:05:10  schutz
 * Changing name QualAss to QA
 *
 * Revision 1.115  2007/08/22 09:20:50  hristov
 * Updated QA classes (Yves)
 *
 * Revision 1.114  2007/08/07 14:12:03  kharlov
 * Quality assurance added (Yves Schutz)
 *
 * Revision 1.113  2007/07/18 16:29:54  policheh
 * Raw Sdigits energy converted to GeV.
 *
 * Revision 1.112  2007/02/25 22:59:13  policheh
 * Digits2Raw(): ALTRO buffer and mapping created per each DDL.
 *
 * Revision 1.111  2007/02/18 15:21:47  kharlov
 * Corrections for memory leak in Digits2Raw due to AliAltroMapping
 *
 * Revision 1.110  2007/02/13 10:52:08  policheh
 * Raw2SDigits() implemented
 *
 * Revision 1.109  2007/02/05 10:43:25  hristov
 * Changes for correct initialization of Geant4 (Mihaela)
 *
 * Revision 1.108  2007/02/01 10:34:47  hristov
 * Removing warnings on Solaris x86
 *
 * Revision 1.107  2007/01/29 16:29:37  kharlov
 * Digits2Raw(): special workaround for digits with time out of range
 *
 * Revision 1.106  2007/01/17 17:28:56  kharlov
 * Extract ALTRO sample generation to a separate class AliPHOSPulseGenerator
 *
 * Revision 1.105  2007/01/12 21:44:29  kharlov
 * Simulate and reconstruct two gains simulaneouslsy
 */

//_________________________________________________________________________
// 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 ---
class TFile;
#include <TF1.h> 
#include <TFolder.h> 
#include <TGeoGlobalMagField.h>
#include <TH1F.h> 
#include <TRandom.h> 
#include <TTree.h>
#include <TVirtualMC.h> 

// --- Standard library ---

// --- AliRoot header files ---
#include "AliMagF.h"
#include "AliPHOS.h"
#include "AliPHOSLoader.h"
#include "AliRun.h"
#include "AliRawReader.h"
#include "AliPHOSDigitizer.h"
#include "AliPHOSSDigitizer.h"
#include "AliPHOSDigit.h"
#include "AliAltroBuffer.h"
#include "AliAltroMapping.h"
#include "AliCaloAltroMapping.h"
#include "AliLog.h"
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliCDBStorage.h"
#include "AliPHOSCalibData.h"
#include "AliPHOSPulseGenerator.h"
#include "AliDAQ.h"
#include "AliPHOSRawFitterv0.h"
#include "AliPHOSCalibData.h"
#include "AliPHOSRawDigiProducer.h"
#include "AliPHOSQAChecker.h"
#include "AliPHOSRecoParam.h"
#include "AliPHOSSimParam.h"

ClassImp(AliPHOS)

//____________________________________________________________________________
  AliPHOS:: AliPHOS() : AliDetector(),fgCalibData(0)
{
  // Default ctor
  fName   = "PHOS" ;

}

//____________________________________________________________________________
AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title),
fgCalibData(0)
{
  //   ctor : title is used to identify the layout
}

//____________________________________________________________________________
AliPHOS::~AliPHOS() 
{  
  if(fgCalibData) delete fgCalibData ;
}

//____________________________________________________________________________
AliDigitizer* AliPHOS::CreateDigitizer(AliDigitizationInput* digInput) const
{
  return new AliPHOSDigitizer(digInput);
}

//____________________________________________________________________________
void AliPHOS::CreateMaterials()
{
  // Definitions of materials to build PHOS and associated tracking media.
  // media number in idtmed are 699 to 798.

  // --- 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 ;

  AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;


  // --- 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 ;

  AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;

  // --- 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 ;

  AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;

  // --- 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 ;

  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 ;

  AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);

 // --- Silicon ---
  AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;



  // --- 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) ;

  // --- 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 ;

  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 ; 

  AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;

  // --- 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) ;

  // --- 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);

  // --- 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 ; 

  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) ;   
 
  // 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) ;


  // --- 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 ;

  AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;

  // --- Cables in Air box  ---
  // SERVICES

  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

  AliMixture(19, "Cables  $", aCA, zCA, dCA, -4, wCA) ;


  // --- 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

  // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
  Int_t   isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ() ;
  Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max() ;

  // 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) ;

  // 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) ;

  // 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) ;

  // 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) ;

  // 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) ; 


  // 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) ;

  // 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) ;

  // The Lead                                                                       -> idtmed[712]
 
  AliMedium(13, "Lead      $", 13, 0,
	     isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;

  // 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) ;

  // Fibergalss                                                                     -> idtmed[717]
  AliMedium(18, "Fiberglass$", 18, 0,
	     isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;

  // 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 AliPHOS::Init()
{
}

//____________________________________________________________________________
void AliPHOS::Digits2Raw()
{
// convert digits of the current event to raw data
  
  if(AliPHOSSimParam::GetInstance()->IsEDigitizationOn()){
    AliError("Energy digitization should be OFF if use Digits2Raw") ;
  }

  AliPHOSLoader * loader = static_cast<AliPHOSLoader*>(fLoader) ; 

  // get the digits
  loader->LoadDigits();
  TClonesArray* digits = loader->Digits() ;

  if (!digits) {
    AliError(Form("No digits found !"));
    return;
  }

  // get the geometry
  AliPHOSGeometry* geom = GetGeometry();
  if (!geom) {
    AliError(Form("No geometry found !"));
    return;
  }

  // get mapping from OCDB
  const TObjArray* maps = AliPHOSRecoParam::GetMappings();
  if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!");

  // some digitization constants
  const Float_t    kThreshold = 1.; // skip digits below 1 ADC channel
  const Int_t      kAdcThreshold = 1;  // Lower ADC threshold to write to raw data

  Int_t prevDDL = -1;

  if(fgCalibData==0)
    fgCalibData= new AliPHOSCalibData(-1) ;

  // Create a shaper pulse object
  AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();

  //Set Time step of sample
  pulse->SetTimeStep(TMath::Abs(fgCalibData->GetSampleTimeStep())) ;
  
  Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
  Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
  
  const Int_t maxDDL = 20;
  AliAltroBuffer  *buffer[maxDDL];
  AliAltroMapping *mapping[maxDDL];

  for(Int_t jDDL=0; jDDL<maxDDL; jDDL++) {
    buffer[jDDL]=0;
    mapping[jDDL]=0;
  }

  //!!!!for debug!!!
  Int_t modMax=-111;
  Int_t colMax=-111;
  Int_t rowMax=-111;
  Float_t eMax=-333;
  //!!!for debug!!!

  // loop over digits (assume ordered digits)
  for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
    AliPHOSDigit* digit = static_cast<AliPHOSDigit *>(digits->At(iDigit)) ;

    // Skip small energy below treshold
    if (digit->GetEnergy() < kThreshold) 
      continue;

    Int_t relId[4];
    geom->AbsToRelNumbering(digit->GetId(), relId);
    Int_t module = 5-relId[0];
 
    // Begin FIXME 
    if (relId[1] != 0) 
      continue;    // ignore digits from CPV
    // End FIXME 

    Int_t row = relId[2]-1;
    Int_t col = relId[3]-1;
    
    Int_t iRCU = -111;
    
    //RCU0
    if(0<=row&&row<16 && 0<=col&&col<56) iRCU=0;
    
    //RCU1
    if(16<=row&&row<32 && 0<=col&&col<56) iRCU=1;

    //RCU2
    if(32<=row&&row<48 && 0<=col&&col<56) iRCU=2;

    //RCU3
    if(48<=row&&row<64 && 0<=col&&col<56) iRCU=3;
    
    
    // PHOS EMCA has 4 DDL per module. Splitting is based on the (row,column) numbers.
    // here module already in PHOS online convention: 0<module<4 and inverse order.
    Int_t iDDL = 4 * module  + iRCU;

    // new DDL
    if (iDDL != prevDDL) {
      if (buffer[iDDL] == 0) {
	// open new file and write dummy header
	TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);

	mapping[iDDL] = (AliAltroMapping*)maps->At(iDDL);
	buffer[iDDL]  = new AliAltroBuffer(fileName.Data(),mapping[iDDL]);
	buffer[iDDL]->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
      }
      prevDDL = iDDL;
    }

    AliDebug(2,Form("digit E=%.4f GeV, t=%g s, (mod,col,row)=(%d,%d,%d)\n",
		    digit->GetEnergy(),digit->GetTimeR(),
		    relId[0]-1,relId[3]-1,relId[2]-1));
    // if a signal is out of time range, write only trailer
    if (digit->GetTimeR() > pulse->GetRawFormatTimeMax()*0.5 ) {
      AliDebug(2,"Signal is out of time range.\n");
      buffer[iDDL]->FillBuffer(0);
      buffer[iDDL]->FillBuffer(pulse->GetRawFormatTimeBins() );  // time bin
      buffer[iDDL]->FillBuffer(3);                               // bunch length
      buffer[iDDL]->WriteTrailer(3, relId[3]-1, relId[2]-1, 0);  // trailer
      
    // calculate the time response function
    } else {
      Double_t energy = 0 ;
      if (digit->GetId() <= geom->GetNModules() * geom->GetNCristalsInModule()) {
	energy=digit->GetEnergy();
	if(energy>eMax) {eMax=energy; modMax=relId[0]; colMax=col; rowMax=row;}
      }
      else {
 	energy = 0; // CPV raw data format is now know yet
      }
      pulse->SetAmplitude(energy);
      pulse->SetTZero(digit->GetTimeR());
      Double_t r =fgCalibData->GetHighLowRatioEmc(relId[0],relId[3],relId[2]) ;
      pulse->SetHG2LGRatio(r) ;
      pulse->MakeSamples();
      pulse->GetSamples(adcValuesHigh, adcValuesLow) ; 

      buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 0, 
			   pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
      buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 1, 
			   pulse->GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
    }
  }
  delete [] adcValuesLow;
  delete [] adcValuesHigh;

  // write real header and close last file
  for (Int_t iDDL=0; iDDL<maxDDL; iDDL++) {
    if (buffer[iDDL]) {
      buffer[iDDL]->Flush();
      buffer[iDDL]->WriteDataHeader(kFALSE, kFALSE);
      delete buffer[iDDL];
      //if (mapping[iDDL]) delete mapping[iDDL];
    }
  }
  
  AliDebug(1,Form("Digit with max. energy:  modMax %d colMax %d rowMax %d  eMax %f\n",
	 modMax,colMax,rowMax,eMax));

  delete pulse;
  loader->UnloadDigits();
}

//____________________________________________________________________________
void AliPHOS::Hits2SDigits()  
{ 
// create summable digits

  AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
  phosDigitizer.SetEventRange(0, -1) ; // do all the events
 
  phosDigitizer.Digitize("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;
}

//____________________________________________________________________________
void AliPHOS::SetTreeAddress()
{ 
  // Links Hits in the Tree to Hits array
  TBranch *branch;
  char branchname[20];
  snprintf(branchname,20,"%s",GetName());
  // Branch address for hit tree
    TTree *treeH = fLoader->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);
     }
  }
}

//____________________________________________________________________________ 	 
Bool_t AliPHOS::Raw2SDigits(AliRawReader* rawReader) 	 
{ 	 
	  	 
  AliPHOSLoader * loader = static_cast<AliPHOSLoader*>(fLoader) ; 	 
	  	 
  TTree * tree = 0 ; 	 
  tree = loader->TreeS() ; 	 
  if ( !tree ) { 	 
    loader->MakeTree("S"); 	 
    tree = loader->TreeS() ; 	 
  } 	 
	  	 
  TClonesArray * sdigits = loader->SDigits() ; 	 
  if(!sdigits) { 	 
    loader->MakeSDigitsArray(); 	 
    sdigits = loader->SDigits(); 	 
  } 	 
  sdigits->Clear(); 	 
	  	 
  rawReader->Reset() ;

  const TObjArray* maps = AliPHOSRecoParam::GetMappings();
  if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!");

  AliAltroMapping *mapping[20];
  for(Int_t i = 0; i < 20; i++) {
    mapping[i] = (AliAltroMapping*)maps->At(i);
  }

  AliPHOSRawFitterv0 fitter;

  fitter.SubtractPedestals(AliPHOSSimParam::GetInstance()->EMCSubtractPedestals());
  fitter.SetAmpOffset(AliPHOSSimParam::GetInstance()->GetGlobalAltroOffset());
  fitter.SetAmpThreshold(AliPHOSSimParam::GetInstance()->GetGlobalAltroThreshold());

  AliPHOSRawDigiProducer pr(rawReader,mapping);
  pr.SetSampleQualityCut(AliPHOSSimParam::GetInstance()->GetEMCSampleQualityCut()); 	 
  pr.MakeDigits(sdigits,&fitter);
	  	 
  Int_t bufferSize = 32000 ; 	 
  // TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize); 	 
  tree->Branch("PHOS",&sdigits,bufferSize); 	 
  tree->Fill(); 	 
	  	 
  fLoader->WriteSDigits("OVERWRITE"); 	 
  return kTRUE; 	 
  
}
 AliPHOS.cxx:1
 AliPHOS.cxx:2
 AliPHOS.cxx:3
 AliPHOS.cxx:4
 AliPHOS.cxx:5
 AliPHOS.cxx:6
 AliPHOS.cxx:7
 AliPHOS.cxx:8
 AliPHOS.cxx:9
 AliPHOS.cxx:10
 AliPHOS.cxx:11
 AliPHOS.cxx:12
 AliPHOS.cxx:13
 AliPHOS.cxx:14
 AliPHOS.cxx:15
 AliPHOS.cxx:16
 AliPHOS.cxx:17
 AliPHOS.cxx:18
 AliPHOS.cxx:19
 AliPHOS.cxx:20
 AliPHOS.cxx:21
 AliPHOS.cxx:22
 AliPHOS.cxx:23
 AliPHOS.cxx:24
 AliPHOS.cxx:25
 AliPHOS.cxx:26
 AliPHOS.cxx:27
 AliPHOS.cxx:28
 AliPHOS.cxx:29
 AliPHOS.cxx:30
 AliPHOS.cxx:31
 AliPHOS.cxx:32
 AliPHOS.cxx:33
 AliPHOS.cxx:34
 AliPHOS.cxx:35
 AliPHOS.cxx:36
 AliPHOS.cxx:37
 AliPHOS.cxx:38
 AliPHOS.cxx:39
 AliPHOS.cxx:40
 AliPHOS.cxx:41
 AliPHOS.cxx:42
 AliPHOS.cxx:43
 AliPHOS.cxx:44
 AliPHOS.cxx:45
 AliPHOS.cxx:46
 AliPHOS.cxx:47
 AliPHOS.cxx:48
 AliPHOS.cxx:49
 AliPHOS.cxx:50
 AliPHOS.cxx:51
 AliPHOS.cxx:52
 AliPHOS.cxx:53
 AliPHOS.cxx:54
 AliPHOS.cxx:55
 AliPHOS.cxx:56
 AliPHOS.cxx:57
 AliPHOS.cxx:58
 AliPHOS.cxx:59
 AliPHOS.cxx:60
 AliPHOS.cxx:61
 AliPHOS.cxx:62
 AliPHOS.cxx:63
 AliPHOS.cxx:64
 AliPHOS.cxx:65
 AliPHOS.cxx:66
 AliPHOS.cxx:67
 AliPHOS.cxx:68
 AliPHOS.cxx:69
 AliPHOS.cxx:70
 AliPHOS.cxx:71
 AliPHOS.cxx:72
 AliPHOS.cxx:73
 AliPHOS.cxx:74
 AliPHOS.cxx:75
 AliPHOS.cxx:76
 AliPHOS.cxx:77
 AliPHOS.cxx:78
 AliPHOS.cxx:79
 AliPHOS.cxx:80
 AliPHOS.cxx:81
 AliPHOS.cxx:82
 AliPHOS.cxx:83
 AliPHOS.cxx:84
 AliPHOS.cxx:85
 AliPHOS.cxx:86
 AliPHOS.cxx:87
 AliPHOS.cxx:88
 AliPHOS.cxx:89
 AliPHOS.cxx:90
 AliPHOS.cxx:91
 AliPHOS.cxx:92
 AliPHOS.cxx:93
 AliPHOS.cxx:94
 AliPHOS.cxx:95
 AliPHOS.cxx:96
 AliPHOS.cxx:97
 AliPHOS.cxx:98
 AliPHOS.cxx:99
 AliPHOS.cxx:100
 AliPHOS.cxx:101
 AliPHOS.cxx:102
 AliPHOS.cxx:103
 AliPHOS.cxx:104
 AliPHOS.cxx:105
 AliPHOS.cxx:106
 AliPHOS.cxx:107
 AliPHOS.cxx:108
 AliPHOS.cxx:109
 AliPHOS.cxx:110
 AliPHOS.cxx:111
 AliPHOS.cxx:112
 AliPHOS.cxx:113
 AliPHOS.cxx:114
 AliPHOS.cxx:115
 AliPHOS.cxx:116
 AliPHOS.cxx:117
 AliPHOS.cxx:118
 AliPHOS.cxx:119
 AliPHOS.cxx:120
 AliPHOS.cxx:121
 AliPHOS.cxx:122
 AliPHOS.cxx:123
 AliPHOS.cxx:124
 AliPHOS.cxx:125
 AliPHOS.cxx:126
 AliPHOS.cxx:127
 AliPHOS.cxx:128
 AliPHOS.cxx:129
 AliPHOS.cxx:130
 AliPHOS.cxx:131
 AliPHOS.cxx:132
 AliPHOS.cxx:133
 AliPHOS.cxx:134
 AliPHOS.cxx:135
 AliPHOS.cxx:136
 AliPHOS.cxx:137
 AliPHOS.cxx:138
 AliPHOS.cxx:139
 AliPHOS.cxx:140
 AliPHOS.cxx:141
 AliPHOS.cxx:142
 AliPHOS.cxx:143
 AliPHOS.cxx:144
 AliPHOS.cxx:145
 AliPHOS.cxx:146
 AliPHOS.cxx:147
 AliPHOS.cxx:148
 AliPHOS.cxx:149
 AliPHOS.cxx:150
 AliPHOS.cxx:151
 AliPHOS.cxx:152
 AliPHOS.cxx:153
 AliPHOS.cxx:154
 AliPHOS.cxx:155
 AliPHOS.cxx:156
 AliPHOS.cxx:157
 AliPHOS.cxx:158
 AliPHOS.cxx:159
 AliPHOS.cxx:160
 AliPHOS.cxx:161
 AliPHOS.cxx:162
 AliPHOS.cxx:163
 AliPHOS.cxx:164
 AliPHOS.cxx:165
 AliPHOS.cxx:166
 AliPHOS.cxx:167
 AliPHOS.cxx:168
 AliPHOS.cxx:169
 AliPHOS.cxx:170
 AliPHOS.cxx:171
 AliPHOS.cxx:172
 AliPHOS.cxx:173
 AliPHOS.cxx:174
 AliPHOS.cxx:175
 AliPHOS.cxx:176
 AliPHOS.cxx:177
 AliPHOS.cxx:178
 AliPHOS.cxx:179
 AliPHOS.cxx:180
 AliPHOS.cxx:181
 AliPHOS.cxx:182
 AliPHOS.cxx:183
 AliPHOS.cxx:184
 AliPHOS.cxx:185
 AliPHOS.cxx:186
 AliPHOS.cxx:187
 AliPHOS.cxx:188
 AliPHOS.cxx:189
 AliPHOS.cxx:190
 AliPHOS.cxx:191
 AliPHOS.cxx:192
 AliPHOS.cxx:193
 AliPHOS.cxx:194
 AliPHOS.cxx:195
 AliPHOS.cxx:196
 AliPHOS.cxx:197
 AliPHOS.cxx:198
 AliPHOS.cxx:199
 AliPHOS.cxx:200
 AliPHOS.cxx:201
 AliPHOS.cxx:202
 AliPHOS.cxx:203
 AliPHOS.cxx:204
 AliPHOS.cxx:205
 AliPHOS.cxx:206
 AliPHOS.cxx:207
 AliPHOS.cxx:208
 AliPHOS.cxx:209
 AliPHOS.cxx:210
 AliPHOS.cxx:211
 AliPHOS.cxx:212
 AliPHOS.cxx:213
 AliPHOS.cxx:214
 AliPHOS.cxx:215
 AliPHOS.cxx:216
 AliPHOS.cxx:217
 AliPHOS.cxx:218
 AliPHOS.cxx:219
 AliPHOS.cxx:220
 AliPHOS.cxx:221
 AliPHOS.cxx:222
 AliPHOS.cxx:223
 AliPHOS.cxx:224
 AliPHOS.cxx:225
 AliPHOS.cxx:226
 AliPHOS.cxx:227
 AliPHOS.cxx:228
 AliPHOS.cxx:229
 AliPHOS.cxx:230
 AliPHOS.cxx:231
 AliPHOS.cxx:232
 AliPHOS.cxx:233
 AliPHOS.cxx:234
 AliPHOS.cxx:235
 AliPHOS.cxx:236
 AliPHOS.cxx:237
 AliPHOS.cxx:238
 AliPHOS.cxx:239
 AliPHOS.cxx:240
 AliPHOS.cxx:241
 AliPHOS.cxx:242
 AliPHOS.cxx:243
 AliPHOS.cxx:244
 AliPHOS.cxx:245
 AliPHOS.cxx:246
 AliPHOS.cxx:247
 AliPHOS.cxx:248
 AliPHOS.cxx:249
 AliPHOS.cxx:250
 AliPHOS.cxx:251
 AliPHOS.cxx:252
 AliPHOS.cxx:253
 AliPHOS.cxx:254
 AliPHOS.cxx:255
 AliPHOS.cxx:256
 AliPHOS.cxx:257
 AliPHOS.cxx:258
 AliPHOS.cxx:259
 AliPHOS.cxx:260
 AliPHOS.cxx:261
 AliPHOS.cxx:262
 AliPHOS.cxx:263
 AliPHOS.cxx:264
 AliPHOS.cxx:265
 AliPHOS.cxx:266
 AliPHOS.cxx:267
 AliPHOS.cxx:268
 AliPHOS.cxx:269
 AliPHOS.cxx:270
 AliPHOS.cxx:271
 AliPHOS.cxx:272
 AliPHOS.cxx:273
 AliPHOS.cxx:274
 AliPHOS.cxx:275
 AliPHOS.cxx:276
 AliPHOS.cxx:277
 AliPHOS.cxx:278
 AliPHOS.cxx:279
 AliPHOS.cxx:280
 AliPHOS.cxx:281
 AliPHOS.cxx:282
 AliPHOS.cxx:283
 AliPHOS.cxx:284
 AliPHOS.cxx:285
 AliPHOS.cxx:286
 AliPHOS.cxx:287
 AliPHOS.cxx:288
 AliPHOS.cxx:289
 AliPHOS.cxx:290
 AliPHOS.cxx:291
 AliPHOS.cxx:292
 AliPHOS.cxx:293
 AliPHOS.cxx:294
 AliPHOS.cxx:295
 AliPHOS.cxx:296
 AliPHOS.cxx:297
 AliPHOS.cxx:298
 AliPHOS.cxx:299
 AliPHOS.cxx:300
 AliPHOS.cxx:301
 AliPHOS.cxx:302
 AliPHOS.cxx:303
 AliPHOS.cxx:304
 AliPHOS.cxx:305
 AliPHOS.cxx:306
 AliPHOS.cxx:307
 AliPHOS.cxx:308
 AliPHOS.cxx:309
 AliPHOS.cxx:310
 AliPHOS.cxx:311
 AliPHOS.cxx:312
 AliPHOS.cxx:313
 AliPHOS.cxx:314
 AliPHOS.cxx:315
 AliPHOS.cxx:316
 AliPHOS.cxx:317
 AliPHOS.cxx:318
 AliPHOS.cxx:319
 AliPHOS.cxx:320
 AliPHOS.cxx:321
 AliPHOS.cxx:322
 AliPHOS.cxx:323
 AliPHOS.cxx:324
 AliPHOS.cxx:325
 AliPHOS.cxx:326
 AliPHOS.cxx:327
 AliPHOS.cxx:328
 AliPHOS.cxx:329
 AliPHOS.cxx:330
 AliPHOS.cxx:331
 AliPHOS.cxx:332
 AliPHOS.cxx:333
 AliPHOS.cxx:334
 AliPHOS.cxx:335
 AliPHOS.cxx:336
 AliPHOS.cxx:337
 AliPHOS.cxx:338
 AliPHOS.cxx:339
 AliPHOS.cxx:340
 AliPHOS.cxx:341
 AliPHOS.cxx:342
 AliPHOS.cxx:343
 AliPHOS.cxx:344
 AliPHOS.cxx:345
 AliPHOS.cxx:346
 AliPHOS.cxx:347
 AliPHOS.cxx:348
 AliPHOS.cxx:349
 AliPHOS.cxx:350
 AliPHOS.cxx:351
 AliPHOS.cxx:352
 AliPHOS.cxx:353
 AliPHOS.cxx:354
 AliPHOS.cxx:355
 AliPHOS.cxx:356
 AliPHOS.cxx:357
 AliPHOS.cxx:358
 AliPHOS.cxx:359
 AliPHOS.cxx:360
 AliPHOS.cxx:361
 AliPHOS.cxx:362
 AliPHOS.cxx:363
 AliPHOS.cxx:364
 AliPHOS.cxx:365
 AliPHOS.cxx:366
 AliPHOS.cxx:367
 AliPHOS.cxx:368
 AliPHOS.cxx:369
 AliPHOS.cxx:370
 AliPHOS.cxx:371
 AliPHOS.cxx:372
 AliPHOS.cxx:373
 AliPHOS.cxx:374
 AliPHOS.cxx:375
 AliPHOS.cxx:376
 AliPHOS.cxx:377
 AliPHOS.cxx:378
 AliPHOS.cxx:379
 AliPHOS.cxx:380
 AliPHOS.cxx:381
 AliPHOS.cxx:382
 AliPHOS.cxx:383
 AliPHOS.cxx:384
 AliPHOS.cxx:385
 AliPHOS.cxx:386
 AliPHOS.cxx:387
 AliPHOS.cxx:388
 AliPHOS.cxx:389
 AliPHOS.cxx:390
 AliPHOS.cxx:391
 AliPHOS.cxx:392
 AliPHOS.cxx:393
 AliPHOS.cxx:394
 AliPHOS.cxx:395
 AliPHOS.cxx:396
 AliPHOS.cxx:397
 AliPHOS.cxx:398
 AliPHOS.cxx:399
 AliPHOS.cxx:400
 AliPHOS.cxx:401
 AliPHOS.cxx:402
 AliPHOS.cxx:403
 AliPHOS.cxx:404
 AliPHOS.cxx:405
 AliPHOS.cxx:406
 AliPHOS.cxx:407
 AliPHOS.cxx:408
 AliPHOS.cxx:409
 AliPHOS.cxx:410
 AliPHOS.cxx:411
 AliPHOS.cxx:412
 AliPHOS.cxx:413
 AliPHOS.cxx:414
 AliPHOS.cxx:415
 AliPHOS.cxx:416
 AliPHOS.cxx:417
 AliPHOS.cxx:418
 AliPHOS.cxx:419
 AliPHOS.cxx:420
 AliPHOS.cxx:421
 AliPHOS.cxx:422
 AliPHOS.cxx:423
 AliPHOS.cxx:424
 AliPHOS.cxx:425
 AliPHOS.cxx:426
 AliPHOS.cxx:427
 AliPHOS.cxx:428
 AliPHOS.cxx:429
 AliPHOS.cxx:430
 AliPHOS.cxx:431
 AliPHOS.cxx:432
 AliPHOS.cxx:433
 AliPHOS.cxx:434
 AliPHOS.cxx:435
 AliPHOS.cxx:436
 AliPHOS.cxx:437
 AliPHOS.cxx:438
 AliPHOS.cxx:439
 AliPHOS.cxx:440
 AliPHOS.cxx:441
 AliPHOS.cxx:442
 AliPHOS.cxx:443
 AliPHOS.cxx:444
 AliPHOS.cxx:445
 AliPHOS.cxx:446
 AliPHOS.cxx:447
 AliPHOS.cxx:448
 AliPHOS.cxx:449
 AliPHOS.cxx:450
 AliPHOS.cxx:451
 AliPHOS.cxx:452
 AliPHOS.cxx:453
 AliPHOS.cxx:454
 AliPHOS.cxx:455
 AliPHOS.cxx:456
 AliPHOS.cxx:457
 AliPHOS.cxx:458
 AliPHOS.cxx:459
 AliPHOS.cxx:460
 AliPHOS.cxx:461
 AliPHOS.cxx:462
 AliPHOS.cxx:463
 AliPHOS.cxx:464
 AliPHOS.cxx:465
 AliPHOS.cxx:466
 AliPHOS.cxx:467
 AliPHOS.cxx:468
 AliPHOS.cxx:469
 AliPHOS.cxx:470
 AliPHOS.cxx:471
 AliPHOS.cxx:472
 AliPHOS.cxx:473
 AliPHOS.cxx:474
 AliPHOS.cxx:475
 AliPHOS.cxx:476
 AliPHOS.cxx:477
 AliPHOS.cxx:478
 AliPHOS.cxx:479
 AliPHOS.cxx:480
 AliPHOS.cxx:481
 AliPHOS.cxx:482
 AliPHOS.cxx:483
 AliPHOS.cxx:484
 AliPHOS.cxx:485
 AliPHOS.cxx:486
 AliPHOS.cxx:487
 AliPHOS.cxx:488
 AliPHOS.cxx:489
 AliPHOS.cxx:490
 AliPHOS.cxx:491
 AliPHOS.cxx:492
 AliPHOS.cxx:493
 AliPHOS.cxx:494
 AliPHOS.cxx:495
 AliPHOS.cxx:496
 AliPHOS.cxx:497
 AliPHOS.cxx:498
 AliPHOS.cxx:499
 AliPHOS.cxx:500
 AliPHOS.cxx:501
 AliPHOS.cxx:502
 AliPHOS.cxx:503
 AliPHOS.cxx:504
 AliPHOS.cxx:505
 AliPHOS.cxx:506
 AliPHOS.cxx:507
 AliPHOS.cxx:508
 AliPHOS.cxx:509
 AliPHOS.cxx:510
 AliPHOS.cxx:511
 AliPHOS.cxx:512
 AliPHOS.cxx:513
 AliPHOS.cxx:514
 AliPHOS.cxx:515
 AliPHOS.cxx:516
 AliPHOS.cxx:517
 AliPHOS.cxx:518
 AliPHOS.cxx:519
 AliPHOS.cxx:520
 AliPHOS.cxx:521
 AliPHOS.cxx:522
 AliPHOS.cxx:523
 AliPHOS.cxx:524
 AliPHOS.cxx:525
 AliPHOS.cxx:526
 AliPHOS.cxx:527
 AliPHOS.cxx:528
 AliPHOS.cxx:529
 AliPHOS.cxx:530
 AliPHOS.cxx:531
 AliPHOS.cxx:532
 AliPHOS.cxx:533
 AliPHOS.cxx:534
 AliPHOS.cxx:535
 AliPHOS.cxx:536
 AliPHOS.cxx:537
 AliPHOS.cxx:538
 AliPHOS.cxx:539
 AliPHOS.cxx:540
 AliPHOS.cxx:541
 AliPHOS.cxx:542
 AliPHOS.cxx:543
 AliPHOS.cxx:544
 AliPHOS.cxx:545
 AliPHOS.cxx:546
 AliPHOS.cxx:547
 AliPHOS.cxx:548
 AliPHOS.cxx:549
 AliPHOS.cxx:550
 AliPHOS.cxx:551
 AliPHOS.cxx:552
 AliPHOS.cxx:553
 AliPHOS.cxx:554
 AliPHOS.cxx:555
 AliPHOS.cxx:556
 AliPHOS.cxx:557
 AliPHOS.cxx:558
 AliPHOS.cxx:559
 AliPHOS.cxx:560
 AliPHOS.cxx:561
 AliPHOS.cxx:562
 AliPHOS.cxx:563
 AliPHOS.cxx:564
 AliPHOS.cxx:565
 AliPHOS.cxx:566
 AliPHOS.cxx:567
 AliPHOS.cxx:568
 AliPHOS.cxx:569
 AliPHOS.cxx:570
 AliPHOS.cxx:571
 AliPHOS.cxx:572
 AliPHOS.cxx:573
 AliPHOS.cxx:574
 AliPHOS.cxx:575
 AliPHOS.cxx:576
 AliPHOS.cxx:577
 AliPHOS.cxx:578
 AliPHOS.cxx:579
 AliPHOS.cxx:580
 AliPHOS.cxx:581
 AliPHOS.cxx:582
 AliPHOS.cxx:583
 AliPHOS.cxx:584
 AliPHOS.cxx:585
 AliPHOS.cxx:586
 AliPHOS.cxx:587
 AliPHOS.cxx:588
 AliPHOS.cxx:589
 AliPHOS.cxx:590
 AliPHOS.cxx:591
 AliPHOS.cxx:592
 AliPHOS.cxx:593
 AliPHOS.cxx:594
 AliPHOS.cxx:595
 AliPHOS.cxx:596
 AliPHOS.cxx:597
 AliPHOS.cxx:598
 AliPHOS.cxx:599
 AliPHOS.cxx:600
 AliPHOS.cxx:601
 AliPHOS.cxx:602
 AliPHOS.cxx:603
 AliPHOS.cxx:604
 AliPHOS.cxx:605
 AliPHOS.cxx:606
 AliPHOS.cxx:607
 AliPHOS.cxx:608
 AliPHOS.cxx:609
 AliPHOS.cxx:610
 AliPHOS.cxx:611
 AliPHOS.cxx:612
 AliPHOS.cxx:613
 AliPHOS.cxx:614
 AliPHOS.cxx:615
 AliPHOS.cxx:616
 AliPHOS.cxx:617
 AliPHOS.cxx:618
 AliPHOS.cxx:619
 AliPHOS.cxx:620
 AliPHOS.cxx:621
 AliPHOS.cxx:622
 AliPHOS.cxx:623
 AliPHOS.cxx:624
 AliPHOS.cxx:625
 AliPHOS.cxx:626
 AliPHOS.cxx:627
 AliPHOS.cxx:628
 AliPHOS.cxx:629
 AliPHOS.cxx:630
 AliPHOS.cxx:631
 AliPHOS.cxx:632
 AliPHOS.cxx:633
 AliPHOS.cxx:634
 AliPHOS.cxx:635
 AliPHOS.cxx:636
 AliPHOS.cxx:637
 AliPHOS.cxx:638
 AliPHOS.cxx:639
 AliPHOS.cxx:640
 AliPHOS.cxx:641
 AliPHOS.cxx:642
 AliPHOS.cxx:643
 AliPHOS.cxx:644
 AliPHOS.cxx:645