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 {
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 }