CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
rootTf1.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_Utilities_rootTf1_h
2 #define PhysicsTools_Utilities_rootTf1_h
5 #include "TF1.h"
6 
7 namespace root {
8 
9  template <typename Tag, typename F>
10  TF1 tf1_t(const char* name, F& f, double min, double max) {
11  TF1 fun(name, root::function_t<1, Tag>(f), min, max, 0);
12  return fun;
13  }
14 
15  template <typename F>
16  TF1 tf1(const char* name, F& f, double min, double max) {
17  return tf1_t<helper::null_t>(name, f, min, max);
18  }
19 
20  template <typename Tag, typename F>
21  TF1 tf1_t(const char* name, F& f, double min, double max, const funct::Parameter& p0) {
22  TF1 fun(name, root::function_t<1, Tag>(f, p0), min, max, 1);
23  fun.SetParameter(0, *p0.ptr());
24  fun.SetParName(0, p0.name().c_str());
25  return fun;
26  }
27 
28  template <typename F>
29  TF1 tf1(const char* name, F& f, double min, double max, const funct::Parameter& p0) {
30  return tf1_t<helper::null_t>(name, f, min, max, p0);
31  }
32 
33  template <typename Tag, typename F>
34  TF1 tf1_t(const char* name, F& f, double min, double max, const funct::Parameter& p0, const funct::Parameter& p1) {
35  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1), min, max, 2);
36  fun.SetParameter(0, *p0.ptr());
37  fun.SetParName(0, p0.name().c_str());
38  fun.SetParameter(1, *p1.ptr());
39  fun.SetParName(1, p1.name().c_str());
40  return fun;
41  }
42 
43  template <typename F>
44  TF1 tf1(const char* name, F& f, double min, double max, const funct::Parameter& p0, const funct::Parameter& p1) {
45  return tf1_t<helper::null_t>(name, f, min, max, p0, p1);
46  }
47 
48  template <typename Tag, typename F>
49  TF1 tf1_t(const char* name,
50  F& f,
51  double min,
52  double max,
53  const funct::Parameter& p0,
54  const funct::Parameter& p1,
55  const funct::Parameter& p2) {
56  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2), min, max, 3);
57  fun.SetParameter(0, *p0.ptr());
58  fun.SetParName(0, p0.name().c_str());
59  fun.SetParameter(1, *p1.ptr());
60  fun.SetParName(1, p1.name().c_str());
61  fun.SetParameter(2, *p2.ptr());
62  fun.SetParName(2, p2.name().c_str());
63  return fun;
64  }
65 
66  template <typename F>
67  TF1 tf1(const char* name,
68  F& f,
69  double min,
70  double max,
71  const funct::Parameter& p0,
72  const funct::Parameter& p1,
73  const funct::Parameter& p2) {
74  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2);
75  }
76 
77  template <typename Tag, typename F>
78  TF1 tf1_t(const char* name,
79  F& f,
80  double min,
81  double max,
82  const funct::Parameter& p0,
83  const funct::Parameter& p1,
84  const funct::Parameter& p2,
85  const funct::Parameter& p3) {
86  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3), min, max, 4);
87  fun.SetParameter(0, *p0.ptr());
88  fun.SetParName(0, p0.name().c_str());
89  fun.SetParameter(1, *p1.ptr());
90  fun.SetParName(1, p1.name().c_str());
91  fun.SetParameter(2, *p2.ptr());
92  fun.SetParName(2, p2.name().c_str());
93  fun.SetParameter(3, *p3.ptr());
94  fun.SetParName(3, p3.name().c_str());
95  return fun;
96  }
97 
98  template <typename F>
99  TF1 tf1(const char* name,
100  F& f,
101  double min,
102  double max,
103  const funct::Parameter& p0,
104  const funct::Parameter& p1,
105  const funct::Parameter& p2,
106  const funct::Parameter& p3) {
107  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3);
108  }
109 
110  template <typename Tag, typename F>
111  TF1 tf1_t(const char* name,
112  F& f,
113  double min,
114  double max,
115  const funct::Parameter& p0,
116  const funct::Parameter& p1,
117  const funct::Parameter& p2,
118  const funct::Parameter& p3,
119  const funct::Parameter& p4) {
120  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4), min, max, 5);
121  fun.SetParameter(0, *p0.ptr());
122  fun.SetParName(0, p0.name().c_str());
123  fun.SetParameter(1, *p1.ptr());
124  fun.SetParName(1, p1.name().c_str());
125  fun.SetParameter(2, *p2.ptr());
126  fun.SetParName(2, p2.name().c_str());
127  fun.SetParameter(3, *p3.ptr());
128  fun.SetParName(3, p3.name().c_str());
129  fun.SetParameter(4, *p4.ptr());
130  fun.SetParName(4, p4.name().c_str());
131  return fun;
132  }
133 
134  template <typename F>
135  TF1 tf1(const char* name,
136  F& f,
137  double min,
138  double max,
139  const funct::Parameter& p0,
140  const funct::Parameter& p1,
141  const funct::Parameter& p2,
142  const funct::Parameter& p3,
143  const funct::Parameter& p4) {
144  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4);
145  }
146 
147  template <typename Tag, typename F>
148  TF1 tf1_t(const char* name,
149  F& f,
150  double min,
151  double max,
152  const funct::Parameter& p0,
153  const funct::Parameter& p1,
154  const funct::Parameter& p2,
155  const funct::Parameter& p3,
156  const funct::Parameter& p4,
157  const funct::Parameter& p5) {
158  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5), min, max, 6);
159  fun.SetParameter(0, *p0.ptr());
160  fun.SetParName(0, p0.name().c_str());
161  fun.SetParameter(1, *p1.ptr());
162  fun.SetParName(1, p1.name().c_str());
163  fun.SetParameter(2, *p2.ptr());
164  fun.SetParName(2, p2.name().c_str());
165  fun.SetParameter(3, *p3.ptr());
166  fun.SetParName(3, p3.name().c_str());
167  fun.SetParameter(4, *p4.ptr());
168  fun.SetParName(4, p4.name().c_str());
169  fun.SetParameter(5, *p5.ptr());
170  fun.SetParName(5, p5.name().c_str());
171  return fun;
172  }
173 
174  template <typename F>
175  TF1 tf1(const char* name,
176  F& f,
177  double min,
178  double max,
179  const funct::Parameter& p0,
180  const funct::Parameter& p1,
181  const funct::Parameter& p2,
182  const funct::Parameter& p3,
183  const funct::Parameter& p4,
184  const funct::Parameter& p5) {
185  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5);
186  }
187 
188  template <typename Tag, typename F>
189  TF1 tf1_t(const char* name,
190  F& f,
191  double min,
192  double max,
193  const funct::Parameter& p0,
194  const funct::Parameter& p1,
195  const funct::Parameter& p2,
196  const funct::Parameter& p3,
197  const funct::Parameter& p4,
198  const funct::Parameter& p5,
199  const funct::Parameter& p6) {
200  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6), min, max, 7);
201  fun.SetParameter(0, *p0.ptr());
202  fun.SetParName(0, p0.name().c_str());
203  fun.SetParameter(1, *p1.ptr());
204  fun.SetParName(1, p1.name().c_str());
205  fun.SetParameter(2, *p2.ptr());
206  fun.SetParName(2, p2.name().c_str());
207  fun.SetParameter(3, *p3.ptr());
208  fun.SetParName(3, p3.name().c_str());
209  fun.SetParameter(4, *p4.ptr());
210  fun.SetParName(4, p4.name().c_str());
211  fun.SetParameter(5, *p5.ptr());
212  fun.SetParName(5, p5.name().c_str());
213  fun.SetParameter(6, *p6.ptr());
214  fun.SetParName(6, p6.name().c_str());
215  return fun;
216  }
217 
218  template <typename F>
219  TF1 tf1(const char* name,
220  F& f,
221  double min,
222  double max,
223  const funct::Parameter& p0,
224  const funct::Parameter& p1,
225  const funct::Parameter& p2,
226  const funct::Parameter& p3,
227  const funct::Parameter& p4,
228  const funct::Parameter& p5,
229  const funct::Parameter& p6) {
230  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6);
231  }
232 
233  template <typename Tag, typename F>
234  TF1 tf1_t(const char* name,
235  F& f,
236  double min,
237  double max,
238  const funct::Parameter& p0,
239  const funct::Parameter& p1,
240  const funct::Parameter& p2,
241  const funct::Parameter& p3,
242  const funct::Parameter& p4,
243  const funct::Parameter& p5,
244  const funct::Parameter& p6,
245  const funct::Parameter& p7) {
246  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7), min, max, 8);
247  fun.SetParameter(0, *p0.ptr());
248  fun.SetParName(0, p0.name().c_str());
249  fun.SetParameter(1, *p1.ptr());
250  fun.SetParName(1, p1.name().c_str());
251  fun.SetParameter(2, *p2.ptr());
252  fun.SetParName(2, p2.name().c_str());
253  fun.SetParameter(3, *p3.ptr());
254  fun.SetParName(3, p3.name().c_str());
255  fun.SetParameter(4, *p4.ptr());
256  fun.SetParName(4, p4.name().c_str());
257  fun.SetParameter(5, *p5.ptr());
258  fun.SetParName(5, p5.name().c_str());
259  fun.SetParameter(6, *p6.ptr());
260  fun.SetParName(6, p6.name().c_str());
261  fun.SetParameter(7, *p7.ptr());
262  fun.SetParName(7, p7.name().c_str());
263  return fun;
264  }
265 
266  template <typename F>
267  TF1 tf1(const char* name,
268  F& f,
269  double min,
270  double max,
271  const funct::Parameter& p0,
272  const funct::Parameter& p1,
273  const funct::Parameter& p2,
274  const funct::Parameter& p3,
275  const funct::Parameter& p4,
276  const funct::Parameter& p5,
277  const funct::Parameter& p6,
278  const funct::Parameter& p7) {
279  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7);
280  }
281 
282  template <typename Tag, typename F>
283  TF1 tf1_t(const char* name,
284  F& f,
285  double min,
286  double max,
287  const funct::Parameter& p0,
288  const funct::Parameter& p1,
289  const funct::Parameter& p2,
290  const funct::Parameter& p3,
291  const funct::Parameter& p4,
292  const funct::Parameter& p5,
293  const funct::Parameter& p6,
294  const funct::Parameter& p7,
295  const funct::Parameter& p8) {
296  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8), min, max, 9);
297  fun.SetParameter(0, *p0.ptr());
298  fun.SetParName(0, p0.name().c_str());
299  fun.SetParameter(1, *p1.ptr());
300  fun.SetParName(1, p1.name().c_str());
301  fun.SetParameter(2, *p2.ptr());
302  fun.SetParName(2, p2.name().c_str());
303  fun.SetParameter(3, *p3.ptr());
304  fun.SetParName(3, p3.name().c_str());
305  fun.SetParameter(4, *p4.ptr());
306  fun.SetParName(4, p4.name().c_str());
307  fun.SetParameter(5, *p5.ptr());
308  fun.SetParName(5, p5.name().c_str());
309  fun.SetParameter(6, *p6.ptr());
310  fun.SetParName(6, p6.name().c_str());
311  fun.SetParameter(7, *p7.ptr());
312  fun.SetParName(7, p7.name().c_str());
313  fun.SetParameter(8, *p8.ptr());
314  fun.SetParName(8, p8.name().c_str());
315  return fun;
316  }
317 
318  template <typename F>
319  TF1 tf1(const char* name,
320  F& f,
321  double min,
322  double max,
323  const funct::Parameter& p0,
324  const funct::Parameter& p1,
325  const funct::Parameter& p2,
326  const funct::Parameter& p3,
327  const funct::Parameter& p4,
328  const funct::Parameter& p5,
329  const funct::Parameter& p6,
330  const funct::Parameter& p7,
331  const funct::Parameter& p8) {
332  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8);
333  }
334 
335  template <typename Tag, typename F>
336  TF1 tf1_t(const char* name,
337  F& f,
338  double min,
339  double max,
340  const funct::Parameter& p0,
341  const funct::Parameter& p1,
342  const funct::Parameter& p2,
343  const funct::Parameter& p3,
344  const funct::Parameter& p4,
345  const funct::Parameter& p5,
346  const funct::Parameter& p6,
347  const funct::Parameter& p7,
348  const funct::Parameter& p8,
349  const funct::Parameter& p9) {
350  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), min, max, 10);
351  fun.SetParameter(0, *p0.ptr());
352  fun.SetParName(0, p0.name().c_str());
353  fun.SetParameter(1, *p1.ptr());
354  fun.SetParName(1, p1.name().c_str());
355  fun.SetParameter(2, *p2.ptr());
356  fun.SetParName(2, p2.name().c_str());
357  fun.SetParameter(3, *p3.ptr());
358  fun.SetParName(3, p3.name().c_str());
359  fun.SetParameter(4, *p4.ptr());
360  fun.SetParName(4, p4.name().c_str());
361  fun.SetParameter(5, *p5.ptr());
362  fun.SetParName(5, p5.name().c_str());
363  fun.SetParameter(6, *p6.ptr());
364  fun.SetParName(6, p6.name().c_str());
365  fun.SetParameter(7, *p7.ptr());
366  fun.SetParName(7, p7.name().c_str());
367  fun.SetParameter(8, *p8.ptr());
368  fun.SetParName(8, p8.name().c_str());
369  fun.SetParameter(9, *p9.ptr());
370  fun.SetParName(9, p9.name().c_str());
371  return fun;
372  }
373 
374  template <typename F>
375  TF1 tf1(const char* name,
376  F& f,
377  double min,
378  double max,
379  const funct::Parameter& p0,
380  const funct::Parameter& p1,
381  const funct::Parameter& p2,
382  const funct::Parameter& p3,
383  const funct::Parameter& p4,
384  const funct::Parameter& p5,
385  const funct::Parameter& p6,
386  const funct::Parameter& p7,
387  const funct::Parameter& p8,
388  const funct::Parameter& p9) {
389  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
390  }
391 
392  template <typename Tag, typename F>
393  TF1 tf1_t(const char* name,
394  F& f,
395  double min,
396  double max,
397  const funct::Parameter& p0,
398  const funct::Parameter& p1,
399  const funct::Parameter& p2,
400  const funct::Parameter& p3,
401  const funct::Parameter& p4,
402  const funct::Parameter& p5,
403  const funct::Parameter& p6,
404  const funct::Parameter& p7,
405  const funct::Parameter& p8,
406  const funct::Parameter& p9,
407  const funct::Parameter& p10) {
408  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), min, max, 11);
409  fun.SetParameter(0, *p0.ptr());
410  fun.SetParName(0, p0.name().c_str());
411  fun.SetParameter(1, *p1.ptr());
412  fun.SetParName(1, p1.name().c_str());
413  fun.SetParameter(2, *p2.ptr());
414  fun.SetParName(2, p2.name().c_str());
415  fun.SetParameter(3, *p3.ptr());
416  fun.SetParName(3, p3.name().c_str());
417  fun.SetParameter(4, *p4.ptr());
418  fun.SetParName(4, p4.name().c_str());
419  fun.SetParameter(5, *p5.ptr());
420  fun.SetParName(5, p5.name().c_str());
421  fun.SetParameter(6, *p6.ptr());
422  fun.SetParName(6, p6.name().c_str());
423  fun.SetParameter(7, *p7.ptr());
424  fun.SetParName(7, p7.name().c_str());
425  fun.SetParameter(8, *p8.ptr());
426  fun.SetParName(8, p8.name().c_str());
427  fun.SetParameter(9, *p9.ptr());
428  fun.SetParName(9, p9.name().c_str());
429  fun.SetParameter(10, *p10.ptr());
430  fun.SetParName(10, p10.name().c_str());
431  return fun;
432  }
433 
434  template <typename F>
435  TF1 tf1(const char* name,
436  F& f,
437  double min,
438  double max,
439  const funct::Parameter& p0,
440  const funct::Parameter& p1,
441  const funct::Parameter& p2,
442  const funct::Parameter& p3,
443  const funct::Parameter& p4,
444  const funct::Parameter& p5,
445  const funct::Parameter& p6,
446  const funct::Parameter& p7,
447  const funct::Parameter& p8,
448  const funct::Parameter& p9,
449  const funct::Parameter& p10) {
450  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
451  }
452 
453  template <typename Tag, typename F>
454  TF1 tf1_t(const char* name,
455  F& f,
456  double min,
457  double max,
458  const funct::Parameter& p0,
459  const funct::Parameter& p1,
460  const funct::Parameter& p2,
461  const funct::Parameter& p3,
462  const funct::Parameter& p4,
463  const funct::Parameter& p5,
464  const funct::Parameter& p6,
465  const funct::Parameter& p7,
466  const funct::Parameter& p8,
467  const funct::Parameter& p9,
468  const funct::Parameter& p10,
469  const funct::Parameter& p11) {
470  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), min, max, 12);
471  fun.SetParameter(0, *p0.ptr());
472  fun.SetParName(0, p0.name().c_str());
473  fun.SetParameter(1, *p1.ptr());
474  fun.SetParName(1, p1.name().c_str());
475  fun.SetParameter(2, *p2.ptr());
476  fun.SetParName(2, p2.name().c_str());
477  fun.SetParameter(3, *p3.ptr());
478  fun.SetParName(3, p3.name().c_str());
479  fun.SetParameter(4, *p4.ptr());
480  fun.SetParName(4, p4.name().c_str());
481  fun.SetParameter(5, *p5.ptr());
482  fun.SetParName(5, p5.name().c_str());
483  fun.SetParameter(6, *p6.ptr());
484  fun.SetParName(6, p6.name().c_str());
485  fun.SetParameter(7, *p7.ptr());
486  fun.SetParName(7, p7.name().c_str());
487  fun.SetParameter(8, *p8.ptr());
488  fun.SetParName(8, p8.name().c_str());
489  fun.SetParameter(9, *p9.ptr());
490  fun.SetParName(9, p9.name().c_str());
491  fun.SetParameter(10, *p10.ptr());
492  fun.SetParName(10, p10.name().c_str());
493  fun.SetParameter(11, *p11.ptr());
494  fun.SetParName(11, p11.name().c_str());
495  return fun;
496  }
497 
498  template <typename F>
499  TF1 tf1(const char* name,
500  F& f,
501  double min,
502  double max,
503  const funct::Parameter& p0,
504  const funct::Parameter& p1,
505  const funct::Parameter& p2,
506  const funct::Parameter& p3,
507  const funct::Parameter& p4,
508  const funct::Parameter& p5,
509  const funct::Parameter& p6,
510  const funct::Parameter& p7,
511  const funct::Parameter& p8,
512  const funct::Parameter& p9,
513  const funct::Parameter& p10,
514  const funct::Parameter& p11) {
515  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
516  }
517 
518  template <typename Tag, typename F>
519  TF1 tf1_t(const char* name,
520  F& f,
521  double min,
522  double max,
523  const funct::Parameter& p0,
524  const funct::Parameter& p1,
525  const funct::Parameter& p2,
526  const funct::Parameter& p3,
527  const funct::Parameter& p4,
528  const funct::Parameter& p5,
529  const funct::Parameter& p6,
530  const funct::Parameter& p7,
531  const funct::Parameter& p8,
532  const funct::Parameter& p9,
533  const funct::Parameter& p10,
534  const funct::Parameter& p11,
535  const funct::Parameter& p12) {
536  TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), min, max, 13);
537  fun.SetParameter(0, *p0.ptr());
538  fun.SetParName(0, p0.name().c_str());
539  fun.SetParameter(1, *p1.ptr());
540  fun.SetParName(1, p1.name().c_str());
541  fun.SetParameter(2, *p2.ptr());
542  fun.SetParName(2, p2.name().c_str());
543  fun.SetParameter(3, *p3.ptr());
544  fun.SetParName(3, p3.name().c_str());
545  fun.SetParameter(4, *p4.ptr());
546  fun.SetParName(4, p4.name().c_str());
547  fun.SetParameter(5, *p5.ptr());
548  fun.SetParName(5, p5.name().c_str());
549  fun.SetParameter(6, *p6.ptr());
550  fun.SetParName(6, p6.name().c_str());
551  fun.SetParameter(7, *p7.ptr());
552  fun.SetParName(7, p7.name().c_str());
553  fun.SetParameter(8, *p8.ptr());
554  fun.SetParName(8, p8.name().c_str());
555  fun.SetParameter(9, *p9.ptr());
556  fun.SetParName(9, p9.name().c_str());
557  fun.SetParameter(10, *p10.ptr());
558  fun.SetParName(10, p10.name().c_str());
559  fun.SetParameter(11, *p11.ptr());
560  fun.SetParName(11, p11.name().c_str());
561  fun.SetParameter(12, *p12.ptr());
562  fun.SetParName(12, p12.name().c_str());
563  return fun;
564  }
565 
566  template <typename F>
567  TF1 tf1(const char* name,
568  F& f,
569  double min,
570  double max,
571  const funct::Parameter& p0,
572  const funct::Parameter& p1,
573  const funct::Parameter& p2,
574  const funct::Parameter& p3,
575  const funct::Parameter& p4,
576  const funct::Parameter& p5,
577  const funct::Parameter& p6,
578  const funct::Parameter& p7,
579  const funct::Parameter& p8,
580  const funct::Parameter& p9,
581  const funct::Parameter& p10,
582  const funct::Parameter& p11,
583  const funct::Parameter& p12) {
584  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
585  }
586 
587  template <typename Tag, typename F>
588  TF1 tf1_t(const char* name,
589  F& f,
590  double min,
591  double max,
592  const funct::Parameter& p0,
593  const funct::Parameter& p1,
594  const funct::Parameter& p2,
595  const funct::Parameter& p3,
596  const funct::Parameter& p4,
597  const funct::Parameter& p5,
598  const funct::Parameter& p6,
599  const funct::Parameter& p7,
600  const funct::Parameter& p8,
601  const funct::Parameter& p9,
602  const funct::Parameter& p10,
603  const funct::Parameter& p11,
604  const funct::Parameter& p12,
605  const funct::Parameter& p13) {
606  TF1 fun(
607  name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), min, max, 14);
608  fun.SetParameter(0, *p0.ptr());
609  fun.SetParName(0, p0.name().c_str());
610  fun.SetParameter(1, *p1.ptr());
611  fun.SetParName(1, p1.name().c_str());
612  fun.SetParameter(2, *p2.ptr());
613  fun.SetParName(2, p2.name().c_str());
614  fun.SetParameter(3, *p3.ptr());
615  fun.SetParName(3, p3.name().c_str());
616  fun.SetParameter(4, *p4.ptr());
617  fun.SetParName(4, p4.name().c_str());
618  fun.SetParameter(5, *p5.ptr());
619  fun.SetParName(5, p5.name().c_str());
620  fun.SetParameter(6, *p6.ptr());
621  fun.SetParName(6, p6.name().c_str());
622  fun.SetParameter(7, *p7.ptr());
623  fun.SetParName(7, p7.name().c_str());
624  fun.SetParameter(8, *p8.ptr());
625  fun.SetParName(8, p8.name().c_str());
626  fun.SetParameter(9, *p9.ptr());
627  fun.SetParName(9, p9.name().c_str());
628  fun.SetParameter(10, *p10.ptr());
629  fun.SetParName(10, p10.name().c_str());
630  fun.SetParameter(11, *p11.ptr());
631  fun.SetParName(11, p11.name().c_str());
632  fun.SetParameter(12, *p12.ptr());
633  fun.SetParName(12, p12.name().c_str());
634  fun.SetParameter(13, *p13.ptr());
635  fun.SetParName(13, p13.name().c_str());
636  return fun;
637  }
638 
639  template <typename F>
640  TF1 tf1(const char* name,
641  F& f,
642  double min,
643  double max,
644  const funct::Parameter& p0,
645  const funct::Parameter& p1,
646  const funct::Parameter& p2,
647  const funct::Parameter& p3,
648  const funct::Parameter& p4,
649  const funct::Parameter& p5,
650  const funct::Parameter& p6,
651  const funct::Parameter& p7,
652  const funct::Parameter& p8,
653  const funct::Parameter& p9,
654  const funct::Parameter& p10,
655  const funct::Parameter& p11,
656  const funct::Parameter& p12,
657  const funct::Parameter& p13) {
658  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13);
659  }
660 
661  template <typename Tag, typename F>
662  TF1 tf1_t(const char* name,
663  F& f,
664  double min,
665  double max,
666  const funct::Parameter& p0,
667  const funct::Parameter& p1,
668  const funct::Parameter& p2,
669  const funct::Parameter& p3,
670  const funct::Parameter& p4,
671  const funct::Parameter& p5,
672  const funct::Parameter& p6,
673  const funct::Parameter& p7,
674  const funct::Parameter& p8,
675  const funct::Parameter& p9,
676  const funct::Parameter& p10,
677  const funct::Parameter& p11,
678  const funct::Parameter& p12,
679  const funct::Parameter& p13,
680  const funct::Parameter& p14) {
681  TF1 fun(name,
682  root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14),
683  min,
684  max,
685  15);
686  fun.SetParameter(0, *p0.ptr());
687  fun.SetParName(0, p0.name().c_str());
688  fun.SetParameter(1, *p1.ptr());
689  fun.SetParName(1, p1.name().c_str());
690  fun.SetParameter(2, *p2.ptr());
691  fun.SetParName(2, p2.name().c_str());
692  fun.SetParameter(3, *p3.ptr());
693  fun.SetParName(3, p3.name().c_str());
694  fun.SetParameter(4, *p4.ptr());
695  fun.SetParName(4, p4.name().c_str());
696  fun.SetParameter(5, *p5.ptr());
697  fun.SetParName(5, p5.name().c_str());
698  fun.SetParameter(6, *p6.ptr());
699  fun.SetParName(6, p6.name().c_str());
700  fun.SetParameter(7, *p7.ptr());
701  fun.SetParName(7, p7.name().c_str());
702  fun.SetParameter(8, *p8.ptr());
703  fun.SetParName(8, p8.name().c_str());
704  fun.SetParameter(9, *p9.ptr());
705  fun.SetParName(9, p9.name().c_str());
706  fun.SetParameter(10, *p10.ptr());
707  fun.SetParName(10, p10.name().c_str());
708  fun.SetParameter(11, *p11.ptr());
709  fun.SetParName(11, p11.name().c_str());
710  fun.SetParameter(12, *p12.ptr());
711  fun.SetParName(12, p12.name().c_str());
712  fun.SetParameter(13, *p13.ptr());
713  fun.SetParName(13, p13.name().c_str());
714  fun.SetParameter(14, *p14.ptr());
715  fun.SetParName(14, p14.name().c_str());
716  return fun;
717  }
718 
719  template <typename F>
720  TF1 tf1(const char* name,
721  F& f,
722  double min,
723  double max,
724  const funct::Parameter& p0,
725  const funct::Parameter& p1,
726  const funct::Parameter& p2,
727  const funct::Parameter& p3,
728  const funct::Parameter& p4,
729  const funct::Parameter& p5,
730  const funct::Parameter& p6,
731  const funct::Parameter& p7,
732  const funct::Parameter& p8,
733  const funct::Parameter& p9,
734  const funct::Parameter& p10,
735  const funct::Parameter& p11,
736  const funct::Parameter& p12,
737  const funct::Parameter& p13,
738  const funct::Parameter& p14) {
739  return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14);
740  }
741 
742  template <typename Tag, typename F>
743  TF1 tf1_t(const char* name,
744  F& f,
745  double min,
746  double max,
747  const funct::Parameter& p0,
748  const funct::Parameter& p1,
749  const funct::Parameter& p2,
750  const funct::Parameter& p3,
751  const funct::Parameter& p4,
752  const funct::Parameter& p5,
753  const funct::Parameter& p6,
754  const funct::Parameter& p7,
755  const funct::Parameter& p8,
756  const funct::Parameter& p9,
757  const funct::Parameter& p10,
758  const funct::Parameter& p11,
759  const funct::Parameter& p12,
760  const funct::Parameter& p13,
761  const funct::Parameter& p14,
762  const funct::Parameter& p15) {
763  TF1 fun(name,
764  root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15),
765  min,
766  max,
767  16);
768  fun.SetParameter(0, *p0.ptr());
769  fun.SetParName(0, p0.name().c_str());
770  fun.SetParameter(1, *p1.ptr());
771  fun.SetParName(1, p1.name().c_str());
772  fun.SetParameter(2, *p2.ptr());
773  fun.SetParName(2, p2.name().c_str());
774  fun.SetParameter(3, *p3.ptr());
775  fun.SetParName(3, p3.name().c_str());
776  fun.SetParameter(4, *p4.ptr());
777  fun.SetParName(4, p4.name().c_str());
778  fun.SetParameter(5, *p5.ptr());
779  fun.SetParName(5, p5.name().c_str());
780  fun.SetParameter(6, *p6.ptr());
781  fun.SetParName(6, p6.name().c_str());
782  fun.SetParameter(7, *p7.ptr());
783  fun.SetParName(7, p7.name().c_str());
784  fun.SetParameter(8, *p8.ptr());
785  fun.SetParName(8, p8.name().c_str());
786  fun.SetParameter(9, *p9.ptr());
787  fun.SetParName(9, p9.name().c_str());
788  fun.SetParameter(10, *p10.ptr());
789  fun.SetParName(10, p10.name().c_str());
790  fun.SetParameter(11, *p11.ptr());
791  fun.SetParName(11, p11.name().c_str());
792  fun.SetParameter(12, *p12.ptr());
793  fun.SetParName(12, p12.name().c_str());
794  fun.SetParameter(13, *p13.ptr());
795  fun.SetParName(13, p13.name().c_str());
796  fun.SetParameter(14, *p14.ptr());
797  fun.SetParName(14, p14.name().c_str());
798  fun.SetParameter(15, *p15.ptr());
799  fun.SetParName(15, p15.name().c_str());
800  return fun;
801  }
802 
803  template <typename F>
804  TF1 tf1(const char* name,
805  F& f,
806  double min,
807  double max,
808  const funct::Parameter& p0,
809  const funct::Parameter& p1,
810  const funct::Parameter& p2,
811  const funct::Parameter& p3,
812  const funct::Parameter& p4,
813  const funct::Parameter& p5,
814  const funct::Parameter& p6,
815  const funct::Parameter& p7,
816  const funct::Parameter& p8,
817  const funct::Parameter& p9,
818  const funct::Parameter& p10,
819  const funct::Parameter& p11,
820  const funct::Parameter& p12,
821  const funct::Parameter& p13,
822  const funct::Parameter& p14,
823  const funct::Parameter& p15) {
824  return tf1_t<helper::null_t>(
825  name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15);
826  }
827 
828  template <typename Tag, typename F>
829  TF1 tf1_t(const char* name,
830  F& f,
831  double min,
832  double max,
833  const funct::Parameter& p0,
834  const funct::Parameter& p1,
835  const funct::Parameter& p2,
836  const funct::Parameter& p3,
837  const funct::Parameter& p4,
838  const funct::Parameter& p5,
839  const funct::Parameter& p6,
840  const funct::Parameter& p7,
841  const funct::Parameter& p8,
842  const funct::Parameter& p9,
843  const funct::Parameter& p10,
844  const funct::Parameter& p11,
845  const funct::Parameter& p12,
846  const funct::Parameter& p13,
847  const funct::Parameter& p14,
848  const funct::Parameter& p15,
849  const funct::Parameter& p16) {
850  TF1 fun(name,
851  root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16),
852  min,
853  max,
854  17);
855  fun.SetParameter(0, *p0.ptr());
856  fun.SetParName(0, p0.name().c_str());
857  fun.SetParameter(1, *p1.ptr());
858  fun.SetParName(1, p1.name().c_str());
859  fun.SetParameter(2, *p2.ptr());
860  fun.SetParName(2, p2.name().c_str());
861  fun.SetParameter(3, *p3.ptr());
862  fun.SetParName(3, p3.name().c_str());
863  fun.SetParameter(4, *p4.ptr());
864  fun.SetParName(4, p4.name().c_str());
865  fun.SetParameter(5, *p5.ptr());
866  fun.SetParName(5, p5.name().c_str());
867  fun.SetParameter(6, *p6.ptr());
868  fun.SetParName(6, p6.name().c_str());
869  fun.SetParameter(7, *p7.ptr());
870  fun.SetParName(7, p7.name().c_str());
871  fun.SetParameter(8, *p8.ptr());
872  fun.SetParName(8, p8.name().c_str());
873  fun.SetParameter(9, *p9.ptr());
874  fun.SetParName(9, p9.name().c_str());
875  fun.SetParameter(10, *p10.ptr());
876  fun.SetParName(10, p10.name().c_str());
877  fun.SetParameter(11, *p11.ptr());
878  fun.SetParName(11, p11.name().c_str());
879  fun.SetParameter(12, *p12.ptr());
880  fun.SetParName(12, p12.name().c_str());
881  fun.SetParameter(13, *p13.ptr());
882  fun.SetParName(13, p13.name().c_str());
883  fun.SetParameter(14, *p14.ptr());
884  fun.SetParName(14, p14.name().c_str());
885  fun.SetParameter(15, *p15.ptr());
886  fun.SetParName(15, p15.name().c_str());
887  fun.SetParameter(16, *p16.ptr());
888  fun.SetParName(16, p16.name().c_str());
889  return fun;
890  }
891 
892  template <typename F>
893  TF1 tf1(const char* name,
894  F& f,
895  double min,
896  double max,
897  const funct::Parameter& p0,
898  const funct::Parameter& p1,
899  const funct::Parameter& p2,
900  const funct::Parameter& p3,
901  const funct::Parameter& p4,
902  const funct::Parameter& p5,
903  const funct::Parameter& p6,
904  const funct::Parameter& p7,
905  const funct::Parameter& p8,
906  const funct::Parameter& p9,
907  const funct::Parameter& p10,
908  const funct::Parameter& p11,
909  const funct::Parameter& p12,
910  const funct::Parameter& p13,
911  const funct::Parameter& p14,
912  const funct::Parameter& p15,
913  const funct::Parameter& p16) {
914  return tf1_t<helper::null_t>(
915  name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16);
916  }
917 
918  template <typename Tag, typename F>
919  TF1 tf1_t(const char* name,
920  F& f,
921  double min,
922  double max,
923  const funct::Parameter& p0,
924  const funct::Parameter& p1,
925  const funct::Parameter& p2,
926  const funct::Parameter& p3,
927  const funct::Parameter& p4,
928  const funct::Parameter& p5,
929  const funct::Parameter& p6,
930  const funct::Parameter& p7,
931  const funct::Parameter& p8,
932  const funct::Parameter& p9,
933  const funct::Parameter& p10,
934  const funct::Parameter& p11,
935  const funct::Parameter& p12,
936  const funct::Parameter& p13,
937  const funct::Parameter& p14,
938  const funct::Parameter& p15,
939  const funct::Parameter& p16,
940  const funct::Parameter& p17) {
941  TF1 fun(name,
942  root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17),
943  min,
944  max,
945  18);
946  fun.SetParameter(0, *p0.ptr());
947  fun.SetParName(0, p0.name().c_str());
948  fun.SetParameter(1, *p1.ptr());
949  fun.SetParName(1, p1.name().c_str());
950  fun.SetParameter(2, *p2.ptr());
951  fun.SetParName(2, p2.name().c_str());
952  fun.SetParameter(3, *p3.ptr());
953  fun.SetParName(3, p3.name().c_str());
954  fun.SetParameter(4, *p4.ptr());
955  fun.SetParName(4, p4.name().c_str());
956  fun.SetParameter(5, *p5.ptr());
957  fun.SetParName(5, p5.name().c_str());
958  fun.SetParameter(6, *p6.ptr());
959  fun.SetParName(6, p6.name().c_str());
960  fun.SetParameter(7, *p7.ptr());
961  fun.SetParName(7, p7.name().c_str());
962  fun.SetParameter(8, *p8.ptr());
963  fun.SetParName(8, p8.name().c_str());
964  fun.SetParameter(9, *p9.ptr());
965  fun.SetParName(9, p9.name().c_str());
966  fun.SetParameter(10, *p10.ptr());
967  fun.SetParName(10, p10.name().c_str());
968  fun.SetParameter(11, *p11.ptr());
969  fun.SetParName(11, p11.name().c_str());
970  fun.SetParameter(12, *p12.ptr());
971  fun.SetParName(12, p12.name().c_str());
972  fun.SetParameter(13, *p13.ptr());
973  fun.SetParName(13, p13.name().c_str());
974  fun.SetParameter(14, *p14.ptr());
975  fun.SetParName(14, p14.name().c_str());
976  fun.SetParameter(15, *p15.ptr());
977  fun.SetParName(15, p15.name().c_str());
978  fun.SetParameter(16, *p16.ptr());
979  fun.SetParName(16, p16.name().c_str());
980  fun.SetParameter(17, *p17.ptr());
981  fun.SetParName(17, p17.name().c_str());
982  return fun;
983  }
984 
985  template <typename F>
986  TF1 tf1(const char* name,
987  F& f,
988  double min,
989  double max,
990  const funct::Parameter& p0,
991  const funct::Parameter& p1,
992  const funct::Parameter& p2,
993  const funct::Parameter& p3,
994  const funct::Parameter& p4,
995  const funct::Parameter& p5,
996  const funct::Parameter& p6,
997  const funct::Parameter& p7,
998  const funct::Parameter& p8,
999  const funct::Parameter& p9,
1000  const funct::Parameter& p10,
1001  const funct::Parameter& p11,
1002  const funct::Parameter& p12,
1003  const funct::Parameter& p13,
1004  const funct::Parameter& p14,
1005  const funct::Parameter& p15,
1006  const funct::Parameter& p16,
1007  const funct::Parameter& p17) {
1008  return tf1_t<helper::null_t>(
1009  name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17);
1010  }
1011 
1012  template <typename Tag, typename F>
1013  TF1 tf1_t(const char* name,
1014  F& f,
1015  double min,
1016  double max,
1017  const funct::Parameter& p0,
1018  const funct::Parameter& p1,
1019  const funct::Parameter& p2,
1020  const funct::Parameter& p3,
1021  const funct::Parameter& p4,
1022  const funct::Parameter& p5,
1023  const funct::Parameter& p6,
1024  const funct::Parameter& p7,
1025  const funct::Parameter& p8,
1026  const funct::Parameter& p9,
1027  const funct::Parameter& p10,
1028  const funct::Parameter& p11,
1029  const funct::Parameter& p12,
1030  const funct::Parameter& p13,
1031  const funct::Parameter& p14,
1032  const funct::Parameter& p15,
1033  const funct::Parameter& p16,
1034  const funct::Parameter& p17,
1035  const funct::Parameter& p18) {
1036  TF1 fun(name,
1037  root::function_t<1, Tag>(
1038  f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18),
1039  min,
1040  max,
1041  19);
1042  fun.SetParameter(0, *p0.ptr());
1043  fun.SetParName(0, p0.name().c_str());
1044  fun.SetParameter(1, *p1.ptr());
1045  fun.SetParName(1, p1.name().c_str());
1046  fun.SetParameter(2, *p2.ptr());
1047  fun.SetParName(2, p2.name().c_str());
1048  fun.SetParameter(3, *p3.ptr());
1049  fun.SetParName(3, p3.name().c_str());
1050  fun.SetParameter(4, *p4.ptr());
1051  fun.SetParName(4, p4.name().c_str());
1052  fun.SetParameter(5, *p5.ptr());
1053  fun.SetParName(5, p5.name().c_str());
1054  fun.SetParameter(6, *p6.ptr());
1055  fun.SetParName(6, p6.name().c_str());
1056  fun.SetParameter(7, *p7.ptr());
1057  fun.SetParName(7, p7.name().c_str());
1058  fun.SetParameter(8, *p8.ptr());
1059  fun.SetParName(8, p8.name().c_str());
1060  fun.SetParameter(9, *p9.ptr());
1061  fun.SetParName(9, p9.name().c_str());
1062  fun.SetParameter(10, *p10.ptr());
1063  fun.SetParName(10, p10.name().c_str());
1064  fun.SetParameter(11, *p11.ptr());
1065  fun.SetParName(11, p11.name().c_str());
1066  fun.SetParameter(12, *p12.ptr());
1067  fun.SetParName(12, p12.name().c_str());
1068  fun.SetParameter(13, *p13.ptr());
1069  fun.SetParName(13, p13.name().c_str());
1070  fun.SetParameter(14, *p14.ptr());
1071  fun.SetParName(14, p14.name().c_str());
1072  fun.SetParameter(15, *p15.ptr());
1073  fun.SetParName(15, p15.name().c_str());
1074  fun.SetParameter(16, *p16.ptr());
1075  fun.SetParName(16, p16.name().c_str());
1076  fun.SetParameter(17, *p17.ptr());
1077  fun.SetParName(17, p17.name().c_str());
1078  fun.SetParameter(18, *p18.ptr());
1079  fun.SetParName(18, p18.name().c_str());
1080  return fun;
1081  }
1082 
1083  template <typename F>
1084  TF1 tf1(const char* name,
1085  F& f,
1086  double min,
1087  double max,
1088  const funct::Parameter& p0,
1089  const funct::Parameter& p1,
1090  const funct::Parameter& p2,
1091  const funct::Parameter& p3,
1092  const funct::Parameter& p4,
1093  const funct::Parameter& p5,
1094  const funct::Parameter& p6,
1095  const funct::Parameter& p7,
1096  const funct::Parameter& p8,
1097  const funct::Parameter& p9,
1098  const funct::Parameter& p10,
1099  const funct::Parameter& p11,
1100  const funct::Parameter& p12,
1101  const funct::Parameter& p13,
1102  const funct::Parameter& p14,
1103  const funct::Parameter& p15,
1104  const funct::Parameter& p16,
1105  const funct::Parameter& p17,
1106  const funct::Parameter& p18) {
1107  return tf1_t<helper::null_t>(
1108  name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18);
1109  }
1110 
1111  template <typename Tag, typename F>
1112  TF1 tf1_t(const char* name,
1113  F& f,
1114  double min,
1115  double max,
1116  const funct::Parameter& p0,
1117  const funct::Parameter& p1,
1118  const funct::Parameter& p2,
1119  const funct::Parameter& p3,
1120  const funct::Parameter& p4,
1121  const funct::Parameter& p5,
1122  const funct::Parameter& p6,
1123  const funct::Parameter& p7,
1124  const funct::Parameter& p8,
1125  const funct::Parameter& p9,
1126  const funct::Parameter& p10,
1127  const funct::Parameter& p11,
1128  const funct::Parameter& p12,
1129  const funct::Parameter& p13,
1130  const funct::Parameter& p14,
1131  const funct::Parameter& p15,
1132  const funct::Parameter& p16,
1133  const funct::Parameter& p17,
1134  const funct::Parameter& p18,
1135  const funct::Parameter& p19) {
1136  TF1 fun(name,
1137  root::function_t<1, Tag>(
1138  f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19),
1139  min,
1140  max,
1141  20);
1142  fun.SetParameter(0, *p0.ptr());
1143  fun.SetParName(0, p0.name().c_str());
1144  fun.SetParameter(1, *p1.ptr());
1145  fun.SetParName(1, p1.name().c_str());
1146  fun.SetParameter(2, *p2.ptr());
1147  fun.SetParName(2, p2.name().c_str());
1148  fun.SetParameter(3, *p3.ptr());
1149  fun.SetParName(3, p3.name().c_str());
1150  fun.SetParameter(4, *p4.ptr());
1151  fun.SetParName(4, p4.name().c_str());
1152  fun.SetParameter(5, *p5.ptr());
1153  fun.SetParName(5, p5.name().c_str());
1154  fun.SetParameter(6, *p6.ptr());
1155  fun.SetParName(6, p6.name().c_str());
1156  fun.SetParameter(7, *p7.ptr());
1157  fun.SetParName(7, p7.name().c_str());
1158  fun.SetParameter(8, *p8.ptr());
1159  fun.SetParName(8, p8.name().c_str());
1160  fun.SetParameter(9, *p9.ptr());
1161  fun.SetParName(9, p9.name().c_str());
1162  fun.SetParameter(10, *p10.ptr());
1163  fun.SetParName(10, p10.name().c_str());
1164  fun.SetParameter(11, *p11.ptr());
1165  fun.SetParName(11, p11.name().c_str());
1166  fun.SetParameter(12, *p12.ptr());
1167  fun.SetParName(12, p12.name().c_str());
1168  fun.SetParameter(13, *p13.ptr());
1169  fun.SetParName(13, p13.name().c_str());
1170  fun.SetParameter(14, *p14.ptr());
1171  fun.SetParName(14, p14.name().c_str());
1172  fun.SetParameter(15, *p15.ptr());
1173  fun.SetParName(15, p15.name().c_str());
1174  fun.SetParameter(16, *p16.ptr());
1175  fun.SetParName(16, p16.name().c_str());
1176  fun.SetParameter(17, *p17.ptr());
1177  fun.SetParName(17, p17.name().c_str());
1178  fun.SetParameter(18, *p18.ptr());
1179  fun.SetParName(18, p18.name().c_str());
1180  fun.SetParameter(19, *p19.ptr());
1181  fun.SetParName(19, p19.name().c_str());
1182  return fun;
1183  }
1184 
1185  template <typename F>
1186  TF1 tf1(const char* name,
1187  F& f,
1188  double min,
1189  double max,
1190  const funct::Parameter& p0,
1191  const funct::Parameter& p1,
1192  const funct::Parameter& p2,
1193  const funct::Parameter& p3,
1194  const funct::Parameter& p4,
1195  const funct::Parameter& p5,
1196  const funct::Parameter& p6,
1197  const funct::Parameter& p7,
1198  const funct::Parameter& p8,
1199  const funct::Parameter& p9,
1200  const funct::Parameter& p10,
1201  const funct::Parameter& p11,
1202  const funct::Parameter& p12,
1203  const funct::Parameter& p13,
1204  const funct::Parameter& p14,
1205  const funct::Parameter& p15,
1206  const funct::Parameter& p16,
1207  const funct::Parameter& p17,
1208  const funct::Parameter& p18,
1209  const funct::Parameter& p19) {
1210  return tf1_t<helper::null_t>(
1211  name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19);
1212  }
1213 
1214  template <typename Tag, typename F>
1215  TF1 tf1_t(const char* name, F& f, double min, double max, const std::vector<funct::Parameter>& p) {
1216  TF1 fun(name, root::function_t<1, Tag>(f, p), min, max, p.size());
1217  for (size_t i = 0; i < p.size(); ++i) {
1218  fun.SetParameter(i, *p[i].ptr());
1219  fun.SetParName(i, p[i].name().c_str());
1220  }
1221  return fun;
1222  }
1223 
1224  template <typename F>
1225  TF1 tf1(const char* name, F& f, double min, double max, const std::vector<funct::Parameter>& p) {
1226  return tf1_t<helper::null_t>(name, f, min, max, p);
1227  }
1228 
1229  template <typename Tag, typename F>
1230  TF1 tf1_t(const char* name, F& f, double min, double max, const std::vector<std::shared_ptr<double> >& p) {
1231  TF1 fun(name, root::function_t<1, Tag>(f, p), min, max, p.size());
1232  for (size_t i = 0; i < p.size(); ++i)
1233  fun.SetParameter(i, *p[i]);
1234  return fun;
1235  }
1236 
1237  template <typename F>
1238  TF1 tf1(const char* name, F& f, double min, double max, const std::vector<std::shared_ptr<double> >& p) {
1239  return tf1_t<helper::null_t>(name, f, min, max, p);
1240  }
1241 
1242 } // namespace root
1243 
1244 #endif
const std::string & name() const
Definition: Parameter.h:12
TF1 tf1_t(const char *name, F &f, double min, double max)
Definition: rootTf1.h:10
const TString p2
Definition: fwPaths.cc:13
const TString p1
Definition: fwPaths.cc:12
std::shared_ptr< double > ptr() const
Definition: Parameter.h:18
TF1 tf1(const char *name, F &f, double min, double max)
Definition: rootTf1.h:16
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163