@@ -25,18 +25,21 @@ namespace ore {
2525namespace analytics {
2626
2727ScenarioWriter::ScenarioWriter (const boost::shared_ptr<ScenarioGenerator>& src, const std::string& filename,
28- const char sep, const string& filemode)
29- : src_(src), fp_(nullptr ), i_(0 ), sep_(sep) {
28+ const char sep, const string& filemode, const std::vector<RiskFactorKey>& headerKeys )
29+ : src_(src), fp_(nullptr ), i_(0 ), sep_(sep), headerKeys_(headerKeys) {
3030 open (filename, filemode);
3131}
3232
33- ScenarioWriter::ScenarioWriter (const std::string& filename, const char sep, const string& filemode)
34- : fp_(nullptr ), i_(0 ), sep_(sep) {
33+ ScenarioWriter::ScenarioWriter (const std::string& filename, const char sep, const string& filemode,
34+ const std::vector<RiskFactorKey>& headerKeys)
35+ : fp_(nullptr ), i_(0 ), sep_(sep), headerKeys_(headerKeys) {
3536 open (filename, filemode);
3637}
3738
38- ScenarioWriter::ScenarioWriter (const boost::shared_ptr<ScenarioGenerator>& src, boost::shared_ptr<ore::data::Report> report)
39- : src_(src), report_(report), fp_(nullptr ), i_(0 ), sep_(' ,' ) {}
39+ ScenarioWriter::ScenarioWriter (const boost::shared_ptr<ScenarioGenerator>& src,
40+ boost::shared_ptr<ore::data::Report> report,
41+ const std::vector<RiskFactorKey>& headerKeys)
42+ : src_(src), report_(report), fp_(nullptr ), i_(0 ), sep_(' ,' ), headerKeys_(headerKeys) {}
4043
4144void ScenarioWriter::open (const std::string& filename, const std::string& filemode) {
4245 fp_ = fopen (filename.c_str (), filemode.c_str ());
@@ -96,6 +99,8 @@ void ScenarioWriter::writeScenario(const boost::shared_ptr<Scenario>& s, const b
9699 if (report_) {
97100 if (writeHeader) {
98101 QL_REQUIRE (keys_.size () > 0 , " No keys in scenario" );
102+ if (headerKeys_.empty ())
103+ headerKeys_ = keys_;
99104 report_->addColumn (" Date" , string ());
100105 report_->addColumn (" Scenario" , Size ());
101106 report_->addColumn (" Numeraire" , double (), 8 );
@@ -110,8 +115,12 @@ void ScenarioWriter::writeScenario(const boost::shared_ptr<Scenario>& s, const b
110115 report_->add (to_string (d));
111116 report_->add (i_);
112117 report_->add (s->getNumeraire ());
113- for (auto k : keys_)
114- report_->add (s->get (k));
118+ for (auto k : headerKeys_) {
119+ if (s->has (k))
120+ report_->add (s->get (k));
121+ else
122+ report_->add (Null<Real>());
123+ }
115124 }
116125}
117126
0 commit comments