00001 #ifndef PhysicsTools_Utilities_rootTf1_h 00002 #define PhysicsTools_Utilities_rootTf1_h 00003 #include "PhysicsTools/Utilities/interface/rootFunction.h" 00004 #include "PhysicsTools/Utilities/interface/Parameter.h" 00005 #include "TF1.h" 00006 00007 namespace root { 00008 00009 template<typename Tag, typename F> 00010 TF1 tf1_t(const char * name, F& f, double min, double max) { 00011 TF1 fun(name, root::function_t<1, Tag>(f), min, max, 0); 00012 return fun; 00013 } 00014 00015 template<typename F> 00016 TF1 tf1(const char * name, F& f, double min, double max) { 00017 return tf1_t<helper::null_t>(name, f, min, max); 00018 } 00019 00020 template<typename Tag, typename F> 00021 TF1 tf1_t(const char * name, F& f, double min, double max, 00022 const funct::Parameter & p0) { 00023 TF1 fun(name, root::function_t<1, Tag>(f, p0), min, max, 1); 00024 fun.SetParameter(0, *p0.ptr()); 00025 fun.SetParName(0, p0.name().c_str()); 00026 return fun; 00027 } 00028 00029 template<typename F> 00030 TF1 tf1(const char * name, F& f, double min, double max, 00031 const funct::Parameter & p0) { 00032 return tf1_t<helper::null_t>(name, f, min, max, p0); 00033 } 00034 00035 template<typename Tag, typename F> 00036 TF1 tf1_t(const char * name, F& f, double min, double max, 00037 const funct::Parameter & p0, 00038 const funct::Parameter & p1) { 00039 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1), min, max, 2); 00040 fun.SetParameter(0, *p0.ptr()); 00041 fun.SetParName(0, p0.name().c_str()); 00042 fun.SetParameter(1, *p1.ptr()); 00043 fun.SetParName(1, p1.name().c_str()); 00044 return fun; 00045 } 00046 00047 template<typename F> 00048 TF1 tf1(const char * name, F& f, double min, double max, 00049 const funct::Parameter & p0, 00050 const funct::Parameter & p1) { 00051 return tf1_t<helper::null_t>(name, f, min, max, p0, p1); 00052 } 00053 00054 template<typename Tag, typename F> 00055 TF1 tf1_t(const char * name, F& f, double min, double max, 00056 const funct::Parameter & p0, 00057 const funct::Parameter & p1, 00058 const funct::Parameter & p2) { 00059 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2), min, max, 3); 00060 fun.SetParameter(0, *p0.ptr()); 00061 fun.SetParName(0, p0.name().c_str()); 00062 fun.SetParameter(1, *p1.ptr()); 00063 fun.SetParName(1, p1.name().c_str()); 00064 fun.SetParameter(2, *p2.ptr()); 00065 fun.SetParName(2, p2.name().c_str()); 00066 return fun; 00067 } 00068 00069 template<typename F> 00070 TF1 tf1(const char * name, F& f, double min, double max, 00071 const funct::Parameter & p0, 00072 const funct::Parameter & p1, 00073 const funct::Parameter & p2) { 00074 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2); 00075 } 00076 00077 template<typename Tag, typename F> 00078 TF1 tf1_t(const char * name, F& f, double min, double max, 00079 const funct::Parameter & p0, 00080 const funct::Parameter & p1, 00081 const funct::Parameter & p2, 00082 const funct::Parameter & p3) { 00083 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3), min, max, 4); 00084 fun.SetParameter(0, *p0.ptr()); 00085 fun.SetParName(0, p0.name().c_str()); 00086 fun.SetParameter(1, *p1.ptr()); 00087 fun.SetParName(1, p1.name().c_str()); 00088 fun.SetParameter(2, *p2.ptr()); 00089 fun.SetParName(2, p2.name().c_str()); 00090 fun.SetParameter(3, *p3.ptr()); 00091 fun.SetParName(3, p3.name().c_str()); 00092 return fun; 00093 } 00094 00095 template<typename F> 00096 TF1 tf1(const char * name, F& f, double min, double max, 00097 const funct::Parameter & p0, 00098 const funct::Parameter & p1, 00099 const funct::Parameter & p2, 00100 const funct::Parameter & p3) { 00101 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3); 00102 } 00103 00104 template<typename Tag, typename F> 00105 TF1 tf1_t(const char * name, F& f, double min, double max, 00106 const funct::Parameter & p0, 00107 const funct::Parameter & p1, 00108 const funct::Parameter & p2, 00109 const funct::Parameter & p3, 00110 const funct::Parameter & p4) { 00111 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4), min, max, 5); 00112 fun.SetParameter(0, *p0.ptr()); 00113 fun.SetParName(0, p0.name().c_str()); 00114 fun.SetParameter(1, *p1.ptr()); 00115 fun.SetParName(1, p1.name().c_str()); 00116 fun.SetParameter(2, *p2.ptr()); 00117 fun.SetParName(2, p2.name().c_str()); 00118 fun.SetParameter(3, *p3.ptr()); 00119 fun.SetParName(3, p3.name().c_str()); 00120 fun.SetParameter(4, *p4.ptr()); 00121 fun.SetParName(4, p4.name().c_str()); 00122 return fun; 00123 } 00124 00125 template<typename F> 00126 TF1 tf1(const char * name, F& f, double min, double max, 00127 const funct::Parameter & p0, 00128 const funct::Parameter & p1, 00129 const funct::Parameter & p2, 00130 const funct::Parameter & p3, 00131 const funct::Parameter & p4) { 00132 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4); 00133 } 00134 00135 template<typename Tag, typename F> 00136 TF1 tf1_t(const char * name, F& f, double min, double max, 00137 const funct::Parameter & p0, 00138 const funct::Parameter & p1, 00139 const funct::Parameter & p2, 00140 const funct::Parameter & p3, 00141 const funct::Parameter & p4, 00142 const funct::Parameter & p5) { 00143 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5), min, max, 6); 00144 fun.SetParameter(0, *p0.ptr()); 00145 fun.SetParName(0, p0.name().c_str()); 00146 fun.SetParameter(1, *p1.ptr()); 00147 fun.SetParName(1, p1.name().c_str()); 00148 fun.SetParameter(2, *p2.ptr()); 00149 fun.SetParName(2, p2.name().c_str()); 00150 fun.SetParameter(3, *p3.ptr()); 00151 fun.SetParName(3, p3.name().c_str()); 00152 fun.SetParameter(4, *p4.ptr()); 00153 fun.SetParName(4, p4.name().c_str()); 00154 fun.SetParameter(5, *p5.ptr()); 00155 fun.SetParName(5, p5.name().c_str()); 00156 return fun; 00157 } 00158 00159 template<typename F> 00160 TF1 tf1(const char * name, F& f, double min, double max, 00161 const funct::Parameter & p0, 00162 const funct::Parameter & p1, 00163 const funct::Parameter & p2, 00164 const funct::Parameter & p3, 00165 const funct::Parameter & p4, 00166 const funct::Parameter & p5) { 00167 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5); 00168 } 00169 00170 template<typename Tag, typename F> 00171 TF1 tf1_t(const char * name, F& f, double min, double max, 00172 const funct::Parameter & p0, 00173 const funct::Parameter & p1, 00174 const funct::Parameter & p2, 00175 const funct::Parameter & p3, 00176 const funct::Parameter & p4, 00177 const funct::Parameter & p5, 00178 const funct::Parameter & p6) { 00179 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6), min, max, 7); 00180 fun.SetParameter(0, *p0.ptr()); 00181 fun.SetParName(0, p0.name().c_str()); 00182 fun.SetParameter(1, *p1.ptr()); 00183 fun.SetParName(1, p1.name().c_str()); 00184 fun.SetParameter(2, *p2.ptr()); 00185 fun.SetParName(2, p2.name().c_str()); 00186 fun.SetParameter(3, *p3.ptr()); 00187 fun.SetParName(3, p3.name().c_str()); 00188 fun.SetParameter(4, *p4.ptr()); 00189 fun.SetParName(4, p4.name().c_str()); 00190 fun.SetParameter(5, *p5.ptr()); 00191 fun.SetParName(5, p5.name().c_str()); 00192 fun.SetParameter(6, *p6.ptr()); 00193 fun.SetParName(6, p6.name().c_str()); 00194 return fun; 00195 } 00196 00197 template<typename F> 00198 TF1 tf1(const char * name, F& f, double min, double max, 00199 const funct::Parameter & p0, 00200 const funct::Parameter & p1, 00201 const funct::Parameter & p2, 00202 const funct::Parameter & p3, 00203 const funct::Parameter & p4, 00204 const funct::Parameter & p5, 00205 const funct::Parameter & p6) { 00206 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6); 00207 } 00208 00209 template<typename Tag, typename F> 00210 TF1 tf1_t(const char * name, F& f, double min, double max, 00211 const funct::Parameter & p0, 00212 const funct::Parameter & p1, 00213 const funct::Parameter & p2, 00214 const funct::Parameter & p3, 00215 const funct::Parameter & p4, 00216 const funct::Parameter & p5, 00217 const funct::Parameter & p6, 00218 const funct::Parameter & p7) { 00219 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7), min, max, 8); 00220 fun.SetParameter(0, *p0.ptr()); 00221 fun.SetParName(0, p0.name().c_str()); 00222 fun.SetParameter(1, *p1.ptr()); 00223 fun.SetParName(1, p1.name().c_str()); 00224 fun.SetParameter(2, *p2.ptr()); 00225 fun.SetParName(2, p2.name().c_str()); 00226 fun.SetParameter(3, *p3.ptr()); 00227 fun.SetParName(3, p3.name().c_str()); 00228 fun.SetParameter(4, *p4.ptr()); 00229 fun.SetParName(4, p4.name().c_str()); 00230 fun.SetParameter(5, *p5.ptr()); 00231 fun.SetParName(5, p5.name().c_str()); 00232 fun.SetParameter(6, *p6.ptr()); 00233 fun.SetParName(6, p6.name().c_str()); 00234 fun.SetParameter(7, *p7.ptr()); 00235 fun.SetParName(7, p7.name().c_str()); 00236 return fun; 00237 } 00238 00239 template<typename F> 00240 TF1 tf1(const char * name, F& f, double min, double max, 00241 const funct::Parameter & p0, 00242 const funct::Parameter & p1, 00243 const funct::Parameter & p2, 00244 const funct::Parameter & p3, 00245 const funct::Parameter & p4, 00246 const funct::Parameter & p5, 00247 const funct::Parameter & p6, 00248 const funct::Parameter & p7) { 00249 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7); 00250 } 00251 00252 template<typename Tag, typename F> 00253 TF1 tf1_t(const char * name, F& f, double min, double max, 00254 const funct::Parameter & p0, 00255 const funct::Parameter & p1, 00256 const funct::Parameter & p2, 00257 const funct::Parameter & p3, 00258 const funct::Parameter & p4, 00259 const funct::Parameter & p5, 00260 const funct::Parameter & p6, 00261 const funct::Parameter & p7, 00262 const funct::Parameter & p8) { 00263 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8), min, max, 9); 00264 fun.SetParameter(0, *p0.ptr()); 00265 fun.SetParName(0, p0.name().c_str()); 00266 fun.SetParameter(1, *p1.ptr()); 00267 fun.SetParName(1, p1.name().c_str()); 00268 fun.SetParameter(2, *p2.ptr()); 00269 fun.SetParName(2, p2.name().c_str()); 00270 fun.SetParameter(3, *p3.ptr()); 00271 fun.SetParName(3, p3.name().c_str()); 00272 fun.SetParameter(4, *p4.ptr()); 00273 fun.SetParName(4, p4.name().c_str()); 00274 fun.SetParameter(5, *p5.ptr()); 00275 fun.SetParName(5, p5.name().c_str()); 00276 fun.SetParameter(6, *p6.ptr()); 00277 fun.SetParName(6, p6.name().c_str()); 00278 fun.SetParameter(7, *p7.ptr()); 00279 fun.SetParName(7, p7.name().c_str()); 00280 fun.SetParameter(8, *p8.ptr()); 00281 fun.SetParName(8, p8.name().c_str()); 00282 return fun; 00283 } 00284 00285 template<typename F> 00286 TF1 tf1(const char * name, F& f, double min, double max, 00287 const funct::Parameter & p0, 00288 const funct::Parameter & p1, 00289 const funct::Parameter & p2, 00290 const funct::Parameter & p3, 00291 const funct::Parameter & p4, 00292 const funct::Parameter & p5, 00293 const funct::Parameter & p6, 00294 const funct::Parameter & p7, 00295 const funct::Parameter & p8) { 00296 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8); 00297 } 00298 00299 template<typename Tag, typename F> 00300 TF1 tf1_t(const char * name, F& f, double min, double max, 00301 const funct::Parameter & p0, 00302 const funct::Parameter & p1, 00303 const funct::Parameter & p2, 00304 const funct::Parameter & p3, 00305 const funct::Parameter & p4, 00306 const funct::Parameter & p5, 00307 const funct::Parameter & p6, 00308 const funct::Parameter & p7, 00309 const funct::Parameter & p8, 00310 const funct::Parameter & p9) { 00311 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), min, max, 10); 00312 fun.SetParameter(0, *p0.ptr()); 00313 fun.SetParName(0, p0.name().c_str()); 00314 fun.SetParameter(1, *p1.ptr()); 00315 fun.SetParName(1, p1.name().c_str()); 00316 fun.SetParameter(2, *p2.ptr()); 00317 fun.SetParName(2, p2.name().c_str()); 00318 fun.SetParameter(3, *p3.ptr()); 00319 fun.SetParName(3, p3.name().c_str()); 00320 fun.SetParameter(4, *p4.ptr()); 00321 fun.SetParName(4, p4.name().c_str()); 00322 fun.SetParameter(5, *p5.ptr()); 00323 fun.SetParName(5, p5.name().c_str()); 00324 fun.SetParameter(6, *p6.ptr()); 00325 fun.SetParName(6, p6.name().c_str()); 00326 fun.SetParameter(7, *p7.ptr()); 00327 fun.SetParName(7, p7.name().c_str()); 00328 fun.SetParameter(8, *p8.ptr()); 00329 fun.SetParName(8, p8.name().c_str()); 00330 fun.SetParameter(9, *p9.ptr()); 00331 fun.SetParName(9, p9.name().c_str()); 00332 return fun; 00333 } 00334 00335 template<typename F> 00336 TF1 tf1(const char * name, F& f, double min, double max, 00337 const funct::Parameter & p0, 00338 const funct::Parameter & p1, 00339 const funct::Parameter & p2, 00340 const funct::Parameter & p3, 00341 const funct::Parameter & p4, 00342 const funct::Parameter & p5, 00343 const funct::Parameter & p6, 00344 const funct::Parameter & p7, 00345 const funct::Parameter & p8, 00346 const funct::Parameter & p9) { 00347 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); 00348 } 00349 00350 template<typename Tag, typename F> 00351 TF1 tf1_t(const char * name, F& f, double min, double max, 00352 const funct::Parameter & p0, 00353 const funct::Parameter & p1, 00354 const funct::Parameter & p2, 00355 const funct::Parameter & p3, 00356 const funct::Parameter & p4, 00357 const funct::Parameter & p5, 00358 const funct::Parameter & p6, 00359 const funct::Parameter & p7, 00360 const funct::Parameter & p8, 00361 const funct::Parameter & p9, 00362 const funct::Parameter & p10) { 00363 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), min, max, 11); 00364 fun.SetParameter(0, *p0.ptr()); 00365 fun.SetParName(0, p0.name().c_str()); 00366 fun.SetParameter(1, *p1.ptr()); 00367 fun.SetParName(1, p1.name().c_str()); 00368 fun.SetParameter(2, *p2.ptr()); 00369 fun.SetParName(2, p2.name().c_str()); 00370 fun.SetParameter(3, *p3.ptr()); 00371 fun.SetParName(3, p3.name().c_str()); 00372 fun.SetParameter(4, *p4.ptr()); 00373 fun.SetParName(4, p4.name().c_str()); 00374 fun.SetParameter(5, *p5.ptr()); 00375 fun.SetParName(5, p5.name().c_str()); 00376 fun.SetParameter(6, *p6.ptr()); 00377 fun.SetParName(6, p6.name().c_str()); 00378 fun.SetParameter(7, *p7.ptr()); 00379 fun.SetParName(7, p7.name().c_str()); 00380 fun.SetParameter(8, *p8.ptr()); 00381 fun.SetParName(8, p8.name().c_str()); 00382 fun.SetParameter(9, *p9.ptr()); 00383 fun.SetParName(9, p9.name().c_str()); 00384 fun.SetParameter(10, *p10.ptr()); 00385 fun.SetParName(10, p10.name().c_str()); 00386 return fun; 00387 } 00388 00389 template<typename F> 00390 TF1 tf1(const char * name, F& f, double min, double max, 00391 const funct::Parameter & p0, 00392 const funct::Parameter & p1, 00393 const funct::Parameter & p2, 00394 const funct::Parameter & p3, 00395 const funct::Parameter & p4, 00396 const funct::Parameter & p5, 00397 const funct::Parameter & p6, 00398 const funct::Parameter & p7, 00399 const funct::Parameter & p8, 00400 const funct::Parameter & p9, 00401 const funct::Parameter & p10) { 00402 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); 00403 } 00404 00405 template<typename Tag, typename F> 00406 TF1 tf1_t(const char * name, F& f, double min, double max, 00407 const funct::Parameter & p0, 00408 const funct::Parameter & p1, 00409 const funct::Parameter & p2, 00410 const funct::Parameter & p3, 00411 const funct::Parameter & p4, 00412 const funct::Parameter & p5, 00413 const funct::Parameter & p6, 00414 const funct::Parameter & p7, 00415 const funct::Parameter & p8, 00416 const funct::Parameter & p9, 00417 const funct::Parameter & p10, 00418 const funct::Parameter & p11) { 00419 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), min, max, 12); 00420 fun.SetParameter(0, *p0.ptr()); 00421 fun.SetParName(0, p0.name().c_str()); 00422 fun.SetParameter(1, *p1.ptr()); 00423 fun.SetParName(1, p1.name().c_str()); 00424 fun.SetParameter(2, *p2.ptr()); 00425 fun.SetParName(2, p2.name().c_str()); 00426 fun.SetParameter(3, *p3.ptr()); 00427 fun.SetParName(3, p3.name().c_str()); 00428 fun.SetParameter(4, *p4.ptr()); 00429 fun.SetParName(4, p4.name().c_str()); 00430 fun.SetParameter(5, *p5.ptr()); 00431 fun.SetParName(5, p5.name().c_str()); 00432 fun.SetParameter(6, *p6.ptr()); 00433 fun.SetParName(6, p6.name().c_str()); 00434 fun.SetParameter(7, *p7.ptr()); 00435 fun.SetParName(7, p7.name().c_str()); 00436 fun.SetParameter(8, *p8.ptr()); 00437 fun.SetParName(8, p8.name().c_str()); 00438 fun.SetParameter(9, *p9.ptr()); 00439 fun.SetParName(9, p9.name().c_str()); 00440 fun.SetParameter(10, *p10.ptr()); 00441 fun.SetParName(10, p10.name().c_str()); 00442 fun.SetParameter(11, *p11.ptr()); 00443 fun.SetParName(11, p11.name().c_str()); 00444 return fun; 00445 } 00446 00447 template<typename F> 00448 TF1 tf1(const char * name, F& f, double min, double max, 00449 const funct::Parameter & p0, 00450 const funct::Parameter & p1, 00451 const funct::Parameter & p2, 00452 const funct::Parameter & p3, 00453 const funct::Parameter & p4, 00454 const funct::Parameter & p5, 00455 const funct::Parameter & p6, 00456 const funct::Parameter & p7, 00457 const funct::Parameter & p8, 00458 const funct::Parameter & p9, 00459 const funct::Parameter & p10, 00460 const funct::Parameter & p11) { 00461 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); 00462 } 00463 00464 template<typename Tag, typename F> 00465 TF1 tf1_t(const char * name, F& f, double min, double max, 00466 const funct::Parameter & p0, 00467 const funct::Parameter & p1, 00468 const funct::Parameter & p2, 00469 const funct::Parameter & p3, 00470 const funct::Parameter & p4, 00471 const funct::Parameter & p5, 00472 const funct::Parameter & p6, 00473 const funct::Parameter & p7, 00474 const funct::Parameter & p8, 00475 const funct::Parameter & p9, 00476 const funct::Parameter & p10, 00477 const funct::Parameter & p11, 00478 const funct::Parameter & p12) { 00479 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); 00480 fun.SetParameter(0, *p0.ptr()); 00481 fun.SetParName(0, p0.name().c_str()); 00482 fun.SetParameter(1, *p1.ptr()); 00483 fun.SetParName(1, p1.name().c_str()); 00484 fun.SetParameter(2, *p2.ptr()); 00485 fun.SetParName(2, p2.name().c_str()); 00486 fun.SetParameter(3, *p3.ptr()); 00487 fun.SetParName(3, p3.name().c_str()); 00488 fun.SetParameter(4, *p4.ptr()); 00489 fun.SetParName(4, p4.name().c_str()); 00490 fun.SetParameter(5, *p5.ptr()); 00491 fun.SetParName(5, p5.name().c_str()); 00492 fun.SetParameter(6, *p6.ptr()); 00493 fun.SetParName(6, p6.name().c_str()); 00494 fun.SetParameter(7, *p7.ptr()); 00495 fun.SetParName(7, p7.name().c_str()); 00496 fun.SetParameter(8, *p8.ptr()); 00497 fun.SetParName(8, p8.name().c_str()); 00498 fun.SetParameter(9, *p9.ptr()); 00499 fun.SetParName(9, p9.name().c_str()); 00500 fun.SetParameter(10, *p10.ptr()); 00501 fun.SetParName(10, p10.name().c_str()); 00502 fun.SetParameter(11, *p11.ptr()); 00503 fun.SetParName(11, p11.name().c_str()); 00504 fun.SetParameter(12, *p12.ptr()); 00505 fun.SetParName(12, p12.name().c_str()); 00506 return fun; 00507 } 00508 00509 template<typename F> 00510 TF1 tf1(const char * name, F& f, double min, double max, 00511 const funct::Parameter & p0, 00512 const funct::Parameter & p1, 00513 const funct::Parameter & p2, 00514 const funct::Parameter & p3, 00515 const funct::Parameter & p4, 00516 const funct::Parameter & p5, 00517 const funct::Parameter & p6, 00518 const funct::Parameter & p7, 00519 const funct::Parameter & p8, 00520 const funct::Parameter & p9, 00521 const funct::Parameter & p10, 00522 const funct::Parameter & p11, 00523 const funct::Parameter & p12) { 00524 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); 00525 } 00526 00527 template<typename Tag, typename F> 00528 TF1 tf1_t(const char * name, F& f, double min, double max, 00529 const funct::Parameter & p0, 00530 const funct::Parameter & p1, 00531 const funct::Parameter & p2, 00532 const funct::Parameter & p3, 00533 const funct::Parameter & p4, 00534 const funct::Parameter & p5, 00535 const funct::Parameter & p6, 00536 const funct::Parameter & p7, 00537 const funct::Parameter & p8, 00538 const funct::Parameter & p9, 00539 const funct::Parameter & p10, 00540 const funct::Parameter & p11, 00541 const funct::Parameter & p12, 00542 const funct::Parameter & p13) { 00543 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), min, max, 14); 00544 fun.SetParameter(0, *p0.ptr()); 00545 fun.SetParName(0, p0.name().c_str()); 00546 fun.SetParameter(1, *p1.ptr()); 00547 fun.SetParName(1, p1.name().c_str()); 00548 fun.SetParameter(2, *p2.ptr()); 00549 fun.SetParName(2, p2.name().c_str()); 00550 fun.SetParameter(3, *p3.ptr()); 00551 fun.SetParName(3, p3.name().c_str()); 00552 fun.SetParameter(4, *p4.ptr()); 00553 fun.SetParName(4, p4.name().c_str()); 00554 fun.SetParameter(5, *p5.ptr()); 00555 fun.SetParName(5, p5.name().c_str()); 00556 fun.SetParameter(6, *p6.ptr()); 00557 fun.SetParName(6, p6.name().c_str()); 00558 fun.SetParameter(7, *p7.ptr()); 00559 fun.SetParName(7, p7.name().c_str()); 00560 fun.SetParameter(8, *p8.ptr()); 00561 fun.SetParName(8, p8.name().c_str()); 00562 fun.SetParameter(9, *p9.ptr()); 00563 fun.SetParName(9, p9.name().c_str()); 00564 fun.SetParameter(10, *p10.ptr()); 00565 fun.SetParName(10, p10.name().c_str()); 00566 fun.SetParameter(11, *p11.ptr()); 00567 fun.SetParName(11, p11.name().c_str()); 00568 fun.SetParameter(12, *p12.ptr()); 00569 fun.SetParName(12, p12.name().c_str()); 00570 fun.SetParameter(13, *p13.ptr()); 00571 fun.SetParName(13, p13.name().c_str()); 00572 return fun; 00573 } 00574 00575 template<typename F> 00576 TF1 tf1(const char * name, F& f, double min, double max, 00577 const funct::Parameter & p0, 00578 const funct::Parameter & p1, 00579 const funct::Parameter & p2, 00580 const funct::Parameter & p3, 00581 const funct::Parameter & p4, 00582 const funct::Parameter & p5, 00583 const funct::Parameter & p6, 00584 const funct::Parameter & p7, 00585 const funct::Parameter & p8, 00586 const funct::Parameter & p9, 00587 const funct::Parameter & p10, 00588 const funct::Parameter & p11, 00589 const funct::Parameter & p12, 00590 const funct::Parameter & p13) { 00591 return tf1_t<helper::null_t>(name, f, min, max, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); 00592 } 00593 00594 template<typename Tag, typename F> 00595 TF1 tf1_t(const char * name, F& f, double min, double max, 00596 const funct::Parameter & p0, 00597 const funct::Parameter & p1, 00598 const funct::Parameter & p2, 00599 const funct::Parameter & p3, 00600 const funct::Parameter & p4, 00601 const funct::Parameter & p5, 00602 const funct::Parameter & p6, 00603 const funct::Parameter & p7, 00604 const funct::Parameter & p8, 00605 const funct::Parameter & p9, 00606 const funct::Parameter & p10, 00607 const funct::Parameter & p11, 00608 const funct::Parameter & p12, 00609 const funct::Parameter & p13, 00610 const funct::Parameter & p14) { 00611 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), min, max, 15); 00612 fun.SetParameter(0, *p0.ptr()); 00613 fun.SetParName(0, p0.name().c_str()); 00614 fun.SetParameter(1, *p1.ptr()); 00615 fun.SetParName(1, p1.name().c_str()); 00616 fun.SetParameter(2, *p2.ptr()); 00617 fun.SetParName(2, p2.name().c_str()); 00618 fun.SetParameter(3, *p3.ptr()); 00619 fun.SetParName(3, p3.name().c_str()); 00620 fun.SetParameter(4, *p4.ptr()); 00621 fun.SetParName(4, p4.name().c_str()); 00622 fun.SetParameter(5, *p5.ptr()); 00623 fun.SetParName(5, p5.name().c_str()); 00624 fun.SetParameter(6, *p6.ptr()); 00625 fun.SetParName(6, p6.name().c_str()); 00626 fun.SetParameter(7, *p7.ptr()); 00627 fun.SetParName(7, p7.name().c_str()); 00628 fun.SetParameter(8, *p8.ptr()); 00629 fun.SetParName(8, p8.name().c_str()); 00630 fun.SetParameter(9, *p9.ptr()); 00631 fun.SetParName(9, p9.name().c_str()); 00632 fun.SetParameter(10, *p10.ptr()); 00633 fun.SetParName(10, p10.name().c_str()); 00634 fun.SetParameter(11, *p11.ptr()); 00635 fun.SetParName(11, p11.name().c_str()); 00636 fun.SetParameter(12, *p12.ptr()); 00637 fun.SetParName(12, p12.name().c_str()); 00638 fun.SetParameter(13, *p13.ptr()); 00639 fun.SetParName(13, p13.name().c_str()); 00640 fun.SetParameter(14, *p14.ptr()); 00641 fun.SetParName(14, p14.name().c_str()); 00642 return fun; 00643 } 00644 00645 template<typename F> 00646 TF1 tf1(const char * name, F& f, double min, double max, 00647 const funct::Parameter & p0, 00648 const funct::Parameter & p1, 00649 const funct::Parameter & p2, 00650 const funct::Parameter & p3, 00651 const funct::Parameter & p4, 00652 const funct::Parameter & p5, 00653 const funct::Parameter & p6, 00654 const funct::Parameter & p7, 00655 const funct::Parameter & p8, 00656 const funct::Parameter & p9, 00657 const funct::Parameter & p10, 00658 const funct::Parameter & p11, 00659 const funct::Parameter & p12, 00660 const funct::Parameter & p13, 00661 const funct::Parameter & p14) { 00662 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); 00663 } 00664 00665 template<typename Tag, typename F> 00666 TF1 tf1_t(const char * name, F& f, double min, double max, 00667 const funct::Parameter & p0, 00668 const funct::Parameter & p1, 00669 const funct::Parameter & p2, 00670 const funct::Parameter & p3, 00671 const funct::Parameter & p4, 00672 const funct::Parameter & p5, 00673 const funct::Parameter & p6, 00674 const funct::Parameter & p7, 00675 const funct::Parameter & p8, 00676 const funct::Parameter & p9, 00677 const funct::Parameter & p10, 00678 const funct::Parameter & p11, 00679 const funct::Parameter & p12, 00680 const funct::Parameter & p13, 00681 const funct::Parameter & p14, 00682 const funct::Parameter & p15) { 00683 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, 00684 p10, p11, p12, p13, p14, p15), min, max, 16); 00685 fun.SetParameter(0, *p0.ptr()); 00686 fun.SetParName(0, p0.name().c_str()); 00687 fun.SetParameter(1, *p1.ptr()); 00688 fun.SetParName(1, p1.name().c_str()); 00689 fun.SetParameter(2, *p2.ptr()); 00690 fun.SetParName(2, p2.name().c_str()); 00691 fun.SetParameter(3, *p3.ptr()); 00692 fun.SetParName(3, p3.name().c_str()); 00693 fun.SetParameter(4, *p4.ptr()); 00694 fun.SetParName(4, p4.name().c_str()); 00695 fun.SetParameter(5, *p5.ptr()); 00696 fun.SetParName(5, p5.name().c_str()); 00697 fun.SetParameter(6, *p6.ptr()); 00698 fun.SetParName(6, p6.name().c_str()); 00699 fun.SetParameter(7, *p7.ptr()); 00700 fun.SetParName(7, p7.name().c_str()); 00701 fun.SetParameter(8, *p8.ptr()); 00702 fun.SetParName(8, p8.name().c_str()); 00703 fun.SetParameter(9, *p9.ptr()); 00704 fun.SetParName(9, p9.name().c_str()); 00705 fun.SetParameter(10, *p10.ptr()); 00706 fun.SetParName(10, p10.name().c_str()); 00707 fun.SetParameter(11, *p11.ptr()); 00708 fun.SetParName(11, p11.name().c_str()); 00709 fun.SetParameter(12, *p12.ptr()); 00710 fun.SetParName(12, p12.name().c_str()); 00711 fun.SetParameter(13, *p13.ptr()); 00712 fun.SetParName(13, p13.name().c_str()); 00713 fun.SetParameter(14, *p14.ptr()); 00714 fun.SetParName(14, p14.name().c_str()); 00715 fun.SetParameter(15, *p15.ptr()); 00716 fun.SetParName(15, p15.name().c_str()); 00717 return fun; 00718 } 00719 00720 template<typename F> 00721 TF1 tf1(const char * name, F& f, double min, double max, 00722 const funct::Parameter & p0, 00723 const funct::Parameter & p1, 00724 const funct::Parameter & p2, 00725 const funct::Parameter & p3, 00726 const funct::Parameter & p4, 00727 const funct::Parameter & p5, 00728 const funct::Parameter & p6, 00729 const funct::Parameter & p7, 00730 const funct::Parameter & p8, 00731 const funct::Parameter & p9, 00732 const funct::Parameter & p10, 00733 const funct::Parameter & p11, 00734 const funct::Parameter & p12, 00735 const funct::Parameter & p13, 00736 const funct::Parameter & p14, 00737 const funct::Parameter & p15) { 00738 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, p15); 00739 } 00740 00741 template<typename Tag, typename F> 00742 TF1 tf1_t(const char * name, F& f, double min, double max, 00743 const funct::Parameter & p0, 00744 const funct::Parameter & p1, 00745 const funct::Parameter & p2, 00746 const funct::Parameter & p3, 00747 const funct::Parameter & p4, 00748 const funct::Parameter & p5, 00749 const funct::Parameter & p6, 00750 const funct::Parameter & p7, 00751 const funct::Parameter & p8, 00752 const funct::Parameter & p9, 00753 const funct::Parameter & p10, 00754 const funct::Parameter & p11, 00755 const funct::Parameter & p12, 00756 const funct::Parameter & p13, 00757 const funct::Parameter & p14, 00758 const funct::Parameter & p15, 00759 const funct::Parameter & p16) { 00760 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, 00761 p10, p11, p12, p13, p14, p15, p16), min, max, 17); 00762 fun.SetParameter(0, *p0.ptr()); 00763 fun.SetParName(0, p0.name().c_str()); 00764 fun.SetParameter(1, *p1.ptr()); 00765 fun.SetParName(1, p1.name().c_str()); 00766 fun.SetParameter(2, *p2.ptr()); 00767 fun.SetParName(2, p2.name().c_str()); 00768 fun.SetParameter(3, *p3.ptr()); 00769 fun.SetParName(3, p3.name().c_str()); 00770 fun.SetParameter(4, *p4.ptr()); 00771 fun.SetParName(4, p4.name().c_str()); 00772 fun.SetParameter(5, *p5.ptr()); 00773 fun.SetParName(5, p5.name().c_str()); 00774 fun.SetParameter(6, *p6.ptr()); 00775 fun.SetParName(6, p6.name().c_str()); 00776 fun.SetParameter(7, *p7.ptr()); 00777 fun.SetParName(7, p7.name().c_str()); 00778 fun.SetParameter(8, *p8.ptr()); 00779 fun.SetParName(8, p8.name().c_str()); 00780 fun.SetParameter(9, *p9.ptr()); 00781 fun.SetParName(9, p9.name().c_str()); 00782 fun.SetParameter(10, *p10.ptr()); 00783 fun.SetParName(10, p10.name().c_str()); 00784 fun.SetParameter(11, *p11.ptr()); 00785 fun.SetParName(11, p11.name().c_str()); 00786 fun.SetParameter(12, *p12.ptr()); 00787 fun.SetParName(12, p12.name().c_str()); 00788 fun.SetParameter(13, *p13.ptr()); 00789 fun.SetParName(13, p13.name().c_str()); 00790 fun.SetParameter(14, *p14.ptr()); 00791 fun.SetParName(14, p14.name().c_str()); 00792 fun.SetParameter(15, *p15.ptr()); 00793 fun.SetParName(15, p15.name().c_str()); 00794 fun.SetParameter(16, *p16.ptr()); 00795 fun.SetParName(16, p16.name().c_str()); 00796 return fun; 00797 } 00798 00799 template<typename F> 00800 TF1 tf1(const char * name, F& f, double min, double max, 00801 const funct::Parameter & p0, 00802 const funct::Parameter & p1, 00803 const funct::Parameter & p2, 00804 const funct::Parameter & p3, 00805 const funct::Parameter & p4, 00806 const funct::Parameter & p5, 00807 const funct::Parameter & p6, 00808 const funct::Parameter & p7, 00809 const funct::Parameter & p8, 00810 const funct::Parameter & p9, 00811 const funct::Parameter & p10, 00812 const funct::Parameter & p11, 00813 const funct::Parameter & p12, 00814 const funct::Parameter & p13, 00815 const funct::Parameter & p14, 00816 const funct::Parameter & p15, 00817 const funct::Parameter & p16) { 00818 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, p15, p16); 00819 } 00820 00821 template<typename Tag, typename F> 00822 TF1 tf1_t(const char * name, F& f, double min, double max, 00823 const funct::Parameter & p0, 00824 const funct::Parameter & p1, 00825 const funct::Parameter & p2, 00826 const funct::Parameter & p3, 00827 const funct::Parameter & p4, 00828 const funct::Parameter & p5, 00829 const funct::Parameter & p6, 00830 const funct::Parameter & p7, 00831 const funct::Parameter & p8, 00832 const funct::Parameter & p9, 00833 const funct::Parameter & p10, 00834 const funct::Parameter & p11, 00835 const funct::Parameter & p12, 00836 const funct::Parameter & p13, 00837 const funct::Parameter & p14, 00838 const funct::Parameter & p15, 00839 const funct::Parameter & p16, 00840 const funct::Parameter & p17) { 00841 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, 00842 p10, p11, p12, p13, p14, p15, p16, p17), min, max, 18); 00843 fun.SetParameter(0, *p0.ptr()); 00844 fun.SetParName(0, p0.name().c_str()); 00845 fun.SetParameter(1, *p1.ptr()); 00846 fun.SetParName(1, p1.name().c_str()); 00847 fun.SetParameter(2, *p2.ptr()); 00848 fun.SetParName(2, p2.name().c_str()); 00849 fun.SetParameter(3, *p3.ptr()); 00850 fun.SetParName(3, p3.name().c_str()); 00851 fun.SetParameter(4, *p4.ptr()); 00852 fun.SetParName(4, p4.name().c_str()); 00853 fun.SetParameter(5, *p5.ptr()); 00854 fun.SetParName(5, p5.name().c_str()); 00855 fun.SetParameter(6, *p6.ptr()); 00856 fun.SetParName(6, p6.name().c_str()); 00857 fun.SetParameter(7, *p7.ptr()); 00858 fun.SetParName(7, p7.name().c_str()); 00859 fun.SetParameter(8, *p8.ptr()); 00860 fun.SetParName(8, p8.name().c_str()); 00861 fun.SetParameter(9, *p9.ptr()); 00862 fun.SetParName(9, p9.name().c_str()); 00863 fun.SetParameter(10, *p10.ptr()); 00864 fun.SetParName(10, p10.name().c_str()); 00865 fun.SetParameter(11, *p11.ptr()); 00866 fun.SetParName(11, p11.name().c_str()); 00867 fun.SetParameter(12, *p12.ptr()); 00868 fun.SetParName(12, p12.name().c_str()); 00869 fun.SetParameter(13, *p13.ptr()); 00870 fun.SetParName(13, p13.name().c_str()); 00871 fun.SetParameter(14, *p14.ptr()); 00872 fun.SetParName(14, p14.name().c_str()); 00873 fun.SetParameter(15, *p15.ptr()); 00874 fun.SetParName(15, p15.name().c_str()); 00875 fun.SetParameter(16, *p16.ptr()); 00876 fun.SetParName(16, p16.name().c_str()); 00877 fun.SetParameter(17, *p17.ptr()); 00878 fun.SetParName(17, p17.name().c_str()); 00879 return fun; 00880 } 00881 00882 template<typename F> 00883 TF1 tf1(const char * name, F& f, double min, double max, 00884 const funct::Parameter & p0, 00885 const funct::Parameter & p1, 00886 const funct::Parameter & p2, 00887 const funct::Parameter & p3, 00888 const funct::Parameter & p4, 00889 const funct::Parameter & p5, 00890 const funct::Parameter & p6, 00891 const funct::Parameter & p7, 00892 const funct::Parameter & p8, 00893 const funct::Parameter & p9, 00894 const funct::Parameter & p10, 00895 const funct::Parameter & p11, 00896 const funct::Parameter & p12, 00897 const funct::Parameter & p13, 00898 const funct::Parameter & p14, 00899 const funct::Parameter & p15, 00900 const funct::Parameter & p16, 00901 const funct::Parameter & p17) { 00902 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, p15, p16, p17); 00903 } 00904 00905 template<typename Tag, typename F> 00906 TF1 tf1_t(const char * name, F& f, double min, double max, 00907 const funct::Parameter & p0, 00908 const funct::Parameter & p1, 00909 const funct::Parameter & p2, 00910 const funct::Parameter & p3, 00911 const funct::Parameter & p4, 00912 const funct::Parameter & p5, 00913 const funct::Parameter & p6, 00914 const funct::Parameter & p7, 00915 const funct::Parameter & p8, 00916 const funct::Parameter & p9, 00917 const funct::Parameter & p10, 00918 const funct::Parameter & p11, 00919 const funct::Parameter & p12, 00920 const funct::Parameter & p13, 00921 const funct::Parameter & p14, 00922 const funct::Parameter & p15, 00923 const funct::Parameter & p16, 00924 const funct::Parameter & p17, 00925 const funct::Parameter & p18) { 00926 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, 00927 p10, p11, p12, p13, p14, p15, p16, p17, p18), min, max, 19); 00928 fun.SetParameter(0, *p0.ptr()); 00929 fun.SetParName(0, p0.name().c_str()); 00930 fun.SetParameter(1, *p1.ptr()); 00931 fun.SetParName(1, p1.name().c_str()); 00932 fun.SetParameter(2, *p2.ptr()); 00933 fun.SetParName(2, p2.name().c_str()); 00934 fun.SetParameter(3, *p3.ptr()); 00935 fun.SetParName(3, p3.name().c_str()); 00936 fun.SetParameter(4, *p4.ptr()); 00937 fun.SetParName(4, p4.name().c_str()); 00938 fun.SetParameter(5, *p5.ptr()); 00939 fun.SetParName(5, p5.name().c_str()); 00940 fun.SetParameter(6, *p6.ptr()); 00941 fun.SetParName(6, p6.name().c_str()); 00942 fun.SetParameter(7, *p7.ptr()); 00943 fun.SetParName(7, p7.name().c_str()); 00944 fun.SetParameter(8, *p8.ptr()); 00945 fun.SetParName(8, p8.name().c_str()); 00946 fun.SetParameter(9, *p9.ptr()); 00947 fun.SetParName(9, p9.name().c_str()); 00948 fun.SetParameter(10, *p10.ptr()); 00949 fun.SetParName(10, p10.name().c_str()); 00950 fun.SetParameter(11, *p11.ptr()); 00951 fun.SetParName(11, p11.name().c_str()); 00952 fun.SetParameter(12, *p12.ptr()); 00953 fun.SetParName(12, p12.name().c_str()); 00954 fun.SetParameter(13, *p13.ptr()); 00955 fun.SetParName(13, p13.name().c_str()); 00956 fun.SetParameter(14, *p14.ptr()); 00957 fun.SetParName(14, p14.name().c_str()); 00958 fun.SetParameter(15, *p15.ptr()); 00959 fun.SetParName(15, p15.name().c_str()); 00960 fun.SetParameter(16, *p16.ptr()); 00961 fun.SetParName(16, p16.name().c_str()); 00962 fun.SetParameter(17, *p17.ptr()); 00963 fun.SetParName(17, p17.name().c_str()); 00964 fun.SetParameter(18, *p18.ptr()); 00965 fun.SetParName(18, p18.name().c_str()); 00966 return fun; 00967 } 00968 00969 template<typename F> 00970 TF1 tf1(const char * name, F& f, double min, double max, 00971 const funct::Parameter & p0, 00972 const funct::Parameter & p1, 00973 const funct::Parameter & p2, 00974 const funct::Parameter & p3, 00975 const funct::Parameter & p4, 00976 const funct::Parameter & p5, 00977 const funct::Parameter & p6, 00978 const funct::Parameter & p7, 00979 const funct::Parameter & p8, 00980 const funct::Parameter & p9, 00981 const funct::Parameter & p10, 00982 const funct::Parameter & p11, 00983 const funct::Parameter & p12, 00984 const funct::Parameter & p13, 00985 const funct::Parameter & p14, 00986 const funct::Parameter & p15, 00987 const funct::Parameter & p16, 00988 const funct::Parameter & p17, 00989 const funct::Parameter & p18) { 00990 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, p15, p16, p17, p18); 00991 } 00992 00993 template<typename Tag, typename F> 00994 TF1 tf1_t(const char * name, F& f, double min, double max, 00995 const funct::Parameter & p0, 00996 const funct::Parameter & p1, 00997 const funct::Parameter & p2, 00998 const funct::Parameter & p3, 00999 const funct::Parameter & p4, 01000 const funct::Parameter & p5, 01001 const funct::Parameter & p6, 01002 const funct::Parameter & p7, 01003 const funct::Parameter & p8, 01004 const funct::Parameter & p9, 01005 const funct::Parameter & p10, 01006 const funct::Parameter & p11, 01007 const funct::Parameter & p12, 01008 const funct::Parameter & p13, 01009 const funct::Parameter & p14, 01010 const funct::Parameter & p15, 01011 const funct::Parameter & p16, 01012 const funct::Parameter & p17, 01013 const funct::Parameter & p18, 01014 const funct::Parameter & p19) { 01015 TF1 fun(name, root::function_t<1, Tag>(f, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, 01016 p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), min, max, 20); 01017 fun.SetParameter(0, *p0.ptr()); 01018 fun.SetParName(0, p0.name().c_str()); 01019 fun.SetParameter(1, *p1.ptr()); 01020 fun.SetParName(1, p1.name().c_str()); 01021 fun.SetParameter(2, *p2.ptr()); 01022 fun.SetParName(2, p2.name().c_str()); 01023 fun.SetParameter(3, *p3.ptr()); 01024 fun.SetParName(3, p3.name().c_str()); 01025 fun.SetParameter(4, *p4.ptr()); 01026 fun.SetParName(4, p4.name().c_str()); 01027 fun.SetParameter(5, *p5.ptr()); 01028 fun.SetParName(5, p5.name().c_str()); 01029 fun.SetParameter(6, *p6.ptr()); 01030 fun.SetParName(6, p6.name().c_str()); 01031 fun.SetParameter(7, *p7.ptr()); 01032 fun.SetParName(7, p7.name().c_str()); 01033 fun.SetParameter(8, *p8.ptr()); 01034 fun.SetParName(8, p8.name().c_str()); 01035 fun.SetParameter(9, *p9.ptr()); 01036 fun.SetParName(9, p9.name().c_str()); 01037 fun.SetParameter(10, *p10.ptr()); 01038 fun.SetParName(10, p10.name().c_str()); 01039 fun.SetParameter(11, *p11.ptr()); 01040 fun.SetParName(11, p11.name().c_str()); 01041 fun.SetParameter(12, *p12.ptr()); 01042 fun.SetParName(12, p12.name().c_str()); 01043 fun.SetParameter(13, *p13.ptr()); 01044 fun.SetParName(13, p13.name().c_str()); 01045 fun.SetParameter(14, *p14.ptr()); 01046 fun.SetParName(14, p14.name().c_str()); 01047 fun.SetParameter(15, *p15.ptr()); 01048 fun.SetParName(15, p15.name().c_str()); 01049 fun.SetParameter(16, *p16.ptr()); 01050 fun.SetParName(16, p16.name().c_str()); 01051 fun.SetParameter(17, *p17.ptr()); 01052 fun.SetParName(17, p17.name().c_str()); 01053 fun.SetParameter(18, *p18.ptr()); 01054 fun.SetParName(18, p18.name().c_str()); 01055 fun.SetParameter(19, *p19.ptr()); 01056 fun.SetParName(19, p19.name().c_str()); 01057 return fun; 01058 } 01059 01060 01061 template<typename F> 01062 TF1 tf1(const char * name, F& f, double min, double max, 01063 const funct::Parameter & p0, 01064 const funct::Parameter & p1, 01065 const funct::Parameter & p2, 01066 const funct::Parameter & p3, 01067 const funct::Parameter & p4, 01068 const funct::Parameter & p5, 01069 const funct::Parameter & p6, 01070 const funct::Parameter & p7, 01071 const funct::Parameter & p8, 01072 const funct::Parameter & p9, 01073 const funct::Parameter & p10, 01074 const funct::Parameter & p11, 01075 const funct::Parameter & p12, 01076 const funct::Parameter & p13, 01077 const funct::Parameter & p14, 01078 const funct::Parameter & p15, 01079 const funct::Parameter & p16, 01080 const funct::Parameter & p17, 01081 const funct::Parameter & p18, 01082 const funct::Parameter & p19) { 01083 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, p15, p16, p17, p18, p19); 01084 } 01085 01086 template<typename Tag, typename F> 01087 TF1 tf1_t(const char * name, F& f, double min, double max, 01088 const std::vector<funct::Parameter> & p) { 01089 TF1 fun(name, root::function_t<1, Tag>(f, p), min, max, p.size()); 01090 for(size_t i = 0; i < p.size(); ++i) { 01091 fun.SetParameter(i, *p[i].ptr()); 01092 fun.SetParName(i, p[i].name().c_str()); 01093 } 01094 return fun; 01095 } 01096 01097 template<typename F> 01098 TF1 tf1(const char * name, F& f, double min, double max, 01099 const std::vector<funct::Parameter> & p) { 01100 return tf1_t<helper::null_t>(name, f, min, max, p); 01101 } 01102 01103 template<typename Tag, typename F> 01104 TF1 tf1_t(const char * name, F& f, double min, double max, 01105 const std::vector<boost::shared_ptr<double> > & p) { 01106 TF1 fun(name, root::function_t<1, Tag>(f, p), min, max, p.size()); 01107 for(size_t i = 0; i < p.size(); ++i) 01108 fun.SetParameter(i, *p[i]); 01109 return fun; 01110 } 01111 01112 template<typename F> 01113 TF1 tf1(const char * name, F& f, double min, double max, 01114 const std::vector<boost::shared_ptr<double> > & p) { 01115 return tf1_t<helper::null_t>(name, f, min, max, p); 01116 } 01117 01118 } 01119 01120 #endif