Eclipse SUMO - Simulation of Urban MObility
TrajectoriesHandler.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2014-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
14 // An XML-Handler for amitran and netstate trajectories
15 /****************************************************************************/
16 
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <string>
24 #include <utility>
25 #include <iostream>
28 #include <utils/common/ToString.h>
30 #include <utils/geom/GeomHelper.h>
34 #include "TrajectoriesHandler.h"
35 
36 
37 // ===========================================================================
38 // method definitions
39 // ===========================================================================
40 TrajectoriesHandler::TrajectoriesHandler(const bool computeA, const bool computeAForward,
41  const bool accelZeroCorrection, const SUMOEmissionClass defaultClass,
42  const double defaultSlope, std::ostream* stdOut, OutputDevice* xmlOut)
43  : SUMOSAXHandler(""), myComputeA(computeA), myComputeAForward(computeAForward), myAccelZeroCorrection(accelZeroCorrection), myDefaultClass(defaultClass),
44  myDefaultSlope(defaultSlope), myStdOut(stdOut), myXMLOut(xmlOut), myCurrentTime(-1), myStepSize(TS) {}
45 
46 
48 
49 
50 void
52  const SUMOSAXAttributes& attrs) {
53  bool ok = true;
54  switch (element) {
56  myStepSize = attrs.getFloat("timeStepSize") / 1000.;
57  break;
58  case SUMO_TAG_TIMESTEP:
60  break;
61  case SUMO_TAG_VEHICLE:
62  if (attrs.hasAttribute(SUMO_ATTR_SPEED)) {
63  double v = attrs.getFloat(SUMO_ATTR_SPEED);
64  double a = INVALID_VALUE;
65  double s = INVALID_VALUE;
67  } else {
68  const std::string acId = attrs.getString(SUMO_ATTR_ACTORCONFIG);
69  const std::string id = attrs.getString(SUMO_ATTR_ID);
70  if (myEmissionClassByType.count(acId) == 0) {
71  WRITE_WARNING("Unknown actor configuration '" + acId + "' for vehicle '" + id + "'!");
72  } else {
74  }
75  }
76  break;
77  case SUMO_TAG_ACTORCONFIG: {
78  const std::string id = attrs.getString(SUMO_ATTR_ID);
79  const std::string vClass = attrs.getString(SUMO_ATTR_VEHICLECLASS);
80  const std::string fuel = attrs.getString(SUMO_ATTR_FUEL);
81  const std::string eClass = attrs.getString(SUMO_ATTR_EMISSIONCLASS);
82  const double weight = attrs.getOpt<double>(SUMO_ATTR_WEIGHT, id.c_str(), ok, 0.) * 10.;
83  myEmissionClassByType[id] = PollutantsInterface::getClass(myDefaultClass, vClass, fuel, eClass, weight);
84  break;
85  }
86  case SUMO_TAG_MOTIONSTATE: {
87  const std::string id = attrs.getString(SUMO_ATTR_VEHICLE);
88  if (myEmissionClassByVehicle.count(id) == 0) {
89  WRITE_WARNING("Motion state for unknown vehicle '" + id + "'!");
91  }
93  double v = attrs.getFloat(SUMO_ATTR_SPEED) / 100.;
94  double a = attrs.hasAttribute(SUMO_ATTR_ACCELERATION) ? attrs.get<double>(SUMO_ATTR_ACCELERATION, id.c_str(), ok) / 1000. : INVALID_VALUE;
95  double s = attrs.hasAttribute(SUMO_ATTR_SLOPE) ? RAD2DEG(asin(attrs.get<double>(SUMO_ATTR_SLOPE, id.c_str(), ok) / 10000.)) : INVALID_VALUE;
96  const SUMOTime time = attrs.getOpt<int>(SUMO_ATTR_TIME, id.c_str(), ok, INVALID_VALUE);
97  if (myXMLOut != nullptr) {
98  writeXMLEmissions(id, c, time, v, a, s);
99  }
100  if (myStdOut != nullptr) {
101  writeEmissions(*myStdOut, id, c, STEPS2TIME(time), v, a, s);
102  }
103  break;
104  }
105  default:
106  break;
107  }
108 }
109 
110 
113  double& v, double& a, double& s) {
114 
115  if (myComputeA) {
116  if (myLastV.count(id) == 0) {
117  a = 0.;
118  } else {
119  a = v - myLastV[id];
120  }
121  myLastV[id] = v;
122  if (myComputeAForward) {
123  v -= a;
124  }
125  }
126  if (myAccelZeroCorrection) {
128  }
129  if (a == INVALID_VALUE) {
130  throw ProcessError("Acceleration information is missing; try running with --compute-a.");
131  }
132  if (s == INVALID_VALUE) {
133  s = myDefaultSlope;
134  }
136  mySums[id].addScaled(result, myStepSize);
137  if (id != "") {
138  mySums[""].addScaled(result, myStepSize);
139  }
140  return result;
141 }
142 
143 
144 bool
145 TrajectoriesHandler::writeEmissions(std::ostream& o, const std::string id,
146  const SUMOEmissionClass c,
147  double t, double& v,
148  double& a, double& s) {
149  if (myComputeA && myLastV.count(id) == 0) {
150  myLastV[id] = v;
151  myLastSlope[id] = s;
152  return false;
153  }
154  if (myComputeAForward) {
155  t -= TS;
156  const double nextS = s;
157  s = myLastSlope[id];
158  myLastSlope[id] = nextS;
159  }
160  const PollutantsInterface::Emissions e = computeEmissions(id, c, v, a, s);
161  o << t << ";" << v << ";" << a << ";" << s << ";"
162  << e.CO << ";" << e.CO2 << ";" << e.HC << ";" << e.PMx << ";"
163  << e.NOx << ";" << e.fuel << ";" << e.electricity << std::endl;
164  return true;
165 }
166 
167 
168 bool
170  const SUMOEmissionClass c,
171  SUMOTime t, double& v,
172  double a, double s) {
173  if (myComputeA && myLastV.count(id) == 0) {
174  myLastV[id] = v;
175  return false;
176  }
177  if (myCurrentTime != t) {
178  if (myCurrentTime != -1) {
179  myXMLOut->closeTag();
180  }
181  myCurrentTime = t;
183  }
184  const PollutantsInterface::Emissions e = computeEmissions(id, c, v, a, s);
185  myXMLOut->openTag("vehicle").writeAttr("id", id).writeAttr("eclass", PollutantsInterface::getName(c));
186  myXMLOut->writeAttr("CO2", e.CO2).writeAttr("CO", e.CO).writeAttr("HC", e.HC).writeAttr("NOx", e.NOx);
187  myXMLOut->writeAttr("PMx", e.PMx).writeAttr("fuel", e.fuel).writeAttr("electricity", e.electricity);
188  myXMLOut->writeAttr("speed", v).closeTag();
189  return true;
190 }
191 
192 
193 void
194 TrajectoriesHandler::writeSums(std::ostream& o, const std::string id) {
195  o << "CO:" << mySums[id].CO << std::endl
196  << "CO2:" << mySums[id].CO2 << std::endl
197  << "HC:" << mySums[id].HC << std::endl
198  << "NOx:" << mySums[id].NOx << std::endl
199  << "PMx:" << mySums[id].PMx << std::endl
200  << "fuel:" << mySums[id].fuel << std::endl
201  << "electricity:" << mySums[id].electricity << std::endl;
202 }
203 
204 
205 void
206 TrajectoriesHandler::writeNormedSums(std::ostream& o, const std::string id, const double factor) {
207  o << mySums[id].fuel / factor << ","
208  << mySums[id].electricity / factor << ","
209  << mySums[id].CO2 / factor << ","
210  << mySums[id].NOx / factor << ","
211  << mySums[id].CO / factor << ","
212  << mySums[id].HC / factor << ","
213  << mySums[id].PMx / factor << std::endl;
214 }
215 
216 
217 /****************************************************************************/
TrajectoriesHandler::~TrajectoriesHandler
~TrajectoriesHandler()
Destructor.
Definition: TrajectoriesHandler.cpp:47
ToString.h
SUMO_ATTR_ACCELERATION
Definition: SUMOXMLDefinitions.h:892
SUMOSAXAttributes::hasAttribute
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
WRITE_WARNING
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:275
PollutantsInterface::Emissions::PMx
double PMx
Definition: PollutantsInterface.h:67
TrajectoriesHandler::myEmissionClassByVehicle
std::map< std::string, SUMOEmissionClass > myEmissionClassByVehicle
Definition: TrajectoriesHandler.h:107
TrajectoriesHandler::myStdOut
std::ostream * myStdOut
Definition: TrajectoriesHandler.h:99
TrajectoriesHandler::computeEmissions
const PollutantsInterface::Emissions computeEmissions(const std::string id, const SUMOEmissionClass c, double &v, double &a, double &s)
Definition: TrajectoriesHandler.cpp:112
SUMOSAXAttributes::getString
virtual std::string getString(int id) const =0
Returns the string-value of the named (by its enum-value) attribute.
SUMOSAXHandler
SAX-handler base for SUMO-files.
Definition: SUMOSAXHandler.h:41
OutputDevice
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:63
PollutantsInterface::Emissions::CO
double CO
Definition: PollutantsInterface.h:63
TrajectoriesHandler::writeXMLEmissions
bool writeXMLEmissions(const std::string id, const SUMOEmissionClass c, SUMOTime t, double &v, double a=INVALID_VALUE, double s=INVALID_VALUE)
Definition: TrajectoriesHandler.cpp:169
SUMOSAXAttributes::get
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
Definition: SUMOSAXAttributes.h:492
SUMO_ATTR_VEHICLE
Definition: SUMOXMLDefinitions.h:888
MsgHandler.h
TrajectoriesHandler::myComputeA
const bool myComputeA
Definition: TrajectoriesHandler.h:94
SUMOSAXHandler.h
TrajectoriesHandler::myAccelZeroCorrection
const bool myAccelZeroCorrection
Definition: TrajectoriesHandler.h:96
SUMOTime
long long int SUMOTime
Definition: SUMOTime.h:34
TrajectoriesHandler::INVALID_VALUE
static const int INVALID_VALUE
Definition: TrajectoriesHandler.h:41
SUMOEmissionClass
int SUMOEmissionClass
Definition: SUMOVehicleClass.h:231
RAD2DEG
#define RAD2DEG(x)
Definition: GeomHelper.h:38
SUMO_ATTR_SPEED
Definition: SUMOXMLDefinitions.h:384
SUMO_ATTR_ID
Definition: SUMOXMLDefinitions.h:378
SUMOSAXAttributes::getFloat
virtual double getFloat(int id) const =0
Returns the double-value of the named (by its enum-value) attribute.
PollutantsInterface::getName
static std::string getName(const SUMOEmissionClass c)
Checks whether the string describes a known vehicle class.
Definition: PollutantsInterface.cpp:99
SUMOSAXAttributes::getSUMOTimeReporting
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
Definition: SUMOSAXAttributes.cpp:63
TrajectoriesHandler::writeEmissions
bool writeEmissions(std::ostream &o, const std::string id, const SUMOEmissionClass c, double t, double &v, double &a, double &s)
Definition: TrajectoriesHandler.cpp:145
TrajectoriesHandler::myLastSlope
std::map< std::string, double > myLastSlope
Definition: TrajectoriesHandler.h:102
SUMO_ATTR_WEIGHT
Definition: SUMOXMLDefinitions.h:421
OutputDevice::closeTag
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
Definition: OutputDevice.cpp:253
TrajectoriesHandler::myCurrentTime
SUMOTime myCurrentTime
Definition: TrajectoriesHandler.h:103
PollutantsInterface::getModifiedAccel
static double getModifiedAccel(const SUMOEmissionClass c, const double v, const double a, const double slope)
Returns the adapted acceleration value, useful for comparing with external PHEMlight references.
Definition: PollutantsInterface.cpp:170
OutputDevice::writeAttr
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:255
PollutantsInterface::getClass
static SUMOEmissionClass getClass(const SUMOEmissionClass base, const std::string &vClass, const std::string &fuel, const std::string &eClass, const double weight)
Returns the emission class fittig the given parameters.
Definition: PollutantsInterface.cpp:117
TrajectoriesHandler::myDefaultSlope
const double myDefaultSlope
Definition: TrajectoriesHandler.h:98
PollutantsInterface::Emissions::CO2
double CO2
Definition: PollutantsInterface.h:62
PollutantsInterface.h
SUMO_TAG_ACTORCONFIG
Definition: SUMOXMLDefinitions.h:322
TS
#define TS
Definition: SUMOTime.h:43
STEPS2TIME
#define STEPS2TIME(x)
Definition: SUMOTime.h:56
OutputDevice.h
ProcessError
Definition: UtilExceptions.h:39
PollutantsInterface::computeAll
static Emissions computeAll(const SUMOEmissionClass c, const double v, const double a, const double slope, const std::map< int, double > *param=0)
Returns the amount of all emitted pollutants given the vehicle type and state (in mg/s or ml/s for fu...
Definition: PollutantsInterface.cpp:154
time2string
std::string time2string(SUMOTime t)
Definition: SUMOTime.cpp:67
SUMO_TAG_MOTIONSTATE
Definition: SUMOXMLDefinitions.h:323
UtilExceptions.h
SUMOSAXAttributes::getOpt
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue, bool report=true) const
Tries to read given attribute assuming it is an int.
Definition: SUMOSAXAttributes.h:518
SUMO_TAG_VEHICLE
description of a vehicle
Definition: SUMOXMLDefinitions.h:119
SUMO_ATTR_TIME
trigger: the time of the step
Definition: SUMOXMLDefinitions.h:676
PollutantsInterface::Emissions::electricity
double electricity
Definition: PollutantsInterface.h:68
TrajectoriesHandler::myXMLOut
OutputDevice * myXMLOut
Definition: TrajectoriesHandler.h:100
OutputDevice::openTag
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
Definition: OutputDevice.cpp:239
PollutantsInterface::Emissions::NOx
double NOx
Definition: PollutantsInterface.h:66
SUMO_TAG_TIMESTEP
Definition: SUMOXMLDefinitions.h:320
TrajectoriesHandler::myEmissionClassByType
std::map< std::string, SUMOEmissionClass > myEmissionClassByType
Definition: TrajectoriesHandler.h:106
PollutantsInterface::Emissions
Storage for collected values of all emission types.
Definition: PollutantsInterface.h:61
TrajectoriesHandler::myDefaultClass
const SUMOEmissionClass myDefaultClass
Definition: TrajectoriesHandler.h:97
SUMO_ATTR_FUEL
Definition: SUMOXMLDefinitions.h:891
PollutantsInterface::Emissions::HC
double HC
Definition: PollutantsInterface.h:64
TrajectoriesHandler::myComputeAForward
const bool myComputeAForward
Definition: TrajectoriesHandler.h:95
SUMO_ATTR_VEHICLECLASS
Definition: SUMOXMLDefinitions.h:890
SUMO_TAG_TRAJECTORIES
Definition: SUMOXMLDefinitions.h:319
config.h
TrajectoriesHandler::myLastV
std::map< std::string, double > myLastV
Definition: TrajectoriesHandler.h:101
TrajectoriesHandler::myStepSize
double myStepSize
Definition: TrajectoriesHandler.h:104
GeomHelper.h
TrajectoriesHandler::writeSums
void writeSums(std::ostream &o, const std::string id)
Definition: TrajectoriesHandler.cpp:194
TrajectoriesHandler::writeNormedSums
void writeNormedSums(std::ostream &o, const std::string id, const double factor)
Definition: TrajectoriesHandler.cpp:206
TrajectoriesHandler::mySums
std::map< std::string, PollutantsInterface::Emissions > mySums
Definition: TrajectoriesHandler.h:105
PollutantsInterface::Emissions::fuel
double fuel
Definition: PollutantsInterface.h:65
TrajectoriesHandler::TrajectoriesHandler
TrajectoriesHandler(const bool computeA, const bool computeAForward, const bool accelZeroCorrection, const SUMOEmissionClass defaultClass, const double defaultSlope, std::ostream *stdOut, OutputDevice *xmlOut)
Constructor.
Definition: TrajectoriesHandler.cpp:40
SUMOSAXAttributes
Encapsulated SAX-Attributes.
Definition: SUMOSAXAttributes.h:56
SUMO_ATTR_SLOPE
Definition: SUMOXMLDefinitions.h:875
SUMO_ATTR_EMISSIONCLASS
Definition: SUMOXMLDefinitions.h:795
SUMOXMLDefinitions.h
TrajectoriesHandler::myStartElement
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called when an opening-tag occurs.
Definition: TrajectoriesHandler.cpp:51
TrajectoriesHandler.h
SUMO_ATTR_ACTORCONFIG
Definition: SUMOXMLDefinitions.h:887