Files
musrfit/classPUserFcnBase.html
Gitea Actions 8a8eac55b7 Deploy site
2025-12-27 12:57:44 +00:00

444 lines
28 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.13.2"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>musrfit: PUserFcnBase Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">musrfit<span id="projectnumber">&#160;1.9.9</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.13.2 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',false,false,'search.php','Search',true);
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function(){initNavTree('classPUserFcnBase.html',''); initResizable(true); });
/* @license-end */
</script>
<div id="doc-content">
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classPUserFcnBase-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">PUserFcnBase Class Reference<span class="mlabels"><span class="mlabel abstract">abstract</span></span></div></div>
</div><!--header-->
<div class="contents">
<p>Abstract base class for user-defined theory functions in musrfit.
<a href="#details">More...</a></p>
<p><code>#include &lt;<a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for PUserFcnBase:</div>
<div class="dyncontent">
<div class="center"><img src="classPUserFcnBase__inherit__graph.png" border="0" usemap="#aPUserFcnBase_inherit__map" alt="Inheritance graph"/></div>
<map name="aPUserFcnBase_inherit__map" id="aPUserFcnBase_inherit__map">
<area shape="rect" title="Abstract base class for user&#45;defined theory functions in musrfit." alt="" coords="5,81,112,109"/>
<area shape="rect" href="classPUserFcn.html" title="Example user function implementing a third&#45;order polynomial." alt="" coords="19,157,98,184"/>
<area shape="poly" title=" " alt="" coords="61,124,61,156,56,156,56,124"/>
<area shape="rect" title=" " alt="" coords="24,5,93,33"/>
<area shape="poly" title=" " alt="" coords="61,49,61,81,56,81,56,49"/>
</map>
<center><span class="legend">[<a target="top" href="graph_legend.html">legend</a>]</span></center></div>
<div class="dynheader">
Collaboration diagram for PUserFcnBase:</div>
<div class="dyncontent">
<div class="center"><img src="classPUserFcnBase__coll__graph.png" border="0" usemap="#aPUserFcnBase_coll__map" alt="Collaboration graph"/></div>
<map name="aPUserFcnBase_coll__map" id="aPUserFcnBase_coll__map">
<area shape="rect" title="Abstract base class for user&#45;defined theory functions in musrfit." alt="" coords="5,81,112,109"/>
<area shape="rect" title=" " alt="" coords="24,5,93,33"/>
<area shape="poly" title=" " alt="" coords="61,49,61,81,56,81,56,49"/>
</map>
<center><span class="legend">[<a target="top" href="graph_legend.html">legend</a>]</span></center></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a683bbaba8ed0507b3a302294e00f07ec" id="r_a683bbaba8ed0507b3a302294e00f07ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a683bbaba8ed0507b3a302294e00f07ec">PUserFcnBase</a> ()</td></tr>
<tr class="memdesc:a683bbaba8ed0507b3a302294e00f07ec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default constructor. <br /></td></tr>
<tr class="separator:a683bbaba8ed0507b3a302294e00f07ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a050de32799f0994ec6282154a9b053ee" id="r_a050de32799f0994ec6282154a9b053ee"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a050de32799f0994ec6282154a9b053ee">~PUserFcnBase</a> ()</td></tr>
<tr class="memdesc:a050de32799f0994ec6282154a9b053ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Virtual destructor. <br /></td></tr>
<tr class="separator:a050de32799f0994ec6282154a9b053ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a06dda4e4cc923a56cfadafa1bb43a8cc" id="r_a06dda4e4cc923a56cfadafa1bb43a8cc"><td class="memItemLeft" align="right" valign="top">virtual Bool_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a06dda4e4cc923a56cfadafa1bb43a8cc">NeedGlobalPart</a> () const</td></tr>
<tr class="separator:a06dda4e4cc923a56cfadafa1bb43a8cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abae008b6b6799ded0825ac6befb2283b" id="r_abae008b6b6799ded0825ac6befb2283b"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#abae008b6b6799ded0825ac6befb2283b">SetGlobalPart</a> (std::vector&lt; void * &gt; &amp;globalPart, UInt_t idx)</td></tr>
<tr class="separator:abae008b6b6799ded0825ac6befb2283b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a47d9ca334bc6c15193c7e0c0143e2bc6" id="r_a47d9ca334bc6c15193c7e0c0143e2bc6"><td class="memItemLeft" align="right" valign="top">virtual Bool_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a47d9ca334bc6c15193c7e0c0143e2bc6">GlobalPartIsValid</a> () const</td></tr>
<tr class="separator:a47d9ca334bc6c15193c7e0c0143e2bc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa0cab47bd997cfc376856ea35879ff6f" id="r_aa0cab47bd997cfc376856ea35879ff6f"><td class="memItemLeft" align="right" valign="top">virtual Double_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aa0cab47bd997cfc376856ea35879ff6f">operator()</a> (Double_t t, const std::vector&lt; Double_t &gt; &amp;param) const =0</td></tr>
<tr class="separator:aa0cab47bd997cfc376856ea35879ff6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Abstract base class for user-defined theory functions in musrfit. </p>
<p><a class="el" href="classPUserFcnBase.html" title="Abstract base class for user-defined theory functions in musrfit.">PUserFcnBase</a> enables extending musrfit with custom theory functions beyond the 34 built-in functions. Users create derived classes implementing specific physics models, compile them into shared libraries, and load them dynamically at runtime via ROOT's plugin mechanism.</p>
<h1><a class="anchor" id="userfcn_use_cases"></a>
Use Cases</h1>
<p>User functions are valuable for:</p><ul>
<li>Novel relaxation mechanisms not in standard library</li>
<li>Material-specific models (e.g., Skyrmion lattices, spin ice)</li>
<li>Complex multi-component functions requiring custom logic</li>
<li>Proprietary or experimental theory functions under development</li>
<li>Functions requiring external libraries (GSL, CUDA, MKL, etc.)</li>
<li>Performance-critical implementations with custom optimization</li>
</ul>
<h1><a class="anchor" id="userfcn_implementation"></a>
Implementation Guide</h1>
<p><b>Step 1: Create header file (MyUserFcn.h)</b> </p><div class="fragment"><div class="line"><span class="preprocessor">#ifndef MY_USER_FCN_H</span></div>
<div class="line"><span class="preprocessor">#define MY_USER_FCN_H</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#include &quot;<a class="code" href="PUserFcnBase_8h.html">PUserFcnBase.h</a>&quot;</span></div>
<div class="line"> </div>
<div class="line"><span class="keyword">class </span>TMyRelaxation : <span class="keyword">public</span> <a class="code hl_function" href="#a683bbaba8ed0507b3a302294e00f07ec">PUserFcnBase</a> {</div>
<div class="line"> <span class="keyword">public</span>:</div>
<div class="line"> TMyRelaxation() {}</div>
<div class="line"> <span class="keyword">virtual</span> ~TMyRelaxation() {}</div>
<div class="line"> </div>
<div class="line"> <span class="keyword">virtual</span> Double_t <a class="code hl_function" href="#aa0cab47bd997cfc376856ea35879ff6f">operator()</a>(Double_t t, <span class="keyword">const</span> std::vector&lt;Double_t&gt; &amp;par) <span class="keyword">const</span>;</div>
<div class="line"> </div>
<div class="line"> ClassDef(TMyRelaxation, 1)</div>
<div class="line">};</div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#endif</span></div>
<div class="ttc" id="aPUserFcnBase_8h_html"><div class="ttname"><a href="PUserFcnBase_8h.html">PUserFcnBase.h</a></div></div>
<div class="ttc" id="aclassPUserFcnBase_html_a683bbaba8ed0507b3a302294e00f07ec"><div class="ttname"><a href="#a683bbaba8ed0507b3a302294e00f07ec">PUserFcnBase::PUserFcnBase</a></div><div class="ttdeci">PUserFcnBase()</div><div class="ttdoc">Default constructor.</div><div class="ttdef"><b>Definition</b> <a href="PUserFcnBase_8h_source.html#l00173">PUserFcnBase.h:173</a></div></div>
<div class="ttc" id="aclassPUserFcnBase_html_aa0cab47bd997cfc376856ea35879ff6f"><div class="ttname"><a href="#aa0cab47bd997cfc376856ea35879ff6f">PUserFcnBase::operator()</a></div><div class="ttdeci">virtual Double_t operator()(Double_t t, const std::vector&lt; Double_t &gt; &amp;param) const =0</div></div>
</div><!-- fragment --><p><b>Step 2: Implement source file (MyUserFcn.cpp)</b> </p><div class="fragment"><div class="line"><span class="preprocessor">#include &quot;MyUserFcn.h&quot;</span></div>
<div class="line"><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"> </div>
<div class="line"><a class="code hl_function" href="PMusrCanvas_8cpp.html#a06c3e315850f5435404319475245a33b">ClassImp</a>(TMyRelaxation)</div>
<div class="line"> </div>
<div class="line">Double_t TMyRelaxation::operator()(Double_t t, <span class="keyword">const</span> std::vector&lt;Double_t&gt; &amp;par)<span class="keyword"> const </span>{</div>
<div class="line"> <span class="comment">// par[0] = rate (lambda), par[1] = exponent (beta)</span></div>
<div class="line"> <span class="keywordflow">if</span> (t &lt; 0) <span class="keywordflow">return</span> 1.0;</div>
<div class="line"> <span class="keywordflow">return</span> exp(-pow(par[0] * t, par[1]));</div>
<div class="line">}</div>
<div class="ttc" id="aPMusrCanvas_8cpp_html_a06c3e315850f5435404319475245a33b"><div class="ttname"><a href="PMusrCanvas_8cpp.html#a06c3e315850f5435404319475245a33b">ClassImp</a></div><div class="ttdeci">ClassImp(PMusrCanvasPlotRange) PMusrCanvasPlotRange</div><div class="ttdoc">Constructor initializing plot range to undefined state.</div><div class="ttdef"><b>Definition</b> <a href="PMusrCanvas_8cpp_source.html#l00047">PMusrCanvas.cpp:47</a></div></div>
</div><!-- fragment --><p><b>Step 3: Create LinkDef file (MyUserFcnLinkDef.h)</b> </p><div class="fragment"><div class="line"><span class="preprocessor">#ifdef __CINT__</span></div>
<div class="line"><span class="preprocessor">#pragma link off all globals;</span></div>
<div class="line"><span class="preprocessor">#pragma link off all classes;</span></div>
<div class="line"><span class="preprocessor">#pragma link off all functions;</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#pragma link C++ class TMyRelaxation+;</span></div>
<div class="line"><span class="preprocessor">#endif</span></div>
</div><!-- fragment --><p><b>Step 4: Build shared library</b> </p><div class="fragment"><div class="line">rootcint -f MyUserFcnDict.cxx -c MyUserFcn.h MyUserFcnLinkDef.h</div>
<div class="line">g++ -shared -fPIC -o libMyUserFcn.so MyUserFcn.cpp MyUserFcnDict.cxx \</div>
<div class="line"> $(root-config --cflags --libs) -I$MUSRFIT/include</div>
</div><!-- fragment --><p><b>Step 5: Use in MSR file</b> </p><div class="fragment"><div class="line">THEORY</div>
<div class="line">asymmetry 1</div>
<div class="line">userFcn libMyUserFcn.so TMyRelaxation 2 3 (rate, exponent)</div>
</div><!-- fragment --><h1><a class="anchor" id="userfcn_global"></a>
Global Part for Expensive Computations</h1>
<p>For functions requiring expensive one-time setup (lookup tables, matrix decompositions, file loading), implement the global part interface:</p>
<div class="fragment"><div class="line"><span class="keyword">class </span>TMyComplexFcn : <span class="keyword">public</span> <a class="code hl_function" href="#a683bbaba8ed0507b3a302294e00f07ec">PUserFcnBase</a> {</div>
<div class="line"> <span class="keyword">private</span>:</div>
<div class="line"> <span class="keyword">mutable</span> <span class="keywordtype">void</span> *fGlobal; <span class="comment">// Pointer to global data</span></div>
<div class="line"> </div>
<div class="line"> <span class="keyword">public</span>:</div>
<div class="line"> <span class="keyword">virtual</span> Bool_t <a class="code hl_function" href="#a06dda4e4cc923a56cfadafa1bb43a8cc">NeedGlobalPart</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">true</span>; }</div>
<div class="line"> </div>
<div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="#abae008b6b6799ded0825ac6befb2283b">SetGlobalPart</a>(std::vector&lt;void*&gt; &amp;globalPart, UInt_t idx) {</div>
<div class="line"> <span class="keywordflow">if</span> (idx &lt; globalPart.size() &amp;&amp; globalPart[idx] != <span class="keyword">nullptr</span>) {</div>
<div class="line"> fGlobal = globalPart[idx]; <span class="comment">// Reuse existing</span></div>
<div class="line"> } <span class="keywordflow">else</span> {</div>
<div class="line"> fGlobal = <span class="keyword">new</span> MyGlobalData(); <span class="comment">// Create new</span></div>
<div class="line"> <span class="keyword">static_cast&lt;</span>MyGlobalData*<span class="keyword">&gt;</span>(fGlobal)-&gt;Initialize();</div>
<div class="line"> <span class="keywordflow">if</span> (idx &lt; globalPart.size())</div>
<div class="line"> globalPart[idx] = fGlobal;</div>
<div class="line"> <span class="keywordflow">else</span></div>
<div class="line"> globalPart.push_back(fGlobal);</div>
<div class="line"> }</div>
<div class="line"> }</div>
<div class="line"> </div>
<div class="line"> <span class="keyword">virtual</span> Bool_t <a class="code hl_function" href="#a47d9ca334bc6c15193c7e0c0143e2bc6">GlobalPartIsValid</a>()<span class="keyword"> const </span>{</div>
<div class="line"> <span class="keywordflow">return</span> fGlobal != <span class="keyword">nullptr</span>;</div>
<div class="line"> }</div>
<div class="line"> </div>
<div class="line"> <span class="comment">// ... operator() uses fGlobal for fast lookup</span></div>
<div class="line">};</div>
<div class="ttc" id="aclassPUserFcnBase_html_a06dda4e4cc923a56cfadafa1bb43a8cc"><div class="ttname"><a href="#a06dda4e4cc923a56cfadafa1bb43a8cc">PUserFcnBase::NeedGlobalPart</a></div><div class="ttdeci">virtual Bool_t NeedGlobalPart() const</div><div class="ttdef"><b>Definition</b> <a href="PUserFcnBase_8h_source.html#l00187">PUserFcnBase.h:187</a></div></div>
<div class="ttc" id="aclassPUserFcnBase_html_a47d9ca334bc6c15193c7e0c0143e2bc6"><div class="ttname"><a href="#a47d9ca334bc6c15193c7e0c0143e2bc6">PUserFcnBase::GlobalPartIsValid</a></div><div class="ttdeci">virtual Bool_t GlobalPartIsValid() const</div><div class="ttdef"><b>Definition</b> <a href="PUserFcnBase_8h_source.html#l00207">PUserFcnBase.h:207</a></div></div>
<div class="ttc" id="aclassPUserFcnBase_html_abae008b6b6799ded0825ac6befb2283b"><div class="ttname"><a href="#abae008b6b6799ded0825ac6befb2283b">PUserFcnBase::SetGlobalPart</a></div><div class="ttdeci">virtual void SetGlobalPart(std::vector&lt; void * &gt; &amp;globalPart, UInt_t idx)</div><div class="ttdef"><b>Definition</b> <a href="PUserFcnBase_8h_source.html#l00198">PUserFcnBase.h:198</a></div></div>
</div><!-- fragment --><h1><a class="anchor" id="userfcn_parameters"></a>
Parameter Conventions</h1>
<p><b>In the MSR file THEORY block:</b> </p><div class="fragment"><div class="line">userFcn libName.so ClassName param1 param2 ... paramN</div>
</div><!-- fragment --><p>Parameters can be:</p><ul>
<li>Direct numbers: <code>1</code>, <code>2</code> → parameter indices from FITPARAMETER block</li>
<li>Map references: <code>map1</code>, <code>map2</code> → via RUN block map</li>
<li>Function references: <code>fun1</code>, <code>fun2</code> → evaluated FUNCTIONS</li>
</ul>
<p><b>Convention:</b> The last parameter is typically a time shift.</p>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="classPTheory.html" title="Theory function evaluator and expression tree manager.">PTheory</a> for how user functions are loaded and called </dd>
<dd>
<a class="el" href="classPUserFcn.html" title="Example user function implementing a third-order polynomial.">PUserFcn</a> for a simple example implementation </dd></dl>
<p class="definition">Definition at line <a class="el" href="PUserFcnBase_8h_source.html#l00169">169</a> of file <a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a683bbaba8ed0507b3a302294e00f07ec" name="a683bbaba8ed0507b3a302294e00f07ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a683bbaba8ed0507b3a302294e00f07ec">&#9670;&#160;</a></span>PUserFcnBase()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">PUserFcnBase::PUserFcnBase </td>
<td>(</td>
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel inline">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Default constructor. </p>
<p class="definition">Definition at line <a class="el" href="PUserFcnBase_8h_source.html#l00173">173</a> of file <a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="#aa0cab47bd997cfc376856ea35879ff6f">operator()()</a>.</p>
</div>
</div>
<a id="a050de32799f0994ec6282154a9b053ee" name="a050de32799f0994ec6282154a9b053ee"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a050de32799f0994ec6282154a9b053ee">&#9670;&#160;</a></span>~PUserFcnBase()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual PUserFcnBase::~PUserFcnBase </td>
<td>(</td>
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel virtual">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Virtual destructor. </p>
<p class="definition">Definition at line <a class="el" href="PUserFcnBase_8h_source.html#l00176">176</a> of file <a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a47d9ca334bc6c15193c7e0c0143e2bc6" name="a47d9ca334bc6c15193c7e0c0143e2bc6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a47d9ca334bc6c15193c7e0c0143e2bc6">&#9670;&#160;</a></span>GlobalPartIsValid()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual Bool_t PUserFcnBase::GlobalPartIsValid </td>
<td>(</td>
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel virtual">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Checks if the global part initialized correctly.</p>
<p>Override to validate your global data structure after <a class="el" href="#abae008b6b6799ded0825ac6befb2283b">SetGlobalPart()</a>.</p>
<dl class="section return"><dt>Returns</dt><dd>true if global part is valid and ready, false otherwise (default: false) </dd></dl>
<p class="definition">Definition at line <a class="el" href="PUserFcnBase_8h_source.html#l00207">207</a> of file <a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>.</p>
</div>
</div>
<a id="a06dda4e4cc923a56cfadafa1bb43a8cc" name="a06dda4e4cc923a56cfadafa1bb43a8cc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a06dda4e4cc923a56cfadafa1bb43a8cc">&#9670;&#160;</a></span>NeedGlobalPart()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual Bool_t PUserFcnBase::NeedGlobalPart </td>
<td>(</td>
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel virtual">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Indicates if this function requires global initialization.</p>
<p>Override to return true if your function needs expensive one-time setup (e.g., calculating lookup tables, loading external data). The global part is computed once and reused across fit iterations.</p>
<dl class="section return"><dt>Returns</dt><dd>true if global part needed, false otherwise (default: false) </dd></dl>
<p class="definition">Definition at line <a class="el" href="PUserFcnBase_8h_source.html#l00187">187</a> of file <a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>.</p>
</div>
</div>
<a id="aa0cab47bd997cfc376856ea35879ff6f" name="aa0cab47bd997cfc376856ea35879ff6f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa0cab47bd997cfc376856ea35879ff6f">&#9670;&#160;</a></span>operator()()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual Double_t PUserFcnBase::operator() </td>
<td>(</td>
<td class="paramtype">Double_t</td> <td class="paramname"><span class="paramname"><em>t</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; Double_t &gt; &amp;</td> <td class="paramname"><span class="paramname"><em>param</em></span>&#160;) const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel pure-virtual">pure virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Evaluates the user function at time t (pure virtual).</p>
<p>This is the core evaluation method called for each data point during fitting. Must be implemented by derived classes.</p>
<p><b>Parameter convention:</b> The last parameter is typically the time shift. Earlier parameters are model-specific (rates, amplitudes, exponents, etc.).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">t</td><td>Time in microseconds (μs) </td></tr>
<tr><td class="paramname">param</td><td>Vector of function parameters (from MSR file + maps) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Function value at time t </dd></dl>
<p>Implemented in <a class="el" href="classPUserFcn.html#a7f9e951bb3f7f2ba2d196aeb3ebfe8bc">PUserFcn</a>.</p>
<p class="reference">References <a class="el" href="PUserFcnBase_8h_source.html#l00173">PUserFcnBase()</a>.</p>
</div>
</div>
<a id="abae008b6b6799ded0825ac6befb2283b" name="abae008b6b6799ded0825ac6befb2283b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abae008b6b6799ded0825ac6befb2283b">&#9670;&#160;</a></span>SetGlobalPart()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual void PUserFcnBase::SetGlobalPart </td>
<td>(</td>
<td class="paramtype">std::vector&lt; void * &gt; &amp;</td> <td class="paramname"><span class="paramname"><em>globalPart</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">UInt_t</td> <td class="paramname"><span class="paramname"><em>idx</em></span>&#160;)</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel virtual">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Sets up the global part of the user function.</p>
<p>Called once during initialization if <a class="el" href="#a06dda4e4cc923a56cfadafa1bb43a8cc">NeedGlobalPart()</a> returns true. Use this to allocate and initialize shared data structures.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">globalPart</td><td>Vector of global objects (one per run) </td></tr>
<tr><td class="paramname">idx</td><td>Index of this run's global object in the vector </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="PUserFcnBase_8h_source.html#l00198">198</a> of file <a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>/workspace/LMU/musrfit/src/include/<a class="el" href="PUserFcnBase_8h_source.html">PUserFcnBase.h</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="classPUserFcnBase.html">PUserFcnBase</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.13.2 </li>
</ul>
</div>
</body>
</html>