67 ClassImp(TMVA::MethodCompositeBase);
71 TMVA::MethodCompositeBase::MethodCompositeBase(
const TString& jobName,
72 Types::EMVA methodType,
73 const TString& methodTitle,
75 const TString& theOption )
76 : TMVA::MethodBase( jobName, methodType, methodTitle, theData, theOption),
77 fCurrentMethodIdx(0), fCurrentMethod(0)
82 TMVA::MethodCompositeBase::MethodCompositeBase( Types::EMVA methodType,
84 const TString& weightFile)
85 : TMVA::MethodBase( methodType, dsi, weightFile),
86 fCurrentMethodIdx(0), fCurrentMethod(0)
92 TMVA::IMethod* TMVA::MethodCompositeBase::GetMethod(
const TString &methodTitle )
const
94 std::vector<IMethod*>::const_iterator itrMethod = fMethods.begin();
95 std::vector<IMethod*>::const_iterator itrMethodEnd = fMethods.end();
97 for (; itrMethod != itrMethodEnd; ++itrMethod) {
98 MethodBase* mva =
dynamic_cast<MethodBase*
>(*itrMethod);
99 if ( (mva->GetMethodName())==methodTitle )
return mva;
107 TMVA::IMethod* TMVA::MethodCompositeBase::GetMethod(
const Int_t index )
const
109 std::vector<IMethod*>::const_iterator itrMethod = fMethods.begin()+index;
110 if (itrMethod<fMethods.end())
return *itrMethod;
117 void TMVA::MethodCompositeBase::AddWeightsXMLTo(
void* parent )
const
119 void* wght = gTools().AddChild(parent,
"Weights");
120 gTools().AddAttr( wght,
"NMethods", fMethods.size() );
121 for (UInt_t i=0; i< fMethods.size(); i++)
123 void* methxml = gTools().AddChild( wght,
"Method" );
124 MethodBase* method =
dynamic_cast<MethodBase*
>(fMethods[i]);
125 gTools().AddAttr(methxml,
"Index", i );
126 gTools().AddAttr(methxml,
"Weight", fMethodWeight[i]);
127 gTools().AddAttr(methxml,
"MethodSigCut", method->GetSignalReferenceCut());
128 gTools().AddAttr(methxml,
"MethodSigCutOrientation", method->GetSignalReferenceCutOrientation());
129 gTools().AddAttr(methxml,
"MethodTypeName", method->GetMethodTypeName());
130 gTools().AddAttr(methxml,
"MethodName", method->GetMethodName() );
131 gTools().AddAttr(methxml,
"JobName", method->GetJobName());
132 gTools().AddAttr(methxml,
"Options", method->GetOptions());
133 if (method->fTransformationPointer)
134 gTools().AddAttr(methxml,
"UseMainMethodTransformation", TString(
"true"));
136 gTools().AddAttr(methxml,
"UseMainMethodTransformation", TString(
"false"));
137 method->AddWeightsXMLTo(methxml);
144 TMVA::MethodCompositeBase::~MethodCompositeBase(
void )
146 std::vector<IMethod*>::iterator itrMethod = fMethods.begin();
147 for (; itrMethod != fMethods.end(); ++itrMethod) {
148 Log() << kVERBOSE <<
"Delete method: " << (*itrMethod)->GetName() << Endl;
157 void TMVA::MethodCompositeBase::ReadWeightsFromXML(
void* wghtnode )
160 TString methodName, methodTypeName, jobName, optionString;
162 for (UInt_t i=0;i<fMethods.size();i++)
delete fMethods[i];
164 fMethodWeight.clear();
165 gTools().ReadAttr( wghtnode,
"NMethods", nMethods );
166 void* ch = gTools().GetChild(wghtnode);
167 for (UInt_t i=0; i< nMethods; i++) {
168 Double_t methodWeight, methodSigCut, methodSigCutOrientation;
169 gTools().ReadAttr( ch,
"Weight", methodWeight );
170 gTools().ReadAttr( ch,
"MethodSigCut", methodSigCut);
171 gTools().ReadAttr( ch,
"MethodSigCutOrientation", methodSigCutOrientation);
172 gTools().ReadAttr( ch,
"MethodTypeName", methodTypeName );
173 gTools().ReadAttr( ch,
"MethodName", methodName );
174 gTools().ReadAttr( ch,
"JobName", jobName );
175 gTools().ReadAttr( ch,
"Options", optionString );
178 if (gTools().HasAttr( ch,
"UseMainMethodTransformation")) {
179 TString rerouteString(
"");
180 gTools().ReadAttr( ch,
"UseMainMethodTransformation", rerouteString );
181 rerouteString.ToLower();
187 optionString.ReplaceAll(
"~",
"");
189 optionString.ReplaceAll(
"Boost_",
"~Boost_");
190 optionString.ReplaceAll(
"!~",
"~!");
194 ((TMVA::MethodBoost*)
this)->BookMethod( Types::Instance().GetMethodType( methodTypeName), methodName, optionString );
197 ClassifierFactory::Instance().Create(methodTypeName.Data(), jobName, methodName, DataInfo(), optionString));
199 fMethodWeight.push_back(methodWeight);
200 MethodBase* meth =
dynamic_cast<MethodBase*
>(fMethods.back());
203 Log() << kFATAL <<
"Could not read method from XML" << Endl;
205 void* methXML = gTools().GetChild(ch);
207 TString _fFileDir= meth->DataInfo().GetName();
208 _fFileDir+=
"/"+gConfig().GetIONames().fWeightFileDir;
209 meth->SetWeightFileDir(_fFileDir);
210 meth->SetModelPersistence(IsModelPersistence());
211 meth->SetSilentFile(IsSilentFile());
213 meth->SetMsgType(kWARNING);
214 meth->ParseOptions();
215 meth->ProcessSetup();
217 meth->ReadWeightsFromXML(methXML);
218 meth->SetSignalReferenceCut(methodSigCut);
219 meth->SetSignalReferenceCutOrientation(methodSigCutOrientation);
221 meth->RerouteTransformationHandler (&(this->GetTransformationHandler()));
223 ch = gTools().GetNextChild(ch);
231 void TMVA::MethodCompositeBase::ReadWeightsFromStream( std::istream& istr )
234 TString methodName, methodTitle=GetMethodName(),
235 jobName=GetJobName(),optionString=GetOptions();
236 UInt_t methodNum; Double_t methodWeight;
239 istr >> dummy >> methodNum;
240 Log() << kINFO <<
"Read " << methodNum <<
" Classifiers" << Endl;
241 for (UInt_t i=0;i<fMethods.size();i++)
delete fMethods[i];
243 fMethodWeight.clear();
244 for (UInt_t i=0; i<methodNum; i++) {
245 istr >> dummy >> methodName >> dummy >> fCurrentMethodIdx >> dummy >> methodWeight;
246 if ((UInt_t)fCurrentMethodIdx != i) {
247 Log() << kFATAL <<
"Error while reading weight file; mismatch MethodIndex="
248 << fCurrentMethodIdx <<
" i=" << i
249 <<
" MethodName " << methodName
250 <<
" dummy " << dummy
251 <<
" MethodWeight= " << methodWeight
254 if (GetMethodType() != Types::kBoost || i==0) {
255 istr >> dummy >> jobName;
256 istr >> dummy >> methodTitle;
257 istr >> dummy >> optionString;
258 if (GetMethodType() == Types::kBoost)
259 ((TMVA::MethodBoost*)
this)->BookMethod( Types::Instance().GetMethodType( methodName), methodTitle, optionString );
261 else methodTitle=Form(
"%s (%04i)",GetMethodName().Data(),fCurrentMethodIdx);
263 ClassifierFactory::Instance().Create(methodName.Data(), jobName, methodTitle, DataInfo(), optionString));
264 fMethodWeight.push_back( methodWeight );
265 if(MethodBase* m = dynamic_cast<MethodBase*>(fMethods.back()) )
266 m->ReadWeightsFromStream(istr);
273 Double_t TMVA::MethodCompositeBase::GetMvaValue( Double_t* err, Double_t* errUpper )
275 Double_t mvaValue = 0;
276 for (UInt_t i=0;i< fMethods.size(); i++) mvaValue+=fMethods[i]->GetMvaValue()*fMethodWeight[i];
279 NoErrorCalc(err, errUpper);