Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JFit2D.cc File Reference

General purpose fit program using ROOT. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include "TROOT.h"
#include "TFile.h"
#include "TKey.h"
#include "TH2.h"
#include "TGraph2D.h"
#include "TProfile.h"
#include "TF12.h"
#include "TString.h"
#include "TRegexp.h"
#include "JLang/JType.hh"
#include "JLang/JTypeList.hh"
#include "JLang/JToken.hh"
#include "JTools/JRange.hh"
#include "JGizmo/JRootObjectID.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

General purpose fit program using ROOT.

The option -f corresponds to <file name>:<object name>.

The expressions for the fit function, start and fixed values should comply with ROOT class TFormula.

In the expressions of the start and fixed values, names of member methods of corresponding class of the fit object may appear, such as TH1::GetMaximum, TH1::GetRMS, etc., e.g:

     -F "[0]*exp(-0.5*x*x/([1]*[1])*exp(-0.5*y*y/([2]*[2])"
     -@ "p0 = GetMaximum; p1 = 2*GetRMS"
     -= "p2 = 0"

The result of the formulas for the start and fixed values will be evaluated for each histogram separately.

Author
mdejong

Definition in file JFit2D.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 96 of file JFit2D.cc.

97 {
98  using namespace std;
99  using namespace JPP;
100 
101  typedef JToken<';'> JToken_t;
102  typedef JRange<double> JRange_t;
103 
104  vector<JRootObjectID> inputFile;
105  string outputFile;
106  string formula;
107  vector<JToken_t> startValues;
108  vector<JToken_t> fixedValues;
109  JRange_t X;
110  JRange_t Y;
111  string option;
112  int debug;
113 
114  try {
115 
116  JParser<> zap("General purpose fit program using ROOT.");
117 
118  zap['f'] = make_field(inputFile, "<input file>:<object name>");
119  zap['o'] = make_field(outputFile, "ROOT file with fit results") = "fit.root";
120  zap['F'] = make_field(formula, "fit formula, e.g: \"[0]+[1]*x\"");
121  zap['@'] = make_field(startValues, "start values, e.g: \"p0 = GetMaximum;\"");
122  zap['='] = make_field(fixedValues, "fixed values, e.g: \"p0 = GetMaximum;\"");
123  zap['x'] = make_field(X, "abscissa range") = JRange_t();
124  zap['y'] = make_field(Y, "abscissa range") = JRange_t();
125  zap['O'] = make_field(option, "Fit option") = "";
126  zap['d'] = make_field(debug) = 1;
127 
128  zap['='] = JPARSER::initialised();
129 
130  zap(argc, argv);
131  }
132  catch(const exception &error) {
133  FATAL(error.what() << endl);
134  }
135 
136 
137  if (option.find('O') == string::npos) { option += "O"; }
138  //if (option.find('N') == string::npos) { option += "N"; }
139  if (debug == 0 && option.find('Q') == string::npos) { option += "Q"; }
140 
141 
142  TFile out(outputFile.c_str(), "recreate");
143 
144 
145  TF2* fcn = new TF2("user", formula.c_str());
146 
147  fcn->SetNpx(10000);
148 
149  if (fcn->IsZombie()) {
150  FATAL("Function: " << formula << " is zombie." << endl);
151  }
152 
153  for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
154 
155  DEBUG("Input: " << *input << endl);
156 
157  TDirectory* dir = getDirectory(*input);
158 
159  if (dir == NULL) {
160  ERROR("File: " << input->getFullFilename() << " not opened." << endl);
161  continue;
162  }
163 
164  const TRegexp regexp(input->getObjectName());
165 
166  TIter iter(dir->GetListOfKeys());
167 
168  for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
169 
170  const TString tag(key->GetName());
171 
172  DEBUG("Key: " << tag << " match = " << tag.Contains(regexp) << endl);
173 
174  // option match
175 
176  if (tag.Contains(regexp)) {
177 
178  TObject* object = key->ReadObj();
179 
180 
181  // set fit parameters
182 
183  try {
184 
185  for (vector<JToken_t>::const_iterator j = startValues.begin(); j != startValues.end(); ++j) {
186  fcn->SetParameter(getParameter(*j), getValue(*j,object));
187  }
188 
189  for (vector<JToken_t>::const_iterator j = fixedValues.begin(); j != fixedValues.end(); ++j) {
190  fcn->FixParameter(getParameter(*j), getValue(*j,object));
191  }
192  }
193  catch(JLANG::JParseError& error) {
194  FATAL(error << endl);
195  }
196 
197  DEBUG("Start values " << object->GetName() << endl);
198 
199  for (int j = 0; j != fcn->GetNpar(); ++j) {
200  DEBUG(left << setw(12) << fcn->GetParName (j) << ' ' <<
201  SCIENTIFIC(12,5) << fcn->GetParameter(j) << endl);
202  }
203 
204  Double_t xmin = numeric_limits<Double_t>::max();
205  Double_t xmax = numeric_limits<Double_t>::lowest();
206  Double_t ymin = numeric_limits<Double_t>::max();
207  Double_t ymax = numeric_limits<Double_t>::lowest();
208 
209  {
210  TH2* h2 = dynamic_cast<TH2*>(object);
211 
212  if (h2 != NULL) {
213  xmin = min(xmin, h2->GetXaxis()->GetXmin());
214  xmax = max(xmax, h2->GetXaxis()->GetXmax());
215  ymin = min(ymin, h2->GetYaxis()->GetXmin());
216  ymax = max(ymax, h2->GetYaxis()->GetXmax());
217  }
218  }
219 
220  {
221  TGraph2D* g2 = dynamic_cast<TGraph2D*>(object);
222 
223  if (g2 != NULL) {
224  for (Int_t i = 0; i != g2->GetN(); ++i) {
225  xmin = min(xmin, g2->GetX()[i]);
226  xmax = max(xmax, g2->GetX()[i]);
227  ymin = min(ymin, g2->GetY()[i]);
228  ymax = max(ymax, g2->GetY()[i]);
229  }
230  }
231  }
232 
233  if (X != JRange_t()) {
234  xmin = X.getLowerLimit();
235  xmax = X.getUpperLimit();
236  }
237 
238  if (Y != JRange_t()) {
239  ymin = Y.getLowerLimit();
240  ymax = Y.getUpperLimit();
241  }
242 
243  fcn->SetRange(xmin, ymin, xmax, ymax);
244 
245  if (option.find("R") == string::npos) {
246  option += "R";
247  }
248 
249 
250  // execute fit
251 
252  JFit fit(*object, fcn, option);
253 
255 
256 
257  if (fit.result != -1) {
258 
259  // output fit results
260 
261  NOTICE("Fit values " << object->GetName() << endl);
262  NOTICE("Fit formula " << formula << endl);
263 
264  for (int j = 0; j != fcn->GetNpar(); ++j) {
265  NOTICE(left << setw(12) << fcn->GetParName (j) << ' ' <<
266  SCIENTIFIC(12,5) << fcn->GetParameter(j) << " +/- " <<
267  SCIENTIFIC(12,5) << fcn->GetParError (j) << endl);
268  }
269 
270  } else {
271 
272  WARNING("Object: not compatible with ROOT Fit." << endl);
273  }
274 
275  out.cd();
276 
277  object->Write();
278  fcn ->Write();
279  }
280  }
281 
282  dir->Close();
283  }
284 
285  out.Write();
286  out.Close();
287 }
Utility class to parse command line options.
Definition: JParser.hh:1500
#define WARNING(A)
Definition: JMessage.hh:65
double getValue(const JScale_t scale)
Get numerical value corresponding to scale.
Definition: JScale.hh:47
int getParameter(const std::string &text)
Get parameter number from text string.
Definition: JRoot.hh:19
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:66
Auxiliary class for a type holder.
Definition: JType.hh:19
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
string outputFile
Acoustic single fit.
Type list.
Definition: JTypeList.hh:22
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
#define NOTICE(A)
Definition: JMessage.hh:64
#define ERROR(A)
Definition: JMessage.hh:66
int debug
debug level
Definition: JSirene.cc:63
JObject_t & for_each(JObject_t &object, JType< JTypeList< JHead_t, JTail_t > > typelist)
For each data type method.
Definition: JTypeList.hh:415
#define FATAL(A)
Definition: JMessage.hh:67
Wrapper class around string.
Definition: JToken.hh:23
Exception for parsing value.
Definition: JException.hh:180
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
int j
Definition: JPolint.hh:666
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:483
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62