ROOT logo
/*************************************************************************
* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

///////////////////////////////////////////////////////////////////////////
//                                                                       //
//                        Basic Analysis Task                            //
//                                                                       //
///////////////////////////////////////////////////////////////////////////

#include <TChain.h>
#include <TH1D.h>

#include <AliCFContainer.h>
#include <AliInputEventHandler.h>
#include <AliAnalysisManager.h>
#include <AliVEvent.h>

#include "AliDielectron.h"
#include "AliDielectronHistos.h"
#include "AliDielectronCF.h"
#include "AliDielectronMC.h"
#include "AliAnalysisTaskDielectronME.h"

ClassImp(AliAnalysisTaskDielectronME)

//_________________________________________________________________________________
AliAnalysisTaskDielectronME::AliAnalysisTaskDielectronME() :
  AliAnalysisTaskME(),
  fListDielectron(),
  fListHistos(),
  fListCF(),
  fPoolDepth(2),
  fSelectPhysics(kFALSE),
  fTriggerMask(AliVEvent::kMB),
  fEventStat(0x0)
{
  //
  // Constructor
  //
}

//_________________________________________________________________________________
AliAnalysisTaskDielectronME::AliAnalysisTaskDielectronME(const char *name) :
  AliAnalysisTaskME(name),
  fListDielectron(),
  fListHistos(),
  fListCF(),
  fPoolDepth(2),
  fSelectPhysics(kFALSE),
  fTriggerMask(AliVEvent::kMB),
  fEventStat(0x0)
{
  //
  // Constructor
  //
  DefineInput(0,TChain::Class());
  DefineOutput(1, TList::Class());
  DefineOutput(2, TList::Class());
  DefineOutput(3, TH1D::Class());
  fListHistos.SetName("Dielectron_Histos_Multi");
  fListCF.SetName("Dielectron_CF_Multi");
}


//_________________________________________________________________________________
void AliAnalysisTaskDielectronME::UserCreateOutputObjects()
{
  //
  // Add all histogram manager histogram lists to the output TList
  //

  if (!fListHistos.IsEmpty()||!fListCF.IsEmpty()) return; //already initialised

  TIter nextDie(&fListDielectron);
  AliDielectron *die=0;
  while ( (die=static_cast<AliDielectron*>(nextDie())) ){
    die->Init();
    if (die->GetHistogramList()) fListHistos.Add(const_cast<THashList*>(die->GetHistogramList()));
    if (die->GetCFManagerPair()) fListCF.Add(const_cast<AliCFContainer*>(die->GetCFManagerPair()->GetContainer()));
  }

  Int_t cuts=fListDielectron.GetEntries();
  Int_t nbins=2+2*cuts;
  if (!fEventStat){
    fEventStat=new TH1D("hEventStat","Event statistics",nbins,0,nbins);
    fEventStat->GetXaxis()->SetBinLabel(1,"Before Phys. Sel.");
    fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
    for (Int_t i=0; i<cuts; ++i){
      fEventStat->GetXaxis()->SetBinLabel(3+2*i,Form("#splitline{1 candidate}{%s}",fListDielectron.At(i)->GetName()));
      fEventStat->GetXaxis()->SetBinLabel(4+2*i,Form("#splitline{With >1 candidate}{%s}",fListDielectron.At(i)->GetName()));
    }
  }
  
  PostData(1, &fListHistos);
  PostData(2, &fListCF);
  PostData(3, fEventStat);
}

//_________________________________________________________________________________
void AliAnalysisTaskDielectronME::UserExec(Option_t *)
{
  //
  // Main loop. Called for every event
  //

  if (fListHistos.IsEmpty()&&fListCF.IsEmpty()) return;

  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
  if (!inputHandler) return;

  if ( inputHandler->GetPIDResponse() ){
    AliDielectronVarManager::SetPIDResponse( inputHandler->GetPIDResponse() );
  } else {
    AliFatal("This task needs the PID response attached to the input event handler!");
  }

  // Was event selected ?
  UInt_t isSelected = AliVEvent::kAny;
  if( fSelectPhysics && inputHandler && inputHandler->GetEventSelection() ) {
    isSelected = inputHandler->IsEventSelected();
    isSelected&=fTriggerMask;
  }
  
  //Before physics selection
  fEventStat->Fill(0.);
  if (isSelected==0) {
    PostData(3,fEventStat);
    return;
  }
  //after physics selection
  fEventStat->Fill(1.);
  
  //bz for AliKF
  Double_t bz = GetEvent(0)->GetMagneticField();
  AliKFParticle::SetField( bz );

  //Process event in all AliDielectron instances
  TIter nextDie(&fListDielectron);
  AliDielectron *die=0;
  Int_t idie=0;
  while ( (die=static_cast<AliDielectron*>(nextDie())) ){
    for (Int_t evt1=0; evt1<fPoolDepth-1; evt1++){
      for (Int_t evt2=evt1+1; evt2<fPoolDepth; evt2++){
        die->Process((AliESDEvent*)GetEvent(evt1),(AliESDEvent*)GetEvent(evt2));
        if (die->HasCandidates()){
          Int_t ncandidates=die->GetPairArray(1)->GetEntriesFast();
          if (ncandidates==1) fEventStat->Fill(3+2*idie);
          else if (ncandidates>1) fEventStat->Fill(4+2*idie);
        }
      }
    }
    ++idie;
  }
  
  PostData(1, &fListHistos);
  PostData(2, &fListCF);
  PostData(3,fEventStat);
}

//_________________________________________________________________________________
void AliAnalysisTaskDielectronME::FinishTaskOutput()
{
  //
  // Write debug tree
  //
  TIter nextDie(&fListDielectron);
  AliDielectron *die=0;
  while ( (die=static_cast<AliDielectron*>(nextDie())) ){
    die->SaveDebugTree();
  }
}

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