LCOV - code coverage report
Current view: top level - src/microsim/output - MSDetectorFileOutput.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 87.5 % 40 35
Test Date: 2024-11-20 15:55:46 Functions: 100.0 % 3 3

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    MSDetectorFileOutput.cpp
      15              : /// @author  Christian Roessel
      16              : /// @author  Daniel Krajzewicz
      17              : /// @author  Sascha Krieg
      18              : /// @author  Michael Behrisch
      19              : /// @author  Jakob Erdmann
      20              : /// @date    2004-11-23
      21              : ///
      22              : // Base of value-generating classes (detectors)
      23              : /****************************************************************************/
      24              : #include <config.h>
      25              : 
      26              : #include <utils/common/StringTokenizer.h>
      27              : #include <microsim/MSVehicleType.h>
      28              : #include <microsim/MSEdge.h>
      29              : #include <microsim/MSRoute.h>
      30              : #include <microsim/MSVehicleControl.h>
      31              : #include <microsim/transportables/MSTransportable.h>
      32              : #include <utils/vehicle/SUMOTrafficObject.h>
      33              : #include <utils/vehicle/SUMOVehicle.h>
      34              : #include "MSDetectorFileOutput.h"
      35              : 
      36              : // ===========================================================================
      37              : // method definitions
      38              : // ===========================================================================
      39              : 
      40        38062 : MSDetectorFileOutput::MSDetectorFileOutput(const std::string& id,
      41              :         const std::string& vTypes,
      42              :         const std::string& nextEdges,
      43        38062 :         const int detectPersons) :
      44              :     Named(id),
      45        38062 :     myDetectPersons(detectPersons) {
      46        76124 :     const std::vector<std::string> vt = StringTokenizer(vTypes).getVector();
      47              :     myVehicleTypes.insert(vt.begin(), vt.end());
      48        76440 :     for (const std::string& edgeID : StringTokenizer(nextEdges).getVector()) {
      49          322 :         const MSEdge* e = MSEdge::dictionary(edgeID);
      50          322 :         if (e) {
      51          316 :             myNextEdges.push_back(e);
      52              :         } else {
      53           12 :             throw ProcessError("Unknown edge '" + edgeID + "' given as nextEdges in detector '" + id + "'");
      54              :         }
      55        38062 :     }
      56        38074 : }
      57              : 
      58              : 
      59              : bool
      60    448436043 : MSDetectorFileOutput::vehicleApplies(const SUMOTrafficObject& veh) const {
      61    448436043 :     if (veh.isVehicle() == detectPersons()) {
      62              :         return false;
      63              :     }
      64    448433973 :     if (!myVehicleTypes.empty() && myVehicleTypes.count(veh.getVehicleType().getOriginalID()) == 0) {
      65       287292 :         std::set<std::string> vTypeDists = MSNet::getInstance()->getVehicleControl().getVTypeDistributionMembership(veh.getVehicleType().getOriginalID());
      66              :         bool typeMatches = false;
      67       229605 :         for (auto vTypeDist : vTypeDists) {
      68              :             if (myVehicleTypes.count(vTypeDist) > 0) {
      69              :                 typeMatches = true;
      70              :                 break;
      71              :             }
      72              :         }
      73              :         if (!typeMatches) {
      74              :             return false;
      75              :         }
      76              :     }
      77    448290335 :     if (!myNextEdges.empty()) {
      78              :         MSRouteIterator it;
      79              :         MSRouteIterator end;
      80              :         ConstMSEdgeVector route;
      81       202128 :         if (veh.isVehicle()) {
      82         4868 :             const SUMOVehicle& v = dynamic_cast<const SUMOVehicle&>(veh);
      83         4868 :             it = v.getCurrentRouteEdge();
      84         4868 :             end = v.getRoute().end();
      85       197260 :         } else if (veh.isPerson()) {
      86       197260 :             const MSTransportable& p = dynamic_cast<const MSTransportable&>(veh);
      87       197260 :             route = p.getCurrentStage()->getEdges();
      88       197260 :             it = route.begin() + p.getRoutePosition();
      89              :             end = route.end();
      90              :         }
      91       262404 :         for (const MSEdge* e : myNextEdges) {
      92       202128 :             it = std::find(it, end, e);
      93       202128 :             if (it == end) {
      94       167584 :                 if (e != veh.getNextEdgePtr()) {
      95              :                     //std::cout << SIMTIME << " det=" << getID() << " veh=" << veh.getID() << " e=" << e->getID() << " vehNext=" << Named::getIDSecure(veh.getNextEdgePtr()) << "\n";
      96       141852 :                     return false;
      97              :                 }
      98              :             }
      99              :         }
     100       202128 :     }
     101              :     return true;
     102              : }
     103              : 
     104              : bool
     105       361088 : MSDetectorFileOutput::personApplies(const MSTransportable& p, int dir) const {
     106              :     //std::cout << getID() << " p=" << p.getID() << " veh=" << Named::getIDSecure(p.getVehicle()) << "\n";
     107       361088 :     if (p.getVehicle() == nullptr) {
     108       361088 :         const int dirCode = dir < 0 ? 2 : dir;
     109              :         //std::cout << "   dir=" << dir << " dirCode=" << dirCode << " myDetectPersons=" << myDetectPersons << "\n";
     110       361088 :         if ((dirCode & myDetectPersons) == 0) {
     111              :             // person walking in wrong direction or not walking at all
     112              :             return false;
     113              :         }
     114              :     } else {
     115            0 :         const SUMOVehicleClass svc = p.getVehicle()->getVClass();
     116              :         int vClassCode;
     117            0 :         if ((svc & SVC_PUBLIC_CLASSES) != 0) {
     118              :             vClassCode = (int)PersonMode::PUBLIC;
     119            0 :         } else if ((svc & SVC_BICYCLE) != 0) {
     120              :             vClassCode = (int)PersonMode::BICYCLE;
     121            0 :         } else if ((svc & SVC_TAXI) != 0) {
     122              :             vClassCode = (int)PersonMode::TAXI;
     123              :         } else {
     124              :             vClassCode = (int)PersonMode::CAR;
     125              :         }
     126            0 :         if ((vClassCode & myDetectPersons) == 0) {
     127              :             // person riding in the wrong vehicle
     128              :             return false;
     129              :         }
     130              :     }
     131              :     return true;
     132              : }
     133              : 
     134              : 
     135              : 
     136              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1