ROOT logo
/* $Id$ */


// Simple task to test the collision normalization. Can be called for
// both MC and data and shows how to fill the collision normalization
// class
//
// Author: Michele Floris
//         CERN


#include "AliCollisionNormalizationTask.h"

#include <TFile.h>
#include <TH1F.h>
#include <TH2F.h>

#include <AliLog.h>
#include <AliESDEvent.h>
#include <AliHeader.h>

#include "AliCollisionNormalization.h"
#include "AliAnalysisManager.h"
#include "AliInputEventHandler.h"

//#include "AliBackgroundSelection.h"
#include "AliMultiplicity.h"
#include "AliMCEvent.h"

ClassImp(AliCollisionNormalizationTask)

AliCollisionNormalizationTask::AliCollisionNormalizationTask() :
  AliAnalysisTaskSE("AliCollisionNormalizationTask"),
  fOutput(0),
  fIsMC(0),
  fCollisionNormalization(0)
{
  //
  // Default event handler
  //

  // Define input and output slots here
  DefineOutput(1, TList::Class());
  
}

AliCollisionNormalizationTask::AliCollisionNormalizationTask(const char* name) :
  AliAnalysisTaskSE(name),
  fOutput(0),
  fIsMC(0),
  fCollisionNormalization(new AliCollisionNormalization())
{
  //
  // Constructor. Initialization of pointers
  //

  // Define input and output slots here
  DefineOutput(1, TList::Class());
  
  //  AliLog::SetClassDebugLevel("AliCollisionNormalizationTask", AliLog::kWarning);
}

AliCollisionNormalizationTask::~AliCollisionNormalizationTask()
{
  //
  // Destructor
  //

  // histograms are in the output list and deleted when the output
  // list is deleted by the TSelector dtor

  if (fOutput && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
    delete fOutput;
    fOutput = 0;
  }
}

void AliCollisionNormalizationTask::UserCreateOutputObjects()
{
  // create result objects and add to output list

  Printf("AliCollisionNormalizationTask::CreateOutputObjects");

  fOutput = new TList;
  fOutput->SetOwner();
  
  if (!fCollisionNormalization)
    fCollisionNormalization = new AliCollisionNormalization;
  
  fOutput->Add(fCollisionNormalization);
//   fOutput->Add(fCollisionNormalization->GetVzCorrZeroBin ());
//   fOutput->Add(fCollisionNormalization->GetVzMCGen       ());
//   fOutput->Add(fCollisionNormalization->GetVzMCRec       ());
//   fOutput->Add(fCollisionNormalization->GetVzMCTrg       ());
//   fOutput->Add(fCollisionNormalization->GetVzData        ());
//   fOutput->Add(fCollisionNormalization->GetNEvents       ());
//   fOutput->Add(fCollisionNormalization->GetStatBin0      ());

}

void AliCollisionNormalizationTask::UserExec(Option_t*)
{
  // process the event


  PostData(1, fOutput);

  // Get the ESD
  AliESDEvent * aESD = dynamic_cast<AliESDEvent*>(fInputEvent);
  if(!aESD) {
    AliFatal("Cannot get ESD");
  }
  if (strcmp(aESD->ClassName(),"AliESDEvent")) {
    AliFatal("Not processing ESDs");
  }
  // Get MC event, if needed
  AliMCEvent* mcEvent = fIsMC ? MCEvent() : 0;
  if (!mcEvent && fIsMC){
    AliFatal("Running on MC but no MC handler available");
  }

  // Physics selection. At least in the case of MC we cannot use
  // yourTask->SelectCollisionCandidates();, because we also need to
  // fill the "generated" histogram 
  // NB never call IsEventSelected more than once per event
  // (statistics histogram would be altered)

  // FIXME: using only MB events, foresee more events?
  Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);

  // Get the Multiplicity cut
  const AliMultiplicity* mult = aESD->GetMultiplicity();
  if (!mult){
    AliError("Can't get mult object");
    return;
  }

  // Check if the event is "reconstructed" according to some quality
  // cuts. Tipically, we mean "it has a good-eonugh vertex"

  Int_t ntracklet = mult->GetNumberOfTracklets();
  const AliESDVertex * vtxESD = aESD->GetPrimaryVertexSPD();
  if (IsEventInBinZero()) {
    ntracklet = 0;
    vtxESD    = 0;
  }
  
  if (ntracklet > 0 && !vtxESD) {
    AliError("No vertex but reconstructed tracklets?");
  }

  // assign vz. For MC we use generated vz
  Float_t vz = 0;
  if (!fIsMC) vz = vtxESD ? vtxESD->GetZ() : 0; // FIXME : is zv used anywhere in Gen?
  else        vz = mcEvent->GetPrimaryVertex()->GetZ();

  if (fIsMC) {
    // Monte Carlo:  we fill 3 histos
    if (!isSelected || !vtxESD) ntracklet = 0; //If the event does not pass the physics selection or is not rec, it goes in the bin0
    fCollisionNormalization->FillVzMCGen(vz, ntracklet, mcEvent);      
    // If triggered == passing the physics selection
    if (isSelected) {
      fCollisionNormalization->FillVzMCTrg(vz, ntracklet, mcEvent);
      // If reconstructer == good enough vertex
      if (vtxESD) fCollisionNormalization->FillVzMCRec(vz, ntracklet, mcEvent);    
    }
  } else {
    if (isSelected) {
      // Passing the trigger
      fCollisionNormalization->FillVzData(vz,ntracklet);
    }
  }

}

void AliCollisionNormalizationTask::Terminate(Option_t *)
{
  // The Terminate() function is the last function to be called during
  // a query. It always runs on the client, it can be used to present
  // the results graphically or save the results to file.

  fOutput = dynamic_cast<TList*> (GetOutputData(1));
  if (!fOutput)
    Printf("ERROR: fOutput not available");


}

Bool_t AliCollisionNormalizationTask::IsEventInBinZero() {

  // Returns true if an event is to be assigned to the zero bin
  //
  // You should have your own version of this method in the class: in
  // general, the definition of "reconstructed" event is subjective.

  Bool_t isZeroBin = kTRUE;
  const AliESDEvent* esd= dynamic_cast<AliESDEvent*>(fInputEvent);
  if (!esd){ 
    Printf("AliCollisionNormalizationTask::IsEventInBinZero: Can't get ESD");
    return kFALSE;   
  }
  const AliMultiplicity* mult = esd->GetMultiplicity();
  if (!mult){
    Printf("AliCollisionNormalizationTask::IsEventInBinZero: Can't get mult object");
    return kFALSE;
  }
  Int_t ntracklet = mult->GetNumberOfTracklets();
  const AliESDVertex * vtxESD = esd->GetPrimaryVertexSPD();
  if(vtxESD) {
    // If there is a vertex from vertexer z with delta phi > 0.02 we
    // don't consider it rec (we keep the event in bin0). If quality
    // is good eneough we check the number of tracklets
    // if the vertex is more than 15 cm away, this is autamatically bin0
    if( TMath::Abs(vtxESD->GetZ()) <= 15 ) {
      if (vtxESD->IsFromVertexerZ()) {
	if (vtxESD->GetDispersion()<=0.02 ) {
	  if(ntracklet>0) isZeroBin = kFALSE;
	}
      } else if(ntracklet>0) isZeroBin = kFALSE; // if the event is not from Vz we chek the n of tracklets
    } 
  }
  return isZeroBin;

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