ROOT logo
// $Id$
//
// Class to make PicoTracks in AOD/ESD events.
//
// Author: S.Aiola, C.Loizides

#include <TClonesArray.h>
#include <TRandom3.h>
#include "AliAODEvent.h"
#include "AliAODTrack.h"
#include "AliAnalysisManager.h"
#include "AliESDtrack.h"
#include "AliESDtrackCuts.h"
#include "AliEmcalPicoTrackMaker.h"
#include "AliLog.h"
#include "AliPicoTrack.h"
#include "AliVTrack.h"
#include "AliAODMCParticle.h"
#include "AliNamedArrayI.h"

ClassImp(AliEmcalPicoTrackMaker)

//________________________________________________________________________
AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() : 
  AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
  fTracksOutName("PicoTracks"),
  fTracksInName("tracks"),
  fMCParticlesName("mcparticles"),
  fMinTrackPt(0),
  fMaxTrackPt(1000),
  fMinTrackEta(-10),
  fMaxTrackEta(10),
  fMinTrackPhi(-10),
  fMaxTrackPhi(10),
  fTrackEfficiency(1),
  fCopyMCFlag(kFALSE),
  fTracksIn(0),
  fTracksOut(0),
  fMCParticles(0),
  fMCParticlesMap(0),
  fInit(kFALSE)
{
  // Constructor.

  fAODfilterBits[0] = -1;
  fAODfilterBits[1] = -1;
}

//________________________________________________________________________
AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) : 
  AliAnalysisTaskSE(name),
  fTracksOutName("PicoTracks"),
  fTracksInName("tracks"),
  fMCParticlesName("mcparticles"),
  fMinTrackPt(0),
  fMaxTrackPt(1000),
  fMinTrackEta(-10),
  fMaxTrackEta(10),
  fMinTrackPhi(-10),
  fMaxTrackPhi(10),
  fTrackEfficiency(1),
  fCopyMCFlag(kFALSE),
  fTracksIn(0),
  fTracksOut(0),
  fMCParticles(0),
  fMCParticlesMap(0),
  fInit(kFALSE)
{
  // Constructor.

  fAODfilterBits[0] = -1;
  fAODfilterBits[1] = -1;
  fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
}

//________________________________________________________________________
AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
{
  // Destructor.
}

//________________________________________________________________________
void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
{
  // Create my user objects.
}

//________________________________________________________________________
void AliEmcalPicoTrackMaker::UserExec(Option_t *) 
{
  // Main loop, called for each event.

  if (!fInit) {
    fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
    if (!fTracksIn) {
      AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
      return;
    }
    if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
      AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
      return;
    }
    
    fTracksOut = new TClonesArray("AliPicoTrack");
    fTracksOut->SetName(fTracksOutName);    

    // add tracks to event if not yet there
    if (InputEvent()->FindListObject(fTracksOutName)) {
      AliFatal(Form("Object %s already present in the event!",fTracksOutName.Data()));
    }
    else {
      InputEvent()->AddObject(fTracksOut);
    }

    if (fCopyMCFlag) {
      fMCParticles = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCParticlesName));
      if (!fMCParticles) {
	AliError(Form("Could not retrieve MC particles %s!", fMCParticlesName.Data())); 
      }
      if (!fMCParticles->GetClass()->GetBaseClass("AliVParticle")) {
	AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fMCParticlesName.Data()));
	fMCParticles = 0;
      }
      
      TString mapName(fMCParticlesName);
      mapName += "_Map";
      fMCParticlesMap = dynamic_cast<AliNamedArrayI*>(InputEvent()->FindListObject(mapName));
    }

    fInit = kTRUE;
  }

  fTracksOut->Delete();

  // loop over tracks
  const Int_t Ntracks = fTracksIn->GetEntriesFast();
  for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {

    AliVTrack *track = static_cast<AliVTrack*>(fTracksIn->At(iTracks));

    if (!track)
      continue;

    if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
      continue;

    if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta || 
	track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
      continue;

    if (fTrackEfficiency < 1) {
      Double_t r = gRandom->Rndm();
      if (fTrackEfficiency < r) 
	continue;
    }

    Bool_t isEmc = kFALSE;
    if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 && 
	track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
	track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
      isEmc = kTRUE;

    AliPicoTrack *picotrack = new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(), 
								     track->Eta(), 
								     track->Phi(), 
								     track->Charge(), 
								     track->GetLabel(),
								     AliPicoTrack::GetTrackType(track),
								     track->GetTrackEtaOnEMCal(), 
								     track->GetTrackPhiOnEMCal(), 
								     track->GetTrackPtOnEMCal(), 
								     isEmc);
    picotrack->SetTrack(track);
    
    if (fCopyMCFlag && track->GetLabel() != 0) {
      AliVParticle *mcpart = GetMCParticle(TMath::Abs(track->GetLabel()));
      if (mcpart) {
	UInt_t mcFlag = mcpart->GetFlag();	
	picotrack->SetFlag(mcFlag);
	Short_t genIndex = mcpart->GetGeneratorIndex();
	picotrack->SetGeneratorIndex(genIndex);
      }
    }

    ++nacc;
  }
}

//________________________________________________________________________
AliVParticle* AliEmcalPicoTrackMaker::GetMCParticle(Int_t label) 
{
  if (!fMCParticles) return 0;
  Int_t index = label;
  if (fMCParticlesMap) index = fMCParticlesMap->At(label);
  if (index < 0 || index >= fMCParticles->GetEntriesFast()) return 0;
  AliVParticle *part = static_cast<AliVParticle*>(fMCParticles->At(index));
  return part;
}
 AliEmcalPicoTrackMaker.cxx:1
 AliEmcalPicoTrackMaker.cxx:2
 AliEmcalPicoTrackMaker.cxx:3
 AliEmcalPicoTrackMaker.cxx:4
 AliEmcalPicoTrackMaker.cxx:5
 AliEmcalPicoTrackMaker.cxx:6
 AliEmcalPicoTrackMaker.cxx:7
 AliEmcalPicoTrackMaker.cxx:8
 AliEmcalPicoTrackMaker.cxx:9
 AliEmcalPicoTrackMaker.cxx:10
 AliEmcalPicoTrackMaker.cxx:11
 AliEmcalPicoTrackMaker.cxx:12
 AliEmcalPicoTrackMaker.cxx:13
 AliEmcalPicoTrackMaker.cxx:14
 AliEmcalPicoTrackMaker.cxx:15
 AliEmcalPicoTrackMaker.cxx:16
 AliEmcalPicoTrackMaker.cxx:17
 AliEmcalPicoTrackMaker.cxx:18
 AliEmcalPicoTrackMaker.cxx:19
 AliEmcalPicoTrackMaker.cxx:20
 AliEmcalPicoTrackMaker.cxx:21
 AliEmcalPicoTrackMaker.cxx:22
 AliEmcalPicoTrackMaker.cxx:23
 AliEmcalPicoTrackMaker.cxx:24
 AliEmcalPicoTrackMaker.cxx:25
 AliEmcalPicoTrackMaker.cxx:26
 AliEmcalPicoTrackMaker.cxx:27
 AliEmcalPicoTrackMaker.cxx:28
 AliEmcalPicoTrackMaker.cxx:29
 AliEmcalPicoTrackMaker.cxx:30
 AliEmcalPicoTrackMaker.cxx:31
 AliEmcalPicoTrackMaker.cxx:32
 AliEmcalPicoTrackMaker.cxx:33
 AliEmcalPicoTrackMaker.cxx:34
 AliEmcalPicoTrackMaker.cxx:35
 AliEmcalPicoTrackMaker.cxx:36
 AliEmcalPicoTrackMaker.cxx:37
 AliEmcalPicoTrackMaker.cxx:38
 AliEmcalPicoTrackMaker.cxx:39
 AliEmcalPicoTrackMaker.cxx:40
 AliEmcalPicoTrackMaker.cxx:41
 AliEmcalPicoTrackMaker.cxx:42
 AliEmcalPicoTrackMaker.cxx:43
 AliEmcalPicoTrackMaker.cxx:44
 AliEmcalPicoTrackMaker.cxx:45
 AliEmcalPicoTrackMaker.cxx:46
 AliEmcalPicoTrackMaker.cxx:47
 AliEmcalPicoTrackMaker.cxx:48
 AliEmcalPicoTrackMaker.cxx:49
 AliEmcalPicoTrackMaker.cxx:50
 AliEmcalPicoTrackMaker.cxx:51
 AliEmcalPicoTrackMaker.cxx:52
 AliEmcalPicoTrackMaker.cxx:53
 AliEmcalPicoTrackMaker.cxx:54
 AliEmcalPicoTrackMaker.cxx:55
 AliEmcalPicoTrackMaker.cxx:56
 AliEmcalPicoTrackMaker.cxx:57
 AliEmcalPicoTrackMaker.cxx:58
 AliEmcalPicoTrackMaker.cxx:59
 AliEmcalPicoTrackMaker.cxx:60
 AliEmcalPicoTrackMaker.cxx:61
 AliEmcalPicoTrackMaker.cxx:62
 AliEmcalPicoTrackMaker.cxx:63
 AliEmcalPicoTrackMaker.cxx:64
 AliEmcalPicoTrackMaker.cxx:65
 AliEmcalPicoTrackMaker.cxx:66
 AliEmcalPicoTrackMaker.cxx:67
 AliEmcalPicoTrackMaker.cxx:68
 AliEmcalPicoTrackMaker.cxx:69
 AliEmcalPicoTrackMaker.cxx:70
 AliEmcalPicoTrackMaker.cxx:71
 AliEmcalPicoTrackMaker.cxx:72
 AliEmcalPicoTrackMaker.cxx:73
 AliEmcalPicoTrackMaker.cxx:74
 AliEmcalPicoTrackMaker.cxx:75
 AliEmcalPicoTrackMaker.cxx:76
 AliEmcalPicoTrackMaker.cxx:77
 AliEmcalPicoTrackMaker.cxx:78
 AliEmcalPicoTrackMaker.cxx:79
 AliEmcalPicoTrackMaker.cxx:80
 AliEmcalPicoTrackMaker.cxx:81
 AliEmcalPicoTrackMaker.cxx:82
 AliEmcalPicoTrackMaker.cxx:83
 AliEmcalPicoTrackMaker.cxx:84
 AliEmcalPicoTrackMaker.cxx:85
 AliEmcalPicoTrackMaker.cxx:86
 AliEmcalPicoTrackMaker.cxx:87
 AliEmcalPicoTrackMaker.cxx:88
 AliEmcalPicoTrackMaker.cxx:89
 AliEmcalPicoTrackMaker.cxx:90
 AliEmcalPicoTrackMaker.cxx:91
 AliEmcalPicoTrackMaker.cxx:92
 AliEmcalPicoTrackMaker.cxx:93
 AliEmcalPicoTrackMaker.cxx:94
 AliEmcalPicoTrackMaker.cxx:95
 AliEmcalPicoTrackMaker.cxx:96
 AliEmcalPicoTrackMaker.cxx:97
 AliEmcalPicoTrackMaker.cxx:98
 AliEmcalPicoTrackMaker.cxx:99
 AliEmcalPicoTrackMaker.cxx:100
 AliEmcalPicoTrackMaker.cxx:101
 AliEmcalPicoTrackMaker.cxx:102
 AliEmcalPicoTrackMaker.cxx:103
 AliEmcalPicoTrackMaker.cxx:104
 AliEmcalPicoTrackMaker.cxx:105
 AliEmcalPicoTrackMaker.cxx:106
 AliEmcalPicoTrackMaker.cxx:107
 AliEmcalPicoTrackMaker.cxx:108
 AliEmcalPicoTrackMaker.cxx:109
 AliEmcalPicoTrackMaker.cxx:110
 AliEmcalPicoTrackMaker.cxx:111
 AliEmcalPicoTrackMaker.cxx:112
 AliEmcalPicoTrackMaker.cxx:113
 AliEmcalPicoTrackMaker.cxx:114
 AliEmcalPicoTrackMaker.cxx:115
 AliEmcalPicoTrackMaker.cxx:116
 AliEmcalPicoTrackMaker.cxx:117
 AliEmcalPicoTrackMaker.cxx:118
 AliEmcalPicoTrackMaker.cxx:119
 AliEmcalPicoTrackMaker.cxx:120
 AliEmcalPicoTrackMaker.cxx:121
 AliEmcalPicoTrackMaker.cxx:122
 AliEmcalPicoTrackMaker.cxx:123
 AliEmcalPicoTrackMaker.cxx:124
 AliEmcalPicoTrackMaker.cxx:125
 AliEmcalPicoTrackMaker.cxx:126
 AliEmcalPicoTrackMaker.cxx:127
 AliEmcalPicoTrackMaker.cxx:128
 AliEmcalPicoTrackMaker.cxx:129
 AliEmcalPicoTrackMaker.cxx:130
 AliEmcalPicoTrackMaker.cxx:131
 AliEmcalPicoTrackMaker.cxx:132
 AliEmcalPicoTrackMaker.cxx:133
 AliEmcalPicoTrackMaker.cxx:134
 AliEmcalPicoTrackMaker.cxx:135
 AliEmcalPicoTrackMaker.cxx:136
 AliEmcalPicoTrackMaker.cxx:137
 AliEmcalPicoTrackMaker.cxx:138
 AliEmcalPicoTrackMaker.cxx:139
 AliEmcalPicoTrackMaker.cxx:140
 AliEmcalPicoTrackMaker.cxx:141
 AliEmcalPicoTrackMaker.cxx:142
 AliEmcalPicoTrackMaker.cxx:143
 AliEmcalPicoTrackMaker.cxx:144
 AliEmcalPicoTrackMaker.cxx:145
 AliEmcalPicoTrackMaker.cxx:146
 AliEmcalPicoTrackMaker.cxx:147
 AliEmcalPicoTrackMaker.cxx:148
 AliEmcalPicoTrackMaker.cxx:149
 AliEmcalPicoTrackMaker.cxx:150
 AliEmcalPicoTrackMaker.cxx:151
 AliEmcalPicoTrackMaker.cxx:152
 AliEmcalPicoTrackMaker.cxx:153
 AliEmcalPicoTrackMaker.cxx:154
 AliEmcalPicoTrackMaker.cxx:155
 AliEmcalPicoTrackMaker.cxx:156
 AliEmcalPicoTrackMaker.cxx:157
 AliEmcalPicoTrackMaker.cxx:158
 AliEmcalPicoTrackMaker.cxx:159
 AliEmcalPicoTrackMaker.cxx:160
 AliEmcalPicoTrackMaker.cxx:161
 AliEmcalPicoTrackMaker.cxx:162
 AliEmcalPicoTrackMaker.cxx:163
 AliEmcalPicoTrackMaker.cxx:164
 AliEmcalPicoTrackMaker.cxx:165
 AliEmcalPicoTrackMaker.cxx:166
 AliEmcalPicoTrackMaker.cxx:167
 AliEmcalPicoTrackMaker.cxx:168
 AliEmcalPicoTrackMaker.cxx:169
 AliEmcalPicoTrackMaker.cxx:170
 AliEmcalPicoTrackMaker.cxx:171
 AliEmcalPicoTrackMaker.cxx:172
 AliEmcalPicoTrackMaker.cxx:173
 AliEmcalPicoTrackMaker.cxx:174
 AliEmcalPicoTrackMaker.cxx:175
 AliEmcalPicoTrackMaker.cxx:176
 AliEmcalPicoTrackMaker.cxx:177
 AliEmcalPicoTrackMaker.cxx:178
 AliEmcalPicoTrackMaker.cxx:179
 AliEmcalPicoTrackMaker.cxx:180
 AliEmcalPicoTrackMaker.cxx:181
 AliEmcalPicoTrackMaker.cxx:182
 AliEmcalPicoTrackMaker.cxx:183
 AliEmcalPicoTrackMaker.cxx:184
 AliEmcalPicoTrackMaker.cxx:185
 AliEmcalPicoTrackMaker.cxx:186
 AliEmcalPicoTrackMaker.cxx:187
 AliEmcalPicoTrackMaker.cxx:188
 AliEmcalPicoTrackMaker.cxx:189
 AliEmcalPicoTrackMaker.cxx:190
 AliEmcalPicoTrackMaker.cxx:191
 AliEmcalPicoTrackMaker.cxx:192
 AliEmcalPicoTrackMaker.cxx:193
 AliEmcalPicoTrackMaker.cxx:194
 AliEmcalPicoTrackMaker.cxx:195
 AliEmcalPicoTrackMaker.cxx:196
 AliEmcalPicoTrackMaker.cxx:197
 AliEmcalPicoTrackMaker.cxx:198