From b39e673368e694ec160ee4449e5eaeb0c8e312da Mon Sep 17 00:00:00 2001 From: Benedikt Zoennchen Date: Mon, 2 Oct 2017 09:41:13 +0200 Subject: [PATCH] fix compatibility issues between output processors and PostVis. --- .../projects/io/TrajectoryReader.java | 130 +++++++++++++----- 1 file changed, 98 insertions(+), 32 deletions(-) diff --git a/VadereSimulator/src/org/vadere/simulator/projects/io/TrajectoryReader.java b/VadereSimulator/src/org/vadere/simulator/projects/io/TrajectoryReader.java index f2a3b6bbe..9da956393 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/io/TrajectoryReader.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/io/TrajectoryReader.java @@ -1,5 +1,6 @@ package org.vadere.simulator.projects.io; +import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import org.apache.commons.math3.util.Pair; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; @@ -14,19 +15,11 @@ import org.vadere.util.geometry.shapes.VPoint; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; import java.util.stream.Collectors; /** - * A TrajectoryReader is the counterpart of the - * {@link PedestrianPositionProcessor}. - * - * - * This reader trys to generate a {@link java.util.stream.Stream< scenario.Pedestrian >} by - * reading it from a file. + * A TrajectoryReader is the counterpart of the {@link PedestrianPositionProcessor}. */ public class TrajectoryReader { @@ -36,34 +29,107 @@ public class TrajectoryReader { private AttributesAgent attributesPedestrian; + private static final String SPLITTER = " "; + + private Set pedestrianIdKeys; + private Set stepKeys; + private Set xKeys; + private Set yKeys; + private Set targetIdKeys; + + private int pedIdIndex; + private int stepIndex; + private int xIndex; + private int yIndex; + private int targetIdIndex; + public TrajectoryReader(final Path trajectoryFilePath, final Scenario scenario) throws IOException { - this.trajectoryFilePath = trajectoryFilePath; - this.attributesPedestrian = scenario.getAttributesPedestrian(); + this(trajectoryFilePath, scenario.getAttributesPedestrian()); } public TrajectoryReader(final Path trajectoryFilePath) { - this.trajectoryFilePath = trajectoryFilePath; - this.attributesPedestrian = new AttributesAgent(); + this(trajectoryFilePath, new AttributesAgent()); } + private TrajectoryReader(final Path trajectoryFilePath, final AttributesAgent attributesAgent) { + this.trajectoryFilePath = trajectoryFilePath; + this.attributesPedestrian = attributesAgent; + pedestrianIdKeys = new HashSet<>(); + stepKeys = new HashSet<>(); + xKeys = new HashSet<>(); + yKeys = new HashSet<>(); + targetIdKeys = new HashSet<>(); + + pedestrianIdKeys.add("id"); + pedestrianIdKeys.add("pedestrianId"); + stepKeys.add("timeStep"); + stepKeys.add("step"); + xKeys.add("x"); + yKeys.add("y"); + targetIdKeys.add("targetId"); + + pedIdIndex = -1; + stepIndex = -1; + xIndex = -1; + yIndex = -1; + targetIdIndex = -1; + + } + public Map> readFile() throws IOException { - return Files.lines(this.trajectoryFilePath) - .skip(1) // Skip header line - .map(line -> line.split(" ")) - .map(cells -> { - int step = Integer.parseInt(cells[0]); - int pedestrianId = Integer.parseInt(cells[1]); - VPoint pos = new VPoint(Double.parseDouble(cells[2]), Double.parseDouble(cells[3])); - int targetId = Integer.parseInt(cells[4]); - - Pedestrian ped = new Pedestrian(new AttributesAgent(this.attributesPedestrian, pedestrianId), new Random()); - ped.setPosition(pos); - LinkedList targets = new LinkedList(); - targets.addFirst(targetId); - ped.setTargets(targets); - - return Pair.create(new Step(Integer.parseInt(cells[0])), ped); - }) - .collect(Collectors.groupingBy(pair -> pair.getKey(), Collectors.mapping(pair -> pair.getValue(), Collectors.toList()))); + // 1. Get the correct column + String header = Files.lines(this.trajectoryFilePath).findFirst().get(); + String[] columns = header.split(SPLITTER); + + for(int index = 0; index < columns.length; index++) { + if(pedestrianIdKeys.contains(columns[index])) { + pedIdIndex = index; + } + else if(stepKeys.contains(columns[index])) { + stepIndex = index; + } + else if(xKeys.contains(columns[index])) { + xIndex = index; + } + else if(yKeys.contains(columns[index])) { + yIndex = index; + } + else if(targetIdKeys.contains(columns[index])) { + targetIdIndex = index; + } + } + try { + if(pedIdIndex != -1 && xIndex != -1 && yIndex != -1 && stepIndex != -1) { + + return Files.lines(this.trajectoryFilePath) + .skip(1) // Skip header line + .map(line -> line.split(" ")) + .map(cells -> { + int step = Integer.parseInt(cells[stepIndex]); + int pedestrianId = Integer.parseInt(cells[pedIdIndex]); + VPoint pos = new VPoint(Double.parseDouble(cells[xIndex]), Double.parseDouble(cells[yIndex])); + + + int targetId = targetIdIndex != -1 ? Integer.parseInt(cells[targetIdIndex]) : -1; + + Pedestrian ped = new Pedestrian(new AttributesAgent(this.attributesPedestrian, pedestrianId), new Random()); + ped.setPosition(pos); + LinkedList targets = new LinkedList(); + targets.addFirst(targetId); + ped.setTargets(targets); + + return Pair.create(new Step(Integer.parseInt(cells[0])), ped); + }) + .collect(Collectors.groupingBy(pair -> pair.getKey(), Collectors.mapping(pair -> pair.getValue(), Collectors.toList()))); + } + else { + throw new IOException("could not read trajectory file, some colums are missing."); + } + } + catch (Exception e) { + logger.warn("could not read trajectory file. The file format might not be compatible or it is missing."); + throw e; + } + } } -- GitLab