X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliESDInputHandler.cxx;h=64326efda4a96c2fa6176accfdd6a8f647c459d8;hb=039459364367f289dbf54bad6a559cc83254c4b9;hp=1ba3e8bc5660d4a446c05ba97c676c4cfb0ee9a9;hpb=9b98c4df3e334cd0f49724801e887d783c25553b;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliESDInputHandler.cxx b/STEER/AliESDInputHandler.cxx index 1ba3e8bc566..64326efda4a 100644 --- a/STEER/AliESDInputHandler.cxx +++ b/STEER/AliESDInputHandler.cxx @@ -33,11 +33,13 @@ #include "AliESDInputHandler.h" #include "AliESDEvent.h" +#include "AliESDfriend.h" #include "AliVCuts.h" #include "AliESD.h" #include "AliRunTag.h" #include "AliEventTag.h" #include "AliLog.h" +#include "AliESDpid.h" ClassImp(AliESDInputHandler) @@ -47,6 +49,8 @@ static Option_t *gESDDataType = "ESD"; AliESDInputHandler::AliESDInputHandler() : AliInputEventHandler(), fEvent(0x0), + fFriend(0x0), + fESDpid(0x0), fAnalysisType(0), fNEvents(0), fHLTEvent(0x0), @@ -56,7 +60,10 @@ AliESDInputHandler::AliESDInputHandler() : fUseTags(kFALSE), fChainT(0), fTreeT(0), - fRunTag(0) + fRunTag(0), + fEventTag(0), + fReadFriends(0), + fFriendFileName("AliESDfriends.root") { // default constructor } @@ -65,46 +72,52 @@ AliESDInputHandler::AliESDInputHandler() : AliESDInputHandler::~AliESDInputHandler() { // destructor - // delete fEvent; + if (fRunTag) delete fRunTag; + delete fESDpid; } //______________________________________________________________________________ AliESDInputHandler::AliESDInputHandler(const char* name, const char* title): - AliInputEventHandler(name, title), fEvent(0x0), fAnalysisType(0), - fNEvents(0), fHLTEvent(0x0), fHLTTree(0x0), fUseHLT(kFALSE), fTagCutSumm(0x0), fUseTags(kFALSE), fChainT(0), fTreeT(0), fRunTag(0) + AliInputEventHandler(name, title), fEvent(0x0), fFriend(0x0), fESDpid(0x0), fAnalysisType(0), + fNEvents(0), fHLTEvent(0x0), fHLTTree(0x0), fUseHLT(kFALSE), fTagCutSumm(0x0), fUseTags(kFALSE), fChainT(0), fTreeT(0), fRunTag(0), fEventTag(0), fReadFriends(0), fFriendFileName("AliESDfriends.root") { // Constructor } +//______________________________________________________________________________ Bool_t AliESDInputHandler::Init(TTree* tree, Option_t* opt) { + // // Initialisation necessary for each new tree + // fAnalysisType = opt; - fTree = tree; + fTree = tree; if (!fTree) return kFALSE; - fTree->GetEntry(0); - - // Get pointer to ESD event - SwitchOffBranches(); - SwitchOnBranches(); +// fTree->GetEntry(0); + if (!fEvent) fEvent = new AliESDEvent(); fEvent->ReadFromTree(fTree); fNEvents = fTree->GetEntries(); + if (fMixingHandler) fMixingHandler->Init(tree, opt); return kTRUE; } +//______________________________________________________________________________ Bool_t AliESDInputHandler::BeginEvent(Long64_t entry) { // Copy from old to new format if necessary + static Bool_t called = kFALSE; + if (!called && fEventCuts && IsUserCallSelectionMask()) + AliInfo(Form("The ESD input handler expects that the first task calls AliESDInputHandler::CheckSelectionMask() %s", fEventCuts->ClassName())); AliESD* old = ((AliESDEvent*) fEvent)->GetAliESDOld(); if (old) { - ((AliESDEvent*)fEvent)->CopyFromOldESD(); - old->Reset(); + ((AliESDEvent*)fEvent)->CopyFromOldESD(); + old->Reset(); } if (fHLTTree) { @@ -115,133 +128,178 @@ Bool_t AliESDInputHandler::BeginEvent(Long64_t entry) // // Event selection // - if (fEventCuts) - fIsSelected = fEventCuts->IsSelected((AliESDEvent*)fEvent); + fIsSelectedResult = 0; + if (fEventCuts && !IsUserCallSelectionMask()) + fIsSelectedResult = fEventCuts->GetSelectionMask((AliESDEvent*)fEvent); + // + // Friends + ((AliESDEvent*)fEvent)->SetESDfriend(fFriend); + called = kTRUE; + + if (fMixingHandler) fMixingHandler->BeginEvent(entry); + if (fUseTags && fRunTag) { + fEventTag = 0; + if (entry >= fRunTag->GetNEvents()) { + AliError(Form("Current event %d does not match max range from run tag: 0-%d", (Int_t)entry, fRunTag->GetNEvents())); + return kTRUE; + } + fEventTag = fRunTag->GetEventTag(entry); + } return kTRUE; } +//______________________________________________________________________________ +void AliESDInputHandler::CheckSelectionMask() +{ +// This method can be called by a task only if IsUserCallSelectionMask is true. + if (!fEventCuts || !IsUserCallSelectionMask()) return; + fIsSelectedResult = fEventCuts->GetSelectionMask((AliESDEvent*)fEvent); +} + +//______________________________________________________________________________ Bool_t AliESDInputHandler::FinishEvent() { // Finish the event - if(fEvent)fEvent->Reset(); - return kTRUE; + if(fEvent)fEvent->Reset(); + if (fMixingHandler) fMixingHandler->FinishEvent(); + return kTRUE; } +//______________________________________________________________________________ Bool_t AliESDInputHandler::Notify(const char* path) { - // Notify a directory change - AliInfo(Form("Directory change %s \n", path)); - // - if (fUseHLT) { - // Get HLTesdTree from current file - TTree* cTree = fTree; - if (fTree->GetTree()) cTree = fTree->GetTree(); - TFile* cFile = cTree->GetCurrentFile(); - cFile->GetObject("HLTesdTree", fHLTTree); + // Notify a directory change + static Bool_t firsttime = kFALSE; + AliInfo(Form("Directory change %s \n", path)); + // + // Handle the friends first + // + if (!fTree->FindBranch("ESDfriend.") && fReadFriends) { + // Try to add ESDfriend. branch as friend + TString esdTreeFName, esdFriendTreeFName; + esdTreeFName = (fTree->GetCurrentFile())->GetName(); + esdFriendTreeFName = esdTreeFName; + esdFriendTreeFName.ReplaceAll("AliESDs.root", fFriendFileName.Data()); + TTree* cTree = fTree->GetTree(); + if (!cTree) cTree = fTree; + cTree->AddFriend("esdFriendTree", esdFriendTreeFName.Data()); + cTree->SetBranchStatus("ESDfriend.", 1); + fFriend = (AliESDfriend*)(fEvent->FindListObject("AliESDfriend")); + if (fFriend) cTree->SetBranchAddress("ESDfriend.", &fFriend); + } + // + // + SwitchOffBranches(); + SwitchOnBranches(); + fFriend = (AliESDfriend*)(fEvent->FindListObject("AliESDfriend")); + // + if (fUseHLT) { + // Get HLTesdTree from current file + TTree* cTree = fTree; + if (fTree->GetTree()) cTree = fTree->GetTree(); + TFile* cFile = cTree->GetCurrentFile(); + cFile->GetObject("HLTesdTree", fHLTTree); - if (fHLTTree) { - if (!fHLTEvent) fHLTEvent = new AliESDEvent(); - fHLTEvent->ReadFromTree(fHLTTree); - } - } - - if (!fUseTags) return (kTRUE); - - Bool_t zip = kFALSE; - - TString fileName(path); - if(fileName.Contains("#AliESDs.root")){ - zip = kTRUE; - } - else if (fileName.Contains("AliESDs.root")){ - fileName.ReplaceAll("AliESDs.root", ""); - } - else if(fileName.Contains("#AliAOD.root")){ - zip = kTRUE; - } - else if(fileName.Contains("AliAOD.root")){ - fileName.ReplaceAll("AliAOD.root", ""); - } - else if(fileName.Contains("#galice.root")){ - // For running with galice and kinematics alone... - zip = kTRUE; - } - else if(fileName.Contains("galice.root")){ - // For running with galice and kinematics alone... - fileName.ReplaceAll("galice.root", ""); + if (fHLTTree) { + if (!fHLTEvent) fHLTEvent = new AliESDEvent(); + fHLTEvent->ReadFromTree(fHLTTree); } + } + if (!fUseTags) { + if (fMixingHandler) fMixingHandler->Notify(path); + return kTRUE; + } - TString pathName("./"); - if (fileName.Length() != 0) { - pathName = fileName; - } - - printf("AliESDInputHandler::Notify() Path: %s\n", pathName.Data()); - - if (fRunTag) { - fRunTag->Clear(); - } else { - fRunTag = new AliRunTag(); - } - - delete fTreeT; fTreeT = 0; + Bool_t zip = kFALSE; - if (fChainT) { - delete fChainT; - fChainT = 0; - } - - if (!fChainT) { - fChainT = new TChain("T"); - } + // Setup the base path + TString pathName(path); + Int_t index = pathName.Index("#"); + if (index>=0) { + zip = kTRUE; + pathName = pathName(0,index); + } else { + pathName = gSystem->DirName(pathName); + } + if (fTree->GetCurrentFile()->GetArchive()) zip = kTRUE; + if (pathName.IsNull()) pathName = "./"; + printf("AliESDInputHandler::Notify() Path: %s\n", pathName.Data()); + + if (fRunTag) { + fRunTag->Clear(); + } else { + fRunTag = new AliRunTag(); + } - - - const char* tagPattern = "ESD.tag.root"; - const char* name = 0x0; - TString tagFilename; - if (zip) { - TFile* file = fTree->GetCurrentFile(); - TArchiveFile* arch = file->GetArchive(); - TObjArray* arr = arch->GetMembers(); - TIter next(arr); - - while ((file = (TFile*) next())) { - name = file->GetName(); - if (strstr(name,tagPattern)) { - tagFilename = pathName.Data(); - tagFilename += "#"; - tagFilename += name; - fChainT->Add(tagFilename); - AliInfo(Form("Adding %s to tag chain \n", tagFilename.Data())); - }//pattern check - } // archive file loop - } else { - void * dirp = gSystem->OpenDirectory(pathName.Data()); - while((name = gSystem->GetDirEntry(dirp))) { - if (strstr(name,tagPattern)) { - tagFilename = pathName.Data(); - tagFilename += "/"; - tagFilename += name; - fChainT->Add(tagFilename); - AliInfo(Form("Adding %s to tag chain \n", tagFilename.Data())); - }//pattern check - }//directory loop - } - fChainT->SetBranchAddress("AliTAG",&fRunTag); - fChainT->GetEntry(0); + const char* tagPattern = "ESD.tag.root"; + TString sname; + TString tagFilename; + if (zip) { + TObjArray* arr = fTree->GetCurrentFile()->GetArchive()->GetMembers(); + TIter next(arr); + TObject *objarchive; + while ((objarchive = next())) { + sname = objarchive->GetName(); + if (sname.Contains(tagPattern)) { + tagFilename = pathName; + if (index>=0) tagFilename += "#"; + else tagFilename += "/"; + tagFilename += sname; + AliInfo(Form("Tag file found: %s\n", tagFilename.Data())); + break; // There should be only one such file in the archive + }//pattern check + } // archive file loop + } else { + void * dirp = gSystem->OpenDirectory(pathName.Data()); + while(1) { + sname = gSystem->GetDirEntry(dirp); + if (sname.IsNull()) break; + if (sname.Contains(tagPattern)) { + tagFilename = pathName; + tagFilename += "/"; + tagFilename += sname; + AliInfo(Form("Tag file found: %s\n", tagFilename.Data())); + break; + }//pattern check + }//directory loop + gSystem->FreeDirectory(dirp); + } + if (tagFilename.IsNull()) { + if (firsttime) AliWarning(Form("Tag file not found in directory: %s", pathName.Data())); + firsttime = kFALSE; + delete fRunTag; fRunTag = 0; return kTRUE; + } + TFile *tagfile = TFile::Open(tagFilename); + if (!tagfile) { + AliError(Form("Cannot open tag file: %s", tagFilename.Data())); + delete fRunTag; fRunTag = 0; + return kTRUE; + } + fTreeT = (TTree*)tagfile->Get("T"); // file is the owner + if (!fTreeT) { + AliError(Form("Cannot get tree of tags from file: %s", tagFilename.Data())); + delete fRunTag; fRunTag = 0; + return kTRUE; + } + + fTreeT->SetBranchAddress("AliTAG",&fRunTag); + fTreeT->GetEntry(0); + delete tagfile; + // Notify the mixing handler after the tags are loaded + if (fMixingHandler) fMixingHandler->Notify(path); + return kTRUE; } - - +//______________________________________________________________________________ Option_t *AliESDInputHandler::GetDataType() const { // Returns handled data type. return gESDDataType; } +//______________________________________________________________________________ Int_t AliESDInputHandler::GetNEventAcceptedInFile() { // Get number of events in file accepted by the tag cuts @@ -280,6 +338,8 @@ Int_t AliESDInputHandler::GetNEventAcceptedInFile() return iAcc; } + +//______________________________________________________________________________ Int_t AliESDInputHandler::GetNEventRejectedInFile() { // Get number of events in file rejected by the tag cuts @@ -319,7 +379,9 @@ Int_t AliESDInputHandler::GetNEventRejectedInFile() return iRej; } -Bool_t AliESDInputHandler::GetCutSummaryForChain(Int_t *aTotal, Int_t *aAccepted, Int_t *aRejected) + +//______________________________________________________________________________ +Bool_t AliESDInputHandler::GetCutSummaryForChain(Int_t *aTotal, Int_t *aAccepted, Int_t *aRejected) { // Get number of events in the full chain // Count accepted and rejected events @@ -354,6 +416,7 @@ Bool_t AliESDInputHandler::GetCutSummaryForChain(Int_t *aTotal, Int_t *aAccepted Int_t iAcc = atoi(strtok(iTagInfo, ",")); Int_t iRej = atoi(strtok(NULL, ",")); + free(iTagInfo); iAccList += iAcc; iRejList += iRej; @@ -367,6 +430,7 @@ Bool_t AliESDInputHandler::GetCutSummaryForChain(Int_t *aTotal, Int_t *aAccepted return kTRUE; } +//______________________________________________________________________________ Int_t AliESDInputHandler::GetNFilesEmpty() { // Count number of files in which all events were de-selected @@ -402,7 +466,7 @@ Int_t AliESDInputHandler::GetNFilesEmpty() Int_t iAcc = atoi(strtok(iTagInfo, ",")); Int_t iRej = atoi(strtok(NULL, ",")); - + free(iTagInfo); if ((iAcc == 0) && ((iRej+iAcc)>0)) iFilesEmpty++; } @@ -410,3 +474,28 @@ Int_t AliESDInputHandler::GetNFilesEmpty() return iFilesEmpty; } + +//______________________________________________________________________________ +TObject *AliESDInputHandler::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. + if (!fEventCuts) return NULL; + TString opt(option); + opt.ToUpper(); + if (opt=="BIN0") return fEventCuts->GetStatistics("BIN0"); + else return fEventCuts->GetStatistics("ALL"); +} + +//______________________________________________________________________________ +void AliESDInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/) +{ + // + // create the pid response object if it does not exist yet + // + if (fESDpid) return; + fESDpid=new AliESDpid(isMC); + +} +