ROOT logo
#include "AliHistoListWrapper.h"
#include "TH2F.h"
#include "TList.h"
#include "AliLog.h"
#include "TString.h"
#include "AliESDInputHandlerRP.h"
#include "AliAnalysisManager.h"
#include "TTree.h"
#include "AliMultiplicity.h"

ClassImp(AliHistoListWrapper)

AliHistoListWrapper::AliHistoListWrapper():
  TNamed(), fList(0)
{
  
  // constructor
  fList = new TList();
  fList->SetOwner();

}

AliHistoListWrapper::AliHistoListWrapper(const char* name, const char* title):
  TNamed(name,title), fList(0)
{
  // constructor

  fList = new TList();
  fList->SetOwner();

}

AliHistoListWrapper::AliHistoListWrapper(const AliHistoListWrapper& obj) : 
  TNamed(obj),
  fList(0)
{
  // Copy ctor
  fList  = obj.fList;
}

AliHistoListWrapper::~AliHistoListWrapper() {
  // Destructor
  if(fList) {
    delete fList;
    fList = 0;
  }

}

Long64_t AliHistoListWrapper::Merge(TCollection* list)
{
  // Merge a list of AliHistoListWrapper objects with this.
  // Returns the number of merged objects (including this).

  // We have to make sure that all the list contain the same histos in
  // the same order. We thus also have to sort the list (sorting is
  // done by name in TList).

  //  AliInfo("Merging");

  if (!list)
    return 0;

  if (list->IsEmpty())
    return 1;

  TIterator* iter = list->MakeIterator();
  TObject* obj;

  // collections of all histograms
  TList collections;

  Int_t count = 0;

  while ((obj = iter->Next())) {
    Bool_t foundDiffinThisIterStep = kFALSE;

    //    Printf("%d - %s",count, obj->GetName());
    AliHistoListWrapper* entry = dynamic_cast<AliHistoListWrapper*> (obj);
    if (entry == 0) 
      continue;

    TList * hlist = entry->fList;

    // Check if all histos in this fList are also in the one from entry and viceversa
    // Use getters to automatically book non defined histos    

    Bool_t areListsDifferent=kTRUE;
    Int_t iloop = 0;
    Int_t max_loops = hlist->GetSize() + fList->GetSize(); // In the worst case all of the histos will be different...
    while(areListsDifferent) {
      if(iloop>max_loops) AliFatal("Infinite Loop?");
      iloop++;
      // sort
      hlist->Sort();
      fList->Sort();
      // loop over the largest 
      TObject * hist =0;
      TIterator * iterlist = 0;
      TList * thislist  = 0; // the list over which I'm iterating
      TList * otherlist = 0; // the other

      if (hlist->GetSize() >= fList->GetSize()) { 
	thislist  = hlist;
	otherlist = fList;
      }
      else{
	thislist  = fList;
	otherlist = hlist;	
      }
      iterlist = thislist->MakeIterator();

      while ((hist= iterlist->Next())){ 
	if(!otherlist->FindObject(hist->GetName())){
	  AliInfo(Form("Adding object %s",hist->GetName()));	  
	  TH1 * hclone =  (TH1*) hist->Clone();
	  if (!hclone->InheritsFrom("TH1")) AliFatal(Form("Found a %s. This class only supports objects inheriting from TH1",hclone->ClassName()));
	  hclone->Reset();
	  otherlist->Add(hclone);
	  foundDiffinThisIterStep=kTRUE;
	}
      }

      // re-sort before checking
      hlist->Sort();
      fList->Sort();

      // check if everything is fine    
      areListsDifferent=kFALSE;
      if (hlist->GetSize() == fList->GetSize()) {	
	Int_t nhist =  fList->GetSize();
	for(Int_t ihist = 0; ihist < nhist; ihist++){
	  if(strcmp(fList->At(ihist)->GetName(),hlist->At(ihist)->GetName())) areListsDifferent = kTRUE;
	}
      } else {
	areListsDifferent=kTRUE;
      }
    }

    // last check: if something is not ok die loudly 
    if (hlist->GetSize() != fList->GetSize()) {
      AliFatal("Mismatching size!");
    }
    Int_t nhist =  fList->GetSize();
    for(Int_t ihist = 0; ihist < nhist; ihist++){
      if(strcmp(fList->At(ihist)->GetName(),hlist->At(ihist)->GetName())){
	AliFatal(Form("Mismatching histos: %s -> %s", fList->At(ihist)->GetName(),hlist->At(ihist)->GetName()));
      }
    }
    
    if (foundDiffinThisIterStep){
      iter->Reset(); // We found a difference: previous lists could
		     // also be affected... We start from scratch
      collections.Clear();
      count = 0;
    }
    else {
      
      collections.Add(hlist);
      
      count++;
    }
  }

  fList->Merge(&collections);
  
  delete iter;

  return count+1;
}


AliHistoListWrapper& AliHistoListWrapper::operator=(const AliHistoListWrapper& wrap) {

  // Assignment operator
  if(this!=&wrap) {
    
    fList = new TList();
    fList->SetOwner();
    TIterator* iter = wrap.fList->MakeIterator();
    TObject* obj;

    while ((obj = iter->Next())) {
      fList->Add(obj->Clone());
    }

  }
  return *this;
}

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