diff --git a/src/main/java/species/AnalyseLikelihoodOfPresence.java b/src/main/java/species/AnalyseLikelihoodOfPresence.java
new file mode 100644
index 0000000000000000000000000000000000000000..fa663d89d0331e6be1ec357736dc7d57f9587c99
--- /dev/null
+++ b/src/main/java/species/AnalyseLikelihoodOfPresence.java
@@ -0,0 +1,135 @@
+/**
+ * patrick
+ * @author Patrick Lambert
+ * @copyright Copyright (c) 2020, INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+package species;
+
+import java.io.FileReader;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.TreeMap;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+import environment.RiverBasin;
+import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
+import fr.cemagref.simaqualife.pilot.Pilot;
+
+/**
+ *
+ */
+public class AnalyseLikelihoodOfPresence extends AquaNismsGroupProcess<DiadromousFish, DiadromousFishGroup> {
+
+	private String presenceFileName = "data/input/northeastamerica/nea_presence.csv";
+	private String period = "obs_1751_1850";
+
+	/**
+	 * The minimum number of recruits to consider a basin as populated
+	 * 
+	 * @unit: #
+	 */
+	private int minimumRecruitsForPopulatedBasin = 50;
+
+	private double epsilon = 1e-3;
+
+	// map with presence
+	private transient Map<String, Map<String, Integer>> presences;
+
+	// logLikelihood
+	private transient double logLikelihood;
+
+	@Override
+	public void initTransientParameters(Pilot pilot) {
+		super.initTransientParameters(pilot);
+
+		if (Double.isNaN(epsilon))
+			epsilon = 1e-3;
+
+		try {
+			// open the file
+			FileReader reader = new FileReader(presenceFileName);
+			// Parsing the file
+			Scanner scanner = new Scanner(reader);
+			scanner.useLocale(Locale.ENGLISH); // to have a point as decimal
+			// separator !!!
+			// scanner.useDelimiter(Pattern.compile("[;,\r\n]"));
+
+			// read the headers
+			String[] headers = scanner.nextLine().split(",");
+			presences = new TreeMap<String, Map<String, Integer>>();
+			for (int i = 2; i < headers.length; i++) {
+				presences.put(headers[i], new TreeMap<String, Integer>());
+			}
+
+			// read the lines
+			while (scanner.hasNextLine()) {
+				String[] fields = scanner.nextLine().split(",");
+				// System.out.println(Arrays.toString(fields));
+
+				for (int j = 2; j < headers.length; j++) {
+					if (j >= fields.length)
+						presences.get(headers[j]).put(fields[1], -1);
+					else {
+						if (fields[j].compareTo("") == 0)
+							presences.get(headers[j]).put(fields[1], -1);
+						else
+							presences.get(headers[j]).put(fields[1], Integer.valueOf(fields[j]));
+					}
+				}
+			}
+			// reader.close();
+			// scanner.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+
+	@Override
+	public void doProcess(DiadromousFishGroup group) {
+		logLikelihood = 0.;
+		for (RiverBasin riverBasin : group.getEnvironment().getRiverBasins()) {
+			double p_predit = (double) riverBasin.getLastRecruitments()
+					.getNumberOfStriclyHigherValue(minimumRecruitsForPopulatedBasin)
+					/ (double) riverBasin.getLastRecruitments().size();
+
+			int presence = presences.get(riverBasin.getName()).get(period);
+
+			if (presence == 1)
+				logLikelihood += Math.log(p_predit) + epsilon;
+			else
+				logLikelihood += 1 - Math.log(p_predit) + epsilon;
+		}
+	}
+
+
+	/**
+	 * @return the logLikelihood
+	 */
+	public double getLogLikelihood() {
+		return this.logLikelihood;
+	}
+
+
+	public static void main(String[] args) {
+		System.out.println((new XStream(new DomDriver())).toXML(new AnalyseLikelihoodOfPresence()));
+	}
+
+}
diff --git a/src/main/java/species/AnalyseSpawnerFeatures.java b/src/main/java/species/AnalyseSpawnerFeatures.java
new file mode 100644
index 0000000000000000000000000000000000000000..57cc98119dc907221a9efa3639506a969ca8f3dd
--- /dev/null
+++ b/src/main/java/species/AnalyseSpawnerFeatures.java
@@ -0,0 +1,127 @@
+/**
+ * patrick
+ * @author Patrick Lambert
+ * @copyright Copyright (c) 2020, INRAE
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+package species;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+import environment.RiverBasin;
+import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
+import fr.cemagref.simaqualife.pilot.Pilot;
+import miscellaneous.QueueMemory;
+import species.DiadromousFish.Gender;
+
+/**
+ *
+ */
+public class AnalyseSpawnerFeatures extends AquaNismsGroupProcess<DiadromousFish, DiadromousFishGroup> {
+
+	private int memorySize = 30;
+
+	private transient Map<Integer, QueueMemory<Double>> femaleAgeMemories;
+	private transient Map<Integer, QueueMemory<Double>> maleAgeMemories;
+	private transient Map<Integer, QueueMemory<Double>> primiparousMemories;
+
+	@Override
+	public void initTransientParameters(Pilot pilot) {
+		super.initTransientParameters(pilot);
+
+	}
+
+
+	@Override
+	public void doProcess(DiadromousFishGroup group) {
+
+		// first passage
+		if (femaleAgeMemories == null) {
+			femaleAgeMemories = new HashMap<Integer, QueueMemory<Double>>();
+
+			for (RiverBasin riverBasin : group.getEnvironment().getRiverBasins()) {
+				femaleAgeMemories.put(riverBasin.getId(), new QueueMemory<>(memorySize));
+			}
+		}
+
+		for (RiverBasin riverBasin : group.getEnvironment().getRiverBasins()) {
+
+			if (riverBasin.getFishs(group) != null) {
+
+				double meanAgeForFemale = 0.;
+				double nbAgeForFemale = 0.;
+
+				double meanAgeForMale = 0.;
+				double nbAgeForMale = 0.;
+
+				double nbOfSpawners = 0.;
+				double nbOfPrimiparous = 0.;
+
+				for (DiadromousFish fish : riverBasin.getFishs(group)) {
+					if (fish.isMature()) {
+
+						// mean age
+						if (fish.getGender() == Gender.FEMALE) {
+							meanAgeForFemale += fish.getAge() * fish.getAmount();
+							nbAgeForFemale += fish.getAmount();
+						} else if (fish.getGender() == Gender.MALE) {
+							meanAgeForMale += fish.getAge() * fish.getAmount();
+							nbAgeForMale += fish.getAmount();
+						}
+
+						// primiparous
+						nbOfSpawners += fish.getAmount();
+						if (fish.getNumberOfReproduction() == 0)
+							nbOfPrimiparous += fish.getAmount();
+					}
+				}
+				// add value in the quues
+				femaleAgeMemories.get(riverBasin.getBasin_id()).add(meanAgeForFemale / nbAgeForFemale);
+				maleAgeMemories.get(riverBasin.getBasin_id()).add(meanAgeForMale / nbAgeForMale);
+				primiparousMemories.get(riverBasin.getBasin_id()).add(nbOfPrimiparous / nbOfSpawners);
+			}
+		}
+	}
+
+
+	public double[][] exportToR() {
+		int nbBasin = femaleAgeMemories.size();
+
+		double[][] result = new double[nbBasin][4];
+		int i = 0;
+
+		for (Entry<Integer, QueueMemory<Double>> entry : femaleAgeMemories.entrySet()) {
+			result[i][0] = entry.getKey();
+			result[i][1] = entry.getValue().getMean();
+			result[i][2] = maleAgeMemories.get(entry.getKey()).getMean();
+			result[i][3] = primiparousMemories.get(entry.getKey()).getMean();
+		}
+
+		return result;
+
+	}
+
+
+	public static void main(String[] args) {
+		System.out.println((new XStream(new DomDriver())).toXML(new AnalyseSpawnerFeatures()));
+	}
+
+}