59 MSLane*
const lane,
const double length,
const bool doAdd,
61 MSMoveReminder(
"meandata_" + (lane == nullptr ?
"NULL" : lane->getID()), lane, doAdd),
65 travelledDistance(0) {}
74 #ifdef DEBUG_NOTIFY_ENTER 75 std::cout <<
"\n" <<
SIMTIME <<
" MSMeanData_Net::MSLaneMeanDataValues: veh '" << veh.
getID() <<
"' enters lane '" << enteredLane->
getID() <<
"'" << std::endl;
90 double leaveSpeed = newSpeed, leaveSpeedFront = newSpeed;
93 double timeOnLane =
TS;
98 double timeBeforeEnter = 0.;
99 double timeBeforeEnterBack = 0.;
101 double timeBeforeLeave =
TS;
104 if (oldPos < 0 && newPos >= 0) {
107 timeOnLane =
TS - timeBeforeEnter;
108 frontOnLane = timeOnLane;
116 if (oldBackPos < 0. && newBackPos > 0.) {
118 }
else if (newBackPos <= 0) {
119 timeBeforeEnterBack =
TS;
121 timeBeforeEnterBack = 0.;
130 const double timeAfterLeave =
TS - timeBeforeLeave;
131 timeOnLane -= timeAfterLeave;
145 const double timeAfterLeave =
TS - timeBeforeLeaveFront;
146 frontOnLane -= timeAfterLeave;
154 assert(frontOnLane <=
TS);
155 assert(timeOnLane <=
TS);
157 if (timeOnLane < 0) {
161 if (timeOnLane == 0) {
165 #ifdef DEBUG_NOTIFY_MOVE 166 std::stringstream ss;
169 <<
"\noldPos: " << oldPos
170 <<
"\nnewPos: " << newPos
171 <<
"\noldPosBack: " << oldBackPos
172 <<
"\nnewPosBack: " << newBackPos
173 <<
"\ntimeBeforeEnter: " << timeBeforeEnter
174 <<
"\ntimeBeforeEnterBack: " << timeBeforeEnterBack
175 <<
"\ntimeBeforeLeaveFront: " << timeBeforeLeaveFront
176 <<
"\ntimeBeforeLeave: " << timeBeforeLeave;
177 if (!(timeBeforeLeave >=
MAX2(timeBeforeEnterBack, timeBeforeLeaveFront))
178 || !(timeBeforeEnter <=
MIN2(timeBeforeEnterBack, timeBeforeLeaveFront))) {
181 std::cout << ss.str() << std::endl;
186 assert(timeBeforeEnter <=
MIN2(timeBeforeEnterBack, timeBeforeLeaveFront));
187 assert(timeBeforeLeave >=
MAX2(timeBeforeEnterBack, timeBeforeLeaveFront));
194 double integratedLengthOnLane = 0.;
195 if (timeBeforeEnterBack < timeBeforeLeaveFront) {
200 integratedLengthOnLane += (timeBeforeEnterBack - timeBeforeEnter) * (lengthOnLaneAtBackEnter + lengthOnLaneAtStepStart) * 0.5;
203 integratedLengthOnLane += (timeBeforeLeaveFront - timeBeforeEnterBack) * vehLength;
205 integratedLengthOnLane += (timeBeforeLeave - timeBeforeLeaveFront) * (vehLength + lengthOnLaneAtStepEnd) * 0.5;
206 }
else if (timeBeforeEnterBack >= timeBeforeLeaveFront) {
209 double lengthOnLaneAtLeaveFront;
210 if (timeBeforeLeaveFront == timeBeforeEnter) {
212 lengthOnLaneAtLeaveFront = lengthOnLaneAtStepStart;
213 }
else if (timeBeforeLeaveFront == timeBeforeLeave) {
215 lengthOnLaneAtLeaveFront = lengthOnLaneAtStepEnd;
219 #ifdef DEBUG_NOTIFY_MOVE 220 std::cout <<
"lengthOnLaneAtLeaveFront=" << lengthOnLaneAtLeaveFront << std::endl;
223 integratedLengthOnLane += (timeBeforeLeaveFront - timeBeforeEnter) * (lengthOnLaneAtLeaveFront + lengthOnLaneAtStepStart) * 0.5;
225 integratedLengthOnLane += (timeBeforeEnterBack - timeBeforeLeaveFront) * lengthOnLaneAtLeaveFront;
227 integratedLengthOnLane += (timeBeforeLeave - timeBeforeEnterBack) * (lengthOnLaneAtLeaveFront + lengthOnLaneAtStepEnd) * 0.5;
230 double meanLengthOnLane = integratedLengthOnLane /
TS;
231 #ifdef DEBUG_NOTIFY_MOVE 232 std::cout <<
"Calculated mean length on lane '" <<
myLane->
getID() <<
"' in last step as " << meanLengthOnLane
233 <<
"\nlengthOnLaneAtStepStart=" << lengthOnLaneAtStepStart <<
", lengthOnLaneAtStepEnd=" << lengthOnLaneAtStepEnd <<
", integratedLengthOnLane=" << integratedLengthOnLane
249 notifyMoveInternal(veh, frontOnLane, timeOnLane, (enterSpeed + leaveSpeedFront) / 2., (enterSpeed + leaveSpeed) / 2., travelledDistanceFrontOnLane, travelledDistanceVehicleOnLane, meanLengthOnLane);
292 std::list<TrackerEntry*>::iterator i;
327 myTrackedData[&veh]->myValues->notifyMoveInternal(veh, frontOnLane, timeOnLane, meanSpeedFrontOnLane, meanSpeedVehicleOnLane, travelledDistanceFrontOnLane, travelledDistanceVehicleOnLane, meanLengthOnLane);
336 return myTrackedData[&veh]->myValues->notifyLeave(veh, lastPos, reason);
342 #ifdef DEBUG_NOTIFY_ENTER 343 std::cout <<
"\n" <<
SIMTIME <<
" MSMeanData::MeanDataValueTracker: veh '" << veh.
getID() <<
"' enters lane '" << enteredLane->
getID() <<
"'" << std::endl;
353 if (!
myTrackedData[&veh]->myValues->notifyEnter(veh, reason)) {
373 const double numLanes,
374 const double defaultTravelTime,
376 myCurrentData.front()->myValues->write(dev, period, numLanes,
386 if ((*it)->myNumVehicleEntered == (*it)->myNumVehicleLeft) {
407 const bool useLanes,
const bool withEmpty,
408 const bool printDefaults,
const bool withInternal,
const bool trackVehicles,
409 const double maxTravelTime,
410 const double minSamples,
411 const std::string& vTypes) :
428 for (MSEdgeVector::const_iterator e = edges.begin(); e != edges.end(); ++e) {
429 if ((
myDumpInternal || !(*e)->isInternal()) && !(*e)->isCrossing() && !(*e)->isWalkingArea()) {
431 myMeasures.push_back(std::vector<MeanDataValues*>());
432 const std::vector<MSLane*>& lanes = (*e)->getLanes();
438 data =
createValues(
nullptr, lanes[0]->getLength(),
false);
443 while (s !=
nullptr) {
455 for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) {
458 (*lane)->addMoveReminder(
myMeasures.back().back());
472 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
473 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
484 MSEdgeVector::iterator edge =
myEdges.begin();
485 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
488 while (s !=
nullptr) {
496 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
497 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
506 return edge->
getID();
512 const std::vector<MeanDataValues*>& edgeValues,
517 while (s !=
nullptr) {
522 data->
write(dev, stopTime - startTime,
529 std::vector<MeanDataValues*>::const_iterator lane;
533 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
534 if (!(*lane)->isEmpty()) {
543 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
548 meanData.
reset(
true);
559 meanData.
reset(
true);
562 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
564 meanData.
addTo(*sumData);
601 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
602 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
616 while (numReady-- > 0) {
623 MSEdgeVector::iterator edge =
myEdges.begin();
624 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
625 writeEdge(dev, (*i), *edge, startTime, stopTime);
static double speedAfterTime(const double t, const double oldSpeed, const double dist)
Calculates the speed after a time t [0,TS] given the initial speed and the distance traveled in an i...
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Data collector for edges/lanes.
virtual ~MeanDataValueTracker()
Destructor.
const MSLane * getLane() const
Returns the lane the reminder works on.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
SumoXMLTag
Numbers representing SUMO-XML - element names.
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
std::vector< std::vector< MeanDataValues * > > myMeasures
Value collectors; sorted by edge, then by lane.
begin/end of the description of a single lane
const bool myDumpInternal
Whether internal lanes/edges shall be written.
MeanDataValueTracker(MSLane *const lane, const double length, const MSMeanData *const parent)
Constructor.
virtual bool notifyEnter(SUMOVehicle &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle enters the reminder's lane.
bool vehicleApplies(const SUMOVehicle &veh) const
Checks whether the detector measures vehicles of the given type.
double getSamples() const
Returns the number of collected sample seconds.
const double myMaxTravelTime
the maximum travel time to write
The vehicle arrived at a junction.
T MIN4(T a, T b, T c, T d)
MSLane *const myLane
Lane on which the reminder works.
bool isEmpty() const
Returns whether any data was collected.
Notification
Definition of a vehicle state.
std::string time2string(SUMOTime t)
virtual void write(OutputDevice &dev, const SUMOTime period, const double numLanes, const double defaultTravelTime, const int numVehicles=-1) const =0
Writes output values into the given stream.
weights: time range begin
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
std::map< const SUMOVehicle *, TrackerEntry * > myTrackedData
The map of vehicles to data entries.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
virtual bool isEmpty() const
Returns whether any data was collected.
double getLength() const
Returns the lane's length.
The vehicle changes the segment (meso only)
virtual void notifyMoveInternal(const SUMOVehicle &veh, const double frontOnLane, const double timeOnLane, const double meanSpeedFrontOnLane, const double meanSpeedVehicleOnLane, const double travelledDistanceFrontOnLane, const double travelledDistanceVehicleOnLane, const double meanLengthOnLane)
Internal notification about the vehicle moves.
const std::string & getID() const
Returns the id.
double getLength() const
return the length of the edge
void notifyMoveInternal(const SUMOVehicle &veh, const double frontOnLane, const double timeOnLane, const double meanSpeedFrontOnLane, const double meanSpeedVehicleOnLane, const double travelledDistanceFrontOnLane, const double travelledDistanceVehicleOnLane, const double meanLengthOnLane)
Internal notification about the vehicle moves.
double getSpeedLimit() const
Returns the speed limit of the edge The speed limit of the first lane is retured; should probably be...
#define UNUSED_PARAMETER(x)
std::list< TrackerEntry * > myCurrentData
The currently active meandata "intervals".
virtual MSMeanData::MeanDataValues * createValues(MSLane *const lane, const double length, const bool doAdd) const =0
Create an instance of MeanDataValues.
void addTo(MSMeanData::MeanDataValues &val) const
Add the values of this to the given one and store them there.
bool notifyMove(SUMOVehicle &veh, double oldPos, double newPos, double newSpeed)
Checks whether the reminder still has to be notified about the vehicle moves.
A road/street connecting two junctions.
bool notifyEnter(SUMOVehicle &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Computes current values and adds them to their sums.
const bool myPrintDefaults
Whether empty lanes/edges shall be written.
Representation of a vehicle.
bool notifyLeave(SUMOVehicle &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle leaves the reminder's lane.
Data structure for mean (aggregated) edge/lane values.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >())
Writes an XML header with optional configuration.
MSEdgeVector myEdges
The corresponding first edges.
const bool myAmEdgeBased
Information whether the output shall be edge-based (not lane-based)
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
MSMeanData(const std::string &id, const SUMOTime dumpBegin, const SUMOTime dumpEnd, const bool useLanes, const bool withEmpty, const bool printDefaults, const bool withInternal, const bool trackVehicles, const double minSamples, const double maxTravelTime, const std::string &vTypes)
Constructor.
void addDetector(MSMoveReminder *data)
Adds a data collector for a detector to this segment.
Something on a lane to be noticed about vehicle movement.
const SUMOTime myDumpBegin
The first and the last time step to write information (-1 indicates always)
const double myLaneLength
The length of the lane / edge the data collector is on.
virtual ~MSMeanData()
Destructor.
const double myMinSamples
the minimum sample seconds
virtual void addTo(MeanDataValues &val) const =0
Add the values of this to the given one and store them there.
begin/end of the description of an edge
virtual void openInterval(OutputDevice &dev, const SUMOTime startTime, const SUMOTime stopTime)
Writes the interval opener.
void setDescription(const std::string &description)
static double passingTime(const double lastPos, const double passedPos, const double currentPos, const double lastSpeed, const double currentSpeed)
Calculates the time at which the position passedPosition has been passed In case of a ballistic updat...
virtual ~MeanDataValues()
Destructor.
std::string myID
The name of the object.
const MSMeanData *const myParent
The meandata parent.
void writeXMLOutput(OutputDevice &dev, SUMOTime startTime, SUMOTime stopTime)
Writes collected values into the given stream.
virtual void reset(bool afterWrite=false)=0
Resets values so they may be used for the next interval.
std::list< std::pair< SUMOTime, SUMOTime > > myPendingIntervals
The intervals for which output still has to be generated (only in the tracking case) ...
virtual bool hasArrived() const =0
Returns whether this vehicle has arrived.
virtual void writeXMLDetectorProlog(OutputDevice &dev) const
Opens the XML-output using "netstats" as root element.
A single mesoscopic segment (cell)
virtual void update()
Called if a per timestep update is needed. Default does nothing.
virtual bool writePrefix(OutputDevice &dev, const MeanDataValues &values, const SumoXMLTag tag, const std::string id) const
Checks for emptiness and writes prefix into the given stream.
static MELoop * gMesoNet
mesoscopic simulation infrastructure
double getLength() const
Get vehicle's length [m].
const MSEdgeVector & getEdges() const
Returns loaded edges.
virtual void detectorUpdate(const SUMOTime step)
Updates the detector.
an aggreagated-output interval
Static storage of an output device and its base (abstract) implementation.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
virtual double getSamples() const
Returns the number of collected sample seconds.
static bool gSemiImplicitEulerUpdate
MSEdgeControl & getEdgeControl()
Returns the edge control.
void prepareDetectorForWriting(MSMoveReminder &data)
Updates data of a detector for all vehicle queues.
std::vector< MSEdge * > MSEdgeVector
void resetOnly(SUMOTime stopTime)
Resets network value in order to allow processing of the next interval.
const bool myDumpEmpty
Whether empty lanes/edges shall be written.
MeanDataValues(MSLane *const lane, const double length, const bool doAdd, const MSMeanData *const parent)
Constructor.
void write(OutputDevice &dev, const SUMOTime period, const double numLanes, const double defaultTravelTime, const int numVehicles=-1) const
Writes output values into the given stream.
Data structure for mean (aggregated) edge/lane values for tracked vehicles.
const bool myTrackVehicles
Whether vehicles are tracked.
Representation of a lane in the micro simulation.
void writeEdge(OutputDevice &dev, const std::vector< MeanDataValues *> &edgeValues, MSEdge *edge, SUMOTime startTime, SUMOTime stopTime)
Writes edge values into the given stream.
virtual double getPreviousSpeed() const =0
Returns the vehicle's previous speed.
virtual const std::string & getID() const =0
Get the vehicle's ID.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
virtual std::string getEdgeID(const MSEdge *const edge)
Return the relevant edge id.
virtual bool notifyLeave(SUMOVehicle &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle leaves the reminder's lane.
Base of value-generating classes (detectors)
void init()
Adds the value collectors to all relevant edges.
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
void reset(bool afterWrite)
Resets values so they may be used for the next interval.