ROOT logo
//
// Class to select particles in MC events.
//
// Author: S. Aiola

#include "AliEmcalMCTrackSelector.h"

#include <TClonesArray.h>

#include "AliVEvent.h"
#include "AliMCEvent.h"
#include "AliAODMCParticle.h"
#include "AliMCParticle.h"
#include "AliStack.h"
#include "AliNamedArrayI.h"

#include "AliLog.h"

ClassImp(AliEmcalMCTrackSelector)

//________________________________________________________________________
AliEmcalMCTrackSelector::AliEmcalMCTrackSelector() : 
  AliAnalysisTaskSE("AliEmcalMCTrackSelector"),
  fParticlesOutName("MCParticlesSelected"),
  fOnlyPhysPrim(kTRUE),
  fRejectNK(kFALSE),
  fChargedMC(kFALSE),
  fOnlyHIJING(kFALSE),
  fEtaMax(1),
  fParticlesMapName(""),
  fInit(kFALSE),
  fParticlesIn(0),
  fParticlesOut(0),
  fParticlesMap(0),
  fEvent(0),
  fMC(0),
  fIsESD(kFALSE),
  fDisabled(kFALSE)
{
  // Constructor.
}

//________________________________________________________________________
AliEmcalMCTrackSelector::AliEmcalMCTrackSelector(const char *name) : 
  AliAnalysisTaskSE(name),
  fParticlesOutName("MCParticlesSelected"),
  fOnlyPhysPrim(kTRUE),
  fRejectNK(kFALSE),
  fChargedMC(kFALSE),
  fOnlyHIJING(kFALSE),
  fEtaMax(1),
  fParticlesMapName(""),
  fInit(kFALSE),
  fParticlesIn(0),
  fParticlesOut(0),
  fParticlesMap(0),
  fEvent(0),
  fMC(0),
  fIsESD(kFALSE),
  fDisabled(kFALSE)
{
  // Constructor.
}

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

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

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

  if (fDisabled) return;

  if (!fInit) {
    fEvent = InputEvent();
    if (!fEvent) {
      AliError("Could not retrieve event! Returning");
      return;
    }

    if (fEvent->InheritsFrom("AliESDEvent")) fIsESD = kTRUE;
    else fIsESD = kFALSE;

    TObject *obj = fEvent->FindListObject(fParticlesOutName);
    if (obj) { // the output array is already present in the array!
      AliError(Form("The output array %s is already present in the event! Task will be disabled.", fParticlesOutName.Data()));
      fDisabled = kTRUE;
      return;
    }
    else {  // copy the array from the standard ESD/AOD collections, and filter if requested      

      fParticlesOut = new TClonesArray("AliAODMCParticle");  // the output will always be of AliAODMCParticle, regardless of the input
      fParticlesOut->SetName(fParticlesOutName);
      fEvent->AddObject(fParticlesOut);

      fParticlesMapName = fParticlesOutName;
      fParticlesMapName += "_Map";

      if (fEvent->FindListObject(fParticlesMapName)) {
	AliError(Form("The output array map %s is already present in the event! Task will be disabled.", fParticlesMapName.Data()));
	fDisabled = kTRUE;
	return;
      }
      else {
	fParticlesMap = new AliNamedArrayI(fParticlesMapName, 99999);
	fEvent->AddObject(fParticlesMap);
      }

      if (!fIsESD) {
	fParticlesIn = static_cast<TClonesArray*>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
	if (!fParticlesIn) {
	  AliError("Could not retrieve AOD MC particles! Task will be disabled.");
	  fDisabled = kTRUE;
	  return;
	}
	TClass *cl = fParticlesIn->GetClass();
	if (!cl->GetBaseClass("AliAODMCParticle")) {
	  AliError(Form("%s: Collection %s does not contain AliAODMCParticle! Task will be disabled.", GetName(), AliAODMCParticle::StdBranchName())); 
	  fDisabled = kTRUE;
	  fParticlesIn = 0;
	  return;
	}
      }
    }

    fMC = MCEvent();
    if (!fMC) {
      AliError("Could not retrieve MC event! Returning");
      fDisabled = kTRUE;
      return;
    }

    fInit = kTRUE;
  }

  if (fIsESD) ConvertMCParticles();
  else CopyMCParticles();
}

//________________________________________________________________________
void AliEmcalMCTrackSelector::ConvertMCParticles() 
{
  // Convert MC particles in MC AOD particles.

  // clear container (normally a null operation as the event should clean it already)
  fParticlesOut->Delete();

  // clear particles map
  fParticlesMap->Clear();

  const Int_t Nparticles = fMC->GetNumberOfTracks();
  const Int_t nprim = fMC->GetNumberOfPrimaries();

  if (fParticlesMap->GetSize() <= Nparticles) fParticlesMap->Set(Nparticles*2);

  // loop over particles
  for (Int_t iPart = 0, nacc = 0; iPart < Nparticles; iPart++) {

    fParticlesMap->AddAt(-1, iPart);

    AliMCParticle* part = static_cast<AliMCParticle*>(fMC->GetTrack(iPart));

    if (!part) continue;

    if (fEtaMax > 0. && TMath::Abs(part->Eta()) > fEtaMax) continue;
    
    if (fRejectNK && (part->PdgCode() == 130 || part->PdgCode() == 2112)) continue;
    
    if (fChargedMC && part->Charge() == 0) continue;

    Int_t genIndex = part->GetGeneratorIndex();
    if (fOnlyHIJING && genIndex != 0) continue;

    Bool_t isPhysPrim = fMC->IsPhysicalPrimary(iPart);
    if (fOnlyPhysPrim && !isPhysPrim) continue;

    fParticlesMap->AddAt(nacc, iPart);

    Int_t flag = 0;
    if (iPart < nprim) flag |= AliAODMCParticle::kPrimary;
    if (isPhysPrim) flag |= AliAODMCParticle::kPhysicalPrim;
    if (fMC->IsSecondaryFromWeakDecay(iPart)) flag |= AliAODMCParticle::kSecondaryFromWeakDecay;
    if (fMC->IsSecondaryFromMaterial(iPart)) flag |= AliAODMCParticle::kSecondaryFromMaterial;
    
    AliAODMCParticle *aodPart = new ((*fParticlesOut)[nacc]) AliAODMCParticle(part, iPart, flag);
    aodPart->SetGeneratorIndex(genIndex);    
    aodPart->SetStatus(part->Particle()->GetStatusCode());
    aodPart->SetMCProcessCode(part->Particle()->GetUniqueID());

    nacc++;
  }
}

//________________________________________________________________________
void AliEmcalMCTrackSelector::CopyMCParticles() 
{
  // Convert standard MC AOD particles in a new array, and filter if requested.

  if (!fParticlesIn) return;

  // clear container (normally a null operation as the event should clean it already)
  fParticlesOut->Delete();

  // clear particles map
  fParticlesMap->Clear();

  const Int_t Nparticles = fParticlesIn->GetEntriesFast();

  if (fParticlesMap->GetSize() <= Nparticles) fParticlesMap->Set(Nparticles*2);

  // loop over particles
  for (Int_t iPart = 0, nacc = 0; iPart < Nparticles; iPart++) {

    AliAODMCParticle* part = static_cast<AliAODMCParticle*>(fParticlesIn->At(iPart));

    fParticlesMap->AddAt(-1, iPart);

    if (!part) continue;

    if (fEtaMax > 0. && TMath::Abs(part->Eta()) > fEtaMax) continue;
    
    if (fRejectNK && (part->PdgCode() == 130 || part->PdgCode() == 2112)) continue;
    
    if (fChargedMC && part->Charge() == 0) continue;

    if (fOnlyHIJING && (part->GetGeneratorIndex() != 0)) continue;

    if (fOnlyPhysPrim && !part->IsPhysicalPrimary()) continue;

    fParticlesMap->AddAt(nacc, iPart);

    AliAODMCParticle *newPart = new ((*fParticlesOut)[nacc]) AliAODMCParticle(*part);
    newPart->SetGeneratorIndex(part->GetGeneratorIndex());

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