ROOT logo
#if !defined( __CINT__) || defined(__MAKECINT__)

#include <vector>
#include <TChain.h>
#include <TObjArray.h>
#include <TFile.h>
#include <TGraphErrors.h>
#include <TTree.h>
#include <TDirectory.h>
#include <TROOT.h>
#include <TString.h>
#include <Riostream.h>
#include <TSystem.h>
#include <TH1F.h>
#include <AliCDBManager.h>
#include "../TRD/AliTRDCalibra.h"

#endif


Bool_t AliTRDCreateVector2DSum(const char* variablecali, const char* noime, const char* dire, const char* namefile){
  //
  // After having simulated and reconstructed events in subrepertories 000%d of dire
  // this macro searchs in the subdirectories the file TRD.calibration.root
  // takes the vectors and merge them
  // variablecali can be treeCH2d, treePH2d or treePRF2d
  // noime is the name of the "sum" tree
  // namefile is the name of the file where noime will be written
  //


  // The tree
  TChain *treeChain = new TChain(variablecali);
   

  //Variables
  TObjArray *vectorplace = new TObjArray();
  TObjArray *whereinthechain = new TObjArray();


  //TRDCalibra
  AliCDBManager *man = AliCDBManager::Instance();
  man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  man->SetRun(0);
  AliTRDCalibra *calibra = AliTRDCalibra::Instance();

  //The patterns
  const char *name="TRD.calibration.root";
  const char *patterndir="0";
  const char *namesubdir = 0x0;
  char dir[200];

  //Open the directory dire
  void * dircu = gSystem->OpenDirectory(dire);
  while((namesubdir = gSystem->GetDirEntry(dircu))) {
    if(strstr(namesubdir,patterndir)) {
      sprintf(dir,"%s/%s",dire,namesubdir);
      printf("process subdirectories: %s\n",dir);
      
      //full name of the file and tree
      char fullname[255] = "";
      
      sprintf(fullname,"%s/%s",dir,name);
      printf("Process file: %s\n",fullname);
      TFile *file = new TFile(fullname,"READ");
      if(!file) continue;
      TTree *treecurrent = (TTree *) file->Get(variablecali);
      if(!treecurrent) continue;
      gDirectory = gROOT;
      TObjArray *vectorcurrent = calibra->ConvertTreeVector(treecurrent);
      printf("Size of the current tree: %d\n",(Int_t) vectorcurrent->GetEntriesFast());
      printf("Size of whereinthechain: %d\n",(Int_t) whereinthechain->GetEntriesFast());
      printf("Size of the chain: %d\n", (Int_t) treeChain->GetEntries());
      Int_t j = (Int_t) treeChain->GetEntries();
	for(Int_t jui = 0; jui < (Int_t) vectorcurrent->GetEntriesFast(); jui++){
	  //Search if already found
	  Int_t place = calibra->SearchInTreeVector(vectorplace,((AliTRDCalibra::AliTRDPlace *)vectorcurrent->At(jui))->GetPlace());
	  //Create a new element in the two std vectors
	  if(place == -1){
	    AliTRDCalibra::AliTRDPlace *placejui = new AliTRDCalibra::AliTRDPlace();
	    placejui->SetPlace(j+jui);
	    TObjArray *chainplace = new TObjArray();
	    chainplace->Add((TObject *) placejui);
	    vectorplace->Add((TObject *) (vectorcurrent->At(jui)));
	    whereinthechain->Add((TObject *) chainplace);
	  }
	  //Update the element at the place "place" in the std vector whereinthechain
	  else {
	    AliTRDCalibra::AliTRDPlace *placejui = new AliTRDCalibra::AliTRDPlace();
	    placejui->SetPlace((j+jui));
	    TObjArray *chainplace = ((TObjArray *) whereinthechain->At(place));
	    chainplace->Add((TObject *) placejui);
	    whereinthechain->AddAt((TObject *)chainplace, place);
	  }
	} 
	treeChain->AddFile(fullname);
	delete file;
    }//if pattern
  }// in the sub
  
  //Take care of the profile
  const char* pattern = "P";
  TTree *tree;

  if(!strstr(variablecali,pattern)){
    //Ready to read the chain
    TH1F *his = 0x0;
    treeChain->SetBranchAddress("histo",&his);
    
    //Initialise the final tree
    Int_t group = -1;
    TH1F *histsum = 0x0;
    
    tree = new TTree(noime,noime);
    tree->Branch("groupnumber",&group,"groupnumber/I");
    tree->Branch("histo","TH1F",&histsum,32000,0);
    
    //Init histsum
    if(treeChain->GetEntries() < 1) return kFALSE; 
    
    printf("FINAL Size of the chain: %d\n", (Int_t) treeChain->GetEntriesFast());
    printf("FINAL Size of vectorplace: %d\n", (Int_t) vectorplace->GetEntriesFast());
    for(Int_t h = 0; h < (Int_t) vectorplace->GetEntriesFast(); h++){
      group = ((AliTRDCalibra::AliTRDPlace *)vectorplace->At(h))->GetPlace();
      TObjArray *chainplace = ((TObjArray *)whereinthechain->At(h));
      treeChain->GetEntry(((AliTRDCalibra::AliTRDPlace *)chainplace->At(0))->GetPlace());
      //Init for the first time
      if(h == 0)  {
	histsum = new TH1F("","",his->GetXaxis()->GetNbins(),his->GetXaxis()->GetBinLowEdge(1),his->GetXaxis()->GetBinUpEdge(his->GetXaxis()->GetNbins()));
	histsum->Sumw2();
      }
      //Reset for each new group
      histsum->SetEntries(0);
      for(Int_t l = 0; l <= histsum->GetXaxis()->GetNbins(); l++){
	histsum->SetBinContent(l,0.0);
	histsum->SetBinError(l,0.0);
      }
      histsum->Add(his,1);
      if((Int_t) chainplace->GetEntriesFast() > 1){
	for(Int_t s = 1; s < (Int_t)chainplace->GetEntriesFast(); s++){
	  treeChain->GetEntry(((AliTRDCalibra::AliTRDPlace *)chainplace->At(s))->GetPlace());
	  histsum->Add(his,1);
	}
      }
      tree->Fill();
    }
  }
  else {
    //Ready to read the chain
    TGraphErrors *his = 0x0;
    treeChain->SetBranchAddress("histo",&his);
    
    //Initialise the final tree
    Int_t group = -1;
    TGraphErrors *histsum = 0x0;
    Double_t *xref = 0x0;
   
    
    tree = new TTree(noime,noime);
    tree->Branch("groupnumber",&group,"groupnumber/I");
    tree->Branch("histo","TGraphErrors",&histsum,32000,0);
    
    //Init histsum
    if(treeChain->GetEntries() < 1) return kFALSE; 
    
    printf("FINAL Size of the chain: %d\n", (Int_t) treeChain->GetEntriesFast());
    printf("FINAL Size of vectorplace: %d\n", (Int_t) vectorplace->GetEntriesFast());
    for(Int_t h = 0; h < (Int_t) vectorplace->GetEntriesFast(); h++){
      group = ((AliTRDCalibra::AliTRDPlace *)vectorplace->At(h))->GetPlace();
      TObjArray *chainplace = ((TObjArray *)whereinthechain->At(h));
      treeChain->GetEntry(((AliTRDCalibra::AliTRDPlace *)chainplace->At(0))->GetPlace());
      //Init for the fisrt time
      Int_t nbins = his->GetN();
      Double_t *x;
      x = new Double_t[nbins];
      xref = his->GetX();
      Double_t *ex;
      ex = new Double_t[nbins];
      Double_t *y;
      y = new Double_t[nbins];
      Double_t *ey;
      ey = new Double_t[nbins];
      
      for(Int_t lo = 0; lo < nbins; lo++){
	x[lo] = xref[lo];
	ex[lo] = 0.0;
	y[lo]  = 0.0;
	ey[lo] = 0.0;
      }
      delete histsum;
      histsum = new TGraphErrors(nbins,x,y,ex,ey);
      //Reset for each group
      Double_t *xp;
      xp = histsum->GetX();
      Double_t *exp;
      exp = histsum->GetEX();
      Double_t *yp;
      yp = histsum->GetY();
      Double_t *eyp;
      eyp = histsum->GetEY();
     
      //Add the first
      histsum = calibra->AddProfiles(his,histsum);
      if((Int_t) chainplace->GetEntriesFast() > 1){
	for(Int_t s = 1; s < (Int_t)chainplace->GetEntriesFast(); s++){
	  treeChain->GetEntry(((AliTRDCalibra::AliTRDPlace *)chainplace->At(s))->GetPlace());
	  histsum = calibra->AddProfiles(his,histsum);
	}
      }
      tree->Fill();
    }
    
  }


  //Write in a file
  TFile *fout = TFile::Open((const char*) namefile,"UPDATE");
  fout->WriteTObject(tree,tree->GetName(),(Option_t *) "kOverWrite");
  fout->Close();

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