ROOT logo
//
// Task to filter Esd tracks and propagate to Emcal surface.
//
// Author: C.Loizides

#include "AliEmcalEsdTrackFilterTask.h"
#include <TClonesArray.h>
#include <TRandom3.h>
#include <TGeoGlobalMagField.h>
#include <AliAnalysisManager.h>
#include <AliEMCALRecoUtils.h>
#include <AliESDEvent.h>
#include <AliESDtrackCuts.h>
#include <AliMagF.h>
#include <AliTrackerBase.h>


ClassImp(AliEmcalEsdTrackFilterTask)

//________________________________________________________________________
AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask() : 
  AliAnalysisTaskSE("AliEmcalEsdTrackFilterTask"),
  fEsdTrackCuts(0),
  fDoSpdVtxCon(0),
  fHybridTrackCuts(0),
  fTracksName(),
  fIncludeNoITS(kTRUE),
  fDoPropagation(kFALSE),
  fDist(440),
  fTrackEfficiency(0),
  fIsMC(kFALSE),
  fEsdEv(0),
  fTracks(0)
{
  // Constructor.
}

//________________________________________________________________________
AliEmcalEsdTrackFilterTask::AliEmcalEsdTrackFilterTask(const char *name) : 
  AliAnalysisTaskSE(name),
  fEsdTrackCuts(0),
  fDoSpdVtxCon(0),
  fHybridTrackCuts(0),
  fTracksName("EsdTracksOut"),
  fIncludeNoITS(kTRUE),
  fDoPropagation(kFALSE),
  fDist(440),
  fTrackEfficiency(0),
  fIsMC(kFALSE),
  fEsdEv(0),
  fTracks(0)
{
  // Constructor.

  if (!name)
    return;

  SetName(name);

  fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
}

//________________________________________________________________________
AliEmcalEsdTrackFilterTask::~AliEmcalEsdTrackFilterTask()
{
  //Destructor

  delete fEsdTrackCuts;
}

//________________________________________________________________________
void AliEmcalEsdTrackFilterTask::UserCreateOutputObjects()
{
  // Create histograms.

  fTracks = new TClonesArray("AliESDtrack");
  fTracks->SetName(fTracksName);

  if (fDoSpdVtxCon) {
    if (!fEsdTrackCuts) {
      AliInfo("No track cuts given, creating default (standard only TPC) cuts");
      fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
      fEsdTrackCuts->SetPtRange(0.15,1e3);
    } 
  } else {
    AliWarning("No track cuts given, but maybe this is indeed intended?");
  }
}

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

  fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
  if (!fEsdEv) {
    AliError("Task works only on ESD events, returning");
    return;
  }

  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
  if (!am) {
    AliError("Manager zero, returning");
    return;
  }

  // add tracks to event if not yet there
  fTracks->Delete();
  if (!(InputEvent()->FindListObject(fTracksName)))
    InputEvent()->AddObject(fTracks);

  if (!fHybridTrackCuts) { // constrain TPC tracks to SPD vertex if fDoSpdVtxCon==kTRUE
    am->LoadBranch("AliESDRun.");
    am->LoadBranch("AliESDHeader.");
    am->LoadBranch("Tracks");

    if (fDoSpdVtxCon) {
      if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
        fEsdEv->InitMagneticField();
      }
      am->LoadBranch("SPDVertex.");
      const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
      if (!vtxSPD) {
        AliError("No SPD vertex, returning");
        return;
      }
      Int_t ntr = fEsdEv->GetNumberOfTracks();
      for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
        AliESDtrack *etrack = fEsdEv->GetTrack(i);
        if (!etrack)
          continue;

        if (!fEsdTrackCuts->AcceptTrack(etrack))
          continue;

        AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
        if (!ntrack)
          continue;
        if (ntrack->Pt()<=0) {
          delete ntrack;
          continue;
        }
        Double_t bfield[3] = {0,0,0};
        ntrack->GetBxByBz(bfield);
        AliExternalTrackParam exParam;
        Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
        if (!relate) {
          delete ntrack;
          continue;
        }
        // set the constraint parameters to the track
        ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
        if (ntrack->Pt()<=0) {
          delete ntrack;
          continue;
        }

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

	if (fDoPropagation) 	
	  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
        new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
        delete ntrack;
      }
    } else { /* no spd vtx constraint */
      Int_t ntr = fEsdEv->GetNumberOfTracks();
      for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
        AliESDtrack *etrack = fEsdEv->GetTrack(i);
        if (!etrack)
          continue;

	if ((fEsdTrackCuts!=0) && !fEsdTrackCuts->AcceptTrack(etrack))
          continue;
	
	if (fTrackEfficiency) {
	  Double_t r = gRandom->Rndm();
	  if (fTrackEfficiency->Eval(etrack->Pt()) < r)
	    continue;
	}

        AliESDtrack *ntrack = new ((*fTracks)[ntrnew++]) AliESDtrack(*etrack);
	if (fDoPropagation) 	
	  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(ntrack,fDist);
      }
    }

  } else { // use hybrid track cuts

    am->LoadBranch("Tracks");
    Int_t ntr = fEsdEv->GetNumberOfTracks();
    for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
      AliESDtrack *etrack = fEsdEv->GetTrack(i);
      if (!etrack) 
	continue;

      if (fEsdTrackCuts->AcceptTrack(etrack)) {
	if (fTrackEfficiency) {
	  Double_t r = gRandom->Rndm();
	  if (fTrackEfficiency->Eval(etrack->Pt()) < r)
	    continue;
	}
        AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
	if (fDoPropagation) 
	  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
        newTrack->SetBit(BIT(22),0); 
        newTrack->SetBit(BIT(23),0);
	if (!fMCEvent) newTrack->SetLabel(0);
        ++ntrnew;
      } else if (fHybridTrackCuts->AcceptTrack(etrack)) {
	if (!etrack->GetConstrainedParam())
	  continue;
	UInt_t status = etrack->GetStatus();
	if (!fIncludeNoITS && ((status&AliESDtrack::kITSrefit)==0))
	  continue;

	if (fTrackEfficiency) {
	  Double_t r = gRandom->Rndm();
	  if (fTrackEfficiency->Eval(etrack->Pt()) < r)
	    continue;
	}
	AliESDtrack *newTrack = new ((*fTracks)[ntrnew]) AliESDtrack(*etrack);
	if (fDoPropagation) 	
	  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(newTrack,fDist);
	const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam();
	newTrack->Set(constrainParam->GetX(),
		      constrainParam->GetAlpha(),
		      constrainParam->GetParameter(),
		      constrainParam->GetCovariance());
	if ((status&AliESDtrack::kITSrefit)==0) {
	  newTrack->SetBit(BIT(22),0); //type 2
	  newTrack->SetBit(BIT(23),1);
	} else {
	  newTrack->SetBit(BIT(22),1); //type 1
	  newTrack->SetBit(BIT(23),0);
	}
	if (!fMCEvent) newTrack->SetLabel(0);
	++ntrnew;
      }
    }
  }
}
 AliEmcalEsdTrackFilterTask.cxx:1
 AliEmcalEsdTrackFilterTask.cxx:2
 AliEmcalEsdTrackFilterTask.cxx:3
 AliEmcalEsdTrackFilterTask.cxx:4
 AliEmcalEsdTrackFilterTask.cxx:5
 AliEmcalEsdTrackFilterTask.cxx:6
 AliEmcalEsdTrackFilterTask.cxx:7
 AliEmcalEsdTrackFilterTask.cxx:8
 AliEmcalEsdTrackFilterTask.cxx:9
 AliEmcalEsdTrackFilterTask.cxx:10
 AliEmcalEsdTrackFilterTask.cxx:11
 AliEmcalEsdTrackFilterTask.cxx:12
 AliEmcalEsdTrackFilterTask.cxx:13
 AliEmcalEsdTrackFilterTask.cxx:14
 AliEmcalEsdTrackFilterTask.cxx:15
 AliEmcalEsdTrackFilterTask.cxx:16
 AliEmcalEsdTrackFilterTask.cxx:17
 AliEmcalEsdTrackFilterTask.cxx:18
 AliEmcalEsdTrackFilterTask.cxx:19
 AliEmcalEsdTrackFilterTask.cxx:20
 AliEmcalEsdTrackFilterTask.cxx:21
 AliEmcalEsdTrackFilterTask.cxx:22
 AliEmcalEsdTrackFilterTask.cxx:23
 AliEmcalEsdTrackFilterTask.cxx:24
 AliEmcalEsdTrackFilterTask.cxx:25
 AliEmcalEsdTrackFilterTask.cxx:26
 AliEmcalEsdTrackFilterTask.cxx:27
 AliEmcalEsdTrackFilterTask.cxx:28
 AliEmcalEsdTrackFilterTask.cxx:29
 AliEmcalEsdTrackFilterTask.cxx:30
 AliEmcalEsdTrackFilterTask.cxx:31
 AliEmcalEsdTrackFilterTask.cxx:32
 AliEmcalEsdTrackFilterTask.cxx:33
 AliEmcalEsdTrackFilterTask.cxx:34
 AliEmcalEsdTrackFilterTask.cxx:35
 AliEmcalEsdTrackFilterTask.cxx:36
 AliEmcalEsdTrackFilterTask.cxx:37
 AliEmcalEsdTrackFilterTask.cxx:38
 AliEmcalEsdTrackFilterTask.cxx:39
 AliEmcalEsdTrackFilterTask.cxx:40
 AliEmcalEsdTrackFilterTask.cxx:41
 AliEmcalEsdTrackFilterTask.cxx:42
 AliEmcalEsdTrackFilterTask.cxx:43
 AliEmcalEsdTrackFilterTask.cxx:44
 AliEmcalEsdTrackFilterTask.cxx:45
 AliEmcalEsdTrackFilterTask.cxx:46
 AliEmcalEsdTrackFilterTask.cxx:47
 AliEmcalEsdTrackFilterTask.cxx:48
 AliEmcalEsdTrackFilterTask.cxx:49
 AliEmcalEsdTrackFilterTask.cxx:50
 AliEmcalEsdTrackFilterTask.cxx:51
 AliEmcalEsdTrackFilterTask.cxx:52
 AliEmcalEsdTrackFilterTask.cxx:53
 AliEmcalEsdTrackFilterTask.cxx:54
 AliEmcalEsdTrackFilterTask.cxx:55
 AliEmcalEsdTrackFilterTask.cxx:56
 AliEmcalEsdTrackFilterTask.cxx:57
 AliEmcalEsdTrackFilterTask.cxx:58
 AliEmcalEsdTrackFilterTask.cxx:59
 AliEmcalEsdTrackFilterTask.cxx:60
 AliEmcalEsdTrackFilterTask.cxx:61
 AliEmcalEsdTrackFilterTask.cxx:62
 AliEmcalEsdTrackFilterTask.cxx:63
 AliEmcalEsdTrackFilterTask.cxx:64
 AliEmcalEsdTrackFilterTask.cxx:65
 AliEmcalEsdTrackFilterTask.cxx:66
 AliEmcalEsdTrackFilterTask.cxx:67
 AliEmcalEsdTrackFilterTask.cxx:68
 AliEmcalEsdTrackFilterTask.cxx:69
 AliEmcalEsdTrackFilterTask.cxx:70
 AliEmcalEsdTrackFilterTask.cxx:71
 AliEmcalEsdTrackFilterTask.cxx:72
 AliEmcalEsdTrackFilterTask.cxx:73
 AliEmcalEsdTrackFilterTask.cxx:74
 AliEmcalEsdTrackFilterTask.cxx:75
 AliEmcalEsdTrackFilterTask.cxx:76
 AliEmcalEsdTrackFilterTask.cxx:77
 AliEmcalEsdTrackFilterTask.cxx:78
 AliEmcalEsdTrackFilterTask.cxx:79
 AliEmcalEsdTrackFilterTask.cxx:80
 AliEmcalEsdTrackFilterTask.cxx:81
 AliEmcalEsdTrackFilterTask.cxx:82
 AliEmcalEsdTrackFilterTask.cxx:83
 AliEmcalEsdTrackFilterTask.cxx:84
 AliEmcalEsdTrackFilterTask.cxx:85
 AliEmcalEsdTrackFilterTask.cxx:86
 AliEmcalEsdTrackFilterTask.cxx:87
 AliEmcalEsdTrackFilterTask.cxx:88
 AliEmcalEsdTrackFilterTask.cxx:89
 AliEmcalEsdTrackFilterTask.cxx:90
 AliEmcalEsdTrackFilterTask.cxx:91
 AliEmcalEsdTrackFilterTask.cxx:92
 AliEmcalEsdTrackFilterTask.cxx:93
 AliEmcalEsdTrackFilterTask.cxx:94
 AliEmcalEsdTrackFilterTask.cxx:95
 AliEmcalEsdTrackFilterTask.cxx:96
 AliEmcalEsdTrackFilterTask.cxx:97
 AliEmcalEsdTrackFilterTask.cxx:98
 AliEmcalEsdTrackFilterTask.cxx:99
 AliEmcalEsdTrackFilterTask.cxx:100
 AliEmcalEsdTrackFilterTask.cxx:101
 AliEmcalEsdTrackFilterTask.cxx:102
 AliEmcalEsdTrackFilterTask.cxx:103
 AliEmcalEsdTrackFilterTask.cxx:104
 AliEmcalEsdTrackFilterTask.cxx:105
 AliEmcalEsdTrackFilterTask.cxx:106
 AliEmcalEsdTrackFilterTask.cxx:107
 AliEmcalEsdTrackFilterTask.cxx:108
 AliEmcalEsdTrackFilterTask.cxx:109
 AliEmcalEsdTrackFilterTask.cxx:110
 AliEmcalEsdTrackFilterTask.cxx:111
 AliEmcalEsdTrackFilterTask.cxx:112
 AliEmcalEsdTrackFilterTask.cxx:113
 AliEmcalEsdTrackFilterTask.cxx:114
 AliEmcalEsdTrackFilterTask.cxx:115
 AliEmcalEsdTrackFilterTask.cxx:116
 AliEmcalEsdTrackFilterTask.cxx:117
 AliEmcalEsdTrackFilterTask.cxx:118
 AliEmcalEsdTrackFilterTask.cxx:119
 AliEmcalEsdTrackFilterTask.cxx:120
 AliEmcalEsdTrackFilterTask.cxx:121
 AliEmcalEsdTrackFilterTask.cxx:122
 AliEmcalEsdTrackFilterTask.cxx:123
 AliEmcalEsdTrackFilterTask.cxx:124
 AliEmcalEsdTrackFilterTask.cxx:125
 AliEmcalEsdTrackFilterTask.cxx:126
 AliEmcalEsdTrackFilterTask.cxx:127
 AliEmcalEsdTrackFilterTask.cxx:128
 AliEmcalEsdTrackFilterTask.cxx:129
 AliEmcalEsdTrackFilterTask.cxx:130
 AliEmcalEsdTrackFilterTask.cxx:131
 AliEmcalEsdTrackFilterTask.cxx:132
 AliEmcalEsdTrackFilterTask.cxx:133
 AliEmcalEsdTrackFilterTask.cxx:134
 AliEmcalEsdTrackFilterTask.cxx:135
 AliEmcalEsdTrackFilterTask.cxx:136
 AliEmcalEsdTrackFilterTask.cxx:137
 AliEmcalEsdTrackFilterTask.cxx:138
 AliEmcalEsdTrackFilterTask.cxx:139
 AliEmcalEsdTrackFilterTask.cxx:140
 AliEmcalEsdTrackFilterTask.cxx:141
 AliEmcalEsdTrackFilterTask.cxx:142
 AliEmcalEsdTrackFilterTask.cxx:143
 AliEmcalEsdTrackFilterTask.cxx:144
 AliEmcalEsdTrackFilterTask.cxx:145
 AliEmcalEsdTrackFilterTask.cxx:146
 AliEmcalEsdTrackFilterTask.cxx:147
 AliEmcalEsdTrackFilterTask.cxx:148
 AliEmcalEsdTrackFilterTask.cxx:149
 AliEmcalEsdTrackFilterTask.cxx:150
 AliEmcalEsdTrackFilterTask.cxx:151
 AliEmcalEsdTrackFilterTask.cxx:152
 AliEmcalEsdTrackFilterTask.cxx:153
 AliEmcalEsdTrackFilterTask.cxx:154
 AliEmcalEsdTrackFilterTask.cxx:155
 AliEmcalEsdTrackFilterTask.cxx:156
 AliEmcalEsdTrackFilterTask.cxx:157
 AliEmcalEsdTrackFilterTask.cxx:158
 AliEmcalEsdTrackFilterTask.cxx:159
 AliEmcalEsdTrackFilterTask.cxx:160
 AliEmcalEsdTrackFilterTask.cxx:161
 AliEmcalEsdTrackFilterTask.cxx:162
 AliEmcalEsdTrackFilterTask.cxx:163
 AliEmcalEsdTrackFilterTask.cxx:164
 AliEmcalEsdTrackFilterTask.cxx:165
 AliEmcalEsdTrackFilterTask.cxx:166
 AliEmcalEsdTrackFilterTask.cxx:167
 AliEmcalEsdTrackFilterTask.cxx:168
 AliEmcalEsdTrackFilterTask.cxx:169
 AliEmcalEsdTrackFilterTask.cxx:170
 AliEmcalEsdTrackFilterTask.cxx:171
 AliEmcalEsdTrackFilterTask.cxx:172
 AliEmcalEsdTrackFilterTask.cxx:173
 AliEmcalEsdTrackFilterTask.cxx:174
 AliEmcalEsdTrackFilterTask.cxx:175
 AliEmcalEsdTrackFilterTask.cxx:176
 AliEmcalEsdTrackFilterTask.cxx:177
 AliEmcalEsdTrackFilterTask.cxx:178
 AliEmcalEsdTrackFilterTask.cxx:179
 AliEmcalEsdTrackFilterTask.cxx:180
 AliEmcalEsdTrackFilterTask.cxx:181
 AliEmcalEsdTrackFilterTask.cxx:182
 AliEmcalEsdTrackFilterTask.cxx:183
 AliEmcalEsdTrackFilterTask.cxx:184
 AliEmcalEsdTrackFilterTask.cxx:185
 AliEmcalEsdTrackFilterTask.cxx:186
 AliEmcalEsdTrackFilterTask.cxx:187
 AliEmcalEsdTrackFilterTask.cxx:188
 AliEmcalEsdTrackFilterTask.cxx:189
 AliEmcalEsdTrackFilterTask.cxx:190
 AliEmcalEsdTrackFilterTask.cxx:191
 AliEmcalEsdTrackFilterTask.cxx:192
 AliEmcalEsdTrackFilterTask.cxx:193
 AliEmcalEsdTrackFilterTask.cxx:194
 AliEmcalEsdTrackFilterTask.cxx:195
 AliEmcalEsdTrackFilterTask.cxx:196
 AliEmcalEsdTrackFilterTask.cxx:197
 AliEmcalEsdTrackFilterTask.cxx:198
 AliEmcalEsdTrackFilterTask.cxx:199
 AliEmcalEsdTrackFilterTask.cxx:200
 AliEmcalEsdTrackFilterTask.cxx:201
 AliEmcalEsdTrackFilterTask.cxx:202
 AliEmcalEsdTrackFilterTask.cxx:203
 AliEmcalEsdTrackFilterTask.cxx:204
 AliEmcalEsdTrackFilterTask.cxx:205
 AliEmcalEsdTrackFilterTask.cxx:206
 AliEmcalEsdTrackFilterTask.cxx:207
 AliEmcalEsdTrackFilterTask.cxx:208
 AliEmcalEsdTrackFilterTask.cxx:209
 AliEmcalEsdTrackFilterTask.cxx:210
 AliEmcalEsdTrackFilterTask.cxx:211
 AliEmcalEsdTrackFilterTask.cxx:212
 AliEmcalEsdTrackFilterTask.cxx:213
 AliEmcalEsdTrackFilterTask.cxx:214
 AliEmcalEsdTrackFilterTask.cxx:215
 AliEmcalEsdTrackFilterTask.cxx:216
 AliEmcalEsdTrackFilterTask.cxx:217
 AliEmcalEsdTrackFilterTask.cxx:218
 AliEmcalEsdTrackFilterTask.cxx:219
 AliEmcalEsdTrackFilterTask.cxx:220
 AliEmcalEsdTrackFilterTask.cxx:221
 AliEmcalEsdTrackFilterTask.cxx:222
 AliEmcalEsdTrackFilterTask.cxx:223
 AliEmcalEsdTrackFilterTask.cxx:224
 AliEmcalEsdTrackFilterTask.cxx:225
 AliEmcalEsdTrackFilterTask.cxx:226
 AliEmcalEsdTrackFilterTask.cxx:227
 AliEmcalEsdTrackFilterTask.cxx:228
 AliEmcalEsdTrackFilterTask.cxx:229
 AliEmcalEsdTrackFilterTask.cxx:230
 AliEmcalEsdTrackFilterTask.cxx:231
 AliEmcalEsdTrackFilterTask.cxx:232
 AliEmcalEsdTrackFilterTask.cxx:233
 AliEmcalEsdTrackFilterTask.cxx:234
 AliEmcalEsdTrackFilterTask.cxx:235
 AliEmcalEsdTrackFilterTask.cxx:236
 AliEmcalEsdTrackFilterTask.cxx:237
 AliEmcalEsdTrackFilterTask.cxx:238
 AliEmcalEsdTrackFilterTask.cxx:239
 AliEmcalEsdTrackFilterTask.cxx:240
 AliEmcalEsdTrackFilterTask.cxx:241
 AliEmcalEsdTrackFilterTask.cxx:242
 AliEmcalEsdTrackFilterTask.cxx:243
 AliEmcalEsdTrackFilterTask.cxx:244
 AliEmcalEsdTrackFilterTask.cxx:245