#include "Tree.h"

using namespace std;

/////////////////////////////////////////////////////////////////////////////CONSTRUCTOR
template <class T, class U>
Tree<T,U>::Tree(string rname, string tname,vector<string> vname)
{
    rooname=rname;
    treename=tname;
    nvvar=vname;
}
/////////////////////////////////////////////////////////////////////////////ADDS ENTRY TO TREE
template <class T, class U>
void Tree<T,U>::Add()
{
    T var[(const int) nvvar.size()];
    
    file = new TFile(rooname.c_str(),"update");
    tree = new TTree(treename.c_str(),"");
    
    for(int i=0; i < (int)nvvar.size();i++)
    {
        tree->Branch(nvvar.at(i).c_str(),&var[i]);
    }
    
    
    for(int i=0; i< (int)vvar.at(0).size();i++)
    {
        for(int j=0; j < (int)nvvar.size(); j++) var[j]=vvar.at(j).at(i);
        tree->Fill();
    }
    
    tree->Write();
    
    file->Close();
    
    delete file;
}
/////////////////////////////////////////////////////////////////////////////FILLS TREE WITH DATA
template <class T, class U>
void Tree<T,U>::TFill(vector< vector<T> > data)
{vvar=data;Add();}
/////////////////////////////////////////////////////////////////////////////SAVES TObject TO FILE THAT CONTAINS TREE
template <class T, class U>
void Tree<T,U>::Save(U obj)
{
    file = new TFile(rooname.c_str(),"update");
    
    obj.Write();
    
    file->Close();
    
    delete file;
}
/////////////////////////////////////////////////////////////////////////////DEFINE TYPES FOR WHICH Tree WILL BE USED
template class Tree<int,TH1F>;
template class Tree<float,TH1F>;
template class Tree<double,TH1F>;
template class Tree<short,TH1F>;
template class Tree<unsigned,TH1F>;

template class Tree<int,TF1>;
template class Tree<float,TF1>;
template class Tree<double,TF1>;
template class Tree<short,TF1>;
template class Tree<unsigned,TF1>;

template class Tree<int,TH2F>;
template class Tree<float,TH2F>;
template class Tree<double,TH2F>;
template class Tree<short,TH2F>;
template class Tree<unsigned,TH2F>;

template class Tree<int,TCanvas>;
template class Tree<float,TCanvas>;
template class Tree<double,TCanvas>;
template class Tree<short,TCanvas>;
template class Tree<unsigned,TCanvas>;

