#include <TTree.h>
#include <vector>

class C4 {
public:
  float foo4;
};

class C3 {
public:
  float foo3;
  std::vector<C4> c4;
};

class C2 {
public:
  float foo2;
  std::vector<C3> c3;
};

class C1 {
public:
  float foo1;
  std::vector<C2> c2;
};



TTree *make_tree();

void nest()
{
  TTree *tree = make_tree();

  //tree->Scan("c1.foo1");
  //tree->Scan("c1.c2.foo2");
  //tree->Scan("c1.c2.c3.foo3");
  tree->Scan("c1.c2.c3.c4.foo4");
}


TTree *make_tree()
{
  TTree *tree = new TTree("T", "Test tree");
  C1 *c1 = new C1();

  tree->Branch("c1", "C1", &c1, 100, 99);


  for (int i=0; i < 5; i++) {
    C4 c4;
    C3 c3;
    C2 c2;

    c4.foo4 = 4.0;
    c3.c4.push_back(c4);
    c4.foo4 = 4.1;
    c3.c4.push_back(c4);

    c3.foo3 = 3.0;
    c2.c3.push_back(c3);
    c3.foo3 = 3.1;
    c2.c3.push_back(c3);
    
    c2.foo2 = 2.0;
    c1->c2.push_back(c2);
    c2.foo2 = 2.1;
    c1->c2.push_back(c2);
  
    c1->foo1 = (float) i;

    tree->Fill();
  }

  return tree;
}


