Hi,
I am wondering if there is a way to convert the results of a fit to a C++ string, like convert the following line:
auto fitr=hh->Fit(&ball,"SL","");
where hh is a TH1 pointer, and ball is a TF1 object. Something like
string x = auto fitr=hh->Fit(&ball,"SL","");
Is it possible, and if so how?
_ROOT Version: 6.23/01
couet
January 18, 2021, 6:40am
2
What do you expect to get in that string
? TH1::Fit
returns a
TFitResultPtr I don’t that can be casted to a `string.
I would expect to get a string containing the text of the fit that is printed to the screen when Fit is called.
Something like
string x = "FCN=1005.87 FROM MIGRAD STATUS=CONVERGED 278 CALLS 279 TOTAL
EDM=1.94984e-07 STRATEGY= 1 ERROR MATRIX UNCERTAINTY
4.7 per cent
EXT PARAMETER STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 p0 4.55485e+04 2.93626e+01 4.22959e-02 -1.96629e-04
2 p1 1.28116e+01 6.95203e-03 1.14863e-06 5.26017e-02
3 p2 4.50409e-01 1.28498e-04 -1.82278e-07 2.09336e+01
4 p3 1.76940e+00 4.94606e-06 7.74180e-10 5.44901e+01
5 p4 2.84730e-01 2.28220e-05 3.31556e-08 3.63427e+02
6 p5 2.85412e+04 4.22895e+03 -8.20212e+00 2.68426e-07
7 p6 6.35570e-02 5.24217e-03 2.16981e-03 2.52700e-03
8 p7 3.40204e-02 2.48912e-03 -8.67748e-06 3.19052e-01
ERR DEF= 0.5"
couet
January 19, 2021, 9:53am
4
That will not work.
May be @moneta knows how to put this printout in a file (from a macro).
Yes, that would be just as useful
moneta
January 25, 2021, 3:58pm
6
Hi,
You can do it as following:
auto fitr=hh->Fit(&ball,"SL","");
auto fitResult = static_cast<ROOT::Fit::FitResult *>(fitr.Get());
std::ostringstream resultStream;
fitResult->Print(resultStream);
std::string resultString = resultStream.str();
Lorenzo
1 Like
Thanks. This is nice, but it makes the Print() method output into a string, I was initially looking for a way to put the output of a call to Fit into a string, so I could search it for “CONVERGED”. Well, it turns out that there is an easier way, which I display below, where hh is a TH1 pointer
int i = 1;
while(true)
{
cout << i << endl;
auto fitr = hh->Fit(&ball,"SL","");
fitr->Print();
i++;
if(strncmp(gMinuit->fCstatu.Data(),"CONVERGED",9)==0)
{
break;
}
}
moneta
January 27, 2021, 11:34am
8
1 Like