ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
/* $Id$ */
//_________________________________________________________________________
// Macros analyzing the ESD file
// Use Case : 
//          root> .L AnaESD.C++
//          root> ana() --> prints the objects stored in ESD
//                                              
// author  : Yves Schutz (CERN/SUBATECH)
// February 2004
//_________________________________________________________________________
#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TFile.h"
#include "TMath.h"
#include "TH1D.h"
#include "TROOT.h"
#include "TBrowser.h"
#include "AliPHOSGetter.h"
#include "AliPHOSGeometry.h"
#include "Riostream.h"
#include "AliESD.h"
#include "AliESDtrack.h"
#include "AliESDCaloTrack.h"
#include "AliEMCALRecParticle.h"
#include "AliPHOSRecParticle.h"
#include "AliKalmanTrack.h"
#include "AliPHOSGridFile.h"
#endif

Bool_t AnaESD(TString filename) ; 
void   Match(AliESDtrack * ct, AliESDtrack * cp, Double_t * dist) ; 


//__________________________________________________________________________
Bool_t Ana(const TString type = "per5", const Int_t run = 1, const Int_t nOfEvt = 1) 
{ 
  // Analyzes data from the AliEn data catalog

  // Data Challenge identification
  const TString kYear("2004") ; 
  const TString kProd("02") ; 
  const TString kVers("V4.01.Rev.00") ; 

  // get the LFN file name in the Grid catalogue ; 
  AliPHOSGridFile lfn ; 
  if (!lfn.IsConnected()) 
    return kFALSE ; 
  lfn.SetPath(kYear, kProd, kVers, type) ;  
  lfn.SetRun(run) ; 

  //loop over the events 
  Int_t nevt, evt = 0 ; 
  for (nevt = 0 ; nevt < nOfEvt ; nevt++) { 
    evt++ ; 
    lfn.SetEvt(evt) ;
    TString fileName = lfn.GetLFN() ; 
    
    if (fileName.IsNull()) {
      nevt-- ; 
      continue ; 
    }

    printf(">>>>>>>>>>>> Processing %s-%s/%s/%s : run # %d event # %d \n", 
	   kYear.Data(), kProd.Data(), kVers.Data(), type.Data(), run, evt) ;
    AnaESD(fileName) ;
  } 
  return kTRUE ; 
}

//__________________________________________________________________________
Bool_t AnaESD(TString fileName) 
{
  // Analyze ESD from file fileName
  // calo track histograms ;
  
  TFile * out = new TFile("AOD.root", "RECREATE") ; 
  TH1D * hCaloEnergyA = 0 ; 
  TH1D * hCaloEnergyE = 0 ; 
  TH1D * hCaloEnergyG = 0 ; 
  TH1D * hCaloEnergyP = 0 ; 
  TH1D * heta = 0 ;
  TH1D * hphi = 0 ; 
  Double_t dist[3] ; 

  AliPHOSGetter * gime = AliPHOSGetter::Instance(fileName) ; 
  
  Int_t nEvent = gime->MaxEvent() ;  
  Int_t event ; 
  AliESD * esd = 0 ;
  for (event = 0 ; event < nEvent; event++) {
    cout << "AnaESD : Processing event # " << event << endl ; 
    esd = gime->ESD(event) ; 
    if (!esd) 
      return kFALSE ; 
    
    //esd->Print();  
    // Calorimeter tracks 
    AliESDtrack * ct ; 
    Int_t caloindex ; 
    for (caloindex = 0 ; caloindex < esd->GetNumberOfTracks() ; caloindex++) {
      // get the tracks and check if it is from PHOS 
      ct = esd->GetTrack(caloindex) ;
      if ( !ct->IsPHOS() ) 
	continue ; 
      Double_t energy = ct->GetPHOSsignal() ; 
      // check if CPV bit is set (see AliPHOSFastRecParticle) 
      Double_t type[AliESDtrack::kSPECIES+4] ;
      ct->GetPHOSpid(type) ; 
      
      if ( (type[AliESDtrack::kElectron] == 1.0) || (type[AliESDtrack::kPhoton] == 1.0) ) {
	if(!hCaloEnergyA) {
	  out->cd() ; 
	  hCaloEnergyA = new TH1D("CaloEnergyA", "Energy in calorimeter Electron/Photon like", 500, 0., 50.) ;
	}
	hCaloEnergyA->Fill(energy) ;  
      }
      
      if ( type[AliESDtrack::kElectron] == 1.0 ) {
	if(!hCaloEnergyE) {
	  out->cd() ; 
	  hCaloEnergyE = new TH1D("CaloEnergyE", "Energy in calorimeter Electron like", 500, 0., 50.) ;
	}
	hCaloEnergyE->Fill(energy) ;  
      } 
  
      if ( type[AliESDtrack::kPhoton] == 1.0 ) {
	if(!hCaloEnergyG) {
	  out->cd() ; 
	  hCaloEnergyG = new TH1D("CaloEnergyG", "Energy in calorimeter Gamma like", 500, 0., 50.) ;
	}
	hCaloEnergyG->Fill(energy) ;
      }  
     
      if ( type[AliESDtrack::kPi0] == 1.0 ) {
	if(!hCaloEnergyP) {
	  out->cd() ; 
	  hCaloEnergyP = new TH1D("CaloEnergyP", "Energy in calorimeter Pi0 like", 500, 0., 100.) ;
	}
	hCaloEnergyP->Fill(energy) ;
      }  
      
      AliESDtrack * cp ; 
      Int_t cpindex ; 
      for (cpindex = 0 ; cpindex < esd->GetNumberOfTracks() ; cpindex++) {
	// get the charged tracks from central tracking
	cp = esd->GetTrack(cpindex) ;
	if ( cp->IsPHOS() ) 
	  continue ; 
	Match(ct, cp, dist) ; 
	if (!heta && !hphi) {
	  heta = new TH1D("Correta", "neutral-charged correlation in eta" , 100, 0., 360.) ; 
	  hphi = new TH1D("Corrphi", "neutral-charged correlation in phi" , 100, 0., 360.) ; 
	}
	heta->Fill(dist[1]) ; 
	hphi->Fill(dist[2]) ;
      }
    }
  }
  TBrowser * bs = new TBrowser("Root Memory Bowser", gROOT->FindObjectAny("AOD.root") ) ;
  bs->Show() ;
  out->Write() ; 
  return kTRUE ; 
}

//__________________________________________________________________________
void Match(AliESDtrack * ct, AliESDtrack * cp, Double_t * dist) 
{
  // Calculates the distance (x,z) between  the particle detected by PHOS and 
  // the charged particle reconstructed by the global tracking 

      
 //  Int_t phN ; 
//   Double_t phZ, phX ; 
  
//   if (ct->IsPHOS()) { // it is a PHOS particle 
//     Double_t cpTheta,  cpPhi ;  
//     Double_t phTheta,  phPhi ; 
//     cpTheta = cpPhi = phTheta = phPhi = 0. ; 
//    //    cout << "PHOS particle # " << " pos (" 
//     // 	 << pp->GetPos().X() << ", " << pp->GetPos().Y() << ", " << pp->GetPos().Z() << ")" << endl ;
    
//     AliPHOSGetter * gime = AliPHOSGetter::Instance() ; 
//     gime->PHOSGeometry()->ImpactOnEmc(*pp, phN, phZ, phX) ; 
//     Double_t xyzAtPHOS[3] ; 
//     cp->GetOuterXYZ(xyzAtPHOS) ; 
//     if ( (xyzAtPHOS[0] +  xyzAtPHOS[1] + xyzAtPHOS[2]) != 0.) { //it has reached PHOS
//       //the next check are only if we want high quality tracks 
//       //       ULong_t status = cp->GetStatus() ;  
//       //       if ((status & AliESDtrack::kTRDput)==0) 
//       // 	do not continue;
//       //       if ((status & AliESDtrack::kTRDStop)!=0) 
//       // 	do not continue;  
//       //       cout << "Charged particle # " << " pos (" 
//       // 	   << xyzAtPHOS[0] << ", " << xyzAtPHOS[1] << ", " << xyzAtPHOS[2] << ")" <<  endl ;     
//       TVector3 poscp(xyzAtPHOS[0], xyzAtPHOS[1], xyzAtPHOS[2]) ;
//       Int_t cpN ;
//       Double_t cpZ,cpX ; 
//       gime->PHOSGeometry()->ImpactOnEmc(poscp, cpN, cpZ, cpX) ; 
//       if (cpN) {// we are inside the PHOS acceptance 
// 	// 	cout << "Charged Matching 1: " << cpN << " " << cpZ << " " << cpX << endl ; 
// 	// 	cout << "Charged Matching 2: " << phN << " " << phZ << " " << phX << endl ; 
// 	dist[0] = TMath::Sqrt( (cpZ-phZ)*(cpZ-phZ) + (cpX-phX)*(cpX-phX)) ;  
//       } 
//       phTheta = pp->Theta() ; 
//       phPhi   = pp->Phi() ;
//       TParticle tempo ; 
//       tempo.SetMomentum(xyzAtPHOS[0], xyzAtPHOS[1], xyzAtPHOS[2], 0.) ;  
//       cpTheta = tempo.Theta() ; 
//       cpPhi   = tempo.Phi() ;
//       //cout << phTheta << " " << phPhi << " " << endl 
//       //cout <<	 cpTheta << " " << cpPhi-phPhi << " " << endl ; 
//     }
//     dist[1] = (phTheta - cpTheta)*TMath::RadToDeg() ; 
//     dist[2] = (phPhi - cpPhi)*TMath::RadToDeg() ; 
//   }
  
//   if (ep) {
//     //cout << "EMCAL particle # " << endl ; 
//   }
}
 AnaESD.C:1
 AnaESD.C:2
 AnaESD.C:3
 AnaESD.C:4
 AnaESD.C:5
 AnaESD.C:6
 AnaESD.C:7
 AnaESD.C:8
 AnaESD.C:9
 AnaESD.C:10
 AnaESD.C:11
 AnaESD.C:12
 AnaESD.C:13
 AnaESD.C:14
 AnaESD.C:15
 AnaESD.C:16
 AnaESD.C:17
 AnaESD.C:18
 AnaESD.C:19
 AnaESD.C:20
 AnaESD.C:21
 AnaESD.C:22
 AnaESD.C:23
 AnaESD.C:24
 AnaESD.C:25
 AnaESD.C:26
 AnaESD.C:27
 AnaESD.C:28
 AnaESD.C:29
 AnaESD.C:30
 AnaESD.C:31
 AnaESD.C:32
 AnaESD.C:33
 AnaESD.C:34
 AnaESD.C:35
 AnaESD.C:36
 AnaESD.C:37
 AnaESD.C:38
 AnaESD.C:39
 AnaESD.C:40
 AnaESD.C:41
 AnaESD.C:42
 AnaESD.C:43
 AnaESD.C:44
 AnaESD.C:45
 AnaESD.C:46
 AnaESD.C:47
 AnaESD.C:48
 AnaESD.C:49
 AnaESD.C:50
 AnaESD.C:51
 AnaESD.C:52
 AnaESD.C:53
 AnaESD.C:54
 AnaESD.C:55
 AnaESD.C:56
 AnaESD.C:57
 AnaESD.C:58
 AnaESD.C:59
 AnaESD.C:60
 AnaESD.C:61
 AnaESD.C:62
 AnaESD.C:63
 AnaESD.C:64
 AnaESD.C:65
 AnaESD.C:66
 AnaESD.C:67
 AnaESD.C:68
 AnaESD.C:69
 AnaESD.C:70
 AnaESD.C:71
 AnaESD.C:72
 AnaESD.C:73
 AnaESD.C:74
 AnaESD.C:75
 AnaESD.C:76
 AnaESD.C:77
 AnaESD.C:78
 AnaESD.C:79
 AnaESD.C:80
 AnaESD.C:81
 AnaESD.C:82
 AnaESD.C:83
 AnaESD.C:84
 AnaESD.C:85
 AnaESD.C:86
 AnaESD.C:87
 AnaESD.C:88
 AnaESD.C:89
 AnaESD.C:90
 AnaESD.C:91
 AnaESD.C:92
 AnaESD.C:93
 AnaESD.C:94
 AnaESD.C:95
 AnaESD.C:96
 AnaESD.C:97
 AnaESD.C:98
 AnaESD.C:99
 AnaESD.C:100
 AnaESD.C:101
 AnaESD.C:102
 AnaESD.C:103
 AnaESD.C:104
 AnaESD.C:105
 AnaESD.C:106
 AnaESD.C:107
 AnaESD.C:108
 AnaESD.C:109
 AnaESD.C:110
 AnaESD.C:111
 AnaESD.C:112
 AnaESD.C:113
 AnaESD.C:114
 AnaESD.C:115
 AnaESD.C:116
 AnaESD.C:117
 AnaESD.C:118
 AnaESD.C:119
 AnaESD.C:120
 AnaESD.C:121
 AnaESD.C:122
 AnaESD.C:123
 AnaESD.C:124
 AnaESD.C:125
 AnaESD.C:126
 AnaESD.C:127
 AnaESD.C:128
 AnaESD.C:129
 AnaESD.C:130
 AnaESD.C:131
 AnaESD.C:132
 AnaESD.C:133
 AnaESD.C:134
 AnaESD.C:135
 AnaESD.C:136
 AnaESD.C:137
 AnaESD.C:138
 AnaESD.C:139
 AnaESD.C:140
 AnaESD.C:141
 AnaESD.C:142
 AnaESD.C:143
 AnaESD.C:144
 AnaESD.C:145
 AnaESD.C:146
 AnaESD.C:147
 AnaESD.C:148
 AnaESD.C:149
 AnaESD.C:150
 AnaESD.C:151
 AnaESD.C:152
 AnaESD.C:153
 AnaESD.C:154
 AnaESD.C:155
 AnaESD.C:156
 AnaESD.C:157
 AnaESD.C:158
 AnaESD.C:159
 AnaESD.C:160
 AnaESD.C:161
 AnaESD.C:162
 AnaESD.C:163
 AnaESD.C:164
 AnaESD.C:165
 AnaESD.C:166
 AnaESD.C:167
 AnaESD.C:168
 AnaESD.C:169
 AnaESD.C:170
 AnaESD.C:171
 AnaESD.C:172
 AnaESD.C:173
 AnaESD.C:174
 AnaESD.C:175
 AnaESD.C:176
 AnaESD.C:177
 AnaESD.C:178
 AnaESD.C:179
 AnaESD.C:180
 AnaESD.C:181
 AnaESD.C:182
 AnaESD.C:183
 AnaESD.C:184
 AnaESD.C:185
 AnaESD.C:186
 AnaESD.C:187
 AnaESD.C:188
 AnaESD.C:189
 AnaESD.C:190
 AnaESD.C:191
 AnaESD.C:192
 AnaESD.C:193
 AnaESD.C:194
 AnaESD.C:195
 AnaESD.C:196
 AnaESD.C:197
 AnaESD.C:198
 AnaESD.C:199
 AnaESD.C:200
 AnaESD.C:201
 AnaESD.C:202
 AnaESD.C:203
 AnaESD.C:204
 AnaESD.C:205
 AnaESD.C:206
 AnaESD.C:207
 AnaESD.C:208
 AnaESD.C:209
 AnaESD.C:210
 AnaESD.C:211
 AnaESD.C:212
 AnaESD.C:213
 AnaESD.C:214
 AnaESD.C:215
 AnaESD.C:216
 AnaESD.C:217
 AnaESD.C:218
 AnaESD.C:219
 AnaESD.C:220
 AnaESD.C:221
 AnaESD.C:222
 AnaESD.C:223
 AnaESD.C:224
 AnaESD.C:225
 AnaESD.C:226
 AnaESD.C:227
 AnaESD.C:228
 AnaESD.C:229
 AnaESD.C:230
 AnaESD.C:231
 AnaESD.C:232
 AnaESD.C:233
 AnaESD.C:234