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

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  			Zero Degree Calorimeter			             //
//  	     This class contains the basic functions for the ZDCs;           //
//            functions specific to one particular geometry are              //
//                      contained in the derived classes                     //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

// --- ROOT system
#include <TClonesArray.h>
#include <TTree.h>
#include <TFile.h>
#include <TSystem.h>
#include <TRandom.h>
#include <TParticle.h>

// --- AliRoot header files
#include "AliDetector.h"
#include "AliRawDataHeaderSim.h"
#include "AliRawReader.h"
#include "AliLoader.h"
#include "AliRun.h"
#include "AliMC.h"
#include "AliLog.h"
#include "AliDAQ.h"
#include "AliZDC.h"
#include "AliZDCHit.h"
#include "AliZDCSDigit.h"
#include "AliZDCDigit.h"
#include "AliZDCDigitizer.h"
#include "AliZDCRawStream.h"
#include "AliZDCPedestals.h"
#include "AliZDCEnCalib.h"
#include "AliZDCTowerCalib.h"
#include "AliFstream.h"

 
ClassImp(AliZDC)

//_____________________________________________________________________________
AliZDC::AliZDC() :
  AliDetector(),
  fNoShower(0),
  fPedCalib(0),
  fEnCalibData(0),
  fTowCalibData(0),
  fZDCCalibFName(""),
  fSpectatorTracked(1),
  fBeamEnergy(0.),
  fIspASystem(kFALSE),
  fIsRELDISgen(kFALSE),
  fOnlyZEM(kFALSE),
  fFindMother(kFALSE)
{
  //
  // Default constructor for the Zero Degree Calorimeter base class
  //
  
  fIshunt = 1;
  fNhits  = 0;
  fHits = 0;
  fDigits = 0;
  fNdigits = 0;
  
}
 
//_____________________________________________________________________________
AliZDC::AliZDC(const char *name, const char *title) : 
  AliDetector(name,title),
  fNoShower(0),
  fPedCalib(0),
  fEnCalibData(0),
  fTowCalibData(0),
  fZDCCalibFName(""),
  fSpectatorTracked(1),
  fBeamEnergy(0.),
  fIspASystem(kFALSE),
  fIsRELDISgen(kFALSE),
  fOnlyZEM(kFALSE),
  fFindMother(kFALSE)
{
  //
  // Standard constructor for the Zero Degree Calorimeter base class
  //
    
  fIshunt = 1;
  fNhits  = 0;
  fDigits = 0;
  fNdigits = 0;
 
  fHits = new TClonesArray("AliZDCHit",1000);
  gAlice->GetMCApp()->AddHitList(fHits);
  
  SetName("ZDC"); SetTitle("ZDC");

}

//____________________________________________________________________________ 
AliZDC::~AliZDC()
{
  //
  // ZDC destructor
  //

  fIshunt = 0;
  if(fPedCalib) delete fPedCalib;
  if(fEnCalibData) delete fEnCalibData;
  if(fEnCalibData) delete fEnCalibData;

}

//_____________________________________________________________________________
AliZDC::AliZDC(const AliZDC& ZDC) :
AliDetector("ZDC","ZDC"),
fNoShower(ZDC.fNoShower),
fPedCalib(ZDC.fPedCalib),
fEnCalibData(ZDC.fEnCalibData),
fTowCalibData(ZDC.fTowCalibData),
fZDCCalibFName(ZDC.fZDCCalibFName),
fSpectatorTracked(ZDC.fSpectatorTracked),
fBeamEnergy(ZDC.fBeamEnergy),
fIspASystem(ZDC.fIspASystem),
fIsRELDISgen(ZDC.fIsRELDISgen),
fOnlyZEM(ZDC.fOnlyZEM),
fFindMother(ZDC.fFindMother)
{
  // copy constructor
}

//_____________________________________________________________________________
AliZDC& AliZDC::operator=(const AliZDC& ZDC)
{
  // assignement operator
  if(this!=&ZDC){
    fNoShower = ZDC.fNoShower;
    fPedCalib = ZDC.fPedCalib;
    fEnCalibData = ZDC.fEnCalibData;
    fTowCalibData = ZDC.fTowCalibData;
    fZDCCalibFName = ZDC.fZDCCalibFName;
    fBeamEnergy = ZDC.fBeamEnergy;
    fIspASystem = ZDC.fIspASystem;
    fIsRELDISgen = ZDC.fIsRELDISgen;
    fOnlyZEM = ZDC.fOnlyZEM;
    fFindMother = ZDC.fFindMother;
  } return *this;
}

//_____________________________________________________________________________
void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
{
  //
  // 		Add a ZDC hit to the hit list.
  
  static Float_t trackTime=0., trackEta=0., primKinEn=0., xImpact=0., yImpact=0., sFlag=0.;
  static Int_t   pcPDGcode=0, motPDGcode=0;

  AliZDCHit *newquad, *curprimquad;
  newquad = new AliZDCHit(fIshunt, track, vol, hits);
  TClonesArray &lhits = *fHits;
  
  if(fNhits==0){
      // First hit -> setting flag for primary or secondary particle
      /*TParticle * p = gAlice->GetMCApp()->Particle(track);
      Int_t imo = p->GetFirstMother();
      //
      if(track != imo){
        newquad->SetSFlag(1);  // SECONDARY particle entering the ZDC
      }
      else if(track == imo){
        newquad->SetSFlag(0);  // PRIMARY particle entering the ZDC
      }*/
      //  
      sFlag 	 = newquad->GetSFlag();
      primKinEn  = newquad->GetPrimKinEn();
      xImpact 	 = newquad->GetXImpact();
      yImpact 	 = newquad->GetYImpact();
      pcPDGcode	 = newquad->GetPDGCode();
      motPDGcode = newquad->GetMotherPDGCode();
      trackTime  = newquad->GetTrackTOF();
      trackEta   = newquad->GetTrackEta();
   }
   else{       
      newquad->SetPrimKinEn(primKinEn);
      newquad->SetXImpact(xImpact);
      newquad->SetYImpact(yImpact);
      newquad->SetSFlag(sFlag);
      newquad->SetPDGCode(pcPDGcode);
      newquad->SetMotherPDGCode(motPDGcode);
      newquad->SetTrackTOF(trackTime);
      newquad->SetTrackEta(trackEta);
   }
 
  Int_t j;
  for(j=0; j<fNhits; j++){
    // If hits are equal (same track, same volume), sum them.
     curprimquad = (AliZDCHit*) lhits[j];
     if(*curprimquad == *newquad){
        *curprimquad = *curprimquad+*newquad;
        // Ch. debug
        //printf("\n\t Summing hits **************** \n", fNhits);
        //curprimquad->Print("");
	//
	delete newquad;
	return;
     } 
  }

    //Otherwise create a new hit
    new(lhits[fNhits]) AliZDCHit(*newquad);
    fNhits++;
    // Ch. debug
    //printf("\n\t New ZDC hit added! fNhits = %d\n", fNhits);
    //newquad->Print("");
    
    delete newquad;
}

//____________________________________________________________________________
Float_t AliZDC::ZMin(void) const
{
  // Minimum dimension of the ZDC module in z
  return -11600.;
}

//____________________________________________________________________________
Float_t AliZDC::ZMax(void) const
{
  // Maximum dimension of the ZDC module in z
  return 11750.;
}
  

//_____________________________________________________________________________
void AliZDC::MakeBranch(Option_t *opt)
{
  //
  // Create Tree branches for the ZDC
  //

  char branchname[10];
  snprintf(branchname, 10, "%s", GetName());

  const char *cH = strstr(opt,"H");
  
  if(cH && fLoader->TreeH()) {
    if (fHits) {
      fHits->Clear();
      fNhits = 0;
    }
    else {
      fHits   = new TClonesArray("AliZDCHit",1000); 
      if (gAlice && gAlice->GetMCApp())
	gAlice->GetMCApp()->AddHitList(fHits);
    }
  }
  
  AliDetector::MakeBranch(opt);
}

//_____________________________________________________________________________
void AliZDC::Hits2SDigits()
{
  // Create summable digits from hits
  
  AliDebug(1,"\n	AliZDC::Hits2SDigits() ");
  
  fLoader->LoadHits("read");
  fLoader->LoadSDigits("recreate");
  AliRunLoader* runLoader = fLoader->GetRunLoader();
  AliZDCSDigit sdigit;
  AliZDCSDigit* psdigit = &sdigit;

  // Event loop
  for(Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
    Float_t pmZNC[5], pmZPC[5], pmZNA[5], pmZPA[5], pmZEM1=0., pmZEM2=0.;
    for(Int_t i=0; i<5; i++) pmZNC[i] = pmZPC[i] =  pmZNA[i] = pmZPA[i] = 0;

    runLoader->GetEvent(iEvent);
    TTree* treeH = fLoader->TreeH();
    Int_t ntracks = (Int_t) treeH->GetEntries();
    ResetHits();

    // Tracks loop
    Int_t sector[2]; Float_t trackTime = 0.;
    for(Int_t itrack = 0; itrack < ntracks; itrack++) {
      treeH->GetEntry(itrack);
      for(AliZDCHit* zdcHit = (AliZDCHit*)FirstHit(-1); zdcHit;
          zdcHit = (AliZDCHit*)NextHit()) { 
		      
	sector[0] = zdcHit->GetVolume(0);
	sector[1] = zdcHit->GetVolume(1);
	if((sector[1] < 1) || (sector[1]>5)) {
	  Error("Hits2SDigits", "sector[0] = %d, sector[1] = %d", sector[0], sector[1]);
	  continue;
	}
	Float_t lightQ = zdcHit->GetLightPMQ();
	Float_t lightC = zdcHit->GetLightPMC();
	trackTime = zdcHit->GetTrackTOF();
	// Signals from ZEM are delayed to arrive in time with ZDC signals
	if(sector[0] == 3)  trackTime += 320;
	// Ch. debug
	//printf("\t det %d vol %d trackTOF %f lightQ %1.0f lightC %1.0f\n",
	//	sector[0], sector[1], trackTime, lightQ, lightC);
     
	if(sector[0] == 1) { //ZNC 
	  pmZNC[0] += lightC;
	  pmZNC[sector[1]] += lightQ;
	} 
	else if(sector[0] == 2) { //ZPC 
	  pmZPC[0] += lightC;
	  pmZPC[sector[1]] += lightQ;
	} 
	else if(sector[0] == 3) { //ZEM 
	  if(sector[1] == 1) pmZEM1 += lightC;
	  else pmZEM2 += lightQ;
	}
	if(sector[0] == 4) { //ZNA 
	  pmZNA[0] += lightC;
	  pmZNA[sector[1]] += lightQ;
	} 
	else if(sector[0] == 5) { //ZPA 
	  pmZPA[0] += lightC;
	  pmZPA[sector[1]] += lightQ;
	} 
      }//Hits loop
    }//Tracks loop

    // create the output tree
    fLoader->MakeTree("S");
    TTree* treeS = fLoader->TreeS();
    const Int_t kBufferSize = 4000;
    treeS->Branch(GetName(), "AliZDCSDigit", &psdigit, kBufferSize);

    // Create sdigits for ZNC
    sector[0] = 1; // Detector = ZNC
    for(Int_t j = 0; j < 5; j++) {
      sector[1] = j; 
      if(pmZNC[j]>0){
        new(psdigit) AliZDCSDigit(sector, pmZNC[j], trackTime);
        treeS->Fill();
	// Ch. debug
	//printf("\t SDigit created: det %d quad %d pmZNC[%d] %1.0f trackTOF %f\n",
	//	sector[0], sector[1], j, pmZNC[j], trackTime);
      }
    }
  
    // Create sdigits for ZPC
    sector[0] = 2; // Detector = ZPC
    for(Int_t j = 0; j < 5; j++) {
      sector[1] = j; // Towers PM ADCs
      if(pmZPC[j]>0){
        new(psdigit) AliZDCSDigit(sector, pmZPC[j], trackTime);
        treeS->Fill();
	// Ch. debug
	//printf("\t SDigit created: det %d quad %d pmZPC[%d] %1.0f trackTOF %f\n",
	//	sector[0], sector[1], j, pmZPC[j], trackTime);
      }
    }

    // Create sdigits for ZEM
    sector[0] = 3; 
    sector[1] = 1; // Detector = ZEM1
    if(pmZEM1>0){ 
      new(psdigit) AliZDCSDigit(sector, pmZEM1, trackTime);
      treeS->Fill();
      // Ch. debug
      //printf("\t SDigit created: det %d quad %d pmZEM1 %1.0f trackTOF %f\n",
      //	sector[0], sector[1], pmZEM1, trackTime);
    }
    sector[1] = 2; // Detector = ZEM2
    if(pmZEM2>0){
      new(psdigit) AliZDCSDigit(sector, pmZEM2, trackTime);
      treeS->Fill();
      // Ch. debug
      //printf("\t SDigit created: det %d quad %d pmZEM2 %1.0f trackTOF %f\n",
      //	sector[0], sector[1], pmZEM2, trackTime);
    }

    // Create sdigits for ZNA
    sector[0] = 4; // Detector = ZNA
    for(Int_t j = 0; j < 5; j++) {
      sector[1] = j; // Towers PM ADCs
      if(pmZNA[j]>0){
        new(psdigit) AliZDCSDigit(sector, pmZNA[j], trackTime);
        treeS->Fill();
	// Ch. debug
	//printf("\t SDigit created: det %d quad %d pmZNA[%d] %1.0f trackTOF %f\n",
	//	sector[0], sector[1], j, pmZNA[j], trackTime);
      }
    }
  
    // Create sdigits for ZPA
    sector[0] = 5; // Detector = ZPA
    sector[1] = 0; // Common PM ADC
    for(Int_t j = 0; j < 5; j++) {
      sector[1] = j; // Towers PM ADCs
      if(pmZPA[j]>0){
        new(psdigit) AliZDCSDigit(sector, pmZPA[j], trackTime);
        treeS->Fill();
	// Ch. debug
	//printf("\t SDigit created: det %d quad %d pmZPA[%d] %1.0f trackTOF %f\n",
	//	sector[0], sector[1], j, pmZPA[j], trackTime);
      }
    }

    // write the output tree
    fLoader->WriteSDigits("OVERWRITE");
  }

  fLoader->UnloadHits();
  fLoader->UnloadSDigits();
}

//_____________________________________________________________________________
AliDigitizer* AliZDC::CreateDigitizer(AliDigitizationInput* digInput) const{
  // Create the digitizer for ZDC
  AliZDCDigitizer *zdcDigitizer = new AliZDCDigitizer(digInput);
  if(fSpectatorTracked==0) zdcDigitizer->SetSpectators2Track();
  if(fBeamEnergy>0.01) zdcDigitizer->SetBeamEnergy(fBeamEnergy);
  if(fIspASystem==kTRUE) zdcDigitizer->SetpAsystem();
  if(fIsRELDISgen==kTRUE) zdcDigitizer->SetRELDISGenerator();
  //if(fIspASystem==kTRUE) printf("\n **** ZDC digitizer initialized for p-A collisions\n\n");
  return zdcDigitizer;
}

//_____________________________________________________________________________
void AliZDC::Digits2Raw()
{
  // Convert ZDC digits to raw data

  // Format: 24 int values -> ZN1(C+Q1-4), ZP1(C+Q1-4), ZEM1, ZEM2, ZN(C+Q1-4), ZP2(C+Q1-4), 2 Ref PMs
  // 	     + 24 int values for the corresponding out of time channels
  // For the CAEN module V965 we have an Header, the Data Words and an End Of Block
  // 	12 channels x 2 gain chains read from 1st ADC module
  // 	12 channels x 2 gain chains read from 2nd ADC module
  // 	12 channels x 2 gain chains read from 3rd ADC module (o.o.t.)
  // 	12 channels x 2 gain chains read from 4rth ADC module (o.o.t.)
  //
  const int knADCData1=12, knADCData2=12; 
  const int knADCData3=12, knADCData4=12; 
  //
  UInt_t lADCHeader1; 
  UInt_t lADCHeader2; 
  UInt_t lADCHeader3; 
  UInt_t lADCHeader4; 
  //
  UInt_t lADCData1[2*knADCData1];
  UInt_t lADCData2[2*knADCData2];
  UInt_t lADCData3[2*knADCData3];
  UInt_t lADCData4[2*knADCData4];
  //
  UInt_t lADCEndBlock;

  // load the digits
  fLoader->LoadDigits("read");
  AliZDCDigit digit;
  AliZDCDigit* pdigit = &digit;
  TTree* treeD = fLoader->TreeD();
  if(!treeD) return;
  treeD->SetBranchAddress("ZDC", &pdigit);
  //printf("\t AliZDC::Digits2Raw -> TreeD has %d entries\n",(Int_t) treeD->GetEntries());

  // Reading channel map
  //printf("\n\t Reading ADC mapping from OCDB\n");
  AliZDCChMap * chMap = GetChMap();
  const int nCh = knADCData1+knADCData2+knADCData3+knADCData4;
  Int_t  mapADC[nCh][4]; 
  for(Int_t i=0; i<nCh; i++){
    mapADC[i][0] = chMap->GetADCModule(i);
    mapADC[i][1] = chMap->GetADCChannel(i);
    mapADC[i][2] = chMap->GetDetector(i);
    mapADC[i][3] = chMap->GetSector(i);
    // Ch. debug
    //printf("  mapADC[%d] = (%d %d %d %d)\n", i,
    //	mapADC[i][0],mapADC[i][1],mapADC[i][2],mapADC[i][3]);
  }

  // *** Fill data array
  // ** ADC header
  UInt_t lADCHeaderGEO1 = 0;
  UInt_t lADCHeaderGEO2 = 1;
  UInt_t lADCHeaderGEO3 = 2;
  UInt_t lADCHeaderGEO4 = 3;
  UInt_t lADCHeaderCRATE = 0;
  UInt_t lADCHeaderCNT1 = knADCData1;
  UInt_t lADCHeaderCNT2 = knADCData2;
  UInt_t lADCHeaderCNT3 = knADCData3;
  UInt_t lADCHeaderCNT4 = knADCData4;
    
  lADCHeader1 = lADCHeaderGEO1 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 |
               lADCHeaderCNT1 << 8 ;
  lADCHeader2 = lADCHeaderGEO2 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 |
               lADCHeaderCNT2 << 8 ;
  lADCHeader3 = lADCHeaderGEO3 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 |
               lADCHeaderCNT3 << 8 ;
  lADCHeader4 = lADCHeaderGEO4 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 |
               lADCHeaderCNT4 << 8 ;
      
  // ** ADC data word
  UInt_t lADCDataGEO = 0;
  //
  UInt_t lADCDataValue1[2*knADCData1];
  UInt_t lADCDataValue2[2*knADCData2];
  UInt_t lADCDataValue3[2*knADCData3];
  UInt_t lADCDataValue4[2*knADCData4];
  //
  UInt_t lADCDataOvFlwHG = 0;
  UInt_t lADCDataOvFlwLG = 0;
  //
  for(Int_t i=0; i<2*knADCData1 ; i++) lADCDataValue1[i] = 0;
  for(Int_t i=0; i<2*knADCData2 ; i++) lADCDataValue2[i] = 0;
  for(Int_t i=0; i<2*knADCData3 ; i++) lADCDataValue3[i] = 0;
  for(Int_t i=0; i<2*knADCData4 ; i++) lADCDataValue4[i] = 0;
  //
  UInt_t lADCDataChannel = 0;
  
  Int_t indADC0=0, indADC1=0, indADC2=0, indADC3=0;
  
  // loop over digits
  for(Int_t iDigit=0; iDigit<(Int_t) (treeD->GetEntries()); iDigit++){
    treeD->GetEntry(iDigit);
    if(!pdigit) continue;
    //digit.Print("");
   
    // *** ADC data
    // Scan of the map to assign the correct ADC module-channel
    for(Int_t k=0; k<nCh; k++){
      if(iDigit<knADCData1+knADCData2){ 
       if(digit.GetSector(0)==mapADC[k][2] && digit.GetSector(1)==mapADC[k][3]){
    	 lADCDataGEO = (UInt_t) mapADC[k][0];
    	 lADCDataChannel = (UInt_t) mapADC[k][1];
    	 break;
       } 
      }
      else{
       if(digit.GetSector(0)==mapADC[k][2] && digit.GetSector(1)==mapADC[k][3]){
    	 lADCDataGEO = (UInt_t) mapADC[k][0];
    	 lADCDataChannel = (UInt_t) mapADC[k][1];
    	 if(k>knADCData1+knADCData2) break;
       } 
      }
    }
    // Ch. debug
    //printf("iDigit %d det %d sec %d -> lADCDataGEO %d  lADCDataChannel %d\n",
    //	iDigit,digit.GetSector(0),digit.GetSector(1),lADCDataGEO,lADCDataChannel);
     
    if(lADCDataGEO==0){ 
      if(indADC0>=knADCData1){
        AliWarning(Form(" Problem with digit index %d for ADC0\n", indADC0));
	return;
      }
      Int_t indLG = indADC0+knADCData1;
      // High gain ADC ch.	 
      if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; 
      lADCDataValue1[indADC0] = digit.GetADCValue(0);    
      lADCData1[indADC0] = lADCDataGEO << 27 |  lADCDataChannel << 17 | 
        	    lADCDataOvFlwHG << 12 | (lADCDataValue1[indADC0] & 0xfff); 
      // Low gain ADC ch.
      if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; 
      lADCDataValue1[indLG] = digit.GetADCValue(1); 
      lADCData1[indLG] = lADCDataGEO << 27 |  lADCDataChannel << 17 | 0x1 << 16 |
        	    lADCDataOvFlwLG << 12 | (lADCDataValue1[indLG] & 0xfff);  
      // Ch. debug
      //printf(" lADCDataGEO %d  ADCdataHG[%d] %d  ADCdataLG[%d] %d\n", 
      //  lADCDataGEO,indADC0,lADCDataValue1[indADC0],indLG,lADCDataValue1[indLG]);
		    
      indADC0++;
    }
    else if(lADCDataGEO==1){ 
      if(indADC1>=knADCData2){
         AliWarning(Form(" Problem with digit index %d for ADC1\n", indADC1));
	 return;
      }
      Int_t indLG = indADC1+knADCData2;
      // High gain ADC ch.	 
      if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; 
      lADCDataValue2[indADC1] = digit.GetADCValue(0);	 
      lADCData2[indADC1] = lADCDataGEO << 27 | lADCDataChannel << 17 | 
        	    lADCDataOvFlwHG << 12 | (lADCDataValue2[indADC1] & 0xfff); 
      // Low gain ADC ch.
      if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; 
      lADCDataValue2[indLG] = digit.GetADCValue(1); 
      lADCData2[indLG] = lADCDataGEO << 27 |  lADCDataChannel << 17 | 0x1 << 16 |
        	    lADCDataOvFlwLG << 12 | (lADCDataValue2[indLG] & 0xfff);  
      // Ch. debug
      //printf(" lADCDataGEO %d  ADCdataHG[%d] %d  ADCdataLG[%d] %d\n", 
      //  lADCDataGEO,indADC1,lADCDataValue2[indADC1],indLG,lADCDataValue2[indLG]);
        	  
      indADC1++;
    }
    else if(lADCDataGEO==2){ 
      if(indADC2>=knADCData3){
        AliWarning(Form(" Problem with digit index %d for ADC2\n", indADC2));
	return;
      }
      Int_t indLG = indADC2+knADCData3;
      // High gain ADC ch.	 
      if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; 
      lADCDataValue3[indADC1] = digit.GetADCValue(0);    
      lADCData3[indADC1] = lADCDataGEO << 27 | lADCDataChannel << 17 | 
        	    lADCDataOvFlwHG << 12 | (lADCDataValue3[indADC2] & 0xfff); 
      // Low gain ADC ch.
      if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; 
      lADCDataValue3[indLG] = digit.GetADCValue(1); 
      lADCData3[indLG] = lADCDataGEO << 27 |  lADCDataChannel << 17 | 0x1 << 16 |
        	    lADCDataOvFlwLG << 12 | (lADCDataValue3[indLG] & 0xfff);  
      // Ch. debug
      //printf(" lADCDataGEO %d  ADCdataHG[%d] %d  ADCdataLG[%d] %d\n", 
      //  lADCDataGEO,indADC2,lADCDataValue3[indADC2],indLG,lADCDataValue3[indLG]);
        	  
      indADC2++;
    }
    else if(lADCDataGEO==3){ 
      if(indADC3>=knADCData4){
         AliWarning(Form(" Problem with digit index %d for ADC2\n", indADC3));
	 return;
      }
      Int_t indLG = indADC3+knADCData4;
      // High gain ADC ch.	 
      if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; 
      lADCDataValue4[indADC3] = digit.GetADCValue(0);    
      lADCData4[indADC3] = lADCDataGEO << 27 | lADCDataChannel << 17 | 
        	    lADCDataOvFlwHG << 12 | (lADCDataValue4[indADC3] & 0xfff); 
      // Low gain ADC ch.
      if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; 
      lADCDataValue4[indLG] = digit.GetADCValue(1); 
      lADCData4[indLG] = lADCDataGEO << 27 |  lADCDataChannel << 17 | 0x1 << 16 |
        	    lADCDataOvFlwLG << 12 | (lADCDataValue4[indLG] & 0xfff);  
      // Ch. debug
      //printf(" lADCDataGEO %d  ADCdataHG[%d] %d  ADCdataLG[%d] %d\n", 
      //  lADCDataGEO,indADC3,lADCDataValue4[indADC3],indLG,lADCDataValue4[indLG]);
        	  
      indADC3++;
    }		  

  }
  //
  /*for(Int_t i=0;i<2*knADCData1;i++) printf("\t ADCData1[%d] = %x\n",i,lADCData1[i]);
  for(Int_t i=0;i<2*knADCData2;i++) printf("\t ADCData2[%d] = %x\n",i,lADCData2[i]);
  for(Int_t i=0;i<2*knADCData3;i++) printf("\t ADCData3[%d] = %x\n",i,lADCData3[i]);
  for(Int_t i=0;i<2*knADCData4;i++) printf("\t ADCData4[%d] = %x\n",i,lADCData4[i]);*/
   
  // End of Block
  UInt_t lADCEndBlockGEO = 0;
  // Event counter in ADC EOB -> getting no. of events in run from AliRunLoader
  // get run loader
  AliRunLoader* runLoader = fLoader->GetRunLoader(); 
  UInt_t lADCEndBlockEvCount = runLoader->GetEventNumber();
  //  
  lADCEndBlock = lADCEndBlockGEO << 27 | 0x1 << 26 | lADCEndBlockEvCount;
  //printf("\t AliZDC::Digits2Raw -> ADCEndBlock = %d\n",lADCEndBlock);

  // open the output file
  TString fileName;
  fileName.Form("%s",AliDAQ::DdlFileName("ZDC",0)); 

  AliFstream* file = new AliFstream(fileName.Data());

  // write the DDL data header
  AliRawDataHeaderSim header;
  header.fSize = sizeof(header) + 
                 sizeof(lADCHeader1) + sizeof(lADCData1) + sizeof(lADCEndBlock) +
  		 sizeof(lADCHeader2) + sizeof(lADCData2) + sizeof(lADCEndBlock) +
                 sizeof(lADCHeader3) + sizeof(lADCData3) + sizeof(lADCEndBlock) +
  		 sizeof(lADCHeader4) + sizeof(lADCData4) + sizeof(lADCEndBlock);
  //
  /*printf("sizeof header = %d, ADCHeader1 = %d, ADCData1 = %d, ADCEndBlock = %d\n",
          sizeof(header),sizeof(lADCHeader1),sizeof(lADCData1),sizeof(lADCEndBlock));
  printf("sizeof header = %d, ADCHeader2 = %d, ADCData2 = %d, ADCEndBlock = %d\n",
          sizeof(header),sizeof(lADCHeader2),sizeof(lADCData2),sizeof(lADCEndBlock));
  printf("sizeof header = %d, ADCHeader3 = %d, ADCData3 = %d, ADCEndBlock = %d\n",
          sizeof(header),sizeof(lADCHeader1),sizeof(lADCData1),sizeof(lADCEndBlock));
  printf("sizeof header = %d, ADCHeader4 = %d, ADCData4 = %d, ADCEndBlock = %d\n",
          sizeof(header),sizeof(lADCHeader2),sizeof(lADCData2),sizeof(lADCEndBlock));*/
  
  header.SetAttribute(0);  // valid data
  file->WriteBuffer((char*)(&header), sizeof(header));
  // write the raw data and close the file
  file->WriteBuffer((char*) &lADCHeader1,  sizeof (lADCHeader1));
  file->WriteBuffer((char*) &lADCData1,   sizeof(lADCData1));
  file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock));
  file->WriteBuffer((char*) &lADCHeader2,  sizeof (lADCHeader2));
  file->WriteBuffer((char*) (lADCData2),   sizeof(lADCData2));
  file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock));
  file->WriteBuffer((char*) &lADCHeader3,  sizeof (lADCHeader3));
  file->WriteBuffer((char*) (lADCData3),   sizeof(lADCData3));
  file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock));
  file->WriteBuffer((char*) &lADCHeader4,  sizeof (lADCHeader4));
  file->WriteBuffer((char*) (lADCData4),   sizeof(lADCData4));
  file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock));
  delete file;

  // unload the digits
  fLoader->UnloadDigits();
}

//_____________________________________________________________________________
Bool_t AliZDC::Raw2SDigits(AliRawReader* rawReader)
{
  // Convert ZDC raw data to Sdigits
  const int kNch = 48;
  AliLoader* loader = (AliRunLoader::Instance())->GetLoader("ZDCLoader");
  if(!loader) {
    AliError("no ZDC loader found");
    return kFALSE;
  }

  // Create the output digit tree
  TTree* treeS = loader->TreeS();
  if(!treeS){
    loader->MakeTree("S");
    treeS = loader->TreeS();
  }
  //
  AliZDCSDigit sdigit;
  AliZDCSDigit* psdigit = &sdigit;
  const Int_t kBufferSize = 4000;
  treeS->Branch("ZDC", "AliZDCSDigit",  &psdigit, kBufferSize);
  //
  AliZDCRawStream rawStream(rawReader);
  Int_t sector[2], resADC, rawADC, corrADC, nPheVal;
  Int_t jcount = 0;
  while(rawStream.Next()){
    if(rawStream.IsADCDataWord()){
      //For the moment only in-time SDigits are foreseen (1st 48 raw values)
      if(jcount < kNch){ 
  	for(Int_t j=0; j<2; j++) sector[j] = rawStream.GetSector(j);
        rawADC = rawStream.GetADCValue();
        resADC = rawStream.GetADCGain();
        //printf("\t RAw2SDigits raw%d ->  RawADC[%d, %d, %d] read\n",
        //    jcount, sector[0], sector[1], rawADC);
        //
        corrADC = rawADC - Pedestal(sector[0], sector[1], resADC);
        if(corrADC<0) corrADC=0;
        nPheVal = ADCch2Phe(sector[0], sector[1], corrADC, resADC);
  	//
        //printf("\t \t ->  SDigit[%d, %d, %d] created\n",
        //    sector[0], sector[1], nPheVal);
        //
  	new(psdigit) AliZDCSDigit(sector, (Float_t) nPheVal, 0.);
  	treeS->Fill();
  	jcount++;
      }
    }//IsADCDataWord
  }//rawStream.Next
  // write the output tree
  fLoader->WriteSDigits("OVERWRITE");
  fLoader->UnloadSDigits();
   
  return kTRUE;
}

//_____________________________________________________________________________
Int_t AliZDC::Pedestal(Int_t Det, Int_t Quad, Int_t Res) const
{
  // Returns a pedestal for detector det, PM quad, channel with res.
  //
  // Getting calibration object for ZDC set
  Float_t pedValue = 0.;
  AliCDBManager *man = AliCDBManager::Instance();
  AliCDBEntry  *entry = man->Get("ZDC/Calib/Pedestals");
  AliZDCPedestals *calibPed = 0x0;
  if(!entry) AliFatal("No calibration data loaded!");  
  else{
    calibPed = (AliZDCPedestals*) entry->GetObject();
    //
    if(!calibPed){
      printf("\t No calibration object found for ZDC!");
      return -1;
    }
    //
    Int_t index=0, kNch=24;
    if(Quad!=5){
      if(Det==1)        index = Quad+kNch*Res;	 // ZN1
      else if(Det==2)   index = Quad+5+kNch*Res;  	 // ZP1
      else if(Det==3)   index = Quad+9+kNch*Res; // ZEM
      else if(Det==4)   index = Quad+12+kNch*Res; // ZN2
      else if(Det==5)   index = Quad+17+kNch*Res; // ZP2
    }
    else index = (Det-1)/3+22+kNch*Res; // Reference PMs
    //
    //
    Float_t meanPed = calibPed->GetMeanPed(index);
    Float_t pedWidth = calibPed->GetMeanPedWidth(index);
    pedValue = gRandom->Gaus(meanPed,pedWidth);
    //
    //printf("\t AliZDC::Pedestal - det(%d, %d) - Ped[%d] = %d\n",Det, Quad, index,(Int_t) pedValue); // Chiara debugging!
  }
  
  return (Int_t) pedValue;
}


//_____________________________________________________________________________
Int_t AliZDC::ADCch2Phe(Int_t Det, Int_t Quad, Int_t ADCVal, Int_t Res) const
{
  // Evaluation of the no. of phe produced
  Float_t pmGain[6][5];
  Float_t resADC[2];
  for(Int_t j = 0; j < 5; j++){
    pmGain[0][j] = 50000.;
    pmGain[1][j] = 100000.;
    pmGain[2][j] = 100000.;
    pmGain[3][j] = 50000.;
    pmGain[4][j] = 100000.;
    pmGain[5][j] = 100000.;
  }
  // ADC Caen V965
  resADC[0] = 0.0000008; // ADC Resolution high gain: 200 fC/adcCh
  resADC[1] = 0.0000064; // ADC Resolution low gain:  25  fC/adcCh
  //
  Int_t nPhe = (Int_t) (ADCVal / (pmGain[Det-1][Quad] * resADC[Res]));
  //
  //printf("\t AliZDC::ADCch2Phe -> det(%d, %d) - ADC %d  phe %d\n",Det,Quad,ADCVal,nPhe);

  return nPhe;
}

//______________________________________________________________________
void AliZDC::SetTreeAddress(){

  // Set branch address for the Trees.
  if(fLoader->TreeH() && (fHits == 0x0))
    fHits   = new TClonesArray("AliZDCHit",1000);
      
  AliDetector::SetTreeAddress();
}

//_____________________________________________________________________________
AliZDCChMap* AliZDC::GetChMap() const
{

  // Getting calibration object for ZDC
  AliZDCChMap *calibdata = 0x0;
  AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/ChMap");
  if(!entry) AliFatal("No calibration data loaded!");  
  else{
    calibdata = dynamic_cast<AliZDCChMap*> (entry->GetObject());
    if(!calibdata) AliFatal("Wrong calibration object in calibration  file!");
  }
  return calibdata;
}
 AliZDC.cxx:1
 AliZDC.cxx:2
 AliZDC.cxx:3
 AliZDC.cxx:4
 AliZDC.cxx:5
 AliZDC.cxx:6
 AliZDC.cxx:7
 AliZDC.cxx:8
 AliZDC.cxx:9
 AliZDC.cxx:10
 AliZDC.cxx:11
 AliZDC.cxx:12
 AliZDC.cxx:13
 AliZDC.cxx:14
 AliZDC.cxx:15
 AliZDC.cxx:16
 AliZDC.cxx:17
 AliZDC.cxx:18
 AliZDC.cxx:19
 AliZDC.cxx:20
 AliZDC.cxx:21
 AliZDC.cxx:22
 AliZDC.cxx:23
 AliZDC.cxx:24
 AliZDC.cxx:25
 AliZDC.cxx:26
 AliZDC.cxx:27
 AliZDC.cxx:28
 AliZDC.cxx:29
 AliZDC.cxx:30
 AliZDC.cxx:31
 AliZDC.cxx:32
 AliZDC.cxx:33
 AliZDC.cxx:34
 AliZDC.cxx:35
 AliZDC.cxx:36
 AliZDC.cxx:37
 AliZDC.cxx:38
 AliZDC.cxx:39
 AliZDC.cxx:40
 AliZDC.cxx:41
 AliZDC.cxx:42
 AliZDC.cxx:43
 AliZDC.cxx:44
 AliZDC.cxx:45
 AliZDC.cxx:46
 AliZDC.cxx:47
 AliZDC.cxx:48
 AliZDC.cxx:49
 AliZDC.cxx:50
 AliZDC.cxx:51
 AliZDC.cxx:52
 AliZDC.cxx:53
 AliZDC.cxx:54
 AliZDC.cxx:55
 AliZDC.cxx:56
 AliZDC.cxx:57
 AliZDC.cxx:58
 AliZDC.cxx:59
 AliZDC.cxx:60
 AliZDC.cxx:61
 AliZDC.cxx:62
 AliZDC.cxx:63
 AliZDC.cxx:64
 AliZDC.cxx:65
 AliZDC.cxx:66
 AliZDC.cxx:67
 AliZDC.cxx:68
 AliZDC.cxx:69
 AliZDC.cxx:70
 AliZDC.cxx:71
 AliZDC.cxx:72
 AliZDC.cxx:73
 AliZDC.cxx:74
 AliZDC.cxx:75
 AliZDC.cxx:76
 AliZDC.cxx:77
 AliZDC.cxx:78
 AliZDC.cxx:79
 AliZDC.cxx:80
 AliZDC.cxx:81
 AliZDC.cxx:82
 AliZDC.cxx:83
 AliZDC.cxx:84
 AliZDC.cxx:85
 AliZDC.cxx:86
 AliZDC.cxx:87
 AliZDC.cxx:88
 AliZDC.cxx:89
 AliZDC.cxx:90
 AliZDC.cxx:91
 AliZDC.cxx:92
 AliZDC.cxx:93
 AliZDC.cxx:94
 AliZDC.cxx:95
 AliZDC.cxx:96
 AliZDC.cxx:97
 AliZDC.cxx:98
 AliZDC.cxx:99
 AliZDC.cxx:100
 AliZDC.cxx:101
 AliZDC.cxx:102
 AliZDC.cxx:103
 AliZDC.cxx:104
 AliZDC.cxx:105
 AliZDC.cxx:106
 AliZDC.cxx:107
 AliZDC.cxx:108
 AliZDC.cxx:109
 AliZDC.cxx:110
 AliZDC.cxx:111
 AliZDC.cxx:112
 AliZDC.cxx:113
 AliZDC.cxx:114
 AliZDC.cxx:115
 AliZDC.cxx:116
 AliZDC.cxx:117
 AliZDC.cxx:118
 AliZDC.cxx:119
 AliZDC.cxx:120
 AliZDC.cxx:121
 AliZDC.cxx:122
 AliZDC.cxx:123
 AliZDC.cxx:124
 AliZDC.cxx:125
 AliZDC.cxx:126
 AliZDC.cxx:127
 AliZDC.cxx:128
 AliZDC.cxx:129
 AliZDC.cxx:130
 AliZDC.cxx:131
 AliZDC.cxx:132
 AliZDC.cxx:133
 AliZDC.cxx:134
 AliZDC.cxx:135
 AliZDC.cxx:136
 AliZDC.cxx:137
 AliZDC.cxx:138
 AliZDC.cxx:139
 AliZDC.cxx:140
 AliZDC.cxx:141
 AliZDC.cxx:142
 AliZDC.cxx:143
 AliZDC.cxx:144
 AliZDC.cxx:145
 AliZDC.cxx:146
 AliZDC.cxx:147
 AliZDC.cxx:148
 AliZDC.cxx:149
 AliZDC.cxx:150
 AliZDC.cxx:151
 AliZDC.cxx:152
 AliZDC.cxx:153
 AliZDC.cxx:154
 AliZDC.cxx:155
 AliZDC.cxx:156
 AliZDC.cxx:157
 AliZDC.cxx:158
 AliZDC.cxx:159
 AliZDC.cxx:160
 AliZDC.cxx:161
 AliZDC.cxx:162
 AliZDC.cxx:163
 AliZDC.cxx:164
 AliZDC.cxx:165
 AliZDC.cxx:166
 AliZDC.cxx:167
 AliZDC.cxx:168
 AliZDC.cxx:169
 AliZDC.cxx:170
 AliZDC.cxx:171
 AliZDC.cxx:172
 AliZDC.cxx:173
 AliZDC.cxx:174
 AliZDC.cxx:175
 AliZDC.cxx:176
 AliZDC.cxx:177
 AliZDC.cxx:178
 AliZDC.cxx:179
 AliZDC.cxx:180
 AliZDC.cxx:181
 AliZDC.cxx:182
 AliZDC.cxx:183
 AliZDC.cxx:184
 AliZDC.cxx:185
 AliZDC.cxx:186
 AliZDC.cxx:187
 AliZDC.cxx:188
 AliZDC.cxx:189
 AliZDC.cxx:190
 AliZDC.cxx:191
 AliZDC.cxx:192
 AliZDC.cxx:193
 AliZDC.cxx:194
 AliZDC.cxx:195
 AliZDC.cxx:196
 AliZDC.cxx:197
 AliZDC.cxx:198
 AliZDC.cxx:199
 AliZDC.cxx:200
 AliZDC.cxx:201
 AliZDC.cxx:202
 AliZDC.cxx:203
 AliZDC.cxx:204
 AliZDC.cxx:205
 AliZDC.cxx:206
 AliZDC.cxx:207
 AliZDC.cxx:208
 AliZDC.cxx:209
 AliZDC.cxx:210
 AliZDC.cxx:211
 AliZDC.cxx:212
 AliZDC.cxx:213
 AliZDC.cxx:214
 AliZDC.cxx:215
 AliZDC.cxx:216
 AliZDC.cxx:217
 AliZDC.cxx:218
 AliZDC.cxx:219
 AliZDC.cxx:220
 AliZDC.cxx:221
 AliZDC.cxx:222
 AliZDC.cxx:223
 AliZDC.cxx:224
 AliZDC.cxx:225
 AliZDC.cxx:226
 AliZDC.cxx:227
 AliZDC.cxx:228
 AliZDC.cxx:229
 AliZDC.cxx:230
 AliZDC.cxx:231
 AliZDC.cxx:232
 AliZDC.cxx:233
 AliZDC.cxx:234
 AliZDC.cxx:235
 AliZDC.cxx:236
 AliZDC.cxx:237
 AliZDC.cxx:238
 AliZDC.cxx:239
 AliZDC.cxx:240
 AliZDC.cxx:241
 AliZDC.cxx:242
 AliZDC.cxx:243
 AliZDC.cxx:244
 AliZDC.cxx:245
 AliZDC.cxx:246
 AliZDC.cxx:247
 AliZDC.cxx:248
 AliZDC.cxx:249
 AliZDC.cxx:250
 AliZDC.cxx:251
 AliZDC.cxx:252
 AliZDC.cxx:253
 AliZDC.cxx:254
 AliZDC.cxx:255
 AliZDC.cxx:256
 AliZDC.cxx:257
 AliZDC.cxx:258
 AliZDC.cxx:259
 AliZDC.cxx:260
 AliZDC.cxx:261
 AliZDC.cxx:262
 AliZDC.cxx:263
 AliZDC.cxx:264
 AliZDC.cxx:265
 AliZDC.cxx:266
 AliZDC.cxx:267
 AliZDC.cxx:268
 AliZDC.cxx:269
 AliZDC.cxx:270
 AliZDC.cxx:271
 AliZDC.cxx:272
 AliZDC.cxx:273
 AliZDC.cxx:274
 AliZDC.cxx:275
 AliZDC.cxx:276
 AliZDC.cxx:277
 AliZDC.cxx:278
 AliZDC.cxx:279
 AliZDC.cxx:280
 AliZDC.cxx:281
 AliZDC.cxx:282
 AliZDC.cxx:283
 AliZDC.cxx:284
 AliZDC.cxx:285
 AliZDC.cxx:286
 AliZDC.cxx:287
 AliZDC.cxx:288
 AliZDC.cxx:289
 AliZDC.cxx:290
 AliZDC.cxx:291
 AliZDC.cxx:292
 AliZDC.cxx:293
 AliZDC.cxx:294
 AliZDC.cxx:295
 AliZDC.cxx:296
 AliZDC.cxx:297
 AliZDC.cxx:298
 AliZDC.cxx:299
 AliZDC.cxx:300
 AliZDC.cxx:301
 AliZDC.cxx:302
 AliZDC.cxx:303
 AliZDC.cxx:304
 AliZDC.cxx:305
 AliZDC.cxx:306
 AliZDC.cxx:307
 AliZDC.cxx:308
 AliZDC.cxx:309
 AliZDC.cxx:310
 AliZDC.cxx:311
 AliZDC.cxx:312
 AliZDC.cxx:313
 AliZDC.cxx:314
 AliZDC.cxx:315
 AliZDC.cxx:316
 AliZDC.cxx:317
 AliZDC.cxx:318
 AliZDC.cxx:319
 AliZDC.cxx:320
 AliZDC.cxx:321
 AliZDC.cxx:322
 AliZDC.cxx:323
 AliZDC.cxx:324
 AliZDC.cxx:325
 AliZDC.cxx:326
 AliZDC.cxx:327
 AliZDC.cxx:328
 AliZDC.cxx:329
 AliZDC.cxx:330
 AliZDC.cxx:331
 AliZDC.cxx:332
 AliZDC.cxx:333
 AliZDC.cxx:334
 AliZDC.cxx:335
 AliZDC.cxx:336
 AliZDC.cxx:337
 AliZDC.cxx:338
 AliZDC.cxx:339
 AliZDC.cxx:340
 AliZDC.cxx:341
 AliZDC.cxx:342
 AliZDC.cxx:343
 AliZDC.cxx:344
 AliZDC.cxx:345
 AliZDC.cxx:346
 AliZDC.cxx:347
 AliZDC.cxx:348
 AliZDC.cxx:349
 AliZDC.cxx:350
 AliZDC.cxx:351
 AliZDC.cxx:352
 AliZDC.cxx:353
 AliZDC.cxx:354
 AliZDC.cxx:355
 AliZDC.cxx:356
 AliZDC.cxx:357
 AliZDC.cxx:358
 AliZDC.cxx:359
 AliZDC.cxx:360
 AliZDC.cxx:361
 AliZDC.cxx:362
 AliZDC.cxx:363
 AliZDC.cxx:364
 AliZDC.cxx:365
 AliZDC.cxx:366
 AliZDC.cxx:367
 AliZDC.cxx:368
 AliZDC.cxx:369
 AliZDC.cxx:370
 AliZDC.cxx:371
 AliZDC.cxx:372
 AliZDC.cxx:373
 AliZDC.cxx:374
 AliZDC.cxx:375
 AliZDC.cxx:376
 AliZDC.cxx:377
 AliZDC.cxx:378
 AliZDC.cxx:379
 AliZDC.cxx:380
 AliZDC.cxx:381
 AliZDC.cxx:382
 AliZDC.cxx:383
 AliZDC.cxx:384
 AliZDC.cxx:385
 AliZDC.cxx:386
 AliZDC.cxx:387
 AliZDC.cxx:388
 AliZDC.cxx:389
 AliZDC.cxx:390
 AliZDC.cxx:391
 AliZDC.cxx:392
 AliZDC.cxx:393
 AliZDC.cxx:394
 AliZDC.cxx:395
 AliZDC.cxx:396
 AliZDC.cxx:397
 AliZDC.cxx:398
 AliZDC.cxx:399
 AliZDC.cxx:400
 AliZDC.cxx:401
 AliZDC.cxx:402
 AliZDC.cxx:403
 AliZDC.cxx:404
 AliZDC.cxx:405
 AliZDC.cxx:406
 AliZDC.cxx:407
 AliZDC.cxx:408
 AliZDC.cxx:409
 AliZDC.cxx:410
 AliZDC.cxx:411
 AliZDC.cxx:412
 AliZDC.cxx:413
 AliZDC.cxx:414
 AliZDC.cxx:415
 AliZDC.cxx:416
 AliZDC.cxx:417
 AliZDC.cxx:418
 AliZDC.cxx:419
 AliZDC.cxx:420
 AliZDC.cxx:421
 AliZDC.cxx:422
 AliZDC.cxx:423
 AliZDC.cxx:424
 AliZDC.cxx:425
 AliZDC.cxx:426
 AliZDC.cxx:427
 AliZDC.cxx:428
 AliZDC.cxx:429
 AliZDC.cxx:430
 AliZDC.cxx:431
 AliZDC.cxx:432
 AliZDC.cxx:433
 AliZDC.cxx:434
 AliZDC.cxx:435
 AliZDC.cxx:436
 AliZDC.cxx:437
 AliZDC.cxx:438
 AliZDC.cxx:439
 AliZDC.cxx:440
 AliZDC.cxx:441
 AliZDC.cxx:442
 AliZDC.cxx:443
 AliZDC.cxx:444
 AliZDC.cxx:445
 AliZDC.cxx:446
 AliZDC.cxx:447
 AliZDC.cxx:448
 AliZDC.cxx:449
 AliZDC.cxx:450
 AliZDC.cxx:451
 AliZDC.cxx:452
 AliZDC.cxx:453
 AliZDC.cxx:454
 AliZDC.cxx:455
 AliZDC.cxx:456
 AliZDC.cxx:457
 AliZDC.cxx:458
 AliZDC.cxx:459
 AliZDC.cxx:460
 AliZDC.cxx:461
 AliZDC.cxx:462
 AliZDC.cxx:463
 AliZDC.cxx:464
 AliZDC.cxx:465
 AliZDC.cxx:466
 AliZDC.cxx:467
 AliZDC.cxx:468
 AliZDC.cxx:469
 AliZDC.cxx:470
 AliZDC.cxx:471
 AliZDC.cxx:472
 AliZDC.cxx:473
 AliZDC.cxx:474
 AliZDC.cxx:475
 AliZDC.cxx:476
 AliZDC.cxx:477
 AliZDC.cxx:478
 AliZDC.cxx:479
 AliZDC.cxx:480
 AliZDC.cxx:481
 AliZDC.cxx:482
 AliZDC.cxx:483
 AliZDC.cxx:484
 AliZDC.cxx:485
 AliZDC.cxx:486
 AliZDC.cxx:487
 AliZDC.cxx:488
 AliZDC.cxx:489
 AliZDC.cxx:490
 AliZDC.cxx:491
 AliZDC.cxx:492
 AliZDC.cxx:493
 AliZDC.cxx:494
 AliZDC.cxx:495
 AliZDC.cxx:496
 AliZDC.cxx:497
 AliZDC.cxx:498
 AliZDC.cxx:499
 AliZDC.cxx:500
 AliZDC.cxx:501
 AliZDC.cxx:502
 AliZDC.cxx:503
 AliZDC.cxx:504
 AliZDC.cxx:505
 AliZDC.cxx:506
 AliZDC.cxx:507
 AliZDC.cxx:508
 AliZDC.cxx:509
 AliZDC.cxx:510
 AliZDC.cxx:511
 AliZDC.cxx:512
 AliZDC.cxx:513
 AliZDC.cxx:514
 AliZDC.cxx:515
 AliZDC.cxx:516
 AliZDC.cxx:517
 AliZDC.cxx:518
 AliZDC.cxx:519
 AliZDC.cxx:520
 AliZDC.cxx:521
 AliZDC.cxx:522
 AliZDC.cxx:523
 AliZDC.cxx:524
 AliZDC.cxx:525
 AliZDC.cxx:526
 AliZDC.cxx:527
 AliZDC.cxx:528
 AliZDC.cxx:529
 AliZDC.cxx:530
 AliZDC.cxx:531
 AliZDC.cxx:532
 AliZDC.cxx:533
 AliZDC.cxx:534
 AliZDC.cxx:535
 AliZDC.cxx:536
 AliZDC.cxx:537
 AliZDC.cxx:538
 AliZDC.cxx:539
 AliZDC.cxx:540
 AliZDC.cxx:541
 AliZDC.cxx:542
 AliZDC.cxx:543
 AliZDC.cxx:544
 AliZDC.cxx:545
 AliZDC.cxx:546
 AliZDC.cxx:547
 AliZDC.cxx:548
 AliZDC.cxx:549
 AliZDC.cxx:550
 AliZDC.cxx:551
 AliZDC.cxx:552
 AliZDC.cxx:553
 AliZDC.cxx:554
 AliZDC.cxx:555
 AliZDC.cxx:556
 AliZDC.cxx:557
 AliZDC.cxx:558
 AliZDC.cxx:559
 AliZDC.cxx:560
 AliZDC.cxx:561
 AliZDC.cxx:562
 AliZDC.cxx:563
 AliZDC.cxx:564
 AliZDC.cxx:565
 AliZDC.cxx:566
 AliZDC.cxx:567
 AliZDC.cxx:568
 AliZDC.cxx:569
 AliZDC.cxx:570
 AliZDC.cxx:571
 AliZDC.cxx:572
 AliZDC.cxx:573
 AliZDC.cxx:574
 AliZDC.cxx:575
 AliZDC.cxx:576
 AliZDC.cxx:577
 AliZDC.cxx:578
 AliZDC.cxx:579
 AliZDC.cxx:580
 AliZDC.cxx:581
 AliZDC.cxx:582
 AliZDC.cxx:583
 AliZDC.cxx:584
 AliZDC.cxx:585
 AliZDC.cxx:586
 AliZDC.cxx:587
 AliZDC.cxx:588
 AliZDC.cxx:589
 AliZDC.cxx:590
 AliZDC.cxx:591
 AliZDC.cxx:592
 AliZDC.cxx:593
 AliZDC.cxx:594
 AliZDC.cxx:595
 AliZDC.cxx:596
 AliZDC.cxx:597
 AliZDC.cxx:598
 AliZDC.cxx:599
 AliZDC.cxx:600
 AliZDC.cxx:601
 AliZDC.cxx:602
 AliZDC.cxx:603
 AliZDC.cxx:604
 AliZDC.cxx:605
 AliZDC.cxx:606
 AliZDC.cxx:607
 AliZDC.cxx:608
 AliZDC.cxx:609
 AliZDC.cxx:610
 AliZDC.cxx:611
 AliZDC.cxx:612
 AliZDC.cxx:613
 AliZDC.cxx:614
 AliZDC.cxx:615
 AliZDC.cxx:616
 AliZDC.cxx:617
 AliZDC.cxx:618
 AliZDC.cxx:619
 AliZDC.cxx:620
 AliZDC.cxx:621
 AliZDC.cxx:622
 AliZDC.cxx:623
 AliZDC.cxx:624
 AliZDC.cxx:625
 AliZDC.cxx:626
 AliZDC.cxx:627
 AliZDC.cxx:628
 AliZDC.cxx:629
 AliZDC.cxx:630
 AliZDC.cxx:631
 AliZDC.cxx:632
 AliZDC.cxx:633
 AliZDC.cxx:634
 AliZDC.cxx:635
 AliZDC.cxx:636
 AliZDC.cxx:637
 AliZDC.cxx:638
 AliZDC.cxx:639
 AliZDC.cxx:640
 AliZDC.cxx:641
 AliZDC.cxx:642
 AliZDC.cxx:643
 AliZDC.cxx:644
 AliZDC.cxx:645
 AliZDC.cxx:646
 AliZDC.cxx:647
 AliZDC.cxx:648
 AliZDC.cxx:649
 AliZDC.cxx:650
 AliZDC.cxx:651
 AliZDC.cxx:652
 AliZDC.cxx:653
 AliZDC.cxx:654
 AliZDC.cxx:655
 AliZDC.cxx:656
 AliZDC.cxx:657
 AliZDC.cxx:658
 AliZDC.cxx:659
 AliZDC.cxx:660
 AliZDC.cxx:661
 AliZDC.cxx:662
 AliZDC.cxx:663
 AliZDC.cxx:664
 AliZDC.cxx:665
 AliZDC.cxx:666
 AliZDC.cxx:667
 AliZDC.cxx:668
 AliZDC.cxx:669
 AliZDC.cxx:670
 AliZDC.cxx:671
 AliZDC.cxx:672
 AliZDC.cxx:673
 AliZDC.cxx:674
 AliZDC.cxx:675
 AliZDC.cxx:676
 AliZDC.cxx:677
 AliZDC.cxx:678
 AliZDC.cxx:679
 AliZDC.cxx:680
 AliZDC.cxx:681
 AliZDC.cxx:682
 AliZDC.cxx:683
 AliZDC.cxx:684
 AliZDC.cxx:685
 AliZDC.cxx:686
 AliZDC.cxx:687
 AliZDC.cxx:688
 AliZDC.cxx:689
 AliZDC.cxx:690
 AliZDC.cxx:691
 AliZDC.cxx:692
 AliZDC.cxx:693
 AliZDC.cxx:694
 AliZDC.cxx:695
 AliZDC.cxx:696
 AliZDC.cxx:697
 AliZDC.cxx:698
 AliZDC.cxx:699
 AliZDC.cxx:700
 AliZDC.cxx:701
 AliZDC.cxx:702
 AliZDC.cxx:703
 AliZDC.cxx:704
 AliZDC.cxx:705
 AliZDC.cxx:706
 AliZDC.cxx:707
 AliZDC.cxx:708
 AliZDC.cxx:709
 AliZDC.cxx:710
 AliZDC.cxx:711
 AliZDC.cxx:712
 AliZDC.cxx:713
 AliZDC.cxx:714
 AliZDC.cxx:715
 AliZDC.cxx:716
 AliZDC.cxx:717
 AliZDC.cxx:718
 AliZDC.cxx:719
 AliZDC.cxx:720
 AliZDC.cxx:721
 AliZDC.cxx:722
 AliZDC.cxx:723
 AliZDC.cxx:724
 AliZDC.cxx:725
 AliZDC.cxx:726
 AliZDC.cxx:727
 AliZDC.cxx:728
 AliZDC.cxx:729
 AliZDC.cxx:730
 AliZDC.cxx:731
 AliZDC.cxx:732
 AliZDC.cxx:733
 AliZDC.cxx:734
 AliZDC.cxx:735
 AliZDC.cxx:736
 AliZDC.cxx:737
 AliZDC.cxx:738
 AliZDC.cxx:739
 AliZDC.cxx:740
 AliZDC.cxx:741
 AliZDC.cxx:742
 AliZDC.cxx:743
 AliZDC.cxx:744
 AliZDC.cxx:745
 AliZDC.cxx:746
 AliZDC.cxx:747
 AliZDC.cxx:748
 AliZDC.cxx:749
 AliZDC.cxx:750
 AliZDC.cxx:751
 AliZDC.cxx:752
 AliZDC.cxx:753
 AliZDC.cxx:754
 AliZDC.cxx:755
 AliZDC.cxx:756
 AliZDC.cxx:757
 AliZDC.cxx:758
 AliZDC.cxx:759
 AliZDC.cxx:760
 AliZDC.cxx:761
 AliZDC.cxx:762
 AliZDC.cxx:763
 AliZDC.cxx:764
 AliZDC.cxx:765
 AliZDC.cxx:766
 AliZDC.cxx:767
 AliZDC.cxx:768
 AliZDC.cxx:769
 AliZDC.cxx:770
 AliZDC.cxx:771
 AliZDC.cxx:772
 AliZDC.cxx:773
 AliZDC.cxx:774
 AliZDC.cxx:775
 AliZDC.cxx:776
 AliZDC.cxx:777
 AliZDC.cxx:778
 AliZDC.cxx:779
 AliZDC.cxx:780
 AliZDC.cxx:781
 AliZDC.cxx:782
 AliZDC.cxx:783
 AliZDC.cxx:784
 AliZDC.cxx:785
 AliZDC.cxx:786
 AliZDC.cxx:787
 AliZDC.cxx:788
 AliZDC.cxx:789
 AliZDC.cxx:790
 AliZDC.cxx:791
 AliZDC.cxx:792
 AliZDC.cxx:793
 AliZDC.cxx:794
 AliZDC.cxx:795
 AliZDC.cxx:796
 AliZDC.cxx:797
 AliZDC.cxx:798
 AliZDC.cxx:799
 AliZDC.cxx:800
 AliZDC.cxx:801
 AliZDC.cxx:802
 AliZDC.cxx:803
 AliZDC.cxx:804
 AliZDC.cxx:805
 AliZDC.cxx:806
 AliZDC.cxx:807
 AliZDC.cxx:808
 AliZDC.cxx:809
 AliZDC.cxx:810
 AliZDC.cxx:811
 AliZDC.cxx:812
 AliZDC.cxx:813
 AliZDC.cxx:814
 AliZDC.cxx:815
 AliZDC.cxx:816
 AliZDC.cxx:817
 AliZDC.cxx:818
 AliZDC.cxx:819
 AliZDC.cxx:820
 AliZDC.cxx:821
 AliZDC.cxx:822
 AliZDC.cxx:823
 AliZDC.cxx:824
 AliZDC.cxx:825
 AliZDC.cxx:826
 AliZDC.cxx:827
 AliZDC.cxx:828
 AliZDC.cxx:829
 AliZDC.cxx:830
 AliZDC.cxx:831
 AliZDC.cxx:832
 AliZDC.cxx:833
 AliZDC.cxx:834
 AliZDC.cxx:835
 AliZDC.cxx:836
 AliZDC.cxx:837
 AliZDC.cxx:838
 AliZDC.cxx:839
 AliZDC.cxx:840
 AliZDC.cxx:841
 AliZDC.cxx:842
 AliZDC.cxx:843
 AliZDC.cxx:844
 AliZDC.cxx:845
 AliZDC.cxx:846
 AliZDC.cxx:847
 AliZDC.cxx:848
 AliZDC.cxx:849
 AliZDC.cxx:850
 AliZDC.cxx:851
 AliZDC.cxx:852
 AliZDC.cxx:853
 AliZDC.cxx:854
 AliZDC.cxx:855
 AliZDC.cxx:856
 AliZDC.cxx:857
 AliZDC.cxx:858
 AliZDC.cxx:859
 AliZDC.cxx:860