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

///////////////////////////////////////////////////////////////////////////
//                                                                       //
//                          V-Zero   Detector                            //
//  This class contains the base procedures for the VZERO  detector      //
//  Default geometry of November 2003 :   V0R box is 4.4 cm thick        //
//                                  scintillators are 2 cm thick         //
//  All comments should be sent to Brigitte CHEYNIS :                    //
//                                 b.cheynis@ipnl.in2p3.fr               //
//                                                                       //
//                                                                       //
///////////////////////////////////////////////////////////////////////////


// --- Standard libraries ---
#include <Riostream.h>
#include <stdlib.h>

// --- ROOT libraries ---
#include <TNamed.h>
#include "TROOT.h"
#include "TFile.h"
#include "TNetFile.h"
#include "TRandom.h"
#include "TTree.h"
#include "TBranch.h"
#include "TClonesArray.h"
#include "TStopwatch.h"
#include "TParameter.h"
#include "TF1.h"

// --- AliRoot header files ---
#include "AliRun.h"
#include "AliMC.h"
#include "AliVZERO.h"
#include "AliVZEROLoader.h"
#include "AliVZERODigitizer.h"
#include "AliVZEROBuffer.h"
#include "AliDigitizationInput.h"
#include "AliVZEROdigit.h"
#include "AliVZEROSDigit.h"
#include "AliDAQ.h"
#include "AliRawReader.h"
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliVZERORawStream.h"
#include "AliVZEROCalibData.h"
#include "AliVZERORecoParam.h"
#include "AliVZEROReconstructor.h"

ClassImp(AliVZERO)
 //__________________________________________________________________
AliVZERO::AliVZERO(): AliDetector(),
          fIdSens1(0),
          fThickness(0.),
	  fThickness1(0.),
	  fMaxStepQua(0.),
	  fMaxStepAlu(0.),
	  fMaxDestepQua(0.),
          fMaxDestepAlu(0.),
          fCalibData(NULL),
          fTimeSlewing(NULL),
          fSignalShape(NULL),
          fRecoParam(NULL)
{
/// Default Constructor
    
    AliDebug(1,Form("default (empty) ctor this=%p",this));
    fIshunt          = 0;

    for(Int_t i = 0 ; i < 64; ++i) {
      fNBins[i] = 0;
      fBinSize[i] = 0;
    }
}

//_____________________________________________________________________________
AliVZERO::AliVZERO(const char *name, const char *title)
       : AliDetector(name,title),
         fIdSens1(0),
         fThickness(4.4),
	 fThickness1(2.0),
	 fMaxStepQua(0.05),
	 fMaxStepAlu(0.01),
	 fMaxDestepQua(-1.0),
	 fMaxDestepAlu(-1.0),
	 fCalibData(NULL),
	 fTimeSlewing(NULL),
         fSignalShape(NULL),
	 fRecoParam(NULL)
{
  
  // Standard constructor for VZERO Detector
  
  AliDebug(1,Form("ctor this=%p",this));
  
  //  fIshunt       =  1;  // All hits are associated with primary particles  
   
  fHits         =  new TClonesArray("AliVZEROhit", 400);
  fDigits       =  new TClonesArray("AliVZEROdigit",400); 
   
  gAlice->GetMCApp()->AddHitList(fHits);

//   fThickness    =  4.4;   // total thickness of the V0R box in cm
//   fThickness1   =  2.0;   // thickness of scintillating cells in cm
//   
//   fMaxStepQua   =  0.05; 
//   fMaxStepAlu   =  0.01; 
//   
//   fMaxDestepQua =  -1.0;
//   fMaxDestepAlu =  -1.0;
  
  for(Int_t i = 0 ; i < 64; ++i) {
    fNBins[i] = 0;
    fBinSize[i] = 0;
  }
}

//_____________________________________________________________________________
AliVZERO::~AliVZERO()
{
  //
  // Default destructor for VZERO Detector
  //
  
    if (fHits) {
        fHits->Delete();
        delete fHits;
	fHits=0; }
    
    if (fDigits) {
        fDigits->Delete();
        delete fDigits;
        fDigits=0; }
    if (fSignalShape) {
      delete fSignalShape;
      fSignalShape = NULL;
    }
    if (fRecoParam) {
      delete fRecoParam;
      fRecoParam = NULL;
    }
}

//_____________________________________________________________________________
void AliVZERO::CreateGeometry()
{
  //
  // Builds simple Geant3 geometry 
  //
}
//_____________________________________________________________________________
void AliVZERO::CreateMaterials()
{
  //
  // Creates materials used for Geant3 geometry 
  //
}

//_____________________________________________________________________________
void AliVZERO::Init()
{
  //
  // Initialises the VZERO  class after it has been built
  //
}


//_____________________________________________________________________________
void AliVZERO::SetMaxStepQua(Float_t p1)
{
  //
  // Possible parametrisation of steps in active materials
  //
     fMaxStepQua = p1;
}

//_____________________________________________________________________________
void AliVZERO::SetMaxStepAlu(Float_t p1)
{
  //
  // Possible parametrisation of steps in Aluminum foils (not used in 
  // version v2)
  //
    fMaxStepAlu = p1;
}

//_____________________________________________________________________________
void AliVZERO::SetMaxDestepQua(Float_t p1)
{
  //
  // Possible parametrisation of steps in active materials (quartz)
  //
    fMaxDestepQua = p1;
}

//_____________________________________________________________________________
void AliVZERO::SetMaxDestepAlu(Float_t p1)
{
  //
  // Possible parametrisation of steps in Aluminum (not used in 
  // version v2)
  //
    fMaxDestepAlu = p1;
}

//_____________________________________________________________________________
AliLoader* AliVZERO::MakeLoader(const char* topfoldername)
{ 
  //
  // Builds VZEROgetter (AliLoader type)
  // if detector wants to use customized getter, it must overload this method
  //
//  Info("MakeLoader","Creating AliVZEROLoader. Top folder is %s.",topfoldername); 
 
  AliDebug(1,Form("Creating AliVZEROLoader, Top folder is %s ",topfoldername));
  fLoader = new AliVZEROLoader(GetName(),topfoldername);
  return fLoader;
}

//_____________________________________________________________________________
void AliVZERO::SetTreeAddress()
{
  //
  // Sets tree address for hits.
  //
  if (fLoader->TreeH() && (fHits == 0x0))
    fHits = new  TClonesArray("AliVZEROhit", 400);

  AliDetector::SetTreeAddress();
}

//_____________________________________________________________________________
AliDigitizer* AliVZERO::CreateDigitizer(AliDigitizationInput* digInput) const
{
  //
  // Creates a digitizer for VZERO
  //
  return new AliVZERODigitizer(digInput);
}

//_____________________________________________________________________________
void AliVZERO::Hits2Digits(){
  //
  // Converts hits to digits
  //
  // Creates the VZERO digitizer 
  AliVZERODigitizer* dig = new AliVZERODigitizer(this,AliVZERODigitizer::kHits2Digits);

  // Creates the digits
  dig->Digitize("");

  // deletes the digitizer
  delete dig;
}

//_____________________________________________________________________________
void AliVZERO::Hits2SDigits(){
  //
  // Converts hits to summable digits
  //
  // Creates the VZERO digitizer 
  AliVZERODigitizer* dig = new AliVZERODigitizer(this,AliVZERODigitizer::kHits2SDigits);

  // Creates the sdigits
  dig->Digitize("");

  // deletes the digitizer
  delete dig;
}

//_____________________________________________________________________________
void AliVZERO::Digits2Raw()
{
   //
   //  Converts digits of the current event to raw data
   //
  
   AliVZERO *fVZERO = (AliVZERO*)gAlice->GetDetector("VZERO");
   fLoader->LoadDigits();
   TTree* digits = fLoader->TreeD();
   if (!digits) {
      Error("Digits2Raw", "no digits tree");
      return;
   }
   TClonesArray * VZEROdigits = new TClonesArray("AliVZEROdigit",1000);
   fVZERO->SetTreeAddress();  		
   digits->GetBranch("VZERODigit")->SetAddress(&VZEROdigits); 
  
   const char *fileName    = AliDAQ::DdlFileName("VZERO",0);
   AliVZEROBuffer* buffer  = new AliVZEROBuffer(fileName);
  
   // Get Trigger information first
   // Read trigger inputs from trigger-detector object
   AliDataLoader * dataLoader = fLoader->GetDigitsDataLoader();
   if( !dataLoader->IsFileOpen() ) 
        dataLoader->OpenFile( "READ" );
   AliTriggerDetector* trgdet = (AliTriggerDetector*)dataLoader->GetDirectory()->Get( "Trigger" );
   UInt_t triggerInfo = 0;
   if(trgdet) {
      triggerInfo = trgdet->GetMask() & 0xffff;
   }
   else {
      AliError(Form("There is no trigger object for %s",fLoader->GetName()));
   }

   buffer->WriteTriggerInfo((UInt_t)triggerInfo); 
   buffer->WriteTriggerScalers(); 
   buffer->WriteBunchNumbers(); 
  
   Int_t aBBflagsV0A = 0;
   Int_t aBBflagsV0C = 0;
   Int_t aBGflagsV0A = 0;
   Int_t aBGflagsV0C = 0;

   if (digits->GetUserInfo()->FindObject("BBflagsV0A")) {
     aBBflagsV0A = ((TParameter<int>*)digits->GetUserInfo()->FindObject("BBflagsV0A"))->GetVal();
   }
   else
     AliWarning("V0A beam-beam flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!");

   if (digits->GetUserInfo()->FindObject("BBflagsV0C")) {
     aBBflagsV0C = ((TParameter<int>*)digits->GetUserInfo()->FindObject("BBflagsV0C"))->GetVal();
   }
   else
     AliWarning("V0C beam-beam flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!");

   if (digits->GetUserInfo()->FindObject("BGflagsV0A")) {
     aBGflagsV0A = ((TParameter<int>*)digits->GetUserInfo()->FindObject("BGflagsV0A"))->GetVal();
   }
   else
     AliWarning("V0A beam-gas flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!");

   if (digits->GetUserInfo()->FindObject("BGflagsV0C")) {
     aBGflagsV0C = ((TParameter<int>*)digits->GetUserInfo()->FindObject("BGflagsV0C"))->GetVal();
   }
   else
     AliWarning("V0C beam-gas flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!");

   // Now retrieve the channel information: charge smaples + time and 
   // dump it into ADC and Time arrays
   Int_t nEntries = Int_t(digits->GetEntries());
   Short_t aADC[64][AliVZEROdigit::kNClocks];
   Float_t aTime[64];
   Float_t aWidth[64];
   Bool_t  aIntegrator[64];
   Bool_t  aBBflag[64];
   Bool_t  aBGflag[64];
  
   for (Int_t i = 0; i < nEntries; i++) {
     fVZERO->ResetDigits();
     digits->GetEvent(i);
     Int_t ndig = VZEROdigits->GetEntriesFast(); 
   
     if(ndig == 0) continue;
     for(Int_t k=0; k<ndig; k++){
         AliVZEROdigit* fVZERODigit = (AliVZEROdigit*) VZEROdigits->At(k);
         // Convert aliroot channel k into FEE channel iChannel before writing data
	 Int_t iChannel       = AliVZEROCalibData::GetBoardNumber(fVZERODigit->PMNumber()) * 8 +
	   AliVZEROCalibData::GetFEEChannelNumber(fVZERODigit->PMNumber());
	 for(Int_t iClock = 0; iClock < AliVZEROdigit::kNClocks; ++iClock) aADC[iChannel][iClock] = fVZERODigit->ChargeADC(iClock);
	 aTime[iChannel]      = fVZERODigit->Time();
	 aWidth[iChannel]     = fVZERODigit->Width();
	 aIntegrator[iChannel]= fVZERODigit->Integrator();
	 if(fVZERODigit->PMNumber() < 32) {
	   aBBflag[iChannel] = (aBBflagsV0C >> fVZERODigit->PMNumber()) & 0x1;
	   aBGflag[iChannel] = (aBGflagsV0C >> fVZERODigit->PMNumber()) & 0x1;
	 }
	 else {
	   aBBflag[iChannel] = (aBBflagsV0A >> (fVZERODigit->PMNumber()-32)) & 0x1;
	   aBGflag[iChannel] = (aBGflagsV0A >> (fVZERODigit->PMNumber()-32)) & 0x1;
	 }
         AliDebug(1,Form("DDL: %s\tdigit number: %d\tPM number: %d\tADC: %d\tTime: %f",
			 fileName,k,fVZERODigit->PMNumber(),aADC[iChannel][AliVZEROdigit::kNClocks/2],aTime[iChannel])); 
     }        
   }

   // Now fill raw data
          
   for (Int_t  iCIU = 0; iCIU < 8; iCIU++) { 
 
   // decoding of one Channel Interface Unit numbered iCIU - there are 8 channels per CIU (and 8 CIUs) :
  
      for(Int_t iChannel_Offset = iCIU*8; iChannel_Offset < (iCIU*8)+8; iChannel_Offset=iChannel_Offset+4) { 
         for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
             buffer->WriteChannel(iChannel, aADC[iChannel], aIntegrator[iChannel]);       
         }
         buffer->WriteBeamFlags(&aBBflag[iChannel_Offset],&aBGflag[iChannel_Offset]); 
         buffer->WriteMBInfo(); 
         buffer->WriteMBFlags();   
         buffer->WriteBeamScalers(); 
      } 

      for(Int_t iChannel = iCIU*8 + 7; iChannel >= iCIU*8; iChannel--) {
          buffer->WriteTiming(aTime[iChannel], aWidth[iChannel]); 
      }

    // End of decoding of one CIU card
    
  } // end of decoding the eight CIUs
     
  delete buffer;
  fLoader->UnloadDigits();  
}

//_____________________________________________________________________________
Bool_t AliVZERO::Raw2SDigits(AliRawReader* rawReader){
  // Converts the VZERO raw data into digits
  // The method is used for merging simulated and
  // real data events
  TStopwatch timer;
  timer.Start();

  if(!fLoader) {
    AliError("no VZERO loader found");
    return kFALSE;
  }
  fLoader->LoadSDigits("UPDATE");

  if (!fLoader->TreeS()) fLoader->MakeTree("S");
  fLoader->MakeSDigitsContainer();
  TTree* treeS  = fLoader->TreeS();

  TClonesArray *sdigits = new TClonesArray("AliVZEROSDigit", 64);
  treeS->Branch("VZEROSDigit", &sdigits); 

  {
    rawReader->Reset();
    AliVZERORawStream rawStream(rawReader);    
     
    if (!rawStream.Next()) return kFALSE; // No VZERO data found

    GetCalibData();

    Int_t nSDigits = 0;
    Float_t *charges = NULL;
    Int_t nbins = 0;
    for(Int_t iChannel=0; iChannel < 64; ++iChannel) {
      Int_t offlineCh = rawStream.GetOfflineChannel(iChannel);
      Short_t chargeADC[AliVZEROdigit::kNClocks];
      for(Int_t iClock=0; iClock < AliVZEROdigit::kNClocks; ++iClock) {
	chargeADC[iClock] = rawStream.GetPedestal(iChannel,iClock);
      }
      // Integrator flag
      Bool_t integrator = rawStream.GetIntegratorFlag(iChannel,AliVZEROdigit::kNClocks/2);
      // HPTDC data (leading time and width)
      Int_t board = AliVZEROCalibData::GetBoardNumber(offlineCh);
      Float_t time = rawStream.GetTime(iChannel)*fCalibData->GetTimeResolution(board);
      //      Float_t width = rawStream.GetWidth(iChannel)*fCalibData->GetWidthResolution(board);
      Float_t adc = 0;

      // Pedestal retrieval and suppression
      Float_t maxadc = 0;
      Int_t imax = -1;
      Float_t adcPedSub[AliVZEROdigit::kNClocks];
      Float_t integral = fSignalShape->Integral(0,200);
      for(Int_t iClock=0; iClock < AliVZEROdigit::kNClocks; ++iClock) {
	Bool_t iIntegrator = (iClock%2 == 0) ? integrator : !integrator;
	Int_t k = offlineCh + 64*iIntegrator;
	adcPedSub[iClock] = (Float_t)chargeADC[iClock] - fCalibData->GetPedestal(k);
	if(adcPedSub[iClock] <= fRecoParam->GetNSigmaPed()*fCalibData->GetSigma(k)) {
	  adcPedSub[iClock] = 0;
	  continue;
	}
	if(iClock < fRecoParam->GetStartClock() || iClock > fRecoParam->GetEndClock()) continue;
	if(adcPedSub[iClock] > maxadc) {
	  maxadc = adcPedSub[iClock];
	  imax   = iClock;
	}
      }
      if (imax != -1) {
	Int_t start = imax - fRecoParam->GetNPreClocks();
	if (start < 0) start = 0;
	Int_t end = imax + fRecoParam->GetNPostClocks();
	if (end > 20) end = 20;
	for(Int_t iClock = start; iClock <= end; iClock++) {
	  adc += adcPedSub[iClock];
	}
      }
      Float_t correctedTime = CorrectLeadingTime(offlineCh,time,adc);

      if (!charges) {
	nbins = fNBins[offlineCh];
	charges = new Float_t[nbins];
      }
      else if (nbins != fNBins[offlineCh]) {
	delete [] charges;
	nbins = fNBins[offlineCh];
	charges = new Float_t[nbins];
      }
      memset(charges,0,nbins*sizeof(Float_t));

      // Now lets produce SDigit
      if ((correctedTime > (AliVZEROReconstructor::kInvalidTime + 1e-6)) &&
	  (adc > 1e-6)) {
	for(Int_t iBin = 0; iBin < nbins; ++iBin) {
	  Float_t t = fBinSize[offlineCh]*Float_t(iBin);
	  if ((t < correctedTime) ||
	      (t > (correctedTime+200.))) continue;
	  charges[iBin] = kChargePerADC*adc*(fSignalShape->Eval(t-correctedTime)*fBinSize[offlineCh]/integral);
	}
      }

      TClonesArray &sdigitsref = *sdigits;  
      new (sdigitsref[nSDigits++]) AliVZEROSDigit(offlineCh,fNBins[offlineCh],charges);
    }
    if (charges) delete [] charges;
  }
  
  treeS->Fill();
  fLoader->WriteSDigits("OVERWRITE");
  fLoader->UnloadSDigits();	
	
  timer.Stop();
  timer.Print();
  return kTRUE;
}

//_____________________________________________________________________________
void AliVZERO::GetCalibData()
{
  // Gets calibration object for VZERO set
  // Do nothing in case it is already loaded
  if (fCalibData) return;

  AliCDBEntry *entry = AliCDBManager::Instance()->Get("VZERO/Calib/Data");
  if (entry) fCalibData = (AliVZEROCalibData*) entry->GetObject();
  if (!fCalibData)  AliFatal("No calibration data from calibration database !");

  AliCDBEntry *entry2 = AliCDBManager::Instance()->Get("VZERO/Calib/TimeSlewing");
  if (!entry2) AliFatal("VZERO time slewing function is not found in OCDB !");
  fTimeSlewing = (TF1*)entry2->GetObject();

  for(Int_t i = 0 ; i < 64; ++i) {
    Int_t board = AliVZEROCalibData::GetBoardNumber(i);
    fNBins[i] = TMath::Nint(((Float_t)(fCalibData->GetMatchWindow(board)+1)*25.0+
			     (Float_t)kMaxTDCWidth*fCalibData->GetWidthResolution(board))/
			    fCalibData->GetTimeResolution(board));
    fBinSize[i] = fCalibData->GetTimeResolution(board);
  }

  fSignalShape = new TF1("VZEROSDigitSignalShape",this,&AliVZERO::SignalShape,0,200,6,"AliVZERO","SignalShape");
  fSignalShape->SetParameters(0,1.57345e1,-4.25603e-1,
			      2.9,6.40982,3.69339e-01);

  fRecoParam = new AliVZERORecoParam;

  return;
}

Float_t AliVZERO::CorrectLeadingTime(Int_t i, Float_t time, Float_t adc) const
{
  // Correct the leading time
  // for slewing effect and
  // misalignment of the channels
  if (time < 1e-6) return -1024;

  // In case of pathological signals
  if (adc < 1e-6) return time;

  // Slewing correction
  Float_t thr = fCalibData->GetCalibDiscriThr(i,kTRUE);
  time -= fTimeSlewing->Eval(adc/thr);

  return time;
}

double AliVZERO::SignalShape(double *x, double *par)
{
  // this function simulates the signal
  // shape used in Raw->SDigits method

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