@Override
 public void handleEvent(PersonStuckEvent event) {
   Double startWaitingTime = agentsWaitingData.get(event.getPersonId());
   if (startWaitingTime != null) {
     int legs = 0, currentLeg = agentsCurrentLeg.get(event.getPersonId());
     PLAN_ELEMENTS:
     for (PlanElement planElement :
         population.getPersons().get(event.getPersonId()).getSelectedPlan().getPlanElements())
       if (planElement instanceof Leg) {
         if (currentLeg == legs) {
           String[] leg = (((Leg) planElement).getRoute()).getRouteDescription().split(SEPARATOR);
           WaitTimeData data =
               waitTimes
                   .get(
                       new Tuple<Id<TransitLine>, Id<TransitRoute>>(
                           Id.create(leg[2], TransitLine.class),
                           Id.create(leg[3], TransitRoute.class)))
                   .get(Id.create(leg[1], TransitStopFacility.class));
           if (data != null)
             data.addWaitTime(
                 (int) (startWaitingTime / timeSlot), event.getTime() - startWaitingTime);
           agentsWaitingData.remove(event.getPersonId());
           break PLAN_ELEMENTS;
         } else legs++;
       }
   }
 }
 @Override
 public void reset(int iteration) {
   for (Map<Id<TransitStopFacility>, WaitTimeData> routeData : waitTimes.values())
     for (WaitTimeData waitTimeData : routeData.values()) waitTimeData.resetWaitTimes();
   agentsWaitingData.clear();
   agentsCurrentLeg.clear();
 }
 @Override
 public void reset(int iteration) {
   for (Map<String, WaitTimeData> routeData : waitTimes.values())
     for (WaitTimeData waitTimeData : routeData.values()) waitTimeData.resetWaitTimes();
   agentsWaitingData.clear();
   linesRoutesOfVehicle.clear();
   stopOfVehicle.clear();
 }
 @Override
 public void handleEvent(PersonEntersVehicleEvent event) {
   Double startWaitingTime = agentsWaitingData.get(event.getPersonId().toString());
   if (startWaitingTime != null) {
     Tuple<String, String> lineRoute = linesRoutesOfVehicle.get(event.getVehicleId().toString());
     WaitTimeData data =
         waitTimes.get(lineRoute).get(stopOfVehicle.get(event.getVehicleId().toString()));
     data.addWaitTime((int) (startWaitingTime / timeSlot), event.getTime() - startWaitingTime);
     agentsWaitingData.remove(event.getPersonId().toString());
   }
 }
 private double getRouteStopWaitTime(
     Id<TransitLine> lineId,
     Id<TransitRoute> routeId,
     Id<TransitStopFacility> stopId,
     double time) {
   Tuple<Id<TransitLine>, Id<TransitRoute>> key =
       new Tuple<Id<TransitLine>, Id<TransitRoute>>(lineId, routeId);
   WaitTimeData waitTimeData = waitTimes.get(key).get(stopId);
   if (waitTimeData.getNumData((int) (time / timeSlot)) == 0) {
     double[] waitTimes = scheduledWaitTimes.get(key).get(stopId);
     return waitTimes[
         (int) (time / timeSlot) < waitTimes.length
             ? (int) (time / timeSlot)
             : (waitTimes.length - 1)];
   } else return waitTimeData.getWaitTime((int) (time / timeSlot));
 }
 private double getRouteStopWaitTime(
     Id<TransitLine> lineId,
     Id<TransitRoute> routeId,
     Id<TransitStopFacility> stopId,
     double time) {
   Tuple<String, String> key = new Tuple<String, String>(lineId.toString(), routeId.toString());
   waitTimeCalls++;
   WaitTimeData waitTimeData = waitTimes.get(key).get(stopId.toString());
   if (waitTimeData.getNumData((int) (time / timeSlot)) == 0) {
     scheduleCalls++;
     double[] waitTimes = scheduledWaitTimes.get(key).get(stopId.toString());
     return waitTimes[
         (int) (time / timeSlot) < waitTimes.length
             ? (int) (time / timeSlot)
             : (waitTimes.length - 1)];
   } else {
     return waitTimeData.getWaitTime((int) (time / timeSlot));
   }
 }