ROOT logo
///////////////////////////////////////////////////////////////////
//                                                               //            
//                     AddTaskJetFlow                            //
// Author: Redmer A. Bertens, Utrecht University, 2013           //
//                                                               //
///////////////////////////////////////////////////////////////////
class AliAnalysisDataContainer;
class AliAnalysisTaskJetV2;

// AddTask macro for the jet flow analysis task
// this task uses an instance AliAnalysisTaskJetV2
// as a 'master' object for analysis flags and track and event cuts

AliAnalysisTaskJetV2* AddTaskJetFlow( 
        TString name                       = "name",
        AliAnalysisTaskJetV2* t  = 0x0,
        Float_t CCMinPt                    = 1,
        Float_t CCMaxPt                    = 150,
        Float_t CCBinsInPt                 = 100,
        Bool_t VParticle                   = kFALSE,
        TArrayD* ptArray                   = 0x0,
        Bool_t VZEROEP                     = kTRUE,
        Bool_t GQC2                        = kTRUE,
        Bool_t QC2                         = kTRUE,
        Bool_t QC4                         = kFALSE,
        Bool_t FlowPackageSP               = kFALSE,
        Bool_t FlowPackageQC               = kTRUE,
        TString LocalRhoName               = "",
        Bool_t debug                       = kFALSE  )
{
    // first check the environment (common to all tasks)
    if(debug) printf("\n\n  >> AddTaskJetFlow <<\n");
    TString fileName = AliAnalysisManager::GetCommonFileName();
    fileName += ":";
    fileName += t->GetName();
    fileName += "_PWGCF";
    if(debug) printf("      - filename: %s \n",fileName.Data());
    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
    if (!mgr) {
        if(debug) cout << " Fatal error: no analysis manager found! " << endl;
        return 0x0;
    }
    if (!mgr->GetInputEventHandler()) {
        if(debug) cout << " Fatal error: no imput event handler found!" << endl;
        return 0x0;
    }
    AliAnalysisTaskJetV2* rhoTask = t; 
    // check the centrality setup
    TArrayI* cent(rhoTask->GetCentralityClasses());
    // add the tasks in a loop, one task for each centrality bin
    for(Int_t i(0); i < cent->GetSize()-1; i++) {
        TString tempName(Form("%s_%i_%i", name.Data(), cent->At(i), cent->At(i+1)));
        // create the task
        AliAnalysisTaskJetFlow* task = new AliAnalysisTaskJetFlow(
            tempName.Data(),
            rhoTask,
            VParticle,
            VZEROEP,
            GQC2,            
            QC2,
            QC4,
            FlowPackageSP,
            FlowPackageQC);
        (debug) ? task->SetDebugMode(1) : task->SetDebugMode(-1);
        if(!task) {
             if(debug) printf(" --> Unexpected error occurred: NO TASK WAS CREATED! (could be a library problem!)\n ");
             return 0x0;
        }
        task->SelectCollisionCandidates(rhoTask->GetCollisionCandidates()); 
        task->SetCCMinPt(CCMinPt);
        task->SetCCMaxPt(CCMaxPt);
        task->SetCCBinsInPt(CCBinsInPt);
        task->SetPtBins(ptArray);       // if passed as NULL default a sane default is provided
        task->SetLocalRhoName(LocalRhoName);
        task->SetJetRadius(rhoTask->GetJetRadius());
        // pass specific objects and settigns to the task
        task->SetMinMaxCentrality(cent->At(i), cent->At(1+i));
        mgr->AddTask(task);
        mgr->ConnectInput(task,0,mgr->GetCommonInputContainer());
        mgr->ConnectOutput(task,1,mgr->CreateContainer(Form("%s_histograms", tempName.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, fileName.Data()));
        // connect flow anaysis task
        Bool_t slotTwoFilled(kFALSE);
        if(FlowPackageSP) {
            AliAnalysisDataContainer *flowEvent_VZERO = mgr->CreateContainer(Form("flowEvent_VZERO_%s", tempName.Data()), AliFlowEventSimple::Class(), AliAnalysisManager::kExchangeContainer);
            mgr->ConnectOutput(task, 2, flowEvent_VZERO);
            slotTwoFilled = kTRUE;
        }
        if(FlowPackageQC) {
            AliAnalysisDataContainer *flowEvent_TPC = mgr->CreateContainer(Form("flowEvent_TPC_%s", tempName.Data()), AliFlowEventSimple::Class(), AliAnalysisManager::kExchangeContainer);
            (slotTwoFilled) ? mgr->ConnectOutput(task, 3, flowEvent_TPC) : mgr->ConnectOutput(task, 2, flowEvent_TPC);
        }
        if(FlowPackageSP) TaskJetFlow::AddSPmethod(Form("SPVZERO_A_%s", tempName.Data()), "Qa", 2, flowEvent_VZERO, t);
        if(FlowPackageSP) TaskJetFlow::AddSPmethod(Form("SPVZERO_B_%s", tempName.Data()), "Qb", 2, flowEvent_VZERO, t);
        if(FlowPackageQC) TaskJetFlow::AddQCmethod(Form("QC_%s", tempName.Data()), 2, flowEvent_TPC, t);
    }
    return rhoTask;
}
//_____________________________________________________________________________
namespace TaskJetFlow{ // use unique namespace to avoid problems in TRAIN analysis
    void AddSPmethod(char *name, char *Qvector, int harmonic, AliAnalysisDataContainer *flowEvent, AliAnalysisTaskJetV2* t)
    {
        TString fileName = AliAnalysisManager::GetCommonFileName();
        fileName+=":";
        fileName+=t->GetName();
        fileName+="_PWGCF";
        AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
        AliAnalysisDataContainer *outSP = mgr->CreateContainer(name, TList::Class(), AliAnalysisManager::kOutputContainer, fileName);
        AliAnalysisTaskScalarProduct *tskSP = new AliAnalysisTaskScalarProduct(Form("TaskScalarProduct_%s", name), kFALSE);
        tskSP->SetApplyCorrectionForNUA(kTRUE);
        tskSP->SetHarmonic(harmonic);
        if(!strcmp("Qa", Qvector)) tskSP->SetTotalQvector("Qa");
        if(!strcmp("Qb", Qvector)) tskSP->SetTotalQvector("Qb");
        tskSP->SetBookOnlyBasicCCH(kFALSE);
        mgr->AddTask(tskSP);
        mgr->ConnectInput(tskSP, 0, flowEvent);
        mgr->ConnectOutput(tskSP, 1, outSP);
    }
//_____________________________________________________________________________
    void AddQCmethod(char *name, int harmonic, AliAnalysisDataContainer *flowEvent, AliAnalysisTaskJetV2* t)
    {
       TString fileName = AliAnalysisManager::GetCommonFileName();
       fileName+=":";
       fileName+=t->GetName();
       fileName+="_PWGCF";
       AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
       AliAnalysisDataContainer *outQC = mgr->CreateContainer(name, TList::Class(), AliAnalysisManager::kOutputContainer, fileName);
       AliAnalysisTaskQCumulants *tskQC = new AliAnalysisTaskQCumulants(Form("TaskQCumulants_%s", name), kFALSE);
       tskQC->SetApplyCorrectionForNUA(kTRUE);
       tskQC->SetHarmonic(harmonic);
       tskQC->SetBookOnlyBasicCCH(kFALSE);
       mgr->AddTask(tskQC);
       mgr->ConnectInput(tskQC, 0, flowEvent);
       mgr->ConnectOutput(tskQC, 1, outQC);
    }
//_____________________________________________________________________________
}// end of namespace TaskJetFlow
 AddTaskJetFlow.C:1
 AddTaskJetFlow.C:2
 AddTaskJetFlow.C:3
 AddTaskJetFlow.C:4
 AddTaskJetFlow.C:5
 AddTaskJetFlow.C:6
 AddTaskJetFlow.C:7
 AddTaskJetFlow.C:8
 AddTaskJetFlow.C:9
 AddTaskJetFlow.C:10
 AddTaskJetFlow.C:11
 AddTaskJetFlow.C:12
 AddTaskJetFlow.C:13
 AddTaskJetFlow.C:14
 AddTaskJetFlow.C:15
 AddTaskJetFlow.C:16
 AddTaskJetFlow.C:17
 AddTaskJetFlow.C:18
 AddTaskJetFlow.C:19
 AddTaskJetFlow.C:20
 AddTaskJetFlow.C:21
 AddTaskJetFlow.C:22
 AddTaskJetFlow.C:23
 AddTaskJetFlow.C:24
 AddTaskJetFlow.C:25
 AddTaskJetFlow.C:26
 AddTaskJetFlow.C:27
 AddTaskJetFlow.C:28
 AddTaskJetFlow.C:29
 AddTaskJetFlow.C:30
 AddTaskJetFlow.C:31
 AddTaskJetFlow.C:32
 AddTaskJetFlow.C:33
 AddTaskJetFlow.C:34
 AddTaskJetFlow.C:35
 AddTaskJetFlow.C:36
 AddTaskJetFlow.C:37
 AddTaskJetFlow.C:38
 AddTaskJetFlow.C:39
 AddTaskJetFlow.C:40
 AddTaskJetFlow.C:41
 AddTaskJetFlow.C:42
 AddTaskJetFlow.C:43
 AddTaskJetFlow.C:44
 AddTaskJetFlow.C:45
 AddTaskJetFlow.C:46
 AddTaskJetFlow.C:47
 AddTaskJetFlow.C:48
 AddTaskJetFlow.C:49
 AddTaskJetFlow.C:50
 AddTaskJetFlow.C:51
 AddTaskJetFlow.C:52
 AddTaskJetFlow.C:53
 AddTaskJetFlow.C:54
 AddTaskJetFlow.C:55
 AddTaskJetFlow.C:56
 AddTaskJetFlow.C:57
 AddTaskJetFlow.C:58
 AddTaskJetFlow.C:59
 AddTaskJetFlow.C:60
 AddTaskJetFlow.C:61
 AddTaskJetFlow.C:62
 AddTaskJetFlow.C:63
 AddTaskJetFlow.C:64
 AddTaskJetFlow.C:65
 AddTaskJetFlow.C:66
 AddTaskJetFlow.C:67
 AddTaskJetFlow.C:68
 AddTaskJetFlow.C:69
 AddTaskJetFlow.C:70
 AddTaskJetFlow.C:71
 AddTaskJetFlow.C:72
 AddTaskJetFlow.C:73
 AddTaskJetFlow.C:74
 AddTaskJetFlow.C:75
 AddTaskJetFlow.C:76
 AddTaskJetFlow.C:77
 AddTaskJetFlow.C:78
 AddTaskJetFlow.C:79
 AddTaskJetFlow.C:80
 AddTaskJetFlow.C:81
 AddTaskJetFlow.C:82
 AddTaskJetFlow.C:83
 AddTaskJetFlow.C:84
 AddTaskJetFlow.C:85
 AddTaskJetFlow.C:86
 AddTaskJetFlow.C:87
 AddTaskJetFlow.C:88
 AddTaskJetFlow.C:89
 AddTaskJetFlow.C:90
 AddTaskJetFlow.C:91
 AddTaskJetFlow.C:92
 AddTaskJetFlow.C:93
 AddTaskJetFlow.C:94
 AddTaskJetFlow.C:95
 AddTaskJetFlow.C:96
 AddTaskJetFlow.C:97
 AddTaskJetFlow.C:98
 AddTaskJetFlow.C:99
 AddTaskJetFlow.C:100
 AddTaskJetFlow.C:101
 AddTaskJetFlow.C:102
 AddTaskJetFlow.C:103
 AddTaskJetFlow.C:104
 AddTaskJetFlow.C:105
 AddTaskJetFlow.C:106
 AddTaskJetFlow.C:107
 AddTaskJetFlow.C:108
 AddTaskJetFlow.C:109
 AddTaskJetFlow.C:110
 AddTaskJetFlow.C:111
 AddTaskJetFlow.C:112
 AddTaskJetFlow.C:113
 AddTaskJetFlow.C:114
 AddTaskJetFlow.C:115
 AddTaskJetFlow.C:116
 AddTaskJetFlow.C:117
 AddTaskJetFlow.C:118
 AddTaskJetFlow.C:119
 AddTaskJetFlow.C:120
 AddTaskJetFlow.C:121
 AddTaskJetFlow.C:122
 AddTaskJetFlow.C:123
 AddTaskJetFlow.C:124
 AddTaskJetFlow.C:125
 AddTaskJetFlow.C:126
 AddTaskJetFlow.C:127
 AddTaskJetFlow.C:128
 AddTaskJetFlow.C:129
 AddTaskJetFlow.C:130
 AddTaskJetFlow.C:131
 AddTaskJetFlow.C:132
 AddTaskJetFlow.C:133
 AddTaskJetFlow.C:134
 AddTaskJetFlow.C:135
 AddTaskJetFlow.C:136
 AddTaskJetFlow.C:137