69 TMVA::TransformationHandler::TransformationHandler( DataSetInfo& dsi,
const TString& callerName )
72 fCallerName (callerName),
73 fLogger ( new MsgLogger(TString(
"TFHandler_" + callerName).Data(), kINFO) )
77 fNumC = (dsi.GetNClasses()<= 1) ? 1 : dsi.GetNClasses()+1;
79 fVariableStats.resize( fNumC );
80 for (Int_t i=0; i<fNumC; i++ ) fVariableStats.at(i).resize(dsi.GetNVariables() + dsi.GetNTargets());
86 TMVA::TransformationHandler::~TransformationHandler()
88 std::vector<Ranking*>::const_iterator it = fRanking.begin();
89 for (; it != fRanking.end(); ++it)
delete *it;
91 fTransformations.SetOwner();
97 void TMVA::TransformationHandler::SetCallerName(
const TString& name )
100 fLogger->SetSource( TString(
"TFHandler_" + fCallerName).Data() );
105 TMVA::VariableTransformBase* TMVA::TransformationHandler::AddTransformation( VariableTransformBase *trf, Int_t cls )
107 TString tfname = trf->Log().GetName();
108 trf->Log().SetSource(TString(fCallerName+
"_"+tfname+
"_TF").Data());
109 fTransformations.Add(trf);
110 fTransformationsReferenceClasses.push_back( cls );
124 void TMVA::TransformationHandler::AddStats( Int_t k, UInt_t ivar, Double_t mean, Double_t rms, Double_t min, Double_t max )
126 if (rms <= 0 || TMath::IsNaN(rms)) {
127 Log() << kWARNING <<
"Variable \"" << Variable(ivar).GetExpression()
128 <<
"\" has zero, negative, or NaN RMS^2: "
130 <<
" ==> set to zero. Please check the variable content" << Endl;
134 VariableStat stat; stat.fMean = mean; stat.fRMS = rms; stat.fMin = min; stat.fMax = max;
135 fVariableStats.at(k).at(ivar) = stat;
142 void TMVA::TransformationHandler::SetTransformationReferenceClass( Int_t cls )
144 for (UInt_t i = 0; i < fTransformationsReferenceClasses.size(); i++) {
145 fTransformationsReferenceClasses.at( i ) = cls;
152 const TMVA::Event* TMVA::TransformationHandler::Transform(
const Event* ev )
const
154 TListIter trIt(&fTransformations);
155 std::vector<Int_t>::const_iterator rClsIt = fTransformationsReferenceClasses.begin();
156 const Event* trEv = ev;
157 while (VariableTransformBase *trf = (VariableTransformBase*) trIt()) {
158 if (rClsIt == fTransformationsReferenceClasses.end()) Log() << kFATAL<<
"invalid read in TransformationHandler::Transform " <<Endl;
159 trEv = trf->Transform(trEv, (*rClsIt) );
167 const TMVA::Event* TMVA::TransformationHandler::InverseTransform(
const Event* ev, Bool_t suppressIfNoTargets )
const
169 if (fTransformationsReferenceClasses.empty()){
174 TListIter trIt(&fTransformations, kIterBackward);
175 std::vector< Int_t >::const_iterator rClsIt = fTransformationsReferenceClasses.end();
177 const Event* trEv = ev;
178 UInt_t nvars = 0, ntgts = 0, nspcts = 0;
179 while (VariableTransformBase *trf = (VariableTransformBase*) trIt() ) {
180 if (trf->IsCreated()) {
181 trf->CountVariableTypes( nvars, ntgts, nspcts );
182 if( !(suppressIfNoTargets && ntgts==0) )
183 trEv = trf->InverseTransform(ev, (*rClsIt) );
211 const std::vector<TMVA::Event*>* TMVA::TransformationHandler::CalcTransformations(
const std::vector<Event*>& events,
212 Bool_t createNewVector )
214 if (fTransformations.GetEntries() <= 0)
221 std::vector<Event*> *transformedEvents =
new std::vector<TMVA::Event*>(events.size());
222 for ( UInt_t ievt = 0; ievt<events.size(); ievt++)
223 transformedEvents->at(ievt) =
new Event(*events.at(ievt));
225 TListIter trIt(&fTransformations);
226 std::vector< Int_t >::iterator rClsIt = fTransformationsReferenceClasses.begin();
227 while (VariableTransformBase *trf = (VariableTransformBase*) trIt()) {
228 if (trf->PrepareTransformation(*transformedEvents)) {
229 for (UInt_t ievt = 0; ievt<transformedEvents->size(); ievt++) {
230 *(*transformedEvents)[ievt] = *trf->Transform((*transformedEvents)[ievt],(*rClsIt));
236 CalcStats(*transformedEvents);
239 PlotVariables(*transformedEvents);
243 if (!createNewVector) {
244 for ( UInt_t ievt = 0; ievt<transformedEvents->size(); ievt++)
245 delete (*transformedEvents)[ievt];
246 delete transformedEvents;
247 transformedEvents=NULL;
250 return transformedEvents;
257 void TMVA::TransformationHandler::CalcStats (
const std::vector<Event*>& events )
259 UInt_t nevts = events.size();
262 Log() << kFATAL <<
"No events available to find min, max, mean and rms" << Endl;
265 const UInt_t nvar = events[0]->GetNVariables();
266 const UInt_t ntgt = events[0]->GetNTargets();
268 Double_t *sumOfWeights =
new Double_t[fNumC];
269 Double_t* *x2 =
new Double_t*[fNumC];
270 Double_t* *x0 =
new Double_t*[fNumC];
271 Double_t* *varMin =
new Double_t*[fNumC];
272 Double_t* *varMax =
new Double_t*[fNumC];
274 for (Int_t cls=0; cls<fNumC; cls++) {
276 x2[cls] =
new Double_t[nvar+ntgt];
277 x0[cls] =
new Double_t[nvar+ntgt];
278 varMin[cls] =
new Double_t[nvar+ntgt];
279 varMax[cls] =
new Double_t[nvar+ntgt];
280 for (UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
281 x0[cls][ivar] = x2[cls][ivar] = 0;
282 varMin[cls][ivar] = DBL_MAX;
283 varMax[cls][ivar] = -DBL_MAX;
287 for (UInt_t ievt=0; ievt<nevts; ievt++) {
288 const Event* ev = events[ievt];
289 Int_t cls = ev->GetClass();
291 Double_t weight = ev->GetWeight();
292 sumOfWeights[cls] += weight;
293 if (fNumC > 1 ) sumOfWeights[fNumC-1] += weight;
294 for (UInt_t var_tgt = 0; var_tgt < 2; var_tgt++ ){
295 UInt_t nloop = ( var_tgt==0?nvar:ntgt );
296 for (UInt_t ivar=0; ivar<nloop; ivar++) {
297 Double_t x = ( var_tgt==0?ev->GetValue(ivar):ev->GetTarget(ivar) );
299 if (x < varMin[cls][(var_tgt*nvar)+ivar]) varMin[cls][(var_tgt*nvar)+ivar]= x;
300 if (x > varMax[cls][(var_tgt*nvar)+ivar]) varMax[cls][(var_tgt*nvar)+ivar]= x;
302 x0[cls][(var_tgt*nvar)+ivar] += x*weight;
303 x2[cls][(var_tgt*nvar)+ivar] += x*x*weight;
306 if (x < varMin[fNumC-1][(var_tgt*nvar)+ivar]) varMin[fNumC-1][(var_tgt*nvar)+ivar]= x;
307 if (x > varMax[fNumC-1][(var_tgt*nvar)+ivar]) varMax[fNumC-1][(var_tgt*nvar)+ivar]= x;
309 x0[fNumC-1][(var_tgt*nvar)+ivar] += x*weight;
310 x2[fNumC-1][(var_tgt*nvar)+ivar] += x*x*weight;
318 for (UInt_t var_tgt = 0; var_tgt < 2; var_tgt++ ){
319 UInt_t nloop = ( var_tgt==0?nvar:ntgt );
320 for (UInt_t ivar=0; ivar<nloop; ivar++) {
321 for (Int_t cls = 0; cls < fNumC; cls++) {
322 Double_t mean = x0[cls][(var_tgt*nvar)+ivar]/sumOfWeights[cls];
323 Double_t rms = TMath::Sqrt( x2[cls][(var_tgt*nvar)+ivar]/sumOfWeights[cls] - mean*mean);
324 AddStats(cls, (var_tgt*nvar)+ivar, mean, rms, varMin[cls][(var_tgt*nvar)+ivar], varMax[cls][(var_tgt*nvar)+ivar]);
331 UInt_t maxL = 8, maxV = 0;
332 std::vector<UInt_t> vLengths;
333 for (UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
335 maxL = TMath::Max( (UInt_t)Variable(ivar).GetLabel().Length(), maxL );
337 maxL = TMath::Max( (UInt_t)Target(ivar-nvar).GetLabel().Length(), maxL );
341 UInt_t clen = maxL + 4*maxV + 11;
347 Log() << std::setw(maxL) <<
"Variable";
348 Log() <<
" " << std::setw(maxV) <<
"Mean";
349 Log() <<
" " << std::setw(maxV) <<
"RMS";
350 Log() <<
" " << std::setw(maxV) <<
"[ Min ";
351 Log() <<
" " << std::setw(maxV) <<
" Max ]"<< Endl;;
352 for (UInt_t i=0; i<clen; i++) Log() <<
"-";
356 TString format =
"%#11.5g";
357 for (UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
359 Log() << std::setw(maxL) << Variable(ivar).GetLabel() <<
":";
361 Log() << std::setw(maxL) << Target(ivar-nvar).GetLabel() <<
":";
362 Log() << std::setw(maxV) << Form( format.Data(), GetMean(ivar) );
363 Log() << std::setw(maxV) << Form( format.Data(), GetRMS(ivar) );
364 Log() <<
" [" << std::setw(maxV) << Form( format.Data(), GetMin(ivar) );
365 Log() << std::setw(maxV) << Form( format.Data(), GetMax(ivar) ) <<
" ]";
368 for (UInt_t i=0; i<clen; i++) Log() <<
"-";
372 delete[] sumOfWeights;
373 for (Int_t cls=0; cls<fNumC; cls++) {
376 delete [] varMin[cls];
377 delete [] varMax[cls];
388 void TMVA::TransformationHandler::MakeFunction( std::ostream& fout,
const TString& fncName, Int_t part )
const
390 TListIter trIt(&fTransformations);
391 std::vector< Int_t >::const_iterator rClsIt = fTransformationsReferenceClasses.begin();
393 while (VariableTransformBase *trf = (VariableTransformBase*) trIt() ) {
394 trf->MakeFunction(fout, fncName, part, trCounter++, (*rClsIt) );
398 for (Int_t i=0; i<fTransformations.GetSize(); i++) {
399 fout <<
" void InitTransform_"<<i+1<<
"();" << std::endl;
400 fout <<
" void Transform_"<<i+1<<
"( std::vector<double> & iv, int sigOrBgd ) const;" << std::endl;
405 fout <<
"//_______________________________________________________________________" << std::endl;
406 fout <<
"inline void " << fncName <<
"::InitTransform()" << std::endl;
407 fout <<
"{" << std::endl;
408 for (Int_t i=0; i<fTransformations.GetSize(); i++)
409 fout <<
" InitTransform_"<<i+1<<
"();" << std::endl;
410 fout <<
"}" << std::endl;
412 fout <<
"//_______________________________________________________________________" << std::endl;
413 fout <<
"inline void " << fncName <<
"::Transform( std::vector<double>& iv, int sigOrBgd ) const" << std::endl;
414 fout <<
"{" << std::endl;
415 for (Int_t i=0; i<fTransformations.GetSize(); i++)
416 fout <<
" Transform_"<<i+1<<
"( iv, sigOrBgd );" << std::endl;
418 fout <<
"}" << std::endl;
425 TString TMVA::TransformationHandler::GetName()
const
428 TListIter trIt(&fTransformations);
429 VariableTransformBase *trf;
430 if ((trf = (VariableTransformBase*) trIt())) {
431 name = TString(trf->GetShortName());
432 while ((trf = (VariableTransformBase*) trIt())) name +=
"_" + TString(trf->GetShortName());
440 TString TMVA::TransformationHandler::GetVariableAxisTitle(
const VariableInfo& info )
const
442 TString xtit = info.GetTitle();
444 if (fTransformations.GetSize() >= 1) {
445 if (fTransformations.GetSize() > 1 ||
446 ((VariableTransformBase*)GetTransformationList().Last())->GetVariableTransform() != Types::kIdentity) {
447 xtit +=
" (" + GetName() +
")";
459 void TMVA::TransformationHandler::PlotVariables (
const std::vector<Event*>& events, TDirectory* theDirectory )
461 if (fRootBaseDir==0 && theDirectory == 0)
return;
463 Log() << kDEBUG <<
"Plot event variables for ";
464 if (theDirectory !=0) Log()<< TString(theDirectory->GetName()) << Endl;
465 else Log() << GetName() << Endl;
468 TString transfType =
"";
469 if (theDirectory == 0) {
471 transfType += GetName();
476 const UInt_t nvar = fDataSetInfo.GetNVariables();
477 const UInt_t ntgt = fDataSetInfo.GetNTargets();
478 const Int_t ncls = fDataSetInfo.GetNClasses();
482 std::vector<std::vector<TH1*> > hVars( ncls );
483 std::vector<std::vector<std::vector<TH2F*> > > mycorr( ncls );
484 std::vector<std::vector<std::vector<TProfile*> > > myprof( ncls );
486 for (Int_t cls = 0; cls < ncls; cls++) {
487 hVars.at(cls).resize ( nvar+ntgt );
488 hVars.at(cls).assign ( nvar+ntgt, 0 );
489 mycorr.at(cls).resize( nvar+ntgt );
490 myprof.at(cls).resize( nvar+ntgt );
491 for (UInt_t ivar=0; ivar < nvar+ntgt; ivar++) {
492 mycorr.at(cls).at(ivar).resize( nvar+ntgt );
493 myprof.at(cls).at(ivar).resize( nvar+ntgt );
494 mycorr.at(cls).at(ivar).assign( nvar+ntgt, 0 );
495 myprof.at(cls).at(ivar).assign( nvar+ntgt, 0 );
502 if (nvar+ntgt > (UInt_t)gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
503 Int_t nhists = (nvar+ntgt)*(nvar+ntgt - 1)/2;
504 Log() << kINFO << gTools().Color(
"dgreen") << Endl;
505 Log() << kINFO <<
"<PlotVariables> Will not produce scatter plots ==> " << Endl;
507 <<
"| The number of " << nvar <<
" input variables and " << ntgt <<
" target values would require "
508 << nhists <<
" two-dimensional" << Endl;
510 <<
"| histograms, which would occupy the computer's memory. Note that this" << Endl;
512 <<
"| suppression does not have any consequences for your analysis, other" << Endl;
514 <<
"| than not disposing of these scatter plots. You can modify the maximum" << Endl;
516 <<
"| number of input variables allowed to generate scatter plots in your" << Endl;
517 Log() <<
"| script via the command line:" << Endl;
519 <<
"| \"(TMVA::gConfig().GetVariablePlotting()).fMaxNumOfAllowedVariablesForScatterPlots = <some int>;\""
520 << gTools().Color(
"reset") << Endl;
522 Log() << kINFO <<
"Some more output" << Endl;
525 Double_t timesRMS = gConfig().GetVariablePlotting().fTimesRMS;
526 UInt_t nbins1D = gConfig().GetVariablePlotting().fNbins1D;
527 UInt_t nbins2D = gConfig().GetVariablePlotting().fNbins2D;
529 for (UInt_t var_tgt = 0; var_tgt < 2; var_tgt++) {
530 UInt_t nloops = ( var_tgt == 0? nvar:ntgt );
531 for (UInt_t ivar=0; ivar<nloops; ivar++) {
532 const VariableInfo& info = ( var_tgt == 0 ? Variable( ivar ) : Target(ivar) );
533 TString myVari = info.GetInternalName();
535 Double_t mean = fVariableStats.at(fNumC-1).at( ( var_tgt*nvar )+ivar).fMean;
536 Double_t rms = fVariableStats.at(fNumC-1).at( ( var_tgt*nvar )+ivar).fRMS;
538 for (Int_t cls = 0; cls < ncls; cls++) {
540 TString className = fDataSetInfo.GetClassInfo(cls)->GetName();
543 className += (ntgt == 1 && var_tgt == 1 ?
"_target" :
"");
547 if (info.GetVarType() ==
'I') {
549 Int_t xmin = TMath::Nint( GetMin( ( var_tgt*nvar )+ivar) );
550 Int_t xmax = TMath::Nint( GetMax( ( var_tgt*nvar )+ivar) + 1 );
551 Int_t nbins = xmax - xmin;
553 h =
new TH1F( Form(
"%s__%s%s", myVari.Data(), className.Data(), transfType.Data()),
554 info.GetTitle(), nbins, xmin, xmax );
557 Double_t xmin = TMath::Max( GetMin( ( var_tgt*nvar )+ivar), mean - timesRMS*rms );
558 Double_t xmax = TMath::Min( GetMax( ( var_tgt*nvar )+ivar), mean + timesRMS*rms );
562 if (xmin >= xmax) xmax = xmin*1.1;
563 if (xmin >= xmax) xmax = xmin + 1;
565 xmax += (xmax - xmin)/nbins1D;
567 h =
new TH1F( Form(
"%s__%s%s", myVari.Data(), className.Data(), transfType.Data()),
568 info.GetTitle(), nbins1D, xmin, xmax );
571 h->GetXaxis()->SetTitle( gTools().GetXTitleWithUnit( GetVariableAxisTitle( info ), info.GetUnit() ) );
572 h->GetYaxis()->SetTitle( gTools().GetYTitleWithUnit( *h, info.GetUnit(), kFALSE ) );
573 hVars.at(cls).at((var_tgt*nvar)+ivar) = h;
576 if (nvar+ntgt <= (UInt_t)gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
578 for (UInt_t v_t = 0; v_t < 2; v_t++) {
579 UInt_t nl = ( v_t==0?nvar:ntgt );
580 UInt_t start = ( v_t==0? (var_tgt==0?ivar+1:0):(var_tgt==0?nl:ivar+1) );
581 for (UInt_t j=start; j<nl; j++) {
583 const VariableInfo& infoj = ( v_t == 0 ? Variable( j ) : Target(j) );
584 TString myVarj = infoj.GetInternalName();
586 Double_t rxmin = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+ivar).fMin;
587 Double_t rxmax = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+ivar).fMax;
588 Double_t rymin = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+j).fMin;
589 Double_t rymax = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+j).fMax;
592 TH2F* h2 =
new TH2F( Form(
"scat_%s_vs_%s_%s%s" , myVarj.Data(), myVari.Data(),
593 className.Data(), transfType.Data() ),
594 Form(
"%s versus %s (%s)%s", infoj.GetTitle(), info.GetTitle(),
595 className.Data(), transfType.Data() ),
596 nbins2D, rxmin , rxmax,
597 nbins2D, rymin , rymax );
599 h2->GetXaxis()->SetTitle( gTools().GetXTitleWithUnit( GetVariableAxisTitle( info ), info .GetUnit() ) );
600 h2->GetYaxis()->SetTitle( gTools().GetXTitleWithUnit( GetVariableAxisTitle( infoj ), infoj.GetUnit() ) );
601 mycorr.at(cls).at((var_tgt*nvar)+ivar).at((v_t*nvar)+j) = h2;
604 TProfile* p =
new TProfile( Form(
"prof_%s_vs_%s_%s%s", myVarj.Data(),
605 myVari.Data(), className.Data(),
607 Form(
"profile %s versus %s (%s)%s",
608 infoj.GetTitle(), info.GetTitle(),
609 className.Data(), transfType.Data() ), nbins1D,
613 p->GetXaxis()->SetTitle( gTools().GetXTitleWithUnit( GetVariableAxisTitle( info ), info .GetUnit() ) );
614 p->GetYaxis()->SetTitle( gTools().GetXTitleWithUnit( GetVariableAxisTitle( infoj ), infoj.GetUnit() ) );
615 myprof.at(cls).at((var_tgt*nvar)+ivar).at((v_t*nvar)+j) = p;
623 UInt_t nevts = events.size();
626 std::vector<Double_t> xregmean ( nvar+1, 0 );
627 std::vector<Double_t> x2regmean( nvar+1, 0 );
628 std::vector<Double_t> xCregmean( nvar+1, 0 );
631 for (UInt_t ievt=0; ievt<nevts; ievt++) {
633 const Event* ev = events[ievt];
635 Float_t weight = ev->GetWeight();
636 Int_t cls = ev->GetClass();
640 Float_t valr = ev->GetTarget(0);
641 xregmean[nvar] += valr;
642 x2regmean[nvar] += valr*valr;
643 for (UInt_t ivar=0; ivar<nvar; ivar++) {
644 Float_t vali = ev->GetValue(ivar);
645 xregmean[ivar] += vali;
646 x2regmean[ivar] += vali*vali;
647 xCregmean[ivar] += vali*valr;
652 for (UInt_t var_tgt = 0; var_tgt < 2; var_tgt++) {
653 UInt_t nloops = ( var_tgt == 0? nvar:ntgt );
654 for (UInt_t ivar=0; ivar<nloops; ivar++) {
655 Float_t vali = ( var_tgt == 0 ? ev->GetValue(ivar) : ev->GetTarget(ivar) );
658 hVars.at(cls).at( ( var_tgt*nvar )+ivar)->Fill( vali, weight );
661 if (nvar+ntgt <= (UInt_t)gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
663 for (UInt_t v_t = 0; v_t < 2; v_t++) {
664 UInt_t nl = ( v_t==0 ? nvar : ntgt );
665 UInt_t start = ( v_t==0 ? (var_tgt==0?ivar+1:0) : (var_tgt==0?nl:ivar+1) );
666 for (UInt_t j=start; j<nl; j++) {
667 Float_t valj = ( v_t == 0 ? ev->GetValue(j) : ev->GetTarget(j) );
668 mycorr.at(cls).at( ( var_tgt*nvar )+ivar).at( ( v_t*nvar )+j)->Fill( vali, valj, weight );
669 myprof.at(cls).at( ( var_tgt*nvar )+ivar).at( ( v_t*nvar )+j)->Fill( vali, valj, weight );
679 for (UInt_t ivar=0; ivar<=nvar; ivar++) {
680 xregmean[ivar] /= nevts;
681 x2regmean[ivar] = x2regmean[ivar]/nevts - xregmean[ivar]*xregmean[ivar];
683 for (UInt_t ivar=0; ivar<nvar; ivar++) {
684 xCregmean[ivar] = xCregmean[ivar]/nevts - xregmean[ivar]*xregmean[nvar];
685 xCregmean[ivar] /= TMath::Sqrt( x2regmean[ivar]*x2regmean[nvar] );
688 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"|Correlation with target|" ) );
689 for (UInt_t ivar=0; ivar<nvar; ivar++) {
690 Double_t abscor = TMath::Abs( xCregmean[ivar] );
691 fRanking.back()->AddRank( Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), abscor ) );
694 if (nvar+ntgt <= (UInt_t)gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
697 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Mutual information" ) );
698 for (UInt_t ivar=0; ivar<nvar; ivar++) {
699 TH2F* h1 = mycorr.at(0).at( nvar ).at( ivar );
700 Double_t mi = gTools().GetMutualInformation( *h1 );
701 fRanking.back()->AddRank( Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), mi ) );
705 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Correlation Ratio" ) );
706 for (UInt_t ivar=0; ivar<nvar; ivar++) {
707 TH2F* h2 = mycorr.at(0).at( nvar ).at( ivar );
708 Double_t cr = gTools().GetCorrelationRatio( *h2 );
709 fRanking.back()->AddRank( Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), cr ) );
713 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Correlation Ratio (T)" ) );
714 for (UInt_t ivar=0; ivar<nvar; ivar++) {
715 TH2F* h2T = gTools().TransposeHist( *mycorr.at(0).at( nvar ).at( ivar ) );
716 Double_t cr = gTools().GetCorrelationRatio( *h2T );
717 fRanking.back()->AddRank( Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), cr ) );
724 else if (fDataSetInfo.GetNClasses() == 2
725 && fDataSetInfo.GetClassInfo(
"Signal") != NULL
726 && fDataSetInfo.GetClassInfo(
"Background") != NULL
728 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Separation" ) );
729 for (UInt_t i=0; i<nvar; i++) {
730 Double_t sep = gTools().GetSeparation( hVars.at(fDataSetInfo.GetClassInfo(
"Signal") ->GetNumber()).at(i),
731 hVars.at(fDataSetInfo.GetClassInfo(
"Background")->GetNumber()).at(i) );
732 fRanking.back()->AddRank( Rank( hVars.at(fDataSetInfo.GetClassInfo(
"Signal")->GetNumber()).at(i)->GetTitle(),
741 TDirectory* localDir = theDirectory;
742 if (theDirectory == 0) {
745 TString outputDir = TString(
"InputVariables");
746 TListIter trIt(&fTransformations);
747 while (VariableTransformBase *trf = (VariableTransformBase*) trIt())
748 outputDir +=
"_" + TString(trf->GetShortName());
750 TString uniqueOutputDir = outputDir;
753 while( (o = fRootBaseDir->FindObject(uniqueOutputDir)) != 0 ){
754 uniqueOutputDir = outputDir+Form(
"_%d",counter);
755 Log() << kINFO <<
"A " << o->ClassName() <<
" with name " << o->GetName() <<
" already exists in "
756 << fRootBaseDir->GetPath() <<
", I will try with "<<uniqueOutputDir<<
"." << Endl;
765 localDir = fRootBaseDir->mkdir( uniqueOutputDir );
768 Log() << kVERBOSE <<
"Create and switch to directory " << localDir->GetPath() << Endl;
774 for (UInt_t i=0; i<nvar+ntgt; i++) {
775 for (Int_t cls = 0; cls < ncls; cls++) {
776 if (hVars.at(cls).at(i) != 0) {
777 hVars.at(cls).at(i)->Write();
778 hVars.at(cls).at(i)->SetDirectory(0);
779 delete hVars.at(cls).at(i);
785 if (nvar+ntgt <= (UInt_t)gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
787 localDir = localDir->mkdir(
"CorrelationPlots" );
789 Log() << kDEBUG <<
"Create scatter and profile plots in target-file directory: " << Endl;
790 Log() << kDEBUG << localDir->GetPath() << Endl;
793 for (UInt_t i=0; i<nvar+ntgt; i++) {
794 for (UInt_t j=i+1; j<nvar+ntgt; j++) {
795 for (Int_t cls = 0; cls < ncls; cls++) {
796 if (mycorr.at(cls).at(i).at(j) != 0 ) {
797 mycorr.at(cls).at(i).at(j)->Write();
798 mycorr.at(cls).at(i).at(j)->SetDirectory(0);
799 delete mycorr.at(cls).at(i).at(j);
801 if (myprof.at(cls).at(i).at(j) != 0) {
802 myprof.at(cls).at(i).at(j)->Write();
803 myprof.at(cls).at(i).at(j)->SetDirectory(0);
804 delete myprof.at(cls).at(i).at(j);
810 if (theDirectory != 0 ) theDirectory->cd();
811 else fRootBaseDir->cd();
817 std::vector<TString>* TMVA::TransformationHandler::GetTransformationStringsOfLastTransform()
const
819 VariableTransformBase* trf = ((VariableTransformBase*)GetTransformationList().Last());
821 else return trf->GetTransformationStrings( fTransformationsReferenceClasses.back() );
827 const char* TMVA::TransformationHandler::GetNameOfLastTransform()
const
829 VariableTransformBase* trf = ((VariableTransformBase*)GetTransformationList().Last());
831 else return trf->GetName();
837 void TMVA::TransformationHandler::WriteToStream( std::ostream& o )
const
839 TListIter trIt(&fTransformations);
840 std::vector< Int_t >::const_iterator rClsIt = fTransformationsReferenceClasses.begin();
842 o <<
"NTransformtations " << fTransformations.GetSize() << std::endl << std::endl;
846 while (VariableTransformBase *trf = (VariableTransformBase*) trIt()) {
847 o <<
"#TR -*-*-*-*-*-*-* transformation " << i++ <<
": " << trf->GetName() <<
" -*-*-*-*-*-*-*-" << std::endl;
848 trf->WriteTransformationToStream(o);
849 ci = fDataSetInfo.GetClassInfo( (*rClsIt) );
851 if (ci == 0 ) clsName =
"AllClasses";
852 else clsName = ci->GetName();
853 o <<
"ReferenceClass " << clsName << std::endl;
862 void TMVA::TransformationHandler::AddXMLTo(
void* parent )
const
865 void* trfs = gTools().AddChild(parent,
"Transformations");
866 gTools().AddAttr( trfs,
"NTransformations", fTransformations.GetSize() );
867 TListIter trIt(&fTransformations);
868 while (VariableTransformBase *trf = (VariableTransformBase*) trIt()) trf->AttachXMLTo(trfs);
873 void TMVA::TransformationHandler::ReadFromStream( std::istream& )
875 Log() << kFATAL <<
"Read transformations not implemented" << Endl;
881 void TMVA::TransformationHandler::ReadFromXML(
void* trfsnode )
883 void* ch = gTools().GetChild( trfsnode );
887 gTools().ReadAttr(ch,
"Name", trfname);
889 VariableTransformBase* newtrf = 0;
891 if (trfname ==
"Decorrelation" ) {
892 newtrf =
new VariableDecorrTransform(fDataSetInfo);
894 else if (trfname ==
"PCA" ) {
895 newtrf =
new VariablePCATransform(fDataSetInfo);
897 else if (trfname ==
"Gauss" ) {
898 newtrf =
new VariableGaussTransform(fDataSetInfo);
900 else if (trfname ==
"Uniform" ) {
901 newtrf =
new VariableGaussTransform(fDataSetInfo,
"Uniform");
903 else if (trfname ==
"Normalize" ) {
904 newtrf =
new VariableNormalizeTransform(fDataSetInfo);
906 else if (trfname ==
"Rearrange" ) {
907 newtrf =
new VariableRearrangeTransform(fDataSetInfo);
909 else if (trfname !=
"None") {
912 Log() << kFATAL <<
"<ReadFromXML> Variable transform '"
913 << trfname <<
"' unknown." << Endl;
915 newtrf->ReadFromXML( ch );
916 AddTransformation( newtrf, idxCls );
917 ch = gTools().GetNextChild(ch);
924 void TMVA::TransformationHandler::PrintVariableRanking()
const
927 Log() << kINFO <<
"Ranking input variables (method unspecific)..." << Endl;
928 std::vector<Ranking*>::const_iterator it = fRanking.begin();
929 for (; it != fRanking.end(); ++it) (*it)->Print();
934 Double_t TMVA::TransformationHandler::GetMean( Int_t ivar, Int_t cls )
const
937 return fVariableStats.at(cls).at(ivar).fMean;
941 return fVariableStats.at(fNumC-1).at(ivar).fMean;
944 Log() << kWARNING <<
"Inconsistent variable state when reading the mean value. " << Endl;
947 Log() << kWARNING <<
"Inconsistent variable state when reading the mean value. Value 0 given back" << Endl;
953 Double_t TMVA::TransformationHandler::GetRMS( Int_t ivar, Int_t cls )
const
956 return fVariableStats.at(cls).at(ivar).fRMS;
960 return fVariableStats.at(fNumC-1).at(ivar).fRMS;
963 Log() << kWARNING <<
"Inconsistent variable state when reading the RMS value. " << Endl;
966 Log() << kWARNING <<
"Inconsistent variable state when reading the RMS value. Value 0 given back" << Endl;
972 Double_t TMVA::TransformationHandler::GetMin( Int_t ivar, Int_t cls )
const
975 return fVariableStats.at(cls).at(ivar).fMin;
979 return fVariableStats.at(fNumC-1).at(ivar).fMin;
982 Log() << kWARNING <<
"Inconsistent variable state when reading the minimum value. " << Endl;
985 Log() << kWARNING <<
"Inconsistent variable state when reading the minimum value. Value 0 given back" << Endl;
991 Double_t TMVA::TransformationHandler::GetMax( Int_t ivar, Int_t cls )
const
994 return fVariableStats.at(cls).at(ivar).fMax;
998 return fVariableStats.at(fNumC-1).at(ivar).fMax;
1001 Log() << kWARNING <<
"Inconsistent variable state when reading the maximum value. " << Endl;
1004 Log() << kWARNING <<
"Inconsistent variable state when reading the maximum value. Value 0 given back" << Endl;