Salome HOME
String et Script pour les observers
[modules/adao.git] / bin / AdaoCatalogGenerator.py
index 22b2148666bf3a81130e0cdb11c85725e42a7adc..941d1dd3c32f409f5865cef678adc97ec541429b 100644 (file)
@@ -1,5 +1,5 @@
 #-*- coding:utf-8 -*-
-#  Copyright (C) 2008-2009  EDF R&D
+#  Copyright (C) 2008-2011  EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU General Public
@@ -40,43 +40,25 @@ from Accas import *
 
 JdC = JDC_CATA (code = 'ADAO',
                 execmodul = None,
-                regles = ( AU_MOINS_UN ('ASSIM_STUDY')),
+                regles = ( AU_MOINS_UN ('ASSIMILATION_STUDY'), AU_PLUS_UN ('ASSIMILATION_STUDY')),
                )
 """
 
-String_data_bloc = """
-                                     STRING_DATA = BLOC ( condition = " FROM in ( 'String', ) ",
-
-                                                  STRING = SIMP(statut = "o", typ = "TXM"),
-                                                 ),
-"""
-
-Script_data_bloc = """
-                                     SCRIPT_DATA = BLOC ( condition = " FROM in ( 'Script', ) ",
-
-                                                  SCRIPT_FILE = SIMP(statut = "o", typ = "Fichier"),
-                                                 ),
-"""
-
-Dict_data_bloc = """
-                                     DICT_DATA = BLOC ( condition = " FROM in ( 'Script', ) ",
-
-                                                  SCRIPT_FILE = SIMP(statut = "o", typ = "Fichier"),
-                                                 ),
-"""
+data_method = """
+def F_${data_name}(statut) : return FACT(statut = statut,
+                                         FROM = SIMP(statut = "o", typ = "TXM", into=(${data_into}), defaut=${data_default}),
+                                         SCRIPT_DATA = BLOC ( condition = " FROM in ( 'Script', ) ",
 
-# Pour l'instant on ne gère qu'un seul script pour toutes les functions
-FunctionDict_data_bloc = """
-                                     FUNCTIONDICT_DATA = BLOC ( condition = " FROM in ( 'FunctionDict', ) ",
+                                                      SCRIPT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
+                                                     ),
+                                         STRING_DATA = BLOC ( condition = " FROM in ( 'String', ) ",
 
-                                                  FUNCTIONDICT_FILE = SIMP(statut = "o", typ = "Fichier"),
-                                                 ),
-"""
+                                                      STRING = SIMP(statut = "o", typ = "TXM"),
+                                                     ),
+                                         FUNCTIONDICT_DATA = BLOC ( condition = " FROM in ( 'FunctionDict', ) ",
 
-data_method = """
-def F_${data_name}(statut) : return FACT(statut = statut,
-                                         FROM = SIMP(statut = "o", typ = "TXM", into=(${data_into})),
-${data_bloc}
+                                                      FUNCTIONDICT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
+                                                     ),
                                     )
 """
 
@@ -87,61 +69,87 @@ def F_InitChoice() : return  ("Background",
                               "ObservationError",
                               "ObservationOperator",
                               "AlgorithmParameters",
-                              "Analysis",
+                              "UserPostAnalysis",
                              )
+
 def F_Init(statut) : return FACT(statut = statut,
-                                 INIT_FILE = SIMP(statut = "o", typ = "Fichier"),
+                                 INIT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
                                  TARGET_LIST = SIMP(statut = "o", typ = "TXM", min=1, max="**", into=F_InitChoice(),  validators=(VerifExiste(2))),
                                 )
 """
+
 assim_data_method = """
 def F_${assim_name}(statut) : return FACT(statut=statut,
-                                          regles = ( UN_PARMI (${choices})),
+                                          INPUT_TYPE = SIMP(statut="o", typ = "TXM", into=(${choices}), defaut=${default_choice}),
 ${decl_choices}
                                                 )
 """
 
 assim_data_choice = """
-                                                 ${choice_name} = F_${choice_name}("f"),
+                                                 ${choice_name} = BLOC ( condition = " INPUT_TYPE in ( '${choice_name}', ) ",
+                                                 data = F_${choice_name}("o"),
+                                                 ),
 """
 
-assim_opt_choice = """
-                                                 ${choice_name} = F_${choice_name}("f"),
+observers_choice = """
+                                       ${var_name} = BLOC (condition=" '${var_name}' in set(SELECTION) ",
+                                                  ${var_name}_data = FACT(statut = "o",
+                                                             Scheduler = SIMP(statut = "f", typ = "TXM"),
+                                                             Info      = SIMP(statut = "f", typ = "TXM"),
+                                                             NodeType  = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "", into=("String", "Script")),
+                                                             PythonScript = BLOC (condition = " NodeType == 'String' ",
+                                                                                  Value = SIMP(statut = "o", typ = "TXM")
+                                                                                 ),
+                                                             UserFile = BLOC (condition = " NodeType == 'Script' ",
+                                                                              Value = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()))
+                                                                             )
+                                                                      ),
+                                                          ),
 """
 
-assim_algo = """
-                                     ${name} = FACT(regles = ( ENSEMBLE ("Background", "BackgroundError", 
-                                                                      "Observation", "ObservationError",
-                                                                      "ObservationOperator")),
-                                                 Background = F_Background("o"),
-                                                 BackgroundError = F_BackgroundError("o"),
-                                                 Observation = F_Observation("o"),
-                                                 ObservationError = F_ObservationError("o"),
-                                                 ObservationOperator = F_ObservationOperator("o"),
-                                                 AlgorithmParameters = F_AlgorithmParameters("f"),
-                                                 Init = F_Init("f"),
-${decl_opts}
-                                                ),
+observers_method = """
+def F_Observers(statut) : return FACT(statut=statut,
+                                      SELECTION = SIMP(statut="o", defaut=[], typ="TXM", min=0, max="**", validators=NoRepeat(), into=(${choices})),
+${decl_choices}
+                                     )
 """
+
 assim_study = """
-ASSIM_STUDY = PROC(nom="ASSIM_STUDY",
-                   op=None,
-                   repetable = "n",
-                   STUDY_NAME = SIMP(statut="o", typ = "TXM"),
-                   ALGORITHM  = FACT(statut='o',
-                                     regles = ( UN_PARMI (${algos}),),
-${decl_algos}
-                                    ),
-                  )
+
+def F_variables(statut) : return FACT(statut=statut,
+                                      regles = ( MEME_NOMBRE ('NAMES', 'SIZES')),
+                                      NAMES = SIMP(statut="o", typ="TXM", max="**", validators=NoRepeat()),
+                                      SIZES = SIMP(statut="o", typ="I", val_min=1, max="**")
+                                      )
+
+ASSIMILATION_STUDY = PROC(nom="ASSIMILATION_STUDY",
+                          op=None,
+                          repetable           = "n",
+                          Study_name          = SIMP(statut="o", typ = "TXM"),
+                          Study_repertory     = SIMP(statut="f", typ = "TXM"),
+                          Debug               = SIMP(statut="o", typ = "I", into=(0, 1), defaut=0),
+                          Algorithm           = SIMP(statut="o", typ = "TXM", into=(${algos_names})),
+                          Background          = F_Background("o"),
+                          BackgroundError     = F_BackgroundError("o"),
+                          Observation         = F_Observation("o"),
+                          ObservationError    = F_ObservationError("o"),
+                          ObservationOperator = F_ObservationOperator("o"),
+                          AlgorithmParameters = F_AlgorithmParameters("f"),
+                          UserDataInit        = F_Init("f"),
+                          UserPostAnalysis    = F_UserPostAnalysis("f"),
+                          InputVariables      = F_variables("f"),
+                          OutputVariables     = F_variables("f"),
+                          Observers           = F_Observers("f")
+                         )
 """
 
 begin_catalog_file = string.Template(begin_catalog_file)
 data_method = string.Template(data_method)
 assim_data_method = string.Template(assim_data_method)
 assim_data_choice = string.Template(assim_data_choice)
-assim_opt_choice = string.Template(assim_opt_choice)
-assim_algo = string.Template(assim_algo)
 assim_study = string.Template(assim_study)
+observers_method = string.Template(observers_method)
+observers_choice = string.Template(observers_choice)
 
 #----------- End of Templates Part ---------------#
 
@@ -154,6 +162,7 @@ try:
   import daEficas
   import daYacsSchemaCreator
   import daCore.AssimilationStudy
+  import daYacsSchemaCreator.infos_daComposant as infos
 except:
   logging.fatal("Import of ADAO python modules failed !" +
                 "\n add ADAO python installation directory in your PYTHONPATH")
@@ -184,82 +193,80 @@ mem_file = StringIO.StringIO()
 from time import strftime
 mem_file.write(begin_catalog_file.substitute(date=strftime("%Y-%m-%d %H:%M:%S")))
 
-# Step 1: Check basic data input types
-import daYacsSchemaCreator.infos_daComposant as infos
-for basic_type in infos.BasicDataInputs:
-  logging.debug('A basic data input type is found: ' + basic_type)
-  if basic_type + '_data_bloc' not in locals().keys():
-    logging.fatal("Basic data input type not found: " + basic_type)
-    sys.exit(1)
-
-# Step 2: Add data input dict
+# Step 1: A partir des infos, on crée les fonctions qui vont permettre
+# d'entrer les données utilisateur
 for data_input_name in infos.DataTypeDict.keys():
-  logging.debug('A data input is found: ' + data_input_name)
+  logging.debug('A data input Type is found: ' + data_input_name)
   data_name = data_input_name
   data_into = ""
-  data_bloc = ""
+  data_default = ""
 
+  # On récupère les différentes façon d'entrer les données
   for basic_type in infos.DataTypeDict[data_input_name]:
     data_into += "\"" + basic_type + "\", "
-    data_bloc += locals()[basic_type + '_data_bloc'] + "\n"
 
-  mem_file.write(data_method.substitute(data_name = data_name,
-                                        data_into = data_into,
-                                        data_bloc = data_bloc))
+  # On choisit le défault
+  data_default = "\"" + infos.DataTypeDefaultDict[data_input_name] + "\""
 
-# Step 3: Add assimilation algorithm data input
+  mem_file.write(data_method.substitute(data_name    = data_name,
+                                        data_into    = data_into,
+                                        data_default = data_default))
+
+# Step 2: On crée les fonctions qui permettent de rentrer les données des algorithmes
 for assim_data_input_name in infos.AssimDataDict.keys():
   logging.debug("An assimilation algorithm data input is found: " + assim_data_input_name)
   assim_name = assim_data_input_name
   choices = ""
+  default_choice = ""
   decl_choices = ""
   decl_opts = ""
   for choice in infos.AssimDataDict[assim_data_input_name]:
     choices += "\"" + choice + "\", "
     decl_choices += assim_data_choice.substitute(choice_name = choice)
+  default_choice = "\"" + infos.AssimDataDefaultDict[assim_data_input_name] + "\""
 
   mem_file.write(assim_data_method.substitute(assim_name = assim_name,
                                               choices = choices,
-                                              decl_choices = decl_choices))
+                                              decl_choices = decl_choices,
+                                              default_choice=default_choice))
 
-# Step 4: Add optional nodes
-opt_names = []
+# Step 3: On ajoute les fonctions représentant les options possibles
 for opt_name in infos.OptDict.keys():
   logging.debug("An optional node is found: " + opt_name)
   data_name = opt_name
   data_into = ""
-  data_bloc = ""
+  data_default = ""
 
   for choice in infos.OptDict[opt_name]:
     data_into += "\"" + choice + "\", "
-    data_bloc += locals()[choice + '_data_bloc'] + "\n"
+  data_default = "\"" + infos.OptDefaultDict[opt_name] + "\""
 
   mem_file.write(data_method.substitute(data_name = data_name,
                                         data_into = data_into,
-                                        data_bloc = data_bloc))
-
-  opt_names.append(opt_name)
+                                        data_default = data_default))
 
-# Step 5: Add init node
+# Step 4: On ajoute la méthode optionnelle init
+# TODO uniformiser avec le step 3
 mem_file.write(init_method)
 
+# Step 5: Add observers
+decl_choices = ""
+for obs_var in infos.ObserversList:
+  decl_choices += observers_choice.substitute(var_name=obs_var)
+mem_file.write(observers_method.substitute(choices = infos.ObserversList,
+                                           decl_choices = decl_choices))
+
 # Final step: Add algorithm and assim_study
-algos = ""
+algos_names = ""
 decl_algos = ""
-decl_opts = ""
-for opt_name in opt_names:
-  decl_opts += assim_opt_choice.substitute(choice_name = opt_name)
 
 assim_study_object = daCore.AssimilationStudy.AssimilationStudy()
 algos_list = assim_study_object.get_available_algorithms()
 for algo_name in algos_list:
   logging.debug("An assimilation algorithm is found: " + algo_name)
-  if algo_name == "3DVAR":
-    algo_name = "ThreeDVAR"
-  algos += "\"" + algo_name + "\", "
-  decl_algos += assim_algo.substitute(name = algo_name, decl_opts=decl_opts) + "\n"
+  algos_names += "\"" + algo_name + "\", "
 
-mem_file.write(assim_study.substitute(algos=algos,
+mem_file.write(assim_study.substitute(algos_names=algos_names,
                                       decl_algos=decl_algos))
 # Write file
 final_file = open(catalog_path + "/" + catalog_name, "wr")