ROOT logo
//
// Select MC tracks, feed them via PicoTrack-like list

#include "AliMCTruthTrackMaker.h"

#include <TClonesArray.h>
#include <TString.h>

#include "AliAnalysisManager.h"
#include "AliVEventHandler.h"
#include "AliVEvent.h"
#include "AliMCEvent.h"
#include "AliVParticle.h"
#include "AliAODMCParticle.h"
#include "AliMCParticle.h"
#include "AliLog.h"
#include "AliESDMuonTrack.h"
#include "AliAODTrack.h"
#include "AliESDEvent.h"
#include "AliStack.h"

ClassImp(AliMCTruthTrackMaker)

//________________________________________________________________________
AliMCTruthTrackMaker::AliMCTruthTrackMaker() :
AliAnalysisTaskSE("AliMCTruthTrackMaker"),
fTracksOutName("MCTruthTracks"),
fChargedMC(kFALSE),
fFillMuMothers(kFALSE),
fTriggerMatch(kTRUE),
fEtaMax(1.0),
fInit(kFALSE),
fEsdMode(kFALSE),
fTracksIn(0x0),
fTracksOut(0x0),
fESD(0x0),
fMC(0x0),
fStack(0x0)
{
  // Constructor.
}

//________________________________________________________________________
AliMCTruthTrackMaker::AliMCTruthTrackMaker(const char *name) :
AliAnalysisTaskSE(name),
fTracksOutName("MCTruthTracks"),
fChargedMC(kFALSE),
fFillMuMothers(kFALSE),
fTriggerMatch(kTRUE),
fEtaMax(1.0),
fInit(kFALSE),
fEsdMode(kFALSE),
fTracksIn(0x0),
fTracksOut(0x0),
fESD(0x0),
fMC(0x0),
fStack(0x0)
{
  // Constructor.
}

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

//________________________________________________________________________
void AliMCTruthTrackMaker::UserCreateOutputObjects()
{
  // Create my user objects.
  
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) {
    AliFatal("No analysis manager!");
    return;
  }
  
  AliVEventHandler *handler = mgr->GetInputEventHandler();
  if (!handler) {
    AliFatal("No input handler!");
    return;
  }
  
  if (handler->InheritsFrom("AliESDInputHandler"))
    fEsdMode = kTRUE;
  else
    fEsdMode = kFALSE;
  
  if (fEsdMode)
    fTracksOut = new TClonesArray("AliMCParticle");
  else
    fTracksOut = new TClonesArray("AliAODMCParticle");
  fTracksOut->SetName(fTracksOutName);
  
}

//________________________________________________________________________
void AliMCTruthTrackMaker::UserExec(Option_t *)
{
  // Main loop, called for each event.
  if (!InputEvent()) {
    AliError("Could not retrieve event! Returning");
    return;
  }
  
  if (fEsdMode && !MCEvent()) {
    AliError("Could not retrieve ESD MC event! Returning");
    return;
  }
  
  if (!fInit) {
    // add tracks to event if not yet there
    if (!(InputEvent()->FindListObject(fTracksOutName)))
      InputEvent()->AddObject(fTracksOut);
    
    if (!fEsdMode) {
      fTracksIn = static_cast<TClonesArray*>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
      if (!fTracksIn) {
        AliError("Could not retrieve AOD MC particles! Returning");
        return;
      }
      TClass *cl = fTracksIn->GetClass();
      if (!cl->GetBaseClass("AliAODMCParticle")) {
        AliError(Form("%s: Collection %s does not contain AliAODMCParticle!", GetName(), AliAODMCParticle::StdBranchName()));
        fTracksIn = 0;
        return;
      }
    }
    
    fInit = kTRUE;
  }
  
  // clear container (normally a null operation as the event should clean it already)
  fTracksOut->Delete();
  
  Int_t nacc = 0;
  
  // first, fill MC tracks up to fEtaMax
  const Int_t Ntracks = GetNumberOfTracks();
  for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
    AliVParticle* track = GetTrack(iTracks);

    if (!track)
      continue;
    
    if (TMath::Abs(track->Eta()) > fEtaMax)
      continue;

    if (fChargedMC && track->Charge() == 0) continue;

    AddTrack(track, nacc);
    
    ++nacc;
  }
  
  // now loop over reconstructed tracks and if accepted by muon cuts, add their primary mother
  if (fFillMuMothers) {
    if (!fEsdMode) {
      AliError("Muon mother particles can only be filled when running on ESD! Returning");
      return;
    }
    
    fESD = dynamic_cast<AliESDEvent*>(InputEvent());
    if (!fESD) { AliError("ESD event not found. Nothing done!"); return; }
    Int_t ntrks = fESD->GetNumberOfMuonTracks();

    fMC = MCEvent();
    if (!fMC) { AliError("MC event not available."); return; }
    fStack = fMC->Stack();
    
    for (Int_t iTrack = 0; iTrack<ntrks; iTrack++)
    {
      Int_t label = 0;
      AliESDMuonTrack* muonTrack = fESD->GetMuonTrack(iTrack);
      if(muonTrack)
      {
        if (IsGoodMUONtrack(*muonTrack)) {
          label =  TMath::Abs(muonTrack->GetLabel());
          if (label>=fMC->GetNumberOfTracks()) {
            AliError(Form("Label %d larger than number of particles on stack %d\n",label,fMC->GetNumberOfTracks()));
            continue;
          }
          AliVParticle * fpmMu = (AliVParticle *) fMC->GetTrack(GetFirstPrimaryMother(label));
          if (fpmMu) {
            AddTrack(fpmMu, nacc);
            ++nacc;
          } else {
            AliError("didn't receive a valid first primary mother here");
          }
        }
      }
    }
    
  }
}

//________________________________________________________________________
Int_t AliMCTruthTrackMaker::GetNumberOfTracks() const
{
  if (fEsdMode)
    return MCEvent()->GetNumberOfTracks();
  else
    return fTracksIn->GetEntries();
}

//________________________________________________________________________
AliVParticle* AliMCTruthTrackMaker::GetTrack(Int_t i)
{
  if (fEsdMode) {
    if (!MCEvent()->IsPhysicalPrimary(i))
      return 0;
    
    return MCEvent()->GetTrack(i);
  }
  else {
    AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fTracksIn->At(i));
    if (!part->IsPhysicalPrimary())
      return 0;
    
    return part;
  }
}

//________________________________________________________________________
void AliMCTruthTrackMaker::AddTrack(AliVParticle *track, Int_t nacc)
{
  if (fEsdMode) {
    AliMCParticle *part = static_cast<AliMCParticle*>(track);
    new ((*fTracksOut)[nacc]) AliMCParticle(part->Particle(), 0, part->Label());
  }
  else {
    AliAODMCParticle *part = static_cast<AliAODMCParticle*>(track);
    new ((*fTracksOut)[nacc]) AliAODMCParticle(*part);
  }
}

//________________________________________________________________________
Bool_t AliMCTruthTrackMaker::IsGoodMUONtrack(AliESDMuonTrack &track)
{
  // Applying track cuts for MUON tracks
  
  if (!track.ContainTrackerData())
    return kFALSE;
  Double_t thetaTrackAbsEnd = TMath::ATan(track.GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
  if ((thetaTrackAbsEnd < 2.) || (thetaTrackAbsEnd > 10.))
    return kFALSE;
  Double_t eta = track.Eta();
  if ((eta < -4.) || (eta > -2.5))
    return kFALSE;
  if (fTriggerMatch) {
    if (!track.ContainTriggerData())
      return kFALSE;
    if (track.GetMatchTrigger() < 0.5)
      return kFALSE;
  }
  return kTRUE;
}

//________________________________________________________________________
Bool_t AliMCTruthTrackMaker::IsGoodMUONtrack(AliAODTrack &track)
{
  // Applying track cuts for MUON tracks
  
  if (!track.IsMuonTrack())
    return kFALSE;
  Double_t dThetaAbs = TMath::ATan(track.GetRAtAbsorberEnd()/505.)* TMath::RadToDeg();
  if ((dThetaAbs<2.) || (dThetaAbs>10.))
    return kFALSE;
  Double_t dEta = track.Eta();
  if ((dEta<-4.) || (dEta>-2.5))
    return kFALSE;
  if (fTriggerMatch) {
    if (track.GetMatchTrigger()<0.5)
      return kFALSE;
  }
  return kTRUE;
}

//________________________________________________________________________
Int_t AliMCTruthTrackMaker::GetFirstPrimaryMother(Int_t muonlabel)
{
  AliMCParticle *McParticle  = (AliMCParticle*)fMC->GetTrack(muonlabel);
  if(McParticle->GetMother()<fStack->GetNprimary()) return McParticle->GetMother();
  else
  {
    Int_t motherlabel = McParticle->GetMother();
    while(motherlabel > -1)
    {
      AliMCParticle *MotherParticle  = (AliMCParticle*)fMC->GetTrack(motherlabel);
      if(MotherParticle->GetMother()<fStack->GetNprimary()) break;
      else motherlabel = MotherParticle->GetMother();
    }
    AliMCParticle *FirstSecondaryMotherParticle  = (AliMCParticle*)fMC->GetTrack(motherlabel);
    return FirstSecondaryMotherParticle->GetMother();
  }
}
 AliMCTruthTrackMaker.cxx:1
 AliMCTruthTrackMaker.cxx:2
 AliMCTruthTrackMaker.cxx:3
 AliMCTruthTrackMaker.cxx:4
 AliMCTruthTrackMaker.cxx:5
 AliMCTruthTrackMaker.cxx:6
 AliMCTruthTrackMaker.cxx:7
 AliMCTruthTrackMaker.cxx:8
 AliMCTruthTrackMaker.cxx:9
 AliMCTruthTrackMaker.cxx:10
 AliMCTruthTrackMaker.cxx:11
 AliMCTruthTrackMaker.cxx:12
 AliMCTruthTrackMaker.cxx:13
 AliMCTruthTrackMaker.cxx:14
 AliMCTruthTrackMaker.cxx:15
 AliMCTruthTrackMaker.cxx:16
 AliMCTruthTrackMaker.cxx:17
 AliMCTruthTrackMaker.cxx:18
 AliMCTruthTrackMaker.cxx:19
 AliMCTruthTrackMaker.cxx:20
 AliMCTruthTrackMaker.cxx:21
 AliMCTruthTrackMaker.cxx:22
 AliMCTruthTrackMaker.cxx:23
 AliMCTruthTrackMaker.cxx:24
 AliMCTruthTrackMaker.cxx:25
 AliMCTruthTrackMaker.cxx:26
 AliMCTruthTrackMaker.cxx:27
 AliMCTruthTrackMaker.cxx:28
 AliMCTruthTrackMaker.cxx:29
 AliMCTruthTrackMaker.cxx:30
 AliMCTruthTrackMaker.cxx:31
 AliMCTruthTrackMaker.cxx:32
 AliMCTruthTrackMaker.cxx:33
 AliMCTruthTrackMaker.cxx:34
 AliMCTruthTrackMaker.cxx:35
 AliMCTruthTrackMaker.cxx:36
 AliMCTruthTrackMaker.cxx:37
 AliMCTruthTrackMaker.cxx:38
 AliMCTruthTrackMaker.cxx:39
 AliMCTruthTrackMaker.cxx:40
 AliMCTruthTrackMaker.cxx:41
 AliMCTruthTrackMaker.cxx:42
 AliMCTruthTrackMaker.cxx:43
 AliMCTruthTrackMaker.cxx:44
 AliMCTruthTrackMaker.cxx:45
 AliMCTruthTrackMaker.cxx:46
 AliMCTruthTrackMaker.cxx:47
 AliMCTruthTrackMaker.cxx:48
 AliMCTruthTrackMaker.cxx:49
 AliMCTruthTrackMaker.cxx:50
 AliMCTruthTrackMaker.cxx:51
 AliMCTruthTrackMaker.cxx:52
 AliMCTruthTrackMaker.cxx:53
 AliMCTruthTrackMaker.cxx:54
 AliMCTruthTrackMaker.cxx:55
 AliMCTruthTrackMaker.cxx:56
 AliMCTruthTrackMaker.cxx:57
 AliMCTruthTrackMaker.cxx:58
 AliMCTruthTrackMaker.cxx:59
 AliMCTruthTrackMaker.cxx:60
 AliMCTruthTrackMaker.cxx:61
 AliMCTruthTrackMaker.cxx:62
 AliMCTruthTrackMaker.cxx:63
 AliMCTruthTrackMaker.cxx:64
 AliMCTruthTrackMaker.cxx:65
 AliMCTruthTrackMaker.cxx:66
 AliMCTruthTrackMaker.cxx:67
 AliMCTruthTrackMaker.cxx:68
 AliMCTruthTrackMaker.cxx:69
 AliMCTruthTrackMaker.cxx:70
 AliMCTruthTrackMaker.cxx:71
 AliMCTruthTrackMaker.cxx:72
 AliMCTruthTrackMaker.cxx:73
 AliMCTruthTrackMaker.cxx:74
 AliMCTruthTrackMaker.cxx:75
 AliMCTruthTrackMaker.cxx:76
 AliMCTruthTrackMaker.cxx:77
 AliMCTruthTrackMaker.cxx:78
 AliMCTruthTrackMaker.cxx:79
 AliMCTruthTrackMaker.cxx:80
 AliMCTruthTrackMaker.cxx:81
 AliMCTruthTrackMaker.cxx:82
 AliMCTruthTrackMaker.cxx:83
 AliMCTruthTrackMaker.cxx:84
 AliMCTruthTrackMaker.cxx:85
 AliMCTruthTrackMaker.cxx:86
 AliMCTruthTrackMaker.cxx:87
 AliMCTruthTrackMaker.cxx:88
 AliMCTruthTrackMaker.cxx:89
 AliMCTruthTrackMaker.cxx:90
 AliMCTruthTrackMaker.cxx:91
 AliMCTruthTrackMaker.cxx:92
 AliMCTruthTrackMaker.cxx:93
 AliMCTruthTrackMaker.cxx:94
 AliMCTruthTrackMaker.cxx:95
 AliMCTruthTrackMaker.cxx:96
 AliMCTruthTrackMaker.cxx:97
 AliMCTruthTrackMaker.cxx:98
 AliMCTruthTrackMaker.cxx:99
 AliMCTruthTrackMaker.cxx:100
 AliMCTruthTrackMaker.cxx:101
 AliMCTruthTrackMaker.cxx:102
 AliMCTruthTrackMaker.cxx:103
 AliMCTruthTrackMaker.cxx:104
 AliMCTruthTrackMaker.cxx:105
 AliMCTruthTrackMaker.cxx:106
 AliMCTruthTrackMaker.cxx:107
 AliMCTruthTrackMaker.cxx:108
 AliMCTruthTrackMaker.cxx:109
 AliMCTruthTrackMaker.cxx:110
 AliMCTruthTrackMaker.cxx:111
 AliMCTruthTrackMaker.cxx:112
 AliMCTruthTrackMaker.cxx:113
 AliMCTruthTrackMaker.cxx:114
 AliMCTruthTrackMaker.cxx:115
 AliMCTruthTrackMaker.cxx:116
 AliMCTruthTrackMaker.cxx:117
 AliMCTruthTrackMaker.cxx:118
 AliMCTruthTrackMaker.cxx:119
 AliMCTruthTrackMaker.cxx:120
 AliMCTruthTrackMaker.cxx:121
 AliMCTruthTrackMaker.cxx:122
 AliMCTruthTrackMaker.cxx:123
 AliMCTruthTrackMaker.cxx:124
 AliMCTruthTrackMaker.cxx:125
 AliMCTruthTrackMaker.cxx:126
 AliMCTruthTrackMaker.cxx:127
 AliMCTruthTrackMaker.cxx:128
 AliMCTruthTrackMaker.cxx:129
 AliMCTruthTrackMaker.cxx:130
 AliMCTruthTrackMaker.cxx:131
 AliMCTruthTrackMaker.cxx:132
 AliMCTruthTrackMaker.cxx:133
 AliMCTruthTrackMaker.cxx:134
 AliMCTruthTrackMaker.cxx:135
 AliMCTruthTrackMaker.cxx:136
 AliMCTruthTrackMaker.cxx:137
 AliMCTruthTrackMaker.cxx:138
 AliMCTruthTrackMaker.cxx:139
 AliMCTruthTrackMaker.cxx:140
 AliMCTruthTrackMaker.cxx:141
 AliMCTruthTrackMaker.cxx:142
 AliMCTruthTrackMaker.cxx:143
 AliMCTruthTrackMaker.cxx:144
 AliMCTruthTrackMaker.cxx:145
 AliMCTruthTrackMaker.cxx:146
 AliMCTruthTrackMaker.cxx:147
 AliMCTruthTrackMaker.cxx:148
 AliMCTruthTrackMaker.cxx:149
 AliMCTruthTrackMaker.cxx:150
 AliMCTruthTrackMaker.cxx:151
 AliMCTruthTrackMaker.cxx:152
 AliMCTruthTrackMaker.cxx:153
 AliMCTruthTrackMaker.cxx:154
 AliMCTruthTrackMaker.cxx:155
 AliMCTruthTrackMaker.cxx:156
 AliMCTruthTrackMaker.cxx:157
 AliMCTruthTrackMaker.cxx:158
 AliMCTruthTrackMaker.cxx:159
 AliMCTruthTrackMaker.cxx:160
 AliMCTruthTrackMaker.cxx:161
 AliMCTruthTrackMaker.cxx:162
 AliMCTruthTrackMaker.cxx:163
 AliMCTruthTrackMaker.cxx:164
 AliMCTruthTrackMaker.cxx:165
 AliMCTruthTrackMaker.cxx:166
 AliMCTruthTrackMaker.cxx:167
 AliMCTruthTrackMaker.cxx:168
 AliMCTruthTrackMaker.cxx:169
 AliMCTruthTrackMaker.cxx:170
 AliMCTruthTrackMaker.cxx:171
 AliMCTruthTrackMaker.cxx:172
 AliMCTruthTrackMaker.cxx:173
 AliMCTruthTrackMaker.cxx:174
 AliMCTruthTrackMaker.cxx:175
 AliMCTruthTrackMaker.cxx:176
 AliMCTruthTrackMaker.cxx:177
 AliMCTruthTrackMaker.cxx:178
 AliMCTruthTrackMaker.cxx:179
 AliMCTruthTrackMaker.cxx:180
 AliMCTruthTrackMaker.cxx:181
 AliMCTruthTrackMaker.cxx:182
 AliMCTruthTrackMaker.cxx:183
 AliMCTruthTrackMaker.cxx:184
 AliMCTruthTrackMaker.cxx:185
 AliMCTruthTrackMaker.cxx:186
 AliMCTruthTrackMaker.cxx:187
 AliMCTruthTrackMaker.cxx:188
 AliMCTruthTrackMaker.cxx:189
 AliMCTruthTrackMaker.cxx:190
 AliMCTruthTrackMaker.cxx:191
 AliMCTruthTrackMaker.cxx:192
 AliMCTruthTrackMaker.cxx:193
 AliMCTruthTrackMaker.cxx:194
 AliMCTruthTrackMaker.cxx:195
 AliMCTruthTrackMaker.cxx:196
 AliMCTruthTrackMaker.cxx:197
 AliMCTruthTrackMaker.cxx:198
 AliMCTruthTrackMaker.cxx:199
 AliMCTruthTrackMaker.cxx:200
 AliMCTruthTrackMaker.cxx:201
 AliMCTruthTrackMaker.cxx:202
 AliMCTruthTrackMaker.cxx:203
 AliMCTruthTrackMaker.cxx:204
 AliMCTruthTrackMaker.cxx:205
 AliMCTruthTrackMaker.cxx:206
 AliMCTruthTrackMaker.cxx:207
 AliMCTruthTrackMaker.cxx:208
 AliMCTruthTrackMaker.cxx:209
 AliMCTruthTrackMaker.cxx:210
 AliMCTruthTrackMaker.cxx:211
 AliMCTruthTrackMaker.cxx:212
 AliMCTruthTrackMaker.cxx:213
 AliMCTruthTrackMaker.cxx:214
 AliMCTruthTrackMaker.cxx:215
 AliMCTruthTrackMaker.cxx:216
 AliMCTruthTrackMaker.cxx:217
 AliMCTruthTrackMaker.cxx:218
 AliMCTruthTrackMaker.cxx:219
 AliMCTruthTrackMaker.cxx:220
 AliMCTruthTrackMaker.cxx:221
 AliMCTruthTrackMaker.cxx:222
 AliMCTruthTrackMaker.cxx:223
 AliMCTruthTrackMaker.cxx:224
 AliMCTruthTrackMaker.cxx:225
 AliMCTruthTrackMaker.cxx:226
 AliMCTruthTrackMaker.cxx:227
 AliMCTruthTrackMaker.cxx:228
 AliMCTruthTrackMaker.cxx:229
 AliMCTruthTrackMaker.cxx:230
 AliMCTruthTrackMaker.cxx:231
 AliMCTruthTrackMaker.cxx:232
 AliMCTruthTrackMaker.cxx:233
 AliMCTruthTrackMaker.cxx:234
 AliMCTruthTrackMaker.cxx:235
 AliMCTruthTrackMaker.cxx:236
 AliMCTruthTrackMaker.cxx:237
 AliMCTruthTrackMaker.cxx:238
 AliMCTruthTrackMaker.cxx:239
 AliMCTruthTrackMaker.cxx:240
 AliMCTruthTrackMaker.cxx:241
 AliMCTruthTrackMaker.cxx:242
 AliMCTruthTrackMaker.cxx:243
 AliMCTruthTrackMaker.cxx:244
 AliMCTruthTrackMaker.cxx:245
 AliMCTruthTrackMaker.cxx:246
 AliMCTruthTrackMaker.cxx:247
 AliMCTruthTrackMaker.cxx:248
 AliMCTruthTrackMaker.cxx:249
 AliMCTruthTrackMaker.cxx:250
 AliMCTruthTrackMaker.cxx:251
 AliMCTruthTrackMaker.cxx:252
 AliMCTruthTrackMaker.cxx:253
 AliMCTruthTrackMaker.cxx:254
 AliMCTruthTrackMaker.cxx:255
 AliMCTruthTrackMaker.cxx:256
 AliMCTruthTrackMaker.cxx:257
 AliMCTruthTrackMaker.cxx:258
 AliMCTruthTrackMaker.cxx:259
 AliMCTruthTrackMaker.cxx:260
 AliMCTruthTrackMaker.cxx:261
 AliMCTruthTrackMaker.cxx:262
 AliMCTruthTrackMaker.cxx:263
 AliMCTruthTrackMaker.cxx:264
 AliMCTruthTrackMaker.cxx:265
 AliMCTruthTrackMaker.cxx:266
 AliMCTruthTrackMaker.cxx:267
 AliMCTruthTrackMaker.cxx:268
 AliMCTruthTrackMaker.cxx:269
 AliMCTruthTrackMaker.cxx:270
 AliMCTruthTrackMaker.cxx:271
 AliMCTruthTrackMaker.cxx:272
 AliMCTruthTrackMaker.cxx:273
 AliMCTruthTrackMaker.cxx:274
 AliMCTruthTrackMaker.cxx:275
 AliMCTruthTrackMaker.cxx:276
 AliMCTruthTrackMaker.cxx:277
 AliMCTruthTrackMaker.cxx:278
 AliMCTruthTrackMaker.cxx:279
 AliMCTruthTrackMaker.cxx:280
 AliMCTruthTrackMaker.cxx:281
 AliMCTruthTrackMaker.cxx:282
 AliMCTruthTrackMaker.cxx:283
 AliMCTruthTrackMaker.cxx:284
 AliMCTruthTrackMaker.cxx:285
 AliMCTruthTrackMaker.cxx:286
 AliMCTruthTrackMaker.cxx:287
 AliMCTruthTrackMaker.cxx:288
 AliMCTruthTrackMaker.cxx:289
 AliMCTruthTrackMaker.cxx:290
 AliMCTruthTrackMaker.cxx:291
 AliMCTruthTrackMaker.cxx:292
 AliMCTruthTrackMaker.cxx:293
 AliMCTruthTrackMaker.cxx:294
 AliMCTruthTrackMaker.cxx:295
 AliMCTruthTrackMaker.cxx:296
 AliMCTruthTrackMaker.cxx:297