00001 #include <iostream> 00002 #include <memory> 00003 #include <vector> 00004 #include <string> 00005 00006 #include "FWCore/Utilities/interface/Exception.h" 00007 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00008 #include "FWCore/Framework/interface/Event.h" 00009 #include "FWCore/Framework/interface/EventSetup.h" 00010 #include "FWCore/Framework/interface/ESHandle.h" 00011 #include "FWCore/Framework/interface/EDAnalyzer.h" 00012 #include "FWCore/Framework/interface/MakerMacros.h" 00013 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00014 00015 #include "FWCore/Framework/interface/IOVSyncValue.h" 00016 #include "FWCore/ServiceRegistry/interface/Service.h" 00017 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h" 00018 00019 #include "CondFormats/PhysicsToolsObjects/interface/MVAComputer.h" 00020 00021 #include "PhysicsTools/MVATrainer/interface/MVATrainerLooper.h" 00022 #include "PhysicsTools/MVATrainer/interface/MVATrainerContainerSave.h" 00023 00024 namespace PhysicsTools { 00025 00026 MVATrainerContainerSave::MVATrainerContainerSave( 00027 const edm::ParameterSet ¶ms) : 00028 toPut(params.getParameter<std::vector<std::string> >("toPut")), 00029 toCopy(params.getParameter<std::vector<std::string> >("toCopy")), 00030 saved(false) 00031 { 00032 } 00033 00034 void MVATrainerContainerSave::analyze(const edm::Event& event, 00035 const edm::EventSetup& es) 00036 { 00037 if (calib.get() || saved) 00038 return; 00039 00040 const Calibration::MVAComputerContainer *toPutCalib = 0; 00041 if (!toPut.empty()) { 00042 toPutCalib = getToPut(es); 00043 if (MVATrainerLooper::isUntrained(toPutCalib)) 00044 return; 00045 } 00046 00047 const Calibration::MVAComputerContainer *toCopyCalib = 0; 00048 if (!toCopy.empty()) 00049 toCopyCalib = getToCopy(es); 00050 00051 edm::LogInfo("MVATrainerSave") << "Got the trained calibration data"; 00052 00053 std::auto_ptr<Calibration::MVAComputerContainer> calib( 00054 new Calibration::MVAComputerContainer); 00055 00056 for(std::vector<std::string>::const_iterator iter = toCopy.begin(); 00057 iter != toCopy.end(); iter++) 00058 calib->add(*iter) = toCopyCalib->find(*iter); 00059 00060 for(std::vector<std::string>::const_iterator iter = toPut.begin(); 00061 iter != toPut.end(); iter++) 00062 calib->add(*iter) = toPutCalib->find(*iter); 00063 00064 this->calib = calib; 00065 } 00066 00067 void MVATrainerContainerSave::endJob() 00068 { 00069 if (!calib.get() || saved) 00070 return; 00071 00072 edm::LogInfo("MVATrainerSave") << "Saving calibration data in CondDB."; 00073 00074 edm::Service<cond::service::PoolDBOutputService> dbService; 00075 if (!dbService.isAvailable()) 00076 throw cms::Exception("MVATrainerContainerSave") 00077 << "DBService unavailable" << std::endl; 00078 00079 dbService->createNewIOV<Calibration::MVAComputerContainer>( 00080 calib.release(), dbService->beginOfTime(), 00081 dbService->endOfTime(), getRecordName().c_str()); 00082 00083 saved = true; 00084 } 00085 00086 } // namespace PhysicsTools