ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2008, 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.                  *
 **************************************************************************/

/* $Id$ */

/////////////////////////////////////////////////////////////
//
// AliAnalysisTaskSE for the selection of heavy flavor
// decay candidates and creation a stand-alone AOD.
//
// Author: A.Dainese, andrea.dainese@lnl.infn.it
/////////////////////////////////////////////////////////////

#include <TClonesArray.h>

#include "AliAnalysisManager.h"
#include "AliAODHandler.h"
#include "AliAODEvent.h"
#include "AliAODVertex.h"
#include "AliAODTrack.h"
#include "AliAODRecoDecayHF2Prong.h"
#include "AliAnalysisVertexingHF.h"
#include "AliAnalysisTaskSE.h"
#include "AliAnalysisTaskSESelectHF.h"

ClassImp(AliAnalysisTaskSESelectHF)


//________________________________________________________________________
AliAnalysisTaskSESelectHF::AliAnalysisTaskSESelectHF():
AliAnalysisTaskSE(),
fVerticesHFTClArr(0),
fD0toKpiTClArr(0),
fVHF(0)
{
  // Default constructor
}

//________________________________________________________________________
AliAnalysisTaskSESelectHF::AliAnalysisTaskSESelectHF(const char *name):
AliAnalysisTaskSE(name),
fVerticesHFTClArr(0),
fD0toKpiTClArr(0),
fVHF(0)
{
  // Default constructor
}

//________________________________________________________________________
AliAnalysisTaskSESelectHF::~AliAnalysisTaskSESelectHF()
{
  // Destructor

  if (fVHF) {
    delete fVHF;
    fVHF = 0;
  }

}  

//________________________________________________________________________
void AliAnalysisTaskSESelectHF::Init()
{
  // Initialization

  if(fDebug > 1) printf("AnalysisTaskSESelectHF::Init() \n");

  gROOT->LoadMacro("ConfigVertexingHF.C");

  fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");  
  fVHF->PrintStatus();

  return;
}

//________________________________________________________________________
void AliAnalysisTaskSESelectHF::UserCreateOutputObjects()
{
  // Create the output container
  //
  if(fDebug > 1) printf("AnalysisTaskSESelectHF::UserCreateOutputObjects() \n");

  fVerticesHFTClArr = new TClonesArray("AliAODVertex", 0);
  fVerticesHFTClArr->SetName("VerticesHF");
  AddAODBranch("TClonesArray", &fVerticesHFTClArr);

  fD0toKpiTClArr = new TClonesArray("AliAODRecoDecayHF2Prong", 0);
  fD0toKpiTClArr->SetName("D0toKpi");
  AddAODBranch("TClonesArray", &fD0toKpiTClArr);

  return;
}

//________________________________________________________________________
void AliAnalysisTaskSESelectHF::UserExec(Option_t */*option*/)
{
  // Execute analysis for current event:
  // heavy flavor candidates selection and histograms
  
  AliAODEvent *aodIn = dynamic_cast<AliAODEvent*> (InputEvent());

  TClonesArray *inputArrayD0toKpi = 0;

  if(!aodIn && AODEvent() && IsStandardAOD()) {
    // In case there is an AOD handler writing a standard AOD, use the AOD 
    // event in memory rather than the input (ESD) event.    
    aodIn = dynamic_cast<AliAODEvent*> (AODEvent());
    // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
    // have to taken from the AOD event hold by the AliAODExtension
    AliAODHandler* aodHandler = (AliAODHandler*) 
      ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
    if(aodHandler->GetExtensions()) {
      AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
      AliAODEvent *aodFromExt = ext->GetAOD();
      // load D0 candidates                                                   
      inputArrayD0toKpi=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
    }
  } else if(aodIn) {
    // load D0 candidates                                                   
    inputArrayD0toKpi=(TClonesArray*)aodIn->GetList()->FindObject("D0toKpi");
  }

  if(!inputArrayD0toKpi || !aodIn) {
    printf("AliAnalysisTaskSESelectHF::UserExec: D0toKpi branch not found!\n");
    return;
  }

  //print event info
  //aodIn->GetHeader()->Print();
  
  // primary vertex
  AliAODVertex *vtx1 = (AliAODVertex*)aodIn->GetPrimaryVertex();
  //vtx1->Print();
    
  // make trkIDtoEntry register (temporary)
  Int_t trkIDtoEntry[100000];
  for(Int_t it=0;it<aodIn->GetNumberOfTracks();it++) {
    AliAODTrack *track = dynamic_cast<AliAODTrack*>(aodIn->GetTrack(it));
    if(!track) AliFatal("Not a standard AOD");
    trkIDtoEntry[track->GetID()]=it;
  }

  Int_t iOutVerticesHF=0,iOutD0toKpi=0;
  fVerticesHFTClArr->Delete();
  iOutVerticesHF = fVerticesHFTClArr->GetEntriesFast();
  TClonesArray &verticesHFRef = *fVerticesHFTClArr;
  fD0toKpiTClArr->Delete();
  iOutD0toKpi = fD0toKpiTClArr->GetEntriesFast();
  TClonesArray &aodD0toKpiRef = *fD0toKpiTClArr;


  // loop over D0->Kpi candidates
  Int_t nInD0toKpi = inputArrayD0toKpi->GetEntriesFast();
  printf("Number of D0->Kpi: %d\n",nInD0toKpi);
  
  for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
    AliAODRecoDecayHF2Prong *dIn = (AliAODRecoDecayHF2Prong*)inputArrayD0toKpi->UncheckedAt(iD0toKpi);
    Bool_t unsetvtx=kFALSE;
    if(!dIn->GetOwnPrimaryVtx()) {
      dIn->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
      unsetvtx=kTRUE;
    }
    
    //Int_t okD0=0,okD0bar=0; 
    //if(dIn->SelectD0(fVHF->GetD0toKpiCuts(),okD0,okD0bar)) {
      // get daughter AOD tracks
      AliAODTrack *trk0 = (AliAODTrack*)dIn->GetDaughter(0);
      AliAODTrack *trk1 = (AliAODTrack*)dIn->GetDaughter(1);
      if(!trk0 || !trk1) {
	trk0=dynamic_cast<AliAODTrack*>(aodIn->GetTrack(trkIDtoEntry[dIn->GetProngID(0)]));
	trk1=dynamic_cast<AliAODTrack*>(aodIn->GetTrack(trkIDtoEntry[dIn->GetProngID(1)]));
        if(!trk0 || !trk1) AliFatal("Not a standard AOD");
      }
      printf("pt of positive track: %f\n",trk0->Pt());
      printf("pt of negative track: %f\n",trk1->Pt());
      // HERE ONE COULD RECALCULATE THE VERTEX USING THE KF PACKAGE

      // clone candidate for output AOD
      AliAODVertex *v = new(verticesHFRef[iOutVerticesHF++]) 
	AliAODVertex(*(dIn->GetSecondaryVtx()));
      AliAODRecoDecayHF2Prong *dOut=new(aodD0toKpiRef[iOutD0toKpi++]) 
	AliAODRecoDecayHF2Prong(*dIn);
      dOut->SetSecondaryVtx(v);
      dOut->SetOwnPrimaryVtx((AliAODVertex*)((dIn->GetOwnPrimaryVtx())->Clone()));
      v->SetParent(dOut);
    
    
    if(unsetvtx) dIn->UnsetOwnPrimaryVtx();
  } // end loop on D0->Kpi

  printf("Number of selected D0->Kpi: %d\n",iOutD0toKpi);


  return;
}

//________________________________________________________________________
void AliAnalysisTaskSESelectHF::Terminate(Option_t */*option*/)
{
  // Terminate analysis
  //
  if(fDebug > 1) printf("AnalysisTaskSESelectHF: Terminate() \n");
}

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