ROOT logo
// Author:
//  simple Event class example
// execute as: .x tree0.C++
//  You have to copy it first to a directory where you have write access!
//  Note that .x tree0.C cannot work with this example
//  Effect of ClassDef() and ClassImp() macros
// After running this macro create an instance of Det and Event
//   Det d;
//   Event e;
// now you can see the effect of the  ClassDef() and ClassImp() macros.
// (for the Det class these commands are commented!)
// For instance 'e' now knows who it is:
//   cout<<e.Class_Name()<<endl;
// whereas d does not.
// The methods that are added by the ClassDef()/Imp() marcro can be listed with
// .class
//   .class Event
//   .class Det

#include <TRandom.h>
#include <TTree.h>
#include <TCanvas.h>
#include <TStyle.h>

#include <Riostream.h>

//class Det  : public TObject  {
class Det {  // each detector gives an energy and time signal 
  Double_t e; //energy
  Double_t t; //time

//  ClassDef(Det,1)


//class Event { //TObject is not required by this example
class Event : public TObject {
  Det a; // say there are two detectors (a and b) in the experiment
  Det b;


void tree0() {
  // create a TTree   
  TTree *tree = new TTree("tree","treelibrated tree");
  Event *e = new Event;
  // create a branch with energy 
  // fill some events with random numbers
  Int_t nevent=10000;
  for (Int_t iev=0;iev<nevent;iev++) {
    if (iev%1000==0) cout<<"Processing event "<<iev<<"..."<<endl;
    Float_t ea,eb;
    gRandom->Rannor(ea,eb); // the two energies follow a gaus distribution
    e->a.t=gRandom->Rndm();  // random
    e->b.t=e->a.t + gRandom->Gaus(0.,.1);  // identical to a.t but a gaussian
					   // 'resolution' was added with sigma .1

    tree->Fill();  // fill the tree with the current event

  // start the viewer
  // here you can investigate the structure of your Event class

  //gROOT->SetStyle("Plain");   // uncomment to set a different style
  gStyle->SetPalette(1);        // use precomputed color palette 1

  // now draw some tree variables 
  TCanvas *c1 = new TCanvas();
  tree->Draw("a.e");  //energy of det a
  tree->Draw("a.e","3*(-.2<b.e && b.e<.2)","same");  // same but with condition on energy b; scaled by 3
  tree->Draw("b.e:a.e","","colz");        // one energy against the other
  tree->Draw("b.t","","e");    // time of b with errorbars
  tree->Draw("a.t","","same"); // overlay time of detector a
  tree->Draw("b.t:a.t");       // plot time b again time a

  cout<<"You can now examine the structure of your tree in the TreeViewer"<<endl;