All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fudaa.dodico.telemac.io.ScopeStructure Maven / Gradle / Ivy

There is a newer version: 2.7
Show newest version
package org.fudaa.dodico.telemac.io;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.fudaa.dodico.mesure.EvolutionReguliere;

/**
 * Structure de donn?es utilis?e pour la lecture des fichiers scope.
 * 
 * @author Adrien Hadoux
 */
public abstract class ScopeStructure {

  public final static String NOM_FICHIER = "Chemin absolu";

  public final static ScopeKeyWord KEY = new ScopeKeyWord();

  //  public abstract void printResults();

  public abstract EvolutionReguliere[] returnEvolReguliere(File fichier);

  public abstract String getTitleFormFile();

  /**
   * Structure pour les fichiers s ou t Par convention les x sont les premieres variables.
   * 
   * @author Adrien
   */
  public static class SorT extends ScopeStructure {

    private Map> data_ = new HashMap>();

    private List listeVariales_ = new ArrayList();

    private List titles_ = new ArrayList();

    public String type;

    public SorT() {
    }

    public void addTitle(String ligne) {
      ligne = ligne.replace(KEY.getBlocCommentaireSorT(), "");
      titles_.add(ligne);
    }

    public void addVariable(String ligne) {

      ligne = ligne.replace(KEY.getBlocCommentaireSorT(), "");

      listeVariales_.add(ligne);
      // on init la liste des valeurs de la variabel correspondante
      data_.put(ligne, new ArrayList());
    }

    public int getNbVariables() {
      return listeVariales_.size();
    }

    public String getVariable(int _i) {
      return listeVariales_.get(_i);
    }

    public List getListValueForVariable(int i) {
      return data_.get(getVariable(i));
    }

    public double getValueOfvariable(int indexVar, int indexValue) {
      return getListValueForVariable(indexVar).get(indexValue);
    }

    public void addValueForVariable(double value, int indexVariable) {
      data_.get(listeVariales_.get(indexVariable)).add(value);
    }

    /**
     * Recupere la liste des x. Par convention les x sont les premieres variables.
     * 
     * @return
     */
    public List getAllX() {
      return data_.get(listeVariales_.get(0));
    }

    /**
     * retourne un x sp?cifi?.
     * 
     * @param i
     * @return
     */
    public double getX(int i) {
      return getAllX().get(i);
    }

    private void insertX(double x) {
      getAllX().add(x);
    }

    public double getXMax() {
      double max = getX(0);
      for (int i = 1; i < getAllX().size(); i++)
        if (max < getX(i))
          max = getX(i);
      return max;
    }

    public double getXMin() {
      double min = getX(0);
      for (int i = 1; i < getAllX().size(); i++)
        if (min > getX(i))
          min = getX(i);
      return min;
    }

    /**
     * Methode qui insert le x dans les variables que si il n'existe pas deja.
     * 
     * @param x
     */
    public void insertNewX(double x) {

      for (int i = 0; i < getAllX().size(); i++)
        if (x == getX(i))
          return;
      insertX(x);
    }

    /**
     * Retourne le nombre de valeur pour chaque variables
     * 
     * @return
     */
    public int getNbValuePerVariables() {

      if (listeVariales_.size() == 0)
        return 0;
      return data_.get(listeVariales_.get(0)).size();
    }

    /**
     * retourne une string qui contient toutes les valeurs a l indice value pour toutes les variables
     * 
     * @param indice dans les tableaux des variables
     * @return
     */
    public String getListValuesofAllVariable(int indiceValue) {
      String brochetteVal = "";

      for (int i = 0; i < getNbVariables(); i++) {
        if (i > 0)
          brochetteVal += " ";
        if (data_.get(listeVariales_.get(i)).get(indiceValue) != KEY.VALUE_UNDEFINED)
          brochetteVal += data_.get(listeVariales_.get(i)).get(indiceValue);
        else brochetteVal += KEY.SYMBOL_VALUE_UNDEFINED;

      }
      return brochetteVal;
    }

    /**
     * Transforme la structure en evol regulieres. correction PREPRO-15
     * 
     * @author Adrien Hadoux
     * @return
     */
    @Override
    public EvolutionReguliere[] returnEvolReguliere(File fichier) {
      EvolutionReguliere[] evolReg = new EvolutionReguliere[getNbVariables() - 1];

      // -- on parcours toutes les variables --//
      for (int i = 1; i < getNbVariables(); i++) {
        String nomVar = getVariable(i);

        List listeX = getAllX();
        List listeY = getListValueForVariable(i);

        double[] tabX = new double[listeX.size()];
        double[] tabY = new double[listeY.size()];

        for (int j = 0; j < listeX.size(); j++) {
          tabX[j] = listeX.get(j);
          tabY[j] = listeY.get(j);

        }

        evolReg[i - 1] = new EvolutionReguliere(tabX, tabY, false);
        evolReg[i - 1].setNom("courbe de " + nomVar.replace("  ", ""));
        evolReg[i - 1].isScope_ = true;
        //-- ajout des infos specifiques --//
        Map infos = evolReg[i - 1].infos_;
        infos.put("Type", "Profil scop");
        infos.put("Fichier scop", fichier.getName());
        infos.put(NOM_FICHIER, fichier.getAbsolutePath());
        infos.put("Variable", nomVar.replace("  ", ""));

      }
      return evolReg;
    }

    /**
     * Methode qui restreint lq structure en ne prenant que les variqbles choisies et la plage de x.
     * 
     * @param selectedVariables
     * @param xMin
     * @param xMax
     */
    public void restreindreStructure(int[] selectedVariables, double xMin, double xMax) {

      //--on retire toutes les variables qui ne sont pas voulues --//
      Map> newdatas_ = new HashMap>();
      ArrayList newVariables = new ArrayList();

      //ajout des x
      newVariables.add(getVariable(0));
      newdatas_.put(getVariable(0), getAllX());

      for (int i = 0; i < selectedVariables.length; i++) {
        //la bonne variable est selectedVariables[i]+1 car dans le choix on avait enlev? les X
        newdatas_.put(getVariable(selectedVariables[i] + 1), getListValueForVariable(selectedVariables[i] + 1));
        newVariables.add(getVariable(selectedVariables[i] + 1));
      }

      //on retire les x qui ne sont pas les plages 
      for (int k = 0; k < getNbValuePerVariables(); k++) {
        if (getX(k) > xMax || getX(k) < xMin) {
          for (String var : newVariables) {
            newdatas_.get(var).remove(k);
          }
          k--;
        }
      }

      //-- on remplace les nouvelles valeurs --//
      data_ = newdatas_;
      listeVariales_ = newVariables;

      //test

    }

    @Override
    public String getTitleFormFile() {
      // TODO Auto-generated method stub
      String title = "";
      for (String partie : titles_)
        title += " " + partie;

      return title;
    }

  }

  /**
   * @author Adrien Hadoux. Classe les donnees par pas de temps. Chaque pas de temps contient une liste de variables.
   *         chaque variable contient des valeurs.
   */
  public static class Gene extends ScopeStructure {

    /**
     * Map qui donne a chaque separator sa liste de valeurs pour chaque variables.
     */
    private Map>> data_ = new HashMap>>();

    private List listeSeparator = new ArrayList();

    private List listeVariales_ = new ArrayList();

    private List titles_ = new ArrayList();

    public String type = ScopeKeyWord.TYPE_COURBE_MIXTE;

    public Gene() {
      // ajout par defaut des variables x
      listeVariales_.add("X");
    }

    public void addTitle(String ligne) {
      ligne = ligne.replace(KEY.getBlocCommentaireGENE(), "");
      titles_.add(ligne);
    }

    public void addVariable(String ligne) {
      ligne = ligne.replace(KEY.getBlocCommentaireGENE(), "");
      listeVariales_.add(ligne);
    }

    public ArrayList getAllX(String pdt) {
      return data_.get(pdt).get(0);
    }

    /**
     * retourne un x sp?cifi?.
     * 
     * @param i
     * @return
     */
    public double getX(int i, String pdt) {
      return getAllX(pdt).get(i);
    }

    private void insertX(double x, String pdt) {
      getAllX(pdt).add(x);
    }

    public double getXMax() {
      double max = getX(0, listeSeparator.get(0));

      for (int j = 0; j < listeSeparator.size(); j++)
        for (int i = 1; i < getAllX(listeSeparator.get(j)).size(); i++)
          if (max < getX(i, listeSeparator.get(j)))
            max = getX(i, listeSeparator.get(j));
      return max;
    }

    public double getXMin() {
      double min = getX(0, listeSeparator.get(0));

      for (int j = 0; j < listeSeparator.size(); j++)
        for (int i = 1; i < getAllX(listeSeparator.get(j)).size(); i++)
          if (min > getX(i, listeSeparator.get(j)))
            min = getX(i, listeSeparator.get(j));
      return min;
    }

    /**
     * Methode qui insert le x dans les variables que si il n'existe pas deja.
     * 
     * @param x
     */
    public void insertNewX(double x, String pdt) {

      for (int i = 0; i < getAllX(pdt).size(); i++)
        if (x == getX(i, pdt))
          return;
      insertX(x, pdt);
    }

    @Override
    public String getTitleFormFile() {
      // TODO Auto-generated method stub
      String title = "";
      for (String partie : titles_)
        title += " " + partie;

      return title;
    }

    public void addSeparator(String ligne) {
      ligne = ligne.replace(KEY.getBlocCommentaireGENE(), "");

      listeSeparator.add(ligne);

      // on ajoute un enregistrment dans data pour le pas de temps
      // correspondant
      ArrayList> listeDuPdt = new ArrayList>();
      data_.put(ligne, listeDuPdt);

      // --il faut initialiser cette liste du pas de temps en y ajoutant autant
      // de listes qu il y a de variables --//
      for (int i = 0; i < getNbVariables(); i++)
        listeDuPdt.add(new ArrayList());

    }

    // public void addVariableForPDt(String labelVariable, int pdt) {
    // labelVariable = labelVariable.replace(KEY.getBlocCommentaireGENE(), "");
    // listeVariales_.add(labelVariable);
    // getListeVarForPasDeTemps(pdt).add(new ArrayList());
    //
    // }

    public int getNbSeparator() {
      return listeSeparator.size();
    }

    public int getNbVariables() {
      return listeVariales_.size();
    }

    public ArrayList> getListeVarForSeparator(String pdt) {
      return data_.get(pdt);
    }

    public ArrayList> getListeVarForSeparator(int pdt) {
      return data_.get(listeSeparator.get(pdt));
    }

    public ArrayList getListValueForVariableForSeparator(String separator, int var) {

      return getListeVarForSeparator(separator).get(var);
    }

    public int getVariablePosition(String nomVar) {
      for (int i = 0; i < getNbVariables(); i++)
        if (getVariable(i).equals(nomVar))
          return i;
      return -1;
    }

    public void addValueForVariableAtSeparator(double value, int indexVariable, String nameSeparator) {
      ArrayList listeValueOfVar = getListValueForVariableForSeparator(nameSeparator, indexVariable);
      // if (listeValueOfVar == null)
      // listeValueOfVar = new ArrayList();

      listeValueOfVar.add(value);
    }

    /**
     * tailel par defaut des donnees pour une variale donn? pour un pas de temps donn?
     * 
     * @return
     */
    // public int getNbValuePerVariablesPerPdt() {
    //
    // return getListValueForVariableForPDT(listePasDeTemps.get(0), 0).size();
    // }

    /**
     * retourne l equivalent d une ligne du fichier qui contient les valeurs pour chaque variables pour un pas de temps
     * donn?.
     * 
     * @param separator
     * @return
     */
    public String getAllValuesForVariableAndSeparator(String separator, int indiceValue) {

      String ligneBrochette = "";
      for (int i = 0; i < listeVariales_.size(); i++) {
        ArrayList listeValueOfVar = getListValueForVariableForSeparator(separator, i);
        if (i != 0)
          ligneBrochette += " ";
        if (listeValueOfVar.size() <= indiceValue)
          ligneBrochette += KEY.SYMBOL_VALUE_UNDEFINED;
        else if (listeValueOfVar.get(indiceValue) != KEY.VALUE_UNDEFINED)
          ligneBrochette += listeValueOfVar.get(indiceValue);
        else ligneBrochette += KEY.SYMBOL_VALUE_UNDEFINED;
      }

      return ligneBrochette;
    }

    public String getSeparator(int i) {
      return listeSeparator.get(i);
    }

    public String getVariable(int i) {
      return listeVariales_.get(i);
    }

    public int getNbTitles() {
      return titles_.size();
    }

    public String getTitle(int i) {
      return titles_.get(i);
    }

    /**
     * Retourne les evolutions regulieres des profils spatiaux.
     */
    @Override
    public EvolutionReguliere[] returnEvolReguliere(File fichier) {
      EvolutionReguliere[] evolReg = new EvolutionReguliere[getNbSeparator() * (getNbVariables() - 1)];

      // -- on parcours tous les pas de temps --//
      for (int h = 0; h < getNbSeparator(); h++) {

        String pdt = getSeparator(h);

        // -- on parcours toutes les variables et non les x --//
        for (int i = 0; i < getNbVariables() - 1; i++) {
          String nomVar = getVariable(i + 1);

          List listeX = getAllX(pdt);
          List listeY = getListValueForVariableForSeparator(pdt, i + 1);

          double[] tabX = new double[listeX.size()];
          double[] tabY = new double[listeY.size()];

          for (int j = 0; j < listeX.size(); j++) {
            tabX[j] = listeX.get(j);
            tabY[j] = listeY.get(j);

          }

          evolReg[i] = new EvolutionReguliere(tabX, tabY, false);
          evolReg[i].setNom("courbe de " + nomVar.replace("  ", ""));
          evolReg[i].setUnite(nomVar);
          evolReg[i].isScope_ = true;
          //-- ajout des infos specifiques --//
          //       Map infos= evolReg[i].infos_;
          //       infos.put("Type", "Profil spatial scopGene");
          //       infos.put("Fichier scopGENE", fichier.getName());
          //       infos.put(NOM_FICHIER, fichier.getAbsolutePath());
          //       infos.put("Variable", nomVar.replace("  ", ""));
          //       infos.put("Plage de valeurs", pdt);
        }

      }
      return evolReg;
    }

    /**
     * Methode qui essaie d'extraire le nombre de la chaine de separator (utilis? pour les evol temporelles). Si n'y
     * arrive pas, retourne l'indice du separateur. Normalement les separateurs sont de la forme suivante: VAR = VALUE
     * c'est value qui nous interesse.
     * 
     * @param indiceSeparator
     * @return
     */
    public double getValueExtractOfSeparator(int indiceSeparator) {

      String separator = getSeparator(indiceSeparator);

      if (separator.lastIndexOf(' ') != -1) {
        String sub = separator.substring(separator.lastIndexOf(' '), separator.length());

        try {
          double value = Double.parseDouble(sub);

          return value;

        } catch (NumberFormatException e) {
          return indiceSeparator;
        }

      }
      return indiceSeparator;
    }

    /**
     * A utiliser poru transformer scopgen en evol temporelles. On cree une courbe par variables, et on prend les points
     * de tous les separaor pou les former.
     * 
     * @return
     */
    public EvolutionReguliere[] returnEvolRegulierePourTemporelles(double xVoulu, File fichier) {
      EvolutionReguliere[] evolReg = new EvolutionReguliere[getNbVariables() - 1];

      // -- on parcours toutes les variables et non les x, on a une seule variable --//
      for (int i = 0; i < getNbVariables() - 1; i++) {
        //-- on recupere les variables i+1 car la var 0 = les X --//  
        String nomVar = getVariable(i + 1);

        List listeTOTALX = new ArrayList();
        List listeTOTALY = new ArrayList();

        for (int k = 0; k < getNbSeparator(); k++) {

          //on recupere les x de ce separator
          List listX = getListValueForVariableForSeparator(getSeparator(k), 0);
          //on recupere tous les y de la variable de la courbe
          List listY = getListValueForVariableForSeparator(getSeparator(k), i + 1);

          //-- le x correspond ? la valeur du caractere de separation--//
          double x = getValueExtractOfSeparator(k);

          //-- il faut recuperer le y le plus proche du x voulu en regardant les indices --//

          //-- recuperation de l'indice du x le plus proche --//
          int indiceXproche = 0;
          double min = Math.abs(xVoulu - listX.get(0));
          for (int g = 0; g < listX.size(); g++)
            if (min > Math.abs(xVoulu - listX.get(g))) {
              min = Math.abs(xVoulu - listX.get(g));
              indiceXproche = g;
            }

          double y = listY.get(indiceXproche);

          //on ajoute tout cela au x et y totaux
          listeTOTALX.add(x);
          listeTOTALY.add(y);

        }

        //creation de l evol reguliere
        double[] tabX = new double[listeTOTALX.size()];
        double[] tabY = new double[listeTOTALX.size()];
        for (int j = 0; j < listeTOTALX.size(); j++) {
          tabX[j] = listeTOTALX.get(j);
          tabY[j] = listeTOTALY.get(j);
        }
        evolReg[i] = new EvolutionReguliere(tabX, tabY, false);
        evolReg[i].setNom(nomVar.replace("  ", "") + " sur [" + getSeparator(0).replace("  ", "") + ";"
            + getSeparator(getNbSeparator() - 1).replace("  ", "") + "] pour X choisi=" + xVoulu);
        evolReg[i].setUnite(nomVar);
        evolReg[i].isScope_ = true;

        evolReg[i].titreAxeX_ = "T";
        evolReg[i].uniteAxeX_ = "secondes";
        evolReg[i].titreAxeY_ = nomVar.replace("  ", "");
        evolReg[i].uniteAxeY_ = null;
        evolReg[i].setxAxeIsTime(true);

        //-- ajout des infos specifiques --//
        Map infos = evolReg[i].infos_;
        infos.put("Type", "Profil temporel scopGene");
        infos.put("Fichier scopGENE", fichier.getName());
        infos.put(NOM_FICHIER, fichier.getAbsolutePath());
        infos.put("Variable", nomVar.replace("  ", ""));
        infos.put("X choisi", xVoulu);
        infos.put("Intervalle", "[" + getSeparator(0).replace("  ", "") + ";" + getSeparator(getNbSeparator() - 1).replace("  ", "") + "]");
      }

      return evolReg;
    }

    /**
     * Methode reservee pour les correlations, on genere une courbe a la fois. les x seront la variable du separator
     * specifi? les Y idem
     * 
     * @return
     */
    public EvolutionReguliere[] returnEvolReguliereCorrelation(int varX, int varY, int separatorX, int separatorY, File fichier) {
      EvolutionReguliere[] evolReg = new EvolutionReguliere[1];

      List listeX = getListValueForVariableForSeparator(getSeparator(separatorX), varX + 1);
      List listeY = getListValueForVariableForSeparator(getSeparator(separatorY), varY + 1);

      double[] tabX = new double[Math.min(listeX.size(), listeY.size())];
      double[] tabY = new double[Math.min(listeX.size(), listeY.size())];

      for (int j = 0; j < Math.min(listeX.size(), listeY.size()); j++) {
        tabX[j] = listeX.get(j);
        tabY[j] = listeY.get(j);

      }

      evolReg[0] = new EvolutionReguliere(tabX, tabY, false);
      evolReg[0].setNom("Correlation:(X=" + getVariable(varX + 1).replace("  ", "") + "//Y=" + getVariable(varY + 1).replace("  ", "") + ")");
      evolReg[0].setUnite(getVariable(varX + 1));
      evolReg[0].isScope_ = true;

      evolReg[0].titreAxeX_ = getVariable(varX + 1).replace("  ", "");
      evolReg[0].uniteAxeX_ = null;
      evolReg[0].titreAxeY_ = getVariable(varY + 1).replace("  ", "");
      evolReg[0].uniteAxeY_ = null;

      //-- ajout des infos specifiques --//
      Map infos = evolReg[0].infos_;
      infos.put("Type", "Correlation scopGene");
      infos.put("Fichier scopGENE", fichier.getName());
      infos.put(NOM_FICHIER, fichier.getAbsolutePath());
      infos.put("Variable X", getVariable(varX + 1).replace("  ", "") + " pour la plage " + getSeparator(separatorX));
      infos.put("Variable Y", getVariable(varY + 1).replace("  ", "") + " pour la plage " + getSeparator(separatorY));

      return evolReg;
    }

    /**
     * Methode qui reduit la structure en ne conservant que les separator de debut et de fin. la liste des variables
     * dont les indices doivents etre incr?ment?s car pas de x. et ne garder que le x choisi et interpoler les valeur de
     * facon lin?aire.
     * 
     * @param debSeparator
     * @param finSeparator
     * @param listVariables
     * @param xchoosen
     */
    public void restreindreStructure(int debSeparator, int finSeparator, int[] listVariables, double xchoosen) {

      //on reduit les separator a la liste voulue 
      restreindreStructure(debSeparator, finSeparator);

      //on reduit les variables
      restreindreStructure(listVariables);

      //on interpole pour le x choisi
      //restreindreStructure(xchoosen);

    }

    public void restreindreStructure(int debSeparator, int finSeparator) {
      Map>> newdata_ = new HashMap>>();
      List newlisteSeparator = new ArrayList();

      // on ajoute les separator de la plage
      for (int i = 0; i < getNbSeparator(); i++) {
        if (i >= debSeparator && i <= finSeparator) {
          String newSepa = getSeparator(i);
          newlisteSeparator.add(newSepa);
          newdata_.put(newSepa, getListeVarForSeparator(i));
        }
      }
      listeSeparator = newlisteSeparator;
      data_ = newdata_;

    }

    public void restreindreStructure(int[] listVariables) {
      Map>> newdata_ = new HashMap>>();
      List newlisteVariables = new ArrayList();

      //on ajoute par defaut les x
      newlisteVariables.add(getVariable(0));

      //on ajout les news variabels
      for (int j = 0; j < listVariables.length; j++)
        newlisteVariables.add(getVariable(listVariables[j] + 1));

      // on ajoute uniquement les datas de ces variables
      for (int i = 0; i < getNbSeparator(); i++) {

        ArrayList> newVariablePerValidator = new ArrayList>();

        //on ajoute tout dabord tous les x
        newVariablePerValidator.add(getAllX(getSeparator(i)));

        for (int j = 0; j < listVariables.length; j++) {
          //il faut incrementer de 1 car pas de X pris en compte pour les choix de var or ici c est l'elt 0
          int selectedVar = listVariables[j] + 1;
          newVariablePerValidator.add(getListValueForVariableForSeparator(getSeparator(i), selectedVar));

        }
        newdata_.put(getSeparator(i), newVariablePerValidator);

      }
      listeVariales_ = newlisteVariables;
      data_ = newdata_;

    }

    public void restreindreStructure(double xchoosen) {

      for (int i = 0; i < getNbSeparator(); i++) {

        ArrayList listeX = getAllX(getSeparator(i));

        int indiceProche = 0;
        double xProche = listeX.get(0);
        //etape 1 on recherche le x le plus proche du xchoosen
        for (int k = 1; k < listeX.size(); k++) {
          double test = listeX.get(k);
          if (Math.abs(test - xchoosen) < Math.abs(xProche - xchoosen)) {
            xProche = test;
            indiceProche = k;
          }
        }

        //on ne conserve dans chaque liste des variables que la valeur correspondante au xProche
        for (int j = 0; j < getNbVariables(); j++) {

          ArrayList listeValueVar = getListValueForVariableForSeparator(getSeparator(i), j);
          double conservVar = listeValueVar.get(indiceProche);
          for (int h = 0; h < listeValueVar.size();)
            listeValueVar.remove(h);
          listeValueVar.add(conservVar);

        }
      }

    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy