SUMO - Simulation of Urban MObility

MSMeanData_Net.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00008 // Network state mean data collector for edges/lanes
00009 /****************************************************************************/
00010 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00011 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
00012 /****************************************************************************/
00013 //
00014 //   This file is part of SUMO.
00015 //   SUMO is free software: you can redistribute it and/or modify
00016 //   it under the terms of the GNU General Public License as published by
00017 //   the Free Software Foundation, either version 3 of the License, or
00018 //   (at your option) any later version.
00019 //
00020 /****************************************************************************/
00021 
00022 
00023 // ===========================================================================
00024 // included modules
00025 // ===========================================================================
00026 #ifdef _MSC_VER
00027 #include <windows_config.h>
00028 #else
00029 #include <config.h>
00030 #endif
00031 
00032 #include <microsim/MSEdgeControl.h>
00033 #include <microsim/MSEdge.h>
00034 #include <microsim/MSLane.h>
00035 #include <microsim/MSVehicle.h>
00036 #include <utils/common/SUMOTime.h>
00037 #include <utils/common/ToString.h>
00038 #include <utils/iodevices/OutputDevice.h>
00039 #include "MSMeanData_Net.h"
00040 #include <limits>
00041 
00042 #ifdef HAVE_MESOSIM
00043 #include <microsim/MSGlobals.h>
00044 #include <mesosim/MELoop.h>
00045 #include <mesosim/MESegment.h>
00046 #endif
00047 
00048 #ifdef CHECK_MEMORY_LEAKS
00049 #include <foreign/nvwa/debug_new.h>
00050 #endif // CHECK_MEMORY_LEAKS
00051 
00052 
00053 // ===========================================================================
00054 // method definitions
00055 // ===========================================================================
00056 // ---------------------------------------------------------------------------
00057 // MSMeanData_Net::MSLaneMeanDataValues - methods
00058 // ---------------------------------------------------------------------------
00059 MSMeanData_Net::MSLaneMeanDataValues::MSLaneMeanDataValues(MSLane* const lane,
00060         const SUMOReal length,
00061         const bool doAdd,
00062         const std::set<std::string>* const vTypes,
00063         const MSMeanData_Net* parent)
00064     : MSMeanData::MeanDataValues(lane, length, doAdd, vTypes), myParent(parent),
00065       nVehDeparted(0), nVehArrived(0), nVehEntered(0), nVehLeft(0),
00066       nVehLaneChangeFrom(0), nVehLaneChangeTo(0), waitSeconds(0), vehLengthSum(0) {}
00067 
00068 
00069 MSMeanData_Net::MSLaneMeanDataValues::~MSLaneMeanDataValues() {
00070 }
00071 
00072 
00073 void
00074 MSMeanData_Net::MSLaneMeanDataValues::reset(bool) {
00075     nVehDeparted = 0;
00076     nVehArrived = 0;
00077     nVehEntered = 0;
00078     nVehLeft = 0;
00079     nVehLaneChangeFrom = 0;
00080     nVehLaneChangeTo = 0;
00081     sampleSeconds = 0.;
00082     travelledDistance = 0;
00083     waitSeconds = 0;
00084     vehLengthSum = 0;
00085 }
00086 
00087 
00088 void
00089 MSMeanData_Net::MSLaneMeanDataValues::addTo(MSMeanData::MeanDataValues& val) const {
00090     MSLaneMeanDataValues& v = (MSLaneMeanDataValues&) val;
00091     v.nVehDeparted += nVehDeparted;
00092     v.nVehArrived += nVehArrived;
00093     v.nVehEntered += nVehEntered;
00094     v.nVehLeft += nVehLeft;
00095     v.nVehLaneChangeFrom += nVehLaneChangeFrom;
00096     v.nVehLaneChangeTo += nVehLaneChangeTo;
00097     v.sampleSeconds += sampleSeconds;
00098     v.travelledDistance += travelledDistance;
00099     v.waitSeconds += waitSeconds;
00100     v.vehLengthSum += vehLengthSum;
00101 }
00102 
00103 
00104 void
00105 MSMeanData_Net::MSLaneMeanDataValues::notifyMoveInternal(SUMOVehicle& veh, SUMOReal timeOnLane, SUMOReal speed) {
00106     sampleSeconds += timeOnLane;
00107     travelledDistance += speed * timeOnLane;
00108     vehLengthSum += veh.getVehicleType().getLengthWithGap() * timeOnLane;
00109     if (myParent != 0 && speed < myParent->myHaltSpeed) {
00110         waitSeconds += timeOnLane;
00111     }
00112 }
00113 
00114 
00115 bool
00116 MSMeanData_Net::MSLaneMeanDataValues::notifyLeave(SUMOVehicle& veh, SUMOReal /*lastPos*/, MSMoveReminder::Notification reason) {
00117     if (vehicleApplies(veh) && (getLane() == 0 || getLane() == static_cast<MSVehicle&>(veh).getLane())) {
00118 #ifdef HAVE_MESOSIM
00119         if (MSGlobals::gUseMesoSim) {
00120             myLastVehicleUpdateValues.erase(&veh);
00121         }
00122 #endif
00123         if (reason == MSMoveReminder::NOTIFICATION_ARRIVED) {
00124             ++nVehArrived;
00125         } else if (reason == MSMoveReminder::NOTIFICATION_LANE_CHANGE) {
00126             ++nVehLaneChangeFrom;
00127         } else if (myParent == 0 || reason != MSMoveReminder::NOTIFICATION_SEGMENT) {
00128             ++nVehLeft;
00129         }
00130     }
00131 #ifdef HAVE_MESOSIM
00132     if (MSGlobals::gUseMesoSim) {
00133         return false;
00134     }
00135 #endif
00136     return reason == MSMoveReminder::NOTIFICATION_JUNCTION;
00137 }
00138 
00139 
00140 bool
00141 MSMeanData_Net::MSLaneMeanDataValues::notifyEnter(SUMOVehicle& veh, MSMoveReminder::Notification reason) {
00142     if (vehicleApplies(veh)) {
00143         if (getLane() == 0 || getLane() == static_cast<MSVehicle&>(veh).getLane()) {
00144             if (reason == MSMoveReminder::NOTIFICATION_DEPARTED) {
00145                 ++nVehDeparted;
00146             } else if (reason == MSMoveReminder::NOTIFICATION_LANE_CHANGE) {
00147                 ++nVehLaneChangeTo;
00148             } else if (myParent == 0 || reason != MSMoveReminder::NOTIFICATION_SEGMENT) {
00149                 ++nVehEntered;
00150             }
00151         }
00152         return true;
00153     }
00154     return false;
00155 }
00156 
00157 
00158 bool
00159 MSMeanData_Net::MSLaneMeanDataValues::isEmpty() const {
00160     return sampleSeconds == 0 && nVehDeparted == 0 && nVehArrived == 0 && nVehEntered == 0 && nVehLeft == 0 && nVehLaneChangeFrom == 0 && nVehLaneChangeTo == 0;
00161 }
00162 
00163 
00164 void
00165 MSMeanData_Net::MSLaneMeanDataValues::write(OutputDevice& dev, const SUMOTime period,
00166         const SUMOReal numLanes, const int numVehicles) const {
00167     if (myParent == 0) {
00168         if (sampleSeconds > 0) {
00169             dev << "\" density=\"" << sampleSeconds / STEPS2TIME(period) *(SUMOReal) 1000 / myLaneLength <<
00170                 "\" occupancy=\"" << vehLengthSum / STEPS2TIME(period) / myLaneLength / numLanes *(SUMOReal) 100 <<
00171                 "\" waitingTime=\"" << waitSeconds <<
00172                 "\" speed=\"" << travelledDistance / sampleSeconds;
00173         }
00174         dev << "\" departed=\"" << nVehDeparted <<
00175             "\" arrived=\"" << nVehArrived <<
00176             "\" entered=\"" << nVehEntered <<
00177             "\" left=\"" << nVehLeft <<
00178             "\"/>\n";
00179         return;
00180     }
00181     if (sampleSeconds > myParent->myMinSamples) {
00182         SUMOReal traveltime = myParent->myMaxTravelTime;
00183         if (travelledDistance > 0.f) {
00184             traveltime = MIN2(traveltime, myLaneLength * sampleSeconds / travelledDistance);
00185         }
00186         if (numVehicles > 0) {
00187             dev << "\" traveltime=\"" << sampleSeconds / numVehicles <<
00188                 "\" waitingTime=\"" << waitSeconds <<
00189                 "\" speed=\"" << travelledDistance / sampleSeconds;
00190         } else {
00191             dev << "\" traveltime=\"" << traveltime <<
00192                 "\" density=\"" << sampleSeconds / STEPS2TIME(period) *(SUMOReal) 1000 / myLaneLength <<
00193                 "\" occupancy=\"" << vehLengthSum / STEPS2TIME(period) / myLaneLength / numLanes *(SUMOReal) 100 <<
00194                 "\" waitingTime=\"" << waitSeconds <<
00195                 "\" speed=\"" << travelledDistance / sampleSeconds;
00196         }
00197     }
00198     dev << "\" departed=\"" << nVehDeparted <<
00199         "\" arrived=\"" << nVehArrived <<
00200         "\" entered=\"" << nVehEntered <<
00201         "\" left=\"" << nVehLeft <<
00202         "\" laneChangedFrom=\"" << nVehLaneChangeFrom <<
00203         "\" laneChangedTo=\"" << nVehLaneChangeTo <<
00204         "\"/>\n";
00205 }
00206 
00207 // ---------------------------------------------------------------------------
00208 // MSMeanData_Net - methods
00209 // ---------------------------------------------------------------------------
00210 MSMeanData_Net::MSMeanData_Net(const std::string& id,
00211                                const SUMOTime dumpBegin, const SUMOTime dumpEnd,
00212                                const bool useLanes, const bool withEmpty, const bool withInternal,
00213                                const bool trackVehicles,
00214                                const SUMOReal maxTravelTime, const SUMOReal minSamples,
00215                                const SUMOReal haltSpeed, const std::set<std::string> vTypes)
00216     : MSMeanData(id, dumpBegin, dumpEnd, useLanes, withEmpty, withInternal, trackVehicles, maxTravelTime, minSamples, vTypes),
00217       myHaltSpeed(haltSpeed) {
00218 }
00219 
00220 
00221 MSMeanData_Net::~MSMeanData_Net() {}
00222 
00223 
00224 MSMeanData::MeanDataValues*
00225 MSMeanData_Net::createValues(MSLane* const lane, const SUMOReal length, const bool doAdd) const {
00226     return new MSLaneMeanDataValues(lane, length, doAdd, &myVehicleTypes, this);
00227 }
00228 
00229 
00230 /****************************************************************************/
00231 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines