// @(#)root/tmva $Id$
// Author: Andreas Hoecker, Joerg Stelzer, Helge Voss, Peter Speckmayer

/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Class  : VariableRearrangeTransform                                            *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description:                                                                   *
 *      Implementation (see header for description)                               *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Peter Speckmayer <Peter.Speckmayer@cern.ch> - CERN, Switzerland           *
 *                                                                                *
 * Copyright (c) 2005:                                                            *
 *      CERN, Switzerland                                                         *
 *      MPI-K Heidelberg, Germany                                                 *
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://tmva.sourceforge.net/LICENSE)                                          *
 **********************************************************************************/

#include <iostream>
#include <iomanip>
#include <stdexcept>

#ifndef ROOT_TMVA_MsgLogger
#include "TMVA/MsgLogger.h"
#endif
#ifndef ROOT_TMVA_VariableRearrangeTransform
#include "TMVA/VariableRearrangeTransform.h"
#endif
#ifndef ROOT_TMVA_Tools
#include "TMVA/Tools.h"
#endif
#ifndef ROOT_TMVA_DataSet
#include "TMVA/DataSet.h"
#endif

ClassImp(TMVA::VariableRearrangeTransform)

//_______________________________________________________________________
TMVA::VariableRearrangeTransform::VariableRearrangeTransform( DataSetInfo& dsi )
:  VariableTransformBase( dsi, Types::kRearranged, "Rearrange" )
{ 
   // constructor
}

//_______________________________________________________________________
TMVA::VariableRearrangeTransform::~VariableRearrangeTransform() {
}

//_______________________________________________________________________
void TMVA::VariableRearrangeTransform::Initialize()
{
   // initialization of the rearrangement transformation
   // (nothing to do)
}

//_______________________________________________________________________
Bool_t TMVA::VariableRearrangeTransform::PrepareTransformation (const std::vector<Event*>& /*events*/)
{
   // prepare transformation --> (nothing to do)
   if (!IsEnabled() || IsCreated()) return kTRUE;

   UInt_t nvars = 0, ntgts = 0, nspcts = 0;
   CountVariableTypes( nvars, ntgts, nspcts );
   if (ntgts>0) Log() << kFATAL << "Targets used in Rearrange-transformation." << Endl;

   SetCreated( kTRUE );
   return kTRUE;
}

//_______________________________________________________________________
const TMVA::Event* TMVA::VariableRearrangeTransform::Transform( const TMVA::Event* const ev, Int_t /*cls*/ ) const
{
   if (!IsEnabled()) return ev;

   // apply the normalization transformation
   if (!IsCreated()) Log() << kFATAL << "Transformation not yet created" << Endl;

   if (fTransformedEvent==0) fTransformedEvent = new Event();

   FloatVector input; // will be filled with the selected variables, (targets)
   std::vector<Char_t> mask; // masked variables
   GetInput( ev, input, mask );
   SetOutput( fTransformedEvent, input, mask, ev );

   return fTransformedEvent;
}

//_______________________________________________________________________
const TMVA::Event* TMVA::VariableRearrangeTransform::InverseTransform( const TMVA::Event* const ev, Int_t /*cls*/ ) const
{
   if (!IsEnabled()) return ev;

   // apply the inverse transformation
   if (!IsCreated()) Log() << kFATAL << "Transformation not yet created" << Endl;

   if (fBackTransformedEvent==0) fBackTransformedEvent = new Event( *ev );

   FloatVector input;  // will be filled with the selected variables, targets, (spectators)
   std::vector<Char_t> mask; // masked variables
   GetInput( ev, input, mask, kTRUE );
   SetOutput( fBackTransformedEvent, input, mask, ev, kTRUE );

   return fBackTransformedEvent;
}


//_______________________________________________________________________
std::vector<TString>* TMVA::VariableRearrangeTransform::GetTransformationStrings( Int_t /*cls*/ ) const
{
   // creates string with variable transformations applied

   const UInt_t size = fGet.size();
   std::vector<TString>* strVec = new std::vector<TString>(size);

   return strVec;
}

//_______________________________________________________________________
void TMVA::VariableRearrangeTransform::AttachXMLTo(void* parent) 
{
//    // create XML description of Rearrange transformation
   void* trfxml = gTools().AddChild(parent, "Transform");
   gTools().AddAttr(trfxml, "Name", "Rearrange");

   VariableTransformBase::AttachXMLTo( trfxml );
}

//_______________________________________________________________________
void TMVA::VariableRearrangeTransform::ReadFromXML( void* trfnode ) 
{
//    // Read the transformation matrices from the xml node


   void* inpnode = NULL;

   inpnode = gTools().GetChild(trfnode, "Selection"); // new xml format
   if(inpnode == NULL)
      Log() << kFATAL << "Unknown weight file format for transformations. (tried to read in 'rearrange' transform)" << Endl;
   
   VariableTransformBase::ReadFromXML( inpnode );
   
   SetCreated();
}

//_______________________________________________________________________
void TMVA::VariableRearrangeTransform::PrintTransformation( std::ostream& ) 
{
   // prints the transformation ranges
}

//_______________________________________________________________________
void TMVA::VariableRearrangeTransform::MakeFunction( std::ostream& /*fout*/, const TString& /*fcncName*/, 
                                                     Int_t /*part*/, UInt_t /*trCounter*/, Int_t ) 
{
   // creates a normalizing function
}
 VariableRearrangeTransform.cxx:1
 VariableRearrangeTransform.cxx:2
 VariableRearrangeTransform.cxx:3
 VariableRearrangeTransform.cxx:4
 VariableRearrangeTransform.cxx:5
 VariableRearrangeTransform.cxx:6
 VariableRearrangeTransform.cxx:7
 VariableRearrangeTransform.cxx:8
 VariableRearrangeTransform.cxx:9
 VariableRearrangeTransform.cxx:10
 VariableRearrangeTransform.cxx:11
 VariableRearrangeTransform.cxx:12
 VariableRearrangeTransform.cxx:13
 VariableRearrangeTransform.cxx:14
 VariableRearrangeTransform.cxx:15
 VariableRearrangeTransform.cxx:16
 VariableRearrangeTransform.cxx:17
 VariableRearrangeTransform.cxx:18
 VariableRearrangeTransform.cxx:19
 VariableRearrangeTransform.cxx:20
 VariableRearrangeTransform.cxx:21
 VariableRearrangeTransform.cxx:22
 VariableRearrangeTransform.cxx:23
 VariableRearrangeTransform.cxx:24
 VariableRearrangeTransform.cxx:25
 VariableRearrangeTransform.cxx:26
 VariableRearrangeTransform.cxx:27
 VariableRearrangeTransform.cxx:28
 VariableRearrangeTransform.cxx:29
 VariableRearrangeTransform.cxx:30
 VariableRearrangeTransform.cxx:31
 VariableRearrangeTransform.cxx:32
 VariableRearrangeTransform.cxx:33
 VariableRearrangeTransform.cxx:34
 VariableRearrangeTransform.cxx:35
 VariableRearrangeTransform.cxx:36
 VariableRearrangeTransform.cxx:37
 VariableRearrangeTransform.cxx:38
 VariableRearrangeTransform.cxx:39
 VariableRearrangeTransform.cxx:40
 VariableRearrangeTransform.cxx:41
 VariableRearrangeTransform.cxx:42
 VariableRearrangeTransform.cxx:43
 VariableRearrangeTransform.cxx:44
 VariableRearrangeTransform.cxx:45
 VariableRearrangeTransform.cxx:46
 VariableRearrangeTransform.cxx:47
 VariableRearrangeTransform.cxx:48
 VariableRearrangeTransform.cxx:49
 VariableRearrangeTransform.cxx:50
 VariableRearrangeTransform.cxx:51
 VariableRearrangeTransform.cxx:52
 VariableRearrangeTransform.cxx:53
 VariableRearrangeTransform.cxx:54
 VariableRearrangeTransform.cxx:55
 VariableRearrangeTransform.cxx:56
 VariableRearrangeTransform.cxx:57
 VariableRearrangeTransform.cxx:58
 VariableRearrangeTransform.cxx:59
 VariableRearrangeTransform.cxx:60
 VariableRearrangeTransform.cxx:61
 VariableRearrangeTransform.cxx:62
 VariableRearrangeTransform.cxx:63
 VariableRearrangeTransform.cxx:64
 VariableRearrangeTransform.cxx:65
 VariableRearrangeTransform.cxx:66
 VariableRearrangeTransform.cxx:67
 VariableRearrangeTransform.cxx:68
 VariableRearrangeTransform.cxx:69
 VariableRearrangeTransform.cxx:70
 VariableRearrangeTransform.cxx:71
 VariableRearrangeTransform.cxx:72
 VariableRearrangeTransform.cxx:73
 VariableRearrangeTransform.cxx:74
 VariableRearrangeTransform.cxx:75
 VariableRearrangeTransform.cxx:76
 VariableRearrangeTransform.cxx:77
 VariableRearrangeTransform.cxx:78
 VariableRearrangeTransform.cxx:79
 VariableRearrangeTransform.cxx:80
 VariableRearrangeTransform.cxx:81
 VariableRearrangeTransform.cxx:82
 VariableRearrangeTransform.cxx:83
 VariableRearrangeTransform.cxx:84
 VariableRearrangeTransform.cxx:85
 VariableRearrangeTransform.cxx:86
 VariableRearrangeTransform.cxx:87
 VariableRearrangeTransform.cxx:88
 VariableRearrangeTransform.cxx:89
 VariableRearrangeTransform.cxx:90
 VariableRearrangeTransform.cxx:91
 VariableRearrangeTransform.cxx:92
 VariableRearrangeTransform.cxx:93
 VariableRearrangeTransform.cxx:94
 VariableRearrangeTransform.cxx:95
 VariableRearrangeTransform.cxx:96
 VariableRearrangeTransform.cxx:97
 VariableRearrangeTransform.cxx:98
 VariableRearrangeTransform.cxx:99
 VariableRearrangeTransform.cxx:100
 VariableRearrangeTransform.cxx:101
 VariableRearrangeTransform.cxx:102
 VariableRearrangeTransform.cxx:103
 VariableRearrangeTransform.cxx:104
 VariableRearrangeTransform.cxx:105
 VariableRearrangeTransform.cxx:106
 VariableRearrangeTransform.cxx:107
 VariableRearrangeTransform.cxx:108
 VariableRearrangeTransform.cxx:109
 VariableRearrangeTransform.cxx:110
 VariableRearrangeTransform.cxx:111
 VariableRearrangeTransform.cxx:112
 VariableRearrangeTransform.cxx:113
 VariableRearrangeTransform.cxx:114
 VariableRearrangeTransform.cxx:115
 VariableRearrangeTransform.cxx:116
 VariableRearrangeTransform.cxx:117
 VariableRearrangeTransform.cxx:118
 VariableRearrangeTransform.cxx:119
 VariableRearrangeTransform.cxx:120
 VariableRearrangeTransform.cxx:121
 VariableRearrangeTransform.cxx:122
 VariableRearrangeTransform.cxx:123
 VariableRearrangeTransform.cxx:124
 VariableRearrangeTransform.cxx:125
 VariableRearrangeTransform.cxx:126
 VariableRearrangeTransform.cxx:127
 VariableRearrangeTransform.cxx:128
 VariableRearrangeTransform.cxx:129
 VariableRearrangeTransform.cxx:130
 VariableRearrangeTransform.cxx:131
 VariableRearrangeTransform.cxx:132
 VariableRearrangeTransform.cxx:133
 VariableRearrangeTransform.cxx:134
 VariableRearrangeTransform.cxx:135
 VariableRearrangeTransform.cxx:136
 VariableRearrangeTransform.cxx:137
 VariableRearrangeTransform.cxx:138
 VariableRearrangeTransform.cxx:139
 VariableRearrangeTransform.cxx:140
 VariableRearrangeTransform.cxx:141
 VariableRearrangeTransform.cxx:142
 VariableRearrangeTransform.cxx:143
 VariableRearrangeTransform.cxx:144
 VariableRearrangeTransform.cxx:145
 VariableRearrangeTransform.cxx:146
 VariableRearrangeTransform.cxx:147
 VariableRearrangeTransform.cxx:148
 VariableRearrangeTransform.cxx:149
 VariableRearrangeTransform.cxx:150
 VariableRearrangeTransform.cxx:151
 VariableRearrangeTransform.cxx:152
 VariableRearrangeTransform.cxx:153
 VariableRearrangeTransform.cxx:154
 VariableRearrangeTransform.cxx:155
 VariableRearrangeTransform.cxx:156
 VariableRearrangeTransform.cxx:157
 VariableRearrangeTransform.cxx:158
 VariableRearrangeTransform.cxx:159
 VariableRearrangeTransform.cxx:160
 VariableRearrangeTransform.cxx:161
 VariableRearrangeTransform.cxx:162