CMS 3D CMS Logo

ProcOptional.cc

Go to the documentation of this file.
00001 #include <algorithm>
00002 #include <iterator>
00003 #include <iostream>
00004 #include <cstring>
00005 #include <vector>
00006 #include <string>
00007 
00008 #include <xercesc/dom/DOM.hpp>
00009 
00010 #include "FWCore/Utilities/interface/Exception.h"
00011 
00012 #include "PhysicsTools/MVAComputer/interface/AtomicId.h"
00013 
00014 #include "PhysicsTools/MVATrainer/interface/XMLSimpleStr.h"
00015 #include "PhysicsTools/MVATrainer/interface/XMLDocument.h"
00016 #include "PhysicsTools/MVATrainer/interface/MVATrainer.h"
00017 #include "PhysicsTools/MVATrainer/interface/TrainProcessor.h"
00018 
00019 XERCES_CPP_NAMESPACE_USE
00020 
00021 using namespace PhysicsTools;
00022 
00023 namespace { // anonymous
00024 
00025 class ProcOptional : public TrainProcessor {
00026     public:
00027         typedef TrainProcessor::Registry<ProcOptional>::Type Registry;
00028 
00029         ProcOptional(const char *name, const AtomicId *id,
00030                      MVATrainer *trainer);
00031         virtual ~ProcOptional();
00032 
00033         virtual Variable::Flags getDefaultFlags() const
00034         { return Variable::FLAG_ALL; }
00035 
00036         virtual void configure(DOMElement *elem);
00037         virtual Calibration::VarProcessor *getCalibration() const;
00038 
00039     private:
00040         std::vector<double>     neutrals;
00041 };
00042 
00043 static ProcOptional::Registry registry("ProcOptional");
00044 
00045 ProcOptional::ProcOptional(const char *name, const AtomicId *id,
00046                              MVATrainer *trainer) :
00047         TrainProcessor(name, id, trainer)
00048 {
00049 }
00050 
00051 ProcOptional::~ProcOptional()
00052 {
00053 }
00054 
00055 void ProcOptional::configure(DOMElement *elem)
00056 {
00057         for(DOMNode *node = elem->getFirstChild();
00058             node; node = node->getNextSibling()) {
00059                 if (node->getNodeType() != DOMNode::ELEMENT_NODE)
00060                         continue;
00061 
00062                 if (std::strcmp(XMLSimpleStr(node->getNodeName()),
00063                                 "neutral") != 0)
00064                         throw cms::Exception("ProcOptional")
00065                                 << "Expected neutral tag in config section."
00066                                 << std::endl;
00067                 elem = static_cast<DOMElement*>(node);
00068 
00069                 double neutral = 
00070                         XMLDocument::readAttribute<double>(elem, "pos");
00071 
00072                 neutrals.push_back(neutral);
00073         }
00074 
00075         trained = true;
00076 
00077         if (neutrals.size() != getInputs().size())
00078                 throw cms::Exception("ProcOptional")
00079                         << "Got " << neutrals.size()
00080                         << " neutral pos values for "
00081                         << getInputs().size() << " input variables."
00082                         << std::endl;
00083 }
00084 
00085 Calibration::VarProcessor *ProcOptional::getCalibration() const
00086 {
00087         Calibration::ProcOptional *calib = new Calibration::ProcOptional;
00088 
00089         std::copy(neutrals.begin(), neutrals.end(),
00090                   std::back_inserter(calib->neutralPos));
00091 
00092         return calib;
00093 }
00094 
00095 } // anonymous namespace

Generated on Tue Jun 9 17:41:30 2009 for CMSSW by  doxygen 1.5.4