LCOV - code coverage report
Current view: top level - src/utils/handlers - MeanDataHandler.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 0.0 % 137 0
Test Date: 2025-12-06 15:35:27 Functions: 0.0 % 9 0

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2001-2025 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    MeanDataHandler.cpp
      15              : /// @author  Pablo Alvarez Lopez
      16              : /// @date    Nov 2022
      17              : ///
      18              : // The XML-Handler for meanMeanData elements loading
      19              : /****************************************************************************/
      20              : #include <config.h>
      21              : 
      22              : #include <utils/common/MsgHandler.h>
      23              : #include <utils/common/StringUtils.h>
      24              : #include <utils/xml/XMLSubSys.h>
      25              : 
      26              : #include "MeanDataHandler.h"
      27              : 
      28              : 
      29              : // ===========================================================================
      30              : // method definitions
      31              : // ===========================================================================
      32              : 
      33            0 : MeanDataHandler::MeanDataHandler(const std::string& filename) :
      34            0 :     CommonHandler(filename) {
      35            0 : }
      36              : 
      37              : 
      38            0 : MeanDataHandler::~MeanDataHandler() {}
      39              : 
      40              : 
      41              : bool
      42            0 : MeanDataHandler::beginParseAttributes(SumoXMLTag tag, const SUMOSAXAttributes& attrs) {
      43              :     // open SUMOBaseOBject
      44            0 :     myCommonXMLStructure.openSUMOBaseOBject();
      45              :     // check tag
      46              :     try {
      47            0 :         switch (tag) {
      48            0 :             case SUMO_TAG_MEANDATA_EDGE:
      49            0 :                 parseEdgeMeanData(attrs);
      50              :                 break;
      51            0 :             case SUMO_TAG_MEANDATA_LANE:
      52            0 :                 parseLaneMeanData(attrs);
      53              :                 break;
      54            0 :             case SUMO_TAG_PARAM:
      55            0 :                 WRITE_WARNING(TL("MeanData elements cannot load attributes as params"));
      56            0 :                 break;
      57            0 :             default:
      58              :                 // tag cannot be parsed in MeanDataHandler
      59            0 :                 myCommonXMLStructure.abortSUMOBaseOBject();
      60              :                 return false;
      61              :         }
      62            0 :     } catch (InvalidArgument& e) {
      63            0 :         writeError(e.what());
      64            0 :     }
      65              :     return true;
      66              : }
      67              : 
      68              : 
      69              : void
      70            0 : MeanDataHandler::endParseAttributes() {
      71              :     // get last inserted object
      72            0 :     CommonXMLStructure::SumoBaseObject* obj = myCommonXMLStructure.getCurrentSumoBaseObject();
      73              :     // close SUMOBaseOBject
      74            0 :     if (obj) {
      75            0 :         myCommonXMLStructure.closeSUMOBaseOBject();
      76              :         // check tag
      77            0 :         switch (obj->getTag()) {
      78            0 :             case SUMO_TAG_MEANDATA_EDGE:
      79              :             case SUMO_TAG_MEANDATA_LANE:
      80            0 :                 parseSumoBaseObject(obj);
      81              :                 // delete object
      82            0 :                 delete obj;
      83              :                 break;
      84              :             default:
      85              :                 break;
      86              :         }
      87              :     }
      88            0 : }
      89              : 
      90              : 
      91              : void
      92            0 : MeanDataHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) {
      93              :     // check if loading was aborted
      94            0 :     if (!myAbortLoading) {
      95              :         // switch tag
      96            0 :         switch (obj->getTag()) {
      97            0 :             case SUMO_TAG_MEANDATA_EDGE:
      98            0 :                 if (buildEdgeMeanData(obj,
      99              :                                       obj->getStringAttribute(SUMO_ATTR_ID),
     100              :                                       obj->getStringAttribute(SUMO_ATTR_FILE),
     101              :                                       obj->getStringAttribute(SUMO_ATTR_TYPE),
     102              :                                       obj->getTimeAttribute(SUMO_ATTR_PERIOD),
     103              :                                       obj->getTimeAttribute(SUMO_ATTR_BEGIN),
     104              :                                       obj->getTimeAttribute(SUMO_ATTR_END),
     105            0 :                                       obj->getBoolAttribute(SUMO_ATTR_TRACK_VEHICLES),
     106              :                                       obj->getStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES),
     107            0 :                                       obj->getBoolAttribute(SUMO_ATTR_AGGREGATE),
     108              :                                       obj->getStringListAttribute(SUMO_ATTR_EDGES),
     109              :                                       obj->getStringAttribute(SUMO_ATTR_EDGESFILE),
     110              :                                       obj->getStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY),
     111            0 :                                       obj->getBoolAttribute(SUMO_ATTR_WITH_INTERNAL),
     112              :                                       obj->getStringListAttribute(SUMO_ATTR_DETECT_PERSONS),
     113              :                                       obj->getDoubleAttribute(SUMO_ATTR_MIN_SAMPLES),
     114              :                                       obj->getDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME),
     115              :                                       obj->getStringListAttribute(SUMO_ATTR_VTYPES),
     116              :                                       obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD))) {
     117            0 :                     obj->markAsCreated();
     118              :                 };
     119              :                 break;
     120            0 :             case SUMO_TAG_MEANDATA_LANE:
     121            0 :                 if (buildLaneMeanData(obj,
     122              :                                       obj->getStringAttribute(SUMO_ATTR_ID),
     123              :                                       obj->getStringAttribute(SUMO_ATTR_FILE),
     124              :                                       obj->getStringAttribute(SUMO_ATTR_TYPE),
     125              :                                       obj->getTimeAttribute(SUMO_ATTR_PERIOD),
     126              :                                       obj->getTimeAttribute(SUMO_ATTR_BEGIN),
     127              :                                       obj->getTimeAttribute(SUMO_ATTR_END),
     128            0 :                                       obj->getBoolAttribute(SUMO_ATTR_TRACK_VEHICLES),
     129              :                                       obj->getStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES),
     130            0 :                                       obj->getBoolAttribute(SUMO_ATTR_AGGREGATE),
     131              :                                       obj->getStringListAttribute(SUMO_ATTR_EDGES),
     132              :                                       obj->getStringAttribute(SUMO_ATTR_EDGESFILE),
     133              :                                       obj->getStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY),
     134            0 :                                       obj->getBoolAttribute(SUMO_ATTR_WITH_INTERNAL),
     135              :                                       obj->getStringListAttribute(SUMO_ATTR_DETECT_PERSONS),
     136              :                                       obj->getDoubleAttribute(SUMO_ATTR_MIN_SAMPLES),
     137              :                                       obj->getDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME),
     138              :                                       obj->getStringListAttribute(SUMO_ATTR_VTYPES),
     139              :                                       obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD))) {
     140            0 :                     obj->markAsCreated();
     141              :                 }
     142              :                 break;
     143              :             default:
     144              :                 break;
     145              :         }
     146              :         // now iterate over childrens
     147            0 :         for (const auto& child : obj->getSumoBaseObjectChildren()) {
     148              :             // call this function recursively
     149            0 :             parseSumoBaseObject(child);
     150              :         }
     151              :     }
     152            0 : }
     153              : 
     154              : 
     155              : void
     156            0 : MeanDataHandler::parseEdgeMeanData(const SUMOSAXAttributes& attrs) {
     157              :     // declare Ok Flag
     158            0 :     bool parsedOk = true;
     159              :     // needed attributes
     160            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
     161            0 :     const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
     162              :     // optional attributes
     163            0 :     std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), parsedOk, "");
     164            0 :     const SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), parsedOk, TIME2STEPS(-1));
     165            0 :     const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, TIME2STEPS(-1));
     166            0 :     const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), parsedOk, TIME2STEPS(-1));
     167            0 :     const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), parsedOk, false);
     168            0 :     const std::vector<std::string> writeAttributes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), parsedOk, {});
     169            0 :     const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), parsedOk, false);
     170            0 :     const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, {});
     171            0 :     const std::string edgeFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), parsedOk, "");
     172            0 :     const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), parsedOk, SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES));
     173            0 :     const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), parsedOk, false);
     174            0 :     const std::vector<std::string> detectPersons = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_DETECT_PERSONS, id.c_str(), parsedOk, {});
     175            0 :     const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), parsedOk, 0);
     176            0 :     const double maxTravel = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), parsedOk, 100000);
     177            0 :     const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, {});
     178            0 :     const double speedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 0.1);
     179              :     // adjust type
     180            0 :     if (type == "performance") {
     181              :         type = "";
     182            0 :     } else if (type == "hbefa") {
     183            0 :         WRITE_WARNING(TL("The netstate type 'hbefa' is deprecated. Using 'emissions' instead."));
     184              :         type = "emissions";
     185              :     }
     186              :     // continue if flag is ok
     187            0 :     if (parsedOk && checkType(SUMO_TAG_MEANDATA_EDGE, id, type)) {
     188              :         // set tag
     189            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_MEANDATA_EDGE);
     190              :         // add all attributes
     191            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
     192            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
     193            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
     194            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
     195            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
     196            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
     197            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_TRACK_VEHICLES, trackVehicles);
     198            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES, writeAttributes);
     199            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_AGGREGATE, aggregate);
     200            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
     201            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGESFILE, edgeFile);
     202            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY, excludeEmpty);
     203            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_WITH_INTERNAL, withInternal);
     204            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
     205            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MIN_SAMPLES, minSamples);
     206            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel);
     207            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
     208            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold);
     209              :     } else {
     210            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
     211              :     }
     212            0 : }
     213              : 
     214              : 
     215              : void
     216            0 : MeanDataHandler::parseLaneMeanData(const SUMOSAXAttributes& attrs) {
     217              :     // declare Ok Flag
     218            0 :     bool parsedOk = true;
     219              :     // needed attributes
     220            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
     221            0 :     const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
     222              :     // optional attributes
     223            0 :     const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), parsedOk, "");
     224            0 :     const SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), parsedOk, TIME2STEPS(-1));
     225            0 :     const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, TIME2STEPS(-1));
     226            0 :     const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), parsedOk, TIME2STEPS(-1));
     227            0 :     const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), parsedOk, false);
     228            0 :     const std::vector<std::string> writeAttributes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), parsedOk, {});
     229            0 :     const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), parsedOk, false);
     230            0 :     const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, {});
     231            0 :     const std::string edgeFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), parsedOk, "");
     232            0 :     const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), parsedOk, SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES));
     233            0 :     const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), parsedOk, false);
     234            0 :     const std::vector<std::string> detectPersons = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_DETECT_PERSONS, id.c_str(), parsedOk, {});
     235            0 :     const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), parsedOk, 0);
     236            0 :     const double maxTravel = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), parsedOk, 100000);
     237            0 :     const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, {});
     238            0 :     const double speedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 0.1);
     239              :     // continue if flag is ok
     240            0 :     if (parsedOk && checkType(SUMO_TAG_MEANDATA_LANE, id, type)) {
     241              :         // set tag
     242            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_MEANDATA_LANE);
     243              :         // add all attributes
     244            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
     245            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
     246            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
     247            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
     248            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
     249            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
     250            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_TRACK_VEHICLES, trackVehicles);
     251            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES, writeAttributes);
     252            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_AGGREGATE, aggregate);
     253            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
     254            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGESFILE, edgeFile);
     255            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY, excludeEmpty);
     256            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_WITH_INTERNAL, withInternal);
     257            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
     258            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MIN_SAMPLES, minSamples);
     259            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel);
     260            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
     261            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold);
     262              :     } else {
     263            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
     264              :     }
     265            0 : }
     266              : 
     267              : 
     268              : bool
     269            0 : MeanDataHandler::checkType(const SumoXMLTag currentTag, const std::string& id, const std::string& type) {
     270              :     if (SUMOXMLDefinitions::MeanDataTypes.hasString(type)) {
     271            0 :         return true;
     272              :     } else {
     273            0 :         writeError(TLF("Attribute '%' defined in % with id '%' doesn't have a valid value (given '%').", toString(SUMO_ATTR_TYPE), toString(currentTag), id, type));
     274            0 :         return false;
     275              :     }
     276              : }
     277              : 
     278              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1