**************************************************************************/
/* $Id$ */
-
+#include <Riostream.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TInterpreter.h>
#include <TChain.h>
#include <TFile.h>
+#include <TList.h>
#include <TH1.h>
#include "AliAnalysisTaskJets.h"
#include "AliAnalysisManager.h"
#include "AliJetFinder.h"
+#include "AliJetHeader.h"
+#include "AliJetReader.h"
+#include "AliJetReaderHeader.h"
+#include "AliJetHistos.h"
#include "AliESDEvent.h"
+#include "AliESD.h"
#include "AliAODEvent.h"
+#include "AliAODJetEventBackground.h"
#include "AliAODHandler.h"
#include "AliMCEventHandler.h"
+#include "AliESDInputHandler.h"
+#include "AliMCEvent.h"
#include "AliStack.h"
////////////////////////////////////////////////////////////////////////
AliAnalysisTaskJets::AliAnalysisTaskJets():
- fDebug(0),
- fJetFinder(0x0),
- fChain(0x0),
- fESD(0x0),
- fAOD(0x0),
- fTreeA(0x0),
- fHisto(0x0)
+ AliAnalysisTaskSE(),
+ fConfigFile("ConfigJetAnalysis.C"),
+ fNonStdBranch(""),
+ fNonStdFile(""),
+ fJetFinder(0x0),
+ fHistos(0x0),
+ fAODExtension(0x0),
+ fListOfHistos(0x0),
+ fChain(0x0),
+ fOpt(0),
+ fReadAODFromOutput(0),
+ fFilterPt(0.)
{
// Default constructor
}
AliAnalysisTaskJets::AliAnalysisTaskJets(const char* name):
- AliAnalysisTask(name, "AnalysisTaskJets"),
- fDebug(0),
- fJetFinder(0x0),
- fChain(0x0),
- fESD(0x0),
- fAOD(0x0),
- fTreeA(0x0),
- fHisto(0x0)
+ AliAnalysisTaskSE(name),
+ fConfigFile("ConfigJetAnalysis.C"),
+ fNonStdBranch(""),
+ fNonStdFile(""),
+ fJetFinder(0x0),
+ fHistos(0x0),
+ fAODExtension(0x0),
+ fListOfHistos(0x0),
+ fChain(0x0),
+ fOpt(0),
+ fReadAODFromOutput(0),
+ fFilterPt(0.)
{
// Default constructor
- DefineInput (0, TChain::Class());
- DefineOutput(0, TTree::Class());
- DefineOutput(1, TH1F::Class());
+ DefineOutput(1, TList::Class());
}
-void AliAnalysisTaskJets::CreateOutputObjects()
+AliAnalysisTaskJets::AliAnalysisTaskJets(const char* name, TChain* chain):
+ AliAnalysisTaskSE(name),
+ fConfigFile("ConfigJetAnalysis.C"),
+ fNonStdBranch(""),
+ fNonStdFile(""),
+ fJetFinder(0x0),
+ fHistos(0x0),
+ fAODExtension(0x0),
+ fListOfHistos(0x0),
+ fChain(chain),
+ fOpt(0),
+ fReadAODFromOutput(0),
+ fFilterPt(0.)
{
-// Create the output container
-//
-// Default AOD
- if (fDebug > 1) printf("AnalysisTaskJets::CreateOutPutData() \n");
- AliAODHandler* handler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
-
- fAOD = handler->GetAOD();
- fTreeA = handler->GetTree();
- fJetFinder->ConnectAOD(fAOD);
-//
-// Histogram
- OpenFile(1);
- fHisto = new TH1F("fHisto", "Jet Et", 100, 0., 100.);
-
+ // Default constructor
+ DefineOutput(1, TList::Class());
}
-void AliAnalysisTaskJets::Init()
+//----------------------------------------------------------------
+void AliAnalysisTaskJets::UserCreateOutputObjects()
{
- // Initialization
- if (fDebug > 1) printf("AnalysisTaskJets::Init() \n");
+ // Create the output container
+ //
+ if (fDebug > 1) printf("AnalysisTaskJets::CreateOutPutData() \n");
- // Call configuration file
- gROOT->LoadMacro("ConfigJetAnalysis.C");
- fJetFinder = (AliJetFinder*) gInterpreter->ProcessLine("ConfigJetAnalysis()");
- // Initialise Jet Analysis
- fJetFinder->Init();
- // Write header information to local file
- fJetFinder->WriteHeaders();
+ if(fNonStdBranch.Length()==0)
+ {
+ // Connec default AOD to jet finder
+ // create a new branch for the background
+ if(!AODEvent()->FindListObject(AliAODJetEventBackground::StdBranchName())){
+ AliAODJetEventBackground* evBkg = new AliAODJetEventBackground();
+ evBkg->SetName(AliAODJetEventBackground::StdBranchName());
+ AddAODBranch("AliAODJetEventBackground",&evBkg);
+ }
+ fJetFinder->ConnectAOD(AODEvent());
+ }
+ else
+ {
+ // Create a new branch for jets...
+ // how is this reset? -> cleared in the UserExec....
+ // Can this be handled by the framework?
+ // here we can also have the case that the brnaches are written to a separate file
+
+ TClonesArray *tca = new TClonesArray("AliAODJet", 0);
+ tca->SetName(fNonStdBranch.Data());
+ AddAODBranch("TClonesArray",&tca,fNonStdFile.Data());
+ if(!AODEvent() || !AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()))){
+ AliAODJetEventBackground* evBkg = new AliAODJetEventBackground();
+ evBkg->SetName(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()));
+ AddAODBranch("AliAODJetEventBackground",&evBkg,fNonStdFile.Data());
+ }
+
+ if(fNonStdFile.Length()!=0){
+ //
+ // case that we have an AOD extension we need to fetch the jets from the extended output
+ // we identifay the extension aod event by looking for the branchname
+ AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
+ fAODExtension = 0;
+ if(aodH){
+ TObjArray* extArray = aodH->GetExtensions();
+ if (extArray) {
+ TIter next(extArray);
+ while ((fAODExtension=(AliAODExtension*)next())){
+ TObject *obj = fAODExtension->GetAOD()->FindListObject(fNonStdBranch.Data());
+ if(fDebug>10){
+ Printf("%s:%d Dumping..",(char*)__FILE__,__LINE__);
+ fAODExtension->GetAOD()->Dump();
+ }
+ if(obj){
+ if(fDebug>1)Printf("AODExtension found for %s",fNonStdBranch.Data());
+ break;
+ }
+ fAODExtension = 0;
+ }
+ }
+ }
+ if(fAODExtension)fJetFinder->ConnectAODNonStd(fAODExtension->GetAOD(), fNonStdBranch.Data());
+ }
+ else{
+ if (fDebug > 1) printf("Connecting Non Std Branch AOD %p %s \n",AODEvent(),fNonStdBranch.Data());
+ fJetFinder->ConnectAODNonStd(AODEvent(), fNonStdBranch.Data());
+ }
+ }
+
+ // do not add the histograms in the directory
+ // all handled by the list
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
+
+ // Histograms
+ fListOfHistos = new TList();
+ fHistos = new AliJetHistos();
+ fHistos->AddHistosToList(fListOfHistos);
+
+ // Add the JetFinderInformation to the Outputlist
+ AliJetHeader *fH = fJetFinder->GetHeader();
+
+ // Compose a characteristic output name
+ // with the name of the output branch
+ if(fH) {
+ if(fNonStdBranch.Length()==0) {
+ fH->SetName("AliJetHeader_jets");
+ }
+ else {
+ fH->SetName(Form("AliJetHeader_%s",fNonStdBranch.Data()));
+ }
+ }
+
+ TH1::AddDirectory(oldStatus);
+
+
+ if(!fAODExtension)OutputTree()->GetUserInfo()->Add(fH);
+ else fAODExtension->GetTree()->GetUserInfo()->Add(fH);
}
-void AliAnalysisTaskJets::ConnectInputData(Option_t */*option*/)
+//----------------------------------------------------------------
+void AliAnalysisTaskJets::Init()
{
-// Connect the input data
- if (fDebug > 1) printf("AnalysisTaskJets::ConnectInputData() \n");
- fChain = (TChain*)GetInputData(0);
- fESD = new AliESDEvent();
- fESD->ReadFromTree(fChain);
-
- AliMCEventHandler* mcTruth = (AliMCEventHandler*)
- ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
+ // Initialization
+ if (fDebug > 1) printf("AnalysisTaskJets::Init() \n");
+
+ // Call configuration file
+ if (fConfigFile.Length()) {
+ gROOT->LoadMacro(fConfigFile);
+ fJetFinder = (AliJetFinder*) gInterpreter->ProcessLine("ConfigJetAnalysis()");
+ }
+ AliJetReaderHeader *header = (AliJetReaderHeader*)fJetFinder->GetReader()->GetReaderHeader();
+ fOpt = header->GetDetector();
- fJetFinder->GetReader()->SetInputEvent(fESD, fAOD, mcTruth);
+ // Initialise Jet Analysis
+ if(fOpt == 0) fJetFinder->Init();
+ else fJetFinder->InitTask(fChain); // V2
}
-void AliAnalysisTaskJets::Exec(Option_t */*option*/)
+
+//----------------------------------------------------------------
+void AliAnalysisTaskJets::UserExec(Option_t */*option*/)
{
-// Execute analysis for current event
-//
- AliMCEventHandler* mctruth = (AliMCEventHandler*)
- ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
- if (mctruth) {
- AliStack* stack = mctruth->Stack();
- printf("AliAnalysisTaskJets: Number of tracks on stack %5d\n", stack->GetNtrack());
- }
-
- AliESD* old = fESD->GetAliESDOld();
- if (old) {
- fESD->CopyFromOldESD();
+ // Execute analysis for current event
+ //
+ // Fill control histos
+ TClonesArray* jarray = 0;
+ AliAODJetEventBackground* evBkg = 0;
+
+ // only need this once
+ static AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
+
+ if(fNonStdBranch.Length()==0) {
+ jarray = AODEvent()->GetJets();
+ evBkg = (AliAODJetEventBackground*)(AODEvent()->FindListObject(AliAODJetEventBackground::StdBranchName()));
+ evBkg->Reset();
+ }
+ else {
+ if(AODEvent())jarray = (TClonesArray*)(AODEvent()->FindListObject(fNonStdBranch.Data()));
+ if(!jarray)jarray = (TClonesArray*)(fAODExtension->GetAOD()->FindListObject(fNonStdBranch.Data()));
+ if(jarray)jarray->Delete(); // this is our responsibility, clear before filling again
+ if(AODEvent())evBkg = (AliAODJetEventBackground*)(AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data())));
+ if(!evBkg) evBkg = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data())));
+ if(evBkg)evBkg->Reset();
+ }
+
+ if (dynamic_cast<AliAODEvent*>(InputEvent()) != 0 && !fReadAODFromOutput) {
+// AOD is input event..........................................V
+ fJetFinder->GetReader()->SetInputEvent(InputEvent(), InputEvent(), MCEvent());
+ } else {
+// AOD is read from output ....................................V
+ fJetFinder->GetReader()->SetInputEvent(InputEvent(), AODEvent(), MCEvent());
+ }
+
+
+
+ if(fOpt==0) fJetFinder->ProcessEvent();
+ else fJetFinder->ProcessEvent2(); // V2
+
+ // Fill control histos
+ if(jarray)fHistos->FillHistos(jarray);
+
+
+ if(aodH&&fFilterPt>0){
+ if(jarray->GetEntries()>0){
+ AliAODJet *jet = (AliAODJet*)jarray->At(0);
+ if(jet->Pt()>fFilterPt){
+ // aodH->EnableFillAODforEvent();
+ aodH->SetFillAOD(kTRUE);
+ }
}
-
- Long64_t ientry = fChain->GetReadEntry();
- if (fDebug > 1) printf("Analysing event # %5d\n", (Int_t) ientry);
- fJetFinder->ProcessEvent(ientry);
- PostData(0, fTreeA);
- PostData(1, fHisto);
+ }
+
+ // Post the data
+ PostData(1, fListOfHistos);
+ return;
}
+
+//*************************************************************
+
void AliAnalysisTaskJets::Terminate(Option_t */*option*/)
{
// Terminate analysis
//
if (fDebug > 1) printf("AnalysisJets: Terminate() \n");
- // if (fJetFinder) fJetFinder->FinishRun();
+// if (fJetFinder) fJetFinder->FinishRun();
}