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

//-------------------------------------------------------------------------
//     Event handler for AOD input 
//     Author: Andreas Morsch, CERN
//-------------------------------------------------------------------------

#include <TSystem.h>
#include <TTree.h>
#include <TList.h>
#include <TNamed.h>
#include <TFile.h>
#include <TH2.h>

#include "AliAODInputHandler.h"
#include "AliAODEvent.h"
#include "AliVCuts.h"
#include "AliMCEvent.h"
#include "AliAODpidUtil.h"
#include "AliAODMCHeader.h"

ClassImp(AliAODInputHandler)

static Option_t *gAODDataType = "AOD";

//______________________________________________________________________________
AliAODInputHandler::AliAODInputHandler() :
    AliInputEventHandler(),
    fEvent(0),
    fMCEvent(0),
    fFriends(0),
    fAODpidUtil(0x0),
    fMergeEvents(kFALSE),
    fMergeTracks(kTRUE), 
    fMergeEMCALClusters(kTRUE), 
    fMergePHOSClusters(kTRUE), 
    fMergeEMCALCells(kTRUE), 
	fMergePHOSCells(kTRUE),	
	fMergeEMCALTrigger(kTRUE), 
	fMergePHOSTrigger(kTRUE),
   fMergeHMPIDrings(kTRUE),
    fFriendsConnected(kFALSE),
    fFileToMerge(0),
    fTreeToMerge(0),
    fAODEventToMerge(0),
    fMergeOffset(0)
{
  // Default constructor
  fHistStatistics[0] = fHistStatistics[1] = NULL;
}

//______________________________________________________________________________
AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
  AliInputEventHandler(name, title),
  fEvent(0),
  fMCEvent(new AliMCEvent()),
  fFriends(new TList()),
  fAODpidUtil(0x0),
  fMergeEvents(kFALSE),
  fMergeTracks(kTRUE), 
  fMergeEMCALClusters(kTRUE), 
  fMergePHOSClusters(kTRUE), 
  fMergeEMCALCells(kTRUE), 
  fMergePHOSCells(kTRUE),
  fMergeEMCALTrigger(kTRUE), 
  fMergePHOSTrigger(kTRUE),
  fMergeHMPIDrings(kTRUE),
  fFriendsConnected(kFALSE),
  fFileToMerge(0),
  fTreeToMerge(0),
  fAODEventToMerge(0),
  fMergeOffset(0)
{
    // Constructor
  fHistStatistics[0] = fHistStatistics[1] = NULL;
}

//______________________________________________________________________________
AliAODInputHandler::~AliAODInputHandler() 
{
// Destructor
  if (fFriends) fFriends->Delete();
  delete fFriends;
  delete fHistStatistics[0];
  delete fHistStatistics[1];
  delete fAODpidUtil;
}

//______________________________________________________________________________
Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
{
    // Initialisation necessary for each new tree
    fTree = tree;
    if (!fTree) return kFALSE;
    fTree->GetEntries();
    ConnectFriends();

    SwitchOffBranches();
    SwitchOnBranches();
    
    // Get pointer to AOD event
    if (!fEvent) fEvent = new AliAODEvent();
    
    fEvent->ReadFromTree(fTree);
    
    if (fMixingHandler) fMixingHandler->Init(tree, opt);
    
    return kTRUE;
}

//______________________________________________________________________________
Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
{
    // Begin event
    static Int_t prevRunNumber = -1;
    if (prevRunNumber != fEvent->GetRunNumber() && NeedField()) {
      fEvent->InitMagneticField();
      prevRunNumber = fEvent->GetRunNumber();
    } 

    AliAODMCHeader* mcHeader  = (AliAODMCHeader*) fEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
    TClonesArray* mcParticles = (TClonesArray*)   (fEvent->FindListObject("mcparticles"));
    
    if (mcParticles && mcHeader) {
      if (!fMCEvent) fMCEvent = new AliMCEvent();
      fMCEvent->SetExternalHeader(mcHeader);
      fMCEvent->SetParticleArray(mcParticles);
    }

    // When merging, get current event number from GetReadEntry(), 
    // entry gives the events in the current file
    if (fTreeToMerge) fTreeToMerge->GetEntry(GetReadEntry() + fMergeOffset);
  
    if (fEventCuts)
      fIsSelectedResult = fEventCuts->GetSelectionMask(fEvent);
    else
      fIsSelectedResult = static_cast<AliVAODHeader*>(fEvent->GetHeader())->GetOfflineTrigger();

    if (fMixingHandler) fMixingHandler->BeginEvent(entry);

    // set transient pointer to event inside tracks
    fEvent->ConnectTracks();

    return kTRUE;
}

//______________________________________________________________________________
Bool_t AliAODInputHandler::Notify(const char* path)
{
  // Notifaction of directory change
  if (fMixingHandler) fMixingHandler->Notify(path);
  if (!fFriendsConnected) {
      ConnectFriends();
      fEvent->ReadFromTree(fTree, "reconnect");
  }
  fFriendsConnected = kFALSE;
  fUserInfo=fTree->GetTree()->GetUserInfo();
    
  TTree *ttree = fTree->GetTree();
  if (!ttree) ttree = fTree;
  TString statFname(ttree->GetCurrentFile()->GetName());
  AliInfo(Form("Moving to file %s", statFname.Data()));
  Int_t indarchive = statFname.Index("#");
  if (indarchive<0) {
     statFname = gSystem->DirName(statFname);
     statFname += "/";
  } else {
     statFname.Remove(indarchive+1);
  }   
  statFname += "EventStat_temp.root";
  TFile *statFile = 0;
  if (IsCheckStatistics()) statFile = TFile::Open(statFname, "READ");
  if (statFile) {
     TList *list = (TList*)statFile->Get("cstatsout");
     if (list) {
        AliVCuts *physSel = (AliVCuts*)list->At(0);
        if (physSel) {
           TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
           TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
           if (fHistStatistics[0] && hAll) {
              TList tmplist;
              tmplist.Add(hAll);
              fHistStatistics[0]->Merge(&tmplist);
              tmplist.Clear();
              tmplist.Add(hBin0);
              if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
           } else {
             if (hAll && hBin0) {
                fHistStatistics[0] = static_cast<TH2F*>(hAll->Clone());
                fHistStatistics[1] = static_cast<TH2F*>(hBin0->Clone());
                fHistStatistics[0]->SetDirectory(0);
                fHistStatistics[1]->SetDirectory(0);
             }   
           }   
        }
        delete list;
     }
     delete statFile;
  }
  return kTRUE;
}

//______________________________________________________________________________
Bool_t AliAODInputHandler::FinishEvent()
{
  // Finish event
  if (fMixingHandler) fMixingHandler->FinishEvent();
  if (fEvent) fEvent->Reset();
  return kTRUE;
}

//______________________________________________________________________________
void AliAODInputHandler::AddFriend(char* filename)
{
    // Add a friend tree 
    TNamed* obj = new TNamed(filename, filename);
    if (!fFriends) fFriends = new TList();
    fFriends->Add(obj);
}

//______________________________________________________________________________
Option_t *AliAODInputHandler::GetDataType() const
{
// Returns handled data type.
   return gAODDataType;
}

//______________________________________________________________________________
TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
{
// Get the statistics histogram(s) from the physics selection object. This
// should be called during FinishTaskOutput(). Option can be empty (default
// statistics histogram) or BIN0.
   TString opt(option);
   opt.ToUpper();
   if (opt=="BIN0") return fHistStatistics[1];
   return fHistStatistics[0];
}   

void AliAODInputHandler::ConnectFriends()
{
    // Connect the friend trees 
    if (!fFriends) return;
    if (!fMergeEvents) {
	TIter next(fFriends);
	TNamed* obj;
	TString aodTreeFName,aodFriendTreeFName;
	TTree *ttree = fTree->GetTree();
	if (!ttree) ttree = fTree;
   if(!ttree->GetCurrentFile()){
     AliWarning("Couldn't get current AOD file, not connecting friends");
     return;
   }
	aodTreeFName = ttree->GetCurrentFile()->GetName();
	
	while((obj = (TNamed*)next())) {
	    aodFriendTreeFName = aodTreeFName;
       if (strlen(GetInputFileName())) aodFriendTreeFName.ReplaceAll(GetInputFileName(),obj->GetName());
	    aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
	    aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
	    ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
	}
    } else {
	// Friends have to be merged
	TNamed* filename = (TNamed*) (fFriends->At(0));
        fFileToMerge = TFile::Open(filename->GetName());
	if (fFileToMerge) {
	    fFileToMerge->GetObject("aodTree", fTreeToMerge);
	    if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
	    fAODEventToMerge->ReadFromTree(fTreeToMerge);
	}
    }
    fFriendsConnected = kTRUE;
}

//______________________________________________________________________________
void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
{
  //
  // create the pid response object if it does not exist yet
  //
  if (fAODpidUtil) return;
  fAODpidUtil=new AliAODpidUtil(isMC);
  
}

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