void MSE3Collector::leave(const SUMOVehicle& veh, const double leaveTimestep, const double fractionTimeOnDet) { if (!vehicleApplies(veh)) { return; } if (myEnteredContainer.find(&veh) == myEnteredContainer.end()) { if (!myOpenEntry) { WRITE_WARNING("Vehicle '" + veh.getID() + "' left " + toString(SUMO_TAG_E3DETECTOR) + " '" + getID() + "' without entering it."); } } else { E3Values values = myEnteredContainer[&veh]; values.backLeaveTime = leaveTimestep; const double speedFraction = veh.getSpeed() * (TS - fractionTimeOnDet); values.speedSum -= speedFraction; values.intervalSpeedSum -= speedFraction; if (MSGlobals::gUseMesoSim) { // not yet supported values.timeLoss = 0; } else { // timeLoss was initialized when entering values.timeLoss = static_cast<const MSVehicle&>(veh).getTimeLoss() - values.timeLoss; } myEnteredContainer.erase(&veh); myLeftContainer.push_back(values); } }
bool MSMeanData_Net::MSLaneMeanDataValues::notifyLeave(SUMOVehicle& veh, SUMOReal /*lastPos*/, MSMoveReminder::Notification reason) { if (vehicleApplies(veh) && (getLane() == 0 || getLane() == static_cast<MSVehicle&>(veh).getLane())) { #ifdef HAVE_INTERNAL if (MSGlobals::gUseMesoSim) { myLastVehicleUpdateValues.erase(&veh); } #endif if (reason == MSMoveReminder::NOTIFICATION_ARRIVED) { ++nVehArrived; } else if (reason == MSMoveReminder::NOTIFICATION_LANE_CHANGE) { ++nVehLaneChangeFrom; } else if (myParent == 0 || reason != MSMoveReminder::NOTIFICATION_SEGMENT) { ++nVehLeft; if (reason == MSMoveReminder::NOTIFICATION_VAPORIZED) { ++nVehVaporized; } } } #ifdef HAVE_INTERNAL if (MSGlobals::gUseMesoSim) { return false; } #endif return reason == MSMoveReminder::NOTIFICATION_JUNCTION; }
void MSE3Collector::enter(const SUMOVehicle& veh, const double entryTimestep, const double fractionTimeOnDet) { if (!vehicleApplies(veh)) { return; } if (myEnteredContainer.find(&veh) != myEnteredContainer.end()) { WRITE_WARNING("Vehicle '" + veh.getID() + "' reentered " + toString(SUMO_TAG_E3DETECTOR) + " '" + getID() + "'."); return; } const double speedFraction = veh.getSpeed() * fractionTimeOnDet; E3Values v; v.entryTime = entryTimestep; v.frontLeaveTime = 0; v.backLeaveTime = 0; v.speedSum = speedFraction; v.haltingBegin = veh.getSpeed() < myHaltingSpeedThreshold ? entryTimestep : -1; v.intervalSpeedSum = entryTimestep >= STEPS2TIME(myLastResetTime) ? speedFraction : 0; v.haltings = 0; v.intervalHaltings = 0; if (veh.getSpeed() < myHaltingSpeedThreshold) { if (fractionTimeOnDet > myHaltingTimeThreshold) { v.haltings++; v.intervalHaltings++; } } v.hadUpdate = false; if (!MSGlobals::gUseMesoSim) { v.timeLoss = static_cast<const MSVehicle&>(veh).getTimeLoss(); v.intervalTimeLoss = v.timeLoss; } myEnteredContainer[&veh] = v; }
bool MSMeanData_Amitran::MSLaneMeanDataValues::notifyEnter(SUMOVehicle& veh, MSMoveReminder::Notification reason) { if (vehicleApplies(veh)) { if (getLane() == 0 || getLane() == static_cast<MSVehicle&>(veh).getLane()) { if (reason == MSMoveReminder::NOTIFICATION_DEPARTED || reason == MSMoveReminder::NOTIFICATION_JUNCTION) { ++amount; typedAmount[&veh.getVehicleType()]++; } } return true; } return false; }
void MSE3Collector::leaveFront(const SUMOVehicle& veh, const double leaveTimestep) { if (!vehicleApplies(veh)) { return; } if (myEnteredContainer.find(&veh) == myEnteredContainer.end()) { if (!myOpenEntry) { WRITE_WARNING("Vehicle '" + veh.getID() + "' left " + toString(SUMO_TAG_E3DETECTOR) + " '" + getID() + "' without entering it."); } } else { myEnteredContainer[&veh].frontLeaveTime = leaveTimestep; } }
bool MSMeanData_Net::MSLaneMeanDataValues::notifyEnter(SUMOVehicle& veh, MSMoveReminder::Notification reason) { if (vehicleApplies(veh)) { if (getLane() == 0 || getLane() == static_cast<MSVehicle&>(veh).getLane()) { if (reason == MSMoveReminder::NOTIFICATION_DEPARTED) { ++nVehDeparted; } else if (reason == MSMoveReminder::NOTIFICATION_LANE_CHANGE) { ++nVehLaneChangeTo; } else if (myParent == 0 || reason != MSMoveReminder::NOTIFICATION_SEGMENT) { ++nVehEntered; } } return true; } return false; }
bool MSInstantInductLoop::notifyMove(SUMOTrafficObject& veh, double oldPos, double newPos, double newSpeed) { if (!vehicleApplies(veh)) { return false; } if (newPos < myPosition) { // detector not reached yet return true; } const double oldSpeed = veh.getPreviousSpeed(); double enterSpeed = MSGlobals::gSemiImplicitEulerUpdate ? newSpeed : oldSpeed; // NOTE: For the euler update, the vehicle is assumed to travel at constant speed for the whole time step if (newPos >= myPosition && oldPos < myPosition/* && static_cast<MSVehicle&>(veh).getLane() == myLane*/) { const double timeBeforeEnter = MSCFModel::passingTime(oldPos, myPosition, newPos, oldSpeed, newSpeed); const double entryTime = SIMTIME - TS + timeBeforeEnter; enterSpeed = MSCFModel::speedAfterTime(timeBeforeEnter, oldSpeed, newPos - oldPos); if (myLastExitTime >= 0) { write("enter", entryTime, veh, enterSpeed, "gap", entryTime - myLastExitTime); } else { write("enter", entryTime, veh, enterSpeed); } myEntryTimes[&veh] = entryTime; } const double newBackPos = newPos - veh.getVehicleType().getLength(); const double oldBackPos = oldPos - veh.getVehicleType().getLength(); if (newBackPos > myPosition) { std::map<SUMOTrafficObject*, double>::iterator i = myEntryTimes.find(&veh); if (i != myEntryTimes.end()) { // vehicle passed the detector const double timeBeforeLeave = MSCFModel::passingTime(oldBackPos, myPosition, newBackPos, oldSpeed, newSpeed); const double leaveTime = SIMTIME - TS + timeBeforeLeave; write("leave", leaveTime, veh, newSpeed, "occupancy", leaveTime - (*i).second); myEntryTimes.erase(i); myLastExitTime = leaveTime; } return false; } // vehicle stays on the detector write("stay", SIMTIME, veh, newSpeed); return true; }
bool MSMeanData_Harmonoise::MSLaneMeanDataValues::notifyEnter(SUMOVehicle& veh, MSMoveReminder::Notification /*reason*/) { return vehicleApplies(veh); }