ROOT logo
//-*- Mode: C++ -*-

#include "TMath.h"
#include "TAxis.h"

#include "AliESDEvent.h"
#include "AliStack.h"
#include "AliMCEvent.h"
#include "AliESDtrackCuts.h"

#include "AliAODEvent.h"
#include "AliAODMCParticle.h"

#include "AliAnalysisNetParticleDCA.h"

using namespace std;

/**
 * Class for NetParticle Distributions
 * -- DCA distributions
 * Authors: Jochen Thaeder <jochen@thaeder.de>
 *          Michael Weber <m.weber@cern.ch>
 */

ClassImp(AliAnalysisNetParticleDCA)

/*
 * ---------------------------------------------------------------------------------
 *                            Constructor / Destructor
 * ---------------------------------------------------------------------------------
 */

//________________________________________________________________________
AliAnalysisNetParticleDCA::AliAnalysisNetParticleDCA() :
  AliAnalysisNetParticleBase("DCA", "DCA"),
  fESDTrackCutsBkg(NULL),
  fHnDCA(NULL) {
  // Constructor   

  AliLog::SetClassDebugLevel("AliAnalysisNetParticleDCA",10);
}

//________________________________________________________________________
AliAnalysisNetParticleDCA::~AliAnalysisNetParticleDCA() {
  // Destructor
}

/*
 * ---------------------------------------------------------------------------------
 *                                 Public Methods
 * ---------------------------------------------------------------------------------
 */

//________________________________________________________________________
void AliAnalysisNetParticleDCA::Process() {
  // -- Process event
  //    Process ESD/AOD tracks and fill DCA THnSparse

  // -- Get ranges for AOD particles
  Float_t etaRange[2];
  fESDTrackCutsBkg->GetEtaRange(etaRange[0],etaRange[1]);

  Float_t ptRange[2];
  fESDTrackCutsBkg->GetPtRange(ptRange[0],ptRange[1]); 

  // -- Track Loop
  for (Int_t idxTrack = 0; idxTrack < fNTracks; ++idxTrack) {
    
    AliVTrack *track = (fESD) ? static_cast<AliVTrack*>(fESD->GetTrack(idxTrack)) : static_cast<AliVTrack*>(fAOD->GetTrack(idxTrack)); 

    // -- Check if track is accepted for basic parameters
    if (!fHelper->IsTrackAcceptedBasicCharged(track))
      continue;
    
    // -- Check if accepted - ESD
    if (fESD && !fESDTrackCutsBkg->AcceptTrack(dynamic_cast<AliESDtrack*>(track)))
      continue;
    
    // -- Check if accepted - AOD
    if (fAOD){
      AliAODTrack * trackAOD = dynamic_cast<AliAODTrack*>(track);
      
      if (!trackAOD) {
	AliError("Pointer to dynamic_cast<AliAODTrack*>(track) = ZERO");
	continue;
      }
      if (!trackAOD->TestFilterBit(fAODtrackCutBit))
	continue;

      // -- Check if in pT and eta range (is done in ESDTrackCuts for ESDs)
      if(!(track->Pt() > ptRange[0] && track->Pt() <= ptRange[1] && TMath::Abs(track->Eta()) <= etaRange[1]))
	continue;
    }

    // -- Check if accepted in rapidity window -- for identified particles
    //    for charged particles -- eta check is done in the trackcuts
    Double_t yP;
    if (fHelper->GetUsePID() && !fHelper->IsTrackAcceptedRapidity(track, yP))
      continue;

    // -- Check if accepted by PID from TPC or TPC+TOF
    Double_t pid[3];
    if (!fHelper->IsTrackAcceptedPID(track, pid))
      continue;

    // -- Check if accepted with thighter DCA cuts
    // -- returns kTRUE for AODs for now : MW
    Bool_t isDCArAccepted = fHelper->IsTrackAcceptedDCA(track);

    // -- Check if accepted with thighter DCA cuts
    // ?!?!? How to mimic this in AODs?
    if (fESD && !fESDTrackCuts->AcceptTrack(dynamic_cast<AliESDtrack*>(track)))
      isDCArAccepted = kFALSE;
    
    // -- Check for contamination 
    Int_t contIdx = (fIsMC) ? GetContIdxTrack(TMath::Abs(track->GetLabel()), track->Charge()) : 1;
    
    // -- Get DCAs (dca_r, dca_z, sigma_xy, sigma_xy_z, sigma_z)
    Float_t dca[2], cov[3]; // 
    if (fESD)
      (dynamic_cast<AliESDtrack*>(track))->GetImpactParameters(dca, cov);
    else 
      dca[0] = 1.; 

    // -- Fill THnSparse
    Double_t hnDCA[9] = {fCentralityBin, track->Eta(), yP, track->Phi(), track->Pt(), static_cast<Double_t>(track->Charge()), static_cast<Double_t>(contIdx), static_cast<Double_t>(isDCArAccepted), dca[0]};
    fHnDCA->Fill(hnDCA);

  } // for (Int_t idxTrack = 0; idxTrack < fNTracks; ++idxTrack) {

  return;
}      

/*
 * ---------------------------------------------------------------------------------
 *                                 Private Methods
 * ---------------------------------------------------------------------------------
 */

//________________________________________________________________________
void AliAnalysisNetParticleDCA::CreateHistograms() {
  // -- Create histograms

  // ------------------------------------------------------------------
  // -- Create THnSparseD - DCA
  // ------------------------------------------------------------------

  Int_t    binHnDCA[9] = {AliAnalysisNetParticleHelper::fgkfHistNBinsCent, AliAnalysisNetParticleHelper::fgkfHistNBinsEta,        //     cent |       etaRec
			  AliAnalysisNetParticleHelper::fgkfHistNBinsRap,  AliAnalysisNetParticleHelper::fgkfHistNBinsPhi,        //     yRec |       phiRec
			  AliAnalysisNetParticleHelper::fgkfHistNBinsPt,   AliAnalysisNetParticleHelper::fgkfHistNBinsSign,       //    ptRec |         sign
			  4,  2,  77};                                                                                            //  contPart| DCArAccepted | DCAr

  Double_t minHnDCA[9] = {AliAnalysisNetParticleHelper::fgkfHistRangeCent[0], AliAnalysisNetParticleHelper::fgkfHistRangeEta[0], 
			  AliAnalysisNetParticleHelper::fgkfHistRangeRap[0],  AliAnalysisNetParticleHelper::fgkfHistRangePhi[0], 
			  AliAnalysisNetParticleHelper::fgkfHistRangePt[0],   AliAnalysisNetParticleHelper::fgkfHistRangeSign[0], 
			  0.5, -0.5, -3.};
  
  Double_t maxHnDCA[9] = {AliAnalysisNetParticleHelper::fgkfHistRangeCent[1], AliAnalysisNetParticleHelper::fgkfHistRangeEta[1], 
			  AliAnalysisNetParticleHelper::fgkfHistRangeRap[1],  AliAnalysisNetParticleHelper::fgkfHistRangePhi[1], 
			  AliAnalysisNetParticleHelper::fgkfHistRangePt[1],   AliAnalysisNetParticleHelper::fgkfHistRangeSign[1], 
			  4.5, 1.5, 3.};


  fHnDCA = new THnSparseD("hnDCA", "cent:etaRec:yRec:phiRec:ptRec:sign:contPart:contSign:DCArAccepted:DCAr", 9, binHnDCA, minHnDCA, maxHnDCA);
  
  fHnDCA->Sumw2();
  fHnDCA->GetAxis(0)->SetTitle("centrality");                   //  0-5|5-10|10-20|20-30|30-40|40-50|50-60|60-70|70-80|80-90 --> 10 bins
  fHnDCA->GetAxis(1)->SetTitle("#eta_{Rec}");                   //  eta  [-0.9, 0.9]
  fHnDCA->GetAxis(2)->SetTitle("#it{y}_{Rec}");                 //  rapidity  [-0.5, 0.5]
  fHnDCA->GetAxis(3)->SetTitle("#varphi_{Rec} (rad)");          //  phi  [ 0. , 2Pi]
  fHnDCA->GetAxis(4)->SetTitle("#it{p}_{T,Rec} (GeV/#it{c})");  //  pT   [ 0.2, 2.6]
  fHnDCA->GetAxis(5)->SetTitle("sign");                         //  -1 | 0 | +1 

  fHnDCA->GetAxis(6)->SetTitle("contPart");                     //  1  primary | 2 missId | 3 from WeakDecay | 4 p from Material
  fHnDCA->GetAxis(7)->SetTitle("DCArAccepted");                 //  0 not accepted | 1 accepted 
  fHnDCA->GetAxis(8)->SetTitle("DCAr");                         //  DCAr [-3, 3]

  fHelper->BinLogAxis(fHnDCA,  4, fESDTrackCuts);
  fHelper->BinLogAxis(fHnDCA,  4, fESDTrackCutsBkg);

  // -- Set binning for DCAr
  Double_t binsDCAr[77] = {-3.,-2.85,-2.7,-2.55,-2.4,-2.25,-2.1,-1.95,-1.8,-1.65,-1.5,-1.35,-1.2,-1.05,-0.9,-0.75,-0.6,-0.45,-0.3,-0.285,-0.27,-0.255,-0.24,-0.225,-0.21,-0.195,-0.18,-0.165,-0.15,-0.135,-0.12,-0.105,-0.09,-0.075,-0.06,-0.045,-0.03,-0.015,0.,0.015,0.03,0.045,0.06,0.075,0.09,0.105,0.12,0.135,0.15,0.165,0.18,0.195,0.21,0.225,0.24,0.255,0.27,0.285,0.3,0.45,0.6,0.75,0.9,1.05,1.2,1.35,1.5,1.65,1.8,1.95,2.1,2.25,2.4,2.55,2.7,2.85,3.};
  fHnDCA->GetAxis(8)->Set(76, binsDCAr);

  // ------------------------------------------------------------------
  
  return;
}

//________________________________________________________________________
Int_t AliAnalysisNetParticleDCA::GetContIdxTrack(Int_t label, Int_t sign) {
  // Check if particle is contamination or correctly identified for ESDs and AODs
  // Check for missidentified primaries and secondaries
  // return  1  primary | 2 missId | 3 from WeakDecay | 4 from Material | -1 unknown

  Int_t contIdx = -1;

  AliVParticle* particle = (fESD) ? fMCEvent->GetTrack(label) : static_cast<AliVParticle*>(fArrayMC->At(label));
  if (!particle)
    return contIdx;

  Bool_t isPhysicalPrimary = (fESD) ? fStack->IsPhysicalPrimary(label): (static_cast<AliAODMCParticle*>(particle))->IsPhysicalPrimary();
  Bool_t isSecondaryFromWeakDecay = (fESD) ? fStack->IsSecondaryFromWeakDecay(label) : (static_cast<AliAODMCParticle*>(particle))->IsSecondaryFromWeakDecay();
  Bool_t isSecondaryFromMaterial  = (fESD) ? fStack->IsSecondaryFromMaterial(label)  : (static_cast<AliAODMCParticle*>(particle))->IsSecondaryFromMaterial();
  
  // -- Check if primary 
  //    > if PID required check -> for the correct (signed pdgcode) particle
  //    > no PID just check for primary 
  if (isPhysicalPrimary) {
    if (fHelper->GetUsePID()) {
      // -- Check if correctly identified 
      if (particle->PdgCode() == (sign*fPdgCode))
	contIdx = 1;   
      // -- MissIdentification
      else 
	contIdx = 2;
    }
    else
      contIdx = 1;   
  }

  // -- Check if secondaries from material or weak decay
  else if(isSecondaryFromWeakDecay)
    contIdx = 3;
  else if (isSecondaryFromMaterial)
    contIdx = 4;
  else
    contIdx = -1;

  return contIdx;
}



 AliAnalysisNetParticleDCA.cxx:1
 AliAnalysisNetParticleDCA.cxx:2
 AliAnalysisNetParticleDCA.cxx:3
 AliAnalysisNetParticleDCA.cxx:4
 AliAnalysisNetParticleDCA.cxx:5
 AliAnalysisNetParticleDCA.cxx:6
 AliAnalysisNetParticleDCA.cxx:7
 AliAnalysisNetParticleDCA.cxx:8
 AliAnalysisNetParticleDCA.cxx:9
 AliAnalysisNetParticleDCA.cxx:10
 AliAnalysisNetParticleDCA.cxx:11
 AliAnalysisNetParticleDCA.cxx:12
 AliAnalysisNetParticleDCA.cxx:13
 AliAnalysisNetParticleDCA.cxx:14
 AliAnalysisNetParticleDCA.cxx:15
 AliAnalysisNetParticleDCA.cxx:16
 AliAnalysisNetParticleDCA.cxx:17
 AliAnalysisNetParticleDCA.cxx:18
 AliAnalysisNetParticleDCA.cxx:19
 AliAnalysisNetParticleDCA.cxx:20
 AliAnalysisNetParticleDCA.cxx:21
 AliAnalysisNetParticleDCA.cxx:22
 AliAnalysisNetParticleDCA.cxx:23
 AliAnalysisNetParticleDCA.cxx:24
 AliAnalysisNetParticleDCA.cxx:25
 AliAnalysisNetParticleDCA.cxx:26
 AliAnalysisNetParticleDCA.cxx:27
 AliAnalysisNetParticleDCA.cxx:28
 AliAnalysisNetParticleDCA.cxx:29
 AliAnalysisNetParticleDCA.cxx:30
 AliAnalysisNetParticleDCA.cxx:31
 AliAnalysisNetParticleDCA.cxx:32
 AliAnalysisNetParticleDCA.cxx:33
 AliAnalysisNetParticleDCA.cxx:34
 AliAnalysisNetParticleDCA.cxx:35
 AliAnalysisNetParticleDCA.cxx:36
 AliAnalysisNetParticleDCA.cxx:37
 AliAnalysisNetParticleDCA.cxx:38
 AliAnalysisNetParticleDCA.cxx:39
 AliAnalysisNetParticleDCA.cxx:40
 AliAnalysisNetParticleDCA.cxx:41
 AliAnalysisNetParticleDCA.cxx:42
 AliAnalysisNetParticleDCA.cxx:43
 AliAnalysisNetParticleDCA.cxx:44
 AliAnalysisNetParticleDCA.cxx:45
 AliAnalysisNetParticleDCA.cxx:46
 AliAnalysisNetParticleDCA.cxx:47
 AliAnalysisNetParticleDCA.cxx:48
 AliAnalysisNetParticleDCA.cxx:49
 AliAnalysisNetParticleDCA.cxx:50
 AliAnalysisNetParticleDCA.cxx:51
 AliAnalysisNetParticleDCA.cxx:52
 AliAnalysisNetParticleDCA.cxx:53
 AliAnalysisNetParticleDCA.cxx:54
 AliAnalysisNetParticleDCA.cxx:55
 AliAnalysisNetParticleDCA.cxx:56
 AliAnalysisNetParticleDCA.cxx:57
 AliAnalysisNetParticleDCA.cxx:58
 AliAnalysisNetParticleDCA.cxx:59
 AliAnalysisNetParticleDCA.cxx:60
 AliAnalysisNetParticleDCA.cxx:61
 AliAnalysisNetParticleDCA.cxx:62
 AliAnalysisNetParticleDCA.cxx:63
 AliAnalysisNetParticleDCA.cxx:64
 AliAnalysisNetParticleDCA.cxx:65
 AliAnalysisNetParticleDCA.cxx:66
 AliAnalysisNetParticleDCA.cxx:67
 AliAnalysisNetParticleDCA.cxx:68
 AliAnalysisNetParticleDCA.cxx:69
 AliAnalysisNetParticleDCA.cxx:70
 AliAnalysisNetParticleDCA.cxx:71
 AliAnalysisNetParticleDCA.cxx:72
 AliAnalysisNetParticleDCA.cxx:73
 AliAnalysisNetParticleDCA.cxx:74
 AliAnalysisNetParticleDCA.cxx:75
 AliAnalysisNetParticleDCA.cxx:76
 AliAnalysisNetParticleDCA.cxx:77
 AliAnalysisNetParticleDCA.cxx:78
 AliAnalysisNetParticleDCA.cxx:79
 AliAnalysisNetParticleDCA.cxx:80
 AliAnalysisNetParticleDCA.cxx:81
 AliAnalysisNetParticleDCA.cxx:82
 AliAnalysisNetParticleDCA.cxx:83
 AliAnalysisNetParticleDCA.cxx:84
 AliAnalysisNetParticleDCA.cxx:85
 AliAnalysisNetParticleDCA.cxx:86
 AliAnalysisNetParticleDCA.cxx:87
 AliAnalysisNetParticleDCA.cxx:88
 AliAnalysisNetParticleDCA.cxx:89
 AliAnalysisNetParticleDCA.cxx:90
 AliAnalysisNetParticleDCA.cxx:91
 AliAnalysisNetParticleDCA.cxx:92
 AliAnalysisNetParticleDCA.cxx:93
 AliAnalysisNetParticleDCA.cxx:94
 AliAnalysisNetParticleDCA.cxx:95
 AliAnalysisNetParticleDCA.cxx:96
 AliAnalysisNetParticleDCA.cxx:97
 AliAnalysisNetParticleDCA.cxx:98
 AliAnalysisNetParticleDCA.cxx:99
 AliAnalysisNetParticleDCA.cxx:100
 AliAnalysisNetParticleDCA.cxx:101
 AliAnalysisNetParticleDCA.cxx:102
 AliAnalysisNetParticleDCA.cxx:103
 AliAnalysisNetParticleDCA.cxx:104
 AliAnalysisNetParticleDCA.cxx:105
 AliAnalysisNetParticleDCA.cxx:106
 AliAnalysisNetParticleDCA.cxx:107
 AliAnalysisNetParticleDCA.cxx:108
 AliAnalysisNetParticleDCA.cxx:109
 AliAnalysisNetParticleDCA.cxx:110
 AliAnalysisNetParticleDCA.cxx:111
 AliAnalysisNetParticleDCA.cxx:112
 AliAnalysisNetParticleDCA.cxx:113
 AliAnalysisNetParticleDCA.cxx:114
 AliAnalysisNetParticleDCA.cxx:115
 AliAnalysisNetParticleDCA.cxx:116
 AliAnalysisNetParticleDCA.cxx:117
 AliAnalysisNetParticleDCA.cxx:118
 AliAnalysisNetParticleDCA.cxx:119
 AliAnalysisNetParticleDCA.cxx:120
 AliAnalysisNetParticleDCA.cxx:121
 AliAnalysisNetParticleDCA.cxx:122
 AliAnalysisNetParticleDCA.cxx:123
 AliAnalysisNetParticleDCA.cxx:124
 AliAnalysisNetParticleDCA.cxx:125
 AliAnalysisNetParticleDCA.cxx:126
 AliAnalysisNetParticleDCA.cxx:127
 AliAnalysisNetParticleDCA.cxx:128
 AliAnalysisNetParticleDCA.cxx:129
 AliAnalysisNetParticleDCA.cxx:130
 AliAnalysisNetParticleDCA.cxx:131
 AliAnalysisNetParticleDCA.cxx:132
 AliAnalysisNetParticleDCA.cxx:133
 AliAnalysisNetParticleDCA.cxx:134
 AliAnalysisNetParticleDCA.cxx:135
 AliAnalysisNetParticleDCA.cxx:136
 AliAnalysisNetParticleDCA.cxx:137
 AliAnalysisNetParticleDCA.cxx:138
 AliAnalysisNetParticleDCA.cxx:139
 AliAnalysisNetParticleDCA.cxx:140
 AliAnalysisNetParticleDCA.cxx:141
 AliAnalysisNetParticleDCA.cxx:142
 AliAnalysisNetParticleDCA.cxx:143
 AliAnalysisNetParticleDCA.cxx:144
 AliAnalysisNetParticleDCA.cxx:145
 AliAnalysisNetParticleDCA.cxx:146
 AliAnalysisNetParticleDCA.cxx:147
 AliAnalysisNetParticleDCA.cxx:148
 AliAnalysisNetParticleDCA.cxx:149
 AliAnalysisNetParticleDCA.cxx:150
 AliAnalysisNetParticleDCA.cxx:151
 AliAnalysisNetParticleDCA.cxx:152
 AliAnalysisNetParticleDCA.cxx:153
 AliAnalysisNetParticleDCA.cxx:154
 AliAnalysisNetParticleDCA.cxx:155
 AliAnalysisNetParticleDCA.cxx:156
 AliAnalysisNetParticleDCA.cxx:157
 AliAnalysisNetParticleDCA.cxx:158
 AliAnalysisNetParticleDCA.cxx:159
 AliAnalysisNetParticleDCA.cxx:160
 AliAnalysisNetParticleDCA.cxx:161
 AliAnalysisNetParticleDCA.cxx:162
 AliAnalysisNetParticleDCA.cxx:163
 AliAnalysisNetParticleDCA.cxx:164
 AliAnalysisNetParticleDCA.cxx:165
 AliAnalysisNetParticleDCA.cxx:166
 AliAnalysisNetParticleDCA.cxx:167
 AliAnalysisNetParticleDCA.cxx:168
 AliAnalysisNetParticleDCA.cxx:169
 AliAnalysisNetParticleDCA.cxx:170
 AliAnalysisNetParticleDCA.cxx:171
 AliAnalysisNetParticleDCA.cxx:172
 AliAnalysisNetParticleDCA.cxx:173
 AliAnalysisNetParticleDCA.cxx:174
 AliAnalysisNetParticleDCA.cxx:175
 AliAnalysisNetParticleDCA.cxx:176
 AliAnalysisNetParticleDCA.cxx:177
 AliAnalysisNetParticleDCA.cxx:178
 AliAnalysisNetParticleDCA.cxx:179
 AliAnalysisNetParticleDCA.cxx:180
 AliAnalysisNetParticleDCA.cxx:181
 AliAnalysisNetParticleDCA.cxx:182
 AliAnalysisNetParticleDCA.cxx:183
 AliAnalysisNetParticleDCA.cxx:184
 AliAnalysisNetParticleDCA.cxx:185
 AliAnalysisNetParticleDCA.cxx:186
 AliAnalysisNetParticleDCA.cxx:187
 AliAnalysisNetParticleDCA.cxx:188
 AliAnalysisNetParticleDCA.cxx:189
 AliAnalysisNetParticleDCA.cxx:190
 AliAnalysisNetParticleDCA.cxx:191
 AliAnalysisNetParticleDCA.cxx:192
 AliAnalysisNetParticleDCA.cxx:193
 AliAnalysisNetParticleDCA.cxx:194
 AliAnalysisNetParticleDCA.cxx:195
 AliAnalysisNetParticleDCA.cxx:196
 AliAnalysisNetParticleDCA.cxx:197
 AliAnalysisNetParticleDCA.cxx:198
 AliAnalysisNetParticleDCA.cxx:199
 AliAnalysisNetParticleDCA.cxx:200
 AliAnalysisNetParticleDCA.cxx:201
 AliAnalysisNetParticleDCA.cxx:202
 AliAnalysisNetParticleDCA.cxx:203
 AliAnalysisNetParticleDCA.cxx:204
 AliAnalysisNetParticleDCA.cxx:205
 AliAnalysisNetParticleDCA.cxx:206
 AliAnalysisNetParticleDCA.cxx:207
 AliAnalysisNetParticleDCA.cxx:208
 AliAnalysisNetParticleDCA.cxx:209
 AliAnalysisNetParticleDCA.cxx:210
 AliAnalysisNetParticleDCA.cxx:211
 AliAnalysisNetParticleDCA.cxx:212
 AliAnalysisNetParticleDCA.cxx:213
 AliAnalysisNetParticleDCA.cxx:214
 AliAnalysisNetParticleDCA.cxx:215
 AliAnalysisNetParticleDCA.cxx:216
 AliAnalysisNetParticleDCA.cxx:217
 AliAnalysisNetParticleDCA.cxx:218
 AliAnalysisNetParticleDCA.cxx:219
 AliAnalysisNetParticleDCA.cxx:220
 AliAnalysisNetParticleDCA.cxx:221
 AliAnalysisNetParticleDCA.cxx:222
 AliAnalysisNetParticleDCA.cxx:223
 AliAnalysisNetParticleDCA.cxx:224
 AliAnalysisNetParticleDCA.cxx:225
 AliAnalysisNetParticleDCA.cxx:226
 AliAnalysisNetParticleDCA.cxx:227
 AliAnalysisNetParticleDCA.cxx:228
 AliAnalysisNetParticleDCA.cxx:229
 AliAnalysisNetParticleDCA.cxx:230
 AliAnalysisNetParticleDCA.cxx:231
 AliAnalysisNetParticleDCA.cxx:232
 AliAnalysisNetParticleDCA.cxx:233
 AliAnalysisNetParticleDCA.cxx:234