[ROOT] access to the class member for ROOT I/O

From: Hajime Nanjyo (nanjyo@icepp.s.u-tokyo.ac.jp)
Date: Fri Jun 04 2004 - 17:01:24 MEST


Dear Rooters,

I have a question about how to access a class member for the ROOT I/O
from the command "tree->Draw(...)".

I made two simple classes, A and B with a member 'int val'.
Then the ROOT file with the two classes was created as follows.
******************************************************************************
*Tree    :tree      : test                                                   *
*Entries :       10 : Total =            6018 bytes  File  Size = 1093 *
*        :          : Tree compression factor =   1.00                       *
******************************************************************************
*Branch  :A                                                                  *
*Entries :       10 : BranchElement (see below)                              *
*............................................................................*
*Br    0 :fUniqueID :                                                        *
*Entries :       10 : Total  Size=        634 bytes  One basket in memory    *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=   1.00     *
*............................................................................*
*Br    1 :fBits     :                                                        *
*Entries :       10 : Total  Size=        610 bytes  One basket in memory    *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=   1.00     *
*............................................................................*
*Br    2 :val       :                                                        *
*Entries :       10 : Total  Size=        598 bytes  One basket in memory    *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=   1.00     *
*............................................................................*
*Branch  :B                                                                  *
*Entries :       10 : BranchElement (see below)                              *
*............................................................................*
*Br    3 :fUniqueID :                                                        *
*Entries :       10 : Total  Size=        634 bytes  One basket in memory    *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=   1.00     *
*............................................................................*
*Br    4 :fBits     :                                                        *
*Entries :       10 : Total  Size=        610 bytes  One basket in memory    *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=   1.00     *
*............................................................................*
*Br    5 :val       :                                                        *
*Entries :       10 : Total  Size=        598 bytes  One basket in memory    *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=   1.00     *
*............................................................................*
.

Then I performed 3 kinds of tree->Draw() as,
  1.) tree->Draw("val");
  2.) tree->Draw("A.val");
  3.) tree->Draw("B.val");
But I only got the same results (I can't get access to the B's 'val').

Could you tell me how to draw the B's 'val'.

I used ROOT on current CVS under RH9 with gcc3.2.2. 
The simple codes are as follows.



///////////////////////////////////////////////
//A.h
///////////////////////////////////////////////
#ifndef A_h
#define A_h 1

#include "TObject.h"

class A : public TObject
{
public:
  A();
  ~A();

  int    val;

  ClassDef(A,1)
};

#endif
///////////////////////////////////////////////
//A.C
///////////////////////////////////////////////
#include "A.h"

#if !defined(__CINT__)
ClassImp(A);
#endif

A::A() {;}
A::~A() {;}
///////////////////////////////////////////////
//B.h
///////////////////////////////////////////////
#ifndef B_h
#define B_h 1

#include "TObject.h"

class B : public TObject
{
public:
  B();
  ~B();

  int    val;

  ClassDef(B,1)
};

#endif
///////////////////////////////////////////////
//B.C
///////////////////////////////////////////////
#include "B.h"

#if !defined(__CINT__)
ClassImp(B);
#endif

B::B() {;}
B::~B() {;}
///////////////////////////////////////////////
//ALinkDef.h
///////////////////////////////////////////////
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class A+;
#endif
///////////////////////////////////////////////
//BLinkDef.h
///////////////////////////////////////////////
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class B+;
#endif
///////////////////////////////////////////////
//write.C
///////////////////////////////////////////////
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdlib>
#include "TApplication.h"
#include "TFile.h"
#include "TTree.h"

#include "A.h"
#include "B.h"


int main(int argc,char** argv) {

  TApplication theApp("App", &argc, argv);
  gApplication->Init();

  argc=theApp.Argc();
  argv=theApp.Argv();

  //clonedummy input.root output.root
  if(argc!=2) {
    std::cout << "Argument Error!" << std::endl;
    std::exit(1);
  }

  std::cout << "Output  file : " << argv[1] << std::endl;

  TFile* tfo = new TFile(argv[1],"RECREATE");
  TTree* tree = new TTree("tree","test");
  
  A*   a = new A();
  B*   b = new B();

  tree->Branch("A","A",&a);
  tree->Branch("B","B",&b);

  for (Int_t jentry=0; jentry<10;jentry++) {
    a->val=1;
    b->val=10;
    
    tree->Fill();
  }
  tree->Write();
  tfo->Close();

  return 0;
}
///////////////////////////////////////////////
//make.sh
///////////////////////////////////////////////
rootcint -f ADict.C -c A.h ALinkDef.h
rootcint -f BDict.C -c B.h BLinkDef.h
g++ -o write `rootconf ` *.C

g++ --shared `root-config --cflags` `root-config --libs` -I. \
-o libData.so \
A.C ADict.C B.C BDict.C
///////////////////////////////////////////////
//run.sh
///////////////////////////////////////////////
./write test.root
///////////////////////////////////////////////
//read.C
///////////////////////////////////////////////
{
 gSystem->Load("libData.so");
 TFile* tf = new TFile("test.root");
 tree->Print();
 tree->Draw("val");
 tree->Draw("A.val");
 tree->Draw("B.val");
}
///////////////////////////////////////////////


Best Regards,
Hajime



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:08 MET