ROOT logo
// Macro redoFinish.C is typically used after the merging macros (mergeOutput.C or
// mergeOutputOnGrid.C) have been used to produce the merged, large statistics
// file of flow analysis. Results stored in merged file are WRONG because after
// merging the results from small statistics files are trivially summed up in all
// histograms. This is taken into account and corrected for with macro redoFinish.C.
// Another typical use of the macro redoFinish.C is to repeat the call to Finish()
// in all classes, but with different values of some settings which might modify
// the final results (Example: redo the Finish() and apply correction for detector
// effects in QC code because by default this correction is switched off).

// Name of the merged, large statistics file obtained with the merging macros:
TString mergedFileName = "mergedAnalysisResults.root";
// Final output file name holding correct final results for large statistics sample:
TString outputFileName = "AnalysisResults.root";

Bool_t bApplyCorrectionForNUA = kFALSE; // apply correction for non-uniform acceptance
Bool_t bApplyCorrectionForNUAVsM = kFALSE; // apply correction for non-uniform acceptance in each multiplicity bin independently
Bool_t bPropagateErrorAlsoFromNIT = kFALSE; // propagate error also from non-isotropic terms
Bool_t bMinimumBiasReferenceFlow = kTRUE; // store in CRH for reference flow the result obtained wihout rebinning in multiplicity (kTRUE)
Bool_t checkForCommonHistResults = kTRUE; // check explicitely if the TList AliFlowCommonHistResults is available in the output

void redoFinish()
{
  LoadLibraries();

  TString mergedFileFullPathName(gSystem->pwd());
  mergedFileFullPathName+="/";
  mergedFileFullPathName+=mergedFileName.Data();
  TFile *mergedFile = NULL;
  if(gSystem->AccessPathName(mergedFileFullPathName.Data(),kFileExists))
  {
    cout<<endl;
    cout<<" WARNING: Couldn't find a file: "<<mergedFileName.Data()<<endl;
    cout<<"          in directory "<<gSystem->pwd()<<" !!!!"<<endl;
    cout<<endl;
    exit(0);
  }
  else
  {
    // Create temporarily copy of <mergedFileName> if neccessary:
    if(!(mergedFileName == outputFileName))
    {
      TSystemFile *fileTemp = new TSystemFile(mergedFileFullPathName.Data(),".");
      gSystem->Unlink("mergedAnalysisResultsTemp.root");
      fileTemp->Copy("mergedAnalysisResultsTemp.root");
      delete fileTemp;
    }
    // Access <mergedFileName>:
    mergedFile = TFile::Open(mergedFileFullPathName.Data(),"UPDATE");
  }

  // Access from <mergedFileName> the merged TDirectoryFile's for each method and from them the lists holding histograms:
  
  TList* mergedFileKeys = mergedFile->GetListOfKeys();
  for(Int_t i=0; i<mergedFileKeys->GetEntries(); i++)
  {
    TDirectory* directory = dynamic_cast<TDirectory*>(mergedFile->Get(mergedFileKeys->At(i)->GetName()));
    if (!directory) continue;

    TList* listTemp = directory->GetListOfKeys();
    if(!listTemp) continue;
    for (Int_t icent=0; icent<listTemp->GetEntries(); icent++)
    {
      TList* list = dynamic_cast<TList*>(directory->Get(listTemp->At(icent)->GetName()));
      if (!list) continue;
      if(checkForCommonHistResults && (!CheckForCommonHistResults(list))) continue;
      ////////////////////
      if(TString(list->GetName()).Contains("MCEP"))
      {
        AliFlowAnalysisWithMCEventPlane* mcep = new AliFlowAnalysisWithMCEventPlane();
        mcep->GetOutputHistograms(list);
        mcep->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // SP:
      else if(TString(list->GetName()).Contains("SP"))
      {
        AliFlowAnalysisWithScalarProduct* sp = new AliFlowAnalysisWithScalarProduct();
        sp->GetOutputHistograms(list);
        sp->GetHistProConfig()->SetBinContent(1,(Int_t)bApplyCorrectionForNUA*
                                              sp->GetHistProConfig()->GetEntries());
        sp->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // GFC:
      else if(TString(list->GetName()).Contains("GFC"))
      {
        AliFlowAnalysisWithCumulants* gfc = new AliFlowAnalysisWithCumulants();
        gfc->GetOutputHistograms(list);
        gfc->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // QC:
      else if(TString(list->GetName()).Contains("QC"))
      {
        AliFlowAnalysisWithQCumulants* qc = new AliFlowAnalysisWithQCumulants();
        qc->GetOutputHistograms(list);
        qc->GetIntFlowFlags()->SetBinContent(3,(Int_t)bApplyCorrectionForNUA);
        qc->GetIntFlowFlags()->SetBinContent(8,(Int_t)bApplyCorrectionForNUAVsM);
        qc->GetIntFlowFlags()->SetBinContent(9,(Int_t)bPropagateErrorAlsoFromNIT);
        qc->GetIntFlowFlags()->SetBinContent(11,(Int_t)bMinimumBiasReferenceFlow);
        qc->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // FQD:
      else if(TString(list->GetName()).Contains("FQD"))
      {
        AliFlowAnalysisWithFittingQDistribution* fqd = new AliFlowAnalysisWithFittingQDistribution();
        fqd->GetOutputHistograms(list);
        fqd->Finish(kTRUE);
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // LYZ1SUM:
      else if(TString(list->GetName()).Contains("LYZ1SUM"))
      {
        AliFlowAnalysisWithLeeYangZeros* lyz1sum = new AliFlowAnalysisWithLeeYangZeros();
        lyz1sum->SetFirstRun(kTRUE);
        lyz1sum->SetUseSum(kTRUE);
        lyz1sum->GetOutputHistograms(list);
        lyz1sum->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // LYZ2SUM:
      else if(TString(list->GetName()).Contains("LYZ2SUM"))
      {
        AliFlowAnalysisWithLeeYangZeros* lyz2sum = new AliFlowAnalysisWithLeeYangZeros();
        lyz2sum->SetFirstRun(kFALSE);
        lyz2sum->SetUseSum(kTRUE);
        lyz2sum->GetOutputHistograms(list);
        lyz2sum->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // LYZ1PROD:
      else if(TString(list->GetName()).Contains("LYZ1PROD"))
      {
        AliFlowAnalysisWithLeeYangZeros* lyz1prod = new AliFlowAnalysisWithLeeYangZeros();
        lyz1prod->SetFirstRun(kTRUE);
        lyz1prod->SetUseSum(kFALSE);
        lyz1prod->GetOutputHistograms(list);
        lyz1prod->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // LYZ2PROD:
      else if(TString(list->GetName()).Contains("LYZ2PROD"))
      {
        AliFlowAnalysisWithLeeYangZeros* lyz2prod = new AliFlowAnalysisWithLeeYangZeros();
        lyz2prod->SetFirstRun(kFALSE);
        lyz2prod->SetUseSum(kFALSE);
        lyz2prod->GetOutputHistograms(list);
        lyz2prod->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // LYZEP:
      else if(TString(list->GetName()).Contains("LYZEP"))
      {
        AliFlowAnalysisWithLYZEventPlane* lyzep = new AliFlowAnalysisWithLYZEventPlane();
        lyzep->GetOutputHistograms(list);
        lyzep->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // MH:
      else if(TString(list->GetName()).Contains("MH"))
      {
        AliFlowAnalysisWithMixedHarmonics* mh = new AliFlowAnalysisWithMixedHarmonics();
        mh->GetOutputHistograms(list);
        mh->GetAnalysisSettings()->SetBinContent(1,(Int_t)bApplyCorrectionForNUA);
        mh->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
      // NL:
      else if(TString(list->GetName()).Contains("NL"))
      {
        AliFlowAnalysisWithNestedLoops* nl = new AliFlowAnalysisWithNestedLoops();
        nl->GetOutputHistograms(list);
        nl->Finish();
        directory->Add(list,kTRUE);
        directory->Write(directory->GetName(),TObject::kSingleKey+TObject::kWriteDelete);
      }
    }//for icent
  }//

    // Close the final output file:
    delete mergedFile;

    // Giving the final names if neccessary:
    if(!(mergedFileName == outputFileName))
    {
      TSystemFile *outputFileFinal = new TSystemFile(mergedFileName.Data(),".");
      outputFileFinal->Rename(outputFileName.Data());
      delete outputFileFinal;
      TSystemFile *mergedFileFinal = new TSystemFile("mergedAnalysisResultsTemp.root",".");
      mergedFileFinal->Rename(mergedFileName.Data());
      delete mergedFileFinal;
    } // end of if(!(mergedFileName == outputFileName))

    cout<<endl;

} // end of void redoFinish(Int_t mode=mLocal)

void LoadLibraries()
{
  //--------------------------------------
  // Load the needed libraries most of them already loaded by aliroot
  //--------------------------------------
  //gSystem->Load("libTree");
  gSystem->Load("libGeom");
  gSystem->Load("libVMC");
  gSystem->Load("libXMLIO");
  gSystem->Load("libPhysics");

  // for AliRoot
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libPWGflowBase");
  gSystem->Load("libPWGflowTasks");
} // end of void LoadLibrariesRF(const libModes mode)

Bool_t CheckForCommonHistResults(TList* list) {
    // check for common hist results. Redmer Alexander Bertens, r.a.bertens@cern.ch
    for(Int_t i(0); i < list->GetEntries(); i++) if(((list->At(i))->IsA())->GetBaseClass("AliFlowCommonHistResults")) return kTRUE;
    return kFALSE;
}
 redoFinish.C:1
 redoFinish.C:2
 redoFinish.C:3
 redoFinish.C:4
 redoFinish.C:5
 redoFinish.C:6
 redoFinish.C:7
 redoFinish.C:8
 redoFinish.C:9
 redoFinish.C:10
 redoFinish.C:11
 redoFinish.C:12
 redoFinish.C:13
 redoFinish.C:14
 redoFinish.C:15
 redoFinish.C:16
 redoFinish.C:17
 redoFinish.C:18
 redoFinish.C:19
 redoFinish.C:20
 redoFinish.C:21
 redoFinish.C:22
 redoFinish.C:23
 redoFinish.C:24
 redoFinish.C:25
 redoFinish.C:26
 redoFinish.C:27
 redoFinish.C:28
 redoFinish.C:29
 redoFinish.C:30
 redoFinish.C:31
 redoFinish.C:32
 redoFinish.C:33
 redoFinish.C:34
 redoFinish.C:35
 redoFinish.C:36
 redoFinish.C:37
 redoFinish.C:38
 redoFinish.C:39
 redoFinish.C:40
 redoFinish.C:41
 redoFinish.C:42
 redoFinish.C:43
 redoFinish.C:44
 redoFinish.C:45
 redoFinish.C:46
 redoFinish.C:47
 redoFinish.C:48
 redoFinish.C:49
 redoFinish.C:50
 redoFinish.C:51
 redoFinish.C:52
 redoFinish.C:53
 redoFinish.C:54
 redoFinish.C:55
 redoFinish.C:56
 redoFinish.C:57
 redoFinish.C:58
 redoFinish.C:59
 redoFinish.C:60
 redoFinish.C:61
 redoFinish.C:62
 redoFinish.C:63
 redoFinish.C:64
 redoFinish.C:65
 redoFinish.C:66
 redoFinish.C:67
 redoFinish.C:68
 redoFinish.C:69
 redoFinish.C:70
 redoFinish.C:71
 redoFinish.C:72
 redoFinish.C:73
 redoFinish.C:74
 redoFinish.C:75
 redoFinish.C:76
 redoFinish.C:77
 redoFinish.C:78
 redoFinish.C:79
 redoFinish.C:80
 redoFinish.C:81
 redoFinish.C:82
 redoFinish.C:83
 redoFinish.C:84
 redoFinish.C:85
 redoFinish.C:86
 redoFinish.C:87
 redoFinish.C:88
 redoFinish.C:89
 redoFinish.C:90
 redoFinish.C:91
 redoFinish.C:92
 redoFinish.C:93
 redoFinish.C:94
 redoFinish.C:95
 redoFinish.C:96
 redoFinish.C:97
 redoFinish.C:98
 redoFinish.C:99
 redoFinish.C:100
 redoFinish.C:101
 redoFinish.C:102
 redoFinish.C:103
 redoFinish.C:104
 redoFinish.C:105
 redoFinish.C:106
 redoFinish.C:107
 redoFinish.C:108
 redoFinish.C:109
 redoFinish.C:110
 redoFinish.C:111
 redoFinish.C:112
 redoFinish.C:113
 redoFinish.C:114
 redoFinish.C:115
 redoFinish.C:116
 redoFinish.C:117
 redoFinish.C:118
 redoFinish.C:119
 redoFinish.C:120
 redoFinish.C:121
 redoFinish.C:122
 redoFinish.C:123
 redoFinish.C:124
 redoFinish.C:125
 redoFinish.C:126
 redoFinish.C:127
 redoFinish.C:128
 redoFinish.C:129
 redoFinish.C:130
 redoFinish.C:131
 redoFinish.C:132
 redoFinish.C:133
 redoFinish.C:134
 redoFinish.C:135
 redoFinish.C:136
 redoFinish.C:137
 redoFinish.C:138
 redoFinish.C:139
 redoFinish.C:140
 redoFinish.C:141
 redoFinish.C:142
 redoFinish.C:143
 redoFinish.C:144
 redoFinish.C:145
 redoFinish.C:146
 redoFinish.C:147
 redoFinish.C:148
 redoFinish.C:149
 redoFinish.C:150
 redoFinish.C:151
 redoFinish.C:152
 redoFinish.C:153
 redoFinish.C:154
 redoFinish.C:155
 redoFinish.C:156
 redoFinish.C:157
 redoFinish.C:158
 redoFinish.C:159
 redoFinish.C:160
 redoFinish.C:161
 redoFinish.C:162
 redoFinish.C:163
 redoFinish.C:164
 redoFinish.C:165
 redoFinish.C:166
 redoFinish.C:167
 redoFinish.C:168
 redoFinish.C:169
 redoFinish.C:170
 redoFinish.C:171
 redoFinish.C:172
 redoFinish.C:173
 redoFinish.C:174
 redoFinish.C:175
 redoFinish.C:176
 redoFinish.C:177
 redoFinish.C:178
 redoFinish.C:179
 redoFinish.C:180
 redoFinish.C:181
 redoFinish.C:182
 redoFinish.C:183
 redoFinish.C:184
 redoFinish.C:185
 redoFinish.C:186
 redoFinish.C:187
 redoFinish.C:188
 redoFinish.C:189
 redoFinish.C:190
 redoFinish.C:191
 redoFinish.C:192
 redoFinish.C:193
 redoFinish.C:194
 redoFinish.C:195
 redoFinish.C:196
 redoFinish.C:197
 redoFinish.C:198
 redoFinish.C:199
 redoFinish.C:200
 redoFinish.C:201
 redoFinish.C:202
 redoFinish.C:203
 redoFinish.C:204
 redoFinish.C:205
 redoFinish.C:206
 redoFinish.C:207
 redoFinish.C:208
 redoFinish.C:209
 redoFinish.C:210
 redoFinish.C:211
 redoFinish.C:212
 redoFinish.C:213
 redoFinish.C:214
 redoFinish.C:215
 redoFinish.C:216
 redoFinish.C:217
 redoFinish.C:218
 redoFinish.C:219
 redoFinish.C:220
 redoFinish.C:221
 redoFinish.C:222
 redoFinish.C:223
 redoFinish.C:224
 redoFinish.C:225
 redoFinish.C:226
 redoFinish.C:227
 redoFinish.C:228
 redoFinish.C:229
 redoFinish.C:230
 redoFinish.C:231
 redoFinish.C:232
 redoFinish.C:233
 redoFinish.C:234