49 myCollector(collector), myPosition(crossSection.myPosition) {}
54 double newPos,
double newSpeed) {
65 const double fractionTimeOnDet =
TS - timeBeforeEnter;
95 double newPos,
double newSpeed) {
105 const double leaveTimeFront =
SIMTIME -
TS + timeBeforeLeave;
115 const double leaveStep =
SIMTIME;
142 double haltingSpeedThreshold,
144 const std::string& vTypes)
182 const double speedFraction = veh.
getSpeed() * fractionTimeOnDet;
225 const double speedFraction = veh.
getSpeed() * (
TS - fractionTimeOnDet);
244 dev <<
" <interval begin=\"" <<
time2string(startTime) <<
"\" end=\"" <<
time2string(stopTime) <<
"\" " <<
"id=\"" <<
myID <<
"\" ";
247 double meanTravelTime = 0.;
248 double meanOverlapTravelTime = 0.;
249 double meanSpeed = 0.;
250 double meanHaltsPerVehicle = 0.;
251 double meanTimeLoss = 0.;
253 meanHaltsPerVehicle += (double)(*i).second.haltings;
254 meanTravelTime += (*i).second.frontLeaveTime - (*i).second.entryTime;
255 const double steps = (*i).second.backLeaveTime - (*i).second.entryTime;
256 meanOverlapTravelTime += steps;
257 meanSpeed += ((*i).second.speedSum / steps);
258 meanTimeLoss +=
STEPS2TIME((*i).second.timeLoss);
260 meanTravelTime = vehicleSum != 0 ? meanTravelTime / (double)vehicleSum : -1;
261 meanOverlapTravelTime = vehicleSum != 0 ? meanOverlapTravelTime / (double)vehicleSum : -1;
262 meanSpeed = vehicleSum != 0 ? meanSpeed / (double)vehicleSum : -1;
263 meanHaltsPerVehicle = vehicleSum != 0 ? meanHaltsPerVehicle / (double) vehicleSum : -1;
264 meanTimeLoss = vehicleSum != 0 ? meanTimeLoss / (double) vehicleSum : -1;
270 double meanSpeedWithin = 0.;
271 double meanDurationWithin = 0.;
272 double meanHaltsPerVehicleWithin = 0.;
273 double meanIntervalSpeedWithin = 0.;
274 double meanIntervalHaltsPerVehicleWithin = 0.;
275 double meanIntervalDurationWithin = 0.;
276 double meanTimeLossWithin = 0.;
278 meanHaltsPerVehicleWithin += (double)(*i).second.haltings;
279 meanIntervalHaltsPerVehicleWithin += (
double)(*i).second.intervalHaltings;
280 const double end = (*i).second.backLeaveTime == 0 ?
STEPS2TIME(stopTime) : (*i).second.backLeaveTime;
281 const double time = end - (*i).second.entryTime;
282 const double timeWithin =
MIN2(time, end -
STEPS2TIME(startTime));
283 if (i->second.speedSum > 0.) {
284 meanSpeedWithin += i->second.speedSum / time;
286 if (i->second.intervalSpeedSum > 0.) {
287 meanIntervalSpeedWithin += i->second.intervalSpeedSum / timeWithin;
289 meanDurationWithin += time;
290 meanIntervalDurationWithin += timeWithin;
292 (*i).second.intervalHaltings = 0;
293 (*i).second.intervalSpeedSum = 0;
296 const SUMOTime currentTimeLoss =
static_cast<const MSVehicle*
>(i->first)->getTimeLoss();
297 meanTimeLossWithin +=
STEPS2TIME(currentTimeLoss - (*i).second.intervalTimeLoss);
298 (*i).second.intervalTimeLoss = currentTimeLoss;
302 meanSpeedWithin = vehicleSumWithin != 0 ? meanSpeedWithin / (double) vehicleSumWithin : -1;
303 meanHaltsPerVehicleWithin = vehicleSumWithin != 0 ? meanHaltsPerVehicleWithin / (double) vehicleSumWithin : -1;
304 meanDurationWithin = vehicleSumWithin != 0 ? meanDurationWithin / (double) vehicleSumWithin : -1;
305 meanIntervalSpeedWithin = vehicleSumWithin != 0 ? meanIntervalSpeedWithin / (double) vehicleSumWithin : -1;
306 meanIntervalHaltsPerVehicleWithin = vehicleSumWithin != 0 ? meanIntervalHaltsPerVehicleWithin / (double) vehicleSumWithin : -1;
307 meanIntervalDurationWithin = vehicleSumWithin != 0 ? meanIntervalDurationWithin / (double) vehicleSumWithin : -1;
308 meanTimeLossWithin = vehicleSumWithin != 0 ? meanTimeLossWithin / (double) vehicleSumWithin : -1;
311 dev <<
"meanTravelTime=\"" << meanTravelTime
312 <<
"\" meanOverlapTravelTime=\"" << meanOverlapTravelTime
313 <<
"\" meanSpeed=\"" << meanSpeed
314 <<
"\" meanHaltsPerVehicle=\"" << meanHaltsPerVehicle
315 <<
"\" meanTimeLoss=\"" << meanTimeLoss
316 <<
"\" vehicleSum=\"" << vehicleSum
317 <<
"\" meanSpeedWithin=\"" << meanSpeedWithin
318 <<
"\" meanHaltsPerVehicleWithin=\"" << meanHaltsPerVehicleWithin
319 <<
"\" meanDurationWithin=\"" << meanDurationWithin
320 <<
"\" vehicleSumWithin=\"" << vehicleSumWithin
321 <<
"\" meanIntervalSpeedWithin=\"" << meanIntervalSpeedWithin
322 <<
"\" meanIntervalHaltsPerVehicleWithin=\"" << meanIntervalHaltsPerVehicleWithin
323 <<
"\" meanIntervalDurationWithin=\"" << meanIntervalDurationWithin
324 <<
"\" meanTimeLossWithin=\"" << meanTimeLossWithin
385 std::vector<std::string>
387 std::vector<std::string> ret;
389 ret.push_back((*pair).first->getID());
391 std::sort(ret.begin(), ret.end());
double intervalSpeedSum
The sum of registered speeds the vehicle has/had inside the area during the current interval...
Representation of a vehicle in the micro simulation.
bool notifyMove(SUMOVehicle &veh, double, double newPos, double)
Checks whether the vehicle enters.
int haltings
The sum of haltings the vehicle has/had within the area.
int getCurrentHaltingNumber() const
Returns the number of current haltings within the area.
void enter(const SUMOVehicle &veh, const double entryTimestep, const double fractionTimeOnDet)
Called if a vehicle touches an entry-cross-section.
virtual ~MSE3Collector()
Destructor.
A simple description of a position on a lane (crossing of a lane)
std::vector< MSE3EntryReminder * > myEntryReminders
The detector's built entry reminder.
bool hadUpdate
An internal information whether the update step was performed.
A place on the road net (at a certain lane and position on it) where the E3 area ends.
MSE3EntryReminder(const MSCrossSection &crossSection, MSE3Collector &collector)
Constructor.
A place on the road net (at a certain lane and position on it) where the E3 area begins.
MSLane *const myLane
Lane on which the reminder works.
double myHaltingSpeedThreshold
Speed-threshold to determine if a vehicle is halting.
Notification
Definition of a vehicle state.
std::string time2string(SUMOTime t)
std::vector< MSCrossSection > CrossSectionVector
double frontLeaveTime
The time the vehicle's front was crossing the leave line.
double myCurrentMeanSpeed
The current mean speed of known vehicles (inside)
CrossSectionVector::const_iterator CrossSectionVectorConstIt
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
SUMOTime myLastResetTime
Information when the last reset has been done.
std::vector< std::string > getCurrentVehicleIDs() const
Returns the number of vehicles within the area.
MSE3Collector(const std::string &id, const CrossSectionVector &entries, const CrossSectionVector &exits, double haltingSpeedThreshold, SUMOTime haltingTimeThreshold, const std::string &vTypes)
Constructor.
const std::string & getID() const
Returns the id.
std::vector< MSE3LeaveReminder * > myLeaveReminders
The detector's built exit reminder.
bool notifyLeave(SUMOVehicle &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Processes state changes of a vehicle.
#define WRITE_WARNING(msg)
double backLeaveTime
The time the vehicle's back was crossing the leave line.
int myCurrentHaltingsNumber
The current number of haltings (inside)
The vehicle changes lanes (micro only)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Representation of a vehicle.
std::map< const SUMOVehicle *, E3Values > myEnteredContainer
Container for vehicles that have entered the area.
Internal storage for values from a vehicle.
double entryTime
The vehicle's entry time.
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.
double getCurrentMeanSpeed() const
Returns the mean speed within the area.
SUMOTime myHaltingTimeThreshold
The vehicle arrived at its destination (is deleted)
MSE3Collector & myCollector
The parent collector.
Something on a lane to be noticed about vehicle movement.
bool notifyMove(SUMOVehicle &veh, double oldPos, double newPos, double)
Checks whether the vehicle leaves.
MSE3LeaveReminder(const MSCrossSection &crossSection, MSE3Collector &collector)
Constructor.
void leaveFront(const SUMOVehicle &veh, const double leaveTimestep)
Called if a vehicle front passes a leave-cross-section.
void leave(const SUMOVehicle &veh, const double leaveTimestep, const double fractionTimeOnDet)
Called if a vehicle back passes a leave-cross-section.
SUMOTime intervalTimeLoss
The timeLoss of the vehicle when entering. Updated to the current timeLoss at interval write...
CrossSectionVector myEntries
The detector's entries.
double myPosition
The position on the lane.
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...
std::string myID
The name of the object.
double speedSum
The sum of registered speeds the vehicle has/had inside the area.
bool notifyLeave(SUMOVehicle &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Processes state changes of a vehicle.
double getLength() const
Get vehicle's length [m].
void reset()
Resets all generated values to allow computation of next interval.
A detector of vehicles passing an area between entry/exit points.
int intervalHaltings
The sum of haltings the vehicle has/had within the area during the current interval.
Static storage of an output device and its base (abstract) implementation.
static bool gSemiImplicitEulerUpdate
int getVehiclesWithin() const
Returns the number of vehicles within the area.
void detectorUpdate(const SUMOTime step)
Computes the detector values in each time step.
virtual double getSpeed() const =0
Returns the vehicle's current speed.
Representation of a lane in the micro simulation.
double haltingBegin
Begin time of last halt begin.
virtual double getPreviousSpeed() const =0
Returns the vehicle's previous speed.
virtual const std::string & getID() const =0
Get the vehicle's ID.
void writeXMLOutput(OutputDevice &dev, SUMOTime startTime, SUMOTime stopTime)
Writes collected values into the given stream.
MSE3Collector & myCollector
The parent collector.
SUMOTime timeLoss
The timeLoss of the vehicle when entering. Updated to the actual time loss within the area when leavi...
Base of value-generating classes (detectors)
double myPosition
The position on the lane.
The vehicle is being teleported.
CrossSectionVector myExits
The detector's exits.
void writeXMLDetectorProlog(OutputDevice &dev) const
Opens the XML-output using "e3Detector" as root element.
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
std::map< const SUMOVehicle *, E3Values > myLeftContainer
Container for vehicles that have left the area.