Tool_DecayModeDeterminator.cxx 19 KB
Newer Older
1
2
3
4
5
6
7
8
/*
  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/


//! PanTau includes
#include "PanTauAlgs/Tool_DecayModeDeterminator.h"

9
#include "PanTauAlgs/PanTauSeed.h"
10
#include "PanTauAlgs/HelperFunctions.h"
11
12
13
#include "PanTauAlgs/TauClassificationTypes.h"

#include "xAODTau/TauDefs.h"
14
15
16
17



PanTau::Tool_DecayModeDeterminator::Tool_DecayModeDeterminator(
18
19
    const std::string& name ) :
        asg::AsgTool(name),
20
21
22
23
24
25
26
27
28
29
        m_Tool_InformationStore("PanTau::Tool_InformationStore/Tool_InformationStore"),
        m_Tool_ModeDiscriminator_1p0n_vs_1p1n("PanTau::Tool_ModeDiscriminator/Tool_ModeDiscriminator"),
        m_Tool_ModeDiscriminator_1p1n_vs_1pXn("PanTau::Tool_ModeDiscriminator/Tool_ModeDiscriminator"),
        m_Tool_ModeDiscriminator_3p0n_vs_3pXn("PanTau::Tool_ModeDiscriminator/Tool_ModeDiscriminator")
        {

    declareProperty("Tool_InformationStore",          m_Tool_InformationStore,          "Tool handle to the information store tool");
    declareProperty("Tool_ModeDiscriminator_1p0n_vs_1p1n",    m_Tool_ModeDiscriminator_1p0n_vs_1p1n,    "Handle to the ModeDiscriminator tool for 1p0n_vs_1p1n");
    declareProperty("Tool_ModeDiscriminator_1p1n_vs_1pXn",    m_Tool_ModeDiscriminator_1p1n_vs_1pXn,    "Handle to the ModeDiscriminator tool for 1p1n_vs_1pXn");
    declareProperty("Tool_ModeDiscriminator_3p0n_vs_3pXn",    m_Tool_ModeDiscriminator_3p0n_vs_3pXn,    "Handle to the ModeDiscriminator tool for 3p0n_vs_3pXn");
30
31
32
33
34
35

    declareProperty("Tool_InformationStoreName",          m_Tool_InformationStoreName="",          "Tool handle to the information store tool");
    declareProperty("Tool_ModeDiscriminator_1p0n_vs_1p1nName",    m_Tool_ModeDiscriminator_1p0n_vs_1p1nName="",    "Handle to the ModeDiscriminator tool for 1p0n_vs_1p1n");
    declareProperty("Tool_ModeDiscriminator_1p1n_vs_1pXnName",    m_Tool_ModeDiscriminator_1p1n_vs_1pXnName="",    "Handle to the ModeDiscriminator tool for 1p1n_vs_1pXn");
    declareProperty("Tool_ModeDiscriminator_3p0n_vs_3pXnName",    m_Tool_ModeDiscriminator_3p0n_vs_3pXnName="",    "Handle to the ModeDiscriminator tool for 3p0n_vs_3pXn");

36
37
38
39
40
41
42
43
44
45
46
}



PanTau::Tool_DecayModeDeterminator::~Tool_DecayModeDeterminator() {
}



StatusCode PanTau::Tool_DecayModeDeterminator::initialize() {
    ATH_MSG_INFO( name() << " initialize()" );
47
48
49
50
51
52
53
    m_init=true;

    ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_InformationStore, m_Tool_InformationStoreName) );
    ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_ModeDiscriminator_1p0n_vs_1p1n, m_Tool_ModeDiscriminator_1p0n_vs_1p1nName) );
    ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_ModeDiscriminator_1p1n_vs_1pXn, m_Tool_ModeDiscriminator_1p1n_vs_1pXnName) );
    ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_ModeDiscriminator_3p0n_vs_3pXn, m_Tool_ModeDiscriminator_3p0n_vs_3pXnName) );

54
    //get the discri tools
55
56
57
    ATH_CHECK(m_Tool_ModeDiscriminator_1p0n_vs_1p1n.retrieve());
    ATH_CHECK(m_Tool_ModeDiscriminator_1p1n_vs_1pXn.retrieve());
    ATH_CHECK(m_Tool_ModeDiscriminator_3p0n_vs_3pXn.retrieve());
58
59
    
    //get the variable prefix
60
61
    ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Basic",        m_varTypeName_Prefix_Basic) );

62
    //get the BDT cut values
63
64
65
66
67
68
69
    ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R10X_CellBased",        m_BDTCutValue_R10X_CellBased) );
    ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R11X_CellBased",        m_BDTCutValue_R11X_CellBased) );
    ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R110_CellBased",        m_BDTCutValue_R110_CellBased) );
    ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R1XX_CellBased",        m_BDTCutValue_R1XX_CellBased) );
    ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R30X_CellBased",        m_BDTCutValue_R30X_CellBased) );
    ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R3XX_CellBased",        m_BDTCutValue_R3XX_CellBased) );

70
71
72
73
74
75
76
77
78
79
80
81
82
83
    return StatusCode::SUCCESS;
}



// StatusCode PanTau::Tool_DecayModeDeterminator::finalize() {
//     StatusCode sc = AlgTool::finalize();
//     return sc;
// }





84
StatusCode PanTau::Tool_DecayModeDeterminator::execute(PanTau::PanTauSeed2* inSeed) {
85
86
    
    
87
    ATH_MSG_DEBUG("determine DecayMode for inSeed at " << inSeed);
88
    std::string         inAlgName   = inSeed->getNameInputAlgorithm();
89
    PanTau::TauFeature2* features    = inSeed->getFeatures();
90
91
92
    
    
    //check for invalid input seed
93
94
95
    bool    noValidInput        = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed2::t_NoValidInputTau);
    bool    noAnyConstituents   = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed2::t_NoConstituentsAtAll);
    bool    noSelConstituents   = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed2::t_NoSelectedConstituents);
96
97
    bool    badPt               = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed2::t_BadPtValue);
    bool    invalidForDecayMode = (noValidInput || noAnyConstituents || noSelConstituents || badPt);
98
    if(invalidForDecayMode) {
99
        ATH_MSG_DEBUG("Seed has no constituents assigned and/or input seed has no substructure info - use NotSet mode for this");
100
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_RecoMode_PanTau", xAOD::TauJetParameters::Mode_NotSet);
101
102
103
104
105
106
        return StatusCode::SUCCESS;
    }
    
    
    //get the mode as it was determined by the subalgorithm
    int decayMode_SubAlg = inSeed->getDecayModeBySubAlg();
107
    int decayMode_PanTau = xAOD::TauJetParameters::Mode_NotSet;
108
109
    
    //and calc the number of additional neutrals, not tagged as pi0
110
111
112
    int nCharged_SubAlg     = inSeed->getNumberOfConstituentsOfType(PanTau::TauConstituent2::t_Charged);
    int nPi0Neut_SubAlg     = inSeed->getNumberOfConstituentsOfType(PanTau::TauConstituent2::t_Pi0Neut);
    int nNeutrals_SubAlg    = inSeed->getNumberOfConstituentsOfType(PanTau::TauConstituent2::t_Neutral);
113
114
115
116
117
118
119
120
121
    int AdditionalNeutrals = nNeutrals_SubAlg - nPi0Neut_SubAlg;
    
    double BDTCutValue_R10X = 0.;
    double BDTCutValue_R110 = 0.;
    double BDTCutValue_R11X = 0.;
    double BDTCutValue_R1XX = 0.;
    double BDTCutValue_R30X = 0.;
    double BDTCutValue_R3XX = 0.;
    
122
123
124
125
126
127
    BDTCutValue_R10X = m_BDTCutValue_R10X_CellBased;
    BDTCutValue_R110 = m_BDTCutValue_R110_CellBased;
    BDTCutValue_R11X = m_BDTCutValue_R11X_CellBased;
    BDTCutValue_R1XX = m_BDTCutValue_R1XX_CellBased;
    BDTCutValue_R30X = m_BDTCutValue_R30X_CellBased;
    BDTCutValue_R3XX = m_BDTCutValue_R3XX_CellBased;
128
129
    
    //based on the subAlg decay mode, pass to corresponding PanTau BDT...
130
    ATH_MSG_DEBUG("The subalg mode is set by nChrg/nPi0Neut/nAddNeut = " << nCharged_SubAlg << " / " << nPi0Neut_SubAlg << " / " << AdditionalNeutrals << " to " << decayMode_SubAlg << " - " << PanTau::PanTauSeed2::getDecayModeName(decayMode_SubAlg));
131
132
133
134
    
    double          bdtResponse = -5;
    DecayModeTest   bdtTest     = t_UnknownTest;
    // 1p0n mode
135
    if(decayMode_SubAlg == xAOD::TauJetParameters::Mode_1p0n) {
136
137
138
139
140
        
        
        //1 prong, and no other objects at all -> use 1p0n
        if(AdditionalNeutrals == 0) {
            ATH_MSG_DEBUG("Set 1p0n because there is only one object");
141
            decayMode_PanTau = xAOD::TauJetParameters::Mode_1p0n;
142
            bdtResponse = -3.;
143
144
145
            
        //if there are neutrals which are not pi0-tagged, check BDT to maybe set 1p1n
        } else {
146
147
148
149
150
151
152
153
154
	  /*
	  // simplify this code to:
	  bdtTest     = t_1p0n_vs_1p1n;
	  ATH_MSG_DEBUG("Entering bdtTest " << bdtTest);
	  decayMode_PanTau=GetPanTauDecayMode(inSeed, m_Tool_ModeDiscriminator_1p0n_vs_1p1n, BDTCutValue_R10X, bdtResponse);

	  int GetPanTauDecayMode(PanTauSeed2* inSeed, ToolHandle<PanTau::ITool_ModeDiscriminator> tool_ModeDiscriminator, int decayMode_SubAlg, double BDTCutValue, double &bdtResponse){
	  */

155
156
157
158
            bool    isOK        = false;
            bdtResponse = m_Tool_ModeDiscriminator_1p0n_vs_1p1n->getResponse(inSeed, isOK);
            bdtTest     = t_1p0n_vs_1p1n;
            if(isOK == false) {
159
                ATH_MSG_WARNING("WARNING: problems getting bdt response for 1p0n + X-neutrals. use subAlg mode");
160
161
                decayMode_PanTau = decayMode_SubAlg;
            } else {
162
163
164
                if(bdtResponse >  BDTCutValue_R10X) decayMode_PanTau = xAOD::TauJetParameters::Mode_1p0n;
                if(bdtResponse <= BDTCutValue_R10X) decayMode_PanTau = xAOD::TauJetParameters::Mode_1p1n;
                ATH_MSG_DEBUG("R10X: Response is: " << bdtResponse << "  Use 1p0n if > " << BDTCutValue_R10X << " -- decision: " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau) );
165
166
167
            }
        }
        
168
        ATH_MSG_DEBUG("SubAlgMode " << decayMode_SubAlg << ". Chrg/Neut: " << nCharged_SubAlg << " / " << nPi0Neut_SubAlg << ". Mode set to: " << decayMode_PanTau << " - " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau));
169
170
171
172
173
174
        
    }//end 1p0n
    
    
    
    //1p1n mode
175
    else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_1p1n) {
176
177
178
179
180
181
182
183
        
        
        //1prong, 1pi0 and no other neutrals. check 1p0n-vs-1p1n
        if(AdditionalNeutrals == 0) {
            bool    isOK        = false;
            bdtResponse = m_Tool_ModeDiscriminator_1p0n_vs_1p1n->getResponse(inSeed, isOK);
            bdtTest     = t_1p0n_vs_1p1n;
            if(isOK == false) {
184
                ATH_MSG_WARNING("WARNING problems getting bdt response for 1p1n + 0-neutrals. use subAlg mode");
185
186
                decayMode_PanTau = decayMode_SubAlg;
            } else {
187
188
189
                if(bdtResponse <= BDTCutValue_R110) decayMode_PanTau = xAOD::TauJetParameters::Mode_1p1n;
                if(bdtResponse >  BDTCutValue_R110) decayMode_PanTau = xAOD::TauJetParameters::Mode_1p0n;
                ATH_MSG_DEBUG("R110: Response is: " << bdtResponse << "  Use 1p0n if > " << BDTCutValue_R110 << " -- decision: " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau) );
190
191
192
193
194
195
196
197
198
199
            }
        
        
        //1prong, 1pi0 and additional neutrals. check 1p1n vs 1pXn
        } else {
            //NOTE: May investigate chain of decisions here: first check 1p0n-1p1n, and then (in case of 1p1n) 1p1n-1pXn
            bool    isOK        = false;
            bdtResponse = m_Tool_ModeDiscriminator_1p1n_vs_1pXn->getResponse(inSeed, isOK);
            bdtTest     = t_1p1n_vs_1pXn;
            if(isOK == false) {
200
                ATH_MSG_WARNING("WARNING problems getting bdt response for 1p1n + X-neutrals. use subAlg mode");
201
202
                decayMode_PanTau = decayMode_SubAlg;
            } else {
203
204
205
                if(bdtResponse >  BDTCutValue_R11X) decayMode_PanTau = xAOD::TauJetParameters::Mode_1p1n;
                if(bdtResponse <= BDTCutValue_R11X) decayMode_PanTau = xAOD::TauJetParameters::Mode_1pXn;
                ATH_MSG_DEBUG("R11X: Response is: " << bdtResponse << "  Use 1p1n if > " << BDTCutValue_R11X << " -- decision: " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau) );
206
207
208
            }
        }
        
209
        ATH_MSG_DEBUG("SubAlgMode " << decayMode_SubAlg << ". Chrg/Neut: " << nCharged_SubAlg << " / " << nPi0Neut_SubAlg << ". Mode set to: " << decayMode_PanTau << " - " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau));
210
211
212
213
214
    }//end 1p1n
    
    
    
    //1pXn mode
215
    else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_1pXn) {
216
217
218
219
220
221
        
        //1prong, Xpi0. check 1p1n-vs-1pXn
        bool    isOK        = false;
        bdtResponse = m_Tool_ModeDiscriminator_1p1n_vs_1pXn->getResponse(inSeed, isOK);
        bdtTest     = t_1p1n_vs_1pXn;
        if(isOK == false) {
222
            ATH_MSG_WARNING("WARNING problems getting bdt response for 1p1n + X-neutrals. use subAlg mode");
223
224
            decayMode_PanTau = decayMode_SubAlg;
        } else {
225
226
227
            if(bdtResponse >  BDTCutValue_R1XX) decayMode_PanTau = xAOD::TauJetParameters::Mode_1p1n;
            if(bdtResponse <= BDTCutValue_R1XX) decayMode_PanTau = xAOD::TauJetParameters::Mode_1pXn;
            ATH_MSG_DEBUG("R1XX: Response is: " << bdtResponse << "  Use 1p1n if > " << BDTCutValue_R1XX << " -- decision: " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau) );
228
229
        }
        
230
        ATH_MSG_DEBUG("SubAlgMode " << decayMode_SubAlg << ". Chrg/Neut: " << nCharged_SubAlg << " / " << nPi0Neut_SubAlg << ". Mode set to: " << decayMode_PanTau << " - " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau));
231
232
233
234
235
    }//end 1pXn
    
    
    
    //3p0n mode
236
    else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_3p0n) {
237
238
239
240
        
        //no additional neutrals. 
        if(AdditionalNeutrals == 0) {
            ATH_MSG_DEBUG("Set 3p0n because there are only charged objects");
241
            decayMode_PanTau = xAOD::TauJetParameters::Mode_3p0n;
242
            bdtResponse = -2.5;
243
244
245
246
247
248
249
250
            
        //additional neutrals
        } else {
            
            bool    isOK        = false;
            bdtResponse = m_Tool_ModeDiscriminator_3p0n_vs_3pXn->getResponse(inSeed, isOK);
            bdtTest     = t_3p0n_vs_3pXn;
            if(isOK == false) {
251
                ATH_MSG_WARNING("WARNING problems getting bdt response for 3p0n + X-neutrals. use subAlg mode");
252
253
                decayMode_PanTau = decayMode_SubAlg;
            } else {
254
255
256
                if(bdtResponse >  BDTCutValue_R30X) decayMode_PanTau = xAOD::TauJetParameters::Mode_3p0n;
                if(bdtResponse <= BDTCutValue_R30X) decayMode_PanTau = xAOD::TauJetParameters::Mode_3pXn;
                ATH_MSG_DEBUG("R30X: Response is: " << bdtResponse << "  Use 3p0n if > " << BDTCutValue_R30X << " -- decision: " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau) );
257
258
259
260
            }
            
        }
        
261
        ATH_MSG_DEBUG("SubAlgMode " << decayMode_SubAlg << ". Chrg/Neut: " << nCharged_SubAlg << " / " << nPi0Neut_SubAlg << ". Mode set to: " << decayMode_PanTau << " - " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau));
262
263
264
265
266
    }//end 3p0n
    
    
    
    //3pXn mode
267
    else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_3pXn) {
268
269
270
271
272
273
        
        //3prong, Xpi0. check 3p0n-vs-3pXn
        bool    isOK        = false;
        bdtResponse = m_Tool_ModeDiscriminator_3p0n_vs_3pXn->getResponse(inSeed, isOK);
        bdtTest     = t_3p0n_vs_3pXn;
        if(isOK == false) {
274
            ATH_MSG_WARNING("WARNING problems getting bdt response for 3p0n + X-neutrals. use subAlg mode");
275
276
            decayMode_PanTau = decayMode_SubAlg;
        } else {
277
278
279
            if(bdtResponse >  BDTCutValue_R3XX) decayMode_PanTau = xAOD::TauJetParameters::Mode_3p0n;
            if(bdtResponse <= BDTCutValue_R3XX) decayMode_PanTau = xAOD::TauJetParameters::Mode_3pXn;
            ATH_MSG_DEBUG("R3XX: Response is: " << bdtResponse << "  Use 3p0n if > " << BDTCutValue_R3XX << " -- decision: " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau) );
280
281
        }
        
282
        ATH_MSG_DEBUG("SubAlgMode " << decayMode_SubAlg << ". Chrg/Neut: " << nCharged_SubAlg << " / " << nPi0Neut_SubAlg << ". Mode set to: " << decayMode_PanTau << " - " << PanTau::PanTauSeed2::getDecayModeName(decayMode_PanTau));
283
284
285
286
287
288
289
    } //end 3pXn
    
    
    
    //it's none of 1p0n, 1p1n, 1pXn, 3p0n, 3pXn -> set other mode
    else {
        ATH_MSG_DEBUG("WARNING SubAlg mode of tau is not known. set the 'other' mode");
290
        decayMode_PanTau = xAOD::TauJetParameters::Mode_Other;
291
        bdtResponse = -4;
292
293
294
        bdtTest     = t_UnknownTest;
    }

295
    if(inAlgName != "CellBased") {
296
297
298
299
300
301
        ATH_MSG_WARNING("Name of input algorithm not known - use mode from sub alg!");
        decayMode_PanTau = decayMode_SubAlg;
        bdtResponse = -5;
        bdtTest     = t_UnknownTest;
    }
    
302
    // this overrides Pantau BDT 1p1n decision in the following case:
303
    // if cell based counted 1 charged, 1 pi0neut, and number of hits in EM1 for the pi0neut is 3 or larger, set 1pXn;
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
    if(nCharged_SubAlg == 1 && nPi0Neut_SubAlg == 1) {
        ATH_MSG_DEBUG("CellBased decay mode 1p1n and a single neutral cluster - check for number of photons in cluster: if >2 then set decay mode 1pXn");
        //check for shots in EM1
        bool isOK = false;
        PanTau::TauConstituent2* pi0Neut = inSeed->getConstituentsOfType(PanTau::TauConstituent2::t_Pi0Neut, isOK).at(0);
        if(isOK == true) {
            double nPhotons = 0;
            std::vector<PanTau::TauConstituent2*> shots = pi0Neut->getShots();
            ATH_MSG_DEBUG("There are " << shots.size() << " shots in the pi0 Neutral");
            for(unsigned int iShot=0; iShot<shots.size(); iShot++) {
                nPhotons = nPhotons + (double)(shots.at(iShot)->getNPhotonsInShot());
            }
            ATH_MSG_DEBUG("Counted " << nPhotons << " photons in the pi0 neutral");
            if(nPhotons > 2) {
                decayMode_SubAlg = xAOD::TauJetParameters::Mode_1pXn;
                decayMode_PanTau = xAOD::TauJetParameters::Mode_1pXn;
                inSeed->setModeHackedByCellBased(true);
                bdtResponse = -2.;
322
            }
323
324
325
326
327
328
            
        //end check for pi0 neutrals were found
        } else {
            ATH_MSG_WARNING("Could not find expected CellBased neutral -> don't check for photons in cluster");
        }
    } //end hack check for 1p1n
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
    
    //update mode of seed and store in features
    ATH_MSG_DEBUG("Storing decay mode in tau and features: SubAlg/PanTau = " << (double)decayMode_SubAlg << " / " << (double)decayMode_PanTau);
    inSeed->setDecayModeByPanTau(decayMode_PanTau);
    features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_RecoMode", (double)decayMode_SubAlg);
    features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_RecoMode_PanTau", (double)decayMode_PanTau);
    
    if(bdtTest == t_1p0n_vs_1p1n) {
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", bdtResponse);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", -5.);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", -5.);
    }
    if(bdtTest == t_1p1n_vs_1pXn) {
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", -5.);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", bdtResponse);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", -5.);
    }
    if(bdtTest == t_3p0n_vs_3pXn) {
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", -5.);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", -5.);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", bdtResponse);
    }
    if(bdtTest == t_UnknownTest) {
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", -5.);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", -5.);
        features->addFeature(inAlgName + "_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", -5.);
    }
356

357
358
359
360
361
362
363
364
365
366
    return StatusCode::SUCCESS;
    
}