ROOT logo
void jetFlowTools() {
    // load and compile the libraries
    Load();


    const Int_t SVDbestValueIn = 5;
    const Int_t SVDbestValueOut = 4;
    const Double_t bestBetaIn = 1.25;
    const Double_t bestBetaOut = 1.25;

    Bool_t runUnfolding = 0;
    Bool_t doSystematics = (!runUnfolding);

    // read detector response from output of matching taks
    // AliAnalysisTaskJetMatching
    TString drInputName = "response.root";
    printf("- Reading file %s ... \n", drInputName.Data());
    TFile drInput(drInputName.Data());          // detector response input matrix
    if(drInput.IsZombie()) {
        printf(" > read error ! < \n");
        return;
    }
    TH2D* detres = (TH2D*)drInput.Get("detector_response");
    if(!detres) {
        printf(" > failed to extract detector respose < \n");
        return;
    } else printf(" > Found detector response < \n");

    // get a TList from the AliAnalysisJetV2 task
    TFile f("AnalysisResults.root");
    if(f.IsZombie()) {
        printf(" > read error ! < \n");
        return;
    }
    TList* l = (TList*)f.Get("RhoVnMod_R02_kCombined_Jet_AKTChargedR020_PicoTracks_pT0150_pt_scheme_TpcRho_ExLJ_TPC_PWGJE");
    if(!l) {
        printf(" > failed to find output list ! \n");
        return;
    }
    // create an instance of the Tools class
    AliJetFlowTools* tools = new AliJetFlowTools();

    // set some common variables
    tools->SetCentralityBin(1);
    tools->SetDetectorResponse(detres);
    // set the true (unfolded) bins
    Double_t binsTrue[] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 170};
    tools->SetBinsTrue(new TArrayD(sizeof(binsTrue)/sizeof(binsTrue[0]), binsTrue));
    // set the measured (folded) bins
    Double_t binsRec[] = {20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90};
    tools->SetBinsRec(new TArrayD(sizeof(binsRec)/sizeof(binsRec[0]), binsRec));
    // connect input
    tools->SetInputList(l);

    if(runUnfolding) {
        tools->SetUnfoldingAlgorithm(AliJetFlowTools::kNone);
        tools->CreateOutputList(TString("DONOTHING"));
        tools->Make();
        // optional: smoothen the spectrum
        tools->SetSaveFull(kTRUE);
        tools->SetSmoothenPrior(kFALSE, 50, 250, 70, kFALSE);
        // optional: normalize the spectrum
        tools->SetUseDetectorResponse(kTRUE);
        // optional: save a lot of raw output
        tools->SetExLJDpt(kTRUE);
        // do some /chi2 unfolding
        tools->SetUnfoldingAlgorithm(AliJetFlowTools::kChi2);
        // first step: fishnet, see what good unfolding regularizations are
        Double_t beta[] = {.001, .01 .1, .25, 1.25};
        Int_t kReg[] = {9, 8, 7, 6, 5, 4, 3, 5};
        // for out 
        Double_t betaOut[] = {.001, .01, .1, .25, 1.25};
        Int_t kRegOut[] = {9, 8, 7, 6, 5, 4, 3, 4};
        for(Int_t b(0); b < sizeof(beta)/sizeof(beta[0]); b++) {
            tools->CreateOutputList(TString(Form("#beta = %.4f", beta[b])));
            tools->SetBeta(beta[b], betaOut[b]);
            tools->Make();
        }
        tools->SetPrior(AliJetFlowTools::kPriorChi2);
        for(Int_t j(0); j < sizeof(kReg)/sizeof(kReg[0]); j++) {
            // do some SVD unfolding
            tools->SetUnfoldingAlgorithm(AliJetFlowTools::kSVD);
            tools->CreateOutputList(TString(Form("SVD kReg %i", kReg[j])));
            tools->SetSVDReg(kReg[j]); 
            tools->Make();
        }
        // after fishnet: 
        // here we change the pt binning, using optimal svd and beta values
        tools->SetBeta(bestBetaIn, bestBetaOut);
        tools->SetSVDReg(SVDbestValueIn, SVDbestValueOut);
        // ###### change the true (unfolded) binning ########
        Double_t binsTrue2[] = {5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 170};
        tools->SetBinsTrue(new TArrayD(sizeof(binsTrue2)/sizeof(binsTrue2[0]), binsTrue2));
        tools->SetUnfoldingAlgorithm(AliJetFlowTools::kSVD);
        tools->CreateOutputList(TString("true bin removed"));
        tools->Make();
        // revert the true bin settings to their default ones
        tools->SetBinsTrue(new TArrayD(sizeof(binsTrue)/sizeof(binsTrue[0]), binsTrue));
        // ####### change the measured binning
        // remove a bin at low pt
        Double_t binsRech[] = {25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90};
        tools->SetBinsRec(new TArrayD(sizeof(binsRech)/sizeof(binsRech[0]), binsRech));
        tools->SetUnfoldingAlgorithm(AliJetFlowTools::kSVD);
        tools->CreateOutputList(TString("measured bin removed"));
        tools->Make();
        // add a bin at low pt
        Double_t binsRecl[] = {15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90};
        tools->SetBinsRec(new TArrayD(sizeof(binsRecl)/sizeof(binsRecl[0]), binsRecl));
        tools->SetUnfoldingAlgorithm(AliJetFlowTools::kSVD);
        tools->CreateOutputList(TString("measured bin added"));
        tools->Make();
        
        // revert to the original binning
        tools->SetBinsTrue(new TArrayD(sizeof(binsTrue)/sizeof(binsTrue[0]), binsTrue));
        tools->SetBinsRec(new TArrayD(sizeof(binsRec)/sizeof(binsRec[0]), binsRec));
 
        //  unfold using different tracking efficiency
        TString drInputName95 = "/home/rbertens/Documents/CERN/jet-flow/RESPONSE/R02/95_pct_efficiency/5gev_leading_track_bias/response.root";
        TFile drInput95(drInputName95.Data());
        if(drInput95.IsZombie()) return;
        TH2D* detres95 = (TH2D*)drInput95.Get("detector_response");
        tools->SetDetectorResponse(detres95);
        tools->CreateOutputList(TString("diced response"));
        tools->Make();

        // switch back to the original detector response
        tools->SetDetectorResponse(detres);

 
        // now do the svd unfolding with a pythia spectrum as a prior
        tools->SetUnfoldingAlgorithm(AliJetFlowTools::kSVD);
        gROOT->LoadMacro("/home/rbertens/Documents/CERN/jet-flow/RESPONSE/pythia.C");
        tools->SetPrior(AliJetFlowTools::kPriorPythia, pythia());
        tools->CreateOutputList(TString("pythia prior"));
        tools->Make();
        
        
        // ########### systematics are done ################
        // write the output to file
        tools->Finish();
        // do some postprocessing
        tools->PostProcess(TString("SVD kReg 4"), 4, 20, 100);
    } // end of run unfolding

    if(doSystematics) {
        /**
         * evaluate systematics              */
        // first element of array should point to the nominal value
        const Int_t reg[] = {9, 4, 8, 10, 16};
        TArrayI* regArray = new TArrayI(sizeof(reg)/sizeof(reg[0]), reg);
        const Int_t rec[] = {9, 12};
        TArrayI* recArray = new TArrayI(sizeof(rec)/sizeof(rec[0]), rec);
        const Int_t tru[] = {9, 13, 14};
        TArrayI* truArray = new TArrayI(sizeof(tru)/sizeof(tru[0]), tru);


        // place holder pointers. these will be assigned by using pointer references in the relevant functions
        //
        // for the nominal points
        TH1D*                   nominalRatio    (0x0);
        TGraphErrors*           nominalV2       (0x0);

        // for the shape uncertainty 
        TGraphAsymmErrors*      shapeRatio      (0x0);
        TGraphAsymmErrors*      shapeV2         (0x0);

        // for the correlated uncertainty
        TGraphAsymmErrors*      corrRatio       (0x0);
        TGraphAsymmErrors*      corrV2          (0x0);
        // get the actual values

        tools->GetNominalValues(
                nominalRatio,
                nominalV2,
                regArray,       // doesn't matter which array is passed, as long as first element points to nominal value
                regArray);

        tools->GetShapeUncertainty(
                shapeRatio,
                shapeV2,
                regArray,        // systematics from regularization      
                regArray,       
                recArray,            // from true spectrum variation
                recArray,    
                truArray,            // from rec spectrum variation
                truArray,
                4, 
                20, 
                100);

        const Int_t cor[] = {9, 15};
        TArrayI* corArray = new TArrayI(sizeof(cor)/sizeof(cor[0]), cor);

        tools->GetCorrelatedUncertainty(
                corrRatio,
                corrV2,
                corArray,        // correlated systematics
                corArray,       
                "diced respose", // name of systematic source
                4, 
                20, 
                100);

        
        
        
        
        using namespace AliJetFlowTools;
        Double_t rangeLow(20.);
        Double_t rangeHigh(90.);

        TFile FinalResults = TFile("FinalResults.root", "RECREATE");
        // combine the final results and write them to a file
        TCanvas* full = new TCanvas("full", "full");
        full->Divide(2);
        full->cd(1);
        AliJetFlowTools::Style(gPad, "PEARSON");
        // shape uncertianty, full boxes
        Style(shapeRatio, kYellow, AliJetFlowTools::kRatio);
        shapeRatio->SetTitle("shape uncertainty");
        shapeRatio->GetXaxis()->SetRangeUser(rangeLow, rangeHigh);
        shapeRatio->GetYaxis()->SetRangeUser(.7, 2.2);
        shapeRatio->DrawClone("a2");

        // correlated uncertainty, open boxes
        Style(corrRatio, kGray, AliJetFlowTools::kRatio);
        corrRatio->SetTitle("correlated uncertainty");
        corrRatio->SetFillStyle(0);
        corrRatio->SetFillColor(kWhite);
        corrRatio->DrawClone("5");
        
        // ratio itself
        Style(nominalRatio, kBlack, AliJetFlowTools::kRatio);
        nominalRatio->DrawCopy("same E1");
        nominalRatio->SetTitle("in / out of plane jet yield");

        AddTPaveText("0-10 \% cc Pb-Pb #sqrt{s_{NN}} = 2.76 TeV");
        AliJetFlowTools::AddLegend(gPad, kTRUE); 
        full->cd(2);
        AliJetFlowTools::Style(gPad, "PEARSON");
        
        // shape uncertainto on v2
        Style(shapeV2, kYellow, AliJetFlowTools::kV2);
        shapeV2->SetTitle("shape uncertainty");
        shapeV2->GetXaxis()->SetRangeUser(rangeLow, rangeHigh);
        shapeV2->GetYaxis()->SetRangeUser(-.5, 1.);
        shapeV2->DrawClone("a2");

        // correlated uncertainty
        Style(corrV2, kGray, AliJetFlowTools::kV2);
        corrV2->SetFillColor(kWhite);
        corrV2->SetLineStyle(0);
        corrV2->SetFillStyle(0);
        corrV2->SetTitle("correlated uncertainty");
        corrV2->DrawClone("5");

        // v2 itself
        Style(nominalV2, kBlack, AliJetFlowTools::kV2);
        nominalV2->SetTitle("jet #it{v}_{2}");
        nominalV2->SetFillColor(kWhite);
        nominalV2->DrawClone("same E1");

        AddTPaveText("0-10 \% cc Pb-Pb #sqrt{s_{NN}} = 2.76 TeV");
        AliJetFlowTools::AddLegend(gPad, kTRUE);
        gStyle->SetTitleStyle(0);
        gStyle->SetStatStyle(0);

        full->Write();
        FinalResults.Close();
    }    
}

//_____________________________________________________________________________
void Load() {
    gSystem->Load("libTree.so");
    gSystem->Load("libGeom.so");
    gSystem->Load("libVMC.so");
    gSystem->Load("libPhysics");

    gSystem->Load("libSTEERBase.so");
    gSystem->Load("libESD.so");
    gSystem->Load("libAOD.so");
    gSystem->Load("libANALYSIS.so");
    gSystem->Load("libANALYSISalice.so");

    gSystem->Load("libEMCALUtils.so");
    gSystem->Load("libPHOSUtils.so");
    gSystem->Load("libCGAL.so");
    gSystem->Load("libfastjet.so");
    gSystem->Load("libsiscone.so");
    gSystem->Load("libSISConePlugin.so");

    gSystem->Load("libCORRFW.so");
    gSystem->Load("libPWGTools.so");
    gSystem->Load("libJETAN.so");
    gSystem->Load("libFASTJETAN.so");
    gSystem->Load("libPWGJE.so");

    // include paths, necessary for compilation
    gSystem->AddIncludePath("-Wno-deprecated");
    gSystem->AddIncludePath("-I$ALICE_ROOT -I$ALICE_ROOT/include -I$ALICE_ROOT/EMCAL");
    gSystem->AddIncludePath("-I$ALICE_ROOT/PWGDQ/dielectron -I$ALICE_ROOT/PWGHF/hfe");
    gSystem->AddIncludePath("-I$ALICE_ROOT/JETAN -I$ALICE_ROOT/JETAN/fastjet");

    // attempt to load RooUnfold libraries, 
    gSystem->Load("/home/rbertens/Documents/CERN/alice/BUILDS/ROOUNFOLD/RooUnfold-1.1.1/libRooUnfold.so");
    gSystem->AddIncludePath("-I/home/rbertens/Documents/CERN/alice/BUILDS/ROOUNFOLD/RooUnfold-1.1.1/src/");
    // compile unfolding class (only if there are local changes or the .o is not found)
    gROOT->LoadMacro("$ALICE_ROOT/PWG/FLOW/Tasks/AliJetFlowTools.cxx+");
}
//_____________________________________________________________________________
 jetFlowTools.C:1
 jetFlowTools.C:2
 jetFlowTools.C:3
 jetFlowTools.C:4
 jetFlowTools.C:5
 jetFlowTools.C:6
 jetFlowTools.C:7
 jetFlowTools.C:8
 jetFlowTools.C:9
 jetFlowTools.C:10
 jetFlowTools.C:11
 jetFlowTools.C:12
 jetFlowTools.C:13
 jetFlowTools.C:14
 jetFlowTools.C:15
 jetFlowTools.C:16
 jetFlowTools.C:17
 jetFlowTools.C:18
 jetFlowTools.C:19
 jetFlowTools.C:20
 jetFlowTools.C:21
 jetFlowTools.C:22
 jetFlowTools.C:23
 jetFlowTools.C:24
 jetFlowTools.C:25
 jetFlowTools.C:26
 jetFlowTools.C:27
 jetFlowTools.C:28
 jetFlowTools.C:29
 jetFlowTools.C:30
 jetFlowTools.C:31
 jetFlowTools.C:32
 jetFlowTools.C:33
 jetFlowTools.C:34
 jetFlowTools.C:35
 jetFlowTools.C:36
 jetFlowTools.C:37
 jetFlowTools.C:38
 jetFlowTools.C:39
 jetFlowTools.C:40
 jetFlowTools.C:41
 jetFlowTools.C:42
 jetFlowTools.C:43
 jetFlowTools.C:44
 jetFlowTools.C:45
 jetFlowTools.C:46
 jetFlowTools.C:47
 jetFlowTools.C:48
 jetFlowTools.C:49
 jetFlowTools.C:50
 jetFlowTools.C:51
 jetFlowTools.C:52
 jetFlowTools.C:53
 jetFlowTools.C:54
 jetFlowTools.C:55
 jetFlowTools.C:56
 jetFlowTools.C:57
 jetFlowTools.C:58
 jetFlowTools.C:59
 jetFlowTools.C:60
 jetFlowTools.C:61
 jetFlowTools.C:62
 jetFlowTools.C:63
 jetFlowTools.C:64
 jetFlowTools.C:65
 jetFlowTools.C:66
 jetFlowTools.C:67
 jetFlowTools.C:68
 jetFlowTools.C:69
 jetFlowTools.C:70
 jetFlowTools.C:71
 jetFlowTools.C:72
 jetFlowTools.C:73
 jetFlowTools.C:74
 jetFlowTools.C:75
 jetFlowTools.C:76
 jetFlowTools.C:77
 jetFlowTools.C:78
 jetFlowTools.C:79
 jetFlowTools.C:80
 jetFlowTools.C:81
 jetFlowTools.C:82
 jetFlowTools.C:83
 jetFlowTools.C:84
 jetFlowTools.C:85
 jetFlowTools.C:86
 jetFlowTools.C:87
 jetFlowTools.C:88
 jetFlowTools.C:89
 jetFlowTools.C:90
 jetFlowTools.C:91
 jetFlowTools.C:92
 jetFlowTools.C:93
 jetFlowTools.C:94
 jetFlowTools.C:95
 jetFlowTools.C:96
 jetFlowTools.C:97
 jetFlowTools.C:98
 jetFlowTools.C:99
 jetFlowTools.C:100
 jetFlowTools.C:101
 jetFlowTools.C:102
 jetFlowTools.C:103
 jetFlowTools.C:104
 jetFlowTools.C:105
 jetFlowTools.C:106
 jetFlowTools.C:107
 jetFlowTools.C:108
 jetFlowTools.C:109
 jetFlowTools.C:110
 jetFlowTools.C:111
 jetFlowTools.C:112
 jetFlowTools.C:113
 jetFlowTools.C:114
 jetFlowTools.C:115
 jetFlowTools.C:116
 jetFlowTools.C:117
 jetFlowTools.C:118
 jetFlowTools.C:119
 jetFlowTools.C:120
 jetFlowTools.C:121
 jetFlowTools.C:122
 jetFlowTools.C:123
 jetFlowTools.C:124
 jetFlowTools.C:125
 jetFlowTools.C:126
 jetFlowTools.C:127
 jetFlowTools.C:128
 jetFlowTools.C:129
 jetFlowTools.C:130
 jetFlowTools.C:131
 jetFlowTools.C:132
 jetFlowTools.C:133
 jetFlowTools.C:134
 jetFlowTools.C:135
 jetFlowTools.C:136
 jetFlowTools.C:137
 jetFlowTools.C:138
 jetFlowTools.C:139
 jetFlowTools.C:140
 jetFlowTools.C:141
 jetFlowTools.C:142
 jetFlowTools.C:143
 jetFlowTools.C:144
 jetFlowTools.C:145
 jetFlowTools.C:146
 jetFlowTools.C:147
 jetFlowTools.C:148
 jetFlowTools.C:149
 jetFlowTools.C:150
 jetFlowTools.C:151
 jetFlowTools.C:152
 jetFlowTools.C:153
 jetFlowTools.C:154
 jetFlowTools.C:155
 jetFlowTools.C:156
 jetFlowTools.C:157
 jetFlowTools.C:158
 jetFlowTools.C:159
 jetFlowTools.C:160
 jetFlowTools.C:161
 jetFlowTools.C:162
 jetFlowTools.C:163
 jetFlowTools.C:164
 jetFlowTools.C:165
 jetFlowTools.C:166
 jetFlowTools.C:167
 jetFlowTools.C:168
 jetFlowTools.C:169
 jetFlowTools.C:170
 jetFlowTools.C:171
 jetFlowTools.C:172
 jetFlowTools.C:173
 jetFlowTools.C:174
 jetFlowTools.C:175
 jetFlowTools.C:176
 jetFlowTools.C:177
 jetFlowTools.C:178
 jetFlowTools.C:179
 jetFlowTools.C:180
 jetFlowTools.C:181
 jetFlowTools.C:182
 jetFlowTools.C:183
 jetFlowTools.C:184
 jetFlowTools.C:185
 jetFlowTools.C:186
 jetFlowTools.C:187
 jetFlowTools.C:188
 jetFlowTools.C:189
 jetFlowTools.C:190
 jetFlowTools.C:191
 jetFlowTools.C:192
 jetFlowTools.C:193
 jetFlowTools.C:194
 jetFlowTools.C:195
 jetFlowTools.C:196
 jetFlowTools.C:197
 jetFlowTools.C:198
 jetFlowTools.C:199
 jetFlowTools.C:200
 jetFlowTools.C:201
 jetFlowTools.C:202
 jetFlowTools.C:203
 jetFlowTools.C:204
 jetFlowTools.C:205
 jetFlowTools.C:206
 jetFlowTools.C:207
 jetFlowTools.C:208
 jetFlowTools.C:209
 jetFlowTools.C:210
 jetFlowTools.C:211
 jetFlowTools.C:212
 jetFlowTools.C:213
 jetFlowTools.C:214
 jetFlowTools.C:215
 jetFlowTools.C:216
 jetFlowTools.C:217
 jetFlowTools.C:218
 jetFlowTools.C:219
 jetFlowTools.C:220
 jetFlowTools.C:221
 jetFlowTools.C:222
 jetFlowTools.C:223
 jetFlowTools.C:224
 jetFlowTools.C:225
 jetFlowTools.C:226
 jetFlowTools.C:227
 jetFlowTools.C:228
 jetFlowTools.C:229
 jetFlowTools.C:230
 jetFlowTools.C:231
 jetFlowTools.C:232
 jetFlowTools.C:233
 jetFlowTools.C:234
 jetFlowTools.C:235
 jetFlowTools.C:236
 jetFlowTools.C:237
 jetFlowTools.C:238
 jetFlowTools.C:239
 jetFlowTools.C:240
 jetFlowTools.C:241
 jetFlowTools.C:242
 jetFlowTools.C:243
 jetFlowTools.C:244
 jetFlowTools.C:245
 jetFlowTools.C:246
 jetFlowTools.C:247
 jetFlowTools.C:248
 jetFlowTools.C:249
 jetFlowTools.C:250
 jetFlowTools.C:251
 jetFlowTools.C:252
 jetFlowTools.C:253
 jetFlowTools.C:254
 jetFlowTools.C:255
 jetFlowTools.C:256
 jetFlowTools.C:257
 jetFlowTools.C:258
 jetFlowTools.C:259
 jetFlowTools.C:260
 jetFlowTools.C:261
 jetFlowTools.C:262
 jetFlowTools.C:263
 jetFlowTools.C:264
 jetFlowTools.C:265
 jetFlowTools.C:266
 jetFlowTools.C:267
 jetFlowTools.C:268
 jetFlowTools.C:269
 jetFlowTools.C:270
 jetFlowTools.C:271
 jetFlowTools.C:272
 jetFlowTools.C:273
 jetFlowTools.C:274
 jetFlowTools.C:275
 jetFlowTools.C:276
 jetFlowTools.C:277
 jetFlowTools.C:278
 jetFlowTools.C:279
 jetFlowTools.C:280
 jetFlowTools.C:281
 jetFlowTools.C:282
 jetFlowTools.C:283
 jetFlowTools.C:284
 jetFlowTools.C:285
 jetFlowTools.C:286
 jetFlowTools.C:287
 jetFlowTools.C:288
 jetFlowTools.C:289
 jetFlowTools.C:290
 jetFlowTools.C:291
 jetFlowTools.C:292
 jetFlowTools.C:293
 jetFlowTools.C:294
 jetFlowTools.C:295
 jetFlowTools.C:296
 jetFlowTools.C:297
 jetFlowTools.C:298
 jetFlowTools.C:299
 jetFlowTools.C:300
 jetFlowTools.C:301
 jetFlowTools.C:302
 jetFlowTools.C:303
 jetFlowTools.C:304
 jetFlowTools.C:305
 jetFlowTools.C:306
 jetFlowTools.C:307
 jetFlowTools.C:308
 jetFlowTools.C:309
 jetFlowTools.C:310
 jetFlowTools.C:311
 jetFlowTools.C:312