ROOT logo
//-------------------------------------------------------------------------
//     Task for the Analysis Framework 
// Updates the an already created AOD with the PWG2 information taken from 
// the ESD.
//  - Puts the per-track information into the AliPWG2AODTrack container, 
//    together with the link to the original AliAODTrack
//
//     Author: Adam Kisiel, OSU, Adam.Kisiel@cern.ch
//-------------------------------------------------------------------------
#include <TChain.h>
#include <TFile.h>
#include <TList.h> 

#include "AliAnalysisTaskPWG2AODUpdate.h"
#include "AliAnalysisManager.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliESDtrack.h"
#include "AliESDVertex.h"
#include "AliLog.h"
#include "AliPWG2AODTrack.h"

ClassImp(AliAnalysisTaskPWG2AODUpdate)

////////////////////////////////////////////////////////////////////////

AliAnalysisTaskPWG2AODUpdate::AliAnalysisTaskPWG2AODUpdate():
  fESD(0x0),
  fAOD(0x0),
  fPWG2AODTracks(0x0)
{
  // Default constructor
}

AliAnalysisTaskPWG2AODUpdate::AliAnalysisTaskPWG2AODUpdate(const char* name):
  AliAnalysisTaskSE(name),
  fESD(0x0),
  fAOD(0x0),
  fPWG2AODTracks(0x0)
{
  // Default constructor
  DefineInput (0, TChain::Class());
  DefineOutput(0, TTree::Class());
}

AliAnalysisTaskPWG2AODUpdate::AliAnalysisTaskPWG2AODUpdate(const AliAnalysisTaskPWG2AODUpdate &task):
  AliAnalysisTaskSE(),
  fESD(0x0),
  fAOD(0x0),
  fPWG2AODTracks(0x0)
{
  // Copy
  fESD = task.fESD;
  fAOD =  task.fAOD;
  fPWG2AODTracks = task.fPWG2AODTracks;
}

AliAnalysisTaskPWG2AODUpdate& AliAnalysisTaskPWG2AODUpdate::operator=(const AliAnalysisTaskPWG2AODUpdate &task)
{
  // Assignment
  if (&task == this) return *this;
  TTask::operator=(task);

  fESD = task.fESD;
  fAOD =  task.fAOD;
  fPWG2AODTracks = task.fPWG2AODTracks;

  return *this;
}

void AliAnalysisTaskPWG2AODUpdate::UserCreateOutputObjects()
{
  // Get links to input and output containters  
  fAOD   = AODEvent();
  
  fPWG2AODTracks = new TClonesArray("AliPWG2AODTrack", 0);
  const char *name = "pwg2aodtracks";
  fPWG2AODTracks->SetName(name);
  
  AddAODBranch("TClonesArray", &fPWG2AODTracks);
}

void AliAnalysisTaskPWG2AODUpdate::UserExec(Option_t */*option*/)
{
  // Execute analysis for current event
  //
  fESD = dynamic_cast<AliESDEvent *> (InputEvent());
  if (!fESD) { printf ("No input ESD !!! Not adding PWG2 information\n"); }
  fAOD = AODEvent();
  if (!fAOD) { printf ("No output AOD !!! Not adding PWG2 information\n"); }
 
  if ((!fESD) || (!fAOD)) return;

  Double_t pos[3];
  Double_t p[3];
  Double_t tpcentrancepoint[3];
  Double_t tpcexitpoint[3];
  TBits    sharemap;
  TBits    clustermap;
  Int_t    pTracks = 0;
  
  for (Int_t i = 0; i < 3; i++)  { tpcentrancepoint[i] = 0.; tpcexitpoint[i] = 0; }

  // Get primary vertex
  const AliESDVertex *vtx = fESD->GetPrimaryVertex();
  
  vtx->GetXYZ(pos); // position
    
  // Tracks (primary and orphan)
  Int_t nTracks = fAOD->GetNumberOfTracks();

  printf("NUMBER OF AOD TRACKS %5d\n", nTracks);
  
  // Must start from scratch for each event
  fPWG2AODTracks->Delete();
  fPWG2AODTracks->Expand(nTracks);
  TClonesArray &tPWG2AODTracks = *fPWG2AODTracks;
    
  // Loop over AOD tracks
  for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
    AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(nTrack));
    if(!aodTrack) AliFatal("Not a standard AOD");
    Short_t trackId = aodTrack->GetID();

    // Get the corresponding ESD track
    AliESDtrack *esdTrack = fESD->GetTrack(trackId);

    esdTrack->GetPxPyPz(p);

    if (TMath::Abs(p[0] - aodTrack->Px())>0.000000001) {
      printf("Got different momenta !!! %f %f\n", p[0], aodTrack->Px());
    }

    sharemap = esdTrack->GetTPCSharedMap();
    clustermap = esdTrack->GetTPCClusterMap();
	
    esdTrack->GetInnerXYZ(tpcentrancepoint);
    tpcentrancepoint[2] -= pos[2];
	
    esdTrack->GetOuterXYZ(tpcexitpoint);
    tpcexitpoint[2] -= pos[2];

    // Add the PWG2 info into the AOD
    new (tPWG2AODTracks[pTracks++]) AliPWG2AODTrack(tpcentrancepoint,
						    tpcexitpoint,
						    sharemap,
						    clustermap,
						    aodTrack);
  }
  
  printf("PWG2=%d\n", fPWG2AODTracks->GetEntries());

  return;
}

 AliAnalysisTaskPWG2AODUpdate.cxx:1
 AliAnalysisTaskPWG2AODUpdate.cxx:2
 AliAnalysisTaskPWG2AODUpdate.cxx:3
 AliAnalysisTaskPWG2AODUpdate.cxx:4
 AliAnalysisTaskPWG2AODUpdate.cxx:5
 AliAnalysisTaskPWG2AODUpdate.cxx:6
 AliAnalysisTaskPWG2AODUpdate.cxx:7
 AliAnalysisTaskPWG2AODUpdate.cxx:8
 AliAnalysisTaskPWG2AODUpdate.cxx:9
 AliAnalysisTaskPWG2AODUpdate.cxx:10
 AliAnalysisTaskPWG2AODUpdate.cxx:11
 AliAnalysisTaskPWG2AODUpdate.cxx:12
 AliAnalysisTaskPWG2AODUpdate.cxx:13
 AliAnalysisTaskPWG2AODUpdate.cxx:14
 AliAnalysisTaskPWG2AODUpdate.cxx:15
 AliAnalysisTaskPWG2AODUpdate.cxx:16
 AliAnalysisTaskPWG2AODUpdate.cxx:17
 AliAnalysisTaskPWG2AODUpdate.cxx:18
 AliAnalysisTaskPWG2AODUpdate.cxx:19
 AliAnalysisTaskPWG2AODUpdate.cxx:20
 AliAnalysisTaskPWG2AODUpdate.cxx:21
 AliAnalysisTaskPWG2AODUpdate.cxx:22
 AliAnalysisTaskPWG2AODUpdate.cxx:23
 AliAnalysisTaskPWG2AODUpdate.cxx:24
 AliAnalysisTaskPWG2AODUpdate.cxx:25
 AliAnalysisTaskPWG2AODUpdate.cxx:26
 AliAnalysisTaskPWG2AODUpdate.cxx:27
 AliAnalysisTaskPWG2AODUpdate.cxx:28
 AliAnalysisTaskPWG2AODUpdate.cxx:29
 AliAnalysisTaskPWG2AODUpdate.cxx:30
 AliAnalysisTaskPWG2AODUpdate.cxx:31
 AliAnalysisTaskPWG2AODUpdate.cxx:32
 AliAnalysisTaskPWG2AODUpdate.cxx:33
 AliAnalysisTaskPWG2AODUpdate.cxx:34
 AliAnalysisTaskPWG2AODUpdate.cxx:35
 AliAnalysisTaskPWG2AODUpdate.cxx:36
 AliAnalysisTaskPWG2AODUpdate.cxx:37
 AliAnalysisTaskPWG2AODUpdate.cxx:38
 AliAnalysisTaskPWG2AODUpdate.cxx:39
 AliAnalysisTaskPWG2AODUpdate.cxx:40
 AliAnalysisTaskPWG2AODUpdate.cxx:41
 AliAnalysisTaskPWG2AODUpdate.cxx:42
 AliAnalysisTaskPWG2AODUpdate.cxx:43
 AliAnalysisTaskPWG2AODUpdate.cxx:44
 AliAnalysisTaskPWG2AODUpdate.cxx:45
 AliAnalysisTaskPWG2AODUpdate.cxx:46
 AliAnalysisTaskPWG2AODUpdate.cxx:47
 AliAnalysisTaskPWG2AODUpdate.cxx:48
 AliAnalysisTaskPWG2AODUpdate.cxx:49
 AliAnalysisTaskPWG2AODUpdate.cxx:50
 AliAnalysisTaskPWG2AODUpdate.cxx:51
 AliAnalysisTaskPWG2AODUpdate.cxx:52
 AliAnalysisTaskPWG2AODUpdate.cxx:53
 AliAnalysisTaskPWG2AODUpdate.cxx:54
 AliAnalysisTaskPWG2AODUpdate.cxx:55
 AliAnalysisTaskPWG2AODUpdate.cxx:56
 AliAnalysisTaskPWG2AODUpdate.cxx:57
 AliAnalysisTaskPWG2AODUpdate.cxx:58
 AliAnalysisTaskPWG2AODUpdate.cxx:59
 AliAnalysisTaskPWG2AODUpdate.cxx:60
 AliAnalysisTaskPWG2AODUpdate.cxx:61
 AliAnalysisTaskPWG2AODUpdate.cxx:62
 AliAnalysisTaskPWG2AODUpdate.cxx:63
 AliAnalysisTaskPWG2AODUpdate.cxx:64
 AliAnalysisTaskPWG2AODUpdate.cxx:65
 AliAnalysisTaskPWG2AODUpdate.cxx:66
 AliAnalysisTaskPWG2AODUpdate.cxx:67
 AliAnalysisTaskPWG2AODUpdate.cxx:68
 AliAnalysisTaskPWG2AODUpdate.cxx:69
 AliAnalysisTaskPWG2AODUpdate.cxx:70
 AliAnalysisTaskPWG2AODUpdate.cxx:71
 AliAnalysisTaskPWG2AODUpdate.cxx:72
 AliAnalysisTaskPWG2AODUpdate.cxx:73
 AliAnalysisTaskPWG2AODUpdate.cxx:74
 AliAnalysisTaskPWG2AODUpdate.cxx:75
 AliAnalysisTaskPWG2AODUpdate.cxx:76
 AliAnalysisTaskPWG2AODUpdate.cxx:77
 AliAnalysisTaskPWG2AODUpdate.cxx:78
 AliAnalysisTaskPWG2AODUpdate.cxx:79
 AliAnalysisTaskPWG2AODUpdate.cxx:80
 AliAnalysisTaskPWG2AODUpdate.cxx:81
 AliAnalysisTaskPWG2AODUpdate.cxx:82
 AliAnalysisTaskPWG2AODUpdate.cxx:83
 AliAnalysisTaskPWG2AODUpdate.cxx:84
 AliAnalysisTaskPWG2AODUpdate.cxx:85
 AliAnalysisTaskPWG2AODUpdate.cxx:86
 AliAnalysisTaskPWG2AODUpdate.cxx:87
 AliAnalysisTaskPWG2AODUpdate.cxx:88
 AliAnalysisTaskPWG2AODUpdate.cxx:89
 AliAnalysisTaskPWG2AODUpdate.cxx:90
 AliAnalysisTaskPWG2AODUpdate.cxx:91
 AliAnalysisTaskPWG2AODUpdate.cxx:92
 AliAnalysisTaskPWG2AODUpdate.cxx:93
 AliAnalysisTaskPWG2AODUpdate.cxx:94
 AliAnalysisTaskPWG2AODUpdate.cxx:95
 AliAnalysisTaskPWG2AODUpdate.cxx:96
 AliAnalysisTaskPWG2AODUpdate.cxx:97
 AliAnalysisTaskPWG2AODUpdate.cxx:98
 AliAnalysisTaskPWG2AODUpdate.cxx:99
 AliAnalysisTaskPWG2AODUpdate.cxx:100
 AliAnalysisTaskPWG2AODUpdate.cxx:101
 AliAnalysisTaskPWG2AODUpdate.cxx:102
 AliAnalysisTaskPWG2AODUpdate.cxx:103
 AliAnalysisTaskPWG2AODUpdate.cxx:104
 AliAnalysisTaskPWG2AODUpdate.cxx:105
 AliAnalysisTaskPWG2AODUpdate.cxx:106
 AliAnalysisTaskPWG2AODUpdate.cxx:107
 AliAnalysisTaskPWG2AODUpdate.cxx:108
 AliAnalysisTaskPWG2AODUpdate.cxx:109
 AliAnalysisTaskPWG2AODUpdate.cxx:110
 AliAnalysisTaskPWG2AODUpdate.cxx:111
 AliAnalysisTaskPWG2AODUpdate.cxx:112
 AliAnalysisTaskPWG2AODUpdate.cxx:113
 AliAnalysisTaskPWG2AODUpdate.cxx:114
 AliAnalysisTaskPWG2AODUpdate.cxx:115
 AliAnalysisTaskPWG2AODUpdate.cxx:116
 AliAnalysisTaskPWG2AODUpdate.cxx:117
 AliAnalysisTaskPWG2AODUpdate.cxx:118
 AliAnalysisTaskPWG2AODUpdate.cxx:119
 AliAnalysisTaskPWG2AODUpdate.cxx:120
 AliAnalysisTaskPWG2AODUpdate.cxx:121
 AliAnalysisTaskPWG2AODUpdate.cxx:122
 AliAnalysisTaskPWG2AODUpdate.cxx:123
 AliAnalysisTaskPWG2AODUpdate.cxx:124
 AliAnalysisTaskPWG2AODUpdate.cxx:125
 AliAnalysisTaskPWG2AODUpdate.cxx:126
 AliAnalysisTaskPWG2AODUpdate.cxx:127
 AliAnalysisTaskPWG2AODUpdate.cxx:128
 AliAnalysisTaskPWG2AODUpdate.cxx:129
 AliAnalysisTaskPWG2AODUpdate.cxx:130
 AliAnalysisTaskPWG2AODUpdate.cxx:131
 AliAnalysisTaskPWG2AODUpdate.cxx:132
 AliAnalysisTaskPWG2AODUpdate.cxx:133
 AliAnalysisTaskPWG2AODUpdate.cxx:134
 AliAnalysisTaskPWG2AODUpdate.cxx:135
 AliAnalysisTaskPWG2AODUpdate.cxx:136
 AliAnalysisTaskPWG2AODUpdate.cxx:137
 AliAnalysisTaskPWG2AODUpdate.cxx:138
 AliAnalysisTaskPWG2AODUpdate.cxx:139
 AliAnalysisTaskPWG2AODUpdate.cxx:140
 AliAnalysisTaskPWG2AODUpdate.cxx:141
 AliAnalysisTaskPWG2AODUpdate.cxx:142
 AliAnalysisTaskPWG2AODUpdate.cxx:143
 AliAnalysisTaskPWG2AODUpdate.cxx:144
 AliAnalysisTaskPWG2AODUpdate.cxx:145
 AliAnalysisTaskPWG2AODUpdate.cxx:146
 AliAnalysisTaskPWG2AODUpdate.cxx:147
 AliAnalysisTaskPWG2AODUpdate.cxx:148
 AliAnalysisTaskPWG2AODUpdate.cxx:149
 AliAnalysisTaskPWG2AODUpdate.cxx:150
 AliAnalysisTaskPWG2AODUpdate.cxx:151
 AliAnalysisTaskPWG2AODUpdate.cxx:152
 AliAnalysisTaskPWG2AODUpdate.cxx:153
 AliAnalysisTaskPWG2AODUpdate.cxx:154
 AliAnalysisTaskPWG2AODUpdate.cxx:155