@Override
 public void handleEvent(ActivityEndEvent event) {
   if (!eventsByPerson.containsKey(event.getPersonId())) {
     eventsByPerson.put(event.getPersonId(), new LinkedList<Event>());
   }
   eventsByPerson.get(event.getPersonId()).add(event);
   allEvents.add(event);
 }
    @Override
    public void handleEvent(final ActivityEndEvent event) {
      final Double start = starts.remove(event.getPersonId());
      // first act has no start time
      if (start == null) return;

      try {
        writer.newLine();
        writer.write(
            event.getPersonId() + "\t" + event.getActType() + "\t" + (event.getTime() - start));
      } catch (final IOException e) {
        throw new UncheckedIOException(e);
      }
    }
 @Override
 public void handleEvent(ActivityEndEvent event) {
   Tuple<String, Double> startTime = startTimes.get(event.getPersonId());
   startTimes.put(event.getPersonId(), null);
   if (startTime == null) startTime = new Tuple<String, Double>(event.getActType(), 0.0);
   double duration = event.getTime() - startTime.getSecond();
   SortedMap<Double, Integer> typeMap = durations.get(event.getActType());
   if (typeMap == null) {
     typeMap = new TreeMap<Double, Integer>();
     for (double t = timeBin; t < totalTime + timeBin - 1; t += timeBin) typeMap.put(t, 0);
     durations.put(event.getActType(), typeMap);
   }
   typeMap.put(getTimeBin(duration), typeMap.get(getTimeBin(duration)) + 1);
   typeMap = peoplePerforming.get(event.getActType());
   if (typeMap == null) {
     typeMap = new TreeMap<Double, Integer>();
     for (double t = timeBin; t < totalTime + timeBin - 1; t += timeBin) typeMap.put(t, 0);
     peoplePerforming.put(event.getActType(), typeMap);
   }
   Double lastTimeBin = getTimeBin(event.getTime());
   for (double t = getTimeBin(startTime.getSecond()); t <= lastTimeBin; t += timeBin)
     typeMap.put(t, typeMap.get(t) + 1);
 }
 @Override
 public void handleEvent(ActivityEndEvent event) {
   List<String> activityChain = activityChains.get(event.getPersonId());
   if (activityChain != null || event.getActType().equals("home"))
     if (activityChain == null) {
       activityChain = new ArrayList<String>();
       activityChain.add(
           "@" + event.getActType() + "(" + numberFormat.format(event.getTime() / 3600) + ")");
       activityChains.put(event.getPersonId(), activityChain);
     } else {
       String lastActivity = activityChain.get(activityChain.size() - 1);
       if (lastActivity.contains(event.getActType())
           && lastActivity.length() == event.getActType().length() + 1)
         activityChain.set(
             activityChain.size() - 1,
             lastActivity + "(" + numberFormat.format(event.getTime() / 3600) + ")");
       else throw new RuntimeException("Activity end without beginning");
     }
   else throw new RuntimeException("Activity end without person");
 }
  @Override
  public void handleEvent(ActivityEndEvent event) {
    try {
      if (isTransitScenario) {
        if (transitDriverIds.contains(event.getPersonId())) return;
      }
      TravellerChain chain = chains.get(event.getPersonId());
      locations.put(event.getPersonId(), network.getLinks().get(event.getLinkId()).getCoord());
      if (chain == null) {
        chain = new TravellerChain();
        chains.put(event.getPersonId(), chain);
        Activity act = chain.addActivity();
        act.setCoord(network.getLinks().get(event.getLinkId()).getCoord());
        act.setEndTime(event.getTime());
        act.setFacility(event.getFacilityId());
        act.setStartTime(0.0);
        act.setType(event.getActType());

      } else if (!event.getActType().equals(PtConstants.TRANSIT_ACTIVITY_TYPE)) {
        Activity act = chain.getActs().getLast();
        act.setEndTime(event.getTime());
      }
    } catch (Exception e) {
      System.err.println(e.getStackTrace());
      System.err.println(event.toString());
    }
  }
  @Override
  public void handleEvent(ActivityEndEvent event) {
    // store information from event to variables and print the information on console
    // String eventType = event.getEventType();
    Id<Link> linkId = event.getLinkId();
    // String linkShortened = linkId.toString().substring(0, 10) + "...";
    Id<Person> personId = event.getPersonId();
    double time = event.getTime();
    String actType = event.getActType();
    // Id facilityId =	event.getFacilityId();
    // System.out.println("Type: " + eventType + " - LinkId: " + linkShortened + " - PersonId: " +
    // personId.toString()
    //		+ " - Time: " + time/60/60 + " - ActType: " + actType + " - FacilityId: " + facilityId);

    // count number of activity ends for every agent and store these numbers in a map
    if (!activityEndCount.containsKey(personId)) {
      activityEndCount.put(personId, 1);
    } else {
      int numberOfCompletedDepartures = activityEndCount.get(personId);
      activityEndCount.put(personId, numberOfCompletedDepartures + 1);
    }
    // System.out.println("Agent " + personId + " has " + activityEndCount.get(personId) + "
    // activity ends.");

    // create an instance of the object "Trip"
    Trip trip = new Trip();
    Id<Trip> tripId = Id.create(personId + "_" + activityEndCount.get(personId), Trip.class);
    trip.setTripId(tripId);
    trip.setPersonId(personId);
    trip.setDepartureLinkId(linkId);
    trip.setDepartureTime(time);
    // trip.setDepartureLegMode(legMode);
    trip.setActivityEndActType(actType);
    trips.put(tripId, trip);

    // check if activity end link is the same as previous activity start link
    if (activityEndCount.get(personId) >= 2) {
      int numberOfLastArrival = activityStartCount.get(personId);
      Id<Trip> lastTripId = Id.create(personId + "_" + numberOfLastArrival, Trip.class);
      if (!trips
          .get(tripId)
          .getDepartureLinkId()
          .equals(trips.get(lastTripId).getArrivalLinkId())) {
        // System.err.println("Activity end link differs from previous activity start link.");
        throw new RuntimeException("Activity end link differs from previous activity start link.");
      }
    }

    // check if type of ending activity is the same as type of previously started activity
    if (activityEndCount.get(personId) >= 2) {
      int numberOfLastArrival = activityStartCount.get(personId);
      Id<Trip> lastTripId = Id.create(personId + "_" + numberOfLastArrival, Trip.class);
      if (!trips
          .get(tripId)
          .getActivityEndActType()
          .equals(trips.get(lastTripId).getActivityStartActType())) {
        // System.err.println("Type of ending activity is not the same as type of previously started
        // activity.");
        throw new RuntimeException(
            "Type of ending activity is not the same as type of previously started activity.");
      }
    }
  }
 @Override
 public void handleEvent(ActivityEndEvent event) {
   CarrierAgent carrierAgent = getCarrierAgent(event.getPersonId());
   if (carrierAgent == null) return;
   carrierAgent.handleEvent(event);
 }
  @Override
  public void handleEvent(ActivityEndEvent event) {

    if (event.getActType().toString().equals("pt interaction")) {
      // pseudo activities are excluded

    } else {
      // a "real" activity is ended

      if (personId2currentTripNumber.containsKey(event.getPersonId())) {
        // the following trip is at least the person's second trip
        personId2currentTripNumber.put(
            event.getPersonId(), personId2currentTripNumber.get(event.getPersonId()) + 1);

        Map<Integer, Double> tripNumber2departureTime =
            personId2tripNumber2departureTime.get(event.getPersonId());
        tripNumber2departureTime.put(
            personId2currentTripNumber.get(event.getPersonId()), event.getTime());
        personId2tripNumber2departureTime.put(event.getPersonId(), tripNumber2departureTime);

        Map<Integer, Double> tripNumber2tripDistance =
            personId2tripNumber2tripDistance.get(event.getPersonId());
        tripNumber2tripDistance.put(personId2currentTripNumber.get(event.getPersonId()), 0.0);
        personId2tripNumber2tripDistance.put(event.getPersonId(), tripNumber2tripDistance);

        Map<Integer, Double> tripNumber2amount =
            personId2tripNumber2amount.get(event.getPersonId());
        tripNumber2amount.put(personId2currentTripNumber.get(event.getPersonId()), 0.0);
        personId2tripNumber2amount.put(event.getPersonId(), tripNumber2amount);

      } else {
        // the following trip is the person's first trip
        personId2currentTripNumber.put(event.getPersonId(), 1);

        Map<Integer, Double> tripNumber2departureTime = new HashMap<Integer, Double>();
        tripNumber2departureTime.put(1, event.getTime());
        personId2tripNumber2departureTime.put(event.getPersonId(), tripNumber2departureTime);

        Map<Integer, Double> tripNumber2tripDistance = new HashMap<Integer, Double>();
        tripNumber2tripDistance.put(1, 0.0);
        personId2tripNumber2tripDistance.put(event.getPersonId(), tripNumber2tripDistance);

        Map<Integer, Double> tripNumber2amount = new HashMap<Integer, Double>();
        tripNumber2amount.put(1, 0.0);
        personId2tripNumber2amount.put(event.getPersonId(), tripNumber2amount);
      }
    }
  }
 @Override
 public void handleEvent(ActivityEndEvent event) {
   if (event.getPersonId().equals(filterEventsForAgentId)) {
     System.out.println(event.toString());
   }
 }
 @Override
 public void handleEvent(ActivityEndEvent event) {
   if (!event.getPersonId().toString().startsWith("pt_tr"))
     locations.put(event.getPersonId(), network.getLinks().get(event.getLinkId()).getCoord());
 }