LCOV - code coverage report
Current view: top level - ZDC/ZDCrec - AliZDCReconstructor.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 479 818 58.6 %
Date: 2016-06-14 17:26:59 Functions: 18 22 81.8 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : /* $Id$ */
      17             : 
      18             : ///////////////////////////////////////////////////////////////////////////////
      19             : //                                                                           //
      20             : //      ************** Class for ZDC reconstruction      **************      //
      21             : //                  Author: Chiara.Oppedisano@to.infn.it                     //
      22             : //                                                                           //
      23             : // NOTATIONS ADOPTED TO IDENTIFY DETECTORS (used in different ages!):        //
      24             : //   (ZNC,ZPC) or (ZNC, ZPC) or RIGHT refers to side C (RB26)                //
      25             : //   (ZNA,ZPA) or (ZNA, ZPA) or LEFT refers to side A (RB24)                 //
      26             : //                                                                           //
      27             : ///////////////////////////////////////////////////////////////////////////////
      28             : 
      29             : 
      30             : #include <TH2F.h>
      31             : #include <TH1D.h>
      32             : #include <TAxis.h>
      33             : #include <TMap.h>
      34             : 
      35             : #include "AliRawReader.h"
      36             : #include "AliESDEvent.h"
      37             : #include "AliESDZDC.h"
      38             : #include "AliZDCDigit.h"
      39             : #include "AliZDCRawStream.h"
      40             : #include "AliZDCReco.h"
      41             : #include "AliZDCReconstructor.h"
      42             : #include "AliZDCPedestals.h"
      43             : #include "AliZDCEnCalib.h"
      44             : #include "AliZDCSaturationCalib.h"
      45             : #include "AliZDCTowerCalib.h"
      46             : #include "AliZDCMBCalib.h"
      47             : #include "AliZDCTDCCalib.h"
      48             : #include "AliZDCChMap.h"
      49             : #include "AliZDCRecoParam.h"
      50             : #include "AliZDCRecoParampp.h"
      51             : #include "AliZDCRecoParamPbPb.h"
      52             : #include "AliRunInfo.h"
      53             : #include "AliLHCClockPhase.h"
      54             : 
      55             : 
      56          12 : ClassImp(AliZDCReconstructor)
      57             : AliZDCRecoParam *AliZDCReconstructor::fgRecoParam=0;  //reconstruction parameters
      58             : AliZDCMBCalib *AliZDCReconstructor::fgMBCalibData=0;  //calibration parameters for A-A reconstruction
      59             : 
      60             : //_____________________________________________________________________________
      61           2 : AliZDCReconstructor:: AliZDCReconstructor() :
      62           4 :   fPedData(GetPedestalData()),
      63           4 :   fEnCalibData(GetEnergyCalibData()),
      64           4 :   fSatCalibData(GetSaturationCalibData()),
      65           4 :   fTowCalibData(GetTowerCalibData()),
      66           4 :   fTDCCalibData(GetTDCCalibData()),
      67           4 :   fMapping(GetMapping()),
      68           2 :   fRecoMode(0),
      69           2 :   fBeamEnergy(0.),
      70           2 :   fNRun(0),
      71           2 :   fIsCalibrationMB(kFALSE),
      72           2 :   fSignalThreshold(7),
      73           2 :   fMeanPhase(0),
      74           2 :   fESDZDC(NULL)
      75          10 : {
      76             :   // **** Default constructor
      77           4 : }
      78             : 
      79             : 
      80             : //_____________________________________________________________________________
      81             : AliZDCReconstructor::~AliZDCReconstructor()
      82          12 : {
      83             : // destructor
      84             : //   if(fgRecoParam)    delete fgRecoParam;
      85           2 :   AliCDBManager * man = AliCDBManager::Instance();
      86           4 :   if (man && !man->GetCacheFlag()) { // CDB objects must NOT be deleted if cache is active!
      87           0 :     if(fPedData)      delete fPedData;    
      88           0 :     if(fEnCalibData)  delete fEnCalibData;
      89           0 :     if(fSatCalibData) delete fSatCalibData;
      90           0 :     if(fTowCalibData) delete fTowCalibData;
      91           0 :     if(fgMBCalibData) delete fgMBCalibData;
      92           0 :     if(fTDCCalibData) delete fTDCCalibData;
      93           0 :     if(fMapping)      delete fMapping;
      94             :   }
      95           6 :   if(fESDZDC)       delete fESDZDC;
      96           6 : }
      97             : 
      98             : //____________________________________________________________________________
      99             : void AliZDCReconstructor::Init()
     100             : {
     101             :   // Setting reconstruction parameters
     102             :     
     103           4 :   TString runType = GetRunInfo()->GetRunType();
     104           4 :   if((runType.CompareTo("CALIBRATION_MB")) == 0){
     105           0 :     fIsCalibrationMB = kTRUE;
     106           0 :   }
     107             :     
     108           4 :   TString beamType = GetRunInfo()->GetBeamType();
     109             :   // To allow reconstruction in tests without beam
     110           4 :   if(((beamType.CompareTo("UNKNOWN"))==0) && 
     111           4 :      ((runType.CompareTo("PHYSICS"))==0 || (runType.CompareTo("CALIBRATION_BC"))==0)){
     112           2 :     fRecoMode=1;
     113           2 :   }
     114             :     
     115           2 :   fBeamEnergy = GetRunInfo()->GetBeamEnergy();
     116           2 :   if(fBeamEnergy<0.01){
     117           0 :      AliWarning(" Beam energy value missing -> setting it to 1380 GeV ");
     118           0 :      fBeamEnergy = 1380.;
     119           0 :   }
     120             :   
     121          10 :   if(((beamType.CompareTo("pp"))==0) || ((beamType.CompareTo("p-p"))==0)
     122          10 :      ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){
     123           0 :     fRecoMode=1;
     124           0 :   }
     125          10 :   else if(((beamType.CompareTo("p-A"))==0) || ((beamType.CompareTo("A-p"))==0)
     126          10 :      ||((beamType.CompareTo("P-A"))==0) || ((beamType.CompareTo("A-P"))==0)){
     127           0 :     fRecoMode=1;
     128           0 :   }
     129           8 :   else if((beamType.CompareTo("A-A")) == 0 || (beamType.CompareTo("AA")) == 0){
     130           0 :     fRecoMode=2;
     131             :     /*if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
     132             :     if(fgRecoParam){
     133             :       fgRecoParam->SetGlauberMCDist(fBeamEnergy);    
     134             :     }*/ 
     135           0 :   }
     136             : 
     137           8 :   AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase"); 
     138           2 :   if (!entry) AliFatal("LHC clock-phase shift is not found in OCDB !");
     139             :   else{
     140           2 :     AliLHCClockPhase *phaseLHC = (AliLHCClockPhase*)entry->GetObject();
     141             :     // 4/2/2011 According to A. Di Mauro BEAM1 measurement is more reliable 
     142             :     // than BEAM2 and therefore also than the average of the 2
     143           4 :     fMeanPhase = phaseLHC->GetMeanPhaseB1();
     144             :   }  
     145           2 :   if(fIsCalibrationMB==kFALSE)  
     146           8 :     AliInfo(Form("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f + %1.0f GeV *****\n\n",
     147             :         beamType.Data(), fBeamEnergy, fBeamEnergy));
     148             :   
     149             :   // if EMD calibration run NO ENERGY CALIBRATION should be performed
     150             :   // pp-like reconstruction must be performed (E calib. coeff. = 1)
     151           4 :   if((runType.CompareTo("CALIBRATION_EMD")) == 0) fRecoMode=1; 
     152             :   
     153           6 :   AliInfo(Form("  ZDC reconstruction mode %d (1 -> p-p/p-A, 2-> A-A)\n\n",fRecoMode));
     154             :   
     155           6 :   fESDZDC = new AliESDZDC();
     156           2 : }
     157             : 
     158             : 
     159             : //____________________________________________________________________________
     160             : void AliZDCReconstructor::Init(TString beamType, Float_t beamEnergy)
     161             : {
     162             :   // Setting reconstruction mode
     163             :   // Needed to work in the HLT framework
     164             :   
     165           0 :   fIsCalibrationMB = kFALSE;
     166             :      
     167           0 :   fBeamEnergy = beamEnergy;
     168             :   
     169           0 :   if(((beamType.CompareTo("pp"))==0) || ((beamType.CompareTo("p-p"))==0)
     170           0 :      ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){
     171           0 :     fRecoMode=1;
     172           0 :   }
     173           0 :   else if(((beamType.CompareTo("p-A"))==0) || ((beamType.CompareTo("A-p"))==0)
     174           0 :      ||((beamType.CompareTo("P-A"))==0) || ((beamType.CompareTo("A-P"))==0)){
     175           0 :     fRecoMode=1;
     176           0 :   }
     177           0 :   else if((beamType.CompareTo("A-A")) == 0 || (beamType.CompareTo("AA")) == 0){
     178           0 :     fRecoMode=2;
     179             :     //if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
     180             :     //if( fgRecoParam ) fgRecoParam->SetGlauberMCDist(fBeamEnergy);  
     181           0 :   }    
     182             : 
     183           0 :   AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase"); 
     184           0 :   if (!entry) AliFatal("LHC clock-phase shift is not found in OCDB !");
     185             :   else{
     186           0 :     AliLHCClockPhase *phaseLHC = (AliLHCClockPhase*)entry->GetObject();
     187           0 :     fMeanPhase = phaseLHC->GetMeanPhase();
     188             :   }
     189           0 :   fESDZDC = new AliESDZDC();
     190             :   
     191           0 :   AliInfo(Form("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f + %1.0f GeV *****\n\n",
     192             :         beamType.Data(), fBeamEnergy, fBeamEnergy));
     193             :   
     194           0 : }
     195             : 
     196             : //_____________________________________________________________________________
     197             : void AliZDCReconstructor::Reconstruct(TTree* digitsTree, TTree* clustersTree) const
     198             : {
     199             :   // *** Local ZDC reconstruction for digits
     200             :   // Works on the current event
     201             :     
     202             :   // Retrieving calibration data  
     203             :   // Parameters for mean value pedestal subtraction
     204             :   int const kNch = 24;
     205           8 :   Float_t meanPed[2*kNch];    
     206         392 :   for(Int_t jj=0; jj<2*kNch; jj++) meanPed[jj] = fPedData->GetMeanPed(jj);
     207             :   // Parameters pedestal subtraction through correlation with out-of-time signals
     208           4 :   Float_t corrCoeff0[2*kNch], corrCoeff1[2*kNch];
     209         392 :   for(Int_t jj=0; jj<2*kNch; jj++){
     210         192 :      corrCoeff0[jj] = fPedData->GetPedCorrCoeff0(jj);
     211         192 :      corrCoeff1[jj] = fPedData->GetPedCorrCoeff1(jj);
     212             :   }
     213           4 :   Bool_t testPedSubBit = fPedData->TestPedModeBit();
     214             :   
     215           4 :   Bool_t chPedSubMode[kNch] = {0,};
     216           4 :   if(testPedSubBit){
     217           0 :        for(int i=0; i<kNch; i++) chPedSubMode[i] = fPedData->GetUseCorrFit(i);
     218           0 :   }
     219             : 
     220           4 :   int adcInTime[kNch][2], adcOutOfTime[kNch][2];
     221           4 :   float adcCorr[kNch][2];
     222           4 :   int signalCode[2*kNch]={0,};
     223         200 :   for(int ich=0; ich<24; ich++){
     224         576 :      for(int ig=0; ig<=1; ig++){
     225         192 :         adcInTime[ich][ig] = adcOutOfTime[ich][ig] = adcCorr[ich][ig] = -1;
     226             :      }
     227             :   }
     228           4 :   int tdcCabling[7]={-1,-1,-1,-1,-1,-1,-1};
     229             : 
     230             :   // get digits
     231           4 :   AliZDCDigit digit;
     232           4 :   AliZDCDigit* pdigit = &digit;
     233           4 :   digitsTree->SetBranchAddress("ZDC", &pdigit);
     234             :   //printf("\n\t # of digits in tree: %d\n",(Int_t) digitsTree->GetEntries());
     235             : 
     236             :   // loop over digits  
     237           8 :   Int_t digNentries = digitsTree->GetEntries();
     238         392 :   for(Int_t iDigit=0; iDigit<digNentries; iDigit++){
     239         192 :      digitsTree->GetEntry(iDigit);
     240         192 :      if(pdigit){       
     241             :        // first kNch channels are in-time ADC values
     242         192 :        if(iDigit<kNch){
     243         576 :           for(int igain=0; igain<=1; igain++) adcInTime[iDigit][igain] = digit.GetADCValue(igain);
     244          96 :        }
     245          96 :        else if(iDigit>=kNch && iDigit<2*kNch){
     246         576 :           for(int igain=0; igain<=1; igain++) adcOutOfTime[iDigit-kNch][igain] = digit.GetADCValue(igain);
     247          96 :        }
     248           0 :        else AliWarning(" Looking for wrong index in digit tree: index >kNch !!!\n");
     249             :        //
     250             :        // Writing cabled signal code for digits!!!!!!!!!!!!!!!!!!!!!!!!
     251         192 :        int det = digit.GetSector(0);
     252         192 :        int quad = digit.GetSector(1);
     253         192 :        if(iDigit<kNch){  // first Nch digits are for in time signals
     254          96 :          signalCode[iDigit] = GetChannelSignal(det, quad, kTRUE);
     255          96 :        } 
     256         192 :        if(testPedSubBit){
     257           0 :          if(iDigit>=kNch && iDigit<2*kNch){  // 2nd Nch digits are for out of time signals
     258           0 :             signalCode[iDigit] = GetChannelSignal(det, quad, kFALSE);
     259           0 :           }
     260             :       } // if(testPedSubBit)
     261         192 :     }
     262             :   } // Loop over digits
     263             :   
     264             :   // PEDESTAL subtraction
     265             :   // Nov 2015: if PedSubMode==kTRUE but coefficients are null, mean value must be subtracted!!!!!
     266         200 :   for(int ich=0; ich<24; ich++){
     267          96 :      if(chPedSubMode[ich]==kTRUE && (TMath::Abs(corrCoeff1[ich])>0. && TMath::Abs(corrCoeff0[ich])>0.)){
     268             :        // Pedestal subtraction from correlation ------------------------------------------------
     269           0 :        for(int igain=0; igain<=1; igain++) 
     270           0 :            adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - (corrCoeff1[ich+igain*kNch]*adcOutOfTime[ich][igain]+corrCoeff0[ich+igain*kNch]));
     271           0 :      }
     272          96 :      else if((chPedSubMode[ich]==kFALSE) || (chPedSubMode[ich]==kTRUE && ((TMath::Abs(corrCoeff1[ich]))<1e5 && TMath::Abs(corrCoeff0[ich])<1e5))){
     273             :         // Pedestal subtraction from mean value ------------------------------------------------
     274         576 :         for(int igain=0; igain<=1; igain++){
     275         192 :            adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - meanPed[ich+igain*kNch]);
     276             :         }
     277          96 :       }
     278             :   // Ch. debug
     279             :   //printf("ZDC rec.ADC: ch.%d (code %d) rawADC %d subMode %d meanPed %f pedfromcorr = %f  -> corrADC HR %f \n", ich, adcSignal[ich], adcInTime[ich][0], chPedSubMode[ich], meanPed[ich], corrCoeff1[ich]*adcOutOfTime[ich][0]+corrCoeff0[ich], adcCorr[ich][0]);
     280             :   }
     281             :   
     282             :    // Ch. debug
     283             :    //printf("\n ---- AliZDCReconstructor: rec from digits\n");
     284             :    //for(int ich=0; ich<kNch; ich++) if(adcInTime[ich][0]>0.) printf(" ch.%d signalcode %d rawADC HR %d subMode %d  corrADC HR %f \n", ich, signalCode[ich], adcInTime[ich][0], chPedSubMode[ich], adcCorr[ich][0]);
     285             :    
     286           4 :   UInt_t counts[32];
     287           4 :   Int_t  tdc[32][4];
     288         264 :   for(Int_t jj=0; jj<32; jj++){
     289         128 :     counts[jj]=0;
     290        1280 :     for(Int_t ii=0; ii<4; ii++) tdc[jj][ii]=0;
     291             :   }
     292             :   
     293           4 :   Int_t  evQualityBlock[4] = {1,0,0,0};
     294           4 :   Int_t  triggerBlock[4] = {0,0,0,0};
     295           4 :   Int_t  chBlock[3] = {0,0,0};
     296             :   UInt_t puBits=0;
     297             :   
     298             :   // reconstruct the event
     299           4 :   if(fRecoMode==1)
     300           8 :     ReconstructEventpp(clustersTree, adcCorr, signalCode, tdcCabling, kFALSE, counts, tdc,
     301           4 :       evQualityBlock,  triggerBlock,  chBlock, puBits);
     302           0 :   else if(fRecoMode==2)
     303           0 :     ReconstructEventPbPb(clustersTree, adcCorr, signalCode, tdcCabling, kFALSE, counts, tdc,
     304           0 :       evQualityBlock,  triggerBlock,  chBlock, puBits);    
     305           4 : }
     306             : 
     307             : //_____________________________________________________________________________
     308             : void AliZDCReconstructor::Reconstruct(AliRawReader* rawReader, TTree* clustersTree) const
     309             : {
     310             :   // *** ZDC raw data reconstruction
     311             :   // Works on the current event
     312             : 
     313             :   // Retrieving calibration data  
     314             :   // Parameters for pedestal subtraction
     315             :   int const kNch = 24;
     316           8 :   Float_t meanPed[2*kNch];    
     317         392 :   for(Int_t jj=0; jj<2*kNch; jj++) meanPed[jj] = fPedData->GetMeanPed(jj);
     318             :   // Parameters pedestal subtraction through correlation with out-of-time signals
     319           4 :   Float_t corrCoeff0[2*kNch], corrCoeff1[2*kNch];
     320         392 :   for(Int_t jj=0; jj<2*kNch; jj++){
     321         192 :      corrCoeff0[jj] =  fPedData->GetPedCorrCoeff0(jj);
     322         192 :      corrCoeff1[jj] =  fPedData->GetPedCorrCoeff1(jj);
     323             :      //printf("  %d   %1.4f  %1.4f\n", jj,corrCoeff0[jj],corrCoeff1[jj]);
     324             :   }
     325           4 :   Bool_t testPedSubBit = fPedData->TestPedModeBit();
     326             :   //ch. debug
     327             :   //printf("   pedSubMode from OCDB object (test bit) %d (FALSE = mean value, TRUE = from corr. w. o.o.t)\n", testPedSubBit);
     328             :   
     329             :   // Reading mapping from OCDB 
     330             :   //fMapping->Print("");
     331             :   //
     332           4 :   Int_t tdcSignalCode[32] = {0};
     333             :   // **** Adding a fix since kL0 in RUN1 was not set in the mapping (23/7/2015)
     334             :   Bool_t iskL0set = kFALSE;
     335         264 :   for(int i=0; i<32; i++){
     336         128 :      tdcSignalCode[i] = fMapping->GetTDCSignalCode(i);
     337             :      // Ch. debug
     338             :      //printf(" TDC ch.%d  signal %d \n",i, tdcSignalCode[i]);
     339             :   
     340         132 :      if(fMapping->GetTDCSignalCode(i) == kL0) iskL0set = kTRUE;
     341             :   }
     342             :   // if kL0 is not set (RUN1) it is manually set to ch.15
     343           4 :   if(!iskL0set) tdcSignalCode[15] = kL0;
     344             :   // Ch. debug
     345             :   //printf(" iskL0set %d  tdcSignalCode[15] %d \n",iskL0set, tdcSignalCode[15]);
     346             :   
     347             :   Bool_t isScalerOn=kFALSE;
     348             :   Int_t jsc=0, itdc=0, ihittdc=0;
     349           4 :   Int_t iprevtdc[32];
     350           4 :   UInt_t scalerData[32]={0,};
     351           4 :   Int_t tdcData[32][4]; 
     352         264 :   for(Int_t k=0; k<32; k++){
     353         128 :     iprevtdc[k]=-1;
     354        1280 :     for(Int_t i=0; i<4; i++) tdcData[k][i]=0;
     355             :   }
     356             :   
     357             :   
     358           4 :   Int_t  evQualityBlock[4] = {1,0,0,0};
     359           4 :   Int_t  triggerBlock[4] = {0,0,0,0};
     360           4 :   Int_t  chBlock[3] = {0,0,0};
     361             :   UInt_t puBits=0;
     362             : 
     363           4 :   int adcInTime[kNch][2], adcOutOfTime[kNch][2];
     364           4 :   float adcCorr[kNch][2];
     365         200 :   for(int ich=0; ich<kNch; ich++){
     366         576 :     for(int ig=0; ig<=1; ig++) adcInTime[ich][ig] = adcOutOfTime[ich][ig] = adcCorr[ich][ig] = 0;
     367             :   }
     368             :   
     369           4 :   Bool_t chPedSubMode[kNch] = {0,};
     370           4 :   if(testPedSubBit){
     371           0 :     for(int i=0; i<kNch; i++) chPedSubMode[i] = fPedData->GetUseCorrFit(i);
     372           0 :   }
     373             :   
     374           4 :   int adcSignal[kNch]={0};
     375           4 :   int tdcCabling[7]={-1,-1,-1,-1,-1,-1,-1};
     376             : 
     377             :   
     378             :   // loop over raw data
     379             :   //rawReader->Reset();
     380           4 :   AliZDCRawStream rawData(rawReader);
     381         844 :   while(rawData.Next()){
     382             :    
     383             :    // ***************************** Reading ADCs
     384         832 :    if((rawData.GetADCModule()>=kFirstADCGeo) && (rawData.GetADCModule()<=kLastADCGeo)){    
     385             :     //printf(" **** Reading ADC raw data from module %d **** \n",rawData.GetADCModule());
     386             :     //
     387        1112 :     if((rawData.IsADCDataWord()) && (rawData.GetNChannelsOn()<48))    chBlock[0] = kTRUE;
     388         755 :     if((rawData.IsADCDataWord()) && (rawData.IsOverflow() == kTRUE))  chBlock[1] = kTRUE;
     389         764 :     if((rawData.IsADCDataWord()) && (rawData.IsUnderflow() == kTRUE)) chBlock[2] = kTRUE;
     390        1112 :     if((rawData.IsADCDataWord()) && (rawData.IsADCEventGood() == kTRUE)) evQualityBlock[0] = kTRUE;
     391             :     
     392        1100 :     if((rawData.IsADCDataWord()) && (rawData.IsUnderflow()==kFALSE) 
     393         708 :         && (rawData.IsOverflow()==kFALSE)){
     394             :         //&& (rawData.IsOverflow()==kFALSE) && (rawData.IsADCEventGood()==kTRUE)){
     395             :      
     396         345 :       Int_t adcMod = rawData.GetADCModule();
     397         345 :       Int_t adcCh = rawData.GetADCChannel();
     398         345 :       Int_t det = rawData.GetSector(0);
     399         345 :       Int_t quad = rawData.GetSector(1);
     400         345 :       Int_t gain = rawData.GetADCGain();
     401         345 :       Int_t value = rawData.GetADCValue();
     402             :       //
     403             :       // NB -> index is needed to cpompute which of the 24 signal I want to reconstruct I am dealing with!!!!!!!!!
     404             :       // The order is: ZNC(PMC,1,2,3,4) ZPC(PMC,1,2,3,4) ZEM1 ZEM2 ZNA(PMC,1,2,3,4) ZPA(PMC,1,2,3,4) PMREF1 PMREF2
     405             :       // that MUST correspond to the oredr with which are written the pedestals!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     406             :       int index = -1;
     407         345 :       if(quad!=5){
     408         378 :         if(det==1)      index = quad;
     409         308 :         else if(det==2) index = 5+quad;
     410         216 :         else if(det==3) index = 9+quad; // giusto 9!!!!
     411         240 :         else if(det==4) index = 12+quad;
     412         160 :         else if(det==5) index = 17+quad;
     413             :       }
     414          32 :       else index = (det-1)/3+22;     
     415             :       //Ch.debug
     416             :       //printf("\t AliZDCReconstructor: ADC mod.%d ch.%d det.%d quad.%d, gain.%d   value %d\n",adcMod, adcCh,det,quad,gain,value);
     417             :       
     418         345 :       if((adcMod==0 || adcMod==1) && index!=-1){
     419         201 :          adcInTime[index][gain] = value; // in time signals     
     420         201 :          adcSignal[index] = GetChannelSignal(det, quad, kTRUE);
     421             :          //Ch.debug
     422             :          //printf("   mod.%d ch.%d sigcode %d det.%d  sec.%d  adcInTime[%d][%d] = %d\n\n",adcMod, adcCh, adcSignal[index], det,quad,index, gain, value);
     423         201 :       }
     424         144 :       else if((adcMod==2 || adcMod==3) && index!=-1){
     425         144 :          adcOutOfTime[index][gain] = value; // out of time signals
     426         144 :       }
     427             : 
     428         345 :     }//IsADCDataWord
     429             :    }// ADC DATA
     430             :    // ***************************** Reading Scaler
     431          24 :    else if(rawData.GetADCModule()==kScalerGeo){
     432           0 :      if(rawData.IsScalerWord()==kTRUE){
     433             :        isScalerOn = kTRUE;
     434           0 :        scalerData[jsc] = rawData.GetTriggerCount();
     435             :        // Ch. debug
     436             :        //printf("   Reconstructed VME Scaler: %d %d  ",jsc,scalerData[jsc]);
     437             :        //
     438           0 :        jsc++;
     439           0 :      }
     440             :    }// VME SCALER DATA
     441             :    // ***************************** Reading ZDC TDC
     442          24 :    else if(rawData.GetADCModule()==kZDCTDCGeo && rawData.IsZDCTDCDatum()==kTRUE){
     443           0 :        itdc = rawData.GetChannel(); 
     444             :        // Setting signal code read from OCDB
     445           0 :        rawData.SetCabledSignal(tdcSignalCode[itdc]);
     446             :        // setting TDC channels from raw data (=0 if reconstructing from digits!!!!)
     447             :        // NB -> I want to store the ch. in tdcCabling variable ONLY if it is not yet stored!!!
     448             :        // NB -> THE ORDER MUST BE THE SAME AS THE ONE IN ZDCMAPPINGDA.cxx (7/7/2015)
     449             :        //       ZEM1 ZEM2 ZNC ZPC ZNA ZPA
     450             :        // otherwise calibrated TDC won't be centered around zero (wrong offset subtracted)
     451           0 :        if(tdcSignalCode[itdc]==kZEM1D && tdcCabling[0]<0) tdcCabling[0] = itdc;
     452           0 :        else if(tdcSignalCode[itdc]==kZEM2D && tdcCabling[1]<0) tdcCabling[1] = itdc;
     453           0 :        else if(tdcSignalCode[itdc]==kZNCD && tdcCabling[2]<0)  tdcCabling[2] = itdc;
     454           0 :        else if(tdcSignalCode[itdc]==kZPCD && tdcCabling[3]<0)  tdcCabling[3] = itdc;
     455           0 :        else if(tdcSignalCode[itdc]==kZNAD && tdcCabling[4]<0)  tdcCabling[4] = itdc;
     456           0 :        else if(tdcSignalCode[itdc]==kZPAD && tdcCabling[5]<0)  tdcCabling[5] = itdc;
     457           0 :        else if(tdcSignalCode[itdc]==kL0 && tdcCabling[6]<0)    tdcCabling[6] = itdc;
     458             :        //
     459           0 :        iprevtdc[itdc]++;
     460           0 :        if(iprevtdc[itdc]<4) tdcData[itdc][iprevtdc[itdc]] = rawData.GetZDCTDCDatum();
     461             :        // Ch. debug
     462             :        //printf("   TDCch.%d hit %d signal %d value %d\n",itdc, iprevtdc[itdc], rawData.GetCabledSignal(),rawData.GetZDCTDCDatum());
     463             :    }// ZDC TDC DATA
     464             :    // ***************************** Reading PU
     465          24 :    else if(rawData.GetADCModule()==kPUGeo){
     466           0 :      puBits = rawData.GetDetectorPattern();
     467           0 :    }
     468             :     // ***************************** Reading trigger history
     469          24 :    else if(rawData.IstriggerHistoryWord()==kTRUE){
     470           0 :      triggerBlock[0] = rawData.IsCPTInputEMDTrigger();
     471           0 :      triggerBlock[1] = rawData.IsCPTInputSemiCentralTrigger();
     472           0 :      triggerBlock[2] = rawData.IsCPTInputCentralTrigger();
     473           0 :      triggerBlock[3] = rawData.IsCPTInputMBTrigger();
     474           0 :    }
     475             :   
     476             :   }//loop on raw data
     477             :   // Ch. debug
     478             :   //printf("\n  TDC channels  ZEM1 %d ZEM2 %d ZNC %d ZPC %d ZNA %d  ZPA %d L0 %d\n\n", tdcCabling[0],tdcCabling[1],tdcCabling[2],tdcCabling[3],tdcCabling[4],tdcCabling[5],tdcCabling[6]);
     479             :   
     480             :   // PEDESTAL subtraction
     481             :   // Jul 2015: if PedSubMode==kTRUE but coefficients are null, mean value must be subtracted!!!!!
     482         200 :   for(int ich=0; ich<24; ich++){
     483          96 :      if(chPedSubMode[ich]==kTRUE && (TMath::Abs(corrCoeff1[ich])>0. && TMath::Abs(corrCoeff0[ich])>0.)){
     484             :        // Pedestal subtraction from correlation ------------------------------------------------
     485           0 :        for(int igain=0; igain<=1; igain++) 
     486           0 :            adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - (corrCoeff1[ich+igain*kNch]*adcOutOfTime[ich][igain]+corrCoeff0[ich+igain*kNch]));
     487           0 :      }
     488          96 :      else if((chPedSubMode[ich]==kFALSE) || (chPedSubMode[ich]==kTRUE && ((TMath::Abs(corrCoeff1[ich]))<1e5 && TMath::Abs(corrCoeff0[ich])<1e5))){
     489             :         // Pedestal subtraction from mean value ------------------------------------------------
     490         576 :         for(int igain=0; igain<=1; igain++){
     491         192 :            adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - meanPed[ich+igain*kNch]);
     492             :         }
     493          96 :       }
     494             :   // Ch. debug
     495             :   //printf("ZDC rec.ADC: ch.%d (code %d) rawADC %d subMode %d meanPed %f pedfromcorr = %f  -> corrADC HR %f \n", ich, adcSignal[ich], adcInTime[ich][0], chPedSubMode[ich], meanPed[ich], corrCoeff1[ich]*adcOutOfTime[ich][0]+corrCoeff0[ich], adcCorr[ich][0]);
     496             :   }
     497             :   
     498             :   
     499             :     
     500           4 :   if(fRecoMode==1) // p-p data
     501           8 :     ReconstructEventpp(clustersTree, adcCorr, adcSignal, tdcCabling, isScalerOn, scalerData, tdcData,
     502           4 :       evQualityBlock, triggerBlock, chBlock, puBits);
     503           0 :   else if(fRecoMode==2) // Pb-Pb data
     504           0 :       ReconstructEventPbPb(clustersTree, adcCorr, adcSignal, tdcCabling, isScalerOn, scalerData,  tdcData,
     505           0 :       evQualityBlock, triggerBlock, chBlock, puBits);
     506           4 : }
     507             : 
     508             : //_____________________________________________________________________________
     509             : void AliZDCReconstructor::ReconstructEventpp(TTree *clustersTree, 
     510             :         Float_t adc[24][2], Int_t signalCodeADC[24], Int_t tdcCabling[7], Bool_t isScalerOn, UInt_t* scaler, 
     511             :         Int_t tdc[32][4], const Int_t* const evQualityBlock, 
     512             :         const Int_t* const triggerBlock, const Int_t* const chBlock, UInt_t puBits) const
     513             : {
     514             :   // ****************** Reconstruct one event ******************
     515             : 
     516             :   int const kNch = 24;
     517           8 :   Float_t corrADCZNC[10] = {0,}, corrADCZPC[10] = {0,};
     518           8 :   Float_t corrADCZNA[10] = {0,}, corrADCZPA[10] = {0,};
     519           8 :   Float_t corrADCZEM1[2] = {0,0}, corrADCZEM2[2] = {0,0};
     520           8 :   Float_t sPMRef1[2] = {0,0}, sPMRef2[2] = {0,0};
     521             :   
     522         400 :   for(int i=0; i<kNch; i++){
     523         192 :     if(signalCodeADC[i]==kZNAC){
     524          48 :       for(int igain=0; igain<=1; igain++) corrADCZNA[0+5*igain] = adc[i][igain];
     525           8 :     }
     526         184 :     else if(signalCodeADC[i]==kZNA1){
     527          48 :       for(int igain=0; igain<=1; igain++) corrADCZNA[1+5*igain] = adc[i][igain];
     528           8 :     }
     529         176 :     else if(signalCodeADC[i]==kZNA2){
     530          48 :       for(int igain=0; igain<=1; igain++) corrADCZNA[2+5*igain] = adc[i][igain];
     531           8 :     }
     532         168 :     else if(signalCodeADC[i]==kZNA3){
     533          48 :       for(int igain=0; igain<=1; igain++) corrADCZNA[3+5*igain] = adc[i][igain];
     534           8 :     }
     535         160 :     else if(signalCodeADC[i]==kZNA4){
     536          48 :       for(int igain=0; igain<=1; igain++) corrADCZNA[4+5*igain] = adc[i][igain];
     537           8 :     }
     538         152 :     else if(signalCodeADC[i]==kZPAC){
     539          48 :       for(int igain=0; igain<=1; igain++) corrADCZPA[0+5*igain] = adc[i][igain];
     540           8 :     }
     541         144 :     else if(signalCodeADC[i]==kZPA1){
     542          48 :       for(int igain=0; igain<=1; igain++) corrADCZPA[1+5*igain] = adc[i][igain];
     543           8 :     }
     544         136 :     else if(signalCodeADC[i]==kZPA2){
     545          48 :       for(int igain=0; igain<=1; igain++) corrADCZPA[2+5*igain] = adc[i][igain];
     546           8 :     }
     547         128 :     else if(signalCodeADC[i]==kZPA3){
     548          48 :       for(int igain=0; igain<=1; igain++) corrADCZPA[3+5*igain] = adc[i][igain];
     549           8 :     }
     550         120 :     else if(signalCodeADC[i]==kZPA4){
     551          48 :       for(int igain=0; igain<=1; igain++) corrADCZPA[4+5*igain] = adc[i][igain];
     552           8 :     }
     553         112 :     else if(signalCodeADC[i]==kZEM1){
     554          48 :       for(int igain=0; igain<=1; igain++) corrADCZEM1[igain] = adc[i][igain];
     555           8 :     }
     556         104 :     else if(signalCodeADC[i]==kZEM2){  
     557          48 :       for(int igain=0; igain<=1; igain++) corrADCZEM2[igain] = adc[i][igain];
     558           8 :     }
     559          96 :     else if(signalCodeADC[i]==kZNCC){ 
     560          48 :       for(int igain=0; igain<=1; igain++) corrADCZNC[0+5*igain] = adc[i][igain];
     561           8 :     }
     562          88 :     else if(signalCodeADC[i]==kZNC1){
     563          48 :       for(int igain=0; igain<=1; igain++) corrADCZNC[1+5*igain] = adc[i][igain];
     564           8 :     }
     565          80 :     else if(signalCodeADC[i]==kZNC2){
     566          48 :       for(int igain=0; igain<=1; igain++) corrADCZNC[2+5*igain] = adc[i][igain];
     567           8 :     }
     568          72 :     else if(signalCodeADC[i]==kZNC3){
     569          48 :       for(int igain=0; igain<=1; igain++) corrADCZNC[3+5*igain] = adc[i][igain];
     570           8 :     }
     571          64 :     else if(signalCodeADC[i]==kZNC4){
     572          48 :       for(int igain=0; igain<=1; igain++) corrADCZNC[4+5*igain] = adc[i][igain];
     573           8 :     }
     574          56 :     else if(signalCodeADC[i]==kZPCC){ 
     575          48 :       for(int igain=0; igain<=1; igain++) corrADCZPC[0+5*igain] = adc[i][igain];
     576           8 :     }
     577          48 :     else if(signalCodeADC[i]==kZPC1){
     578          48 :       for(int igain=0; igain<=1; igain++) corrADCZPC[1+5*igain] = adc[i][igain];
     579           8 :     }
     580          40 :     else if(signalCodeADC[i]==kZPC2){
     581          48 :       for(int igain=0; igain<=1; igain++) corrADCZPC[2+5*igain] = adc[i][igain];
     582           8 :     }
     583          32 :     else if(signalCodeADC[i]==kZPC3){
     584          48 :       for(int igain=0; igain<=1; igain++) corrADCZPC[3+5*igain] = adc[i][igain];
     585           8 :     }
     586          24 :     else if(signalCodeADC[i]==kZPC4){
     587          48 :       for(int igain=0; igain<=1; igain++) corrADCZPC[4+5*igain] = adc[i][igain];
     588           8 :     }
     589          16 :     else if(signalCodeADC[i]==kZDCCMon){
     590           0 :       for(int igain=0; igain<=1; igain++) sPMRef1[igain] = adc[i][igain];
     591           0 :     }
     592          16 :     else if(signalCodeADC[i]==kZDCAMon){
     593           0 :       for(int igain=0; igain<=1; igain++) sPMRef2[igain] = adc[i][igain];
     594           0 :     }
     595             :     
     596             :     // Ch. Debug
     597             :     //printf("  ADC ch. %d  cabled signal %d\n",i, signalCodeADC[i]);
     598             :   }
     599             :   
     600             :   // CH. debug
     601             :   /*printf("\n*************************************************\n");
     602             :   printf(" ReconstructEventpp -> values after pedestal subtraction:\n");
     603             :   for(int ich=0; ich<24; ich++) printf(" ch.%d ADC hg %1.2f  lg %1.2f\n", ich, adc[ich][0],adc[ich][1]);
     604             :   printf("*************************************************\n");
     605             :   // CH. debug
     606             :   printf("\n*************************************************\n");
     607             :   printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     608             :         corrADCZNC[0],corrADCZNC[1],corrADCZNC[2],corrADCZNC[3],corrADCZNC[4]);
     609             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     610             :         corrADCZPC[0],corrADCZPC[1],corrADCZPC[2],corrADCZPC[3],corrADCZPC[4]);
     611             :   printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     612             :         corrADCZNA[0],corrADCZNA[1],corrADCZNA[2],corrADCZNA[3],corrADCZNA[4]);
     613             :   printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     614             :         corrADCZPA[0],corrADCZPA[1],corrADCZPA[2],corrADCZPA[3],corrADCZPA[4]);
     615             :   printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",corrADCZEM1[0],corrADCZEM2[0]);
     616             :   printf("*************************************************\n"); */
     617             :   
     618             :   // ---------------------- Setting reco flags for ESD
     619           8 :   UInt_t rFlags[32];
     620         528 :   for(Int_t ifl=0; ifl<32; ifl++) rFlags[ifl]=0;
     621             :   
     622          16 :   if(evQualityBlock[0] == 1) rFlags[31] = 0x0;
     623           0 :   else rFlags[31] = 0x1;
     624             :   //
     625           8 :   if(evQualityBlock[1] == 1) rFlags[30] = 0x1;
     626           8 :   if(evQualityBlock[2] == 1) rFlags[29] = 0x1;
     627           8 :   if(evQualityBlock[3] == 1) rFlags[28] = 0x1;
     628             : 
     629           8 :   if(triggerBlock[0] == 1) rFlags[27] = 0x1;
     630           8 :   if(triggerBlock[1] == 1) rFlags[26] = 0x1;
     631           8 :   if(triggerBlock[2] == 1) rFlags[25] = 0x1;
     632           8 :   if(triggerBlock[3] == 1) rFlags[24] = 0x1;
     633             :   
     634          12 :   if(chBlock[0] == 1) rFlags[18] = 0x1;
     635          11 :   if(chBlock[1] == 1) rFlags[17] = 0x1;
     636          12 :   if(chBlock[2] == 1) rFlags[16] = 0x1;
     637             :     
     638           8 :   rFlags[13] = puBits & 0x00000020;
     639           8 :   rFlags[12] = puBits & 0x00000010;
     640           8 :   rFlags[11] = puBits & 0x00000080;
     641           8 :   rFlags[10] = puBits & 0x00000040;
     642           8 :   rFlags[9]  = puBits & 0x00000020;
     643           8 :   rFlags[8]  = puBits & 0x00000010;
     644             :   
     645           8 :   if(corrADCZPC[0]>fSignalThreshold)  rFlags[5] = 0x1;
     646           8 :   if(corrADCZNC[0]>fSignalThreshold)  rFlags[4] = 0x1;
     647           8 :   if(corrADCZEM2[0]>fSignalThreshold) rFlags[3] = 0x1;
     648           8 :   if(corrADCZEM1[0]>fSignalThreshold) rFlags[2] = 0x1;
     649           8 :   if(corrADCZPA[0]>fSignalThreshold)  rFlags[1] = 0x1;
     650           8 :   if(corrADCZNA[0]>fSignalThreshold)  rFlags[0] = 0x1;
     651             :   
     652          16 :   UInt_t recoFlag = rFlags[31] << 31 | rFlags[30] << 30 | rFlags[29] << 29 | rFlags[28] << 28 |
     653          16 :              rFlags[27] << 27 | rFlags[26] << 26 | rFlags[25] << 25 | rFlags[24] << 24 |
     654             :              0x0 << 23 | 0x0 << 22 | 0x0 << 21 | 0x0 << 20 |
     655           8 :              0x0 << 19 | rFlags[18] << 18 |  rFlags[17] << 17 |  rFlags[16] << 16 |
     656          16 :              0x0 << 15 | 0x0 << 14 | rFlags[13] << 13 | rFlags[12] << 12 | 
     657          16 :              rFlags[11] << 11 |rFlags[10] << 10 | rFlags[9] << 9 | rFlags[8] << 8 |
     658          16 :              0x0 << 7 | 0x0 << 6 | rFlags[5] << 5 | rFlags[4] << 4 | 
     659          16 :              rFlags[3] << 3 | rFlags[2] << 2 | rFlags[1] << 1 | rFlags[0];
     660             :   // --------------------------------------------------
     661             : 
     662             :   // ******     Retrieving calibration data 
     663             :   // --- Equalization coefficients ---------------------------------------------
     664           8 :   Float_t equalCoeffZNC[5], equalCoeffZPC[5], equalCoeffZNA[5], equalCoeffZPA[5];
     665          96 :   for(Int_t ji=0; ji<5; ji++){
     666          40 :      equalCoeffZNC[ji] = fTowCalibData->GetZNCEqualCoeff(ji);
     667          40 :      equalCoeffZPC[ji] = fTowCalibData->GetZPCEqualCoeff(ji); 
     668          40 :      equalCoeffZNA[ji] = fTowCalibData->GetZNAEqualCoeff(ji); 
     669          40 :      equalCoeffZPA[ji] = fTowCalibData->GetZPAEqualCoeff(ji); 
     670             :   }
     671             :   // --- Energy calibration factors ------------------------------------
     672           8 :   Float_t calibEne[6], calibSatZNA[4], calibSatZNC[4];
     673             :   // **** Energy calibration coefficient set to 1 
     674             :   // **** (no trivial way to calibrate in p-p runs)
     675         112 :   for(Int_t ij=0; ij<6; ij++) calibEne[ij] = fEnCalibData->GetEnCalib(ij);
     676             :   //fEnCalibData->Print("");
     677          80 :   for(Int_t ij=0; ij<4; ij++){
     678          32 :     calibSatZNA[ij] = fSatCalibData->GetZNASatCalib(ij);
     679          32 :     calibSatZNC[ij] = fSatCalibData->GetZNCSatCalib(ij);
     680             :   }
     681             :   
     682             :   // ******     Equalization of detector responses ************************
     683           8 :   Float_t equalTowZNC[10], equalTowZNA[10], equalTowZPC[10], equalTowZPA[10];
     684         176 :   for(Int_t gi=0; gi<10; gi++){
     685         160 :      if(gi<5){
     686         120 :        equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi];
     687          40 :        equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi];
     688          40 :        equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi];
     689          40 :        equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi];
     690          40 :      }
     691             :      else{
     692          40 :        equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi-5];
     693          40 :        equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi-5];
     694          40 :        equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi-5];
     695          40 :        equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi-5];
     696             :      }
     697             :   }
     698             :   // Ch. debug
     699             :   /*printf("\n ------------- EQUALIZATION -------------\n");
     700             :   printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     701             :         equalTowZNC[0],equalTowZNC[1],equalTowZNC[2],equalTowZNC[3],equalTowZNC[4]);
     702             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     703             :         equalTowZPC[0],equalTowZPC[1],equalTowZPC[2],equalTowZPC[3],equalTowZPC[4]);
     704             :   printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     705             :         equalTowZNA[0],equalTowZNA[1],equalTowZNA[2],equalTowZNA[3],equalTowZNA[4]);
     706             :   printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     707             :         equalTowZPA[0],equalTowZPA[1],equalTowZPA[2],equalTowZPA[3],equalTowZPA[4]);
     708             :   printf(" ----------------------------------------\n");*/
     709             :   
     710             :   //  *** p-A RUN 2013 -> new calibration object
     711             :   //      to take into account saturation in ZN PMC
     712             :   //   -> 5th order pol. fun. to be applied BEFORE en. calibration 
     713          24 :   equalTowZNC[0] = equalTowZNC[0] + calibSatZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
     714          16 :         calibSatZNC[1]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
     715          16 :         calibSatZNC[2]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
     716           8 :         calibSatZNC[3]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0];
     717          24 :   equalTowZNA[0] = equalTowZNA[0] + calibSatZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
     718          16 :         calibSatZNA[1]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
     719          16 :         calibSatZNA[2]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
     720           8 :         calibSatZNA[3]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0];
     721             : 
     722             :   // Ch. debug
     723             :   /*printf("\n ------------- SATURATION CORRECTION -------------\n");
     724             :   printf(" ZNC PMC %1.2f\n", equalTowZNC[0]);
     725             :   printf(" ZNA PMC %1.2f\n", equalTowZNA[0]);
     726             :   printf(" ----------------------------------------\n");*/
     727             :   
     728             :   // ******     Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
     729           8 :   Float_t calibSumZNC[2]={0,0}, calibSumZNA[2]={0,0}, calibSumZPC[2]={0,0}, calibSumZPA[2]={0,0};
     730          96 :   for(Int_t gi=0; gi<5; gi++){
     731          40 :        calibSumZNC[0] += equalTowZNC[gi];
     732          40 :        calibSumZPC[0] += equalTowZPC[gi];
     733          40 :        calibSumZNA[0] += equalTowZNA[gi];
     734          40 :        calibSumZPA[0] += equalTowZPA[gi];
     735             :        //
     736          40 :        calibSumZNC[1] += equalTowZNC[gi+5];
     737          40 :        calibSumZPC[1] += equalTowZPC[gi+5];
     738          40 :        calibSumZNA[1] += equalTowZNA[gi+5];
     739          40 :        calibSumZPA[1] += equalTowZPA[gi+5];
     740             :   }
     741             :   // High gain chain
     742           8 :   calibSumZNC[0] = calibSumZNC[0]*calibEne[0];
     743           8 :   calibSumZPC[0] = calibSumZPC[0]*calibEne[1];
     744           8 :   calibSumZNA[0] = calibSumZNA[0]*calibEne[2];
     745           8 :   calibSumZPA[0] = calibSumZPA[0]*calibEne[3];
     746             :   // Low gain chain
     747           8 :   calibSumZNC[1] = calibSumZNC[1]*calibEne[0];
     748           8 :   calibSumZPC[1] = calibSumZPC[1]*calibEne[1];
     749           8 :   calibSumZNA[1] = calibSumZNA[1]*calibEne[2];
     750           8 :   calibSumZPA[1] = calibSumZPA[1]*calibEne[3];
     751             :   
     752             :   // ******     Energy calibration of detector responses
     753           8 :   Float_t calibTowZNC[10], calibTowZNA[10], calibTowZPC[10], calibTowZPA[10];
     754          96 :   for(Int_t gi=0; gi<5; gi++){
     755             :      // High gain chain
     756          40 :      calibTowZNC[gi] = equalTowZNC[gi]*calibEne[0];
     757          40 :      calibTowZPC[gi] = equalTowZPC[gi]*calibEne[1];
     758          40 :      calibTowZNA[gi] = equalTowZNA[gi]*calibEne[2];
     759          40 :      calibTowZPA[gi] = equalTowZPA[gi]*calibEne[3];
     760             :      // Low gain chain
     761          40 :      calibTowZNC[gi+5] = equalTowZNC[gi+5]*calibEne[0];
     762          40 :      calibTowZPC[gi+5] = equalTowZPC[gi+5]*calibEne[1];
     763          40 :      calibTowZNA[gi+5] = equalTowZNA[gi+5]*calibEne[2];
     764          40 :      calibTowZPA[gi+5] = equalTowZPA[gi+5]*calibEne[3];
     765             :   }
     766             :   //
     767           8 :   Float_t calibZEM1[2]={0,0}, calibZEM2[2]={0,0};
     768           8 :   calibZEM1[0] = corrADCZEM1[0]*calibEne[4];
     769           8 :   calibZEM1[1] = corrADCZEM1[1]*calibEne[4];
     770           8 :   calibZEM2[0] = corrADCZEM2[0]*calibEne[5];
     771           8 :   calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
     772             :   // Ch. debug
     773             :   /*printf("\n ------------- CALIBRATION -------------\n");
     774             :   printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     775             :         calibTowZNC[0],calibTowZNC[1],calibTowZNC[2],calibTowZNC[3],calibTowZNC[4]);
     776             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     777             :         calibTowZPC[0],calibTowZPC[1],calibTowZPC[2],calibTowZPC[3],calibTowZPC[4]);
     778             :   printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     779             :         calibTowZNA[0],calibTowZNA[1],calibTowZNA[2],calibTowZNA[3],calibTowZNA[4]);
     780             :   printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     781             :         calibTowZPA[0],calibTowZPA[1],calibTowZPA[2],calibTowZPA[3],calibTowZPA[4]);
     782             :   printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",calibZEM1[0],calibZEM2[0]);
     783             :   printf(" ----------------------------------------\n");*/
     784             :   
     785             :   //  ******    No. of spectator and participants nucleons
     786             :   //  Variables calculated to comply with ESD structure
     787             :   //  *** N.B. -> They have a meaning only in Pb-Pb!!!!!!!!!!!!
     788             :   Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
     789             :   Int_t nGenSpec=0, nGenSpecLeft=0, nGenSpecRight=0;
     790             :   Int_t nPart=0, nPartTotLeft=0, nPartTotRight=0;
     791             :   Double_t impPar=0., impPar1=0., impPar2=0.;
     792             :   
     793             :   Bool_t energyFlag = kFALSE;
     794             :   // create the output tree
     795          24 :   AliZDCReco* reco = new AliZDCReco(calibSumZNC, calibSumZPC, calibSumZNA, calibSumZPA, 
     796           8 :                         calibTowZNC, calibTowZPC, calibTowZNA, calibTowZPA, 
     797           8 :                         calibZEM1, calibZEM2, sPMRef1, sPMRef2,
     798             :                         nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight, 
     799             :                         nGenSpec, nGenSpecLeft, nGenSpecRight, 
     800             :                         nPart, nPartTotLeft, nPartTotRight, 
     801             :                         impPar, impPar1, impPar2,
     802           8 :                         recoFlag, energyFlag, isScalerOn, scaler, tdc, tdcCabling);
     803             :                   
     804             :   const Int_t kBufferSize = 4000;
     805           8 :   clustersTree->Branch("ZDC", "AliZDCReco", &reco, kBufferSize);
     806             :   // write the output tree
     807           8 :   clustersTree->Fill();
     808          16 :   delete reco;
     809           8 : }
     810             : 
     811             : //_____________________________________________________________________________
     812             : void AliZDCReconstructor::ReconstructEventPbPb(TTree *clustersTree, 
     813             :         Float_t adc[24][2], Int_t signalCodeADC[24], Int_t tdcCabling[7], Bool_t isScalerOn, UInt_t* scaler, 
     814             :         Int_t tdc[32][4], const Int_t* const evQualityBlock, 
     815             :         const Int_t* const triggerBlock, const Int_t* const chBlock, UInt_t puBits) const
     816             : {
     817             :   // ****************** Reconstruct one event ******************
     818             : 
     819             :   int const kNch = 24;
     820           0 :   Float_t corrADCZNC[10] = {0,}, corrADCZPC[10] = {0,};
     821           0 :   Float_t corrADCZNA[10] = {0,}, corrADCZPA[10] = {0,};
     822           0 :   Float_t corrADCZEM1[2] = {0,0}, corrADCZEM2[2] = {0,0};
     823           0 :   Float_t sPMRef1[2] = {0,0}, sPMRef2[2] = {0,0};
     824             : 
     825           0 :   for(int i=0; i<kNch; i++){
     826           0 :      if(signalCodeADC[i]==kZNAC){
     827           0 :       for(int igain=0; igain<=1; igain++) corrADCZNA[0+5*igain] = adc[i][igain];
     828           0 :     }
     829           0 :     else if(signalCodeADC[i]==kZNA1){
     830           0 :       for(int igain=0; igain<=1; igain++) corrADCZNA[1+5*igain] = adc[i][igain];
     831           0 :     }
     832           0 :     else if(signalCodeADC[i]==kZNA2){
     833           0 :       for(int igain=0; igain<=1; igain++) corrADCZNA[2+5*igain] = adc[i][igain];
     834           0 :     }
     835           0 :     else if(signalCodeADC[i]==kZNA3){
     836           0 :       for(int igain=0; igain<=1; igain++) corrADCZNA[3+5*igain] = adc[i][igain];
     837           0 :     }
     838           0 :     else if(signalCodeADC[i]==kZNA4){
     839           0 :       for(int igain=0; igain<=1; igain++) corrADCZNA[4+5*igain] = adc[i][igain];
     840           0 :     }
     841           0 :     else if(signalCodeADC[i]==kZPAC){
     842           0 :       for(int igain=0; igain<=1; igain++) corrADCZPA[0+5*igain] = adc[i][igain];
     843           0 :     }
     844           0 :     else if(signalCodeADC[i]==kZPA1){
     845           0 :       for(int igain=0; igain<=1; igain++) corrADCZPA[1+5*igain] = adc[i][igain];
     846           0 :     }
     847           0 :     else if(signalCodeADC[i]==kZPA2){
     848           0 :       for(int igain=0; igain<=1; igain++) corrADCZPA[2+5*igain] = adc[i][igain];
     849           0 :     }
     850           0 :     else if(signalCodeADC[i]==kZPA3){
     851           0 :       for(int igain=0; igain<=1; igain++) corrADCZPA[3+5*igain] = adc[i][igain];
     852           0 :     }
     853           0 :     else if(signalCodeADC[i]==kZPA4){
     854           0 :       for(int igain=0; igain<=1; igain++) corrADCZPA[4+5*igain] = adc[i][igain];
     855           0 :     }
     856           0 :     else if(signalCodeADC[i]==kZEM1){
     857           0 :       for(int igain=0; igain<=1; igain++) corrADCZEM1[igain] = adc[i][igain];
     858           0 :     }
     859           0 :     else if(signalCodeADC[i]==kZEM2){  
     860           0 :       for(int igain=0; igain<=1; igain++) corrADCZEM2[igain] = adc[i][igain];
     861           0 :     }
     862           0 :     else if(signalCodeADC[i]==kZNCC){ 
     863           0 :       for(int igain=0; igain<=1; igain++) corrADCZNC[0+5*igain] = adc[i][igain];
     864           0 :     }
     865           0 :     else if(signalCodeADC[i]==kZNC1){
     866           0 :       for(int igain=0; igain<=1; igain++) corrADCZNC[1+5*igain] = adc[i][igain];
     867           0 :     }
     868           0 :     else if(signalCodeADC[i]==kZNC2){
     869           0 :       for(int igain=0; igain<=1; igain++) corrADCZNC[2+5*igain] = adc[i][igain];
     870           0 :     }
     871           0 :     else if(signalCodeADC[i]==kZNC3){
     872           0 :       for(int igain=0; igain<=1; igain++) corrADCZNC[3+5*igain] = adc[i][igain];
     873           0 :     }
     874           0 :     else if(signalCodeADC[i]==kZNC4){
     875           0 :       for(int igain=0; igain<=1; igain++) corrADCZNC[4+5*igain] = adc[i][igain];
     876           0 :     }
     877           0 :     else if(signalCodeADC[i]==kZPCC){ 
     878           0 :       for(int igain=0; igain<=1; igain++) corrADCZPC[0+5*igain] = adc[i][igain];
     879           0 :     }
     880           0 :     else if(signalCodeADC[i]==kZPC1){
     881           0 :       for(int igain=0; igain<=1; igain++) corrADCZPC[1+5*igain] = adc[i][igain];
     882           0 :     }
     883           0 :     else if(signalCodeADC[i]==kZPC2){
     884           0 :       for(int igain=0; igain<=1; igain++) corrADCZPC[2+5*igain] = adc[i][igain];
     885           0 :     }
     886           0 :     else if(signalCodeADC[i]==kZPC3){
     887           0 :       for(int igain=0; igain<=1; igain++) corrADCZPC[3+5*igain] = adc[i][igain];
     888           0 :     }
     889           0 :     else if(signalCodeADC[i]==kZPC4){
     890           0 :       for(int igain=0; igain<=1; igain++) corrADCZPC[4+5*igain] = adc[i][igain];
     891           0 :     }
     892           0 :     else if(signalCodeADC[i]==kZDCCMon){
     893           0 :       for(int igain=0; igain<=1; igain++) sPMRef1[igain] = adc[i][igain];
     894           0 :     }
     895           0 :     else if(signalCodeADC[i]==kZDCAMon){
     896           0 :       for(int igain=0; igain<=1; igain++) sPMRef2[igain] = adc[i][igain];
     897           0 :     }
     898             :         
     899             :     // Ch. Debug
     900             :     //printf("  ADC ch. %d  cabled signal %d\n",i, signalCodeADC[i]);
     901             :   }
     902             :   
     903             :   // CH. debug
     904             :   /*printf("\n*************************************************\n");
     905             :   printf(" ReconstructEventPbPb -> values after pedestal subtraction:\n");
     906             :   for(int ich=0; ich<24; ich++) printf(" ch.%d ADC hg %1.2f  lg %1.2f\n", ich, adc[ich][0],adc[ich][1]);
     907             :   printf("*************************************************\n");*/
     908             :   // CH. debug
     909             :   /*printf("\n*************************************************\n");
     910             :   printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     911             :         corrADCZNC[0],corrADCZNC[1],corrADCZNC[2],corrADCZNC[3],corrADCZNC[4]);
     912             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     913             :         corrADCZPC[0],corrADCZPC[1],corrADCZPC[2],corrADCZPC[3],corrADCZPC[4]);
     914             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     915             :         corrADCZPC[0],corrADCZPC[1],corrADCZPC[2],corrADCZPC[3],corrADCZPC[4]);
     916             :   printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
     917             :         corrADCZPA[0],corrADCZPA[1],corrADCZPA[2],corrADCZPA[3],corrADCZPA[4]);
     918             :   printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",corrADCZEM1[0],corrADCZEM2[0]);
     919             :   printf("*************************************************\n"); */
     920             : 
     921             :   // ---------------------- Setting reco flags for ESD
     922           0 :   UInt_t rFlags[32];
     923           0 :   for(Int_t ifl=0; ifl<32; ifl++) rFlags[ifl]=0;
     924             :   
     925           0 :   if(evQualityBlock[0] == 1) rFlags[31] = 0x0;
     926           0 :   else rFlags[31] = 0x1;
     927             :   //
     928           0 :   if(evQualityBlock[1] == 1) rFlags[30] = 0x1;
     929           0 :   if(evQualityBlock[2] == 1) rFlags[29] = 0x1;
     930           0 :   if(evQualityBlock[3] == 1) rFlags[28] = 0x1;
     931             : 
     932           0 :   if(triggerBlock[0] == 1) rFlags[27] = 0x1;
     933           0 :   if(triggerBlock[1] == 1) rFlags[26] = 0x1;
     934           0 :   if(triggerBlock[2] == 1) rFlags[25] = 0x1;
     935           0 :   if(triggerBlock[3] == 1) rFlags[24] = 0x1;
     936             :   
     937           0 :   if(chBlock[0] == 1) rFlags[18] = 0x1;
     938           0 :   if(chBlock[1] == 1) rFlags[17] = 0x1;
     939           0 :   if(chBlock[2] == 1) rFlags[16] = 0x1;
     940             :   
     941           0 :   rFlags[13] = puBits & 0x00000020;
     942           0 :   rFlags[12] = puBits & 0x00000010;
     943           0 :   rFlags[11] = puBits & 0x00000080;
     944           0 :   rFlags[10] = puBits & 0x00000040;
     945           0 :   rFlags[9]  = puBits & 0x00000020;
     946           0 :   rFlags[8]  = puBits & 0x00000010;  
     947             :   
     948           0 :   if(corrADCZPC[0]>fSignalThreshold)  rFlags[5] = 0x1;
     949           0 :   if(corrADCZNC[0]>fSignalThreshold)  rFlags[4] = 0x1;
     950           0 :   if(corrADCZEM2[0]>fSignalThreshold) rFlags[3] = 0x1;
     951           0 :   if(corrADCZEM1[0]>fSignalThreshold) rFlags[2] = 0x1;
     952           0 :   if(corrADCZPA[0]>fSignalThreshold)  rFlags[1] = 0x1;
     953           0 :   if(corrADCZNA[0]>fSignalThreshold)  rFlags[0] = 0x1;
     954             : 
     955           0 :   UInt_t recoFlag = rFlags[31] << 31 | rFlags[30] << 30 | rFlags[29] << 29 | rFlags[28] << 28 |
     956           0 :              rFlags[27] << 27 | rFlags[26] << 26 | rFlags[25] << 25 | rFlags[24] << 24 |
     957             :              0x0 << 23 | 0x0 << 22 | 0x0 << 21 | 0x0 << 20 |
     958           0 :              0x0 << 19 | rFlags[18] << 18 |  rFlags[17] << 17 |  rFlags[16] << 16 |
     959           0 :              0x0 << 15 | 0x0 << 14 | rFlags[13] << 13 | rFlags[12] << 12 | 
     960           0 :              rFlags[11] << 11 |rFlags[10] << 10 | rFlags[9] << 9 | rFlags[8] << 8 |
     961           0 :              0x0 << 7 | 0x0 << 6 | rFlags[5] << 5 | rFlags[4] << 4 | 
     962           0 :              rFlags[3] << 3 | rFlags[2] << 2 | rFlags[1] << 1 | rFlags[0];
     963             :   // --------------------------------------------------
     964             :   
     965             :   
     966             :   // ******     Retrieving calibration data 
     967             :   // --- Equalization coefficients ---------------------------------------------
     968           0 :   Float_t equalCoeffZNC[5], equalCoeffZPC[5], equalCoeffZNA[5], equalCoeffZPA[5];
     969           0 :   for(Int_t ji=0; ji<5; ji++){
     970           0 :      equalCoeffZNC[ji] = fTowCalibData->GetZNCEqualCoeff(ji);
     971           0 :      equalCoeffZPC[ji] = fTowCalibData->GetZPCEqualCoeff(ji); 
     972           0 :      equalCoeffZNA[ji] = fTowCalibData->GetZNAEqualCoeff(ji); 
     973           0 :      equalCoeffZPA[ji] = fTowCalibData->GetZPAEqualCoeff(ji); 
     974             :   }
     975             :   // --- Energy calibration factors ------------------------------------
     976           0 :   Float_t calibEne[6], calibSatZNA[4], calibSatZNC[4];
     977             :   // **** Energy calibration coefficient set to 1 
     978             :   // **** (no trivial way to calibrate in p-p runs)
     979           0 :   for(Int_t ij=0; ij<6; ij++) calibEne[ij] = fEnCalibData->GetEnCalib(ij);
     980           0 :   for(Int_t ij=0; ij<4; ij++){
     981           0 :     calibSatZNA[ij] = fSatCalibData->GetZNASatCalib(ij);
     982           0 :     calibSatZNC[ij] = fSatCalibData->GetZNCSatCalib(ij);
     983             :   }
     984             :   
     985             :   // ******     Equalization of detector responses
     986           0 :   Float_t equalTowZNC[10], equalTowZNA[10], equalTowZPC[10], equalTowZPA[10];
     987           0 :   for(Int_t gi=0; gi<10; gi++){
     988           0 :      if(gi<5){
     989           0 :        equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi];
     990           0 :        equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi];
     991           0 :        equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi];
     992           0 :        equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi];
     993           0 :      }
     994             :      else{
     995           0 :        equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi-5];
     996           0 :        equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi-5];
     997           0 :        equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi-5];
     998           0 :        equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi-5];
     999             :      }
    1000             :   }
    1001             :   
    1002             :   // Ch. debug
    1003             :   /*printf("\n ------------- EQUALIZATION -------------\n");
    1004             :   printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1005             :         equalTowZNC[0],equalTowZNC[1],equalTowZNC[2],equalTowZNC[3],equalTowZNC[4]);
    1006             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1007             :         equalTowZPC[0],equalTowZPC[1],equalTowZPC[2],equalTowZPC[3],equalTowZPC[4]);
    1008             :   printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1009             :         equalTowZNA[0],equalTowZNA[1],equalTowZNA[2],equalTowZNA[3],equalTowZNA[4]);
    1010             :   printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1011             :         equalTowZPA[0],equalTowZPA[1],equalTowZPA[2],equalTowZPA[3],equalTowZPA[4]);
    1012             :   printf(" ----------------------------------------\n");*/
    1013             :   
    1014             :   //  *** p-A RUN 2013 -> new calibration object
    1015             :   //      to take into account saturation in ZN PMC
    1016             :   //   -> 5th order pol. fun. to be applied BEFORE en. calibration 
    1017           0 :   equalTowZNC[0] = equalTowZNC[0] + calibSatZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
    1018           0 :         calibSatZNC[1]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
    1019           0 :         calibSatZNC[2]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
    1020           0 :         calibSatZNC[3]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0];
    1021           0 :   equalTowZNA[0] = equalTowZNA[0] + calibSatZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
    1022           0 :         calibSatZNA[1]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
    1023           0 :         calibSatZNA[2]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
    1024           0 :         calibSatZNA[3]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0];
    1025             :   
    1026             :   // ******     Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
    1027           0 :   Float_t calibSumZNC[]={0,0}, calibSumZNA[]={0,0}, calibSumZPC[]={0,0}, calibSumZPA[]={0,0};
    1028           0 :   for(Int_t gi=0; gi<5; gi++){
    1029           0 :        calibSumZNC[0] += equalTowZNC[gi];
    1030           0 :        calibSumZPC[0] += equalTowZPC[gi];
    1031           0 :        calibSumZNA[0] += equalTowZNA[gi];
    1032           0 :        calibSumZPA[0] += equalTowZPA[gi];
    1033             :        //
    1034           0 :        calibSumZNC[1] += equalTowZNC[gi+5];
    1035           0 :        calibSumZPC[1] += equalTowZPC[gi+5];
    1036           0 :        calibSumZNA[1] += equalTowZNA[gi+5];
    1037           0 :        calibSumZPA[1] += equalTowZPA[gi+5];
    1038             :   }
    1039             :    
    1040             :   // High gain chain
    1041             :   // NB -> The calibration factor is extracted from *8 chain
    1042             :   //       i.e. it is equal to 1.38 TeV/100 ch. ADC -> must be *8. for HG chain!!!!
    1043           0 :   calibSumZNC[0] = calibSumZNC[0]*calibEne[0]*8.;
    1044           0 :   calibSumZPC[0] = calibSumZPC[0]*calibEne[1]*8.;
    1045           0 :   calibSumZNA[0] = calibSumZNA[0]*calibEne[2]*8.;
    1046           0 :   calibSumZPA[0] = calibSumZPA[0]*calibEne[3]*8.;
    1047             :   // Low gain chain
    1048           0 :   calibSumZNC[1] = calibSumZNC[1]*calibEne[0];
    1049           0 :   calibSumZPC[1] = calibSumZPC[1]*calibEne[1];
    1050           0 :   calibSumZNA[1] = calibSumZNA[1]*calibEne[2];
    1051           0 :   calibSumZPA[1] = calibSumZPA[1]*calibEne[3];
    1052             :   //
    1053           0 :   Float_t calibZEM1[2]={0,0}, calibZEM2[2]={0,0};
    1054           0 :   calibZEM1[0] = corrADCZEM1[0]*calibEne[4];
    1055           0 :   calibZEM1[1] = corrADCZEM1[1]*calibEne[4];
    1056           0 :   calibZEM2[0] = corrADCZEM2[0]*calibEne[5];
    1057           0 :   calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
    1058             :     
    1059             :   // ******     Energy calibration of detector responses
    1060           0 :   Float_t calibTowZNC[10], calibTowZNA[10], calibTowZPC[10], calibTowZPA[10];
    1061           0 :   for(Int_t gi=0; gi<5; gi++){
    1062             :      // High gain chain
    1063           0 :      calibTowZNC[gi] = equalTowZNC[gi]*2*calibEne[0]*8.;
    1064           0 :      calibTowZPC[gi] = equalTowZPC[gi]*2*calibEne[1]*8.;
    1065           0 :      calibTowZNA[gi] = equalTowZNA[gi]*2*calibEne[2]*8.;
    1066           0 :      calibTowZPA[gi] = equalTowZPA[gi]*2*calibEne[3]*8.;
    1067             :      // Low gain chain
    1068           0 :      calibTowZNC[gi+5] = equalTowZNC[gi+5]*2*calibEne[0];
    1069           0 :      calibTowZPC[gi+5] = equalTowZPC[gi+5]*2*calibEne[1];
    1070           0 :      calibTowZNA[gi+5] = equalTowZNA[gi+5]*2*calibEne[2];
    1071           0 :      calibTowZPA[gi+5] = equalTowZPA[gi+5]*2*calibEne[3];
    1072             :   }
    1073             : 
    1074             :   // Ch. debug
    1075             :   /*printf("\n ------------- CALIBRATION -------------\n");
    1076             :   printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1077             :         calibTowZNC[0],calibTowZNC[1],calibTowZNC[2],calibTowZNC[3],calibTowZNC[4]);
    1078             :   printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1079             :         calibTowZPC[0],calibTowZPC[1],calibTowZPC[2],calibTowZPC[3],calibTowZPC[4]);
    1080             :   printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1081             :         calibTowZNA[0],calibTowZNA[1],calibTowZNA[2],calibTowZNA[3],calibTowZNA[4]);
    1082             :   printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
    1083             :         calibTowZPA[0],calibTowZPA[1],calibTowZPA[2],calibTowZPA[3],calibTowZPA[4]);
    1084             :   printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",calibZEM1[0],calibZEM2[0]);
    1085             :   printf(" ----------------------------------------\n");*/
    1086             :   
    1087             :   //  ******    Number of detected spectator nucleons
    1088             :   Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
    1089           0 :   if(fBeamEnergy>0.01){
    1090           0 :     nDetSpecNLeft = (Int_t) (calibSumZNC[0]/fBeamEnergy);
    1091           0 :     nDetSpecPLeft = (Int_t) (calibSumZPC[0]/fBeamEnergy);
    1092           0 :     nDetSpecNRight = (Int_t) (calibSumZNA[0]/fBeamEnergy);
    1093           0 :     nDetSpecPRight = (Int_t) (calibSumZPA[0]/fBeamEnergy);
    1094           0 :   }
    1095           0 :   else AliWarning(" ATTENTION!!! fBeamEnergy=0 -> N_spec will be ZERO!!! \n");
    1096             :   
    1097             :   Int_t nGenSpec=0, nGenSpecA=0, nGenSpecC=0;
    1098             :   Int_t nPart=0, nPartA=0, nPartC=0;
    1099             :   Double_t b=0., bA=0., bC=0.;
    1100             :   
    1101             :   /*if(fIsCalibrationMB == kFALSE){
    1102             :    // ******   Reconstruction parameters ------------------ 
    1103             :    if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
    1104             :    if(!fgRecoParam){  
    1105             :      AliError("  RecoParam object not retrieved correctly: not reconstructing ZDC event!!!");
    1106             :      return;
    1107             :    }
    1108             :    TH1D* hNpartDist = fgRecoParam->GethNpartDist();
    1109             :    TH1D*   hbDist = fgRecoParam->GethbDist();         
    1110             :    Float_t  fClkCenter = fgRecoParam->GetClkCenter();
    1111             :    if(!hNpartDist || !hbDist){  
    1112             :       AliError("Something wrong in Glauber MC histos got from AliZDCREcoParamPbPb: NO EVENT RECO FOR ZDC DATA!!!\n\n");
    1113             :       //return;
    1114             :    }
    1115             :    else{  
    1116             :     if(!fgMBCalibData) fgMBCalibData = const_cast<AliZDCMBCalib*>(GetMBCalibData()); 
    1117             :     TH2F *hZDCvsZEM  = fgMBCalibData->GethZDCvsZEM();
    1118             :     TH2F *hZDCCvsZEM = fgMBCalibData->GethZDCCvsZEM();
    1119             :     TH2F *hZDCAvsZEM = fgMBCalibData->GethZDCAvsZEM();
    1120             :     //
    1121             :     Double_t xHighEdge = hZDCvsZEM->GetXaxis()->GetXmax();
    1122             :     Double_t origin = xHighEdge*fClkCenter;
    1123             :     // Ch. debug
    1124             :     //printf("\n\n  xHighEdge %1.2f, origin %1.4f \n", xHighEdge, origin);
    1125             :     //
    1126             :     // ====> Summed ZDC info (sideA+side C)
    1127             :     TF1 *line = new TF1("line","[0]*x+[1]",0.,xHighEdge);
    1128             :     Float_t y = (calibSumZNC[0]+calibSumZPC[0]+calibSumZNA[0]+calibSumZPA[0])/1000.;
    1129             :     Float_t x = (calibZEM1[0]+calibZEM2[0])/1000.;
    1130             :     line->SetParameter(0, y/(x-origin));
    1131             :     line->SetParameter(1, -origin*y/(x-origin));
    1132             :     // Ch. debug
    1133             :     //printf("  ***************** Summed ZDC info (sideA+side C) \n");
    1134             :     //printf("  E_{ZEM} %1.4f, E_{ZDC} %1.2f, TF1: %1.2f*x + %1.2f   ", x, y,y/(x-origin),-origin*y/(x-origin));
    1135             :     //
    1136             :     Double_t countPerc=0;
    1137             :     Double_t xBinCenter=0, yBinCenter=0;
    1138             :     for(Int_t nbinx=1; nbinx<=hZDCvsZEM->GetNbinsX(); nbinx++){
    1139             :       for(Int_t nbiny=1; nbiny<=hZDCvsZEM->GetNbinsY(); nbiny++){
    1140             :          xBinCenter = hZDCvsZEM->GetXaxis()->GetBinCenter(nbinx);
    1141             :          yBinCenter = hZDCvsZEM->GetYaxis()->GetBinCenter(nbiny);
    1142             :          //
    1143             :          if(line->GetParameter(0)>0){
    1144             :            if(yBinCenter < (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
    1145             :              countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
    1146             :              // Ch. debug
    1147             :              //printf(" xBinCenter  %1.3f, yBinCenter %1.0f,  countPerc %1.0f\n", 
    1148             :                 //xBinCenter, yBinCenter, countPerc);
    1149             :            }
    1150             :          }
    1151             :          else{
    1152             :            if(yBinCenter > (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
    1153             :              countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
    1154             :              // Ch. debug
    1155             :              //printf(" xBinCenter  %1.3f, yBinCenter %1.0f,  countPerc %1.0f\n", 
    1156             :                 //xBinCenter, yBinCenter, countPerc);
    1157             :            }
    1158             :          }
    1159             :       }
    1160             :     }
    1161             :     //
    1162             :     Double_t xSecPerc = 0.;
    1163             :     if(hZDCvsZEM->GetEntries()!=0){ 
    1164             :       xSecPerc = countPerc/hZDCvsZEM->GetEntries();
    1165             :     }
    1166             :     else{
    1167             :       AliWarning("  Histogram hZDCvsZEM from OCDB has no entries!!!");
    1168             :     }
    1169             :     // Ch. debug
    1170             :     //printf("  xSecPerc %1.4f  \n", xSecPerc);
    1171             : 
    1172             :     // ====> side C
    1173             :     TF1 *lineC = new TF1("lineC","[0]*x+[1]",0.,xHighEdge);
    1174             :     Float_t yC = (calibSumZNC[0]+calibSumZPC[0])/1000.;
    1175             :     lineC->SetParameter(0, yC/(x-origin));
    1176             :     lineC->SetParameter(1, -origin*yC/(x-origin));
    1177             :     // Ch. debug
    1178             :     //printf("  ***************** Side C \n");
    1179             :     //printf("  E_{ZEM} %1.4f, E_{ZDCC} %1.2f, TF1: %1.2f*x + %1.2f   ", x, yC,yC/(x-origin),-origin*yC/(x-origin));
    1180             :     //
    1181             :     Double_t countPercC=0;
    1182             :     Double_t xBinCenterC=0, yBinCenterC=0;
    1183             :     for(Int_t nbinx=1; nbinx<=hZDCCvsZEM->GetNbinsX(); nbinx++){
    1184             :       for(Int_t nbiny=1; nbiny<=hZDCCvsZEM->GetNbinsY(); nbiny++){
    1185             :          xBinCenterC = hZDCCvsZEM->GetXaxis()->GetBinCenter(nbinx);
    1186             :          yBinCenterC = hZDCCvsZEM->GetYaxis()->GetBinCenter(nbiny);
    1187             :          if(lineC->GetParameter(0)>0){
    1188             :            if(yBinCenterC < (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
    1189             :              countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
    1190             :            }
    1191             :          }
    1192             :          else{
    1193             :            if(yBinCenterC > (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
    1194             :              countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
    1195             :            }
    1196             :          }
    1197             :       }
    1198             :     }
    1199             :     //
    1200             :     Double_t xSecPercC = 0.;
    1201             :     if(hZDCCvsZEM->GetEntries()!=0){ 
    1202             :       xSecPercC = countPercC/hZDCCvsZEM->GetEntries();
    1203             :     }
    1204             :     else{
    1205             :       AliWarning("  Histogram hZDCCvsZEM from OCDB has no entries!!!");
    1206             :     }
    1207             :     // Ch. debug
    1208             :     //printf("  xSecPercC %1.4f  \n", xSecPercC);
    1209             :     
    1210             :     // ====> side A
    1211             :     TF1 *lineA = new TF1("lineA","[0]*x+[1]",0.,xHighEdge);
    1212             :     Float_t yA = (calibSumZNA[0]+calibSumZPA[0])/1000.;
    1213             :     lineA->SetParameter(0, yA/(x-origin));
    1214             :     lineA->SetParameter(1, -origin*yA/(x-origin));
    1215             :     //
    1216             :     // Ch. debug
    1217             :     //printf("  ***************** Side A \n");
    1218             :     //printf("  E_{ZEM} %1.4f, E_{ZDCA} %1.2f, TF1: %1.2f*x + %1.2f   ", x, yA,yA/(x-origin),-origin*yA/(x-origin));
    1219             :     //
    1220             :     Double_t countPercA=0;
    1221             :     Double_t xBinCenterA=0, yBinCenterA=0;
    1222             :     for(Int_t nbinx=1; nbinx<=hZDCAvsZEM->GetNbinsX(); nbinx++){
    1223             :       for(Int_t nbiny=1; nbiny<=hZDCAvsZEM->GetNbinsY(); nbiny++){
    1224             :          xBinCenterA = hZDCAvsZEM->GetXaxis()->GetBinCenter(nbinx);
    1225             :          yBinCenterA = hZDCAvsZEM->GetYaxis()->GetBinCenter(nbiny);
    1226             :          if(lineA->GetParameter(0)>0){
    1227             :            if(yBinCenterA < (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
    1228             :              countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
    1229             :            }
    1230             :          }
    1231             :          else{
    1232             :            if(yBinCenterA > (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
    1233             :              countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
    1234             :            }
    1235             :          }
    1236             :       }
    1237             :     }
    1238             :     //
    1239             :     Double_t xSecPercA = 0.;
    1240             :     if(hZDCAvsZEM->GetEntries()!=0){ 
    1241             :       xSecPercA = countPercA/hZDCAvsZEM->GetEntries();
    1242             :     }
    1243             :     else{
    1244             :       AliWarning("  Histogram hZDCAvsZEM from OCDB has no entries!!!");
    1245             :     }
    1246             :     // Ch. debug
    1247             :     //printf("  xSecPercA %1.4f  \n", xSecPercA);
    1248             :     
    1249             :     //  ******    Number of participants (from E_ZDC vs. E_ZEM correlation)
    1250             :     Double_t nPartFrac=0., nPartFracC=0., nPartFracA=0.;
    1251             :     for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
    1252             :       nPartFrac += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
    1253             :       if((1.-nPartFrac) < xSecPerc){
    1254             :         nPart = (Int_t) hNpartDist->GetBinLowEdge(npbin);
    1255             :         // Ch. debug
    1256             :         //printf("  ***************** Summed ZDC info (sideA+side C) \n");
    1257             :         //printf("  nPartFrac %1.4f, nPart %d\n", nPartFrac, nPart);
    1258             :         break;
    1259             :       }
    1260             :     }
    1261             :     if(nPart<0) nPart=0;
    1262             :     //
    1263             :     for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
    1264             :       nPartFracC += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
    1265             :       if((1.-nPartFracC) < xSecPercC){
    1266             :         nPartC = (Int_t) hNpartDist->GetBinLowEdge(npbin);
    1267             :         // Ch. debug
    1268             :         //printf("  ***************** Side C \n");
    1269             :         //printf("  nPartFracC %1.4f, nPartC %d\n", nPartFracC, nPartC);
    1270             :         break;
    1271             :     }
    1272             :     }
    1273             :     if(nPartC<0) nPartC=0;
    1274             :     //
    1275             :     for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
    1276             :       nPartFracA += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
    1277             :       if((1.-nPartFracA) < xSecPercA){
    1278             :         nPartA = (Int_t) hNpartDist->GetBinLowEdge(npbin);
    1279             :         // Ch. debug
    1280             :         //printf("  ***************** Side A \n");
    1281             :         //printf("  nPartFracA %1.4f, nPartA %d\n\n", nPartFracA, nPartA);
    1282             :         break;
    1283             :       }
    1284             :     }
    1285             :     if(nPartA<0) nPartA=0;
    1286             :     
    1287             :     //  ******    Impact parameter (from E_ZDC vs. E_ZEM correlation)
    1288             :     Double_t bFrac=0., bFracC=0., bFracA=0.;
    1289             :     for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
    1290             :       bFrac += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
    1291             :       if(bFrac > xSecPerc){
    1292             :         b = hbDist->GetBinLowEdge(ibbin);
    1293             :         break;
    1294             :       }
    1295             :     }
    1296             :     //
    1297             :     for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
    1298             :       bFracC += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
    1299             :       if(bFracC > xSecPercC){
    1300             :         bC = hbDist->GetBinLowEdge(ibbin);
    1301             :         break;
    1302             :       }
    1303             :     }
    1304             :     //
    1305             :     for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
    1306             :       bFracA += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
    1307             :       if(bFracA > xSecPercA){
    1308             :         bA = hbDist->GetBinLowEdge(ibbin);
    1309             :         break;
    1310             :       }
    1311             :     }
    1312             : 
    1313             :     //  ******  Number of spectator nucleons 
    1314             :     nGenSpec = 416 - nPart;
    1315             :     nGenSpecC = 416 - nPartC;
    1316             :     nGenSpecA = 416 - nPartA;
    1317             :     if(nGenSpec>416) nGenSpec=416; if(nGenSpec<0) nGenSpec=0;
    1318             :     if(nGenSpecC>416) nGenSpecC=416; if(nGenSpecC<0) nGenSpecC=0;
    1319             :     if(nGenSpecA>416) nGenSpecA=416; if(nGenSpecA<0) nGenSpecA=0;    
    1320             :     
    1321             :     delete line; 
    1322             :     delete lineC;  delete lineA;
    1323             :    }
    1324             :   }*/ // ONLY IF fIsCalibrationMB==kFALSE
    1325             :   
    1326             :   Bool_t energyFlag = kTRUE;  
    1327           0 :   AliZDCReco* reco = new AliZDCReco(calibSumZNC, calibSumZPC, calibSumZNA, calibSumZPA, 
    1328           0 :                   calibTowZNC, calibTowZPC, calibTowZNA, calibTowZPA, 
    1329           0 :                   calibZEM1, calibZEM2, sPMRef1, sPMRef2,
    1330             :                   nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight, 
    1331             :                   nGenSpec, nGenSpecA, nGenSpecC, 
    1332             :                   nPart, nPartA, nPartC, b, bA, bC,
    1333           0 :                   recoFlag, energyFlag, isScalerOn, scaler, tdc, tdcCabling);
    1334             :                     
    1335             :   const Int_t kBufferSize = 4000;
    1336           0 :   clustersTree->Branch("ZDC", "AliZDCReco", &reco, kBufferSize);
    1337             :   //reco->Print("");
    1338             :   // write the output tree
    1339           0 :   clustersTree->Fill();
    1340           0 :   delete reco;
    1341           0 : }
    1342             : 
    1343             : 
    1344             : //_____________________________________________________________________________
    1345             : void AliZDCReconstructor::FillZDCintoESD(TTree *clustersTree, AliESDEvent* esd) const
    1346             : {
    1347             :   // fill energies and number of participants to the ESD
    1348             : 
    1349             :   // Retrieving TDC calibration data  
    1350             :   // Parameters for TDC centering around zero
    1351             :   int const knTDC = 6;
    1352          16 :   Float_t tdcOffset[knTDC];
    1353         112 :   for(Int_t jj=0; jj<knTDC; jj++) tdcOffset[jj] = fTDCCalibData->GetMeanTDC(jj);
    1354             :   //fTDCCalibData->Print("");
    1355             : 
    1356           8 :   AliZDCReco reco;
    1357           8 :   AliZDCReco* preco = &reco;
    1358           8 :   clustersTree->SetBranchAddress("ZDC", &preco);
    1359           8 :   clustersTree->GetEntry(0);
    1360             : 
    1361          16 :   fESDZDC->SetZDC(reco.GetZN1HREnergy(), reco.GetZP1HREnergy(), 
    1362           8 :                 reco.GetZEM1HRsignal(), reco.GetZEM2HRsignal(), 
    1363           8 :                 reco.GetZN2HREnergy(), reco.GetZP2HREnergy(), 
    1364           8 :                 reco.GetNParticipants(), reco.GetNPartSideA(), reco.GetNPartSideC(),
    1365           8 :                 reco.GetImpParameter(), reco.GetImpParSideA(), reco.GetImpParSideC(),
    1366           8 :                 reco.GetRecoFlag());
    1367             : 
    1368           8 :   Float_t tZNCEne[5], tZNAEne[5], tZPCEne[5], tZPAEne[5];
    1369           8 :   Float_t tZNCEneLR[5], tZNAEneLR[5], tZPCEneLR[5], tZPAEneLR[5];
    1370          96 :   for(Int_t i=0; i<5; i++){
    1371          40 :      tZNCEne[i] = reco.GetZN1HREnTow(i);
    1372          40 :      tZNAEne[i] = reco.GetZN2HREnTow(i);
    1373          40 :      tZPCEne[i] = reco.GetZP1HREnTow(i);
    1374          40 :      tZPAEne[i] = reco.GetZP2HREnTow(i);
    1375             :      //
    1376          40 :      tZNCEneLR[i] = reco.GetZN1LREnTow(i);
    1377          40 :      tZNAEneLR[i] = reco.GetZN2LREnTow(i);
    1378          40 :      tZPCEneLR[i] = reco.GetZP1LREnTow(i);
    1379          40 :      tZPAEneLR[i] = reco.GetZP2LREnTow(i);
    1380             :   }
    1381             :   //
    1382           8 :   fESDZDC->SetZN1TowerEnergy(tZNCEne);
    1383           8 :   fESDZDC->SetZN2TowerEnergy(tZNAEne);
    1384           8 :   fESDZDC->SetZP1TowerEnergy(tZPCEne);
    1385           8 :   fESDZDC->SetZP2TowerEnergy(tZPAEne);
    1386             :   //
    1387           8 :   fESDZDC->SetZN1TowerEnergyLR(tZNCEneLR);
    1388           8 :   fESDZDC->SetZN2TowerEnergyLR(tZNAEneLR);
    1389           8 :   fESDZDC->SetZP1TowerEnergyLR(tZPCEneLR);
    1390           8 :   fESDZDC->SetZP2TowerEnergyLR(tZPAEneLR);
    1391             :   // 
    1392             :   // Writing ZDC scaler for cross section calculation
    1393             :   // ONLY IF the scaler has been read during the event
    1394           8 :   if(reco.IsScalerOn()==kTRUE){
    1395           0 :     UInt_t counts[32];
    1396           0 :     for(Int_t jk=0; jk<32; jk++) counts[jk] = reco.GetZDCScaler(jk);
    1397           0 :     fESDZDC->SetZDCScaler(counts);
    1398           0 :   }    
    1399             :   
    1400           8 :   Int_t *tdcCabling = reco.GetTDCchCabling();
    1401             :   //
    1402             :   // Ch. debug
    1403             :   //printf("\n  FillZDCintoESD: TDC channels  ZEM1 %d  ZEM2 %d ZNC %d ZPC %d ZNA %d ZPA %d L0 %d\n\n",  tdcCabling[0],tdcCabling[1],tdcCabling[2],tdcCabling[3],tdcCabling[4],tdcCabling[5],tdcCabling[6]);
    1404             :   
    1405           8 :   fESDZDC->SetZEM1TDChit(kFALSE);
    1406           8 :   fESDZDC->SetZEM2TDChit(kFALSE);
    1407           8 :   fESDZDC->SetZNCTDChit(kFALSE);
    1408           8 :   fESDZDC->SetZPCTDChit(kFALSE);
    1409           8 :   fESDZDC->SetZNATDChit(kFALSE);
    1410           8 :   fESDZDC->SetZPATDChit(kFALSE);
    1411             :   
    1412           8 :   Int_t tdcValues[32][4] = {{0,}}; 
    1413           8 :   Float_t tdcCorrected[32][4] = {{999.,}};
    1414         528 :   for(Int_t jk=0; jk<32; jk++){
    1415        2560 :     for(Int_t lk=0; lk<4; lk++){
    1416        1024 :       tdcValues[jk][lk] = reco.GetZDCTDCData(jk, lk);
    1417             :       //
    1418             :       // NB -> THE ORDER MUST BE THE SAME AS THE ONE IN ZDCMAPPINGDA.cxx (7/7/2015)
    1419             :       // otherwise calibrated TDC won't be centered around zero (wrong offset subtracted)
    1420        1024 :       if(tdcCabling[0]>0. && jk==tdcCabling[0] && TMath::Abs(tdcValues[jk][lk])>1e-09)      fESDZDC->SetZEM1TDChit(kTRUE);
    1421        1024 :       else if(tdcCabling[1]>0. && jk==tdcCabling[1] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZEM2TDChit(kTRUE);
    1422        1024 :       else if(tdcCabling[2]>0. && jk==tdcCabling[2] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZNCTDChit(kTRUE);
    1423        1024 :       else if(tdcCabling[3]>0. && jk==tdcCabling[3] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZPCTDChit(kTRUE);
    1424        1024 :       else if(tdcCabling[4]>0. && jk==tdcCabling[4] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZNATDChit(kTRUE);
    1425        1024 :       else if(tdcCabling[5]>0. && jk==tdcCabling[5] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZPATDChit(kTRUE);
    1426             :     }
    1427             :   }
    1428             :   //printf("\n  FillZDCintoESD: hit TDC         ZEM1 %d  ZEM2 %d ZNC %d ZPC %d ZNA %d ZPA %d \n",  fESDZDC->IsZEM1hit(),fESDZDC->IsZEM2hit(),fESDZDC->IsZNChit(),fESDZDC->IsZPChit(),fESDZDC->IsZNAhit(),fESDZDC->IsZPAhit());
    1429             :   
    1430             :   // Writing TDC data into ZDC ESDs
    1431             :   // 4/2/2011 -> Subtracting L0 (tdcValues[15]) instead of ADC gate 
    1432             :   // we try to keep the TDC oscillations as low as possible!
    1433         528 :   for(Int_t jk=0; jk<32; jk++){
    1434        2560 :     for(Int_t lk=0; lk<4; lk++){
    1435        1024 :       if(TMath::Abs(tdcValues[jk][lk])>1e-09){
    1436             :         // Feb2013 -> TDC corrected entry filled ONLY IF tdc has a hit && L0 TDC ch. is defined
    1437           0 :         if(TMath::Abs(tdcValues[jk][lk])>1e-09 && tdcCabling[6]>0.){
    1438           0 :            tdcCorrected[jk][lk] = 0.025*(tdcValues[jk][lk]-tdcValues[tdcCabling[6]][0])+fMeanPhase;
    1439             :            // Detector channels are centered around zero using the OCDB object
    1440           0 :            for(int idch=0; idch<6; idch++){
    1441           0 :               if(jk==tdcCabling[idch]){
    1442           0 :                 tdcCorrected[jk][lk] -= tdcOffset[idch];
    1443             :                 // Ch. debug
    1444             :                 //printf("ch.%d -> %d (TDC raw - L0)  %f  offset %f  TDC corrected %f\n", jk,idch, 0.025*(tdcValues[jk][lk]-tdcValues[tdcCabling[6]][0]), tdcOffset[idch], tdcCorrected[jk][lk]);
    1445           0 :               }
    1446             :            }
    1447           0 :         }
    1448             :       }
    1449             :     }
    1450             :   }
    1451             :   
    1452         128 :   for(int idch=0; idch<7; idch++){
    1453          56 :      if(tdcCabling[idch]>0.) fESDZDC->SetZDCTDCChannel(idch, tdcCabling[idch]);
    1454             :   }
    1455             :   
    1456             : 
    1457           8 :   fESDZDC->SetZDCTDCData(tdcValues);
    1458           8 :   fESDZDC->SetZDCTDCCorrected(tdcCorrected);
    1459           8 :   fESDZDC->AliESDZDC::SetBit(AliESDZDC::kTDCcablingSet, kTRUE);
    1460           8 :   fESDZDC->AliESDZDC::SetBit(AliESDZDC::kCorrectedTDCFilled, kTRUE);
    1461           8 :   fESDZDC->AliESDZDC::SetBit(AliESDZDC::kEnergyCalibratedSignal, reco.GetEnergyFlag());
    1462             :   //fESDZDC->Print("");
    1463             :   
    1464          16 :   if(esd) esd->SetZDCData(fESDZDC);
    1465           8 : }
    1466             : 
    1467             : //_____________________________________________________________________________
    1468             : AliCDBStorage* AliZDCReconstructor::SetStorage(const char *uri) 
    1469             : {
    1470             :   // Setting the storage
    1471             : 
    1472             :   Bool_t deleteManager = kFALSE;
    1473             :   
    1474           0 :   AliCDBManager *manager = AliCDBManager::Instance();
    1475           0 :   AliCDBStorage *defstorage = manager->GetDefaultStorage();
    1476             :   
    1477           0 :   if(!defstorage || !(defstorage->Contains("ZDC"))){ 
    1478           0 :      AliWarning("No default storage set or default storage doesn't contain ZDC!");
    1479           0 :      manager->SetDefaultStorage(uri);
    1480             :      deleteManager = kTRUE;
    1481           0 :   }
    1482             :  
    1483           0 :   AliCDBStorage *storage = manager->GetDefaultStorage();
    1484             : 
    1485           0 :   if(deleteManager){
    1486           0 :     AliCDBManager::Instance()->UnsetDefaultStorage();
    1487             :     defstorage = 0;   // the storage is killed by AliCDBManager::Instance()->Destroy()
    1488           0 :   }
    1489             : 
    1490           0 :   return storage; 
    1491             : }
    1492             : 
    1493             : //_____________________________________________________________________________
    1494             : AliZDCPedestals* AliZDCReconstructor::GetPedestalData() const
    1495             : {
    1496             : 
    1497             :   // Getting pedestal calibration object for ZDC set
    1498             :   AliZDCPedestals *calibdata = 0x0;
    1499           6 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/Pedestals");
    1500           2 :   if(!entry) AliFatal("No calibration data loaded!");
    1501             :   else{
    1502             :     //entry->SetOwner(kFALSE);
    1503             : 
    1504           6 :     calibdata = dynamic_cast<AliZDCPedestals*>  (entry->GetObject());
    1505           2 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1506             : 
    1507             :   }
    1508           2 :   return calibdata;
    1509           0 : }
    1510             : 
    1511             : //_____________________________________________________________________________
    1512             : AliZDCEnCalib* AliZDCReconstructor::GetEnergyCalibData() const
    1513             : {
    1514             : 
    1515             :   // Getting energy and equalization calibration object for ZDC set
    1516             :   AliZDCEnCalib *calibdata = 0x0;
    1517           6 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/EnergyCalib");
    1518           2 :   if(!entry) AliFatal("No calibration data loaded!");  
    1519             :   else{
    1520           2 :     entry->SetOwner(kFALSE);
    1521             : 
    1522           6 :     calibdata = dynamic_cast<AliZDCEnCalib*> (entry->GetObject());
    1523           2 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1524             :   }
    1525           2 :   return calibdata;
    1526           0 : }
    1527             : 
    1528             : //_____________________________________________________________________________
    1529             : AliZDCSaturationCalib* AliZDCReconstructor::GetSaturationCalibData() const
    1530             : {
    1531             : 
    1532             :   // Getting energy and equalization calibration object for ZDC set
    1533             :   AliZDCSaturationCalib *calibdata = 0x0;
    1534           6 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/SaturationCalib");
    1535           2 :   if(!entry) AliFatal("No calibration data loaded!");  
    1536             :   else{
    1537           2 :     entry->SetOwner(kFALSE);
    1538             : 
    1539           6 :     calibdata = dynamic_cast<AliZDCSaturationCalib*> (entry->GetObject());
    1540           2 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1541             :   }
    1542           2 :   return calibdata;
    1543           0 : }
    1544             : 
    1545             : //_____________________________________________________________________________
    1546             : AliZDCTowerCalib* AliZDCReconstructor::GetTowerCalibData() const
    1547             : {
    1548             : 
    1549             :   // Getting energy and equalization calibration object for ZDC set
    1550             :   AliZDCTowerCalib *calibdata = 0x0;
    1551           6 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/TowerCalib");
    1552           2 :   if(!entry) AliFatal("No calibration data loaded!");  
    1553             :   else{
    1554           2 :     entry->SetOwner(kFALSE);
    1555             : 
    1556           6 :     calibdata = dynamic_cast<AliZDCTowerCalib*> (entry->GetObject());
    1557           2 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1558             :   }
    1559           2 :   return calibdata;
    1560           0 : }
    1561             : 
    1562             : //_____________________________________________________________________________
    1563             : AliZDCMBCalib* AliZDCReconstructor::GetMBCalibData() const
    1564             : {
    1565             : 
    1566             :   // Getting energy and equalization calibration object for ZDC set
    1567             :   AliZDCMBCalib *calibdata = 0x0;
    1568           0 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/MBCalib");
    1569           0 :   if(!entry) AliFatal("No calibration data loaded!");  
    1570             :   else{
    1571           0 :     entry->SetOwner(kFALSE);
    1572             : 
    1573           0 :     calibdata = dynamic_cast<AliZDCMBCalib*> (entry->GetObject());
    1574           0 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1575             :   }
    1576           0 :   return calibdata;
    1577           0 : }
    1578             : 
    1579             : //_____________________________________________________________________________
    1580             : AliZDCTDCCalib* AliZDCReconstructor::GetTDCCalibData() const
    1581             : {
    1582             : 
    1583             :   // Getting TDC object for ZDC 
    1584             :   AliZDCTDCCalib *calibdata = 0x0;
    1585           6 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/TDCCalib");
    1586           2 :   if(!entry) AliFatal("No calibration data loaded!");  
    1587             :   else{
    1588           2 :     entry->SetOwner(kFALSE);
    1589             : 
    1590           6 :     calibdata = dynamic_cast<AliZDCTDCCalib*> (entry->GetObject());
    1591           2 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1592             : 
    1593             :   }
    1594           2 :   return calibdata;
    1595           0 : }
    1596             : 
    1597             : //_____________________________________________________________________________
    1598             : AliZDCChMap* AliZDCReconstructor::GetMapping() const
    1599             : {
    1600             : 
    1601             :   // Getting TDC object for ZDC 
    1602             :   AliZDCChMap *calibdata = 0x0;
    1603           6 :   AliCDBEntry  *entry = AliCDBManager::Instance()->Get("ZDC/Calib/ChMap");
    1604           2 :   if(!entry) AliFatal("No calibration data loaded!");  
    1605             :   else{
    1606           2 :     entry->SetOwner(kFALSE);
    1607             : 
    1608           6 :     calibdata = dynamic_cast<AliZDCChMap*> (entry->GetObject());
    1609           2 :     if(!calibdata)  AliFatal("Wrong calibration object in calibration  file!");
    1610             : 
    1611             :   }
    1612           2 :   return calibdata;
    1613           0 : }
    1614             : 
    1615             : 
    1616             : //_____________________________________________________________________________
    1617             : int AliZDCReconstructor::GetChannelSignal(int det, int quad, Bool_t intime) const
    1618             : {
    1619         594 :   if(intime){
    1620         594 :    if(quad!=5){ // No ref. PMT
    1621         273 :       if(det==1){
    1622          90 :         if(quad==0) return kZNCC;
    1623          60 :         else if(quad==1) return kZNC1;
    1624          48 :         else if(quad==2) return kZNC2;
    1625          36 :         else if(quad==3) return kZNC3;
    1626          24 :         else if(quad==4) return kZNC4;
    1627             :       }
    1628         204 :       else if(det==2){
    1629          72 :         if(quad==0) return kZPCC;
    1630          60 :         else if(quad==1) return kZPC1;
    1631          48 :         else if(quad==2) return kZPC2;
    1632          36 :         else if(quad==3) return kZPC3;
    1633          24 :         else if(quad==4) return kZPC4;
    1634             :       }
    1635         144 :       else if(det==3){
    1636          36 :         if(quad==1) return kZEM1;
    1637          24 :         else if(quad==2) return kZEM2;
    1638             :       }
    1639         120 :       else if(det==4){
    1640          72 :         if(quad==0) return kZNAC;
    1641          60 :         else if(quad==1) return kZNA1;
    1642          48 :         else if(quad==2) return kZNA2;
    1643          36 :         else if(quad==3) return kZNA3;
    1644          24 :         else if(quad==4) return kZNA4;
    1645             :       }
    1646          60 :       else if(det==5){
    1647          72 :         if(quad==0) return kZPAC;
    1648          60 :         else if(quad==1) return kZPA1;
    1649          48 :         else if(quad==2) return kZPA2;
    1650          36 :         else if(quad==3) return kZPA3;
    1651          24 :         else if(quad==4) return kZPA4;
    1652             :       }
    1653             :    }
    1654             :    else{ // Ref. PMT
    1655          24 :      if(quad==1) return kZDCCMon;
    1656          24 :      else if(quad==4)  return kZDCAMon;
    1657             :    }
    1658             :   }
    1659             :   else{
    1660           0 :       if(quad!=5){ // No ref. PMT
    1661           0 :          if(det==1){
    1662           0 :            if(quad==0) return kZNCCoot;
    1663           0 :            else if(quad==1) return kZNC1oot;
    1664           0 :            else if(quad==2) return kZNC2oot;
    1665           0 :            else if(quad==3) return kZNC3oot;
    1666           0 :            else if(quad==4) return kZNC4oot;
    1667             :          }
    1668           0 :          else if(det==2){
    1669           0 :            if(quad==0) return kZPCCoot;
    1670           0 :            else if(quad==1) return kZPC1oot;
    1671           0 :            else if(quad==2) return kZPC2oot;
    1672           0 :            else if(quad==3) return kZPC3oot;
    1673           0 :            else if(quad==4) return kZPC4oot;
    1674             :          }
    1675           0 :          else if(det==3){
    1676           0 :            if(quad==1) return kZEM1oot;
    1677           0 :            else if(quad==2) return kZEM2oot;
    1678             :          }
    1679           0 :          else if(det==4){
    1680           0 :            if(quad==0) return kZNACoot;
    1681           0 :            else if(quad==1) return kZNA1oot;
    1682           0 :            else if(quad==2) return kZNA2oot;
    1683           0 :            else if(quad==3) return kZNA3oot;
    1684           0 :            else if(quad==4) return kZNA4oot;
    1685             :          }
    1686           0 :          else if(det==5){
    1687           0 :            if(quad==0) return kZPACoot;
    1688           0 :            else if(quad==1) return kZPA1oot;
    1689           0 :            else if(quad==2) return kZPA2oot;
    1690           0 :            else if(quad==3) return kZPA3oot;
    1691           0 :            else if(quad==4) return kZPA4oot;
    1692             :          }
    1693             :       }
    1694             :       else{
    1695           0 :         if(quad==1) return kZDCCMon;
    1696           0 :         else if(quad==4)  return kZDCAMon;
    1697             :       }
    1698             :     }
    1699         297 : }

Generated by: LCOV version 1.11