ROOT logo
/************************************************************************* 
* Copyright(c) 1998-2048, 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.                  * 
**************************************************************************/

// Author: Dariusz Miskowiec <mailto:d.miskowiec@gsi.de> 2008

//=============================================================================
// AliUnicorEvent-AliESD interface                                                   //
//=============================================================================

#include <cmath>
#include "TFile.h"
#include "TH1.h"
#include "TGraph.h"
#include "AliESDVZERO.h"
#include "AliESDEvent.h"
#include "AliMultiplicity.h"
#include "AliUnicorEventAliceESD.h"

ClassImp(AliUnicorEventAliceESD)

//=============================================================================
AliUnicorEventAliceESD::AliUnicorEventAliceESD(AliESDEvent *esd) : AliUnicorEvent(), fViper(0), fESD(esd)//, fPhysicsSelection(0) 
{
  // constructor 

  //  printf("%s object created\n",ClassName());
  if (!fESD) fESD = new AliESDEvent();
  //  fPhysicsSelection = new AliPhysicsSelection();

  // V0 percentile graph for centrality determination

  //  TFile::Open("$ALICE_ROOT/ANALYSIS/macros/AliCentralityBy1D_137161_v4.root","read");
  TFile::Open("$ALICE_ROOT/ANALYSIS/macros/AliCentralityBy1D_137366_v2.root","read");
  const TH1F *hi = (const TH1F*) gFile->Get("hmultV0_percentile");
  //const TH1D *hi = (const TH1D*) gFile->Get("hNtracks_percentile");
  //const TH1F *hi = (const TH1F*) gFile->Get("hNclusters1_percentile");
  fViper = new TGraph((const TH1*) hi);
  gFile->Close();
}
//=============================================================================
AliUnicorEventAliceESD::~AliUnicorEventAliceESD() {

  // destructor

}
//=============================================================================
Bool_t AliUnicorEventAliceESD::Good() const 
{
  // event cuts

  //  if (!fPhysicsSelection->IsCollisionCandidate(fESD)) return kFALSE;
  const AliESDVertex *vtx = fESD->GetPrimaryVertex();
  if (!vtx->GetStatus()) return kFALSE;
  if (fabs(Zver())>1) return kFALSE;
  if (NGoodParticles()<9) return kFALSE;
  return kTRUE;
}
//=============================================================================
Double_t AliUnicorEventAliceESD::Centrality() const {

  // centrality between 0 (central) and 1 (very peripheral)

  // V0 multiplicity, not linearized
  
  AliESDVZERO *v0 = fESD->GetVZEROData();
  float multa = v0->GetMTotV0A();
  float multc = v0->GetMTotV0C();
  double cent = fViper->Eval(multa+multc)/100.0;

  // number of tracks

  // double cent = fViper->Eval(((AliVEvent*) fESD)->GetNumberOfTracks())/100.0;  

  // number of clusters in second layer of SPD

  //  double nspd2 = fESD->GetMultiplicity()->GetNumberOfITSClusters(1);
  //  double zv = fESD->GetPrimaryVertexSPD()->GetZ();
  //  const double pars[] = {8.10030e-01,-2.80364e-03,-7.19504e-04};
  //  zv -= pars[0];
  //  float corr = 1 + zv*(pars[1] + zv*pars[2]);
  //  nspd2 = corr>0? nspd2/corr : -1;
  //  double cent = fViper->Eval(nspd2)/100.0;  

  return cent;
}
//=============================================================================
Bool_t AliUnicorEventAliceESD::ParticleGood(Int_t i, Int_t pidi) const 
{
  // track cuts and particle id cuts; pidi=0 means take all species
  // consider using the standard ESDcut

  // track quality cuts

  AliESDtrack *track = fESD->GetTrack(i);
  if (!track->IsOn(AliESDtrack::kTPCrefit)) return 0;        // TPC refit
  if (!track->IsOn(AliESDtrack::kITSrefit)) return 0;        // ITS refit
  if (track->GetTPCNcls() < 90) return 0;                    // number of TPC clusters
  if (track->GetKinkIndex(0) > 0) return 0;                  // no kink daughters
  const AliExternalTrackParam *tp = GetTrackParam(i);
  if (!tp) return 0;                                         // track param
  if (fabs(tp->Eta())>0.8) return 0;                         // fiducial pseudorapidity

  //  double pi9 = TMath::Pi()/9.0;
  //  double eta = tp->Eta();
  //  double phi = ParticlePhi(i);
  //  if (eta>0 && phi>-8*pi9 && phi<-7*pi9) return 0; // A10
  //  if (eta>0 && phi> 1*pi9 && phi< 2*pi9) return 0; // A01
  //  if (tp->Pt()<0.2) return 0;                      // lower pt cutoff

  Float_t r,z;
  track->GetImpactParametersTPC(r,z);
  if (fabs(z)>1.0) return 0;                          // impact parameter in z
  if (fabs(r)>1.0) return 0;                          // impact parameter in xy
  if (r==0) return 0;

  //TBits shared = track->GetTPCSharedMap();
  //if (shared.CountBits()) return 0;                 // no shared clusters; pragmatic but dangerous

  if (pidi==0) return 1; 

  // pid

  if (!track->IsOn(AliESDtrack::kTPCpid)) return 0;
  Double_t p[AliPID::kSPECIES];
  track->GetTPCpid(p);
  Int_t q = tp->Charge();

  if (pidi == -211) return p[AliPID::kPion]+p[AliPID::kMuon]>0.5 && q==-1;
  else if (pidi == 211) return p[AliPID::kPion]+p[AliPID::kMuon]>0.5 && q==1;
  else if (pidi == -321) return p[AliPID::kKaon]>0.5 && q==-1;
  else if (pidi ==  321) return p[AliPID::kKaon]>0.5 && q==1;
  else if (pidi == -2212) return p[AliPID::kProton]>0.5 && q==-1;
  else if (pidi ==  2212) return p[AliPID::kProton]>0.5 && q==1;
  else if (pidi == -11) return p[AliPID::kElectron]>0.5 && q==1;
  else if (pidi ==  11) return p[AliPID::kElectron]>0.5 && q==-1;
  else return 0;
}
//=============================================================================
Bool_t AliUnicorEventAliceESD::PairGood(double p0, double the0, double phi0, double z0,  
				double p1, double the1, double phi1, double z1) const {

  // two-track separation cut

  double dthe = the1-the0;
  if (fabs(dthe)>0.010) return kTRUE;
  double B = -0.5; // magnetic field in T, needed for helix; should be gotten in the proper way
  double pt0 = p0*sin(the0);
  double pt1 = p1*sin(the1);
  double r = 1.2; // we will calculate the distance between the two tracks at r=1.2 m
  // for (double r=0.8; r<2.5; r+=0.2) {
  double si0 = -0.3*B*z0*r/2/pt0;
  double si1 = -0.3*B*z1*r/2/pt1;
  if (fabs(si0)>=1.0) return kTRUE; // could be done better
  if (fabs(si1)>=1.0) return kTRUE;
  double dphi = phi1 - phi0 + asin(si1) - asin(si0);
  dphi = TVector2::Phi_mpi_pi(dphi);
  if (fabs(dphi)<0.020) return kFALSE;
  // }
  return kTRUE;
}
//=============================================================================
 AliUnicorEventAliceESD.cxx:1
 AliUnicorEventAliceESD.cxx:2
 AliUnicorEventAliceESD.cxx:3
 AliUnicorEventAliceESD.cxx:4
 AliUnicorEventAliceESD.cxx:5
 AliUnicorEventAliceESD.cxx:6
 AliUnicorEventAliceESD.cxx:7
 AliUnicorEventAliceESD.cxx:8
 AliUnicorEventAliceESD.cxx:9
 AliUnicorEventAliceESD.cxx:10
 AliUnicorEventAliceESD.cxx:11
 AliUnicorEventAliceESD.cxx:12
 AliUnicorEventAliceESD.cxx:13
 AliUnicorEventAliceESD.cxx:14
 AliUnicorEventAliceESD.cxx:15
 AliUnicorEventAliceESD.cxx:16
 AliUnicorEventAliceESD.cxx:17
 AliUnicorEventAliceESD.cxx:18
 AliUnicorEventAliceESD.cxx:19
 AliUnicorEventAliceESD.cxx:20
 AliUnicorEventAliceESD.cxx:21
 AliUnicorEventAliceESD.cxx:22
 AliUnicorEventAliceESD.cxx:23
 AliUnicorEventAliceESD.cxx:24
 AliUnicorEventAliceESD.cxx:25
 AliUnicorEventAliceESD.cxx:26
 AliUnicorEventAliceESD.cxx:27
 AliUnicorEventAliceESD.cxx:28
 AliUnicorEventAliceESD.cxx:29
 AliUnicorEventAliceESD.cxx:30
 AliUnicorEventAliceESD.cxx:31
 AliUnicorEventAliceESD.cxx:32
 AliUnicorEventAliceESD.cxx:33
 AliUnicorEventAliceESD.cxx:34
 AliUnicorEventAliceESD.cxx:35
 AliUnicorEventAliceESD.cxx:36
 AliUnicorEventAliceESD.cxx:37
 AliUnicorEventAliceESD.cxx:38
 AliUnicorEventAliceESD.cxx:39
 AliUnicorEventAliceESD.cxx:40
 AliUnicorEventAliceESD.cxx:41
 AliUnicorEventAliceESD.cxx:42
 AliUnicorEventAliceESD.cxx:43
 AliUnicorEventAliceESD.cxx:44
 AliUnicorEventAliceESD.cxx:45
 AliUnicorEventAliceESD.cxx:46
 AliUnicorEventAliceESD.cxx:47
 AliUnicorEventAliceESD.cxx:48
 AliUnicorEventAliceESD.cxx:49
 AliUnicorEventAliceESD.cxx:50
 AliUnicorEventAliceESD.cxx:51
 AliUnicorEventAliceESD.cxx:52
 AliUnicorEventAliceESD.cxx:53
 AliUnicorEventAliceESD.cxx:54
 AliUnicorEventAliceESD.cxx:55
 AliUnicorEventAliceESD.cxx:56
 AliUnicorEventAliceESD.cxx:57
 AliUnicorEventAliceESD.cxx:58
 AliUnicorEventAliceESD.cxx:59
 AliUnicorEventAliceESD.cxx:60
 AliUnicorEventAliceESD.cxx:61
 AliUnicorEventAliceESD.cxx:62
 AliUnicorEventAliceESD.cxx:63
 AliUnicorEventAliceESD.cxx:64
 AliUnicorEventAliceESD.cxx:65
 AliUnicorEventAliceESD.cxx:66
 AliUnicorEventAliceESD.cxx:67
 AliUnicorEventAliceESD.cxx:68
 AliUnicorEventAliceESD.cxx:69
 AliUnicorEventAliceESD.cxx:70
 AliUnicorEventAliceESD.cxx:71
 AliUnicorEventAliceESD.cxx:72
 AliUnicorEventAliceESD.cxx:73
 AliUnicorEventAliceESD.cxx:74
 AliUnicorEventAliceESD.cxx:75
 AliUnicorEventAliceESD.cxx:76
 AliUnicorEventAliceESD.cxx:77
 AliUnicorEventAliceESD.cxx:78
 AliUnicorEventAliceESD.cxx:79
 AliUnicorEventAliceESD.cxx:80
 AliUnicorEventAliceESD.cxx:81
 AliUnicorEventAliceESD.cxx:82
 AliUnicorEventAliceESD.cxx:83
 AliUnicorEventAliceESD.cxx:84
 AliUnicorEventAliceESD.cxx:85
 AliUnicorEventAliceESD.cxx:86
 AliUnicorEventAliceESD.cxx:87
 AliUnicorEventAliceESD.cxx:88
 AliUnicorEventAliceESD.cxx:89
 AliUnicorEventAliceESD.cxx:90
 AliUnicorEventAliceESD.cxx:91
 AliUnicorEventAliceESD.cxx:92
 AliUnicorEventAliceESD.cxx:93
 AliUnicorEventAliceESD.cxx:94
 AliUnicorEventAliceESD.cxx:95
 AliUnicorEventAliceESD.cxx:96
 AliUnicorEventAliceESD.cxx:97
 AliUnicorEventAliceESD.cxx:98
 AliUnicorEventAliceESD.cxx:99
 AliUnicorEventAliceESD.cxx:100
 AliUnicorEventAliceESD.cxx:101
 AliUnicorEventAliceESD.cxx:102
 AliUnicorEventAliceESD.cxx:103
 AliUnicorEventAliceESD.cxx:104
 AliUnicorEventAliceESD.cxx:105
 AliUnicorEventAliceESD.cxx:106
 AliUnicorEventAliceESD.cxx:107
 AliUnicorEventAliceESD.cxx:108
 AliUnicorEventAliceESD.cxx:109
 AliUnicorEventAliceESD.cxx:110
 AliUnicorEventAliceESD.cxx:111
 AliUnicorEventAliceESD.cxx:112
 AliUnicorEventAliceESD.cxx:113
 AliUnicorEventAliceESD.cxx:114
 AliUnicorEventAliceESD.cxx:115
 AliUnicorEventAliceESD.cxx:116
 AliUnicorEventAliceESD.cxx:117
 AliUnicorEventAliceESD.cxx:118
 AliUnicorEventAliceESD.cxx:119
 AliUnicorEventAliceESD.cxx:120
 AliUnicorEventAliceESD.cxx:121
 AliUnicorEventAliceESD.cxx:122
 AliUnicorEventAliceESD.cxx:123
 AliUnicorEventAliceESD.cxx:124
 AliUnicorEventAliceESD.cxx:125
 AliUnicorEventAliceESD.cxx:126
 AliUnicorEventAliceESD.cxx:127
 AliUnicorEventAliceESD.cxx:128
 AliUnicorEventAliceESD.cxx:129
 AliUnicorEventAliceESD.cxx:130
 AliUnicorEventAliceESD.cxx:131
 AliUnicorEventAliceESD.cxx:132
 AliUnicorEventAliceESD.cxx:133
 AliUnicorEventAliceESD.cxx:134
 AliUnicorEventAliceESD.cxx:135
 AliUnicorEventAliceESD.cxx:136
 AliUnicorEventAliceESD.cxx:137
 AliUnicorEventAliceESD.cxx:138
 AliUnicorEventAliceESD.cxx:139
 AliUnicorEventAliceESD.cxx:140
 AliUnicorEventAliceESD.cxx:141
 AliUnicorEventAliceESD.cxx:142
 AliUnicorEventAliceESD.cxx:143
 AliUnicorEventAliceESD.cxx:144
 AliUnicorEventAliceESD.cxx:145
 AliUnicorEventAliceESD.cxx:146
 AliUnicorEventAliceESD.cxx:147
 AliUnicorEventAliceESD.cxx:148
 AliUnicorEventAliceESD.cxx:149
 AliUnicorEventAliceESD.cxx:150
 AliUnicorEventAliceESD.cxx:151
 AliUnicorEventAliceESD.cxx:152
 AliUnicorEventAliceESD.cxx:153
 AliUnicorEventAliceESD.cxx:154
 AliUnicorEventAliceESD.cxx:155
 AliUnicorEventAliceESD.cxx:156
 AliUnicorEventAliceESD.cxx:157
 AliUnicorEventAliceESD.cxx:158
 AliUnicorEventAliceESD.cxx:159
 AliUnicorEventAliceESD.cxx:160
 AliUnicorEventAliceESD.cxx:161
 AliUnicorEventAliceESD.cxx:162
 AliUnicorEventAliceESD.cxx:163
 AliUnicorEventAliceESD.cxx:164
 AliUnicorEventAliceESD.cxx:165
 AliUnicorEventAliceESD.cxx:166
 AliUnicorEventAliceESD.cxx:167
 AliUnicorEventAliceESD.cxx:168
 AliUnicorEventAliceESD.cxx:169
 AliUnicorEventAliceESD.cxx:170
 AliUnicorEventAliceESD.cxx:171
 AliUnicorEventAliceESD.cxx:172
 AliUnicorEventAliceESD.cxx:173