From 9e437f946a304bb980abbb754348de124f5c0042 Mon Sep 17 00:00:00 2001 From: snelling Date: Thu, 29 Nov 2012 15:19:27 +0000 Subject: [PATCH] addition to on the fly --- PWG/CMakelibPWGflowBase.pkg | 1 + ...liAnalysisTwoParticleResonanceFlowTask.cxx | 237 +++++++++++------- .../AliAnalysisTwoParticleResonanceFlowTask.h | 7 + PWG/PWGflowBaseLinkDef.h | 1 + 4 files changed, 159 insertions(+), 87 deletions(-) diff --git a/PWG/CMakelibPWGflowBase.pkg b/PWG/CMakelibPWGflowBase.pkg index cb56718ad22..c5e7e2f8f11 100644 --- a/PWG/CMakelibPWGflowBase.pkg +++ b/PWG/CMakelibPWGflowBase.pkg @@ -53,6 +53,7 @@ set ( SRCS FLOW/Base/AliFlowAnalysisWithFittingQDistribution.cxx FLOW/Base/AliFlowAnalysisWithMixedHarmonics.cxx FLOW/Base/AliFlowAnalysisWithNestedLoops.cxx + FLOW/Base/AliFlowOnTheFlyEventGenerator.cxx ) string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" ) diff --git a/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.cxx b/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.cxx index 1ca83833f2c..95b9ee67a58 100644 --- a/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.cxx +++ b/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.cxx @@ -28,6 +28,7 @@ #include "TH2F.h" #include "TCanvas.h" #include "TMath.h" +#include "TObject.h" #include "TObjArray.h" #include "AliAnalysisTask.h" #include "AliAnalysisTaskSE.h" @@ -41,6 +42,7 @@ #include "AliStack.h" #include "AliMCEvent.h" #include "TProfile.h" +#include "TDirectoryFile.h" #include "AliFlowCandidateTrack.h" #include "AliFlowTrackCuts.h" #include "AliFlowEventSimple.h" @@ -83,7 +85,7 @@ AliAnalysisTwoParticleResonanceFlowTask::AliAnalysisTwoParticleResonanceFlowTask } } //_____________________________________________________________________________ -AliAnalysisTwoParticleResonanceFlowTask::AliAnalysisTwoParticleResonanceFlowTask(const char *name) : AliAnalysisTaskSE(name), fSpeciesA(0), fSpeciesB(0), fChargeA(0), fChargeB(0), fMassA(0), fMassB(0), fMinPtA(0), fMaxPtA(0), fMinPtB(0), fMaxPtB(0), fIsMC(0), fEventMixing(0), fPhiMinusPsiMethod(0), fQA(0), fV0(0), fMassBins(1), fMinMass(-1.), fMaxMass(0.), fCutsRP(NULL), fNullCuts(0), fPIDResponse(0), fFlowEvent(0), fBayesianResponse(0), fCandidates(0), fCandidateEtaPtCut(0), fCandidateMinEta(0), fCandidateMaxEta(0), fCandidateMinPt(0), fCandidateMaxPt(0), fPermissiveMixing(0), fNPtBins(18), fNdPhiBins(18), fCentrality(999), fVertex(999), fAOD(0), fPoolManager(0), fOutputList(0), fEventStats(0), fCentralityPass(0), fCentralityNoPass(0), fNOPID(0), fPIDk(0), fPIDp(0), fPtP(0), fPtN(0), fPtSpeciesA(0), fPtSpeciesB(0), fCentralityMin(0), fCentralityMax(100), fkCentralityMethod(0), fPOICuts(0), fVertexRange(0), fPhi(0), fEta(0), fVZEROA(0), fVZEROC(0), fTPCM(0), fDeltaDipAngle(0), fDeltaDipPt(0), fApplyDeltaDipCut(0), fDCAAll(0), fDCAXYQA(0), fDCAZQA(0), fDCAPrim(0), fDCASecondaryWeak(0), fDCAMaterial(0), fSubEventDPhiv2(0), fAnalysisSummary(0) +AliAnalysisTwoParticleResonanceFlowTask::AliAnalysisTwoParticleResonanceFlowTask(const char *name) : AliAnalysisTaskSE(name), fSpeciesA(0), fSpeciesB(0), fChargeA(0), fChargeB(0), fMassA(0), fMassB(0), fMinPtA(0), fMaxPtA(0), fMinPtB(0), fMaxPtB(0), fIsMC(0), fEventMixing(0), fPhiMinusPsiMethod(0), fQA(0), fV0(0), fMassBins(1), fMinMass(-1.), fMaxMass(0.), fCutsRP(NULL), fNullCuts(0), fPIDResponse(0), fFlowEvent(0),fBayesianResponse(0), fCandidates(0), fCandidateEtaPtCut(0), fCandidateMinEta(0), fCandidateMaxEta(0), fCandidateMinPt(0), fCandidateMaxPt(0), fPermissiveMixing(0), fNPtBins(18), fNdPhiBins(18), fCentrality(999), fVertex(999), fAOD(0), fPoolManager(0), fOutputList(0), fEventStats(0), fCentralityPass(0), fCentralityNoPass(0), fNOPID(0), fPIDk(0), fPIDp(0), fPtP(0), fPtN(0), fPtSpeciesA(0), fPtSpeciesB(0), fCentralityMin(0), fCentralityMax(100), fkCentralityMethod(0), fPOICuts(0), fVertexRange(0), fPhi(0), fEta(0), fVZEROA(0), fVZEROC(0), fTPCM(0), fDeltaDipAngle(0), fDeltaDipPt(0), fApplyDeltaDipCut(0), fDCAAll(0), fDCAXYQA(0), fDCAZQA(0), fDCAPrim(0), fDCASecondaryWeak(0), fDCAMaterial(0), fSubEventDPhiv2(0), fAnalysisSummary(0) { // Constructor for(Int_t i(0); i < 7; i++) fPIDConfig[i] = 0.; @@ -603,7 +605,7 @@ template void AliAnalysisTwoParticleResonanceFlowTask::SetNullCuts( { // Set null cuts fCutsRP->SetEvent(event, MCEvent()); - fNullCuts->SetParamType(AliFlowTrackCuts::kGlobal); + if(event) fNullCuts->SetParamType(AliFlowTrackCuts::kGlobal); fNullCuts->SetPtRange(+1, -1); // select nothing QUICK fNullCuts->SetEtaRange(+1, -1); // select nothing VZERO fNullCuts->SetEvent(event, MCEvent()); @@ -760,15 +762,63 @@ void AliAnalysisTwoParticleResonanceFlowTask::VZEROSubEventAnalysis() } } //_____________________________________________________________________________ -void AliAnalysisTwoParticleResonanceFlowTask::UserExec(Option_t *) +void AliAnalysisTwoParticleResonanceFlowTask::DoAnalysisOnTheFly(AliFlowEventSimple* event) { - // UserExec: called for each event. Commented where necessary + // initialize the task for on the fly analysis and call the user exec + if(fFlowEvent) delete fFlowEvent; // clear out the old flow event + fFlowEvent = (AliFlowEvent*)event; // cast the input event to its derived type + UserExec("fly"); // call the UserExec with flag 'on the fly' +} +//_____________________________________________________________________________ +void AliAnalysisTwoParticleResonanceFlowTask::DoAnalysisOnTheFly(TDirectoryFile* outputFile) +{ + // write the anlaysis to an output file + outputFile->Add(fOutputList); + outputFile->Write(outputFile->GetName(), TObject::kSingleKey); +} +//_____________________________________________________________________________ +void AliAnalysisTwoParticleResonanceFlowTask::DoAnalysisOnTheFly(TObjArray* MixingCandidates, TObjArray* SpeciesA, TObjArray* ocSpeciesA, TObjArray* SpeciesB, TObjArray* ocSpeciesB) +{ + // do the flow analysis on the fly. + Int_t iTracks = fFlowEvent->NumberOfTracks(); + fCandidates->SetLast(-1); // clean out candidate array + Int_t charge(-1), tID(0); // we'll use this guy to store charge + if(fQA) fEventStats->Fill(0); // event counter + for (Int_t i = 0; i < iTracks; i++) { // track loop. iterator i is used as unique track id (necessary later on to avoid auto-correlations) + AliFlowTrackSimple* track = fFlowEvent->GetTrack(i); + tID = track->GetID(); // store ID + (tID > 0) ? charge = 1 : charge = -1 ; // get the charge of the track + Double_t pt(track->Pt()), phi(track->Phi()), px(pt*TMath::Cos(phi)), py(pt*TMath::Sin(phi)), pz(track->Weight()); // TODO ugly, but pz is stored as weight ... + if (charge == fChargeA && TMath::Abs(tID)==TMath::Abs(fSpeciesA)) { // store species a + SpeciesA->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassA, i, fSpeciesA)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassA, i, fSpeciesA)); + } + if (charge == -1*fChargeA && TMath::Abs(tID)==TMath::Abs(fSpeciesA)) { // store opposite charge species a + ocSpeciesA->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassA, i,fSpeciesA)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassA, i, fSpeciesA)); + } + if (charge == fChargeB && TMath::Abs(tID)==TMath::Abs(fSpeciesB)) { // store species b + SpeciesB->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassB, i, fSpeciesB)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassB, i, fSpeciesB)); + } + if (charge == -1*fChargeB && TMath::Abs(tID)==TMath::Abs(fSpeciesB)) { // store opposite charge species b + ocSpeciesB->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassB, i, fSpeciesB)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), phi, TMath::Sqrt(px*px+py*py), px, py, pz, pt, charge, fMassB, i, fSpeciesB)); + } + // at the end: convert the flow track to an 'actual' flow track with id and charge + track->SetID(i); // set the unique id + track->SetCharge(charge); // set charge + } +} +//_____________________________________________________________________________ +void AliAnalysisTwoParticleResonanceFlowTask::UserExec(Option_t * option) +{ + // UserExec: called for each event. Commented where necessary TObjArray* MixingCandidates = 0x0; // init null pointer for event mixing if(fEventMixing) { MixingCandidates = new TObjArray(); MixingCandidates->SetOwner(kTRUE); // mixing candidates has ownership of objects in array } - TObjArray* SpeciesA = new TObjArray(); // create arrays for the helper tracks SpeciesA->SetOwner(kTRUE); TObjArray* ocSpeciesA = new TObjArray(); // opposite charge particles @@ -777,99 +827,112 @@ void AliAnalysisTwoParticleResonanceFlowTask::UserExec(Option_t *) SpeciesB->SetOwner(kTRUE); TObjArray* ocSpeciesB = new TObjArray(); ocSpeciesB->SetOwner(kTRUE); - - if (!fPIDResponse) { // kill the event if there isn't a pid response - return; + // check the options + char chopt[128]; + strlcpy(chopt,option,128); + char *onTheFly; + onTheFly = strstr(chopt,"fly"); + if(onTheFly) { // do the on the fly analysis + printf(" > we're ready to fly ... ! \n"); + DoAnalysisOnTheFly(MixingCandidates, SpeciesA, ocSpeciesA, SpeciesB, ocSpeciesB); } - - fAOD = dynamic_cast(InputEvent()); // check for aod data type - if (fAOD) { - if (!EventCut(fAOD)) return; // check for event cuts - InitializeBayesianPID(fAOD); // init event objects - SetNullCuts(fAOD); - Int_t iTracks = fAOD->GetNumberOfTracks(); - PrepareFlowEvent(iTracks); // does number of tracks correspond to the set filterbit ??? FIXME !!! - fCandidates->SetLast(-1); - if(fIsMC) IsMC(); // launch mc stuff FIXME - if(fQA) fEventStats->Fill(0); - for (Int_t i = 0; i < iTracks; i++) { // select analysis candidates - AliAODTrack* track = fAOD->GetTrack(i); - if (!QualityCheck(track)) continue; // reject poor quality tracks - if (track->Charge() == fChargeA && AcceptTrack(track, fSpeciesA)) { // store species a - SpeciesA->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), - track->Pt(), track->Charge(), fMassA, track->GetID(), fSpeciesA)); - if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), - track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassA, - track->GetID(), fSpeciesA)); - } - if (track->Charge() == -1*fChargeA && AcceptTrack(track, fSpeciesA)) { // store opposite charge species a - ocSpeciesA->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), - track->Pt(), track->Charge(), fMassA, track->GetID(), fSpeciesA)); - if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), - track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassA, - track->GetID(), fSpeciesA)); - } - if (track->Charge() == fChargeB && AcceptTrack(track, fSpeciesB)) { // store species b - SpeciesB->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), - track->Pt(), track->Charge(), fMassB, track->GetID(), fSpeciesB)); - if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), - track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassB, - track->GetID(), fSpeciesB)); - } - if (track->Charge() == -1*fChargeB && AcceptTrack(track, fSpeciesB)) { // store opposite charge species b - ocSpeciesB->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), - track->Pt(), track->Charge(), fMassB, track->GetID(), fSpeciesB)); - if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), - track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassB, - track->GetID(), fSpeciesB)); - } - } - // do the phi minus psi method if that's specified FIXME currenlty only supports event mixing - if (fPhiMinusPsiMethod) { // for the phi minus psi method, no need for flow package etc - PhiMinusPsiMethod(MixingCandidates); // call the method - PostData(1, fOutputList); // save the output data - return; // return to retrieve next event + if(!onTheFly) { // do analysis in the regular way (with the manager, etc) + if (!fPIDResponse) { // kill the event if there isn't a pid response + return; } - // start the resonance reconstruction, this fills the fCandidates array with flow tracks - ResonanceSignal(SpeciesA, SpeciesB); - // - if(fV0) VZEROSubEventAnalysis(); - for (int iCand = 0; iCand != fCandidates->GetEntriesFast(); ++iCand) { - AliFlowCandidateTrack *cand = dynamic_cast(fCandidates->At(iCand)); - if (!cand) continue; - for (int iDau = 0; iDau != cand->GetNDaughters(); ++iDau) { - for (int iRPs = 0; iRPs != fFlowEvent->NumberOfTracks(); ++iRPs) { - AliFlowTrack *iRP = dynamic_cast(fFlowEvent->GetTrack(iRPs)); - if (!iRP) continue; - if (!iRP->InRPSelection()) continue; - if (cand->GetIDDaughter(iDau) == iRP->GetID()) { - iRP->SetForRPSelection(kFALSE); - fFlowEvent->SetNumberOfRPs(fFlowEvent->GetNumberOfRPs() - 1); - } + + fAOD = dynamic_cast(InputEvent()); // check for aod data type + if (fAOD) { + if (!EventCut(fAOD)) return; // check for event cuts + InitializeBayesianPID(fAOD); // init event objects + SetNullCuts(fAOD); + Int_t iTracks = fAOD->GetNumberOfTracks(); + PrepareFlowEvent(iTracks); // does number of tracks correspond to the set filterbit ??? FIXME !!! + fCandidates->SetLast(-1); + if(fIsMC) IsMC(); // launch mc stuff FIXME + if(fQA) fEventStats->Fill(0); + for (Int_t i = 0; i < iTracks; i++) { // select analysis candidates + AliAODTrack* track = fAOD->GetTrack(i); + if (!QualityCheck(track)) continue; // reject poor quality tracks + if (track->Charge() == fChargeA && AcceptTrack(track, fSpeciesA)) { // store species a + SpeciesA->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), + track->Pt(), track->Charge(), fMassA, track->GetID(), fSpeciesA)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), + track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassA, + track->GetID(), fSpeciesA)); + } + if (track->Charge() == -1*fChargeA && AcceptTrack(track, fSpeciesA)) { // store opposite charge species a + ocSpeciesA->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), + track->Pt(), track->Charge(), fMassA, track->GetID(), fSpeciesA)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), + track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassA, + track->GetID(), fSpeciesA)); + } + if (track->Charge() == fChargeB && AcceptTrack(track, fSpeciesB)) { // store species b + SpeciesB->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), + track->Pt(), track->Charge(), fMassB, track->GetID(), fSpeciesB)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), + track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassB, + track->GetID(), fSpeciesB)); + } + if (track->Charge() == -1*fChargeB && AcceptTrack(track, fSpeciesB)) { // store opposite charge species b + ocSpeciesB->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), track->Py(), track->Pz(), + track->Pt(), track->Charge(), fMassB, track->GetID(), fSpeciesB)); + if(fEventMixing) MixingCandidates->Add(new AliResonanceFlowHelperTrack(track->Eta(), track->Phi(), track->P(), track->Px(), + track->Py(), track->Pz(), track->Pt(), track->Charge(), fMassB, + track->GetID(), fSpeciesB)); + + } + } + } // end the loop for event manager's aod's + } // end of data loop + // do the phi minus psi method if that's specified FIXME currenlty only supports event mixing + if (fPhiMinusPsiMethod) { // for the phi minus psi method, no need for flow package etc + PhiMinusPsiMethod(MixingCandidates); // call the method + PostData(1, fOutputList); // save the output data + return; // return to retrieve next event + } + // start the resonance reconstruction, this fills the fCandidates array with flow tracks + ResonanceSignal(SpeciesA, SpeciesB); + if(fV0) VZEROSubEventAnalysis(); + for (int iCand = 0; iCand != fCandidates->GetEntriesFast(); ++iCand) { + AliFlowCandidateTrack *cand = dynamic_cast(fCandidates->At(iCand)); + if (!cand) continue; + for (int iDau = 0; iDau != cand->GetNDaughters(); ++iDau) { + for (int iRPs = 0; iRPs != fFlowEvent->NumberOfTracks(); ++iRPs) { + AliFlowTrack *iRP = dynamic_cast(fFlowEvent->GetTrack(iRPs)); + if (!iRP) continue; + if (!iRP->InRPSelection()) continue; + if (cand->GetIDDaughter(iDau) == iRP->GetID()) { + iRP->SetForRPSelection(kFALSE); + fFlowEvent->SetNumberOfRPs(fFlowEvent->GetNumberOfRPs() - 1); } } - cand->SetForPOISelection(kTRUE); - fFlowEvent->InsertTrack(((AliFlowTrack*) cand)); - } - if(!fEventMixing) { // do the combinatorial background - ResonanceBackground(ocSpeciesA, SpeciesB); // mix opposite charge species A with species B - if(fSpeciesA!=fSpeciesB) ResonanceBackground(SpeciesA, ocSpeciesB); // mix species A with opposite charge species B } - delete SpeciesA; - delete SpeciesB; - delete ocSpeciesA; - delete ocSpeciesB; // clean heap memory - if(fEventMixing) ReconstructionWithEventMixing(MixingCandidates); - PostData(1, fOutputList); - PostData(2, fFlowEvent); + cand->SetForPOISelection(kTRUE); + fFlowEvent->InsertTrack(((AliFlowTrack*) cand)); } + if(!fEventMixing) { // do the combinatorial background + ResonanceBackground(ocSpeciesA, SpeciesB); // mix opposite charge species A with species B + if(fSpeciesA!=fSpeciesB) ResonanceBackground(SpeciesA, ocSpeciesB); // mix species A with opposite charge species B + } + else ReconstructionWithEventMixing(MixingCandidates); + if(!onTheFly) { + PostData(1, fOutputList); + PostData(2, fFlowEvent); + } + delete SpeciesA; + delete SpeciesB; + delete ocSpeciesA; + delete ocSpeciesB; // clean heap memory } //_____________________________________________________________________________ void AliAnalysisTwoParticleResonanceFlowTask::ResonanceSignal(TObjArray* SpeciesA, TObjArray* SpeciesB) const { // fill signal histograms - for (Int_t i(0); i < SpeciesA->GetEntriesFast(); i++) { //track loop over species A - for (Int_t j(0); j < SpeciesB->GetEntriesFast(); j++) { //track loop over species B + Int_t spA(SpeciesA->GetEntries()), spB(SpeciesB->GetEntries()); + for (Int_t i(0); i < spA; i++) { //track loop over species A + for (Int_t j(0); j < spB; j++) { //track loop over species B AliResonanceFlowHelperTrack* trackA = (AliResonanceFlowHelperTrack*)SpeciesA->At(i); AliResonanceFlowHelperTrack* trackB = (AliResonanceFlowHelperTrack*)SpeciesB->At(j); if(!(trackA||trackB)) continue; // shouldn't happen diff --git a/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.h b/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.h index 9d6f286b1a8..f74814de24b 100644 --- a/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.h +++ b/PWG/FLOW/Tasks/AliAnalysisTwoParticleResonanceFlowTask.h @@ -14,6 +14,9 @@ class TH2F; class TProfile; class AliFlowTrackCuts; class AliFlowEvent; +class AliFlowTrackSimple; +class AliFlowEventSimple; +class TDirectoryFile; class AliFlowCandidateTrack; class AliFlowBayesianPID; class AliEventPoolManager; @@ -118,6 +121,7 @@ public: etapt[1] = fCandidateMaxEta; etapt[2] = fCandidateMinPt; etapt[3] = fCandidateMaxPt; } + AliFlowEvent* GetFlowEvent() const {return fFlowEvent;} // the analysis itself AliEventPoolManager* InitializeEventMixing(); template Float_t InvariantMass(const T* track1, const T* track2) const; @@ -142,6 +146,9 @@ public: void PhiMinusPsiMethod(TObjArray* MixingCandidates); void PhiMinusPsiMethodWriteData(Bool_t signal, TObjArray* SpeciesA, TObjArray* SpeciesB, Float_t* abcPsi2); void VZEROSubEventAnalysis(); + void DoAnalysisOnTheFly(AliFlowEventSimple* event); + void DoAnalysisOnTheFly(TObjArray* MixingCandidates, TObjArray* SpeciesA, TObjArray* ocSpeciesA, TObjArray* SpeciesB, TObjArray* ocSpeciesB); + void DoAnalysisOnTheFly(TDirectoryFile* outputFile); virtual void UserExec(Option_t *option); void ResonanceSignal(TObjArray* SpeciesA, TObjArray* SpeciesB) const; void ResonanceBackground(TObjArray* SpeciesA, TObjArray* SpeciesB, Bool_t checkAutoCorrelations = kTRUE) const; diff --git a/PWG/PWGflowBaseLinkDef.h b/PWG/PWGflowBaseLinkDef.h index 925739a30d5..6c913b53298 100644 --- a/PWG/PWGflowBaseLinkDef.h +++ b/PWG/PWGflowBaseLinkDef.h @@ -38,5 +38,6 @@ #pragma link C++ class AliFlowAnalysisWithFittingQDistribution+; #pragma link C++ class AliFlowAnalysisWithMixedHarmonics+; #pragma link C++ class AliFlowAnalysisWithNestedLoops+; +#pragma link C++ class AliFlowOnTheFlyEventGenerator+; #endif -- 2.43.0