Re: [ROOT] Accessing Minuit's error matrix using pyROOT

From: Topher Cawlfield (cawlfiel@uiuc.edu)
Date: Wed Jul 28 2004 - 21:02:48 MEST


<>Thanks Rene, GetCovarianceMatrixElement is going to be very helpful!



I still can't get at it yet, entirely due to python/pyROOT issues with 
static classes.  I've tried several approaches:

 >>> fitter = ROOT.TVirtualFitter::GetFitter()
gives me "TypeError: unbound method GetFitter() must be called with 
TVirtualFitter instance as first argument (got nothing instead)"

 >>> ROOT.TVirtualFitter()
gives me a null TObject pointer, and crashes if I try to call 
GetFitter() on it.

This nearly works:
 >>> ROOT.gROOT.ProcessLine("TVirtualFitter *fitter = 
TVirtualFitter::GetFitter()")
 >>> tglob = ROOT.gROOT.GetGlobal("fitter")
 >>> fitter = tglob.GetAddress()

Here I get a valid fitter variable in CINT's global memory, but I can't 
locate it as a python object.  Further ProcessLine calls manipulating 
"fitter" work well but only write to stdout.  gROOT.GetGlobal(...) 
returns a null pointer.  The third line probably wouldn't work either 
because it returns void*, not TObject*, so pyROOT can't use reflection 
to get the object's class.  If I try the same thing in CINT, 
GetGlobal("fitter") works fine -- I have no idea why it doesn't want to 
work in pyROOT.  Finally, gDiretory->Get(...) doesn't seem to work 
because the TVirtualFitter object does not get stored that way.  Oh, 
that and I can't get gDirectory in the first place.  Argh!

Here's my list of hang-ups so far with pyROOT:
* Can't call methods of static classes
* Can't find certain globals: gDirectory, gMinuit, or anything I create 
with ProcessLine().
* Can't work with c structures such as double vec[] or matrix[][] and 
thus any Root methods that use these as parameters.  Even methods like 
GetParLimits(Int_t ipar, Double_t& parmin, Double_t& parmax) can't be used.
* Can't use C++ overloaded operators.  I can't see a way around this 
problem either, since Python doesn't allow such hijinks.

In spite of all this, I've been able to do almost everything I need to 
with pyROOT.  I just can't find my way into Minuit's covariance matrix!

 - Topher

Rene Brun wrote:

>Hi Topher,
>
>I assume that Wim Lavrijsen will answer your points concerning directly pyroot.
>
>Concerning access to the covariance matrix following a fit,
>I have added a new method in TVirtualFitter, TFitter, TFumili, etc
>TVirtualFitter::GetCovarianceMatrixElement(int i, int j);
>
>you can access it as indicated in the comments of TH1::Fit
>
>//      Access to the fit covariance matrix
>//      ===================================
>//      Example1:
>//         TH1F h("h","test",100,-2,2);
>//         h.FillRandom("gaus",1000);
>//         h.Fit("gaus");
>//         Double_t matrix[3][3];
>//         gMinuit->mnemat(&matrix[0][0],3);
>//      Example2:
>//         TH1F h("h","test",100,-2,2);
>//         h.FillRandom("gaus",1000);
>//         h.Fit("gaus");
>//         TMatrixD matrix(npar,npar,gMinuit->GetCovarianceMatrix());
>//         matrix.Print();
>//         matrix.Draw("text");
>//      Example3: via the TVirtualFitter interface (works with TMinuit, TFumili,
>etc)
>//         TH1F h("h","test",100,-2,2);
>//         h.FillRandom("gaus",1000);
>//         h.Fit("gaus");
>//         TVirtualfitter *fitter = TVirtualFitter::GetFitter();
>//         TMatrixD matrix(npar,npar,fitter->GetCovarianceMatrix());
>//         Double_t errorFirstPar = fitter->GetCovarianceMatrixElement(0,0);
>
>Also note that in the class TmatrixD, you can use
>  TMatrixD::GetMatrixArray
>to get a pointer to the matrix elements directly.
>
>There is no point in adding a function to TF1 to return the covariance matrix
>or one of its elements. TF1 does not store a copy of the covariance matrix.
>Accesd to the matrix can only be done (via TMinuit or TVirtualFitter)
>immediatly after the fit as shown in the comments above.
>
>Rene Brun
>  
>
...



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