#include "AliAnalysisDataSlot.h"
#include "AliESDEvent.h"
+#include "AliESDfriend.h"
#include "AliESD.h"
#include "AliAODEvent.h"
#include "AliAODHeader.h"
#include "AliAODInputHandler.h"
#include "AliMCEventHandler.h"
#include "AliInputEventHandler.h"
+#include "AliMultiInputEventHandler.h"
+#include "AliESDInputHandler.h"
#include "AliMCEvent.h"
#include "AliStack.h"
#include "AliLog.h"
+#include "AliAODDimuon.h"
ClassImp(AliAnalysisTaskSE)
AliAODTracklets* AliAnalysisTaskSE::fgAODTracklets = NULL;
AliAODCaloCells* AliAnalysisTaskSE::fgAODEmcalCells = NULL;
AliAODCaloCells* AliAnalysisTaskSE::fgAODPhosCells = NULL;
+TClonesArray* AliAnalysisTaskSE::fgAODDimuons = NULL;
AliAnalysisTaskSE::AliAnalysisTaskSE():
AliAnalysisTask(),
fDebug(0),
fEntry(0),
fInputEvent(0x0),
+ fESDfriend(0x0),
fInputHandler(0x0),
fOutputAOD(0x0),
fMCEvent(0x0),
fTreeA(0x0),
fCurrentRunNumber(-1),
fHistosQA(0x0),
- fSelectCollisions(0)
+ fOfflineTriggerMask(0),
+ fMultiInputHandler(0),
+ fMCEventHandler(0)
{
// Default constructor
}
fDebug(0),
fEntry(0),
fInputEvent(0x0),
+ fESDfriend(0x0),
fInputHandler(0x0),
fOutputAOD(0x0),
fMCEvent(0x0),
fTreeA(0x0),
fCurrentRunNumber(-1),
fHistosQA(0x0),
- fSelectCollisions(0)
+ fOfflineTriggerMask(0),
+ fMultiInputHandler(0),
+ fMCEventHandler(0)
{
// Default constructor
DefineInput (0, TChain::Class());
fDebug(0),
fEntry(0),
fInputEvent(0x0),
+ fESDfriend(0x0),
fInputHandler(0x0),
fOutputAOD(0x0),
fMCEvent(0x0),
fTreeA(0x0),
fCurrentRunNumber(-1),
fHistosQA(0x0),
- fSelectCollisions(0)
+ fOfflineTriggerMask(0),
+ fMultiInputHandler(obj.fMultiInputHandler),
+ fMCEventHandler(obj.fMCEventHandler)
{
// Copy constructor
fDebug = obj.fDebug;
fEntry = obj.fEntry;
fInputEvent = obj.fInputEvent;
+ fESDfriend = obj.fESDfriend;
fInputHandler = obj.fInputHandler;
fOutputAOD = obj.fOutputAOD;
fMCEvent = obj.fMCEvent;
fDebug = other.fDebug;
fEntry = other.fEntry;
fInputEvent = other.fInputEvent;
+ fESDfriend = other.fESDfriend;
fInputHandler = other.fInputHandler;
fOutputAOD = other.fOutputAOD;
fMCEvent = other.fMCEvent;
fTreeA = other.fTreeA;
fCurrentRunNumber = other.fCurrentRunNumber;
fHistosQA = other.fHistosQA;
- fSelectCollisions = other.fSelectCollisions;
+ fOfflineTriggerMask = other.fOfflineTriggerMask;
+ fMultiInputHandler = other.fMultiInputHandler;
+ fMCEventHandler = other.fMCEventHandler;
return *this;
}
{
// Connect the input data
if (fDebug > 1) printf("AnalysisTaskSE::ConnectInputData() \n");
-//
-// ESD
-//
- fInputHandler = (AliInputEventHandler*)
- ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
-//
-// Monte Carlo
-//
- AliMCEventHandler* mcH = 0;
- mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
- if (mcH) {
- fMCEvent = mcH->MCEvent();
- }
-
+
+ // Connect input handlers (multi input handler is handled)
+ ConnectMultiHandler();
+
if (fInputHandler) {
- fInputEvent = fInputHandler->GetEvent();
+ if ((fInputHandler->GetTree())->GetBranch("ESDfriend."))
+ fESDfriend = ((AliESDInputHandler*)fInputHandler)->GetESDfriend();
+
+ fInputEvent = fInputHandler->GetEvent();
} else if( fMCEvent ) {
AliWarning("No Input Event Handler connected, only MC Truth Event Handler") ;
} else {
AliError("No Input Event Handler connected") ;
return ;
}
+ // Disconnect multi handler
+ DisconnectMultiHandler();
}
void AliAnalysisTaskSE::CreateOutputObjects()
// Default AOD
if (fDebug > 1) printf("AnalysisTaskSE::CreateOutPutData() \n");
- AliAODHandler* handler = (AliAODHandler*)
+ AliAODHandler* handler = dynamic_cast<AliAODHandler*>
((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
Bool_t merging = kFALSE;
fgAODMCParticles->SetName("mcparticles");
handler->AddBranch("TClonesArray", &fgAODMCParticles);
}
+ if ((handler->NeedsDimuonsBranchReplication() || merging) && !(fgAODDimuons))
+ {
+ if (fDebug > 1) AliInfo("Replicating dimuon branch\n");
+ fgAODDimuons = new TClonesArray("AliAODDimuon",0);
+ fgAODDimuons->SetName("dimuons");
+ handler->AddBranch("TClonesArray", &fgAODDimuons);
+ }
+
// cache the pointerd in the AODEvent
fOutputAOD->GetStdContent();
}
- } else {
- AliWarning("No AOD Event Handler connected.") ;
}
UserCreateOutputObjects();
}
{
//
// Exec analysis of one event
+
+ ConnectMultiHandler();
+
+ if ( fDebug >= 10)
+ printf("Task is active %5d\n", IsActive());
+
if (fDebug > 1) AliInfo("AliAnalysisTaskSE::Exec() \n");
+//
+ AliAODHandler* handler = dynamic_cast<AliAODHandler*>
+ ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
+
+ AliAODInputHandler* aodH = dynamic_cast<AliAODInputHandler*>(fInputHandler);
+//
+// Was event selected ? If no event selection mechanism, the event SHOULD be selected (AG)
+ UInt_t isSelected = AliVEvent::kAny;
+ if( fInputHandler && fInputHandler->GetEventSelection()) {
+ // Get the actual offline trigger mask for the event and AND it with the
+ // requested mask. If no mask requested select by default the event.
+ if (fOfflineTriggerMask)
+ isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
+ }
+// Functionality below moved in the filter tasks (AG)
+// if (handler) handler->SetFillAOD(isSelected);
- Bool_t isSelected = kTRUE;
if( fInputHandler ) {
- isSelected = fInputHandler->IsEventSelected();
- fEntry = fInputHandler->GetReadEntry();
+ fEntry = fInputHandler->GetReadEntry();
+ fESDfriend = ((AliESDInputHandler*)fInputHandler)->GetESDfriend();
}
+
// Notify the change of run number
- if (InputEvent()->GetRunNumber() != fCurrentRunNumber) {
+ if (InputEvent() && (InputEvent()->GetRunNumber() != fCurrentRunNumber)) {
fCurrentRunNumber = InputEvent()->GetRunNumber();
NotifyRun();
}
if ( !((Entry()-1)%100) && fDebug > 0)
AliInfo(Form("%s ----> Processing event # %lld", CurrentFileName(), Entry()));
- AliAODHandler* handler = (AliAODHandler*)
- ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
- AliAODInputHandler* aodH = dynamic_cast<AliAODInputHandler*>(fInputHandler);
+
+
if (handler && aodH) {
fMCEvent = aodH->MCEvent();
Bool_t merging = aodH->GetMergeEvents();
-
- if (!(handler->IsStandard()) && !(handler->AODIsReplicated())) {
+ AliAODEvent* aod = dynamic_cast<AliAODEvent*>(InputEvent());
+
+ if (aod && !(handler->IsStandard()) && !(handler->AODIsReplicated())) {
if ((handler->NeedsHeaderReplication()) && (fgAODHeader))
{
// copy the contents by assigment
- *fgAODHeader = *(dynamic_cast<AliAODHeader*>(InputEvent()->GetHeader()));
+ *fgAODHeader = *(aod->GetHeader());
}
if ((handler->NeedsTracksBranchReplication() || merging) && (fgAODTracks))
{
- TClonesArray* tracks = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetTracks();
+ TClonesArray* tracks = aod->GetTracks();
new (fgAODTracks) TClonesArray(*tracks);
}
if ((handler->NeedsVerticesBranchReplication() || merging) && (fgAODVertices))
{
- TClonesArray* vertices = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetVertices();
+ TClonesArray* vertices = aod->GetVertices();
new (fgAODVertices) TClonesArray(*vertices);
}
if ((handler->NeedsV0sBranchReplication()) && (fgAODV0s))
{
- TClonesArray* v0s = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetV0s();
+ TClonesArray* v0s = aod->GetV0s();
new (fgAODV0s) TClonesArray(*v0s);
}
if ((handler->NeedsTrackletsBranchReplication()) && (fgAODTracklets))
{
- *fgAODTracklets = *(dynamic_cast<AliAODEvent*>(InputEvent()))->GetTracklets();
+ *fgAODTracklets = *aod->GetTracklets();
}
if ((handler->NeedsPMDClustersBranchReplication()) && (fgAODPMDClusters))
{
- TClonesArray* pmdClusters = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetPmdClusters();
+ TClonesArray* pmdClusters = aod->GetPmdClusters();
new (fgAODPMDClusters) TClonesArray(*pmdClusters);
}
if ((handler->NeedsJetsBranchReplication() || merging) && (fgAODJets))
{
- TClonesArray* jets = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetJets();
+ TClonesArray* jets = aod->GetJets();
new (fgAODJets) TClonesArray(*jets);
}
if ((handler->NeedsFMDClustersBranchReplication()) && (fgAODFMDClusters))
{
- TClonesArray* fmdClusters = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetFmdClusters();
+ TClonesArray* fmdClusters = aod->GetFmdClusters();
new (fgAODFMDClusters) TClonesArray(*fmdClusters);
}
if ((handler->NeedsCaloClustersBranchReplication() || merging) && (fgAODCaloClusters))
{
- TClonesArray* caloClusters = (dynamic_cast<AliAODEvent*>(InputEvent()))->GetCaloClusters();
+ TClonesArray* caloClusters = aod->GetCaloClusters();
new (fgAODCaloClusters) TClonesArray(*caloClusters);
}
if ((handler->NeedsMCParticlesBranchReplication() || merging) && (fgAODMCParticles))
{
- TClonesArray* mcParticles = (TClonesArray*) ((dynamic_cast<AliAODEvent*>(InputEvent()))->FindListObject("mcparticles"));
+ TClonesArray* mcParticles = (TClonesArray*) (aod->FindListObject("mcparticles"));
new (fgAODMCParticles) TClonesArray(*mcParticles);
}
-
+
+ if ((handler->NeedsDimuonsBranchReplication() || merging) && (fgAODDimuons))
+ {
+ fgAODDimuons->Clear();
+ TClonesArray& dimuons = *fgAODDimuons;
+ TClonesArray& tracksnew = *fgAODTracks;
+
+ Int_t nMuonTrack[100];
+ for(Int_t imuon = 0; imuon < 100; imuon++) nMuonTrack[imuon] = 0;
+ Int_t nMuons=0;
+ for(Int_t ii=0; ii < fgAODTracks->GetEntries(); ii++){
+ AliAODTrack *track = (AliAODTrack*) fgAODTracks->At(ii);
+ if(track->IsMuonTrack()) {
+ nMuonTrack[nMuons]= ii;
+ nMuons++;
+ }
+ }
+ Int_t jDimuons=0;
+ if(nMuons >= 2){
+ for(Int_t i = 0; i < nMuons; i++){
+ Int_t index0 = nMuonTrack[i];
+ for(Int_t j = i+1; j < nMuons; j++){
+ Int_t index1 = nMuonTrack[j];
+ tracksnew.At(index0)->ResetBit(kIsReferenced);
+ tracksnew.At(index0)->SetUniqueID(0);
+ tracksnew.At(index1)->ResetBit(kIsReferenced);
+ tracksnew.At(index1)->SetUniqueID(0);
+ new(dimuons[jDimuons++]) AliAODDimuon(tracksnew.At(index0),tracksnew.At(index1));
+ }
+ }
+ }
+ }
+
// Additional merging if needed
if (merging) {
// mcParticles
for (Int_t i = 0; i < ntr; i++) {
AliAODTrack* track = (AliAODTrack*) tracks->At(i);
AliAODTrack* newtrack = new((*fgAODTracks)[nc++]) AliAODTrack(*track);
-
newtrack->SetLabel(newtrack->GetLabel() + nc0);
}
}
// Call the user analysis
- if (!fSelectCollisions || isSelected)
- UserExec(option);
+ if (!fMCEventHandler) {
+ if (isSelected)
+ UserExec(option);
+ } else {
+ if (isSelected && (fMCEventHandler->InitOk()))
+ UserExec(option);
+ }
// Added protection in case the derived task is not an AOD producer.
AliAnalysisDataSlot *out0 = GetOutputSlot(0);
if (out0 && out0->IsConnected()) PostData(0, fTreeA);
+
+ DisconnectMultiHandler();
}
const char* AliAnalysisTaskSE::CurrentFileName()
void AliAnalysisTaskSE::AddAODBranch(const char* cname, void* addobj, const char *fname)
{
// Add a new branch to the aod tree
- AliAODHandler* handler = (AliAODHandler*)
+ AliAODHandler* handler = dynamic_cast<AliAODHandler*>
((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
if (handler) {
handler->AddBranch(cname, addobj, fname);
{
// Check if the output AOD handler is configured for standard or delta AOD.
// Users should first check that AODEvent() returns non-null.
- AliAODHandler* handler = (AliAODHandler*)
+ AliAODHandler* handler = dynamic_cast<AliAODHandler*>
((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
if (!handler) {
Error("IsStandardAOD", "No AOD handler. Please use AODEvent() to check this first");
return (UserNotify());
}
+const AliEventTag *AliAnalysisTaskSE::EventTag() const
+{
+// Returns tag for the current event, if any. The return value should always be checked by the user.
+ if (!fInputHandler) {
+ Error("EventTag", "Input handler not yet available. Call this in UserExec");
+ return NULL;
+ }
+ return fInputHandler->GetEventTag();
+}
+
+void AliAnalysisTaskSE::LoadBranches() const
+{
+// Load all branches declared in fBranchNames data member of the parent class.
+// Should be called in UserExec.
+ if (!fInputHandler) {
+ Error("LoadBranches", "Input handler not available yet. Call this in UserExec");
+ return;
+ }
+ AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+ if (mgr->GetAutoBranchLoading()) return;
+ TString taskbranches;
+ GetBranches(fInputHandler->GetDataType(), taskbranches);
+ if (taskbranches.IsNull()) return;
+ TObjArray *arr = taskbranches.Tokenize(",");
+ TIter next(arr);
+ TObject *obj;
+ while ((obj=next())) mgr->LoadBranch(obj->GetName());
+}
+
+
+//_________________________________________________________________________________________________
+void AliAnalysisTaskSE::ConnectMultiHandler()
+{
+ //
+ // Connect MultiHandler
+ //
+ fInputHandler = (AliInputEventHandler *)((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
+ fMultiInputHandler = dynamic_cast<AliMultiInputEventHandler *>(fInputHandler);
+ if (fMultiInputHandler) {
+ fInputHandler = dynamic_cast<AliInputEventHandler *>(fMultiInputHandler->GetFirstInputEventHandler());
+ fMCEventHandler = dynamic_cast<AliMCEventHandler *>(fMultiInputHandler->GetFirstMCEventHandler());
+ } else {
+ fMCEventHandler = dynamic_cast<AliMCEventHandler *>((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
+ }
+ if (fMCEventHandler) fMCEvent = fMCEventHandler->MCEvent();
+}
+//_________________________________________________________________________________________________
+void AliAnalysisTaskSE::DisconnectMultiHandler()
+{
+ //
+ // Disconnect MultiHandler
+ //
+ if (fMultiInputHandler) fInputHandler = fMultiInputHandler;
+}