67 void CreateVariableTransforms(
const TString& trafoDefinitionIn,
68 TMVA::DataSetInfo& dataInfo,
69 TMVA::TransformationHandler& transformationHandler,
72 TString trafoDefinition(trafoDefinitionIn);
73 if (trafoDefinition ==
"None")
return;
77 TString trafoDefinitionCheck(trafoDefinitionIn);
78 int npartial = 0, ntrafo = 0;
79 for (Int_t pos = 0, siz = trafoDefinition.Sizeof(); pos < siz; ++pos) {
80 TString ch = trafoDefinition(pos,1);
81 if ( ch ==
"(" ) npartial++;
82 if ( ch ==
"+" || ch ==
",") ntrafo++;
86 <<
"The use of multiple partial variable transformations during the "
87 "application phase can be properly invoked via the \"Reader\", but "
88 "it is not yet implemented in \"MakeClass\", the creation mechanism "
89 "for standalone C++ application classes. The standalone C++ class "
90 "produced by this training job is thus INCOMPLETE AND MUST NOT BE USED! "
91 "The transformation in question is: " << trafoDefinitionIn << Endl;
100 Int_t parenthesisCount = 0;
101 for (Int_t position = 0, size = trafoDefinition.Sizeof(); position < size; ++position) {
102 TString ch = trafoDefinition(position,1);
103 if (ch ==
"(") ++parenthesisCount;
104 else if (ch ==
")") --parenthesisCount;
105 else if (ch ==
"," && parenthesisCount == 0) trafoDefinition.Replace(position,1,
'+');
108 TList* trList = gTools().ParseFormatLine( trafoDefinition,
"+" );
109 TListIter trIt(trList);
110 while (TObjString* os = (TObjString*)trIt()) {
111 TString tdef = os->GetString();
114 TString variables =
"";
115 if (tdef.Contains(
"(")) {
116 Ssiz_t parStart = tdef.Index(
"(" );
117 Ssiz_t parLen = tdef.Index(
")", parStart )-parStart+1;
119 variables = tdef(parStart,parLen);
120 tdef.Remove(parStart,parLen);
121 variables.Remove(parLen-1,1);
122 variables.Remove(0,1);
125 TList* trClsList = gTools().ParseFormatLine( tdef,
"_" );
126 TListIter trClsIt(trClsList);
127 if (trClsList->GetSize() < 1)
128 log << kFATAL <<Form(
"Dataset[%s] : ",dataInfo.GetName())<<
"Incorrect transformation string provided." << Endl;
129 const TString& trName = ((TObjString*)trClsList->At(0))->GetString();
131 if (trClsList->GetEntries() > 1) {
132 TString trCls =
"AllClasses";
133 ClassInfo *ci = NULL;
134 trCls = ((TObjString*)trClsList->At(1))->GetString();
135 if (trCls !=
"AllClasses") {
136 ci = dataInfo.GetClassInfo( trCls );
138 log << kFATAL <<Form(
"Dataset[%s] : ",dataInfo.GetName())<<
"Class " << trCls <<
" not known for variable transformation "
139 << trName <<
", please check." << Endl;
141 idxCls = ci->GetNumber();
145 VariableTransformBase* transformation = NULL;
146 if (trName ==
"I" || trName ==
"Ident" || trName ==
"Identity") {
147 if (variables.Length() == 0) variables =
"_V_";
148 transformation =
new VariableIdentityTransform(dataInfo);
150 else if (trName ==
"D" || trName ==
"Deco" || trName ==
"Decorrelate") {
151 if (variables.Length() == 0) variables =
"_V_";
152 transformation =
new VariableDecorrTransform(dataInfo);
154 else if (trName ==
"P" || trName ==
"PCA") {
155 if (variables.Length() == 0) variables =
"_V_";
156 transformation =
new VariablePCATransform(dataInfo);
158 else if (trName ==
"U" || trName ==
"Uniform") {
159 if (variables.Length() == 0) variables =
"_V_,_T_";
160 transformation =
new VariableGaussTransform(dataInfo,
"Uniform" );
162 else if (trName ==
"G" || trName ==
"Gauss") {
163 if (variables.Length() == 0) variables =
"_V_";
164 transformation =
new VariableGaussTransform(dataInfo);
166 else if (trName ==
"N" || trName ==
"Norm" || trName ==
"Normalise" || trName ==
"Normalize") {
167 if (variables.Length() == 0) variables =
"_V_,_T_";
168 transformation =
new VariableNormalizeTransform(dataInfo);
171 log << kFATAL << Form(
"Dataset[%s] : ",dataInfo.GetName())
172 <<
"<ProcessOptions> Variable transform '"
173 << trName <<
"' unknown." << Endl;
176 if (transformation) {
177 ClassInfo* clsInfo = dataInfo.GetClassInfo(idxCls);
179 log << kHEADER << Form(
"[%s] : ",dataInfo.GetName())
180 <<
"Create Transformation \"" << trName <<
"\" with reference class "
181 << clsInfo->GetName() <<
"=("<< idxCls <<
")" << Endl << Endl;
183 log << kHEADER << Form(
"[%s] : ",dataInfo.GetName())
184 <<
"Create Transformation \"" << trName <<
"\" with events from all classes."
187 transformation->SelectInput(variables);
188 transformationHandler.AddTransformation(transformation, idxCls);