Skip to content

Commit c3eca60

Browse files
committed
Check for existence of xml node before reading it
This avoids breaking the reading of pre-existing TMVA weight files that have been written without this tag. Add a regression test with a weights file that does not yet contain this tag.
1 parent 9e0dad8 commit c3eca60

File tree

3 files changed

+235
-5
lines changed

3 files changed

+235
-5
lines changed

tmva/tmva/src/VariableNormalizeTransform.cxx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -377,13 +377,17 @@ void TMVA::VariableNormalizeTransform::AttachXMLTo(void* parent)
377377

378378
void TMVA::VariableNormalizeTransform::ReadFromXML( void* trfnode )
379379
{
380-
TString UseOffsetOrNot;
380+
fNoOffset = kFALSE;
381+
if (gTools().HasAttr(trfnode, "UseOffsetOrNot")) {
382+
TString UseOffsetOrNot;
381383

382-
gTools().ReadAttr(trfnode, "UseOffsetOrNot", UseOffsetOrNot );
383-
384-
if (UseOffsetOrNot == "NoOffset") fNoOffset = kTRUE;
385-
else fNoOffset = kFALSE;
384+
gTools().ReadAttr(trfnode, "UseOffsetOrNot", UseOffsetOrNot);
386385

386+
if (UseOffsetOrNot == "NoOffset")
387+
fNoOffset = kTRUE;
388+
else
389+
fNoOffset = kFALSE;
390+
}
387391
Bool_t newFormat = kFALSE;
388392

389393
void* inpnode = NULL;

tmva/tmva/test/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ ROOT_ADD_GTEST(TestOptimizeConfigParameters
1717
TestOptimizeConfigParameters.cxx
1818
LIBRARIES TMVA)
1919

20+
ROOT_ADD_GTEST(TestUseOffsetOrNotReadingRegression
21+
TestUseOffsetOrNotReadingRegression.cxx
22+
LIBRARIES TMVA)
23+
2024
if(dataframe)
2125
# RTensor
2226
ROOT_ADD_GTEST(rtensor rtensor.cxx LIBRARIES ROOTVecOps TMVA)
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
#include "TMVA/Reader.h"
2+
3+
#include <gtest/gtest.h>
4+
5+
#include <iostream>
6+
7+
constexpr auto methodString = R"(
8+
<?xml version="1.0"?>
9+
<MethodSetup Method="MLP::MLP">
10+
<GeneralInfo>
11+
<Info name="TMVA Release" value="4.1.0 [262400]"/>
12+
<Info name="ROOT Release" value="5.28/00 [334848]"/>
13+
<Info name="Creator" value="tianjp"/>
14+
<Info name="Date" value="Mon Jul 6 21:53:20 2015"/>
15+
<Info name="Host" value="Linux cw104.cc.kek.jp 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux"/>
16+
<Info name="Dir" value="/gpfs/fs01/ilc/tianjp/analysis/PostDBD/IsolatedLeptonTagging/training/macros_e1e1h_gg_qqqq_250"/>
17+
<Info name="Training events" value="182321"/>
18+
<Info name="TrainingTime" value="801.579"/>
19+
<Info name="AnalysisType" value="Classification"/>
20+
</GeneralInfo>
21+
<Options>
22+
<Option name="NCycles" modified="Yes">500</Option>
23+
<Option name="HiddenLayers" modified="Yes">N+5</Option>
24+
<Option name="NeuronType" modified="Yes">tanh</Option>
25+
<Option name="RandomSeed" modified="No">1</Option>
26+
<Option name="EstimatorType" modified="No">MSE</Option>
27+
<Option name="NeuronInputType" modified="No">sum</Option>
28+
<Option name="V" modified="Yes">False</Option>
29+
<Option name="VerbosityLevel" modified="No">Default</Option>
30+
<Option name="VarTransform" modified="Yes">N</Option>
31+
<Option name="H" modified="Yes">True</Option>
32+
<Option name="CreateMVAPdfs" modified="No">False</Option>
33+
<Option name="IgnoreNegWeightsInTraining" modified="No">False</Option>
34+
<Option name="TrainingMethod" modified="No">BP</Option>
35+
<Option name="LearningRate" modified="No">2.000000e-02</Option>
36+
<Option name="DecayRate" modified="No">1.000000e-02</Option>
37+
<Option name="TestRate" modified="Yes">10</Option>
38+
<Option name="EpochMonitoring" modified="Yes">True</Option>
39+
<Option name="Sampling" modified="No">1.000000e+00</Option>
40+
<Option name="SamplingEpoch" modified="No">1.000000e+00</Option>
41+
<Option name="SamplingImportance" modified="No">1.000000e+00</Option>
42+
<Option name="SamplingTraining" modified="No">True</Option>
43+
<Option name="SamplingTesting" modified="No">False</Option>
44+
<Option name="ResetStep" modified="No">50</Option>
45+
<Option name="Tau" modified="No">3.000000e+00</Option>
46+
<Option name="BPMode" modified="No">sequential</Option>
47+
<Option name="BatchSize" modified="No">-1</Option>
48+
<Option name="ConvergenceImprove" modified="No">1.000000e-30</Option>
49+
<Option name="ConvergenceTests" modified="No">-1</Option>
50+
<Option name="UseRegulator" modified="No">False</Option>
51+
<Option name="UpdateLimit" modified="No">10</Option>
52+
<Option name="CalculateErrors" modified="No">False</Option>
53+
</Options>
54+
<Variables NVar="9">
55+
<Variable VarIndex="0" Expression="coneec" Label="coneec" Title="coneec" Unit="" Internal="coneec" Type="c" Min="0" Max="106.682"/>
56+
<Variable VarIndex="1" Expression="coneen" Label="coneen" Title="coneen" Unit="" Internal="coneen" Type="c" Min="0" Max="115.829"/>
57+
<Variable VarIndex="2" Expression="momentum" Label="momentum" Title="momentum" Unit="" Internal="momentum" Type="m" Min="5.00001" Max="91.6776"/>
58+
<Variable VarIndex="3" Expression="coslarcon" Label="coslarcon" Title="coslarcon" Unit="" Internal="coslarcon" Type="c" Min="0.950006" Max="1"/>
59+
<Variable VarIndex="4" Expression="energyratio" Label="energyratio" Title="energyratio" Unit="" Internal="energyratio" Type="e" Min="0.0410161" Max="1"/>
60+
<Variable VarIndex="5" Expression="ratioecal" Label="ratioecal" Title="ratioecal" Unit="" Internal="ratioecal" Type="r" Min="0.9" Max="1"/>
61+
<Variable VarIndex="6" Expression="ratiototcal" Label="ratiototcal" Title="ratiototcal" Unit="" Internal="ratiototcal" Type="r" Min="0.500015" Max="1.29995"/>
62+
<Variable VarIndex="7" Expression="nsigd0" Label="nsigd0" Title="nsigd0" Unit="" Internal="nsigd0" Type="n" Min="-49.9731" Max="49.9946"/>
63+
<Variable VarIndex="8" Expression="nsigz0" Label="nsigz0" Title="nsigz0" Unit="" Internal="nsigz0" Type="n" Min="-4.99833" Max="4.99963"/>
64+
</Variables>
65+
<Spectators NSpec="0"/>
66+
<Transformations NTransformations="1">
67+
<Transform Name="Normalize" NVariables="9" NTargets="0">
68+
<Class ClassIndex="0">
69+
<Variables>
70+
<Variable VarIndex="0" Min="0.0000000000000000e+00" Max="6.9274139404296875e+01"/>
71+
<Variable VarIndex="1" Min="0.0000000000000000e+00" Max="7.7186988830566406e+01"/>
72+
<Variable VarIndex="2" Min="5.0062704086303711e+00" Max="9.1677558898925781e+01"/>
73+
<Variable VarIndex="3" Min="9.5000582933425903e-01" Max="1.0000000000000000e+00"/>
74+
<Variable VarIndex="4" Min="4.8792138695716858e-02" Max="1.0000000000000000e+00"/>
75+
<Variable VarIndex="5" Min="9.0177327394485474e-01" Max="1.0000000000000000e+00"/>
76+
<Variable VarIndex="6" Min="5.0208520889282227e-01" Max="1.2992891073226929e+00"/>
77+
<Variable VarIndex="7" Min="-4.9855728149414062e+01" Max="4.9925727844238281e+01"/>
78+
<Variable VarIndex="8" Min="-4.8339676856994629e+00" Max="4.9416265487670898e+00"/>
79+
</Variables>
80+
<Targets/>
81+
</Class>
82+
<Class ClassIndex="1">
83+
<Variables>
84+
<Variable VarIndex="0" Min="0.0000000000000000e+00" Max="1.0668167877197266e+02"/>
85+
<Variable VarIndex="1" Min="0.0000000000000000e+00" Max="1.1582881164550781e+02"/>
86+
<Variable VarIndex="2" Min="5.0000071525573730e+00" Max="8.7144081115722656e+01"/>
87+
<Variable VarIndex="3" Min="9.5031201839447021e-01" Max="1.0000000000000000e+00"/>
88+
<Variable VarIndex="4" Min="4.1016053408384323e-02" Max="1.0000000000000000e+00"/>
89+
<Variable VarIndex="5" Min="9.0000003576278687e-01" Max="1.0000000000000000e+00"/>
90+
<Variable VarIndex="6" Min="5.0001466274261475e-01" Max="1.2999539375305176e+00"/>
91+
<Variable VarIndex="7" Min="-4.9973102569580078e+01" Max="4.9994590759277344e+01"/>
92+
<Variable VarIndex="8" Min="-4.9983320236206055e+00" Max="4.9996280670166016e+00"/>
93+
</Variables>
94+
<Targets/>
95+
</Class>
96+
<Class ClassIndex="2">
97+
<Variables>
98+
<Variable VarIndex="0" Min="0.0000000000000000e+00" Max="1.0668167877197266e+02"/>
99+
<Variable VarIndex="1" Min="0.0000000000000000e+00" Max="1.1582881164550781e+02"/>
100+
<Variable VarIndex="2" Min="5.0000071525573730e+00" Max="9.1677558898925781e+01"/>
101+
<Variable VarIndex="3" Min="9.5000582933425903e-01" Max="1.0000000000000000e+00"/>
102+
<Variable VarIndex="4" Min="4.1016053408384323e-02" Max="1.0000000000000000e+00"/>
103+
<Variable VarIndex="5" Min="9.0000003576278687e-01" Max="1.0000000000000000e+00"/>
104+
<Variable VarIndex="6" Min="5.0001466274261475e-01" Max="1.2999539375305176e+00"/>
105+
<Variable VarIndex="7" Min="-4.9973102569580078e+01" Max="4.9994590759277344e+01"/>
106+
<Variable VarIndex="8" Min="-4.9983320236206055e+00" Max="4.9996280670166016e+00"/>
107+
</Variables>
108+
<Targets/>
109+
</Class>
110+
</Transform>
111+
</Transformations>
112+
<MVAPdfs/>
113+
<Weights>
114+
<Layout NLayers="3">
115+
<Layer Index="0" NNeurons="10">
116+
<Neuron NSynapses="14">
117+
7.2211987450405757e-01 2.4919653039859249e+00 1.3569862383030229e+00 4.2065367866214148e-02 -1.9271628356502275e+00 -1.1405745802043241e+00 -1.1413246267097445e+00 3.2630530566686000e-01 -5.6983114288315073e-01 4.4474245965062725e-01 -1.6334240010343701e+00 -8.4507998536895557e-01 -1.5414148728694572e+00 2.3620545594532936e+00
118+
</Neuron>
119+
<Neuron NSynapses="14">
120+
-1.6575654498562458e+00 -1.3122948283385854e+00 1.9627573290577752e-01 2.1737799174449628e+00 -9.0578961461805629e-01 1.9258924248246687e+00 -1.3951230297023887e+00 -3.2502774837317455e-01 1.5475512304544354e+00 -1.8490381459988794e-01 -1.5672975226934840e+00 -6.0685032652367976e-01 5.9558644148858675e-01 -1.1009139553244240e+00
121+
</Neuron>
122+
<Neuron NSynapses="14">
123+
-3.4188307254959098e+00 -2.7575858314151902e+00 4.5966166548861698e-01 2.3294278177286931e+00 5.4541036503066531e-01 -1.8080042193959227e+00 -2.1227141463839613e-01 -3.0543880109772465e+00 9.1605640015888257e-01 1.3789241982571276e+00 -1.5717925718526158e+00 1.3754240454239963e+00 3.9374114310304509e+00 -1.7738171007000065e+00
124+
</Neuron>
125+
<Neuron NSynapses="14">
126+
-1.5968693403844750e-01 1.1145951553045108e+00 -1.4159003834085657e+00 6.0297145584196056e-02 1.3878455542715133e+00 1.1419499207152726e+00 1.6507363747990624e+00 1.4241292266979935e+00 4.3941464907216776e-01 1.0092870995233869e+00 -1.0347391687230838e+00 9.5825997318322087e-01 -1.1137302702468004e+00 -3.8053149432000538e-01
127+
</Neuron>
128+
<Neuron NSynapses="14">
129+
-1.3811066391765725e+00 -1.0269703129468069e+00 8.9846642582134439e-01 2.2218697836708325e+00 -1.5266537383204533e+00 2.8961822618272919e+00 -1.6315566808179788e-01 3.3473095884137960e-01 2.5836423437977603e+00 -4.6491624787119384e-01 -2.1476174570634607e-01 -8.0282518413909251e-02 7.0471686178358639e-01 -2.6742452194283319e+00
130+
</Neuron>
131+
<Neuron NSynapses="14">
132+
-1.2106948783778220e+00 -1.4506896596639407e+00 2.6193927929434069e-01 1.1830554386743977e+00 -8.0956619570406740e-01 -3.6489365948718511e-01 -7.8864804111718767e-01 -1.3139709769522938e+00 2.3910957407361660e-01 -8.4606225345855335e-01 1.3894627946236020e+00 8.2091452957469746e-01 1.0220840655263141e+00 -1.3488425576354810e+00
133+
</Neuron>
134+
<Neuron NSynapses="14">
135+
-1.0794167389105749e+00 -8.3184491375656222e-01 6.0617346665919569e-01 -2.2799473592738509e-01 -6.3285446800925849e-01 -2.5666328823913759e-01 5.8195566341021174e-02 -4.0331231853650723e-01 -2.9309063015359790e-02 -5.1293420267422585e-01 -6.4850025095157293e-01 1.0476187945251085e+00 5.3517332347439095e-01 -4.4432892891189618e-01
136+
</Neuron>
137+
<Neuron NSynapses="14">
138+
-7.9009317668969889e-02 -6.8009231355905098e-01 -1.5469989590353250e+00 -3.1154256505354971e-01 6.3494543476336851e-01 3.5305148148059018e-01 -9.3316483412409157e-01 3.5115382304814879e-01 -1.1308456476053141e+00 2.0732719780857942e-01 -4.3111482323736690e-02 4.4833590440688398e-01 -1.1594531256662099e+00 5.3719332359605654e-01
139+
</Neuron>
140+
<Neuron NSynapses="14">
141+
1.1472352164802804e+00 3.7789223209064349e-01 -3.2852491864110289e-01 1.5798173079015827e+00 1.6826917554858048e-01 1.8001410524567910e-01 7.0644662311944506e-01 3.2590394334824142e-02 -8.7952957871731338e-02 7.1632808587872826e-02 -2.4871170475433782e-01 1.1557134530360138e+00 1.0608848360241897e-01 -1.0580695982475036e-01
142+
</Neuron>
143+
<Neuron NSynapses="14">
144+
-3.8956689904730113e-01 1.5514886363254041e-01 -2.3078431135259190e+00 7.6793678325873160e-01 1.0674159390952971e+00 -3.3413931452256405e+00 1.7582679017401026e+00 -8.0724537984762257e-01 -1.0795441444523637e-01 3.1071221124309907e+00 2.4277090725555195e+00 -1.6969367654155174e+00 1.1302060581143833e+00 3.1013478926727012e+00
145+
</Neuron>
146+
</Layer>
147+
<Layer Index="1" NNeurons="15">
148+
<Neuron NSynapses="1">
149+
2.8073276420564353e-01
150+
</Neuron>
151+
<Neuron NSynapses="1">
152+
-2.5083341123546704e-01
153+
</Neuron>
154+
<Neuron NSynapses="1">
155+
-7.9749835368894828e-01
156+
</Neuron>
157+
<Neuron NSynapses="1">
158+
-2.4219594048714227e-01
159+
</Neuron>
160+
<Neuron NSynapses="1">
161+
-5.8660140860897225e-01
162+
</Neuron>
163+
<Neuron NSynapses="1">
164+
2.3192690630283436e-01
165+
</Neuron>
166+
<Neuron NSynapses="1">
167+
3.6420742767100944e-01
168+
</Neuron>
169+
<Neuron NSynapses="1">
170+
-1.6804529636560728e-01
171+
</Neuron>
172+
<Neuron NSynapses="1">
173+
-3.0201581984332387e-01
174+
</Neuron>
175+
<Neuron NSynapses="1">
176+
6.5316912677068972e-01
177+
</Neuron>
178+
<Neuron NSynapses="1">
179+
5.4536798547068941e-03
180+
</Neuron>
181+
<Neuron NSynapses="1">
182+
1.0603005543655107e-02
183+
</Neuron>
184+
<Neuron NSynapses="1">
185+
2.8679691975339600e-01
186+
</Neuron>
187+
<Neuron NSynapses="1">
188+
-5.9800482589005310e-01
189+
</Neuron>
190+
<Neuron NSynapses="1">
191+
-5.0874954760531321e-01
192+
</Neuron>
193+
</Layer>
194+
<Layer Index="2" NNeurons="1">
195+
<Neuron NSynapses="0"/>
196+
</Layer>
197+
</Layout>
198+
</Weights>
199+
</MethodSetup>
200+
)";
201+
202+
TEST(TestUseOffsetOrNot, ReadingOldFile)
203+
{
204+
Float_t coneec = 0., coneen = 0., momentum = 0., coslarcon = 0., energyratio = 0., ratioecal = 0., ratiototcal = 0.,
205+
nsigd0 = 0., nsigz0 = 0.;
206+
207+
// Create reader for electron weights
208+
TMVA::Reader electronReader("!Color:!Silent");
209+
electronReader.AddVariable("coneec", &coneec);
210+
electronReader.AddVariable("coneen", &coneen);
211+
electronReader.AddVariable("momentum", &momentum);
212+
electronReader.AddVariable("coslarcon", &coslarcon);
213+
electronReader.AddVariable("energyratio", &energyratio);
214+
electronReader.AddVariable("ratioecal", &ratioecal);
215+
electronReader.AddVariable("ratiototcal", &ratiototcal);
216+
electronReader.AddVariable("nsigd0", &nsigd0);
217+
electronReader.AddVariable("nsigz0", &nsigz0);
218+
219+
const auto methodType = TMVA::Types::Instance().GetMethodType("MLP");
220+
221+
EXPECT_NO_THROW(electronReader.BookMVA(methodType, methodString));
222+
}

0 commit comments

Comments
 (0)