]> SALOME platform Git repositories - modules/adao.git/blob - bin/AdaoCatalogGenerator.py
Salome HOME
Ajout de l'option pour le noeud YACS
[modules/adao.git] / bin / AdaoCatalogGenerator.py
1 #-*- coding:utf-8 -*-
2 #  Copyright (C) 2008-2011  EDF R&D
3 #
4 #  This library is free software; you can redistribute it and/or
5 #  modify it under the terms of the GNU General Public
6 #  License as published by the Free Software Foundation; either
7 #  version 2.1 of the License.
8 #
9 #  This library is distributed in the hope that it will be useful,
10 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 #  Lesser General Public License for more details.
13 #
14 #  You should have received a copy of the GNU Lesser General Public
15 #  License along with this library; if not, write to the Free Software
16 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # --
19 # Author : André RIBES (EDF R&D)
20 # --
21
22 import logging
23 import traceback
24 import sys
25 import string
26 import StringIO
27
28 logging.basicConfig(level=logging.DEBUG)
29
30 #----------- Templates Part ---------------#
31 begin_catalog_file = """
32 # -*- coding: utf-8 -*-
33
34 # --------------------------------------------------------
35 # generated by AdaoCatalogGenerator at ${date}
36 # --------------------------------------------------------
37
38 import Accas
39 from Accas import *
40
41 JdC = JDC_CATA (code = 'ADAO',
42                 execmodul = None,
43                 regles = ( AU_MOINS_UN ('ASSIMILATION_STUDY'), AU_PLUS_UN ('ASSIMILATION_STUDY')),
44                )
45 """
46
47 data_method = """
48 def F_${data_name}(statut) : return FACT(statut = statut,
49                                          FROM = SIMP(statut = "o", typ = "TXM", into=(${data_into}), defaut=${data_default}),
50                                          SCRIPT_DATA = BLOC ( condition = " FROM in ( 'Script', ) ",
51
52                                                       SCRIPT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
53                                                      ),
54                                          STRING_DATA = BLOC ( condition = " FROM in ( 'String', ) ",
55
56                                                       STRING = SIMP(statut = "o", typ = "TXM"),
57                                                      ),
58                                          FUNCTIONDICT_DATA = BLOC ( condition = " FROM in ( 'FunctionDict', ) ",
59
60                                                       FUNCTIONDICT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
61                                                      ),
62                                     )
63 """
64
65 init_method = """
66 def F_InitChoice() : return  ("Background",
67                               "BackgroundError",
68                               "Observation",
69                               "ObservationError",
70                               "ObservationOperator",
71                               "AlgorithmParameters",
72                               "UserPostAnalysis",
73                              )
74
75 def F_Init(statut) : return FACT(statut = statut,
76                                  INIT_FILE = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr())),
77                                  TARGET_LIST = SIMP(statut = "o", typ = "TXM", min=1, max="**", into=F_InitChoice(),  validators=(VerifExiste(2))),
78                                 )
79 """
80
81 assim_data_method = """
82 def F_${assim_name}(statut) : return FACT(statut=statut,
83                                           INPUT_TYPE = SIMP(statut="o", typ = "TXM", into=(${choices}), defaut=${default_choice}),
84 ${decl_choices}
85                                                 )
86 """
87
88 assim_data_choice = """
89                                                  ${choice_name} = BLOC ( condition = " INPUT_TYPE in ( '${choice_name}', ) ",
90                                                  data = F_${choice_name}("o"),
91                                                  ),
92 """
93
94 observers_choice = """
95                                        ${var_name} = BLOC (condition=" '${var_name}' in set(SELECTION) ",
96                                                            Scheduler = SIMP(statut = "f", typ = "TXM"),
97                                                            NodeType  = SIMP(statut = "o", typ = "TXM", min=1, max=1, defaut = "", into=("pyscript", "userfile")),
98                                                            PythonScript = BLOC (condition = " NodeType == 'pyscript' ",
99                                                                                 Value = SIMP(statut = "o", typ = "TXM")
100                                                                                ),
101                                                            UserFile = BLOC (condition = " NodeType == 'userfile' ",
102                                                                             Value = SIMP(statut = "o", typ = "FichierNoAbs", validators=(OnlyStr()))
103                                                                            )
104                                                           ),
105 """
106
107 observers_method = """
108 def F_Observers(statut) : return FACT(statut=statut,
109                                       SELECTION = SIMP(statut="o", defaut=[], typ="TXM", max="**", validators=NoRepeat(), into=(${choices})),
110 ${decl_choices}
111                                      )
112 """
113
114 assim_study = """
115
116 def F_variables(statut) : return FACT(statut=statut,
117                                       regles = ( MEME_NOMBRE ('NAMES', 'SIZES')),
118                                       NAMES = SIMP(statut="o", typ="TXM", max="**", validators=NoRepeat()),
119                                       SIZES = SIMP(statut="o", typ="I", val_min=1, max="**")
120                                       )
121
122 ASSIMILATION_STUDY = PROC(nom="ASSIMILATION_STUDY",
123                           op=None,
124                           repetable           = "n",
125                           Study_name          = SIMP(statut="o", typ = "TXM"),
126                           Study_repertory     = SIMP(statut="f", typ = "TXM"),
127                           Debug               = SIMP(statut="o", typ = "I", into=(0, 1), defaut=0),
128                           Algorithm           = SIMP(statut="o", typ = "TXM", into=(${algos_names})),
129                           Background          = F_Background("o"),
130                           BackgroundError     = F_BackgroundError("o"),
131                           Observation         = F_Observation("o"),
132                           ObservationError    = F_ObservationError("o"),
133                           ObservationOperator = F_ObservationOperator("o"),
134                           AlgorithmParameters = F_AlgorithmParameters("f"),
135                           UserDataInit        = F_Init("f"),
136                           UserPostAnalysis    = F_UserPostAnalysis("f"),
137                           InputVariables      = F_variables("f"),
138                           OutputVariables     = F_variables("f"),
139                           Observers           = F_Observers("f")
140                          )
141 """
142
143 begin_catalog_file = string.Template(begin_catalog_file)
144 data_method = string.Template(data_method)
145 assim_data_method = string.Template(assim_data_method)
146 assim_data_choice = string.Template(assim_data_choice)
147 assim_study = string.Template(assim_study)
148 observers_method = string.Template(observers_method)
149 observers_choice = string.Template(observers_choice)
150
151 #----------- End of Templates Part ---------------#
152
153
154
155 #----------- Begin generation script -----------#
156 print "-- Starting AdaoCalatogGenerator.py --"
157
158 try:
159   import daEficas
160   import daYacsSchemaCreator
161   import daCore.AssimilationStudy
162   import daYacsSchemaCreator.infos_daComposant as infos
163 except:
164   logging.fatal("Import of ADAO python modules failed !" +
165                 "\n add ADAO python installation directory in your PYTHONPATH")
166   traceback.print_exc()
167   sys.exit(1)
168
169 def check_args(args):
170   logging.debug("Arguments are :" + str(args))
171   if len(args) != 2:
172     logging.fatal("Bad number of arguments: you have to provide two arguments (%d given)" % (len(args)))
173     sys.exit(1)
174
175 # Parse arguments
176 from optparse import OptionParser
177 usage = "usage: %prog [options] catalog_path catalog_name"
178 version="%prog 0.1"
179 my_parser = OptionParser(usage=usage, version=version)
180 (options, args) = my_parser.parse_args()
181 check_args(args)
182
183 catalog_path =  args[0]
184 catalog_name =  args[1]
185
186 # Generates into a string
187 mem_file = StringIO.StringIO()
188
189 # Start file
190 from time import strftime
191 mem_file.write(begin_catalog_file.substitute(date=strftime("%Y-%m-%d %H:%M:%S")))
192
193 # Step 1: A partir des infos, on crée les fonctions qui vont permettre
194 # d'entrer les données utilisateur
195 for data_input_name in infos.DataTypeDict.keys():
196   logging.debug('A data input Type is found: ' + data_input_name)
197   data_name = data_input_name
198   data_into = ""
199   data_default = ""
200
201   # On récupère les différentes façon d'entrer les données
202   for basic_type in infos.DataTypeDict[data_input_name]:
203     data_into += "\"" + basic_type + "\", "
204
205   # On choisit le défault
206   data_default = "\"" + infos.DataTypeDefaultDict[data_input_name] + "\""
207
208   mem_file.write(data_method.substitute(data_name    = data_name,
209                                         data_into    = data_into,
210                                         data_default = data_default))
211
212 # Step 2: On crée les fonctions qui permettent de rentrer les données des algorithmes
213 for assim_data_input_name in infos.AssimDataDict.keys():
214   logging.debug("An assimilation algorithm data input is found: " + assim_data_input_name)
215   assim_name = assim_data_input_name
216   choices = ""
217   default_choice = ""
218   decl_choices = ""
219   decl_opts = ""
220   for choice in infos.AssimDataDict[assim_data_input_name]:
221     choices += "\"" + choice + "\", "
222     decl_choices += assim_data_choice.substitute(choice_name = choice)
223   default_choice = "\"" + infos.AssimDataDefaultDict[assim_data_input_name] + "\""
224
225   mem_file.write(assim_data_method.substitute(assim_name = assim_name,
226                                               choices = choices,
227                                               decl_choices = decl_choices,
228                                               default_choice=default_choice))
229
230 # Step 3: On ajoute les fonctions représentant les options possibles
231 for opt_name in infos.OptDict.keys():
232   logging.debug("An optional node is found: " + opt_name)
233   data_name = opt_name
234   data_into = ""
235   data_default = ""
236
237   for choice in infos.OptDict[opt_name]:
238     data_into += "\"" + choice + "\", "
239   data_default = "\"" + infos.OptDefaultDict[opt_name] + "\""
240
241   mem_file.write(data_method.substitute(data_name = data_name,
242                                         data_into = data_into,
243                                         data_default = data_default))
244
245 # Step 4: On ajoute la méthode optionnelle init
246 # TODO uniformiser avec le step 3
247 mem_file.write(init_method)
248
249 # Step 5: Add observers
250 decl_choices = ""
251 for obs_var in infos.ObserversList:
252   decl_choices += observers_choice.substitute(var_name=obs_var)
253 mem_file.write(observers_method.substitute(choices = infos.ObserversList,
254                                            decl_choices = decl_choices))
255
256 # Final step: Add algorithm and assim_study
257 algos_names = ""
258 decl_algos = ""
259
260 assim_study_object = daCore.AssimilationStudy.AssimilationStudy()
261 algos_list = assim_study_object.get_available_algorithms()
262 for algo_name in algos_list:
263   logging.debug("An assimilation algorithm is found: " + algo_name)
264   algos_names += "\"" + algo_name + "\", "
265
266 mem_file.write(assim_study.substitute(algos_names=algos_names,
267                                       decl_algos=decl_algos))
268 # Write file
269 final_file = open(catalog_path + "/" + catalog_name, "wr")
270 final_file.write(mem_file.getvalue())
271 mem_file.close()
272 final_file.close()
273