Commit afaad131 authored by Christina Maria Mayr's avatar Christina Maria Mayr
Browse files

[GUI] display information state of an agent

parent 9acf2cae
......@@ -326,6 +326,7 @@ SettingsDialog.lblStair.text=Stair
SettingsDialog.lblPedestrianNoTarget.text=Without Target
SettingsDialog.lblTargetColoring.text=Coloring by Target
SettingsDialog.lblSelfCategoryColoring.text=Coloring by Self Category
SettingsDialog.lblInformationColoring.text=Coloring by Information State
ProjectView.menuOpenFloorFieldFile.title=Add Floor Field File...
ProjectView.btnDrawVoronoiDiagram.tooltip=Draw and display a Voronoi Diagram
......
package org.vadere.gui.components.control.simulation;
import org.vadere.gui.components.model.DefaultSimulationConfig;
import org.vadere.gui.components.model.SimulationModel;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.information.InformationState;
import javax.swing.*;
import java.awt.*;
public class ActionSetInformationStateColor extends ActionSetColor {
private final JComboBox<InformationState> comboBox;
public ActionSetInformationStateColor(final String name, final SimulationModel<? extends DefaultSimulationConfig> model, final JPanel coloredPanel,
final JComboBox<InformationState> comboBox) {
super(name, model, coloredPanel);
this.comboBox = comboBox;
}
@Override
protected void saveColor(Color color) {
InformationState informationState = comboBox.getItemAt(comboBox.getSelectedIndex());
if (informationState != null) {
model.config.setInformationStateColor(informationState, color);
}
}
}
package org.vadere.gui.components.model;
public enum AgentColoring {
TARGET, RANDOM, GROUP, EVACUATION_TIMES, PREDICATE, SELF_CATEGORY;
TARGET, RANDOM, GROUP, EVACUATION_TIMES, PREDICATE, SELF_CATEGORY, INFORMATION_STATE;
}
......@@ -8,6 +8,7 @@ import java.util.TreeMap;
import org.apache.commons.configuration2.Configuration;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.information.InformationState;
import org.vadere.util.config.VadereConfig;
import org.vadere.util.visualization.ColorHelper;
......@@ -47,6 +48,7 @@ public class DefaultSimulationConfig extends DefaultConfig {
private Map<Integer, Color> pedestrianColors = new TreeMap<>();
private Map<Integer, Color> randomColors = new HashMap<>();
private Map<Integer, Color> selfCategoryColors = new HashMap<>();
private Map<Integer, Color> informationStateColors = new HashMap<>();
private double gridWidth = CONFIG.getDouble("ProjectView.cellWidth");
private final double MIN_CELL_WIDTH = CONFIG.getDouble("ProjectView.minCellWidth");
private final double MAX_CELL_WIDTH = CONFIG.getDouble("ProjectView.maxCellWidth");
......@@ -62,6 +64,7 @@ public class DefaultSimulationConfig extends DefaultConfig {
this.randomColors = new HashMap<>();
this.pedestrianColors = new HashMap<>();
this.selfCategoryColors = new HashMap<>();
this.informationStateColors = new HashMap<>();
for (Map.Entry<Integer, Color> entry : config.pedestrianColors.entrySet()) {
this.pedestrianColors.put(new Integer(entry.getKey()), new Color(entry.getValue().getRed(), entry
......@@ -325,6 +328,12 @@ public class DefaultSimulationConfig extends DefaultConfig {
setChanged();
}
public void setInformationStateColor(InformationState informationState, final Color color) {
this.informationStateColors.put(informationState.ordinal(), color);
setChanged();
}
public Color getSelfCategoryColor(SelfCategory selfCategory) {
Color color = getPedestrianDefaultColor();
......@@ -335,6 +344,18 @@ public class DefaultSimulationConfig extends DefaultConfig {
return color;
}
public Color getInformationStateColor(InformationState informationState) {
Color color = getPedestrianDefaultColor();
if (informationStateColors.containsKey(informationState.ordinal())) {
color = informationStateColors.get(informationState.ordinal());
}
return color;
}
public void setGridWidth(final double gridWidth) {
this.gridWidth = gridWidth;
}
......
......@@ -12,6 +12,7 @@ import org.vadere.gui.components.utils.Messages;
import org.vadere.gui.components.utils.SwingUtils;
import org.vadere.gui.postvisualization.control.ActionCloseSettingDialog;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.information.InformationState;
import org.vadere.state.scenario.Target;
import org.vadere.util.config.VadereConfig;
......@@ -232,6 +233,8 @@ public class SettingsDialog extends JDialog {
JRadioButton rbRandomColoring = createRadioButtonWithListener(AgentColoring.RANDOM, Messages.getString("SettingsDialog.chbUseRandomColors.text"));
JRadioButton rbGroupColoring = createRadioButtonWithListener(AgentColoring.GROUP, Messages.getString("SettingsDialog.chbGroupColors.text"));
JRadioButton rbSelfCategoryColoring = createRadioButtonWithListener(AgentColoring.SELF_CATEGORY, Messages.getString("SettingsDialog.lblSelfCategoryColoring.text")+ ":");
JRadioButton rbInformationColoring = createRadioButtonWithListener(AgentColoring.INFORMATION_STATE, Messages.getString("SettingsDialog.lblInformationColoring.text")+ ":");
rbTargetColoring.setSelected(true);
model.setAgentColoring(AgentColoring.TARGET);
......@@ -241,6 +244,7 @@ public class SettingsDialog extends JDialog {
group.add(rbRandomColoring);
group.add(rbGroupColoring);
group.add(rbSelfCategoryColoring);
group.add(rbInformationColoring);
JComboBox<Integer> cbTargetIds = createTargetIdsComboBoxAndAddIds();
final JPanel pTargetColor = new JPanel();
......@@ -256,6 +260,13 @@ public class SettingsDialog extends JDialog {
initColoringBySelfCategory(cbSelfCategories, pSelfCategoryColor, bChangeSelfCategoryColor);
JComboBox<InformationState> cbInformationStates = createInformationStateComboBox();
final JPanel pInformationStateColor = new JPanel();
final JButton bChangeInformationStateColor = new JButton(Messages.getString("SettingsDialog.btnEditColor.text"));
initColoringByInformationState(cbInformationStates, pInformationStateColor, bChangeInformationStateColor);
int row = 0;
int column1 = 2;
int column2 = 4;
......@@ -281,6 +292,11 @@ public class SettingsDialog extends JDialog {
colorSettingsPane.add(pSelfCategoryColor, cc.xy(column3, row));
colorSettingsPane.add(bChangeSelfCategoryColor, cc.xy(column4, row));
colorSettingsPane.add(rbInformationColoring, cc.xy(column1, row += NEXT_CELL));
colorSettingsPane.add(cbInformationStates, cc.xy(column2, row));
colorSettingsPane.add(pInformationStateColor, cc.xy(column3, row));
colorSettingsPane.add(bChangeInformationStateColor, cc.xy(column4, row));
// Evacuation time and criteria coloring comes in the next row see "postvisualization/.../SettingsDialog.java".
}
......@@ -309,10 +325,16 @@ public class SettingsDialog extends JDialog {
private JComboBox<SelfCategory> createSelfCategoriesComboBox() {
JComboBox<SelfCategory> comboBox = new JComboBox<>(SelfCategory.values());
return comboBox;
}
private JComboBox<InformationState> createInformationStateComboBox() {
JComboBox<InformationState> comboBox = new JComboBox<>(InformationState.values());
return comboBox;
}
private void initColoringByTargetId(JComboBox<Integer> cbTargetIds, JPanel pTargetColor, JButton bChangeTargetColor, JButton bChangePedestrianColorNoTarget, JPanel pPedestrianColorNoTarget) {
cbTargetIds.setSelectedIndex(0);
......@@ -367,6 +389,30 @@ public class SettingsDialog extends JDialog {
});
}
private void initColoringByInformationState(JComboBox<InformationState> cbInformationStates, JPanel pInformationStateColor, JButton bChangeInformationStateColor) {
cbInformationStates.setSelectedIndex(0);
InformationState selectedInformationState = cbInformationStates.getItemAt(cbInformationStates.getSelectedIndex());
Color informationStateColor = model.config.getInformationStateColor(selectedInformationState);
pInformationStateColor.setBackground(informationStateColor);
pInformationStateColor.setPreferredSize(new Dimension(130, 20));
// When user changes a color, save it in the model.
bChangeInformationStateColor.addActionListener(new ActionSetInformationStateColor("Set Information State Color", model, pInformationStateColor,
cbInformationStates));
// Retrieve configured color from "model".
cbInformationStates.addActionListener(e -> {
InformationState selectedInformationStateInner = cbInformationStates.getItemAt(cbInformationStates.getSelectedIndex());
pInformationStateColor.setBackground(model.config.getInformationStateColor(selectedInformationStateInner));
});
int i;
}
private void initOtherSettingsPane(JLayeredPane otherSettingsPane) {
otherSettingsPane.setBorder(
BorderFactory.createTitledBorder(Messages.getString("SettingsDialog.additional.border.text")));
......
......@@ -303,6 +303,11 @@ public abstract class SimulationRenderer extends DefaultRenderer {
Pedestrian pedestrian = (Pedestrian) agent;
return model.config.getSelfCategoryColor(pedestrian.getSelfCategory());
}
case INFORMATION_STATE:
if (agent instanceof Pedestrian) {
Pedestrian pedestrian = (Pedestrian) agent;
return model.config.getInformationStateColor(pedestrian.getKnowledgeBase().getInformationState());
}
case PREDICATE: {
if (model instanceof PostvisualizationModel) {
return ((PostvisualizationModel) model)
......
......@@ -258,6 +258,9 @@ public class OnlineVisualizationModel extends SimulationModel<DefaultSimulationC
case SELF_CATEGORY:
config.setAgentColoring(agentColoring);
break;
case INFORMATION_STATE:
config.setAgentColoring(agentColoring);
break;
default:
throw new IllegalArgumentException(agentColoring + " is not supported for the online simulation.");
}
......
......@@ -9,6 +9,7 @@ import org.vadere.state.attributes.AttributesSimulation;
import org.vadere.state.attributes.scenario.AttributesAgent;
import org.vadere.state.psychology.cognition.GroupMembership;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.psychology.information.InformationState;
import org.vadere.state.psychology.perception.types.StimulusFactory;
import org.vadere.state.scenario.Agent;
import org.vadere.state.scenario.Pedestrian;
......@@ -260,6 +261,13 @@ public class PostvisualizationModel extends SimulationModel<PostvisualizationCon
pedestrian.setSelfCategory(SelfCategory.valueOf(selfCategoryString));
}
if (trajectories.informationStateCol != -1){
String informationStateString = row.getString(trajectories.informationStateCol);
pedestrian.getKnowledgeBase().setInformationState(InformationState.valueOf(informationStateString));
}
if(trajectories.groupMembershipCol != -1) {
String groupMembershipString = row.getString(trajectories.groupMembershipCol);
pedestrian.setGroupMembership(GroupMembership.valueOf(groupMembershipString));
......
......@@ -58,6 +58,7 @@ public class TableTrajectoryFootStep {
public final int mostImportantStimulusCol;
public final int selfCategoryCol;
public final int groupMembershipCol;
public final int informationStateCol;
public static final int agentDFPedIdCol = 0;
public static final int birthTimeCol = 1;
......@@ -89,6 +90,7 @@ public class TableTrajectoryFootStep {
mostImportantStimulusCol = columnNames.getMostImportantStimulusCol(dataFrame);
selfCategoryCol = columnNames.getSelfCategoryCol(dataFrame);
groupMembershipCol = columnNames.getGroupMembershipCol(dataFrame);
informationStateCol = columnNames.getInformationStateCol(dataFrame);
this.trajectoryDataFrame = dataFrame;
......
......@@ -24,7 +24,7 @@ public class SettingsDialog extends org.vadere.gui.components.view.SettingsDialo
super.initComponents();
CellConstraints cc = new CellConstraints();
JRadioButton chShowEvacTimeColor = new JRadioButton(Messages.getString("PostVis.chShowEvacTimeColor.text"));
agentColorSettingsPane.add(chShowEvacTimeColor, cc.xyw(2, 12, 9));
agentColorSettingsPane.add(chShowEvacTimeColor, cc.xyw(2, 14, 9));
chShowEvacTimeColor.addItemListener(e -> {
model.setAgentColoring(AgentColoring.EVACUATION_TIMES);
model.notifyObservers();
......@@ -33,8 +33,8 @@ public class SettingsDialog extends org.vadere.gui.components.view.SettingsDialo
JRadioButton chShowCriteriaColor = new JRadioButton(Messages.getString("PostVis.chShowCriteriaColor.text") + ":");
PedestrianColorPanel pedestrianColorPanel = new PedestrianColorPanel(model);
agentColorSettingsPane.add(chShowCriteriaColor, cc.xy(2, 14, CellConstraints.LEFT, CellConstraints.TOP));
agentColorSettingsPane.add(pedestrianColorPanel, cc.xyw(4, 14, 7));
agentColorSettingsPane.add(chShowCriteriaColor, cc.xy(2, 16, CellConstraints.LEFT, CellConstraints.TOP));
agentColorSettingsPane.add(pedestrianColorPanel, cc.xyw(4, 16, 7));
chShowCriteriaColor.addItemListener(e -> {
model.setAgentColoring(AgentColoring.PREDICATE);
model.notifyObservers();
......
......@@ -6,6 +6,7 @@ import org.vadere.simulator.models.osm.PedestrianOSM;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.scenario.Topography;
import org.vadere.state.simulation.FootStep;
import java.util.Comparator;
import java.util.PriorityQueue;
......@@ -70,8 +71,10 @@ public class UpdateSchemeEventDriven implements UpdateSchemeOSM {
osmBehaviorController.makeStepToTarget(pedestrian, topography);
} else if (selfCategory == SelfCategory.WAIT) {
osmBehaviorController.wait(pedestrian, topography, timeStepInSec);
pedestrian.getTrajectory().add(new FootStep(pedestrian.getLastPosition(), pedestrian.getLastPosition(), currentTimeInSec, pedestrian.getTimeOfNextStep()));
} else if (selfCategory == SelfCategory.CHANGE_TARGET) {
osmBehaviorController.changeTarget(pedestrian, topography);
pedestrian.getTrajectory().add(new FootStep(pedestrian.getLastPosition(), pedestrian.getLastPosition(), currentTimeInSec, pedestrian.getTimeOfNextStep()));
}
}
......
......@@ -6,6 +6,7 @@ import org.vadere.simulator.models.osm.PedestrianOSM;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.scenario.Topography;
import org.vadere.state.simulation.FootStep;
import java.util.Collection;
import java.util.HashSet;
......@@ -66,8 +67,10 @@ public class UpdateSchemeSequential implements UpdateSchemeOSM {
stepForward(pedestrian, currentTimeInSec, timeStepInSec);
} else if (selfCategory == SelfCategory.WAIT) {
osmBehaviorController.wait(pedestrian, topography, timeStepInSec);
pedestrian.getTrajectory().add(new FootStep(pedestrian.getLastPosition(), pedestrian.getLastPosition(), currentTimeInSec, pedestrian.getTimeOfNextStep()));
} else if (selfCategory == SelfCategory.CHANGE_TARGET) {
osmBehaviorController.changeTarget(pedestrian, topography);
pedestrian.getTrajectory().add(new FootStep(pedestrian.getLastPosition(), pedestrian.getLastPosition(), currentTimeInSec, pedestrian.getTimeOfNextStep()));
}
}
......@@ -79,6 +82,8 @@ public class UpdateSchemeSequential implements UpdateSchemeOSM {
}
}
@Override
public void elementAdded(Pedestrian element) {}
......
package org.vadere.simulator.projects.dataprocessing.processor;
import com.google.common.collect.Lists;
import org.vadere.annotation.factories.dataprocessors.DataProcessorClass;
import org.vadere.simulator.control.simulation.SimulationState;
import org.vadere.simulator.projects.dataprocessing.datakey.EventtimePedestrianIdKey;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.simulation.FootStep;
import org.vadere.state.simulation.VTrajectory;
import java.util.ArrayList;
import java.util.Collection;
/**
......
......@@ -4,6 +4,7 @@ import org.vadere.annotation.factories.dataprocessors.DataProcessorClass;
import org.vadere.simulator.control.simulation.SimulationState;
import org.vadere.simulator.projects.dataprocessing.ProcessorManager;
import org.vadere.simulator.projects.dataprocessing.datakey.EventtimePedestrianIdKey;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.simulation.FootStep;
import org.vadere.state.simulation.VTrajectory;
......@@ -29,32 +30,31 @@ import java.util.LinkedList;
@DataProcessorClass()
public class FootStepProcessor extends DataProcessor<EventtimePedestrianIdKey, FootStep> {
public FootStepProcessor() {
super("endTime", "startX", "startY", "endX", "endY");
}
@Override
protected void doUpdate(final SimulationState state) {
for (Pedestrian pedestrian : state.getTopography().getElements(Pedestrian.class)) {
LinkedList<FootStep> footSteps = pedestrian.getTrajectory().clone().getFootSteps();
for (FootStep fs : footSteps) {
putValue(new EventtimePedestrianIdKey(fs.getStartTime(), pedestrian.getId()), fs);
}
}
}
@Override
public void init(final ProcessorManager manager) {
super.init(manager);
}
@Override
public String[] toStrings(EventtimePedestrianIdKey key) {
String[] footStepLine = this.getValue(key).getValueString();
// Note: remove the "startTime" from the footStepLine because it is already included in the "simTime" of the
// EventtimePedestrianIdKey
return Arrays.copyOfRange(footStepLine, 1, footStepLine.length);
}
public FootStepProcessor() {
super("endTime", "startX", "startY", "endX", "endY");
}
@Override
protected void doUpdate(final SimulationState state) {
for (Pedestrian pedestrian : state.getTopography().getElements(Pedestrian.class)) {
LinkedList<FootStep> footSteps = pedestrian.getTrajectory().clone().getFootSteps();
for (FootStep fs : footSteps) {
putValue(new EventtimePedestrianIdKey(fs.getStartTime(), pedestrian.getId()), fs);
}
}
}
@Override
public void init(final ProcessorManager manager) {
super.init(manager);
}
@Override
public String[] toStrings(EventtimePedestrianIdKey key) {
String[] footStepLine = this.getValue(key).getValueString();
// Note: remove the "startTime" from the footStepLine because it is already included in the "simTime" of the
// EventtimePedestrianIdKey
return Arrays.copyOfRange(footStepLine, 1, footStepLine.length);
}
}
\ No newline at end of file
package org.vadere.simulator.projects.dataprocessing.processor;
import org.vadere.annotation.factories.dataprocessors.DataProcessorClass;
import org.vadere.simulator.control.simulation.SimulationState;
import org.vadere.simulator.projects.dataprocessing.ProcessorManager;
......@@ -17,7 +18,7 @@ import java.util.LinkedList;
@DataProcessorClass()
public class FootStepPsychologyStatusProcessor extends DataProcessor<EventtimePedestrianIdKey, String> {
public static String[] HEADERS = { "mostImportantStimulus", "selfCategory", "groupMembership" };
public static String[] HEADERS = { "mostImportantStimulus", "selfCategory", "groupMembership", "informationState" };
public FootStepPsychologyStatusProcessor() {
super(HEADERS);
......@@ -37,10 +38,11 @@ public class FootStepPsychologyStatusProcessor extends DataProcessor<EventtimePe
}
private String psychologyStatusToString(Pedestrian pedestrian) {
String statusAsString = String.format("%s %s %s",
String statusAsString = String.format("%s %s %s %s",
pedestrian.getMostImportantStimulus().toStringForOutputProcessor(),
pedestrian.getSelfCategory().toString(),
pedestrian.getGroupMembership().toString()
pedestrian.getGroupMembership().toString(),
pedestrian.getKnowledgeBase().getInformationState().toString()
);
return statusAsString;
......
package org.vadere.simulator.projects.dataprocessing.processor;
import com.google.common.collect.Lists;
import org.vadere.annotation.factories.dataprocessors.DataProcessorClass;
import org.vadere.simulator.control.simulation.SimulationState;
import org.vadere.simulator.projects.dataprocessing.ProcessorManager;
import org.vadere.simulator.projects.dataprocessing.datakey.EventtimePedestrianIdKey;
import org.vadere.simulator.projects.dataprocessing.datakey.PedestrianIdKey;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.simulation.FootStep;
import org.vadere.state.simulation.VTrajectory;
import java.util.Collection;
import java.util.*;
/**
* Save self category of a pedestrian in each time step in an own column.
......@@ -16,22 +20,59 @@ import java.util.Collection;
public class FootStepSelfCategoryProcessor extends DataProcessor<EventtimePedestrianIdKey, String> {
public static String HEADER = "selfCategory";
public FootStepSelfCategoryProcessor() {
super(HEADER);
}
@Override
public void doUpdate(final SimulationState state) {
Collection<Pedestrian> pedestrians = state.getTopography().getElements(Pedestrian.class);
for(Pedestrian p : pedestrians){
VTrajectory traj = p.getTrajectory();
String selfCategoryString = p.getSelfCategory().toString();
SelfCategory selfCat = p.getSelfCategory();
String selfCategoryString = selfCat.toString();
/* The actions WAIT and CHANGE_TARGET occur in between two footsteps.
* With the following if-statement the action is moved to the latest footstep available.
* If not, these two self categories are not visualized in the post-visualization.
* */
if ( (selfCat == SelfCategory.WAIT) || (selfCat == SelfCategory.CHANGE_TARGET) ) {
if (traj.getFootSteps().size() == 0) {
if (state.getStep() == 1){
this.putValue(new EventtimePedestrianIdKey(state.getSimTimeInSec(), p.getId()), selfCategoryString);
}
else {
this.getData().replace(getKey(p.getId()), selfCategoryString);
}
}
}
for(FootStep fs : traj.getFootSteps()){
this.putValue(new EventtimePedestrianIdKey(fs.getStartTime(), p.getId()), selfCategoryString);
}
}
}
private EventtimePedestrianIdKey getKey(int pedId) {
EventtimePedestrianIdKey key = null;
for (EventtimePedestrianIdKey k : Lists.reverse(new ArrayList<>(this.getKeys()))) {
if (k.getPedestrianId() == pedId){
key = k;
break;
}
}
//TODO check whether we can use stream instead? currenlty not working, but seems to be more effective
//key = this.getKeys().stream().filter(k -> k.getPedestrianId() == pedId).max(Comparator.comparing(EventtimePedestrianIdKey::getSimtime)).orElseThrow(NoSuchElementException::new);
return key;
}
@Override
public void init(final ProcessorManager manager) {
super.init(manager);
}
}
......@@ -4,24 +4,28 @@ import org.vadere.annotation.factories.dataprocessors.DataProcessorClass;
import org.vadere.simulator.control.simulation.SimulationState;
import org.vadere.simulator.projects.dataprocessing.datakey.EventtimePedestrianIdKey;
import org.vadere.simulator.projects.dataprocessing.processor.util.ModelFilter;
import org.vadere.state.psychology.cognition.SelfCategory;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.state.simulation.FootStep;
import org.vadere.util.logging.Logger;
import java.util.Collection;
import java.util.LinkedList;
@DataProcessorClass()
public class FootStepTargetIDProcessor extends DataProcessor<EventtimePedestrianIdKey, Integer> implements ModelFilter {
private static Logger logger = Logger.getLogger(FootStepTargetIDProcessor.class);
public FootStepTargetIDProcessor(){
public FootStepTargetIDProcessor() {
super("targetId");
}
@Override
protected void doUpdate(SimulationState state) {
Collection<Pedestrian> peds = state.getTopography().getElements(Pedestrian.class);
peds.forEach(p -> p.getTrajectory().getFootSteps().forEach(fs -> {
this.putValue(new EventtimePedestrianIdKey(fs.getStartTime(), p.getId()), !p.hasNextTarget() ? -1 : p.getNextTargetId());
this.putValue(new EventtimePedestrianIdKey(fs.getStartTime(), p.getId()), !p.hasNextTarget() ? -1 : p.getNextTargetId());
}));
}
}
}
\ No newline at end of file
......@@ -24,6 +24,7 @@ public final class ColumnNames {
private Set<String> durationKeys;
private Set<String> mostImportantStimulusKeys;
private Set<String> selfCategoryKeys;