ROOT logo
#include "TStopwatch.h"
#include "Riostream.h"
#include "TFile.h"

int runFlowOnTheFlyGlauber(Int_t nevents=100000, Int_t iseed=1)
{
    gSystem->Load("libGeom");
    gSystem->Load("libVMC");
    gSystem->Load("libXMLIO");
    gSystem->Load("libPhysics");
    gSystem->Load("libPWGflowBase");
    gSystem->Load("libPWGGlauber");
    
    fMyTRandom3 = new TRandom3(iseed);   
    gRandom->SetSeed(iseed);
    TFile *outputFile = new TFile("flowOnTheFlyGlauber.root","RECREATE");
    
    TStopwatch timer;
    timer.Start();
    
    runOneCentrality(3,nevents);
    runOneCentrality(4,nevents);
    runOneCentrality(5,nevents);
    
    outputFile->Close();
    delete outputFile;
    
    cout<<endl; cout<<" ---- Fini ---- "<<endl; cout<<endl;
    timer.Stop(); timer.Print();
}

void runOneCentrality(Int_t centrality=3, Int_t nEvts=100)
{
    
    //centralities: 0: 0-5
    //              1: 5-10
    //              2: 10-20
    //              3: 20-30
    //              4: 30-40
    //              5: 40-50
    //              6: 50-60
    //              7: 60-70
    //              8: 70-80
    
    Double_t centPerc[] = {0,5,10,20,30,40,50,60,70,80};
    Double_t xCross[] = {2.5,7.5,15.,25.,35.,45.,55.,65.,75.};
    Double_t xCrossErr[9] = {0.};
    Double_t impact[] = {0., 3.5, 4.95, 6.98, 8.55, 9.88, 11.4, 12.09, 13.06, 13.97};
    Double_t npart[] = {1000, 356, 305, 220, 155, 105, 67, 40, 21, 10, 4, 0};
 
    Option_t *sysA="Pb"; 
    Option_t *sysB="Pb";
    Double_t signn=64; // inelastic nucleon nucleon cross section
    //const char *fname="GlauberMC_PbPb_ntuple.root"; // name output file
    //  AliGlauberMC::RunAndSaveNtuple(nevents,sysA,sysB,signn);
    // run the code to produce an ntuple:

    Double_t mind=0.4;
    Double_t r=6.62;
    Double_t a=0.546;
    
    AliGlauberMC glauber(sysA,sysB,signn);
    glauber.SetMinDistance(mind);
    glauber.Setr(r);
    glauber.Seta(a);
    glauber.SetDoPartProduction(kTRUE);
    glauber.SetBmin(impact[centrality]);
    glauber.SetBmax(impact[centrality+1]);    
    glauber.SetdNdEtaType(AliGlauberMC::kNBDSV);
    glauber.GetdNdEtaParam()[0] = 2.49;    //npp
    glauber.GetdNdEtaParam()[1] = 1.7;  //ratioSgm2Mu
    glauber.GetdNdEtaParam()[2] = 0.13; //xhard

    
    AliFlowAnalysisWithMCEventPlane* mcep2 = new AliFlowAnalysisWithMCEventPlane();
    mcep2->SetHarmonic(2); // default is v2
    mcep2->Init();
    AliFlowAnalysisWithMCEventPlane* mcep3 = new AliFlowAnalysisWithMCEventPlane();
    mcep3->SetHarmonic(3); // default is v3
    mcep3->Init();
    AliFlowAnalysisWithMCEventPlane* mcep4 = new AliFlowAnalysisWithMCEventPlane();
    mcep4->SetHarmonic(4); // default is v4
    mcep4->Init();
    AliFlowAnalysisWithMCEventPlane* mcep5 = new AliFlowAnalysisWithMCEventPlane();
    mcep5->SetHarmonic(5); // default is v5
    mcep5->Init();
    
    AliFlowAnalysisWithScalarProduct* sp2 = new AliFlowAnalysisWithScalarProduct();
    sp2->SetHarmonic(2);
    sp2->Init();
    AliFlowAnalysisWithScalarProduct* sp3 = new AliFlowAnalysisWithScalarProduct();
    sp3->SetHarmonic(3);
    sp3->Init();
    AliFlowAnalysisWithScalarProduct* sp4 = new AliFlowAnalysisWithScalarProduct();
    sp4->SetHarmonic(4);
    sp4->Init();
    AliFlowAnalysisWithScalarProduct* sp5 = new AliFlowAnalysisWithScalarProduct();
    sp5->SetHarmonic(5);
    sp5->Init();
    
    AliFlowAnalysisWithQCumulants* qc2 = new AliFlowAnalysisWithQCumulants();
    qc2->SetHarmonic(2);
    qc2->Init();
    AliFlowAnalysisWithQCumulants* qc3 = new AliFlowAnalysisWithQCumulants();
    qc3->SetHarmonic(3);
    qc3->Init();
    AliFlowAnalysisWithQCumulants* qc4 = new AliFlowAnalysisWithQCumulants();
    qc4->SetHarmonic(4);
    qc4->Init();
    AliFlowAnalysisWithQCumulants* qc5 = new AliFlowAnalysisWithQCumulants();
    qc5->SetHarmonic(5);
    qc5->Init();
    
    TH1F* histv2 = new TH1F(Form("v2 spread %.0f-%.0f",centPerc[centrality],centPerc[centrality+1]),"v_{2}",100,0,0.5);
    TH1F* histv3 = new TH1F(Form("v3 spread %.0f-%.0f",centPerc[centrality],centPerc[centrality+1]),"v_{3}",100,0,0.5);
    TH1F* histv4 = new TH1F(Form("v4 spread %.0f-%.0f",centPerc[centrality],centPerc[centrality+1]),"v_{4}",100,0,0.5);
    TH1F* histv5 = new TH1F(Form("v5 spread %.0f-%.0f",centPerc[centrality],centPerc[centrality+1]),"v_{5}",100,0,0.5);
    
    AliFlowTrackSimpleCuts *cutsRP = new AliFlowTrackSimpleCuts();
    cutsRP->SetPtMin(0.2);
    cutsRP->SetPtMax(5.0);
    AliFlowTrackSimpleCuts *cutsPOI = new AliFlowTrackSimpleCuts();
    cutsPOI->SetPtMin(0.2);
    cutsPOI->SetPtMax(10.0);
    
    Printf("starting the main event loop..");
    for(Int_t i=0; i<nEvts; i++)
    {
        if (!glauber.NextEvent()) continue;
        Double_t mult = glauber.GetdNdEta();
        Double_t v2 = 0.2*glauber.GetEpsilon2Part(); histv2->Fill(v2);
        Double_t v3 = 0.18*glauber.GetEpsilon3Part(); histv3->Fill(v3);
        Double_t v4 = 0.09*glauber.GetEpsilon4Part(); histv4->Fill(v4);
        Double_t v5 = 0.03*glauber.GetEpsilon5Part(); histv5->Fill(v5);
        
        AliFlowEventSimple* event = new AliFlowEventSimple(mult,AliFlowEventSimple::kGenerate);
        event->SetMCReactionPlaneAngle(0.);
        event->AddFlow(0,v2,v3,v4,v5);
        event->TagRP(cutsRP);
        event->TagPOI(cutsPOI);
        
        // do flow analysis for various methods:
        mcep2->Make(event);
        mcep3->Make(event);
        mcep4->Make(event);
        mcep5->Make(event);
        sp2->Make(event);
        sp3->Make(event);
        sp4->Make(event);
        sp5->Make(event);
        qc2->Make(event);
        qc3->Make(event);
        qc4->Make(event);
        qc5->Make(event);
        cout <<"Event: " << i+1 << "\r"; cout.flush();
        delete event;
    } // end of for(Int_t i=0;i<nEvts;i++)
    
    // calculate the final results
    mcep2->Finish();
    mcep3->Finish();
    mcep4->Finish();
    mcep5->Finish();
    sp2->Finish();
    sp3->Finish();
    sp4->Finish();
    sp5->Finish();
    qc2->Finish();
    qc3->Finish();
    qc4->Finish();
    qc5->Finish();
    
    // open a new file which will hold the final results of all methods:
    const Int_t nMethods = 12;
    TString method[nMethods] = {"v2 MCEP","v3 MCEP","v4 MCEP","v5 MCEP","v2 SP","v3 SP","v4 SP","v5 SP","v2 QC","v3 QC","v4 QC","v5 QC"};
    TDirectoryFile *dirFileFinal[nMethods] = {NULL};
    TString fileName[nMethods];
    for(Int_t i=0; i<nMethods; i++)
    {
        // form a file name for each method:
        fileName[i]+=method[i].Data();
        fileName[i]+=Form(" %.0f-%.0f",centPerc[centrality],centPerc[centrality+1]);
        dirFileFinal[i] = new TDirectoryFile(fileName[i].Data(),fileName[i].Data());
    }
    
    // store the final results
    mcep2->WriteHistograms(dirFileFinal[0]);
    mcep3->WriteHistograms(dirFileFinal[1]);
    mcep4->WriteHistograms(dirFileFinal[2]);
    mcep5->WriteHistograms(dirFileFinal[3]);
    sp2->WriteHistograms(dirFileFinal[4]);
    sp3->WriteHistograms(dirFileFinal[5]);
    sp4->WriteHistograms(dirFileFinal[6]);
    sp5->WriteHistograms(dirFileFinal[7]);
    qc2->WriteHistograms(dirFileFinal[8]);
    qc3->WriteHistograms(dirFileFinal[9]);
    qc4->WriteHistograms(dirFileFinal[10]);
    qc5->WriteHistograms(dirFileFinal[11]);
    
    histv2->Write();
    histv3->Write();
    histv4->Write();
    histv5->Write();
}

 runFlowOnTheFlyGlauber.C:1
 runFlowOnTheFlyGlauber.C:2
 runFlowOnTheFlyGlauber.C:3
 runFlowOnTheFlyGlauber.C:4
 runFlowOnTheFlyGlauber.C:5
 runFlowOnTheFlyGlauber.C:6
 runFlowOnTheFlyGlauber.C:7
 runFlowOnTheFlyGlauber.C:8
 runFlowOnTheFlyGlauber.C:9
 runFlowOnTheFlyGlauber.C:10
 runFlowOnTheFlyGlauber.C:11
 runFlowOnTheFlyGlauber.C:12
 runFlowOnTheFlyGlauber.C:13
 runFlowOnTheFlyGlauber.C:14
 runFlowOnTheFlyGlauber.C:15
 runFlowOnTheFlyGlauber.C:16
 runFlowOnTheFlyGlauber.C:17
 runFlowOnTheFlyGlauber.C:18
 runFlowOnTheFlyGlauber.C:19
 runFlowOnTheFlyGlauber.C:20
 runFlowOnTheFlyGlauber.C:21
 runFlowOnTheFlyGlauber.C:22
 runFlowOnTheFlyGlauber.C:23
 runFlowOnTheFlyGlauber.C:24
 runFlowOnTheFlyGlauber.C:25
 runFlowOnTheFlyGlauber.C:26
 runFlowOnTheFlyGlauber.C:27
 runFlowOnTheFlyGlauber.C:28
 runFlowOnTheFlyGlauber.C:29
 runFlowOnTheFlyGlauber.C:30
 runFlowOnTheFlyGlauber.C:31
 runFlowOnTheFlyGlauber.C:32
 runFlowOnTheFlyGlauber.C:33
 runFlowOnTheFlyGlauber.C:34
 runFlowOnTheFlyGlauber.C:35
 runFlowOnTheFlyGlauber.C:36
 runFlowOnTheFlyGlauber.C:37
 runFlowOnTheFlyGlauber.C:38
 runFlowOnTheFlyGlauber.C:39
 runFlowOnTheFlyGlauber.C:40
 runFlowOnTheFlyGlauber.C:41
 runFlowOnTheFlyGlauber.C:42
 runFlowOnTheFlyGlauber.C:43
 runFlowOnTheFlyGlauber.C:44
 runFlowOnTheFlyGlauber.C:45
 runFlowOnTheFlyGlauber.C:46
 runFlowOnTheFlyGlauber.C:47
 runFlowOnTheFlyGlauber.C:48
 runFlowOnTheFlyGlauber.C:49
 runFlowOnTheFlyGlauber.C:50
 runFlowOnTheFlyGlauber.C:51
 runFlowOnTheFlyGlauber.C:52
 runFlowOnTheFlyGlauber.C:53
 runFlowOnTheFlyGlauber.C:54
 runFlowOnTheFlyGlauber.C:55
 runFlowOnTheFlyGlauber.C:56
 runFlowOnTheFlyGlauber.C:57
 runFlowOnTheFlyGlauber.C:58
 runFlowOnTheFlyGlauber.C:59
 runFlowOnTheFlyGlauber.C:60
 runFlowOnTheFlyGlauber.C:61
 runFlowOnTheFlyGlauber.C:62
 runFlowOnTheFlyGlauber.C:63
 runFlowOnTheFlyGlauber.C:64
 runFlowOnTheFlyGlauber.C:65
 runFlowOnTheFlyGlauber.C:66
 runFlowOnTheFlyGlauber.C:67
 runFlowOnTheFlyGlauber.C:68
 runFlowOnTheFlyGlauber.C:69
 runFlowOnTheFlyGlauber.C:70
 runFlowOnTheFlyGlauber.C:71
 runFlowOnTheFlyGlauber.C:72
 runFlowOnTheFlyGlauber.C:73
 runFlowOnTheFlyGlauber.C:74
 runFlowOnTheFlyGlauber.C:75
 runFlowOnTheFlyGlauber.C:76
 runFlowOnTheFlyGlauber.C:77
 runFlowOnTheFlyGlauber.C:78
 runFlowOnTheFlyGlauber.C:79
 runFlowOnTheFlyGlauber.C:80
 runFlowOnTheFlyGlauber.C:81
 runFlowOnTheFlyGlauber.C:82
 runFlowOnTheFlyGlauber.C:83
 runFlowOnTheFlyGlauber.C:84
 runFlowOnTheFlyGlauber.C:85
 runFlowOnTheFlyGlauber.C:86
 runFlowOnTheFlyGlauber.C:87
 runFlowOnTheFlyGlauber.C:88
 runFlowOnTheFlyGlauber.C:89
 runFlowOnTheFlyGlauber.C:90
 runFlowOnTheFlyGlauber.C:91
 runFlowOnTheFlyGlauber.C:92
 runFlowOnTheFlyGlauber.C:93
 runFlowOnTheFlyGlauber.C:94
 runFlowOnTheFlyGlauber.C:95
 runFlowOnTheFlyGlauber.C:96
 runFlowOnTheFlyGlauber.C:97
 runFlowOnTheFlyGlauber.C:98
 runFlowOnTheFlyGlauber.C:99
 runFlowOnTheFlyGlauber.C:100
 runFlowOnTheFlyGlauber.C:101
 runFlowOnTheFlyGlauber.C:102
 runFlowOnTheFlyGlauber.C:103
 runFlowOnTheFlyGlauber.C:104
 runFlowOnTheFlyGlauber.C:105
 runFlowOnTheFlyGlauber.C:106
 runFlowOnTheFlyGlauber.C:107
 runFlowOnTheFlyGlauber.C:108
 runFlowOnTheFlyGlauber.C:109
 runFlowOnTheFlyGlauber.C:110
 runFlowOnTheFlyGlauber.C:111
 runFlowOnTheFlyGlauber.C:112
 runFlowOnTheFlyGlauber.C:113
 runFlowOnTheFlyGlauber.C:114
 runFlowOnTheFlyGlauber.C:115
 runFlowOnTheFlyGlauber.C:116
 runFlowOnTheFlyGlauber.C:117
 runFlowOnTheFlyGlauber.C:118
 runFlowOnTheFlyGlauber.C:119
 runFlowOnTheFlyGlauber.C:120
 runFlowOnTheFlyGlauber.C:121
 runFlowOnTheFlyGlauber.C:122
 runFlowOnTheFlyGlauber.C:123
 runFlowOnTheFlyGlauber.C:124
 runFlowOnTheFlyGlauber.C:125
 runFlowOnTheFlyGlauber.C:126
 runFlowOnTheFlyGlauber.C:127
 runFlowOnTheFlyGlauber.C:128
 runFlowOnTheFlyGlauber.C:129
 runFlowOnTheFlyGlauber.C:130
 runFlowOnTheFlyGlauber.C:131
 runFlowOnTheFlyGlauber.C:132
 runFlowOnTheFlyGlauber.C:133
 runFlowOnTheFlyGlauber.C:134
 runFlowOnTheFlyGlauber.C:135
 runFlowOnTheFlyGlauber.C:136
 runFlowOnTheFlyGlauber.C:137
 runFlowOnTheFlyGlauber.C:138
 runFlowOnTheFlyGlauber.C:139
 runFlowOnTheFlyGlauber.C:140
 runFlowOnTheFlyGlauber.C:141
 runFlowOnTheFlyGlauber.C:142
 runFlowOnTheFlyGlauber.C:143
 runFlowOnTheFlyGlauber.C:144
 runFlowOnTheFlyGlauber.C:145
 runFlowOnTheFlyGlauber.C:146
 runFlowOnTheFlyGlauber.C:147
 runFlowOnTheFlyGlauber.C:148
 runFlowOnTheFlyGlauber.C:149
 runFlowOnTheFlyGlauber.C:150
 runFlowOnTheFlyGlauber.C:151
 runFlowOnTheFlyGlauber.C:152
 runFlowOnTheFlyGlauber.C:153
 runFlowOnTheFlyGlauber.C:154
 runFlowOnTheFlyGlauber.C:155
 runFlowOnTheFlyGlauber.C:156
 runFlowOnTheFlyGlauber.C:157
 runFlowOnTheFlyGlauber.C:158
 runFlowOnTheFlyGlauber.C:159
 runFlowOnTheFlyGlauber.C:160
 runFlowOnTheFlyGlauber.C:161
 runFlowOnTheFlyGlauber.C:162
 runFlowOnTheFlyGlauber.C:163
 runFlowOnTheFlyGlauber.C:164
 runFlowOnTheFlyGlauber.C:165
 runFlowOnTheFlyGlauber.C:166
 runFlowOnTheFlyGlauber.C:167
 runFlowOnTheFlyGlauber.C:168
 runFlowOnTheFlyGlauber.C:169
 runFlowOnTheFlyGlauber.C:170
 runFlowOnTheFlyGlauber.C:171
 runFlowOnTheFlyGlauber.C:172
 runFlowOnTheFlyGlauber.C:173
 runFlowOnTheFlyGlauber.C:174
 runFlowOnTheFlyGlauber.C:175
 runFlowOnTheFlyGlauber.C:176
 runFlowOnTheFlyGlauber.C:177
 runFlowOnTheFlyGlauber.C:178
 runFlowOnTheFlyGlauber.C:179
 runFlowOnTheFlyGlauber.C:180
 runFlowOnTheFlyGlauber.C:181
 runFlowOnTheFlyGlauber.C:182
 runFlowOnTheFlyGlauber.C:183
 runFlowOnTheFlyGlauber.C:184
 runFlowOnTheFlyGlauber.C:185
 runFlowOnTheFlyGlauber.C:186
 runFlowOnTheFlyGlauber.C:187
 runFlowOnTheFlyGlauber.C:188
 runFlowOnTheFlyGlauber.C:189
 runFlowOnTheFlyGlauber.C:190
 runFlowOnTheFlyGlauber.C:191
 runFlowOnTheFlyGlauber.C:192
 runFlowOnTheFlyGlauber.C:193
 runFlowOnTheFlyGlauber.C:194
 runFlowOnTheFlyGlauber.C:195
 runFlowOnTheFlyGlauber.C:196
 runFlowOnTheFlyGlauber.C:197
 runFlowOnTheFlyGlauber.C:198
 runFlowOnTheFlyGlauber.C:199
 runFlowOnTheFlyGlauber.C:200
 runFlowOnTheFlyGlauber.C:201
 runFlowOnTheFlyGlauber.C:202
 runFlowOnTheFlyGlauber.C:203
 runFlowOnTheFlyGlauber.C:204
 runFlowOnTheFlyGlauber.C:205
 runFlowOnTheFlyGlauber.C:206