what a royal pain ...

From: Jeff Templon (templon@studbolt.physast.uga.edu)
Date: Fri Jan 28 2000 - 20:39:24 MET


Hi,

OK, so I am trying to use ROOT (I thought it would be easier than
writing a Python wrapper for ROOT trees ... turns out I was right,
keep reading ...).

I wrote a macro which ran the very first time (!) which is supposed to 
generate a tree full of simulated J/psi electroproduction events.
Each event will contain four TLorentzVector objects.  This apparently
happened as far as I can tell.

Pain #1 - reattaching the Tree in the ROOT file seems to be much more
complex than hi/fil 1 charm.root was

Pain #2 - I don't see an easy way to go thru the entire Tree and plot
say the magnitudes of the four-momenta (I thought the tree was
supposed to keep all the object code intact which is why we were using 
C++ ... oh dear).

  TFile f("charm.root");
  TTree *mytree = (TTree*)f.Get("T"); // what a contorted command
  mytree.Draw("ppsi.fY");  // yields some error
    Error in <TCanvas::Range>: illegal world coordinates range: x1=13.684271, y1=-0.131250, x2=-1.520475, y2=1.181250
    Error in <TCanvas::RangeAxis>: illegal axis coordinates range: xmin=12.163796, ymin=0.000000, xmax=-0.000000, ymax=1.050000
  mytree.Draw("ppsi.fZ")
    Error in <TCanvas::Range>: illegal world coordinates range: x1=13.684271, y1=-0.393750, x2=-1.520475, y2=3.543750
    Error in <TCanvas::RangeAxis>: illegal axis coordinates range: xmin=12.163796, ymin=0.000000, xmax=-0.000000, ymax=3.150000
  mytree.Draw("ppsi.Mag()")
  
    *ERROR 26 : 
    Unknown name : "ppsi.Mag()"
    Error in <TCanvas::Range>: illegal world coordinates range: x1=13.684271, y1=-0.393750, x2=-1.520475, y2=3.543750
    Error in <TCanvas::RangeAxis>: illegal axis coordinates range: xmin=12.163796, ymin=0.000000, xmax=-0.000000, ymax=3.150000

ppsi.Mag() is the biggest disappointment.  What is the use of having
all these objects in the tree if I can't use their methods?

Pain #3 - wading thru the documentation gives me no clue of how to do
what I want to do, except for possibly the contorted, non-simple
method shown under "The General Way" on URL

	http://root.cern.ch/root/HowtoReadTree.html

Say it ain't so!!!  Isn't OO supposed to make my life easier?

					JT

ps In the very possible case that I have already blown it in my macro, 
here it is.

// #-> charm.py -- simulate j/psi electroproduction at JLab
// c++ version i hope

// from Numeric import *  [ left over from python version ]
// from vec4 import *
// import RNG

// #-> simulation driver parameters

main(int argc, char **argv)
{
  float mj = 3096.88;      //   # J/psi mass in MeV
  float me =    0.510999;  //   # electron mass
  float mp =  938.272;

  float beamen = 11.0 * 1000.0; // # GeV * 1000 MeV/GeV

  float ll_the = (3.1415926 / 180) *  1.0; // last number is e- angle LL in deg
  float ul_the = (3.1415926 / 180) * 20.0; // last number is e- angle UL in deg

// above is stored in radians since we will need to take cosines
// below is not

  float ll_phe = -93.0; // LL on e- azimuthal angle (degrees now)
  float ul_phe = -87.0;

  float ll_pe = 2275; // LL on scat electron momentum (MeV/c)
  float ul_pe = 2780;

  int howmany = 10000; //  # desired number of events

// #-> set up random generators for electron.  strategy: create sample
// #-> arrays at start of program, just take values from them during
// #-> execution

  TF1 *thegen = new TF1("thegen","sin(x)",ll_the,ul_the);
  TF1 *phegen = new TF1("phegen","1.0",   ll_phe,ul_phe);
  TF1 *pegen  = new TF1("pegen", "1.0",   ll_pe, ul_pe );

  // #-> set up four-momenta for beam and target, which should not change

  TLorentzVector beam;  beam.SetVectM(TVector3(0,0,beamen),me);
  TLorentzVector targ(0.0,0.0,0.0,mp);

  TFile hfile("charm.root","RECREATE","Charm");

  TTree *tree = new TTree("T","Charm Electroproduction");

  int nev = 0;
  TLorentzVector scat(1,1,1,1);
  TLorentzVector X;

  tree->Branch("beam",&beam,"fX/D:fY/D:fZ/D:fE/D");
  tree->Branch("targ",&targ,"fX/D:fY/D:fZ/D:fE/D");
  tree->Branch("scat",&scat,"fX/D:fY/D:fZ/D:fE/D");
  tree->Branch("ppsi",&X,"fX/D:fY/D:fZ/D:fE/D");

  for ( int nev = 1; nev <= howmany; nev++) {
    float thtmp = thegen.GetRandom();
    float phtmp = phegen.GetRandom();
    float ptmp  = pegen.GetRandom();

    scat.SetVectM(TVector3(ptmp*sin(thtmp)*cos(phtmp),
			   ptmp*sin(thtmp)*sin(phtmp),
			   ptmp*cos(thtmp)),
		  me);

    X = beam + targ - scat;

    tree->Fill();
  }

  hfile.Write();
  hfile.Close();

  return 0;
}



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:17 MET