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                            //
//                      for Dielectron Analysis                          //
//                                                                       //
///////////////////////////////////////////////////////////////////////////

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

#include <AliCFContainer.h>
#include <AliVEvent.h>
#include <AliInputEventHandler.h>
#include <AliESDInputHandler.h>
#include <AliAnalysisManager.h>
#include <AliAODInputHandler.h>
#include <AliTriggerAnalysis.h>

#include "AliDielectron.h"
#include "AliDielectronHistos.h"
#include "AliDielectronCF.h"
#include "AliAnalysisTaskDielectronSE.h"

ClassImp(AliAnalysisTaskDielectronSE)

//_________________________________________________________________________________
AliAnalysisTaskDielectronSE::AliAnalysisTaskDielectronSE() :
  AliAnalysisTaskSE(),
  fDielectron(0),
  fSelectPhysics(kFALSE),
  fTriggerMask(AliVEvent::kMB),
  fTriggerOnV0AND(kFALSE),
  fRejectPileup(kFALSE),
  fTriggerAnalysis(0x0),
  fEventFilter(0x0),
  fEventStat(0x0)
{
  //
  // Constructor
  //
}

//_________________________________________________________________________________
AliAnalysisTaskDielectronSE::AliAnalysisTaskDielectronSE(const char *name) :
  AliAnalysisTaskSE(name),
  fDielectron(0),
  fSelectPhysics(kFALSE),
  fTriggerMask(AliVEvent::kMB),
  fTriggerOnV0AND(kFALSE),
  fRejectPileup(kFALSE),
  fTriggerAnalysis(0x0),
  fEventFilter(0x0),
  fEventStat(0x0)
{
  //
  // Constructor
  //
  DefineInput(0,TChain::Class());
  DefineOutput(1, THashList::Class());
  DefineOutput(2, AliCFContainer::Class());
  DefineOutput(3, TH1D::Class());
}

//_________________________________________________________________________________
void AliAnalysisTaskDielectronSE::UserCreateOutputObjects()
{
  //
  // Initialise the framework objects
  //
  if (!fDielectron){
    AliError("No Dielectron framework object set !!!");
    return;
  }
  fDielectron->Init();
  if (fDielectron->GetHistogramList()){
    PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
  }
  if (fDielectron->GetCFManagerPair()){
    PostData(2, const_cast<AliCFContainer*>(fDielectron->GetCFManagerPair()->GetContainer()));
  }
  
  if (!fEventStat){
    fEventStat=new TH1D("hEventStat","Event statistics",5,0,5);
    fEventStat->GetXaxis()->SetBinLabel(1,"Before Phys. Sel.");
    fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
  }
  Int_t nbins=kNbinsEvent+2;
  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.");

    //default names
    fEventStat->GetXaxis()->SetBinLabel(3,"Bin3 not used");
    fEventStat->GetXaxis()->SetBinLabel(4,"Bin4 not used");
    fEventStat->GetXaxis()->SetBinLabel(5,"Bin5 not used");

    if(fTriggerOnV0AND) fEventStat->GetXaxis()->SetBinLabel(3,"V0and triggers");
    if (fEventFilter) fEventStat->GetXaxis()->SetBinLabel(4,"After Event Filter");
    if (fRejectPileup) fEventStat->GetXaxis()->SetBinLabel(5,"After Pileup rejection");

    fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+1),Form("#splitline{1 candidate}{%s}",fDielectron->GetName()));
    fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+2),Form("#splitline{With >1 candidate}{%s}",fDielectron->GetName()));

  }

  if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
  fTriggerAnalysis->EnableHistograms();
  fTriggerAnalysis->SetAnalyzeMC(AliDielectronMC::Instance()->HasMC());
  
  PostData(3,fEventStat);
  
}

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

  if (!fDielectron) return;
  
  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
  Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class();
  Bool_t isAOD=man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();

  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){
  if((isESD && inputHandler->GetEventSelection()) || isAOD){
      isSelected = inputHandler->IsEventSelected();
      isSelected&=fTriggerMask;
      }
   }


  //Before physics selection
  fEventStat->Fill(kAllEvents);
  if (isSelected==0) {
    PostData(3,fEventStat);
    return;
  }
  //after physics selection
  fEventStat->Fill(kSelectedEvents);

  //V0and
  if(fTriggerOnV0AND){
  if(isESD){if (!fTriggerAnalysis->IsOfflineTriggerFired(static_cast<AliESDEvent*>(InputEvent()), AliTriggerAnalysis::kV0AND))
            return;}
  if(isAOD){if(!((static_cast<AliAODEvent*>(InputEvent()))->GetVZEROData()->GetV0ADecision() == AliVVZERO::kV0BB &&
            (static_cast<AliAODEvent*>(InputEvent()))->GetVZEROData()->GetV0CDecision() == AliVVZERO::kV0BB) )
            return;}
   }


  fEventStat->Fill(kV0andEvents);

  //Fill Event histograms before the event filter
  Double_t values[AliDielectronVarManager::kNMaxValues]={0};
  Double_t valuesMC[AliDielectronVarManager::kNMaxValues]={0};
  AliDielectronVarManager::Fill(InputEvent(),values);
  Bool_t hasMC=AliDielectronMC::Instance()->HasMC();
  if (hasMC) {
    if (AliDielectronMC::Instance()->ConnectMCEvent())
      AliDielectronVarManager::Fill(AliDielectronMC::Instance()->GetMCEvent(),valuesMC);
  }
  
  AliDielectronHistos *h=fDielectron->GetHistoManager();
  if (h){
    if (h->GetHistogramList()->FindObject("Event_noCuts"))
      h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,values);
    if (hasMC && h->GetHistogramList()->FindObject("MCEvent_noCuts"))
      h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,valuesMC);
  }
  
  //event filter
  if (fEventFilter) {
    if (!fEventFilter->IsSelected(InputEvent())) return;
  }
  fEventStat->Fill(kFilteredEvents);
  
  //pileup
  if (fRejectPileup){
    if (InputEvent()->IsPileupFromSPD(3,0.8,3.,2.,5.)) return;
  }
  fEventStat->Fill(kPileupEvents);
  
  //bz for AliKF
  Double_t bz = InputEvent()->GetMagneticField();
  AliKFParticle::SetField( bz );

  // make an artificial shift in the electron nsigma. Configured in the Config file
  AliDielectronPID::SetCorrVal((Double_t)InputEvent()->GetRunNumber());

  //
  // Actual data processing
  //
  fDielectron->Process(InputEvent());

  //statistics for number of selected candidates
  Int_t ncandidates=fDielectron->GetPairArray(1)->GetEntriesFast();
  if (ncandidates==1) fEventStat->Fill((kNbinsEvent));
  else if (ncandidates>1) fEventStat->Fill((kNbinsEvent+1));

  //Publish the data
  if (fDielectron->GetHistogramList()){
    PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
  }
  if (fDielectron->GetCFManagerPair()){
    PostData(2, const_cast<AliCFContainer*>(fDielectron->GetCFManagerPair()->GetContainer()));
  }
  PostData(3,fEventStat);
}

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