Author: chatellier Date: 2010-11-17 12:13:13 +0000 (Wed, 17 Nov 2010) New Revision: 220 Log: Add density matrix and model display Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ChartService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/model/OccurrenceDensitySpecyListModel.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ChartService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ChartService.java 2010-11-16 17:12:30 UTC (rev 219) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ChartService.java 2010-11-17 12:13:13 UTC (rev 220) @@ -41,7 +41,6 @@ import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.CategoryToolTipGenerator; -import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.labels.StandardCategoryToolTipGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-16 17:12:30 UTC (rev 219) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-17 12:13:13 UTC (rev 220) @@ -1589,9 +1589,9 @@ public MatrixND getDensity(Project project, Selection selection) { // map species > "year, all density as double" - Map<String, Map<String, Set<Double>>> densityPerSpeciesAndYear = new HashMap<String, Map<String, Set<Double>>>(); - Set<String> lineNames = new HashSet<String>(); - Set<String> columns = new HashSet<String>(); + Map<String, Map<String, Map<String, Set<Double>>>> densityPerSpecyStrataYear = new HashMap<String, Map<String, Map<String, Set<Double>>>>(); + Set<String> speciesList = new HashSet<String>(); + Set<String> yearsList = new HashSet<String>(); // load map strataname > stratasurface Map<String, Double> startaAndSurface = new HashMap<String, Double>(); @@ -1621,9 +1621,10 @@ itHaul.next(); // skip header while (itHaul.hasNext()) { String[] tuple = itHaul.next(); - String haulKey = tuple[Haul.INDEX_YEAR] + ";" + tuple[Haul.INDEX_HAUL]; + String haul = tuple[Haul.INDEX_HAUL]; + String haulKey = tuple[Haul.INDEX_YEAR] + ";" + haul; String strataName = tuple[Haul.INDEX_STRATUM]; - haulAndStratas.put(haulKey, strataName); + haulAndStratas.put(haul, strataName); String sweptSurfaceAsString = tuple[Haul.INDEX_SWEPT_SURFACE]; try { @@ -1648,51 +1649,67 @@ while (itData.hasNext()) { String[] tuple = itData.next(); + String species = tuple[Catch.INDEX_SPECIES]; String year = tuple[Catch.INDEX_YEAR]; String haul = tuple[Catch.INDEX_HAUL]; - String species = tuple[Catch.INDEX_SPECIES]; String numberAsString = tuple[Catch.INDEX_NUMBER]; + String strata = haulAndStratas.get(haul); - lineNames.add(species); - columns.add(year); + speciesList.add(species); + yearsList.add(year); // compute density + // densparstrate=tapply(tab$Nombre/tab$SurfaceBalayee,list(tab$Espece, tab$Annee, tab$Strate), mean) try { Double number = Double.valueOf(numberAsString); Double sweptSurface = haulAndSweptSurface.get(year + ";" + haul); + Double density = null; if (sweptSurface == null) { if (log.isWarnEnabled()) { log.warn("Can't find swept surface for " + year + ";" + haul); } - continue; + density = 0.0; } - Double density = number / sweptSurface; + else { + density = number / sweptSurface; + } // count for species and year - Map<String, Set<Double>> specyDensityPerYear = densityPerSpeciesAndYear.get(species); - if (specyDensityPerYear == null) { - specyDensityPerYear = new HashMap<String, Set<Double>>(); + Map<String, Map<String, Set<Double>>> specyDensityPerStrataYear = densityPerSpecyStrataYear.get(species); + if (specyDensityPerStrataYear == null) { + specyDensityPerStrataYear = new HashMap<String, Map<String, Set<Double>>>(); + Map<String, Set<Double>> strataDensityPerYear = new HashMap<String, Set<Double>>(); Set<Double> densities = new HashSet<Double>(); densities.add(density); - specyDensityPerYear.put(year, densities); - densityPerSpeciesAndYear.put(species, specyDensityPerYear); + strataDensityPerYear.put(strata, densities); + specyDensityPerStrataYear.put(year, strataDensityPerYear); + densityPerSpecyStrataYear.put(species, specyDensityPerStrataYear); } else { - Set<Double> specyYearDensity = specyDensityPerYear.get(year); - if (specyYearDensity == null) { + Map<String, Set<Double>> strataDensityPerYear = specyDensityPerStrataYear.get(year); + if (strataDensityPerYear == null) { + strataDensityPerYear = new HashMap<String, Set<Double>>(); Set<Double> densities = new HashSet<Double>(); densities.add(density); - specyDensityPerYear.put(year, densities); + strataDensityPerYear.put(strata, densities); + specyDensityPerStrataYear.put(year, strataDensityPerYear); + } else { + Set<Double> specyYearDensity = strataDensityPerYear.get(strata); + if (specyYearDensity == null) { + specyYearDensity = new HashSet<Double>(); + specyYearDensity.add(density); + strataDensityPerYear.put(strata, specyYearDensity); + } + else { + specyYearDensity.add(density); + } } - else { - specyYearDensity.add(density); - } } // surfaceparstrate - String strata = haulAndStratas.get(haul); Double surface = startaAndSurface.get(strata); - surfacesParStrates.put(year + ";" + species, surface); + + surfacesParStrates.put(species + ";" + year + ";" + strata, surface); } catch (NumberFormatException ex) { if (log.isWarnEnabled()) { @@ -1702,30 +1719,44 @@ } // convert to matrix - List<String> lineNames2 = new ArrayList<String>(lineNames); - Collections.sort(lineNames2); - List<String> columnsNames2 = new ArrayList<String>(columns); - Collections.sort(columnsNames2); + List<String> sortedSpecies = new ArrayList<String>(speciesList); + Collections.sort(sortedSpecies); + List<String> sortedYears = new ArrayList<String>(yearsList); + Collections.sort(sortedYears); MatrixND matrix = MatrixFactory.getInstance().create("density", new List<?>[] { - lineNames2 , columnsNames2}); + sortedSpecies , sortedYears}); - for (Map.Entry<String, Map<String, Set<Double>>> dynMatrixEntry : densityPerSpeciesAndYear.entrySet()) { - for (Map.Entry<String, Set<Double>> haulCountForYearEntry : dynMatrixEntry.getValue().entrySet()) { - - // mean density - double totalDensity = 0; - double densityCount = 0; - for (Double singleDensity : haulCountForYearEntry.getValue()) { - totalDensity += singleDensity; - densityCount++; + for (Map.Entry<String, Map<String, Map<String, Set<Double>>>> dynMatrixEntry : densityPerSpecyStrataYear.entrySet()) { + String specy = dynMatrixEntry.getKey(); + for (Map.Entry<String, Map<String, Set<Double>>> haulCountForYearEntry : dynMatrixEntry.getValue().entrySet()) { + String year = haulCountForYearEntry.getKey(); + + // nombreparstrate= surfaceparstrate*densparstrate + // densiteparannee=apply(nombreparstrate,c(1,2),sum)/totsurface + double totalNombreparstrate = 0; + for (Map.Entry<String, Set<Double>> densityForYear : haulCountForYearEntry.getValue().entrySet()) { + + // maen density + double totalDensity = 0; + double densityCount = 0; + for (Double singleDensity : densityForYear.getValue()) { + totalDensity += singleDensity; + densityCount++; + } + double meanDensity = totalDensity / densityCount; + + String strata = densityForYear.getKey(); + Double surfaceparstrate = surfacesParStrates.get(specy + ";" + year + ";" + strata); + if (surfaceparstrate == null) { + log.warn("no surface for " + specy + ";" + year + ";" + strata); + surfaceparstrate = 0.0; + } + double nombreparstrate = surfaceparstrate * meanDensity; + totalNombreparstrate += nombreparstrate; } - double meanDensity = totalDensity / densityCount; - - // surfaceparstrate - //double surfaceparstrate = surfacesParStrates.get(haulCountForYearEntry.getKey() + ";" + dynMatrixEntry.getKey()); - - //TODO echatellier 20101109 finir - //matrix.setValue(dynMatrixEntry.getKey(), haulCountForYearEntry.getKey(), occurence); + double densiteparannee = totalNombreparstrate / totalSourface; + + matrix.setValue(specy, year, densiteparannee); } } Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-11-16 17:12:30 UTC (rev 219) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-11-17 12:13:13 UTC (rev 220) @@ -354,8 +354,6 @@ Assert.assertTrue(commands.get(3) instanceof DeleteLineCommand); Assert.assertTrue(commands.get(4) instanceof ModifyFieldCommand); Assert.assertTrue(commands.get(5) instanceof MergeSpeciesCommand); - - } /** @@ -385,4 +383,18 @@ MatrixND matrix = projectService.getOccurrence(project, selection); Assert.assertNotNull(matrix); } + + /** + * Test de la méthode densité. + * + * @throws CoserBusinessException + */ + @Test + public void getDensity() throws CoserBusinessException { + Project project = createTestProject(projectService); + Selection selection = projectService.initProjectSelection(project); + selection.setName("test"); + MatrixND matrix = projectService.getDensity(project, selection); + Assert.assertNotNull(matrix); + } } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-11-16 17:12:30 UTC (rev 219) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-11-17 12:13:13 UTC (rev 220) @@ -96,11 +96,12 @@ Project project = view.getContextValue(Project.class); ProjectService projectService = view.getContextValue(ProjectService.class); MatrixND occurrence = projectService.getOccurrence(project, selection); - //MatrixND density = projectService.getDensity(project, selection); + MatrixND density = projectService.getDensity(project, selection); //MatrixND samplingEffort = projectService.getSamplingEffort(project, selection); // set matrix on list model selectionListsView.getSelectionOccurrenceDensityListModel().setOccurrence(occurrence); + selectionListsView.getSelectionOccurrenceDensityListModel().setDensity(density); // fill all specy data (at final) selectionListsView.getSelectionAllSpeciesListModel().setSpecies(selectionSpecyList); @@ -485,6 +486,5 @@ view.getMatrixPanelEditor().setMatrix(samplingEffort); view.getMatrixPanelEditor().getTable().setDefaultRenderer(String.class, new SamplingEffortRenderer((MatrixTableModelND)view.getMatrixPanelEditor().getTableModel())); - //projectService.getOccurence(project, selection); } } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/model/OccurrenceDensitySpecyListModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/model/OccurrenceDensitySpecyListModel.java 2010-11-16 17:12:30 UTC (rev 219) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/model/OccurrenceDensitySpecyListModel.java 2010-11-17 12:13:13 UTC (rev 220) @@ -55,6 +55,8 @@ protected MatrixND occurrence = null; + protected MatrixND density = null; + public List<String> getSpecies() { return species; } @@ -68,14 +70,20 @@ this.occurrence = occurrence; } + public void setDensity(MatrixND density) { + this.density = density; + } + public double getOccurrence(String specy) { List<String> years = (List<String>)occurrence.getSemantic(1); double result = occurrence.getValue(specy, years.get(0)); return result; } - + public double getDensity(String specy) { - return 6.0; + List<String> years = (List<String>)density.getSemantic(1); + double result = density.getValue(specy, years.get(0)); + return result; } /*