Update 'Selection code'
parent
2a8398c2a9
commit
8997566e9c
@ -10,10 +10,10 @@ The selection code is a set of C++ scripts. First, the running of the code is in
|
||||
## Setting up ROOT
|
||||
**TODO**
|
||||
|
||||
In order to make pretty plots, dedicated code in [[Design.cpp|Design.cpp]] is always checked for compilation when starting ROOT. This is done by creating a `.rootrc` file in your home directory and telling ROOT to always compile the Design.cpp:
|
||||
In order to make pretty plots, dedicated code in [[Design.cpp|Design.cpp]] is always checked for compilation when starting ROOT. This is done by creating a `.rootalias.C` file in your home directory and telling ROOT to always compile the Design.cpp:
|
||||
```
|
||||
{
|
||||
gROOT->ProcessLine(".L path/to/your/folder/Design.cpp+");
|
||||
gROOT->ProcessLine(".L path/to/your/folder/Code/Design.cpp+");
|
||||
}
|
||||
```
|
||||
|
||||
@ -55,18 +55,20 @@ There are 5 levels of verbosity: The level of verbosity is defined in [GlobalFun
|
||||
|
||||
|
||||
# Running the code
|
||||
The code consists of several C++ scripts that are compiled and executed in ROOT. Before every step, it is worth closing and opening ROOT, as it is possible ROOT will complain about redefinition of functions.
|
||||
The code consists of several C++ scripts that are compiled and executed in ROOT. **Before every step, it is worth closing and opening ROOT**, as it is possible ROOT will complain about redefinition of functions.
|
||||
|
||||
We used ROOT 6.06.02.
|
||||
|
||||
|
||||
First, compile and run the preselection. It is defined in [[BDTSelection.cpp|BDTSelection]]. This reads the files with **stripped** data and creates new tuples with **preselected** data.
|
||||
```
|
||||
root
|
||||
.L BDTSelection.cpp+
|
||||
runAllSignalData(1); runAllSignalData(2);
|
||||
runAllSignalMC(1); runAllSignalMC(2);
|
||||
runAllRefMC(1); runAllRefMC(2);
|
||||
runAllPHSPMC(1); runAllPHSPMC(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Then, run a python script [[Rescale_pi0momentum.py|Rescale-pi0-momentum]] performing the Kstar MacGyver DTF
|
||||
@ -76,42 +78,54 @@ lb-conda default python Scripts/Rescale_pi0momentum.py
|
||||
|
||||
Next step is to compile and perform the MC Truth-Matching, saved in [[MCtruthmatching.cpp|MCtruthmatching.cpp]]. The Truth-matching procedure is in detail described in [my thesis](http://www.physi.uni-heidelberg.de/Publications/thesis_Kopecna_final.pdf).
|
||||
```
|
||||
root
|
||||
.L MCtruthmatching.cpp+
|
||||
TruthMatchAllAll(1); TruthMatchAllAll(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Then, we need to add the XMuMu mass variable and apply the KplusMuMu veto ([[AddVariable.cpp|AddVariable.cpp]])
|
||||
```
|
||||
root
|
||||
.L AddVariable.cpp+
|
||||
addAllXMuMuMass(true,true,1); addAllXMuMuMass(false,true,1); applyAllVetoKplusMuMuMass(1);
|
||||
addAllXMuMuMass(true,true,2); addAllXMuMuMass(false,true,2); applyAllVetoKplusMuMuMass(2);
|
||||
.q
|
||||
```
|
||||
|
||||
We have all the preselection finished. Now we will need to fit the reconstructed B mass peak. For the instructions how to compile the code and make RooFit use double-sided Crystal Ball or ExpGauss, see [[B mass model section|B-mass-model]].
|
||||
|
||||
Now the peaking background is removed, we can proceed to reweighting via [[nTrackWeights.cpp|nTrackWeights.cpp]]. It takes the **preselected** tuples and create new **weighted** ones, with the tag BDT input.
|
||||
```
|
||||
root
|
||||
.L nTrackWeights.cpp+
|
||||
WeightAll(true,1,true); ReweightReferenceMC(true,1,true); ReweightPHSPMC(true,1,true);
|
||||
WeightAll(true,2,true); ReweightReferenceMC(true,2,true); ReweightPHSPMC(true,2,true);
|
||||
.q
|
||||
```
|
||||
|
||||
Check the MVA variables are agreeing after weighting them with sWeights [[CompareVariables.cpp|CompareVariables.cpp]]. (Yes, there is a [[dedicated tool|Comparison-tool]], but this was intially working, and working well, so it was kept for checking the variables used in the MVA training.) **TODO**
|
||||
```
|
||||
root
|
||||
.L Scripts/compareVariables.cc+
|
||||
compareAll(1); compareAll(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Reweighted Data and Monte Carlo can be used for the [[MVA.cpp|MVA-Class]]
|
||||
```
|
||||
root
|
||||
.L MVA.cpp+
|
||||
RunMVA(1); RunMVA(2);
|
||||
RunMVA(1); RunMVA(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Apply the MVA to all the MC and Data using [[TMVAClassApp.cpp|TMVA Class application]]. This also creates new tuples with the tag BDT output.
|
||||
```
|
||||
root
|
||||
.L TMVAClassApp.cpp+
|
||||
TMVAClassAppAll(1); TMVAClassAppAll(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Remove all multiple candidates, defined in [[RemoveMultipleCandidates.py|RemoveMultipleCandidates.py]]
|
||||
@ -121,20 +135,25 @@ python RemoveMultipleCandidates.py -all
|
||||
|
||||
We have to rerun the weights and therefore also the MVA: the shape of the B mass peak is fixed to the one after MVA.
|
||||
```
|
||||
root
|
||||
.L nTrackWeights.cpp+
|
||||
WeightAll(true,1,true); ReweightReferenceMC(true,1,true); ReweightPHSPMC(true,1,true);
|
||||
WeightAll(true,2,true); ReweightReferenceMC(true,2,true); ReweightPHSPMC(true,2,true);
|
||||
.q
|
||||
```
|
||||
|
||||
Check the variables again
|
||||
```
|
||||
root
|
||||
.L Scripts/compareVariables.cc+
|
||||
compareAll(1); compareAll(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Run the MVA training, [[make nice plots|PlotTMVA.cpp]], apply the MVA and remove multiple candidates
|
||||
|
||||
```
|
||||
root
|
||||
.L MVA.cpp+
|
||||
RunMVA(1); RunMVA(2);
|
||||
|
||||
@ -145,29 +164,36 @@ testFunction(1); testFunction(2)
|
||||
|
||||
.L TMVAClassApp.cpp+
|
||||
TMVAClassAppAll(1); TMVAClassAppAll(2);
|
||||
.q
|
||||
|
||||
python RemoveMultipleCandidates.py -all
|
||||
```
|
||||
|
||||
[[Add variables|AddVariable.cpp]] to the MC samples
|
||||
```
|
||||
root
|
||||
.L AddVariable.cpp+
|
||||
addAllVariablesAllMCSamples(1); addAllVariablesAllMCSamples(2);
|
||||
.q
|
||||
```
|
||||
|
||||
Get the eficiencies needed for the estimation of the best MVA response cut, defined in [[Efficiency.cpp|Efficiency.cpp]]
|
||||
```
|
||||
root
|
||||
.L Efficiency.cpp+
|
||||
runAllEff();
|
||||
.q
|
||||
```
|
||||
|
||||
Scan the significance in the MVA cut using the code in [[BDTcutScanner.cpp|BDTcutScanner.cpp]]. Don't mind the 2012 and 2016 tags, they are just dummies
|
||||
```
|
||||
root
|
||||
.L BDTcutScanner.cpp+
|
||||
ScanSignalAndBckgndEstimation("2012",1,0.01,false,false,false,true)
|
||||
ScanSignalAndBckgndEstimation("2016",2,0.01,false,false,false,true)
|
||||
getMaxBDTresponse("2012",1,true,true,0,false,false)
|
||||
getMaxBDTresponse("2016",2,true,false,0,false,false)
|
||||
.q
|
||||
```
|
||||
|
||||
Make a nice TGraph from the scan; when creating the scan, it can happen that eg an estimation at cut at 0.95 happens before a cut at 0.92. [[This script|ReorganizeTGraph.py]] just takes it and makes a pretty clean plot.
|
||||
@ -177,33 +203,41 @@ python ReorganizeTGraph.py
|
||||
|
||||
Use the MVA scan to plot the signal yields, apply the MVA cut and compare the yields to the CMS results (see [[SignalStudy.cpp|Signal Study]]). It also creates the tuples used by the [[FCNC fitter|FCNC fitter]] tagged as BDT output selection.
|
||||
```
|
||||
root
|
||||
.L SignalStudy.cpp+
|
||||
plotYieldInQ2(true); plotYieldInQ2(false);
|
||||
ApplyCutPerYearAll(1); ApplyCutPerYearAll(2);
|
||||
printYileds(false); printYileds(true)
|
||||
yieldComparison(1,getTMVAcut(1));
|
||||
yieldComparison(2,getTMVAcut(2));
|
||||
.q
|
||||
```
|
||||
|
||||
|
||||
## Checking the inclusive sample
|
||||
```
|
||||
root
|
||||
.L BDTSelection.cpp+
|
||||
runAllIncMC(1); runAllIncMC(2)
|
||||
.q
|
||||
```
|
||||
|
||||
lb-conda default python Rescale_pi0momentum.py (CAREFUL, NEEDS TO BE SET BY HAND)
|
||||
lb-conda default python Rescale_pi0momentum.py (**CAREFUL, NEEDS TO BE SET BY HAND**)
|
||||
|
||||
```
|
||||
root
|
||||
.L MCtruthmatching.cpp+
|
||||
TruthMatchAllBkg(true,1,false,false,true); TruthMatchAllBkg(true,2,false,false,true);
|
||||
.q
|
||||
```
|
||||
|
||||
Then, we need to add the variables to the inclusive sample. This HAS TO BE SET BY HAND in [[AddVariable.cpp|AddVariable.cpp]] before compilation!
|
||||
Then, we need to add the variables to the inclusive sample. **This HAS TO BE SET BY HAND** in [[AddVariable.cpp|AddVariable.cpp]] before compilation!
|
||||
```
|
||||
root
|
||||
.L AddVariable.cpp+
|
||||
addAllXMuMuMass(true,true,1,true,true,false); addAllXMuMuMass(false,true,1,true,true,false); applyAllVetoKplusMuMuMass(1,true,true,false);
|
||||
addAllXMuMuMass(true,true,2,true,true,false); addAllXMuMuMass(false,true,2,true,true,false); applyAllVetoKplusMuMuMass(2,true,true,false);
|
||||
.q
|
||||
```
|
||||
Similarly, before applying the MacGyver DTF, the paths in [[Rescale_pi0momentum.py|Rescale-pi0-momentum]] have to be set by hand!
|
||||
```
|
||||
@ -211,8 +245,10 @@ lb-conda default python Rescale_pi0momentum.py
|
||||
```
|
||||
|
||||
```
|
||||
root
|
||||
.L TMVAClassApp.cpp+
|
||||
TMVAClassAppInc(1); TMVAClassAppInc(2);
|
||||
.q
|
||||
```
|
||||
Also the paths in [[RemoveMultipleCandidates.py|RemoveMultipleCandidates.py]] have to be set by hand!
|
||||
```
|
||||
@ -220,8 +256,10 @@ python RemoveMultipleCandidates.py -all
|
||||
```
|
||||
Lastly, make the truth-matching plots using [[InclusiveCheck.cpp||InclusiveCheck.cpp]].
|
||||
```
|
||||
root
|
||||
.L Scripts/InclusiveCheck.cpp+
|
||||
plotTM(1,true); plotTM(2,true)
|
||||
plotTM(1,false); plotTM(2,false)
|
||||
.q
|
||||
```
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user