Re: [ROOT] Interactive fitting

From: Arthur E. Snyder (snyder@slac.stanford.edu)
Date: Wed Sep 29 2004 - 19:15:43 MEST


It looks like it might be possible to avoid the problem by using
TF1::SetNumber to change the identification number. Sounds a little
dangerous though .. but it works!

root [14] f->SetNumber(13313)
root [12] f->FixParameter(1,0.15)
root [13] h->Fit(f)
 FCN=70133.3 FROM MIGRAD    STATUS=CONVERGED     165 CALLS         166
TOTAL
                     EDM=1.52786e-07    STRATEGY= 1      ERROR MATRIX
ACCURATE
  EXT PARAMETER                                   STEP         FIRST
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE
   1  Constant     3.55542e+01   1.29881e+00   1.02231e-01   6.94347e-04
   2  Mean         1.50000e-01     fixed
   3  Sigma        3.41244e-03   1.00248e-04   1.30824e-03   3.91318e-02
(Int_t)0
root [14]


--The only place I find fNumber used is in TH1F where it indicates
"specials". It's set to -1 to indicate use of an 'intrepreted function',
so it seems reasonable safe to mess with it.

--However, it would be more natural if attempt to set initial values was
not used for 'fixed' parameters ..

A.E. Snyder, Group EC                        \!c*p?/
SLAC Mail Stop #95                          ((.   .))
Box 4349                                        |
Stanford, Ca, USA, 94309                      '\|/`
e-mail:snyder@slac.stanford.edu                 o
phone:650-926-2701                              _
http://www.slac.stanford.edu/~snyder          BaBar
FAX:650-926-2657                          Collaboration



On Wed, 29 Sep 2004, federico wrote:

> Hi,
>
> I think you are using FixParameter with a missing argument, the value at
> which you want the parameter to be fixed....
>
> virtual void <ListOfTypes.html#void> FixParameter
> <#TF1:FixParameter>(Int_t <ListOfTypes.html#Int_t> ipar, Double_t
> <ListOfTypes.html#Double_t> value)
>
> I can tell you I used it many times and it works....
>
> Cheers,
>     Federico
>
> Arthur E. Snyder wrote:
>
> >The command TF1::FixParameter does not seem to work. E.g.,:aroot [3] TH1F*
> >h=gDirectory->FindObject("deltamgood")
> >root [4] h
> >(class TH1F*)0x975a090
> >root [5] TF1* f=gROOT->GetFunction("gaus")
> >root [6] f->SetParameter(1
> >tab completion not implemented for this context
> >root [6] f->SetParameter(1,0.15)
> >root [7] f->SetParameter(2,0.001)
> >root [8] f->FixParameter(2)
> >root [10] f->Print()
> >                 gaus : gaus Ndim= 1, Npar= 3, Noper= 1
> > fExpr[0] = gaus  fOper = 2001
> > Par  0              Constant = 1
> > Par  1                  Mean = 0.15
> > Par  2                 Sigma = 0.001
> >
> >root [11] h->Fit(f)
> > FCN=15572.3 FROM MIGRAD    STATUS=CONVERGED      65 CALLS          66
> >TOTAL
> >                     EDM=1.89405e-08    STRATEGY= 1      ERROR MATRIX
> >ACCURATE
> >  EXT PARAMETER                                   STEP         FIRST
> >  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE
> >   1  Constant     4.53561e+03   3.22550e+01   1.16184e+00  -9.02437e-06
> >   2  Mean         1.45671e-01     fixed
> >   3  Sigma        7.46547e-04   4.27946e-06   4.88547e-05  -2.40157e-01
> >(Int_t)0
> >root [12] f->Print()
> >                 gaus : gaus Ndim= 1, Npar= 3, Noper= 1
> > fExpr[0] = gaus  fOper = 2001
> > Par  0              Constant = 4535.61
> > Par  1                  Mean = 0.145671
> > Par  2                 Sigma = 0.000746547
> >root [13]
> >
> >--so you can see it has gone ahead and fit for the nominally fixed
> >parameters.
> >
> >--the limits have in fact been set by FixParameters (see blow), but the
> >fit doesn't seems to ignore it .. Minuit even thinks the parameter is
> >"fixed" (see Minuit output above), but doesn't treat it has fixed.
> >
> >root [13] Double_t l,u
> >root [14] f->GetParLimits(1,l,u)
> >root [15] u
> >(Double_t)1.49999999999999994e-01
> >root [16] l
> >(Double_t)1.49999999999999994e-01
> >
> >The error assigned to parameter 1 is 0, but it moved it!
> >
> >--Is this a known problem? Looks like a bug to me.
> >
> >-Art
> >
> >A.E. Snyder, Group EC                        \!c*p?/
> >SLAC Mail Stop #95                          ((.   .))
> >Box 4349                                        |
> >Stanford, Ca, USA, 94309                      '\|/`
> >e-mail:snyder@slac.stanford.edu                 o
> >phone:650-926-2701                              _
> >http://www.slac.stanford.edu/~snyder          BaBar
> >FAX:650-926-2657                          Collaboration
> >
> >
> >
> >On Wed, 22 Sep 2004, Chris Crawford wrote:
> >
> >
> >
> >>Hi Victor,
> >>   Thanks!  I replaced gPad with TVirtualPad::Pad(), and it works just
> >>fine in CINT.
> >>--Chris
> >>
> >>Victor Perevoztchikov wrote:
> >>
> >>
> >>
> >>>>>Could anyone please tell me what is wrong with the following little
> >>>>>piece of code?  I am using v4.00/08, linux redhat 8.0.  I'm not sure it
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>gPad is not a variable. It is macro.
> >>>#define gPad (TVirtualPad::Pad())
> >>>CINT does not work with macros. For C++ your code is valid.
> >>>Victor
> >>>
> >>>
> >>>
> >>>Victor M. Perevoztchikov   perev@bnl.gov
> >>>Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY 11973-5000
> >>>tel office : 631-344-7894; fax 631-344-4206;
> >>>
> >>>----- Original Message -----
> >>>From: "Axel Naumann" <axel-naumann@gmx.de>
> >>>To: "Chris Crawford" <chris2@lns.mit.edu>
> >>>Cc: <roottalk@pcroot.cern.ch>
> >>>Sent: Wednesday, September 22, 2004 5:51 PM
> >>>Subject: Re: [ROOT] for + if + gPad problem?
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>>Hi Chris,
> >>>>this is due to cint's loop optimization. .O 0 prevents it.
> >>>>Axel.
> >>>>
> >>>>Chris Crawford wrote:
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>>Hello,
> >>>>>Could anyone please tell me what is wrong with the following little
> >>>>>piece of code?  I am using v4.00/08, linux redhat 8.0.  I'm not sure it
> >>>>>really has to do with gPad, that's just what I ran across.
> >>>>>--thanks,
> >>>>>Chris Crawford
> >>>>>
> >>>>>{
> >>>>>new TCanvas("cv1","cv1");
> >>>>>for (int x=0;x<2;x++) { //x=1;x<2;x++
> >>>>>  cout<<"gPad1="<<gPad<<endl;
> >>>>>  if (!x) cout<<"gPad2="<<gPad<<endl;
> >>>>>  if (x)  cout<<"gPad3="<<gPad<<endl;
> >>>>>}
> >>>>>}
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>
> >>
> >
> >
> >
>
>
>



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