-
Notifications
You must be signed in to change notification settings - Fork 0
/
newpdfs.tex
55 lines (47 loc) · 2.02 KB
/
newpdfs.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
\section{Adding new PDFs}
\label{sec:newpdfs}
For advanced users who need esoteric functions, GooFit makes
it easy to write a new PDF class. There are two steps to the process:
\begin{itemize}
\item Write an evaluation method with the required signature,
using the provided index array to look up parameters and observables.
An example is shown in Listing~\ref{list:evalexample}.
\item Create a C++ class inheriting from \texttt{GooPdf}, in which
the constructor populates the index array through the \texttt{registerParameter}
method. Listing~\ref{list:indexexample} shows an example.
\end{itemize}
That's it! Putting the new \texttt{FooPdf.cu} and \texttt{FooPdf.hh} files
in the \texttt{PDFs} directory of GooFit will cause them to be compiled with
the rest of the framework, and be available for use in the same way as the
pre-existing PDFs.
\begin{listing}
\label{list:evalexample} \emph{Evaluation function for a Gaussian
PDF. Note the double indirection of the index-array lookups.
Here \texttt{fptype} indicates a floating-point number, by default \texttt{double}
precision.}
\begin{Verbatim}[commandchars=\\\$\#]
__device__ fptype device_Gaussian (fptype* evt, fptype* p, unsigned int* indices) {
fptype x = evt[indices[2 + indices[0]]];
fptype mean = p[indices[1]];
fptype sigma = p[indices[2]];
fptype ret = EXP(-0.5*(x-mean)*(x-mean)/(sigma*sigma));
return ret;
}
__device__ device_function_ptr ptr_to_Gaussian = device_Gaussian;
\end{Verbatim}
\end{listing}
\begin{listing}
\label{list:indexexample} \emph{Populating the index array used in Listing~\ref{list:evalexample}}.
\begin{Verbatim}[commandchars=\\\$\#]
__host__ GaussianPdf::GaussianPdf (std::string n, Variable* _x,
Variable* mean, Variable* sigma)
: GooPdf(_x, n)
{
std::vector<unsigned int> pindices;
pindices.push_back(registerParameter(mean));
pindices.push_back(registerParameter(sigma));
cudaMemcpyFromSymbol((void**) &host_fcn_ptr, ptr_to_Gaussian, sizeof(void*));
initialise(pindices);
}
\end{Verbatim}
\end{listing}