66 MSLane*
const lane,
const double length,
const bool doAdd,
68 MSMoveReminder(
"meandata_" + (lane == 0 ?
"NULL" : lane->getID()), lane, doAdd),
72 travelledDistance(0) {}
81 #ifdef DEBUG_NOTIFY_ENTER 82 std::cout <<
"\n" <<
SIMTIME <<
" MSMeanData_Net::MSLaneMeanDataValues: veh '" << veh.
getID() <<
"' enters lane '" << enteredLane->
getID() <<
"'" << std::endl;
97 double leaveSpeed = newSpeed, leaveSpeedFront = newSpeed;
100 double timeOnLane =
TS;
105 double timeBeforeEnter = 0.;
106 double timeBeforeEnterBack = 0.;
108 double timeBeforeLeave =
TS;
111 if (oldPos < 0 && newPos >= 0) {
114 timeOnLane =
TS - timeBeforeEnter;
115 frontOnLane = timeOnLane;
123 if (oldBackPos < 0. && newBackPos > 0.) {
125 }
else if (newBackPos <= 0) {
126 timeBeforeEnterBack =
TS;
128 timeBeforeEnterBack = 0.;
137 const double timeAfterLeave =
TS - timeBeforeLeave;
138 timeOnLane -= timeAfterLeave;
152 const double timeAfterLeave =
TS - timeBeforeLeaveFront;
153 frontOnLane -= timeAfterLeave;
161 assert(frontOnLane <=
TS);
162 assert(timeOnLane <=
TS);
164 if (timeOnLane < 0) {
168 if (timeOnLane == 0) {
172 #ifdef DEBUG_NOTIFY_MOVE 173 std::stringstream ss;
176 <<
"\noldPos: " << oldPos
177 <<
"\nnewPos: " << newPos
178 <<
"\noldPosBack: " << oldBackPos
179 <<
"\nnewPosBack: " << newBackPos
180 <<
"\ntimeBeforeEnter: " << timeBeforeEnter
181 <<
"\ntimeBeforeEnterBack: " << timeBeforeEnterBack
182 <<
"\ntimeBeforeLeaveFront: " << timeBeforeLeaveFront
183 <<
"\ntimeBeforeLeave: " << timeBeforeLeave;
184 if (!(timeBeforeLeave >=
MAX2(timeBeforeEnterBack, timeBeforeLeaveFront))
185 || !(timeBeforeEnter <=
MIN2(timeBeforeEnterBack, timeBeforeLeaveFront))) {
188 std::cout << ss.str() << std::endl;
193 assert(timeBeforeEnter <=
MIN2(timeBeforeEnterBack, timeBeforeLeaveFront));
194 assert(timeBeforeLeave >=
MAX2(timeBeforeEnterBack, timeBeforeLeaveFront));
201 double integratedLengthOnLane = 0.;
202 if (timeBeforeEnterBack < timeBeforeLeaveFront) {
207 integratedLengthOnLane += (timeBeforeEnterBack - timeBeforeEnter) * (lengthOnLaneAtBackEnter + lengthOnLaneAtStepStart) * 0.5;
210 integratedLengthOnLane += (timeBeforeLeaveFront - timeBeforeEnterBack) * vehLength;
212 integratedLengthOnLane += (timeBeforeLeave - timeBeforeLeaveFront) * (vehLength + lengthOnLaneAtStepEnd) * 0.5;
213 }
else if (timeBeforeEnterBack >= timeBeforeLeaveFront) {
216 double lengthOnLaneAtLeaveFront;
217 if (timeBeforeLeaveFront == timeBeforeEnter) {
219 lengthOnLaneAtLeaveFront = lengthOnLaneAtStepStart;
220 }
else if (timeBeforeLeaveFront == timeBeforeLeave) {
222 lengthOnLaneAtLeaveFront = lengthOnLaneAtStepEnd;
226 #ifdef DEBUG_NOTIFY_MOVE 227 std::cout <<
"lengthOnLaneAtLeaveFront=" << lengthOnLaneAtLeaveFront << std::endl;
230 integratedLengthOnLane += (timeBeforeLeaveFront - timeBeforeEnter) * (lengthOnLaneAtLeaveFront + lengthOnLaneAtStepStart) * 0.5;
232 integratedLengthOnLane += (timeBeforeEnterBack - timeBeforeLeaveFront) * lengthOnLaneAtLeaveFront;
234 integratedLengthOnLane += (timeBeforeLeave - timeBeforeEnterBack) * (lengthOnLaneAtLeaveFront + lengthOnLaneAtStepEnd) * 0.5;
237 double meanLengthOnLane = integratedLengthOnLane /
TS;
238 #ifdef DEBUG_NOTIFY_MOVE 239 std::cout <<
"Calculated mean length on lane '" <<
myLane->
getID() <<
"' in last step as " << meanLengthOnLane
240 <<
"\nlengthOnLaneAtStepStart=" << lengthOnLaneAtStepStart <<
", lengthOnLaneAtStepEnd=" << lengthOnLaneAtStepEnd <<
", integratedLengthOnLane=" << integratedLengthOnLane
256 notifyMoveInternal(veh, frontOnLane, timeOnLane, (enterSpeed + leaveSpeedFront) / 2., (enterSpeed + leaveSpeed) / 2., travelledDistanceFrontOnLane, travelledDistanceVehicleOnLane, meanLengthOnLane);
299 std::list<TrackerEntry*>::iterator i;
334 myTrackedData[&veh]->myValues->notifyMoveInternal(veh, frontOnLane, timeOnLane, meanSpeedFrontOnLane, meanSpeedVehicleOnLane, travelledDistanceFrontOnLane, travelledDistanceVehicleOnLane, meanLengthOnLane);
343 return myTrackedData[&veh]->myValues->notifyLeave(veh, lastPos, reason);
349 #ifdef DEBUG_NOTIFY_ENTER 350 std::cout <<
"\n" <<
SIMTIME <<
" MSMeanData::MeanDataValueTracker: veh '" << veh.
getID() <<
"' enters lane '" << enteredLane->
getID() <<
"'" << std::endl;
360 if (!
myTrackedData[&veh]->myValues->notifyEnter(veh, reason)) {
380 const double numLanes,
381 const double defaultTravelTime,
383 myCurrentData.front()->myValues->write(dev, period, numLanes,
393 if ((*it)->myNumVehicleEntered == (*it)->myNumVehicleLeft) {
414 const bool useLanes,
const bool withEmpty,
415 const bool printDefaults,
const bool withInternal,
const bool trackVehicles,
416 const double maxTravelTime,
417 const double minSamples,
418 const std::string& vTypes) :
435 for (MSEdgeVector::const_iterator e = edges.begin(); e != edges.end(); ++e) {
436 if ((
myDumpInternal || !(*e)->isInternal()) && !(*e)->isCrossing() && !(*e)->isWalkingArea()) {
438 myMeasures.push_back(std::vector<MeanDataValues*>());
439 const std::vector<MSLane*>& lanes = (*e)->getLanes();
462 for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) {
465 (*lane)->addMoveReminder(
myMeasures.back().back());
479 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
480 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
491 MSEdgeVector::iterator edge =
myEdges.begin();
492 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
503 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
504 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
513 return edge->
getID();
519 const std::vector<MeanDataValues*>& edgeValues,
529 data->
write(dev, stopTime - startTime,
536 std::vector<MeanDataValues*>::const_iterator lane;
540 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
541 if (!(*lane)->isEmpty()) {
550 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
555 meanData.
reset(
true);
566 meanData.
reset(
true);
569 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
571 meanData.
addTo(*sumData);
608 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
609 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
623 while (numReady-- > 0) {
630 MSEdgeVector::iterator edge =
myEdges.begin();
631 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
632 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...
double getLength() const
return the length of the edge
Data collector for edges/lanes.
virtual ~MeanDataValueTracker()
Destructor.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
SumoXMLTag
Numbers representing SUMO-XML - element names.
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
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.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
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.
double getSpeedLimit() const
Returns the speed limit of the edge The speed limit of the first lane is retured; should probably be...
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.
Notification
Definition of a vehicle state.
weights: time range begin
std::map< const SUMOVehicle *, TrackerEntry * > myTrackedData
The map of vehicles to data entries.
double getLength() const
Returns the lane's length.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
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.
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.
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.
#define UNUSED_PARAMETER(x)
const MSLane * getLane() const
Returns the lane the reminder works on.
std::list< TrackerEntry * > myCurrentData
The currently active meandata "intervals".
virtual bool hasArrived() const =0
Returns whether this vehicle has arrived.
const std::string & getID() const
Returns the id.
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.
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
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)
virtual bool isEmpty() const
Returns whether any data was collected.
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 write(OutputDevice &dev, const SUMOTime period, const double numLanes, const double defaultTravelTime, const int numVehicles=-1) const
Writes output values into the given stream.
void addDetector(MSMoveReminder *data)
Adds a data collector for a detector to this segment.
virtual void writeXMLDetectorProlog(OutputDevice &dev) const
Opens the XML-output using "netstats" as root element.
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 const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
virtual ~MSMeanData()
Destructor.
const double myMinSamples
the minimum sample seconds
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.
bool isEmpty() const
Returns whether any data was collected.
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...
void addTo(MSMeanData::MeanDataValues &val) const
Add the values of this to the given one and store them there.
virtual ~MeanDataValues()
Destructor.
double getLength() const
Get vehicle's length [m].
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 double getPreviousSpeed() const =0
Returns the vehicle's previous speed.
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) ...
void writeEdge(OutputDevice &dev, const std::vector< MeanDataValues * > &edgeValues, MSEdge *edge, SUMOTime startTime, SUMOTime stopTime)
Writes edge values into the given stream.
A single mesoscopic segment (cell)
virtual void update()
Called if a per timestep update is needed. Default does nothing.
virtual double getSamples() const
Returns the number of collected sample seconds.
virtual const std::string & getID() const =0
Get the vehicle's ID.
static MELoop * gMesoNet
mesoscopic simulation infrastructure
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()
Closes the most recently opened tag.
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.
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.
virtual void addTo(MeanDataValues &val) const =0
Add the values of this to the given one and store them there.
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)
const MSEdgeVector & getEdges() const
Returns loaded edges.
void init()
Adds the value collectors to all relevant edges.
void reset(bool afterWrite)
Resets values so they may be used for the next interval.
virtual MSMeanData::MeanDataValues * createValues(MSLane *const lane, const double length, const bool doAdd) const =0
Create an instance of MeanDataValues.