RapidFit is a fitting tool developed by the Edinburgh LHCb group. It does not use
RooFit. It is intended to be used by the group to perform fits to data from Bs->J/psiPhi and Bs->PhiPhi channels (along with anything else we need). The alpha version of
RapidFit has just been released.
RapidFitToDo
Installation
Nota Bene
I would recommend that you do this on the PPE machines but it will also work on your Linux or Mac laptop, but you need to know what you are doing.
Checking out of SVN
Check out the package (-t specifies the tag that you want to use). We want the beta release. Pick a directory where you want to install
RapidFit.
RapidFit doesn't at this time of writing (22/11/2010) have a stable version which should be downloaded and run, instead I recommend running trunk at this time:
svn co svn+ssh://cern-username@svn.cern.ch/reps/lhcbedinburgh/Code/Fitting/RapidFit/trunk
//OLD HOWTO VERSION//
export RAPIDFITINSTALL=~/lhcb/beta_s/Fitting/RapidFit
export RAPIDFITVERSION=tags/mc09_fitting_validation # tags/beta_20091124 # only tags/mc09_fitting_validation in repo 03/05/10
mkdir -p $RAPIDFITINSTALL/tags
cd $RAPIDFITINSTALL
svn co svn+ssh://cern-username@svn.cern.ch/reps/lhcbedinburgh/Code/Fitting/RapidFit/$RAPIDFITVERSION
Set up your ROOT environment
Now make sure that your
ROOT environment is setup. ROOTSYS below is set appropriately for working on the PPE machines. You can put the stuff below into a script that you source, if you want.
export ROOTSYS=/Disk/lochnagar0/general/root/5.24.00_slc5_gcc34_bin
export PATH=${ROOTSYS}/bin:${PATH}:
export LD_LIBRARY_PATH=${ROOTSYS}/lib:${LD_LIBRARY_PATH}
export DYLD_LIBRARY_PATH=${ROOTSYS}/lib:${DYLD_LIBRARY_PATH} # only needed for Mac OS X
export PYTHONPATH=${ROOTSYS}/lib:${PYTHONPATH}
Compile
Change into the directory containing the code and compile. Make sure that you set the path correctly for your installation.
export RAPIDFIT=$RAPIDFITINSTALL/tags/$RAPIDFITVERSION
cd $RAPIDFIT
make -j3 # -j3 will probably be beinificial on most machines
Run a fit!
cd $RAPIDFIT/bin
./fitting -f $RAPIDFIT/config/RaPDFToy_noBkg.xml
Now check the output? Do the results look good? See some examples below.
Running a job on the PPE Condor cluster using Ganga
To properly perform systematic studies using
RapidFit, it will be essential to run many toys. To speed things up it is useful to be able to run these toys in parallel on a batch system. In Edinburgh we have two such batch systems: Condor is available in PPE and the ECDF system which requires you to log into and compile your code on a separate frontend machine. For the moment, we have made available a simple script that will allow you to run your toy study on Condor by submitting many subjobs using Ganga.
> setupLHCb
> GangaEnv
> ganga
[1] load( '/path/to/Fitting/RapidFit/scripts/GangaJobForEdinburghCondor.py' )
[2] jobs[-1].submit()
Post-processing of the Condor jobs
The Condor jobs will produce many fit results files which Ganga merges together for you. We have developed a pyROOT script which will summarise this merged file for you and produce a table of the pull plot statistics for each of the physics parameters that are floated in the fit. After setting up your
ROOT environment do this:
python $RAPIDFIT/scripts/PrintLatexTableOfPullResults.py $RAPIDFIT/config/your_fit_config.xml /path/to/merged/outout/pullPlots.root /path/to/outputfile.root
Fitter Configuration
XML Config file
Description of
RapidFit's
XML configuration format.
Command line arguments
Description of
RapidFit's
Command line arguments.
Source code
Documentation
The code has some (limited) Doxygen markup inside it. The online class list etc can be found
here.
Write your own!
The intention of the
RapidFit framework is that most components are interchangeable, and so new classes can easily be created and used. An obvious example is the creation of PDFs: all different functions, but implementing the same interface. Advice on creating your own PDF can be found
here.
Once you have written your own class for
RapidFit, to make it accessible you simply add an appropriate entry in
ClassLookUp.cpp.
The PDFs which are available
J/PsiPhi Signal
RaPDF_Bs2JpsiPhi |
J/PsiPhi signal |
Description |
This is the classic J/PsiPhi PDF containing the time and angle factors, as well as ancillary parameters such as Bs mass difference, mistag rate...etc. |
Parameters: |
"gamma" |
"deltaGamma " |
"Azero_sq" |
"Aperp_sq" |
"delta_zero" |
"delta_para" |
"delta_perp" |
"Phi_s" |
"deltaM " |
"mistag" |
Observables: |
"time" |
"cosTheta" |
"phi" |
"cosPsi" |
"tag" |
|
|
RaPDF_Bs2JpsiPhiNew |
J/PsiPhi signal with event-by-event mistag |
Description |
As above but the mistag is now promoted to an event-by-event observble. |
Parameters: |
"gamma" |
"deltaGamma " |
"Azero_sq" |
"Aperp_sq" |
"delta_zero" |
"delta_para" |
"delta_perp" |
"Phi_s" |
"deltaM " |
Observables: |
"time" |
"cosTheta" |
"phi" |
"cosPsi" |
"tag" |
"mistag" |
|
|
RaPDF_Bs2JpsiPhiMassSignal |
Bs mass distribution model PDF |
Description |
This is the factorised mass distribution PDF incorporating two gaussians as per the roadmap model. The gaussians each have a different width, and are specified by a relative fraction. All of these parameters can be floated in the fit |
Parameters: |
"f_sig_m1" |
"sigma_m1" |
"sigma_m2" |
"m_Bs" |
Observables: |
" mass" |
To use just a time+angles PDF in your xml configuration file you only need to specify:
<PDF>
<Name>RaPDF_Bs2JpsiPhi</Name>
</PDF>
To connect the time+angles PDF together with the mass PDF in the xml configuration file you need the following:
<ProdPDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhi</Name>
</PDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhiMassSignal</Name>
</PDF>
</ProdPDF>
J/PsiPhi Background
Long lived Background
For the long lived background component the following sets of background PDFs are available:
RaPDF_Bs2JpsiPhiLongLivedBkg |
J/PsiPhi long lived background time component |
Description |
This is the time component of the long lived background. It has two exponential components and is designed to be exactly as per the roadmap fits. It ignores the decay angles so there will have a flat distribution. |
Parameters: |
"tau_LL1" - first component decay width |
"tau_LL2" - second component decay width |
"f_LL1" - fraction of the first component |
Observables: |
"time" |
|
|
RaPDF_Bs2JpsiPhiMassBkg |
J/PsiPhi long lived background mass component |
Description |
This is the mass PDF for the background consisting of a single shallow exponential |
Parameters: |
"alphaM_pr" - (negative) coefficient of mass in exponential |
Observables: |
"mass" |
To connect the time and mass components together for the long lived background you use the following xml in the configuration file:
<ProdPDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhiLongLivedBkg</Name>
</PDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhiMassBkg</Name>
</PDF>
</ProdPDF>
Prompt background
For the prompt background component the following sets of background PDFs are available.
Note that there is no meaning to this component
without time resolution as the Gaussian shape comes purely from this effect.
RaPDF_Bs2JpsiPhiPromptBkg_withTimeRes |
J/PsiPhi prompt background time component |
Description |
This is the time component of the long lived background. It is a single Gaussian. |
Parameters: |
"sigmaPr" - Gaussian width |
Observables: |
"time" |
|
|
RaPDF_Bs2JpsiPhiMassBkg |
J/PsiPhi prompt background mass component |
Description |
This is the mass PDF for the background consisting of a single shallow exponential |
Parameters: |
"alphaM_pr" - (negative) coefficient of mass in exponential |
Observables: |
"mass" |
To connect the time and mass components together for both the long lived and prompt backgrounds you use the following xml in the configuration file. Note the need to use Normalised
SumPDF. The fraction which appears here is the fraction of prompt background out of all background (this is different to the number appearing in the roadmap which specifies the fraction out of total signal plus background. Note lso that these fractions are different for the tagged and untagged categories since the tag efficiency is different for each PDF.
<NormalisedSumPDF>
<FractionName>LongLivedFraction</FractionName>
<ProdPDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhiLongLivedBkg</Name>
</PDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhiMassBkg</Name>
</PDF>
</ProdPDF>
<ProdPDF>
<PDF>
<Name>Bs2JpsiPhiPromptBkg_withTimeRes</Name>
</PDF>
<PDF>
<Name>RaPDF_Bs2JpsiPhiMassBkg</Name>
</PDF>
</ProdPDF>
</NormalisedSumPDF>
Installing the Boost libraries
The code uses some of the Boost libraries and so you need to install the Boost headers in order for
RapidFit to compile. This is already done for you on the PPE machines.
Examples of outputs
The result of a single toy fit
Looks good
\begin{center}
Fit status: 3
Minimum function value: 415173
\begin{tabular}{|c|c|c|}
\hline
Parameter & Fit result and error & $\sigma$ from input \hline \hline
gamma & 0.681572 \pm 0.0039162 & 0.401491\\
deltaGamma & 0.0574591 \pm 0.0106509 & -0.238563\\
Aperp_sq & 0.163415 \pm 0.00351309 & 0.971969\\
Azero_sq & 0.594878 \pm 0.00273006 & -1.87617\\
delta_para & 2.48406 \pm 0.0170225 & -0.936166\\
delta_perp & -0.191639 \pm 0.0225572 & -0.959274\\
delta_zero & 0 \pm 0 & nan\\
deltaM & 17.8018 \pm 0.0100803 & 0.173641\\
Phi_s & -0.0393056 \pm 0.00580637 & 0.119593\\
\hline
\end{tabular}
\end{center}
Pull plots from multiple toy studies
- Phi_s.png:
- deltaGamma.png:
Validation Testing
The following are a set of results from specific versions of
RapidFit and are intended as reference validations.
Signal only
This validation is on signal only. Fit conditions were:
Condition |
Value |
RapidFit version |
xyz.123 |
Pdf description |
Signal J/PsiPhi with mass included |
Pdf description |
RaPDF_Bs2JpsiPhiNew x RaPDF_Bs2JpsiPhiMassSignal |
tagged events |
65000 |
untagged events |
55000 |
total |
110k |
The xml configuration file was : t.b.d
Here is a single output from one fit:
Parameter & Fit result and error & $\sigma$ from input \\ \hline
$\gambar $ & 0.70036 $\pm$ 0.002613 & 0.14\\
$\dgam $ & 0.083277 $\pm$ 0.0079217 & -0.091\\
$\aperp^2$ & 0.23231 $\pm$ 0.003606 & -0.19\\
$azero^2$ & 0.55734 $\pm$ 0.002538 & 0.53\\
$delta_para$ & -2.9411 $\pm$ 0.061306 & -0.18\\
$delta_perp$ & 2.8579 $\pm$ 0.05754 & -0.91\\
$delta_zero$ & 0 $\pm$ 0 & nan\\
$deltaM$ & 17.77 $\pm$ 0 & nan\\
$Phi_s$ & -0.032297 $\pm$ 0.022041 & 0.2\\
$f_sig_m1$ & 0.74 $\pm$ 0 & nan\\
$sigma_m1$ & 13.2 $\pm$ 0 & nan\\
$sigma_m2$ & 22.5 $\pm$ 0 & nan\\
$m_Bs$ & 5366.4 $\pm$ 0 & nan\\
Here is a summary of results taken from 1000 toy studies:
Key results |
Parameter |
RapidFit Precision |
Gamma |
x |
DeltaGamma |
x |
Aperp |
x |
Azero |
x |
deltaPar |
x |
deltaPerp |
x |
Phi_s |
x |
Signal + Background
This validation is on
signal plus
background . Fit conditions were:
Condition |
Value |
RapidFit version |
xyz.123 |
Pdf description |
Signal J/PsiPhi with mass included + Prompt background + long Lived background |
Pdf description |
see xml |
Fractions |
Fractions of S and B were exactly as taken from the Roadmap note |
tagged events |
166000 |
untagged events |
221000 |
total |
387k |
The xml configuration file was :
*
RaPDFToy_SigBkg_VALIDATION-4.xml: this will be superceded
Here is a single output from one fit:
Parameter & Fit result and error & $\sigma$ from input \\ \hline \hline
gamma & 0.70247 $\pm$ 0.0031237 & 0.79\\
deltaGamma & 0.071063 $\pm$ 0.0094299 & -1.4\\
Aperp\_sq & 0.24041 $\pm$ 0.0049948 & 1.5\\
Azero\_sq & 0.55581 $\pm$ 0.0033243 & -0.058\\
delta\_para & -2.9903 $\pm$ 0.10358 & -0.58\\
delta\_perp & 2.8271 $\pm$ 0.083171 & -1\\
delta\_zero & 0 $\pm$ 0 & nan\\
deltaM & 17.77 $\pm$ 0 & nan\\
Phi\_s & -0.046876 $\pm$ 0.027136 & -0.37\\
tau\_LL1 & 1.114 $\pm$ 0 & nan\\
tau\_LL2 & 0.161 $\pm$ 0 & nan\\
f\_LL1 & 0.22 $\pm$ 0 & nan\\
sigmaPr & 0.044 $\pm$ 0 & nan\\
LongLivedFractionTagged & 0.37 $\pm$ 0 & nan\\
SignalFractionTagged & 0.4 $\pm$ 0 & nan\\
LongLivedFractionUntagged & 0.13 $\pm$ 0 & nan\\
SignalFractionUntagged & 0.23 $\pm$ 0 & nan\\
Here is the comparison to the roadmap document taken from the results of 1000 toy studies:
Key results comparison to roadmap |
Parameter |
Roadmap precision |
RapidFit Precision |
Gamma |
0.0031 |
0.0031 |
DeltaGamma |
0.0091 |
0.0094 |
Aperp |
0.0042 |
0.0046 |
Azero |
0.0031 |
0.0033 |
deltaPar |
0.074 |
0.103 |
deltaPerp |
0.089 |
0.083 |
Phi_s |
0.030 |
0.026 |
sWave
See this talk on the validation of the sWave PDF:
http://indico.cern.ch/getFile.py/access?sessionId=0&resId=0&materialId=1&confId=63533
Blinding
This has been implemented in the code using the proposal given
here . The
XML syntax is like this (using gamma in the 2010 analysis)
<PhysicsParameter>
<Name>gamma</Name>
<BlindString>BsCalvin</BlindString>
<BlindScale>0.4</BlindScale>
<Value>0.45</Value>
<Minimum>0.0</Minimum>
<Maximum>1.5</Maximum>
<Type>Free</Type>
<Unit>ps^{-1}</Unit>
</PhysicsParameter>
For convenience there is a script for converting from
DecayTuple names of columns to the names
RapidFit assumes
here
To use:
Determining the acceptance factors
To determine angular acceptance factors for the signal channel:
- Find some full simulated Monte Carlo
- Modify your XML only to have the signal PDF for the angular/time acceptance (no mass PDF)
- ../bin/fitting -f myXML.xml --calculateAcceptanceWeights
--
GreigCowan - 07 May 2009