Commit 0fa81773 authored by Mohcine Chraibi's avatar Mohcine Chraibi

Merge branch '98-PersID' into 'develop'

Resolve "Method D | IndividualFD file use wrong PersID"

Closes #98

See merge request !15
parents 5fd5e462 19030045
Pipeline #17830 passed with stages
in 32 seconds
......@@ -25,8 +25,7 @@ configure-linux:
script:
- mkdir -p build
- cd build
- which git
- cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=g++-8 ..
- cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=g++-8 ..
- echo "configure | ${CI_PROJECT_DIR}"
stage: configure
tags:
......
......@@ -37,6 +37,7 @@
#include "methods/Method_B.h"
#include "methods/Method_C.h"
#include "methods/Method_D.h"
#include "methods/Method_I.h"
#include "methods/PedData.h"
#include <iostream>
......@@ -58,7 +59,7 @@
#endif
using boost::geometry::dsv;
using namespace std;
OutputHandler* Log = new STDIOHandler();
......@@ -139,7 +140,7 @@ void Analysis::InitArgs(ArgumentParser* args)
}
}
if(args ->GetIsMethodC()) {
if(args->GetIsMethodC()) {
_DoesUseMethodC = true;
vector<int> Measurement_Area_IDs = args->GetAreaIDforMethodC();
for(unsigned int i=0; i<Measurement_Area_IDs.size(); i++)
......@@ -149,7 +150,7 @@ void Analysis::InitArgs(ArgumentParser* args)
_plotTimeseriesC=args->GetIsPlotTimeSeriesC();
}
if(args ->GetIsMethodD()) {
if(args->GetIsMethodD()) {
_DoesUseMethodD = true;
vector<int> Measurement_Area_IDs = args->GetAreaIDforMethodD();
for(unsigned int i=0; i<Measurement_Area_IDs.size(); i++)
......@@ -160,6 +161,20 @@ void Analysis::InitArgs(ArgumentParser* args)
_StopFramesMethodD = args->GetStopFramesMethodD();
_IndividualFDFlags = args->GetIndividualFDFlags();
_plotTimeseriesD=args->GetIsPlotTimeSeriesD();
_geoPoly = ReadGeometry(args->GetGeometryFilename(), _areaForMethod_D);
}
if(args->GetIsMethodI()) {
_DoesUseMethodI = true;
vector<int> Measurement_Area_IDs = args->GetAreaIDforMethodI();
for(unsigned int i=0; i<Measurement_Area_IDs.size(); i++)
{
_areaForMethod_I.push_back(dynamic_cast<MeasurementArea_B*>( args->GetMeasurementArea(Measurement_Area_IDs[i])));
}
_StartFramesMethodI = args->GetStartFramesMethodI();
_StopFramesMethodI = args->GetStopFramesMethodI();
_IndividualFDFlags = args->GetIndividualFDFlags();
_plotTimeseriesI=args->GetIsPlotTimeSeriesI();
_geoPoly = ReadGeometry(args->GetGeometryFilename(), _areaForMethod_I);
}
_deltaF = args->GetDelatT_Vins();
......@@ -173,7 +188,6 @@ void Analysis::InitArgs(ArgumentParser* args)
_IgnoreBackwardMovement =args->GetIgnoreBackwardMovement();
_grid_size_X = int(args->GetGridSizeX());
_grid_size_Y = int(args->GetGridSizeY());
_geoPoly = ReadGeometry(args->GetGeometryFilename(), _areaForMethod_D);
_geometryFileName=args->GetGeometryFilename();
_projectRootDir=args->GetProjectRootDir();
_trajFormat=args->GetFileFormat();
......@@ -186,11 +200,11 @@ void Analysis::InitArgs(ArgumentParser* args)
std::map<int, polygon_2d> Analysis::ReadGeometry(const fs::path& geometryFile, const std::vector<MeasurementArea_B*>& areas)
{
_building = new Building();
_building->LoadGeometry(geometryFile.string());
// create the polygons
_building->InitGeometry();
// _building->AddSurroundingRoom();
double geo_minX = FLT_MAX;
double geo_minY = FLT_MAX;
......@@ -208,10 +222,8 @@ std::map<int, polygon_2d> Analysis::ReadGeometry(const fs::path& geometryFile, c
for (auto&& it_sub : it_room.second->GetAllSubRooms())
{
SubRoom* subroom = it_sub.second.get();
point_2d point(0,0);
boost::geometry::centroid(area->_poly,point);
//check if the area is contained in the obstacle
if(subroom->IsInSubRoom(Point(point.x()/M2CM,point.y()/M2CM)))
{
......@@ -232,7 +244,6 @@ std::map<int, polygon_2d> Analysis::ReadGeometry(const fs::path& geometryFile, c
geoPoly[area->_id].inners().resize(k++);
geoPoly[area->_id].inners().back();
model::ring<point_2d>& inner = geoPoly[area->_id].inners().back();
for(auto&& tmp_point:obst->GetPolygon())
{
append(inner, make<point_2d>(tmp_point._x*M2CM, tmp_point._y*M2CM));
......@@ -241,12 +252,12 @@ std::map<int, polygon_2d> Analysis::ReadGeometry(const fs::path& geometryFile, c
}
}
}
}
}//room
if(geoPoly.count(area->_id)==0)
{
Log->Write("ERROR: \t No polygon containing the measurement id [%d]", area->_id);
exit(1);
geoPoly[area->_id] = area->_poly;
}
}
......@@ -254,9 +265,6 @@ std::map<int, polygon_2d> Analysis::ReadGeometry(const fs::path& geometryFile, c
_highVertexY = geo_maxY;
_lowVertexX = geo_minX;
_lowVertexY = geo_minY;
// using boost::geometry::dsv;
// cout<<"INFO: \tGeometry polygon is:\t" << dsv(geoPoly[1])<<endl;
return geoPoly;
}
......@@ -275,7 +283,7 @@ int Analysis::RunAnalysis(const fs::path& filename, const fs::path& path)
for(int frameNr = 0; frameNr < data.GetNumFrames(); frameNr++ )
{
vector<int> ids=_peds_t[frameNr];
vector<int> IdInFrame = data.GetIdInFrame(ids);
vector<int> IdInFrame = data.GetIdInFrame(frameNr, ids);
vector<double> XInFrame = data.GetXInFrame(frameNr, ids);
vector<double> YInFrame = data.GetYInFrame(frameNr, ids);
for( unsigned int i=0;i<IdInFrame.size();i++)
......@@ -441,6 +449,61 @@ int Analysis::RunAnalysis(const fs::path& filename, const fs::path& path)
}
}
}
if(_DoesUseMethodI) //method_I
{
if(_areaForMethod_I.empty())
{
Log->Write("ERROR: Method I selected with no measurement area!");
exit(EXIT_FAILURE);
}
#pragma omp parallel for
for(long unsigned int i=0; i<_areaForMethod_I.size(); i++)
{
Method_I method_I;
method_I.SetStartFrame(_StartFramesMethodI[i]);
method_I.SetStopFrame(_StopFramesMethodI[i]);
method_I.SetCalculateIndividualFD(_IndividualFDFlags[i]);
method_I.SetGeometryPolygon(_geoPoly[_areaForMethod_I[i]->_id]);
method_I.SetGeometryFileName(_geometryFileName);
method_I.SetGeometryBoundaries(_lowVertexX, _lowVertexY, _highVertexX, _highVertexY);
method_I.SetGridSize(_grid_size_X, _grid_size_Y);
method_I.SetOutputVoronoiCellData(_outputGraph);
method_I.SetPlotVoronoiGraph(_plotGraph);
method_I.SetPlotVoronoiIndex(_plotIndex);
method_I.SetDimensional(_isOneDimensional);
method_I.SetCalculateProfiles(_getProfile);
method_I.SetTrajectoriesLocation(path);
if(_cutByCircle)
{
method_I.Setcutbycircle(_cutRadius, _circleEdges);
}
method_I.SetMeasurementArea(_areaForMethod_I[i]);
bool result_I = method_I.Process(data,_scriptsLocation, _areaForMethod_I[i]->_zPos);
if(result_I)
{
Log->Write("INFO:\tSuccess with Method I using measurement area id %d!\n",_areaForMethod_I[i]->_id);
std::cout << "INFO:\tSuccess with Method I using measurement area id "<< _areaForMethod_I[i]->_id << "\n";
if(_plotTimeseriesI[i])
{
string parameters_Timeseries= " " +_scriptsLocation.string()+"/_Plot_timeseries_rho_v.py -p "+ _projectRootDir.string()+VORO_LOCATION + " -n "+filename.string()+
" -f "+boost::lexical_cast<std::string>(data.GetFps());
parameters_Timeseries = PYTHON + parameters_Timeseries;
std::cout << parameters_Timeseries << "\n;";
int res=system(parameters_Timeseries.c_str());
Log->Write("INFO:\t time series result: %d ",res);
}
}
else
{
Log->Write("INFO:\tFailed with Method I using measurement area id %d!\n",_areaForMethod_I[i]->_id);
}
}
}
return 0;
}
......
......@@ -125,8 +125,14 @@ private:
bool _DoesUseMethodB; // Method B (Zhang2011a)
bool _DoesUseMethodC; // Method C //calculate and save results of classic in separate file
bool _DoesUseMethodD; // Method D--Voronoi method
bool _DoesUseMethodI; // Method I--Voronoi method modified
// no measurement are)
std::vector<int> _StartFramesMethodD;
std::vector<int> _StopFramesMethodD;
std::vector<int> _StartFramesMethodI;
std::vector<int> _StopFramesMethodI;
std::vector<bool> _IndividualFDFlags;
bool _cutByCircle; //Adjust whether cut each original voronoi cell by a circle
double _cutRadius;
......@@ -141,6 +147,7 @@ private:
std::vector<bool> _plotTimeseriesA;
std::vector<bool> _plotTimeseriesC;
std::vector<bool> _plotTimeseriesD;
std::vector<bool> _plotTimeseriesI;
bool _isOneDimensional;
bool _calcIndividualFD; //Adjust whether analyze the individual density and velocity of each pedestrian in stationary state (ALWAYS VORONOI-BASED)
std::string _vComponent; // to mark whether x, y or x and y coordinate are used when calculating the velocity
......@@ -156,6 +163,10 @@ private:
std::vector<MeasurementArea_B*> _areaForMethod_B;
std::vector<MeasurementArea_B*> _areaForMethod_C;
std::vector<MeasurementArea_B*> _areaForMethod_D;
std::vector<MeasurementArea_B*> _areaForMethod_I; // we still need to know
// the zpos of the
// measurement are, even
// if we don't use its polygon
};
#endif /*ANALYSIS_H_*/
......@@ -180,6 +180,7 @@ set(methods
methods/Method_B.cpp
methods/Method_C.cpp
methods/Method_D.cpp
methods/Method_I.cpp
)
set(source_files
Analysis.cpp
......@@ -211,6 +212,7 @@ set ( header_files
methods/Method_B.h
methods/Method_C.h
methods/Method_D.h
methods/Method_I.h
IO/OutputHandler.h
general/ArgumentParser.h
general/Macros.h
......@@ -310,14 +312,14 @@ endif()
#message (STATUS "PSAPI: ${PSAPI}")
#endif()
add_library ( geometrycore STATIC ${source_files} )
add_library ( geometrycore SHARED ${source_files} ${methods})
set_property(TARGET geometrycore PROPERTY CXX_STANDARD 17)
set_property(TARGET geometrycore PROPERTY CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
target_link_libraries(geometrycore stdc++fs)
add_executable(
jpsreport main.cpp ${methods}
jpsreport main.cpp
)
set_property(TARGET jpsreport PROPERTY CXX_STANDARD 17)
......
......@@ -116,6 +116,35 @@ void OutputHandler::Write(const char* message,...)
}
}
void STDIOHandler::Write(const char* message,...)
{
char msg[CLENGTH]="";
va_list ap;
va_start(ap, message);
vsprintf(msg, message, ap);
va_end(ap);
string str(msg);
if (str.find("ERROR") != string::npos)
{
cerr << msg << endl;
cerr.flush();
incrementErrors();
}
else if (str.find("WARNING") != string::npos)
{
cerr << msg << endl;
cerr.flush();
incrementWarnings();
}
else
{ // infos
cout << msg << endl;
cout.flush();
}
}
void STDIOHandler::Write(const string& str)
{
if (str.find("ERROR") != string::npos)
......
......@@ -61,6 +61,7 @@ public:
class STDIOHandler : public OutputHandler {
public:
void Write(const std::string& str);
void Write(const char *string,...);
};
class FileHandler : public OutputHandler {
......
......@@ -129,6 +129,7 @@ ArgumentParser::ArgumentParser()
_isMethodB = false;
_isMethodC =false;
_isMethodD = false;
_isMethodI= false;
_isCutByCircle = false;
_isOutputGraph= false;
_isPlotGraph= false;
......@@ -274,8 +275,8 @@ bool ArgumentParser::ParseIniFile(const string& inifile)
//geometry
if(xMainNode->FirstChild("geometry"))
{
fs::path p(xMainNode->FirstChildElement("geometry")->Attribute("file"));
_geometryFileName = GetProjectRootDir() / p;
fs::path pathGeo(xMainNode->FirstChildElement("geometry")->Attribute("file"));
_geometryFileName = GetProjectRootDir() / pathGeo;
if(!fs::exists(_geometryFileName)){
Log->Write("ERROR: \tGeometry File <%s> does not exist", _geometryFileName.string().c_str());
return false;
......@@ -341,9 +342,9 @@ bool ArgumentParser::ParseIniFile(const string& inifile)
}
else
{
fs::path p(GetProjectRootDir());
p = canonical(p);
_trajectoriesLocation=p.string();
fs::path path_root(GetProjectRootDir());
path_root = canonical(path_root);
_trajectoriesLocation=path_root.string();
}
Log->Write("INFO: \tInput directory for loading trajectory is <%s>", _trajectoriesLocation.string().c_str());
......@@ -353,9 +354,9 @@ bool ArgumentParser::ParseIniFile(const string& inifile)
if(exists(_trajectoriesLocation))
{
/* print all the files and directories within directory */
fs::path p(GetTrajectoriesLocation());
p = canonical(p);
for (auto& filename : boost::make_iterator_range(fs::directory_iterator(p), {}))
fs::path path_traj(GetTrajectoriesLocation());
path_traj = canonical(path_traj);
for (auto& filename : boost::make_iterator_range(fs::directory_iterator(path_traj), {}))
{
string s = filename.path().string();
if (boost::algorithm::ends_with(s, fmt))
......@@ -452,7 +453,9 @@ bool ArgumentParser::ParseIniFile(const string& inifile)
//measurement area
if(xMainNode->FirstChild("measurement_areas"))
{
string unit = xMainNode->FirstChildElement("measurement_areas")->Attribute("unit");
string unit ="";
if(xMainNode->FirstChildElement("measurement_areas")->Attribute("unit"))
unit = xMainNode->FirstChildElement("measurement_areas")->Attribute("unit");
if(unit!="m")
{
Log->Write("WARNING: \tonly <m> unit is supported. Convert your units.");
......@@ -480,14 +483,57 @@ bool ArgumentParser::ParseIniFile(const string& inifile)
{
areaB->_zPos=10000001.0;
}
std::map<int, polygon_2d> geoPoly;
polygon_2d poly;
Log->Write("INFO: \tMeasure area id <%d> with type <%s>",areaB->_id, areaB->_type.c_str());
int num_verteces = 0;
for(TiXmlElement* xVertex=xMeasurementArea_B->FirstChildElement("vertex"); xVertex; xVertex=xVertex->NextSiblingElement("vertex") )
{
double box_px = xmltof(xVertex->Attribute("x"))*M2CM;
double box_py = xmltof(xVertex->Attribute("y"))*M2CM;
boost::geometry::append(poly, boost::geometry::make<point_2d>(box_px, box_py));
Log->Write("\t\tMeasure area points < %.3f, %.3f>",box_px*CMtoM,box_py*CMtoM);
num_verteces++;
}
if(num_verteces < 3 && num_verteces > 0)
Log->Write("\tWARNING: Less than 3 measure area points given (%d). At least 3 or nothing at all!!", num_verteces);
if(num_verteces == 0) // big bounding box
{
Log->Write("\tWARNING: NO measure area points given (%d). default BB!!", num_verteces);
// get bounding box
// loading geometry is done in analysis.cpp
// so this is done twice, which is not nice.
// For big geometries it could be slow.
Building* building = new Building();
building->LoadGeometry(GetGeometryFilename().string());
building->InitGeometry();
building->AddSurroundingRoom(); // this is a big reactagle
// slightly bigger than the
// geometry boundaries
double geo_minX = building->_xMin;
double geo_minY = building->_yMin;
double geo_maxX = building->_xMax;
double geo_maxY = building->_yMax;
Log->Write("INFO: \tBounding box:\n \t\tminX = %.2f\n \t\tmaxX = %.2f \n \t\tminY = %.2f \n\t\tmaxY = %.2f", geo_minX, geo_maxX, geo_minY, geo_maxY);
//1
double box_px = geo_minX*M2CM;
double box_py = geo_minY*M2CM;
boost::geometry::append(poly, boost::geometry::make<point_2d>(box_px, box_py));
//2
box_px = geo_minX*M2CM;
box_py = geo_maxY*M2CM;
boost::geometry::append(poly, boost::geometry::make<point_2d>(box_px, box_py));
//3
box_px = geo_maxX*M2CM;
box_py = geo_maxY*M2CM;
boost::geometry::append(poly, boost::geometry::make<point_2d>(box_px, box_py));
//4
box_px = geo_maxX*M2CM;
box_py = geo_minY*M2CM;
boost::geometry::append(poly, boost::geometry::make<point_2d>(box_px, box_py));
}
correct(poly); // in the case the Polygone is not closed
areaB->_poly=poly;
......@@ -897,8 +943,159 @@ bool ArgumentParser::ParseIniFile(const string& inifile)
}
}
}
// method I
TiXmlElement* xMethod_I=xMainNode->FirstChildElement("method_I");
if(xMethod_I) {
if(string(xMethod_I->Attribute("enabled"))=="true")
{
_isMethodI = true;
Log->Write("INFO: \tMethod I is selected" );
for(TiXmlElement* xMeasurementArea=xMainNode->FirstChildElement("method_I")->FirstChildElement("measurement_area");
xMeasurementArea; xMeasurementArea = xMeasurementArea->NextSiblingElement("measurement_area"))
{
_areaIDforMethodI.push_back(xmltoi(xMeasurementArea->Attribute("id")));
Log->Write("INFO: \tMeasurement area id <%d> will be used for analysis", xmltoi(xMeasurementArea->Attribute("id")));
if(xMeasurementArea->Attribute("start_frame"))
{
if(string(xMeasurementArea->Attribute("start_frame"))!="None")
{
_start_frames_MethodD.push_back(xmltoi(xMeasurementArea->Attribute("start_frame")));
Log->Write("\tthe analysis starts from frame <%d>",xmltoi(xMeasurementArea->Attribute("start_frame")));
}
else
{
_start_frames_MethodI.push_back(-1);
}
}
else
{
_start_frames_MethodI.push_back(-1);
}
if(xMeasurementArea->Attribute("stop_frame"))
{
if(string(xMeasurementArea->Attribute("stop_frame"))!="None")
{
_stop_frames_MethodI.push_back(xmltoi(xMeasurementArea->Attribute("stop_frame")));
Log->Write("\tthe analysis stops from frame <%d>", xmltoi(xMeasurementArea->Attribute("stop_frame")));
}
else
{
_stop_frames_MethodI.push_back(-1);
}
}
else
{
_stop_frames_MethodI.push_back(-1);
}
if(xMeasurementArea->Attribute("get_individual_FD"))
{
if(string(xMeasurementArea->Attribute("get_individual_FD"))=="true")
{
_individual_FD_flags.push_back(true);
Log->Write("INFO: \tIndividual FD will be output");
}
else
{
_individual_FD_flags.push_back(false);
}
}
else
{
_individual_FD_flags.push_back(false);
}
if(xMeasurementArea->Attribute("plot_time_series"))
{
if(string(xMeasurementArea->Attribute("plot_time_series"))=="true")
{
_isPlotTimeSeriesI.push_back(true);
Log->Write("\tThe Time series will be plotted!! ");
}
else
{
_isPlotTimeSeriesI.push_back(false);
}
}
else
{
_isPlotTimeSeriesI.push_back(false);
}
}
if (xMethod_I->FirstChildElement("one_dimensional"))
{
if ( string(xMethod_I->FirstChildElement("one_dimensional")->Attribute("enabled"))=="true")
{
_isOneDimensional=true;
Log->Write("INFO: \tThe data will be analyzed with one dimensional way!!");
}
}
if ( xMethod_I->FirstChildElement("cut_by_circle"))
{
if ( string(xMethod_I->FirstChildElement("cut_by_circle")->Attribute("enabled"))=="true")
{
_isCutByCircle=true;
_cutRadius=xmltof(xMethod_I->FirstChildElement("cut_by_circle")->Attribute("radius"))*M2CM;
_circleEdges=xmltoi(xMethod_I->FirstChildElement("cut_by_circle")->Attribute("edges"));
Log->Write("INFO: \tEach Voronoi cell will be cut by a circle with the radius of < %f > m!!", _cutRadius*CMtoM);
Log->Write("INFO: \tThe circle is discretized to a polygon with < %d> edges!!", _circleEdges);
}
}
if ( xMethod_I->FirstChildElement("output_voronoi_cells"))
{
auto enabled = xMethod_I->FirstChildElement("output_voronoi_cells")->Attribute("enabled");
if(enabled)
if ( string(enabled)=="true")
{
_isOutputGraph=true;
Log->Write("INFO: \tData of voronoi diagram is asked to output" );
auto plot_graphs = xMethod_I->FirstChildElement("output_voronoi_cells")->Attribute("plot_graphs");
if(plot_graphs)
{
if (string(plot_graphs)=="true")
{
_isPlotGraph = true;
Log->Write("INFO: \tGraph of voronoi diagram will be plotted");
}
auto plot_index = xMethod_I->FirstChildElement("output_voronoi_cells")->Attribute(
"plot_index");
if (plot_index)
if (string(plot_index)=="true")
{
_isPlotIndex = true;
Log->Write(
"INFO: \tVoronoi diagram will be plotted with index of pedestrians");
} // plot_index
} // plot_graphs
}// enabled
}
if ( xMethod_I->FirstChildElement("steadyState"))
{
_steadyStart =xmltof(xMethod_I->FirstChildElement("steadyState")->Attribute("start"));
_steadyEnd =xmltof(xMethod_I->FirstChildElement("steadyState")->Attribute("end"));
Log->Write("INFO: \tthe steady state is from <%f> to <%f> frames", _steadyStart, _steadyEnd);
}
if(xMethod_I->FirstChildElement("profiles"))
{
if ( string(xMethod_I->FirstChildElement("profiles")->Attribute("enabled"))=="true")
{
_isGetProfile = true;
_grid_size_X =xmltof(xMethod_I->FirstChildElement("profiles")->Attribute("grid_size_x"))*M2CM;
_grid_size_Y =xmltof(xMethod_I->FirstChildElement("profiles")->Attribute("grid_size_y"))*M2CM;
Log->Write("INFO: \tProfiles will be calculated" );
Log->Write("INFO: \tThe discretized grid size in x, y direction is: < %f >m by < %f >m ",_grid_size_X*CMtoM, _grid_size_Y*CMtoM);
}
}
}
}
Log->Write("INFO: \tFinish parsing inifile");
if(!(_isMethodA || _isMethodB || _isMethodC || _isMethodD))
if(!(_isMethodA || _isMethodB || _isMethodC || _isMethodD || _isMethodI))
{
Log->Write("WARNING: No measurement method enabled. Nothing to do.");
exit(EXIT_SUCCESS);
......@@ -986,6 +1183,10 @@ bool ArgumentParser::GetIsMethodD() const
{
return _isMethodD;
}
bool ArgumentParser::GetIsMethodI() const
{
return _isMethodI;
}
bool ArgumentParser::GetIsCutByCircle() const
{
......@@ -1031,6 +1232,11 @@ vector<bool> ArgumentParser::GetIsPlotTimeSeriesD() const
return _isPlotTimeSeriesD;
}
vector<bool> ArgumentParser::GetIsPlotTimeSeriesI() const
{
return _isPlotTimeSeriesI;
}
bool ArgumentParser::GetIsOneDimensional() const
{
return _isOneDimensional;
......@@ -1082,16 +1288,31 @@ vector<int> ArgumentParser::GetAreaIDforMethodD() const
return _areaIDforMethodD;
}
vector<int> ArgumentParser::GetAreaIDforMethodI() const
{
return _areaIDforMethodI;
}
vector<int> ArgumentParser::GetStartFramesMethodD() const
{
return _start_frames_MethodD;
}
vector<int> ArgumentParser::GetStartFramesMethodI() const
{
return _start_frames_MethodI;
}
vector<int> ArgumentParser::GetStopFramesMethodD() const
{
return _stop_frames_MethodD;
}
vector<int> ArgumentParser::GetStopFramesMethodI() const
{
return _stop_frames_MethodI;