[ROOT] Function busy flag cleared

From: Bob McElrath (mcelrath@draal.physics.wisc.edu)
Date: Thu Sep 20 2001 - 00:24:09 MEST


I'm having trouble running a couple of simple scripts to make hisograms
from TTree data:

// Draws a weighted histogram.  The tree you pass must have a branch named "weight"
// that will be applied.
void weighthist(TTree *t, TString name, int nbins, double xmin, double xmax)
{
    TH1F *hist;
    double val, weight;
    double binwidth = (xmax-xmin)/nbins;
    int nentries = (int)t->GetEntries();
    int i;
    double integral=0.0;
    
    if(hist = (TH1F*)gROOT->FindObject("hist-" + name)) delete hist;
    hist = new TH1F("hist-" + name, name + " distribution", nbins, xmin, xmax);
    if(!hist) {
        cout << "new failed for TH1F!" << endl;
        return; 
    }   
    t->SetBranchAddress(name, &val);
    t->SetBranchAddress("weight", &weight);
    for(i=0;i<nentries;i++) {
        t->GetEntry(i);
        hist->Fill(val,weight);
    }   
    for(i=0;i<nbins;i++) {
        integral += binwidth*hist->GetBinContent(i);
    }   
    cout << "Integral is: " << integral << endl;
}   


I then run this script a couple of times:
    root [1] .L ~/.root/weighthist.C
    root [2]     TFile f("ppmumu.root", "UPDATE");
    root [3]     TTree *t = (TTree*)f.Get("ppgammazmumu");
    root [4]     TTree *st = (TTree*)f.Get("pphmumu");
    root [5]     weighthist(t, "q", 50, 50, 200);
    Integral is: 3.20927e+12
    root [6]     weighthist(t, "ptl", 50, 0, 200);
    Integral is: 4.28335e+12
    root [7]     weighthist(t, "costheta", 50, -1, 1); 

     *** Break *** segmentation violation
     Root > Function weighthist() busy flag cleared

What does that mean?!?  And how do I fix it?  Note that the function ran
successfully *twice* before bombing.  Turning on debug (gDebug=1) does
not provide any more information than the above.  (about the segfault,
anyway)

Lastly, where can I put commands like .L ~/.root/weighthist.C so I can
load a set of often-used scripts at startup?  Scripts don't seem to like
dot commands (.L) or I'd put it in login.C or something.

Thanks,
-- Bob

Bob McElrath (rsmcelrath@students.wisc.edu) 
Univ. of Wisconsin at Madison, Department of Physics





This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:00 MET