a2p2 0.2.15__py3-none-any.whl → 0.7.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. a2p2/__main__.py +39 -0
  2. a2p2/chara/facility.py +51 -3
  3. a2p2/chara/gui.py +29 -5
  4. a2p2/client.py +144 -34
  5. a2p2/facility.py +11 -1
  6. a2p2/gui.py +32 -1
  7. a2p2/jmmc/__init__.py +7 -0
  8. a2p2/jmmc/catalogs.py +129 -0
  9. a2p2/jmmc/generated_models.py +191 -0
  10. a2p2/jmmc/models.py +104 -0
  11. a2p2/jmmc/services.py +16 -0
  12. a2p2/jmmc/utils.py +130 -0
  13. a2p2/jmmc/webservices.py +48 -0
  14. a2p2/ob.py +95 -9
  15. a2p2/samp.py +17 -0
  16. a2p2/version.py +205 -137
  17. a2p2/vlti/conf/GRAVITY_ditTable.json +21 -19
  18. a2p2/vlti/conf/GRAVITY_rangeTable.json +200 -28
  19. a2p2/vlti/conf/MATISSE_rangeTable.json +58 -22
  20. a2p2/vlti/conf/PIONIER_ditTable.json +1 -1
  21. a2p2/vlti/conf/PIONIER_rangeTable.json +16 -18
  22. a2p2/vlti/facility.py +156 -118
  23. a2p2/vlti/gravity.py +243 -311
  24. a2p2/vlti/gui.py +162 -40
  25. a2p2/vlti/instrument.py +264 -49
  26. a2p2/vlti/matisse.py +61 -147
  27. a2p2/vlti/pionier.py +34 -157
  28. {a2p2-0.2.15.dist-info → a2p2-0.7.4.dist-info}/METADATA +34 -20
  29. a2p2-0.7.4.dist-info/RECORD +39 -0
  30. {a2p2-0.2.15.dist-info → a2p2-0.7.4.dist-info}/WHEEL +1 -1
  31. {a2p2-0.2.15.dist-info → a2p2-0.7.4.dist-info}/entry_points.txt +0 -1
  32. a2p2/vlti/confP104/GRAVITY_ditTable.json +0 -122
  33. a2p2/vlti/confP104/GRAVITY_rangeTable.json +0 -202
  34. a2p2/vlti/confP104/MATISSE_ditTable.json +0 -2
  35. a2p2/vlti/confP104/MATISSE_rangeTable.json +0 -202
  36. a2p2/vlti/confP104/PIONIER_ditTable.json +0 -77
  37. a2p2/vlti/confP104/PIONIER_rangeTable.json +0 -118
  38. a2p2/vlti/confP105/GRAVITY_ditTable.json +0 -37
  39. a2p2/vlti/confP105/GRAVITY_rangeTable.json +0 -42
  40. a2p2/vlti/confP105/MATISSE_ditTable.json +0 -2
  41. a2p2/vlti/confP105/MATISSE_rangeTable.json +0 -44
  42. a2p2/vlti/confP105/PIONIER_ditTable.json +0 -25
  43. a2p2/vlti/confP105/PIONIER_rangeTable.json +0 -38
  44. a2p2-0.2.15.dist-info/RECORD +0 -44
  45. {a2p2-0.2.15.dist-info → a2p2-0.7.4.dist-info}/LICENSE +0 -0
  46. {a2p2-0.2.15.dist-info → a2p2-0.7.4.dist-info}/top_level.txt +0 -0
a2p2/ob.py CHANGED
@@ -6,6 +6,10 @@ import logging
6
6
  import json
7
7
  import xml.etree.ElementTree as ET
8
8
  from collections import defaultdict, namedtuple, OrderedDict
9
+ import re
10
+
11
+ import copy
12
+
9
13
 
10
14
  logger = logging.getLogger(__name__)
11
15
 
@@ -22,8 +26,11 @@ def etree_to_dict(t):
22
26
  d = {t.tag: {k: v[0] if len(v) == 1 else v for k, v in dd.items()}}
23
27
  # print("add d=%s"%str(d))
24
28
  if t.attrib:
25
- d[t.tag].update(('' + k, v)
26
- for k, v in t.attrib.items()) # was '@' but can't be serialized by namedtuple
29
+ attrs = {}
30
+ for k, v in t.attrib.items():
31
+ if not "{" in k[0]: # ignore elementName with prefix
32
+ attrs[k]=v
33
+ d[t.tag].update(attrs)
27
34
  if t.text:
28
35
  text = t.text.strip()
29
36
  if children or t.attrib:
@@ -33,6 +40,66 @@ def etree_to_dict(t):
33
40
  d[t.tag] = text
34
41
  return d
35
42
 
43
+ def normalizeObj(obj):
44
+ """
45
+ Modify in place the structure if required.
46
+ Note:
47
+ dict key must be valid identifier (only tested for EXTRA_INFORMATIONS created fields)
48
+ """
49
+ otype=type(obj)
50
+ if otype is dict:
51
+ for k,v in obj.items():
52
+
53
+ if k in ['observationConfiguration', 'HAinterval', 'LSTinterval'] and not isinstance(v, list):
54
+ # always defines observationConfiguration as a list
55
+ normalizeObj(v)
56
+ obj[k]=[v]
57
+ elif k=='EXTRA_INFORMATIONS':
58
+ #print(f"Updating dict {k} was : {obj[k]}")
59
+ # normalize input that may have various form on list of dict
60
+ try:
61
+ fields=[]
62
+ funits={}
63
+ for fk in ["parameter","field"]:
64
+ if fk in obj[k]:
65
+ l=obj[k][fk].copy()
66
+ #print(f"'{fk}' => {l}\n({type(l)})\n")
67
+ if type(l) is dict:
68
+ fields.append(l)
69
+ else:
70
+ fields+=l
71
+
72
+ #print(f"Fields to update: {fields}")
73
+ #store new fields
74
+ for vn in fields:
75
+ fname=vn["name"]
76
+ # test if we have to normalize field name that will become a python field
77
+ if not fname.isidentifier():
78
+ # replace unvalid chars by _ and append F to avoid starting by _
79
+ fname=re.sub('^_','F_', re.sub('\W|^(?=\d)','_', fname))
80
+ obj[k][fname]=vn["value"]
81
+ if "unit" in vn:
82
+ funits[fname]=vn["unit"]
83
+ #store units
84
+ obj[k]["field_units"]=funits
85
+ # remove old arrays or dicts
86
+ for fk in ["parameter","field"]:
87
+ if fk in obj[k]:
88
+ del obj[k][fk]
89
+ pass
90
+ except:
91
+ import traceback
92
+ print (traceback.format_exc())
93
+ print(f"\nCan't read {v}")
94
+ pass
95
+ else:
96
+ normalizeObj(v)
97
+ return obj
98
+ elif otype is list:
99
+ for e in obj:
100
+ normalizeObj(e)
101
+ else:
102
+ pass
36
103
 
37
104
  class OB():
38
105
  """
@@ -45,29 +112,40 @@ class OB():
45
112
 
46
113
  every values are string (must be converted for numeric values).
47
114
 
115
+ Following fields are converted to list even if the list get a single element. The OB code can then handle such multiples values.
116
+ ['observationConfiguration', 'HAinterval', 'LSTinterval']
117
+
48
118
  """
49
119
 
50
120
  def __init__(self, url):
51
121
  # extract XML in elementTree
52
-
53
122
  e = ET.parse(url)
123
+ # convert data to dict structure
54
124
  d = etree_to_dict(e.getroot())
55
125
  # keep only content of subelement to avoid schema version change
56
126
  # '{http://www.jmmc.fr/aspro-ob/0.1}observingBlockDefinition'
57
127
  ds = d[list(d)[0]] # -> version and name are lost
58
- # store attributes
128
+
129
+ #self.srcDict = copy.deepcopy(ds)
130
+ normalizeObj(ds)
131
+ #self.normDict = ds
132
+ #self.srcObj = toObject(self.srcDict,inputName="OB")
133
+ #self.normObj = toObject(self.normDict,inputName="OB")
134
+
135
+ # store subelements as attributes
59
136
  for e in ds.keys():
60
137
  # parse JSON into an object with attributes corresponding to dict keys.
61
138
  # We should probably avoid json use...
62
139
  o = json.loads(
63
140
  json.dumps(ds[e]), object_hook=lambda d: namedtuple(e, d.keys())(*d.values()))
64
- # observationConfiguration may be uniq but force it to be a list
65
- if "observationConfiguration" in e and not isinstance(o, list):
66
- setattr(self, e, [o])
67
- else:
68
- setattr(self, e, o)
141
+ setattr(self, e, o)
142
+
143
+ # store normalized source for str repr
69
144
  self.ds = ds
70
145
 
146
+ def as_dict(self):
147
+ return self.ds
148
+
71
149
  def getFluxes(self, target):
72
150
  """
73
151
  Return a flux mesurements as dict (ordered dict by BVRIJHK ).
@@ -81,6 +159,14 @@ class OB():
81
159
 
82
160
  return OrderedDict(sorted(fluxes.items(), key=lambda t: order.find(t[0])))
83
161
 
162
+ def getPeriod(self):
163
+ """
164
+ Return period given by Aspro2 as integer.
165
+ """
166
+ # use re to remove alpha characters from "Period 109" and make.
167
+ return int(re.sub(r"\D", "", self.interferometerConfiguration.version))
168
+
169
+
84
170
  def get(self, obj, fieldname, defaultvalue=None):
85
171
  if fieldname in obj._fields:
86
172
  return getattr(obj, fieldname)
a2p2/samp.py CHANGED
@@ -15,12 +15,14 @@ class Receiver(object):
15
15
  self.received = False
16
16
 
17
17
  def receive_call(self, private_key, sender_id, msg_id, mtype, params, extra):
18
+ self.mtype=mtype
18
19
  self.params = params
19
20
  self.received = True
20
21
  self.client.reply(
21
22
  msg_id, {"samp.status": "samp.ok", "samp.result": {}})
22
23
 
23
24
  def receive_notification(self, private_key, sender_id, mtype, params, extra):
25
+ self.mtype=mtype
24
26
  self.params = params
25
27
  self.received = True
26
28
 
@@ -47,6 +49,7 @@ class A2p2SampClient():
47
49
  # an error is thrown here if no hub is present
48
50
 
49
51
  # TODO get samp client name and display it in the UI
52
+ # TODO !! declare mtypes as enum
50
53
 
51
54
  # Instantiate the receiver
52
55
  self.r = Receiver(self.sampClient)
@@ -54,6 +57,10 @@ class A2p2SampClient():
54
57
  self.sampClient.bind_receive_call("ob.load.data", self.r.receive_call)
55
58
  self.sampClient.bind_receive_notification(
56
59
  "ob.load.data", self.r.receive_notification)
60
+ # Listen for Model related instructions
61
+ self.sampClient.bind_receive_call("fr.jmmc.litpro.start.setting",self.r.receive_call)
62
+ self.sampClient.bind_receive_notification(
63
+ "fr.jmmc.litpro.start.setting",self.r.receive_notification)
57
64
 
58
65
  def disconnect(self):
59
66
  self.sampClient.disconnect()
@@ -82,6 +89,9 @@ class A2p2SampClient():
82
89
  def clear_message(self):
83
90
  return self.r.clear()
84
91
 
92
+ def has_ob_message(self):
93
+ return "ob.load.data" in self.r.mtype
94
+
85
95
  def get_ob_url(self):
86
96
  url = self.r.params['url']
87
97
  if url.startswith("file:///"):
@@ -92,3 +102,10 @@ class A2p2SampClient():
92
102
  elif url.startswith("file:/"): # work arround bugged file urls on *nix
93
103
  return url[5:]
94
104
  return url
105
+
106
+ def has_model_message(self):
107
+ return "fr.jmmc.litpro.start.setting" in self.r.mtype
108
+
109
+ def get_model(self):
110
+ return self.r.params['model']
111
+
a2p2/version.py CHANGED
@@ -1,132 +1,268 @@
1
- __version__ = "0.2.15"
1
+ __version__ = "0.7.4"
2
2
 
3
3
  __release_notes__ = {
4
4
  # "0.1.6": {
5
- # "STATUS":[
6
- # "This version get lot of changes and may contain bugs or missing features, please provide any feedback to improve and prepare a better future release !"
7
- # ],
8
5
  # "A2P2": [
9
- #
10
6
  # ],
11
7
  # "VLTI": [
12
- #
13
8
  # ],
14
9
  # "CHARA": [
15
- #
16
- # ],
17
- # "TODO-SCIENCE": [
18
- #
19
- # ],
20
- # "TODO-DEV": [
21
- #
22
10
  # ],
23
11
  # },
24
- "0.2.15": {
25
- "STATUS": [
26
- "add a wrapper on p2 to make run's tree faster (~2.5x)",
12
+ #
13
+ # "TODO-SCIENCE": [
14
+ # "Merge AO or GS in a same code section for every instruments",
15
+ # "Check DIT table from the last template user manuals (especially MATISSE) and remove PIONIER's one",
16
+ # "flag ~important~ keywords which MUST be set in a2p2 code and not leaved to there default values?",
17
+ # ],
18
+ # "TODO-DEV": [
19
+ # "Support multiple period version (two major at least)",
20
+ # "Support numlist keyword : eg. SEQ.HWPOFF (done in conf but must be range check compatible)",
21
+ # "Unify ob name creation in vlti instrument createOB()",
22
+ # "Complete test suite with more real p2 submissions",
23
+ # "Try to read OB in P2 and send them back to Aspro2 as a new obs",
24
+ # ],
25
+
26
+ "0.7.4": {
27
+ "A2P2": [
28
+ "Use pyproject.toml for python installation",
29
+ ],"VLTI": [
30
+ "Do not switch PIONIER mode to FREE when the magnitude of the IAS star is too high : an error may be provided by p2"
31
+ ],
32
+ },"0.7.3": {
33
+ "CHARA": [
34
+ "Better reuse of last working queueserver"
35
+ ],
36
+ },"0.7.2": {
37
+ "A2P2": [
38
+ "Auto update chara queueserver preference",
39
+ "a2p2 -r generates release-notes.md (rendered on a2p2 repository)"
40
+ ],
41
+ "VLTI": [
42
+ "Bugfix to support missin preference file"
43
+ ],
44
+ "CHARA": [
45
+ "Support and try every queueserver's Urls comma separated from the queuserver user preference"
46
+ ],
47
+ },"0.7.1": {
48
+ "A2P2": [
49
+ "Fix ttk import on MacOS",
50
+ ],
51
+ "VLTI": [
52
+ "Add first P112 support using radiobutton to select proper onaxis offaxis or wide GRAVITY templates",
53
+ "Improve coordinate's checks and computations",
54
+ "Add FT's propermotions and parallax"
55
+ ],
56
+ "CHARA": [
57
+ "Display log of received OB also for calibrators"
58
+ ]
59
+ },"0.6.9": {
60
+ "A2P2": [
61
+ "ctrl-c support improved to qui a2p2 from terminal",
62
+ ],
63
+ "VLTI": [
64
+ "OB's tree list selection mode limited to a single selection",
65
+ "OB are stacked if Aspro2 send an OB without proper tree selection. stacked OB can be submitted after proper container selection or cancelled",
66
+ "Provide checkboxes of types of interferometric observations to complete full OB"
67
+ ],
68
+ "CHARA": [
69
+ ],
70
+ },"0.6.8": {
71
+ "A2P2": [
72
+ "increase astropy version to avoid a dependency issue with numy"
73
+ ],
74
+ },"0.6.7": {
75
+ "CHARA": [
76
+ "Enhance information while using OB2 server prototype",
77
+ ]
78
+ }, "0.6.6": {
79
+ "CHARA": [
80
+ "Fix formating of OB supporting array of observability time intervals",
81
+ ],
82
+ },"0.6.5": {
83
+ "CHARA": [
84
+ "Experimental: forward OBs through json payload to the location defined in preference",
27
85
  ],
86
+ },"0.6.4": {
28
87
  "A2P2": [
88
+ "Fix import that may break run on windows..."
29
89
  ],
90
+ },"0.6.3": {
30
91
  "VLTI": [
92
+ "Always use GRAVITY acqTSF.SEQ_INS_SOBJ_HMAG after P110",
31
93
  ],
32
- "CHARA": [
94
+ },"0.6.2": {
95
+ "VLTI": [
96
+ "Fix GRAVITY gen acq tsf",
33
97
  ],
34
- "TODO-SCIENCE": [
35
- "Check DIT table from last template user manuals",
36
- "Use a calibrator template for MATISSE (instead of default hyb_obs)",
37
- "flag ~important~ keywords which MUST be set in a2p2 code and not leaved to there default values"
98
+ },"0.6.1": {
99
+ "VLTI": [
100
+ "Updated configuration for ESO P111",
101
+ ]
102
+ },"0.6.0": {
103
+ "A2P2": [
104
+ "Read Extra_informations from last Aspro2 OBXML"
38
105
  ],
39
- "TODO-DEV": [
40
- "Support multiple period version (two major at least)",
41
- "Add warning if Aspro2's IP versions differs from the selected container" ,
42
- "Support numlist keyword : eg. SEQ.HWPOFF",
43
- "Optimize VLTI run chooser : DEMO tests suffer from a long run filtering",
44
- "Unify ob name creation in vlti instrument createOB()",
45
- "Complete test suite with real p2 submission"
106
+ },"0.5.3": {
107
+ "VLTI": [
108
+ "Update DIT tables to last instrument template (version is stored in the table config to report warning)",
109
+ "Do not stop OB creation if K mag is out of range during DIT calculation but show a warning and ask to proceed or abort",
110
+ ]
111
+ },"0.4.6": {
112
+ "A2P2": [
113
+ "Huge speedup of ESO P2 runs treeview",
114
+ "Explicit SAMP unregister reduce risk of SAMP ghosts",
46
115
  ],
47
- },
48
- "0.2.14": {
49
- "STATUS": [
50
- "BugFix: ask for container Name only if one is selected"
116
+ "VLTI": [
117
+ "Check consistency between Aspro2 inteferometer period and RUN's IP version",
118
+ "Handle use SEQ.INS.SOBJ.HMAG after P110 instead of SEQ.FI.HMAG",
51
119
  ],
120
+ },"0.4.5": {
52
121
  "A2P2": [
122
+ "clarify some text in the default generated preference file",
53
123
  ],
54
124
  "VLTI": [
125
+ "Change log message : Run filled -> OB transmitted",
126
+ "Missing flux error message enhanced : show associated target name",
127
+ "Handle ALPHA DELTA coordinates of associated guide star",
128
+ "MATISSE: handle Aspro2's frindge tracker mode : None or GRA4MAT",
129
+ "MATISSE: define DPR.CATG (always was CALIB)",
130
+ "MATISSE: use V band for COU.GS.MAG or try G one on ATs.",
131
+ "GRAVITY: include dual keywords in gravity_rangeTable",
132
+ ],
133
+ },"0.4.4": {
134
+ "A2P2": [
135
+ "add Catalog.piname() to get a pi name for a given jmmc account looking at a given catalog (jmmc.login preference is used without parameter)",
136
+ "Add new preference to put jmmc account credentials",
55
137
  ],
56
- "CHARA": [
138
+ },"0.4.3": {
139
+ "A2P2": [
140
+ "Enhance a2p2.jmmc.models._model so it automagically computes component names >{(())>",
57
141
  ],
58
- },
59
- "0.2.13": {
60
- "STATUS": [
142
+ },"0.4.2": {
143
+ "A2P2": [
144
+ "Add option to select public CatalogAPI server",
61
145
  ],
146
+ },"0.4.1": {
62
147
  "A2P2": [
63
- "A2P2 is no longer python2 compatible. Hope it will be ok for everybody ? Send an issue else ;)",
64
- "Fix generated release note order according to semver values",
65
- "Dry tests done looping on a few OBXML files"
66
- "Added -c option to a2p2 so we generated a config file ( helps to automatically fill P2 login info & autologin : )"
148
+ "Add version alpha of a2p2.fr.webservices.Calliper client",
149
+ ],
150
+ }, "0.4.0": {
151
+ "A2P2": [
152
+ "First basic support of SAMP messages from Aspro for models",
153
+ "Support model compositions in models module",
67
154
  ],
155
+ }, "0.3.10": {
156
+
157
+ "A2P2": [
158
+ "Fix bug that occurs when user has no preference file",
159
+ "Add new serialisation of a2p2.jmmc.Models"
160
+ ],
161
+ }, "0.3.9": {
68
162
  "VLTI": [
69
- "Conf updated with IPs 106.25",
70
- "BugFix: OB no more sent to P2 if OB's instrument is not the same than p2 selected container"
163
+ "Bugfix for single CAL SCI",
71
164
  ],
72
- "CHARA": [
165
+ }, "0.3.8": {
166
+ "VLTI": [
167
+ "Enhance CAL SCI sequence : [CAL1] SCI [CAL2 [SCI CAL3 [...] ] ] ",
168
+ "Fix COU_AG_PMA and COU_AG_PMD for MATISSE acq template",
169
+ "Do not throw a dialog for every submitted OBs",
170
+ "Enhance some messages",
171
+ # "BugFix to create a folder on non tutorial accounts"
172
+ ],
173
+
174
+ }, "0.3.7": {
175
+ "VLTI": [
176
+ "Revert SEQ.RELOFF.X/Y = 0.0 (same as default) for GRAVITY dual_obs_exp template"
177
+ ],
178
+ }, "0.3.6": {
179
+ "VLTI": [
180
+ "Disable SEQ.RELOFF.X for GRAVITY dual to make OB compliant"
181
+ ],
182
+ }, "0.3.5": {
183
+ "VLTI": [
184
+ "Accept to add calibrator inside a Concatenation container",
185
+ "Use p2.iss.vltitype preference keys to set supported value of instrument's acquisition templates. ( run 'a2p2 -c' )"
73
186
  ],
74
187
  },
75
- "0.2.12": {
76
- "STATUS": [
188
+ "0.3.4": {
189
+ "VLTI": [
190
+ "Sync templates with P109",
191
+ "Create OB in selected folder: do not create anymore a folder but create a concatenation for SM if a Run's root is selected."
77
192
  ],
193
+ },
194
+ "0.3.3": {
78
195
  "A2P2": [
79
- "Fix import in main console script"
196
+ "Add basic support of Aspro2's model for SAMP interoperability",
80
197
  ],
81
198
  "VLTI": [
199
+ "Fix missing import for p2api module"
82
200
  ],
83
- "CHARA": [
201
+ },
202
+ "0.3.2": {
203
+ "A2P2": [
204
+ "Improve setup.py that now requires python 3+ and a fresh version of astropy",
205
+ ],
206
+ "VLTI": [
207
+ # "revert back to p2 requests use which now reuses connections",
84
208
  ],
85
209
  },
86
- "0.2.11": {
87
- "STATUS": [
210
+ "0.3.1": {
211
+ "A2P2": [
212
+ "Bug fix for authenticated Catalog access",
88
213
  ],
214
+ },
215
+ "0.3.0": {
89
216
  "A2P2": [
90
- "enhance setup.py so it install Windows special-cases .exe files"
217
+ "Give a try to embedd some code to interact with JMMC services",
91
218
  ],
92
219
  "VLTI": [
220
+ # "revert back to p2 requests use which now reuses connections",
93
221
  ],
94
- "CHARA": [
222
+ },
223
+ "0.2.15": {
224
+ "VLTI": [
225
+ # "add a wrapper on p2 to make run's tree faster (~2.5x)",
95
226
  ],
96
227
  },
97
- "0.2.10": {
98
- "STATUS": [
228
+ "0.2.14": {
229
+ "A2P2": [
230
+ "BugFix: ask for container Name only if one is selected"
99
231
  ],
232
+ },
233
+ "0.2.13": {
100
234
  "A2P2": [
101
- "Patch bad SAMP url handling on Windows"
235
+ "A2P2 is no longer python2 compatible. Hope it will be ok for everybody ? Send an issue else ;)",
236
+ "Fix generated release note order according to semver values",
237
+ "Dry tests done looping on a few OBXML files"
238
+ "Added -c option to a2p2 so we generated a config file ( helps to automatically fill P2 login info & autologin : )"
102
239
  ],
103
240
  "VLTI": [
241
+ "Conf updated with IPs 106.25",
242
+ "BugFix: OB no more sent to P2 if OB's instrument is not the same than p2 selected container"
104
243
  ],
105
- "CHARA": [
244
+ },
245
+ "0.2.12": {
246
+ "A2P2": [
247
+ "Fix import in main console script"
106
248
  ],
107
249
  },
108
- "0.2.9": {
109
- "STATUS": [
250
+ "0.2.11": {
251
+ "A2P2": [
252
+ "enhance setup.py so it install Windows special-cases .exe files"
110
253
  ],
254
+ },
255
+ "0.2.10": {
111
256
  "A2P2": [
112
-
257
+ "Patch bad SAMP url handling on Windows"
113
258
  ],
259
+ },
260
+ "0.2.9": {
114
261
  "VLTI": [
115
262
  "Fix bug that prevent to create any folder or concatenation at RUNS's root"
116
263
  ],
117
- "CHARA": [
118
-
119
- ],
120
- "TODO-SCIENCE": [
121
-
122
- ],
123
- "TODO-DEV": [
124
-
125
- ],
126
264
  },
127
265
  "0.2.8": {
128
- "STATUS": [
129
- ],
130
266
  "A2P2": [
131
267
  "Fix release notes order in the GUI",
132
268
  "Handle special jmmc account, kindly set by ESO colleagues to perfom future tests as closed as possible to the real UX"
@@ -137,10 +273,6 @@ __release_notes__ = {
137
273
  ],
138
274
  "CHARA": [
139
275
  ],
140
- "TODO-SCIENCE": [
141
- ],
142
- "TODO-DEV": [
143
- ]
144
276
  }, "0.2.7": {
145
277
  "STATUS": [
146
278
  "This version get lot of changes and may contain bugs or missing features, please provide any feedback to improve and prepare a better future release !"
@@ -158,96 +290,41 @@ __release_notes__ = {
158
290
  "Support Concatenations (also shown in the tree panel)",
159
291
  "Show type in the container chooser instead of containerID"
160
292
  ],
161
- "CHARA": [
162
- ],
163
- "TODO-SCIENCE": [
164
- "Complete/fix GRAVITY DIT table with P105 changes that will come in the next template user manual",
165
- "Use a calibrator template for MATISSE (instead of default hyb_obs)",
166
- "flag ~important~ keyword that MUST be set in a2p2 code to avoid default"
167
- ],
168
- "TODO-DEV": [
169
- "Support numlist keyword : eg. SEQ.HWPOFF",
170
- "Optimize VLTI run chooser : DEMO tests suffer from a long run filtering",
171
- "Do not set default values in a2p2 if not set",
172
- "unify ob name creation in vlti instrument createOB()"
173
- ]
174
293
  }, "0.2.6": {
175
- "A2P2": [
176
-
177
- ],
178
294
  "VLTI": [
179
295
  "Support baseline back again (single one at present)"
180
296
  ],
181
- "CHARA": [
182
-
183
- ]
184
297
  },
185
298
  "0.2.5": {
186
- "A2P2": [
187
-
188
- ],
189
299
  "VLTI": [
190
300
  "Add missing template name in log",
191
301
  "Fix error removing baseline after constraint changes on P2 side. Next a2p2 version should add them back in acq templates"
192
302
  ],
193
- "CHARA": [
194
-
195
- ]
196
303
  },
197
304
  "0.2.4": {
198
- "A2P2": [
199
-
200
- ],
201
305
  "VLTI": [
202
306
  "Fix bug / wrong keys"
203
307
  ],
204
- "CHARA": [
205
-
206
- ]
207
308
  },
208
309
  "0.2.3": {
209
- "A2P2": [
210
-
211
- ],
212
310
  "VLTI": [
213
311
  "Hide password in login frame"
214
312
  ],
215
- "CHARA": [
216
-
217
- ]
218
313
  },
219
314
  "0.2.2": {
220
- "A2P2": [
221
-
222
- ],
223
315
  "VLTI": [
224
316
  "ignore default time constraints computed by Aspro"
225
317
  ],
226
- "CHARA": [
227
-
228
- ]
229
318
  },
230
319
  "0.2.1": {
231
- "A2P2": [
232
-
233
- ],
234
320
  "VLTI": [
235
321
  "fix support for a list of multiples time constraints"
236
322
  ],
237
- "CHARA": [
238
-
239
- ]
240
323
  },
241
324
  "0.2.0": {
242
- "A2P2": [
243
-
244
- ],
245
325
  "VLTI": [
246
326
  "bug fix"
247
327
  ],
248
- "CHARA": [
249
-
250
- ]
251
328
  },
252
329
  "0.1.6": {
253
330
  "A2P2": [
@@ -257,20 +334,11 @@ __release_notes__ = {
257
334
  "general config updates",
258
335
  "add PIONIER"
259
336
  ],
260
- "CHARA": [
261
-
262
- ]
263
337
  },
264
338
  "0.1.5": {
265
- "A2P2": [
266
-
267
- ],
268
339
  "VLTI": [
269
340
  "bugfix for dualfield cases"
270
341
  ],
271
- "CHARA": [
272
-
273
- ]
274
342
  },
275
343
  "0.1.4": {
276
344
  "A2P2": [