Eclipse SUMO - Simulation of Urban MObility
MSDetectorFileOutput.cpp
Go to the documentation of this file.
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 /****************************************************************************/
22 // Base of value-generating classes (detectors)
23 /****************************************************************************/
24 #include <config.h>
25 
27 #include <microsim/MSVehicleType.h>
28 #include <microsim/MSEdge.h>
29 #include <microsim/MSRoute.h>
34 #include "MSDetectorFileOutput.h"
35 
36 // ===========================================================================
37 // method definitions
38 // ===========================================================================
39 
41  const std::string& vTypes,
42  const std::string& nextEdges,
43  const int detectPersons) :
44  Named(id),
45  myDetectPersons(detectPersons) {
46  const std::vector<std::string> vt = StringTokenizer(vTypes).getVector();
47  myVehicleTypes.insert(vt.begin(), vt.end());
48  for (const std::string& edgeID : StringTokenizer(nextEdges).getVector()) {
49  const MSEdge* e = MSEdge::dictionary(edgeID);
50  if (e) {
51  myNextEdges.push_back(e);
52  } else {
53  throw ProcessError("Unknown edge '" + edgeID + "' given as nextEdges in detector '" + id + "'");
54  }
55  }
56 }
57 
58 
59 bool
61  if (veh.isVehicle() == detectPersons()) {
62  return false;
63  }
64  if (!myVehicleTypes.empty() && myVehicleTypes.count(veh.getVehicleType().getOriginalID()) == 0) {
66  bool typeMatches = false;
67  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  if (!myNextEdges.empty()) {
78  MSRouteIterator it;
79  MSRouteIterator end;
80  ConstMSEdgeVector route;
81  if (veh.isVehicle()) {
82  const SUMOVehicle& v = dynamic_cast<const SUMOVehicle&>(veh);
83  it = v.getCurrentRouteEdge();
84  end = v.getRoute().end();
85  } else if (veh.isPerson()) {
86  const MSTransportable& p = dynamic_cast<const MSTransportable&>(veh);
87  route = p.getCurrentStage()->getEdges();
88  it = route.begin() + p.getRoutePosition();
89  end = route.end();
90  }
91  for (const MSEdge* e : myNextEdges) {
92  it = std::find(it, end, e);
93  if (it == end) {
94  if (e != veh.getNextEdgePtr()) {
95  //std::cout << SIMTIME << " det=" << getID() << " veh=" << veh.getID() << " e=" << e->getID() << " vehNext=" << Named::getIDSecure(veh.getNextEdgePtr()) << "\n";
96  return false;
97  }
98  }
99  }
100  }
101  return true;
102 }
103 
104 bool
106  //std::cout << getID() << " p=" << p.getID() << " veh=" << Named::getIDSecure(p.getVehicle()) << "\n";
107  if (p.getVehicle() == nullptr) {
108  const int dirCode = dir < 0 ? 2 : dir;
109  //std::cout << " dir=" << dir << " dirCode=" << dirCode << " myDetectPersons=" << myDetectPersons << "\n";
110  if ((dirCode & myDetectPersons) == 0) {
111  // person walking in wrong direction or not walking at all
112  return false;
113  }
114  } else {
115  const SUMOVehicleClass svc = p.getVehicle()->getVClass();
116  int vClassCode;
117  if ((svc & SVC_PUBLIC_CLASSES) != 0) {
118  vClassCode = (int)PersonMode::PUBLIC;
119  } else if ((svc & SVC_BICYCLE) != 0) {
120  vClassCode = (int)PersonMode::BICYCLE;
121  } else if ((svc & SVC_TAXI) != 0) {
122  vClassCode = (int)PersonMode::TAXI;
123  } else {
124  vClassCode = (int)PersonMode::CAR;
125  }
126  if ((vClassCode & myDetectPersons) == 0) {
127  // person riding in the wrong vehicle
128  return false;
129  }
130  }
131  return true;
132 }
133 
134 
135 
136 /****************************************************************************/
std::vector< const MSEdge * > ConstMSEdgeVector
Definition: MSEdge.h:74
ConstMSEdgeVector::const_iterator MSRouteIterator
Definition: MSRoute.h:56
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_PUBLIC_CLASSES
public transport
@ SVC_TAXI
vehicle is a taxi
bool vehicleApplies(const SUMOTrafficObject &veh) const
Checks whether the detector measures vehicles of the given type.
std::vector< const MSEdge * > myNextEdges
The upcoming edges to filter by (empty means no filtering)
const int myDetectPersons
Whether pedestrians shall be detected instead of vehicles.
MSDetectorFileOutput(const std::string &id, const std::string &vTypes, const std::string &nextEdges="", const int detectPersons=false)
Constructor.
bool personApplies(const MSTransportable &p, int dir) const
std::set< std::string > myVehicleTypes
The vehicle types to look for (empty means all)
A road/street connecting two junctions.
Definition: MSEdge.h:77
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary....
Definition: MSEdge.cpp:983
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:182
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:378
MSRouteIterator end() const
Returns the end of the list of edges to pass.
Definition: MSRoute.cpp:79
virtual ConstMSEdgeVector getEdges() const
the edges of the current stage
Definition: MSStage.cpp:113
int getRoutePosition() const
return the index of the edge within the route
MSStage * getCurrentStage() const
Return the current stage.
SUMOVehicle * getVehicle() const
The vehicle associated with this transportable.
const std::set< std::string > getVTypeDistributionMembership(const std::string &id) const
Return the distribution IDs the vehicle type is a member of.
const std::string & getOriginalID() const
Returns the id of the original vehicle type if this is a vehicle specific type, the id otherwise.
Base class for objects which have an id.
Definition: Named.h:54
Representation of a vehicle, person, or container.
virtual const MSEdge * getNextEdgePtr() const =0
returns the next edge (possibly an internal edge)
virtual bool isVehicle() const
Whether it is a vehicle.
virtual bool isPerson() const
Whether it is a person.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
Representation of a vehicle.
Definition: SUMOVehicle.h:60
virtual const MSRoute & getRoute() const =0
Returns the current route.
virtual const ConstMSEdgeVector::const_iterator & getCurrentRouteEdge() const =0
Returns an iterator pointing to the current edge in this vehicles route.
std::vector< std::string > getVector()
return vector of strings