EpisimPotentialInfectionEvent.java

package org.matsim.episim.events;

import org.matsim.api.core.v01.Id;
import org.matsim.api.core.v01.events.Event;
import org.matsim.api.core.v01.population.Person;
import org.matsim.core.api.internal.HasPersonId;
import org.matsim.episim.model.VirusStrain;

import static org.matsim.episim.events.EpisimInfectionEvent.*;

import java.util.Map;


/**
 * Notifies when a person got infected by another person.
 */
public class EpisimPotentialInfectionEvent extends Event implements HasPersonId, Comparable<Event> {

	static final String EVENT_TYPE = "episimPotentialInfection";
	static final String UNVAC_PROBABILITY = "unVacProbability";
	static final String RND = "rnd";

	private final Id<Person> personId;
	private final Id<Person> infectorId;
	private final Id<?> containerId;
	private final String infectionType;
	private final int groupSize;
	private final VirusStrain virusStrain;
	private final double probability;
	private final double antibodies;

	private final double unVacProbability;
	private final double rnd;

	/**
	 * Constructor.
	 */
	public EpisimPotentialInfectionEvent(double time, Id<Person> personId, Id<Person> infectorId, Id<?> containerId, String infectionType,
	                                     int groupSize, VirusStrain strain, double probability, double unVacProbability, double antibodies, double rnd) {

		super(time);

		this.personId = personId;
		this.infectorId = infectorId;
		this.containerId = containerId;
		this.infectionType = infectionType;
		this.groupSize = groupSize;
		this.virusStrain = strain;
		this.probability = probability;
		this.antibodies = antibodies;

		this.unVacProbability = unVacProbability;
		this.rnd = rnd;
	}

	@Override
	public String getEventType() {
		return EpisimPotentialInfectionEvent.EVENT_TYPE;
	}

	@Override
	public Id<Person> getPersonId() {
		return personId;
	}

	public Id<?> getContainerId() {
		return containerId;
	}

	/**
	 * Person who infected {@code #getPersonId}.
	 */
	public Id<Person> getInfectorId() {
		return infectorId;
	}

	/**
	 * How this infection happened. Activity of person and infector separated by underscore.
	 */
	public String getInfectionType() {
		return infectionType;
	}

	/**
	 * Variant which the person was infected with.
	 */
	public VirusStrain getStrain() {
		return virusStrain;
	}

	public int getGroupSize() {
		return groupSize;
	}

	public VirusStrain getVirusStrain() {
		return virusStrain;
	}

	public double getProbability() {
		return probability;
	}

	public double getUnVacProbability() {
		return unVacProbability;
	}

	public double getRnd() {
		return rnd;
	}

	public double getAntibodies() {
		return antibodies;
	}

	@Override
	public Map<String, String> getAttributes() {
		Map<String, String> attr = super.getAttributes();

		attr.put(CONTAINER, containerId.toString());
		attr.put(INFECTOR, infectorId.toString());
		attr.put(INFECTION_TYPE, infectionType);
		attr.put(GROUP_SIZE, Integer.toString(groupSize));
		attr.put(PROBABILITY, Double.toString(probability));
		attr.put(VIRUS_STRAIN, virusStrain.toString());
		attr.put(ANTIBODIES, Double.toString(antibodies));

		attr.put(UNVAC_PROBABILITY, Double.toString(unVacProbability));
		attr.put(RND, Double.toString(rnd));

		return attr;
	}


	@Override
	public int compareTo(Event obj) {

		// Defines a stable ordering for events
		if (getTime() != obj.getTime())
			return Double.compare(getTime(), obj.getTime());

		EpisimPotentialInfectionEvent o;
		if (obj instanceof EpisimPotentialInfectionEvent)
			o = (EpisimPotentialInfectionEvent) obj;
		else
			return -1;

		if (infectorId != o.infectorId)
			return infectorId.compareTo(o.infectorId);

		if (containerId != o.containerId)
			return containerId.toString().compareTo(o.containerId.toString());

		if (probability != o.probability)
			return Double.compare(probability, o.probability);

		return 0;
	}
}