27#define JSON_USE_IMPLICIT_CONVERSIONS 0
47 if (!
Load(DataPath, Helper, DataCor)) {
78 std::string emissionRep = Helper->
getgClass();
81 std::vector<std::vector<double> > matrixFCvalues;
82 std::vector<std::vector<double> > matrixPollutants;
83 std::vector<double> idlingValuesFCvalues;
84 std::vector<double> idlingValuesPollutants;
85 std::vector<std::string> headerFCvalues;
86 std::vector<std::string> headerPollutants;
94 if (DataCor !=
nullptr) {
101 if (!
ReadEmissionData(
true, DataPath, emissionRep, Helper, fleetMix, DataCor, headerFCvalues, matrixFCvalues, idlingValuesFCvalues)) {
105 if (!
ReadEmissionData(
false, DataPath, emissionRep, Helper, fleetMix, DataCor, headerPollutants, matrixPollutants, idlingValuesPollutants)) {
110 _ceps.insert(std::make_pair(Helper->
getgClass(),
new CEP(
Vehicle, headerFCvalues, matrixFCvalues, headerPollutants, matrixPollutants, idlingValuesFCvalues, idlingValuesPollutants)));
116 return vd.
at(key).
get<
double>();
122 std::string path =
"";
126 std::ifstream vehicleReader;
127 for (std::vector<std::string>::const_iterator i = DataPath.begin(); i != DataPath.end(); i++) {
128 vehicleReader.open(((*i) + emissionClass +
".PHEMLight.veh").c_str());
129 if (vehicleReader.good()) {
133 if (!vehicleReader.good()) {
134 Helper->
setErrMsg(
"File does not exist! (" + emissionClass +
".PHEMLight.veh)");
141 vehicleReader >> json;
143 Helper->
setErrMsg(
"Error during file read! (" + emissionClass +
".PHEMLight.veh)");
149 if (vehDataIt == json.end()) {
150 Helper->
setErrMsg(
"No VehicleData in " + emissionClass +
".PHEMLight.veh!");
154 Vehicle->getVehicleData()->setMassType(vd.
contains(
"MassType") ? vd.
at(
"MassType").
get<std::string>() :
"LV");
155 Vehicle->getVehicleData()->setFuelType(vd.
contains(
"FuelType") ? vd.
at(
"FuelType").
get<std::string>() :
"D");
156 Vehicle->getVehicleData()->setCalcType(vd.
contains(
"CalcType") ? vd.
at(
"CalcType").
get<std::string>() :
"Conv");
167 if (auxDataIt == json.end() || !auxDataIt->contains(
"Pauxnorm")) {
168 Vehicle->getAuxiliariesData()->setPauxnorm(0.);
170 Vehicle->getAuxiliariesData()->setPauxnorm(auxDataIt->at(
"Pauxnorm").get<
double>());
175 if (engDataIt == json.end() || !engDataIt->contains(
"ICEData") || !engDataIt->contains(
"EMData")) {
176 Helper->
setErrMsg(
"Incomplete EngineData in " + emissionClass +
".PHEMLight.veh!");
189 if (rrDataIt == json.end()) {
190 Helper->
setErrMsg(
"No RollingResData in " + emissionClass +
".PHEMLight.veh!");
202 if (trDataIt == json.end()) {
203 Helper->
setErrMsg(
"No TransmissionData in " + emissionClass +
".PHEMLight.veh!");
208 if (transmIt == trDataIt->end()) {
209 Helper->
setErrMsg(std::string(
"Transmission ratios missing in vehicle file! Calculation stopped! (") + path + std::string(
")"));
212 if (!transmIt->contains(
"Speed")) {
213 Helper->
setErrMsg(std::string(
"No Speed signal in transmission data given! Calculation stopped! (") + path + std::string(
")"));
216 if (!transmIt->contains(
"GearRatio")) {
217 Helper->
setErrMsg(std::string(
"No GearRatio signal in transmission data given! Calculation stopped! (") + path + std::string(
")"));
220 if (!transmIt->contains(
"RotMassF")) {
221 Helper->
setErrMsg(std::string(
"No RotMassF signal in transmission data given! Calculation stopped! (") + path + std::string(
")"));
225 Vehicle->getTransmissionData()->setTransm(transmIt->get<std::map<std::string, std::vector<double> > >());
229 if (fldDataIt == json.end()) {
230 Helper->
setErrMsg(
"No FLDData in " + emissionClass +
".PHEMLight.veh!");
239 if (dragIt == fldDataIt->end()) {
240 Helper->
setErrMsg(std::string(
"Drag curve missing in vehicle file! Calculation stopped! (") + path + std::string(
")"));
243 if (!dragIt->contains(
"n_norm")) {
244 Helper->
setErrMsg(std::string(
"No n_norm signal in drag curve data given! Calculation stopped! (") + path + std::string(
")"));
247 if (!dragIt->contains(
"pe_drag_norm")) {
248 Helper->
setErrMsg(std::string(
"No pe_drag_norm signal in drag curve data given! Calculation stopped! (") + path + std::string(
")"));
252 Vehicle->getFLDData()->setDragCurve(dragIt->get<std::map<std::string, std::vector<double> > >());
257 bool CEPHandler::ReadEmissionData(
bool readFC,
const std::vector<std::string>& DataPath,
const std::string& emissionClass,
Helpers* Helper,
bool ,
Correction* DataCor, std::vector<std::string>& header, std::vector<std::vector<double> >& matrix, std::vector<double>& idlingValues) {
260 std::string path =
"";
261 header = std::vector<std::string>();
262 matrix = std::vector<std::vector<double> >();
263 idlingValues = std::vector<double>();
265 std::string pollutantExtension =
"";
267 pollutantExtension += std::string(
"_FC");
270 std::ifstream fileReader;
271 for (std::vector<std::string>::const_iterator i = DataPath.begin(); i != DataPath.end(); i++) {
272 fileReader.open(((*i) + emissionClass + pollutantExtension +
".csv").c_str());
273 if (fileReader.good()) {
277 if (!fileReader.good()) {
278 Helper->
setErrMsg(
"File does not exist! (" + emissionClass + pollutantExtension +
".csv)");
283 if ((line =
ReadLine(fileReader)) !=
"") {
284 const std::vector<std::string>& entries =
split(line,
',');
286 for (
int i = 1; i < (int)entries.size(); i++) {
287 header.push_back(entries[i]);
300 std::vector<std::string> stringIdlings =
split(line,
',');
301 stringIdlings.erase(stringIdlings.begin());
305 while ((line =
ReadLine(fileReader)) !=
"") {
311 Helper->
setErrMsg(
"Error in correction calculation");
320 for (
int i = 0; i < (int)header.size(); i++) {
323 for (
int j = 0; j < (int)matrix.size(); j++) {
324 matrix[j][i + 1] *= CorF;
326 idlingValues[i] *= CorF;
337 std::string emi = Emi;
338 std::transform(emi.begin(), emi.end(), emi.begin(), [](
char c) { return (char)::toupper(c); });
345 if (emi.find(
"NOX") != std::string::npos) {
356 std::vector<std::string> elems;
357 std::stringstream ss(s);
359 while (std::getline(ss, item, delim)) {
360 elems.push_back(item);
366 std::stringstream ss(s);
373 std::vector<double> result;
374 for (std::vector<std::string>::const_iterator i = s.begin(); i != s.end(); ++i) {
382 std::getline(s, line);
383 size_t lastNWChar = line.find_last_not_of(
" \n\r\t");
384 if (lastNWChar != std::string::npos) {
385 line.erase(lastNWChar + 1);
399 return privateVersion;
403 privateVersion = value;
407 return privateVehicleData;
411 privateVehicleData = value;
415 return privateAuxiliariesData;
419 privateAuxiliariesData = value;
423 return privateEngineData;
427 privateEngineData = value;
431 return privateRollingResData;
435 privateRollingResData = value;
439 return privateFLDData;
443 privateFLDData = value;
447 return privateTransmissionData;
451 privateTransmissionData = value;
464 return privateMassType;
468 privateMassType = value;
472 return privateFuelType;
476 privateFuelType = value;
480 return privateCalcType;
484 privateCalcType = value;
496 return privateLoading;
500 privateLoading = value;
504 return privateRedMassWheel;
508 privateRedMassWheel = value;
512 return privateWheelDiameter;
516 privateWheelDiameter = value;
536 return privateMileage;
540 privateMileage = value;
584 return privateICEData;
588 privateICEData = value;
592 return privateEMData;
596 privateEMData = value;
605 return privatePrated;
609 privatePrated = value;
613 return privatenrated;
617 privatenrated = value;
621 return privateIdling;
625 privateIdling = value;
629 return privatePrated;
633 privatePrated = value;
637 return privatenrated;
641 privatenrated = value;
645 return privatePauxnorm;
649 privatePauxnorm = value;
653 return privateP_n_max_v0;
657 privateP_n_max_v0 = value;
661 return privateP_n_max_p0;
665 privateP_n_max_p0 = value;
669 return privateP_n_max_v1;
673 privateP_n_max_v1 = value;
677 return privateP_n_max_p1;
681 privateP_n_max_p1 = value;
685 return privateDragCurve;
689 privateDragCurve = value;
693 setDragCurve(std::map<std::string, std::vector<double> >());
697 return privateAxelRatio;
701 privateAxelRatio = value;
705 return privateTransm;
709 privateTransm = value;
713 setTransm(std::map<std::string, std::vector<double> >());
bool Load(std::vector< std::string > &DataPath, Helpers *Helper, Correction *DataCor, bool fleetMix=false)
const std::map< std::string, CEP * > & getCEPS() const
bool ReadVehicleFile(const std::vector< std::string > &DataPath, const std::string &emissionClass, Helpers *Helper, bool fleetMix, VEHPHEMLightJSON::VEH *&Vehicle)
std::string ReadLine(std::ifstream &s)
std::vector< double > todoubleList(const std::vector< std::string > &s)
double todouble(const std::string &s)
bool CorrectEmissionData(Correction *DataCor, std::vector< std::string > &header, std::vector< std::vector< double > > &matrix, std::vector< double > &idlingValues)
bool CalcCorrection(Correction *DataCor, Helpers *Helper, VEHPHEMLightJSON::Vehicle_Data *vehicle_Data)
std::map< std::string, CEP * > _ceps
bool GetCEP(std::vector< std::string > &DataPath, Helpers *Helper, Correction *DataCor)
const std::vector< std::string > split(const std::string &s, char delim)
double GetDetTempCor(Correction *DataCor, const std::string &Emi)
bool ReadEmissionData(bool readFC, const std::vector< std::string > &DataPath, const std::string &emissionClass, Helpers *Helper, bool fleetMix, Correction *DataCor, std::vector< std::string > &header, std::vector< std::vector< double > > &matrix, std::vector< double > &idlingValues)
bool IniDETfactor(Helpers *Helper)
const bool & getUseTNOx() const
bool IniTNOxfactor(Helpers *Helper)
std::map< std::string, double > DETFactors
const double & getTNOxFactor() const
void setVehMileage(const double &value)
const bool & getUseDet() const
const std::string & getgClass() const
void setErrMsg(const std::string &value)
const double & getPauxnorm() const
void setPauxnorm(const double &value)
const double & getPrated() const
void setPrated(const double &value)
void setnrated(const double &value)
const double & getnrated() const
EM_Data * getEMData() const
ICE_Data * getICEData() const
void setICEData(ICE_Data *value)
void setEMData(EM_Data *value)
void setP_n_max_v0(const double &value)
const double & getP_n_max_p0() const
const double & getP_n_max_p1() const
void setP_n_max_p0(const double &value)
const double & getP_n_max_v0() const
void setP_n_max_p1(const double &value)
std::map< std::string, std::vector< double > > & getDragCurve()
void setP_n_max_v1(const double &value)
void setDragCurve(const std::map< std::string, std::vector< double > > &value)
const double & getP_n_max_v1() const
const double & getnrated() const
const double & getIdling() const
void setIdling(const double &value)
void setPrated(const double &value)
const double & getPrated() const
void setnrated(const double &value)
const double & getFr3() const
const double & getFr4() const
void setFr2(const double &value)
void setFr0(const double &value)
const double & getFr0() const
void setFr1(const double &value)
void setFr3(const double &value)
const double & getFr2() const
void setFr4(const double &value)
const double & getFr1() const
void setAxelRatio(const double &value)
void setTransm(const std::map< std::string, std::vector< double > > &value)
const double & getAxelRatio() const
std::map< std::string, std::vector< double > > & getTransm()
void setTransmissionData(Transmission_Data *value)
void setType(const std::string &value)
Aux_Data * getAuxiliariesData() const
Engine_Data * getEngineData() const
void setVersion(const std::string &value)
void setFLDData(FullLoadDrag_Data *value)
Vehicle_Data * getVehicleData() const
void setVehicleData(Vehicle_Data *value)
void setAuxiliariesData(Aux_Data *value)
const std::string & getType() const
FullLoadDrag_Data * getFLDData() const
Transmission_Data * getTransmissionData() const
void setEngineData(Engine_Data *value)
void setRollingResData(Rollres_Data *value)
Rollres_Data * getRollingResData() const
const std::string & getVersion() const
void setMassType(const std::string &value)
void setLoading(const double &value)
const double & getA() const
const std::string & getMassType() const
const double & getRedMassWheel() const
void setA(const double &value)
void setRedMassWheel(const double &value)
void setMileage(const double &value)
const double & getWheelDiameter() const
void setCw(const double &value)
const double & getCw() const
const double & getLoading() const
const double & getMass() const
const double & getMileage() const
void setWheelDiameter(const double &value)
const std::string & getCalcType() const
const std::string & getFuelType() const
void setFuelType(const std::string &value)
void setMass(const double &value)
void setCalcType(const std::string &value)
C++ TraCI client API implementation.
a class to store JSON values
bool contains(KeyT &&key) const
check the existence of an element in a JSON object
reference at(size_type idx)
access specified array element with bounds checking
auto get() const noexcept(noexcept(std::declval< const basic_json_t & >().template get_impl< ValueType >(detail::priority_tag< 4 > {}))) -> decltype(std::declval< const basic_json_t & >().template get_impl< ValueType >(detail::priority_tag< 4 > {}))
get a (pointer) value (explicit)
a template for a bidirectional iterator for the basic_json class This class implements a both iterato...
double json2double(const nlohmann::json &vd, const std::string &key)