ecological-engine/src/main/java/org/gcube/dataanalysis/ecoengine/models/cores/aquamaps/AquamapsEnvelopeAlgorithm.java

240 lines
11 KiB
Java

package org.gcube.dataanalysis.ecoengine.models.cores.aquamaps;
import java.util.ArrayList;
import java.util.List;
import org.gcube.dataanalysis.ecoengine.utils.DatabaseFactory;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AquamapsEnvelopeAlgorithm {
private static Logger logger = LoggerFactory.getLogger(AquamapsEnvelopeAlgorithm.class);
private static final String selectValues = "SELECT DISTINCT %OCCURRENCEPOINTS%.CsquareCode, %OCCURRENCEPOINTS%.SpeciesID, %HCAF%.%1$s FROM %OCCURRENCEPOINTS% INNER JOIN %HCAF% ON %OCCURRENCEPOINTS%.CsquareCode = %HCAF%.CsquareCode WHERE %OCCURRENCEPOINTS%.SpeciesID = '%2$s' AND %HCAF%.%1$s <> -9999 AND %HCAF%.%1$s is not null AND %HCAF%.OceanArea > 0 AND %OCCURRENCEPOINTS%.goodcell = '1' ORDER BY %HCAF%.%1$s";
//gets the initialization value for a string object
public static String getElement(Object[] featuresVector,int index){
if (featuresVector[index] != null) return ""+featuresVector[index];
else return null;
}
//gets the initialization value for a numeric object
public static double getNumber(Object[] featuresVector,int index){
double number = -9999;
try{
number = ((Number)featuresVector[index]).doubleValue();
}catch(Exception e){}
return number;
}
public AquamapsEnvelopeAlgorithm(){
}
//calculate envelopes on feature sets
public static EnvelopeSet calculateEnvelopes(String species, Object[] singleSpeciesValues, OccurrencePointSets occurrencePointsList){
List<Object> tempvalues = new ArrayList<Object>();
List<Object> salinityvalues = new ArrayList<Object>();
List<Object> primprodvalues = new ArrayList<Object>();
List<Object> icevalues = new ArrayList<Object>();
List<Object> landdistvalues = new ArrayList<Object>();
List<OccurrencePoint> list = occurrencePointsList.getOccurrenceMap().get(""+EnvelopeName.TEMPERATURE);
for (OccurrencePoint op:list){
tempvalues.add(op.toObjectArray());
}
list = occurrencePointsList.getOccurrenceMap().get(""+EnvelopeName.SALINITY);
for (OccurrencePoint op:list){
salinityvalues.add(op.toObjectArray());
}
list = occurrencePointsList.getOccurrenceMap().get(""+EnvelopeName.PRIMARY_PRODUCTION);
for (OccurrencePoint op:list){
primprodvalues.add(op.toObjectArray());
}
list = occurrencePointsList.getOccurrenceMap().get(""+EnvelopeName.ICE_CONCENTRATION);
for (OccurrencePoint op:list){
icevalues.add(op.toObjectArray());
}
list = occurrencePointsList.getOccurrenceMap().get(""+EnvelopeName.LAND_DISTANCE);
for (OccurrencePoint op:list){
landdistvalues.add(op.toObjectArray());
}
//build up envelope set
EnvelopeSet envSet = calcEnv(species,singleSpeciesValues,tempvalues,salinityvalues,primprodvalues,icevalues,landdistvalues);
return envSet;
}
//the core of the procedure
public static EnvelopeSet calcEnv(String species, Object[] singleSpeciesValues, List<Object> tempvalues,List<Object> salinityvalues,List<Object> primprodvalues,List<Object> icevalues,List<Object> landdistvalues){
if (tempvalues.size()<10){
logger.warn("WARNING: NOT ENOUGH OCCURRENCES FOR SPECIES: "+species);
logger.warn("Leaving the hspen as is");
return new EnvelopeSet();
}
//take previousValues
Double prevIceMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,2);
Double prevIceMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,3);
Double prevIcePMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,4);
Double prevIcePMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,5);
Double prevSalinityMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,6);
Double prevSalinityMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,7);
Double prevSalinityPMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,8);
Double prevSalinityPMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,9);
Double prevLanddistMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,10);
Double prevLanddistMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,11);
Double prevLanddistPMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,12);
Double prevLanddistPMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,13);
Double prevTempMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,14);
Double prevTempMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,15);
Double prevTempPMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,16);
Double prevTempPMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,17);
Double prevPrimProdMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,18);
Double prevPrimProdMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,19);
Double prevPrimProdPMin = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,20);
Double prevPrimProdPMax = AquamapsEnvelopeAlgorithm.getNumber(singleSpeciesValues,21);
//previous values taken
String layer = getElement(singleSpeciesValues,1);
SpEnv_temp tempEnv = new SpEnv_temp();
tempEnv.calcEnvelope(layer, tempvalues);
SpEnv_salinity salinityEnv = new SpEnv_salinity();
salinityEnv.calcEnvelope(salinityvalues,layer);
SpEnv_primprod primprodEnv = new SpEnv_primprod();
primprodEnv.calcEnvelope(primprodvalues);
SpEnv_seaice seaiceEnv = new SpEnv_seaice();
seaiceEnv.calcEnvelope(icevalues);
SpEnv_landdist landdistEnv = new SpEnv_landdist();
landdistEnv.calcEnvelope(landdistvalues);
String addingElements = "";
int countchunks = 0;
if (!tempEnv.checkPrevious(prevTempMin,prevTempMax,prevTempPMin,prevTempPMax))
{
logger.warn("DIFFERENCE ON SPECIES: "+species+" - "+prevTempMin+","+prevTempPMin+","+prevTempPMax+","+prevTempMax+" vs "+tempEnv.toString());
addingElements+=tempEnv.toString();
countchunks++;
}
if (!salinityEnv.checkPrevious(prevSalinityMin,prevSalinityMax,prevSalinityPMin,prevSalinityPMax))
{
logger.warn("DIFFERENCE ON SPECIES: "+species+" - "+prevSalinityMin+","+prevSalinityPMin+","+prevSalinityPMax+","+prevSalinityMax+" vs "+salinityEnv.toString());
if (countchunks>0)
addingElements+=",";
addingElements+=salinityEnv.toString();
countchunks++;
}
if (!primprodEnv.checkPrevious(prevPrimProdMin,prevPrimProdMax,prevPrimProdPMin,prevPrimProdPMax))
{
logger.warn("DIFFERENCE ON SPECIES: "+species+" - "+prevPrimProdMin+","+prevPrimProdPMin+","+prevPrimProdPMax+","+prevPrimProdMax+" vs "+primprodEnv.toString());
if (countchunks>0)
addingElements+=",";
addingElements+=primprodEnv.toString();
countchunks++;
}
if (!seaiceEnv.checkPrevious(prevIceMin,prevIceMax,prevIcePMin,prevIcePMax))
{
logger.warn("DIFFERENCE ON SPECIES: "+species+" - "+prevIceMin+","+prevIcePMin+","+prevIcePMax+","+prevIceMax+" vs "+seaiceEnv.toString());
if (countchunks>0)
addingElements+=",";
addingElements+=seaiceEnv.toString();
countchunks++;
}
if (!landdistEnv.checkPrevious(prevLanddistMin,prevLanddistMax,prevLanddistPMin,prevLanddistPMax))
{
logger.warn("DIFFERENCE ON SPECIES: "+species+" - "+prevLanddistMin+","+prevLanddistPMin+","+prevLanddistPMax+","+prevLanddistPMax+" vs "+landdistEnv.toString());
if (countchunks>0)
addingElements+=",";
addingElements+=landdistEnv.toString();
countchunks++;
}
//build up envelope set
EnvelopeSet envSet = new EnvelopeSet();
envSet.addEnvelope(tempEnv.toEnvelope(EnvelopeName.TEMPERATURE));
envSet.addEnvelope(salinityEnv.toEnvelope(EnvelopeName.SALINITY));
envSet.addEnvelope(primprodEnv.toEnvelope(EnvelopeName.PRIMARY_PRODUCTION));
envSet.addEnvelope(seaiceEnv.toEnvelope(EnvelopeName.ICE_CONCENTRATION));
envSet.addEnvelope(landdistEnv.toEnvelope(EnvelopeName.LAND_DISTANCE));
envSet.setEnvelopeString(addingElements);
return envSet;
}
public static EnvelopeSet calculateEnvelopes(String species, SessionFactory vreConnection, String occurrencePointsTable, String HcafTable, Object[] singleSpeciesValues){
String dynamicSelectValues = selectValues.replace("%OCCURRENCEPOINTS%", occurrencePointsTable).replace("%HCAF%", HcafTable);
String layer = getElement(singleSpeciesValues,1);
String TemperatureField = "SSTAnMean";
String SalinityField = "SalinityMean";
String PrimProdField = "PrimProdMean";
String IceField = "IceConAnn";
String LanddistField = "LandDist";
if ((layer != null)&&(layer.equals("b"))){
TemperatureField = "SBTAnMean";
SalinityField = "SalinityBMean";
}
String TemperatureQuery = String.format(dynamicSelectValues,TemperatureField,species);
String SalinityQuery = String.format(dynamicSelectValues,SalinityField,species);
String PrimProdQuery = String.format(dynamicSelectValues,PrimProdField,species);
String IceQuery = String.format(dynamicSelectValues,IceField,species);
String LanddistQuery = String.format(dynamicSelectValues,LanddistField,species);
System.out.println(TemperatureQuery);
List<Object> tempvalues = DatabaseFactory.executeSQLQuery(TemperatureQuery, vreConnection);
List<Object> salinityvalues = DatabaseFactory.executeSQLQuery(SalinityQuery, vreConnection);
List<Object> primprodvalues = DatabaseFactory.executeSQLQuery(PrimProdQuery, vreConnection);
List<Object> icevalues = DatabaseFactory.executeSQLQuery(IceQuery, vreConnection);
List<Object> landdistvalues = DatabaseFactory.executeSQLQuery(LanddistQuery, vreConnection);
//build up envelope set
EnvelopeSet envSet = calcEnv(species,singleSpeciesValues,tempvalues,salinityvalues,primprodvalues,icevalues,landdistvalues);
return envSet;
}
public Object[] hspen2ObjectArray(Hspen hspen) {
//convert hspen to object array
Object [] singleHspen = new Object[22];
singleHspen[0] = hspen.getSpeciesID();singleHspen[1] = hspen.getLayer();
singleHspen[2] = hspen.getIceConcentration().getMin();singleHspen[3] = hspen.getIceConcentration().getMax();
singleHspen[4] = hspen.getIceConcentration().getPrefmin();singleHspen[5] = hspen.getIceConcentration().getPrefmax();
singleHspen[6] = hspen.getSalinity().getMin();singleHspen[7] = hspen.getSalinity().getMax();
singleHspen[8] = hspen.getSalinity().getPrefmin();singleHspen[9] = hspen.getSalinity().getPrefmax();
singleHspen[10] = hspen.getLandDistance().getMin();singleHspen[11] = hspen.getLandDistance().getMax();
singleHspen[12] = hspen.getLandDistance().getPrefmin();singleHspen[13] = hspen.getLandDistance().getPrefmax();
singleHspen[14] = hspen.getTemperature().getMin();singleHspen[15] = hspen.getTemperature().getMax();
singleHspen[16] = hspen.getTemperature().getPrefmin();singleHspen[17] = hspen.getTemperature().getPrefmax();
singleHspen[18] = hspen.getPrimaryProduction().getMin();singleHspen[19] = hspen.getPrimaryProduction().getMax();
singleHspen[20] = hspen.getPrimaryProduction().getPrefmin();singleHspen[21] = hspen.getPrimaryProduction().getPrefmax();
return singleHspen;
}
}