LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
Functions | Variables
astshim.fitsChanContinued Namespace Reference

Functions

 _calc_card_pos (self, index)
 
 _get_current_card_value (self)
 
 length (self)
 
 iter (self)
 
 next (self)
 
 to_string (self)
 
 contains (self, name)
 
 getitem (self, name)
 
 setitem (self, name, value)
 
 delitem (self, name)
 
 items (self)
 

Variables

 items
 
 getFitsF
 
 getFitsS
 
 getFitsCF
 

Function Documentation

◆ _calc_card_pos()

astshim.fitsChanContinued._calc_card_pos ( self,
index )
protected
Convert a python index into a FitsChan position.

Parameters
----------
self : `FitsChan`
    The FitsChan to index.
index : `int`
    0-based index into header. If negative, counts from end.

Raises
------
IndexError
    Raised if the index exceeds the size of the FitsChan. If the index
    equals the size of the FitsChan (noting that in 0-based indexing the
    final card is one less than the size) then this refers to the end of
    the header.

Definition at line 6 of file fitsChanContinued.py.

6def _calc_card_pos(self, index):
7 """Convert a python index into a FitsChan position.
8
9 Parameters
10 ----------
11 self : `FitsChan`
12 The FitsChan to index.
13 index : `int`
14 0-based index into header. If negative, counts from end.
15
16 Raises
17 ------
18 IndexError
19 Raised if the index exceeds the size of the FitsChan. If the index
20 equals the size of the FitsChan (noting that in 0-based indexing the
21 final card is one less than the size) then this refers to the end of
22 the header.
23 """
24 # Calculate 0-based index
25 nCards = len(self)
26 if index < 0:
27 index = nCards + index
28 elif abs(index) > nCards:
29 # We allow index of one higher to indicate append
30 raise IndexError(f"Index {index} exceeds size of FitsChan ({nCards})")
31
32 # Convert to 1-based index
33 return index + 1
34
35

◆ _get_current_card_value()

astshim.fitsChanContinued._get_current_card_value ( self)
protected
Retrieve the value of the current card along with the keyword name.

Returns
-------
name : `str`
    The name of the current card.
value : `object`
    The value in the correct Python type.

Definition at line 36 of file fitsChanContinued.py.

36def _get_current_card_value(self):
37 """Retrieve the value of the current card along with the keyword name.
38
39 Returns
40 -------
41 name : `str`
42 The name of the current card.
43 value : `object`
44 The value in the correct Python type.
45 """
46 # Method look up table for obtaining values
47 typeLut = {CardType.INT: self.getFitsI,
48 CardType.FLOAT: self.getFitsF,
49 CardType.STRING: self.getFitsS,
50 CardType.COMPLEXF: self.getFitsCF,
51 CardType.LOGICAL: self.getFitsL
52 }
53
54 # Get the data type for this matching card
55 ctype = self.getCardType()
56
57 # Get the name of the card
58 name = self.getCardName()
59
60 # Go back one card so we can ask for the value in the correct
61 # data type (getFitsX starts from the next card)
62 # thiscard = self.getCard()
63 # self.setCard(thiscard - 1)
64
65 if ctype == CardType.UNDEF:
66 value = None
67 elif ctype in typeLut:
68 found = typeLut[ctype]("") # "" indicates current card
69 if found.found:
70 value = found.value
71 else:
72 raise RuntimeError(f"Unexpectedly failed to find card '{name}'")
73 elif ctype == CardType.COMMENT:
74 value = self.getCardComm()
75 else:
76 raise RuntimeError(f"Type, {ctype} of FITS card '{name}' not supported")
77
78 return name, value
79
80

◆ contains()

astshim.fitsChanContinued.contains ( self,
name )
Returns True if either the supplied name is present in the FitsChan
or the supplied integer is acceptable to the FitsChan.

Definition at line 127 of file fitsChanContinued.py.

127def contains(self, name):
128 """Returns True if either the supplied name is present in the FitsChan
129 or the supplied integer is acceptable to the FitsChan.
130 """
131 if isinstance(name, int):
132 # index will be zero-based
133 if name >= 0 and name < self.nCard:
134 return True
135 elif isinstance(name, str):
136 currentCard = self.getCard()
137 try:
138 self.clearCard()
139 result = self.findFits(name, False)
140 finally:
141 self.setCard(currentCard)
142 if result.found:
143 return True
144
145 return False
146
147

◆ delitem()

astshim.fitsChanContinued.delitem ( self,
name )
Delete an item from the FitsChan either by index (0-based) or by name.

Parameters
----------
name : `str` or `int`
    If the name is an integer index the card at that position will be
    removed.  The index is zero-based.  A negative index counts from the
    end of the FitsChan.
    If the name is a string all cards matching that name will be removed.

Raises
------
IndexError
    Raised if the supplied index is out of range.
KeyError
    Raised if the supplied name is not found in the FitsChan.

Definition at line 318 of file fitsChanContinued.py.

318def delitem(self, name):
319 """Delete an item from the FitsChan either by index (0-based) or by name.
320
321 Parameters
322 ----------
323 name : `str` or `int`
324 If the name is an integer index the card at that position will be
325 removed. The index is zero-based. A negative index counts from the
326 end of the FitsChan.
327 If the name is a string all cards matching that name will be removed.
328
329 Raises
330 ------
331 IndexError
332 Raised if the supplied index is out of range.
333 KeyError
334 Raised if the supplied name is not found in the FitsChan.
335 """
336 if isinstance(name, int):
337 # Correct to 1-based
338 newpos = _calc_card_pos(self, name)
339 if newpos <= 0 or newpos > self.nCard:
340 # AST will ignore this but we raise if the index is out of range
341 raise IndexError(f"No FITS card at index {name}")
342 self.setCard(newpos)
343 self.delFits()
344 return
345
346 if not isinstance(name, str):
347 raise KeyError(f"Supplied key, '{name}' of unsupported type")
348
349 self.clearCard()
350 # Delete any cards with matching keyword
351 deleted = False
352 while True:
353 found = self.findFits(name, False)
354 if not found.found:
355 break
356 self.delFits()
357 deleted = True
358
359 if not deleted:
360 raise KeyError(f"No FITS card named {name}")
361
362

◆ getitem()

astshim.fitsChanContinued.getitem ( self,
name )
Return a value associated with the supplied name.

Parameters
----------
name : `str` or `int`
    If the FitsChan is being accessed by integer index the returned value
    will be the corresponding 80-character card.  Index values are 0-based.
    A negative index counts from the end of the FitsChan.
    If the FitsChan is being accessed by string the returned value will
    be the scalar value associated with the first card that matches the
    supplied name.

Returns
-------
value : `str`, `int`, `float`, `bool`, or `None`
    The complete 80-character header card if an integer index is supplied,
    else the first matching value of the named header.

Raises
------
IndexError
    Raised if an integer index is provided and the index is out of range.
KeyError
    Raised if a string is provided and that string is not present in
    the FitsChan. Also raised if the supplied name is neither an integer
    not a string.
RuntimeError
    Raised if there is some problem accessing the value in the FitsChan.

Definition at line 151 of file fitsChanContinued.py.

151def getitem(self, name):
152 """Return a value associated with the supplied name.
153
154 Parameters
155 ----------
156 name : `str` or `int`
157 If the FitsChan is being accessed by integer index the returned value
158 will be the corresponding 80-character card. Index values are 0-based.
159 A negative index counts from the end of the FitsChan.
160 If the FitsChan is being accessed by string the returned value will
161 be the scalar value associated with the first card that matches the
162 supplied name.
163
164 Returns
165 -------
166 value : `str`, `int`, `float`, `bool`, or `None`
167 The complete 80-character header card if an integer index is supplied,
168 else the first matching value of the named header.
169
170 Raises
171 ------
172 IndexError
173 Raised if an integer index is provided and the index is out of range.
174 KeyError
175 Raised if a string is provided and that string is not present in
176 the FitsChan. Also raised if the supplied name is neither an integer
177 not a string.
178 RuntimeError
179 Raised if there is some problem accessing the value in the FitsChan.
180 """
181
182 # Save current card position
183 currentCard = self.getCard()
184
185 if isinstance(name, int):
186 # Calculate position in FitsChan (0-based to 1-based)
187 newpos = _calc_card_pos(self, name)
188 self.setCard(newpos)
189 try:
190 result = self.findFits("%f", False)
191 finally:
192 self.setCard(currentCard)
193 if not result.found:
194 raise IndexError(f"No FITS card at index {name}")
195 return result.value
196
197 elif isinstance(name, str):
198
199 try:
200 # Rewind FitsChan so we search all cards
201 self.clearCard()
202
203 # We are only interested in the first matching card
204 result = self.findFits(name, False)
205 if not result.found:
206 raise KeyError(f"{name}'")
207
208 this_name, value = _get_current_card_value(self)
209 if this_name != name:
210 raise RuntimeError(f"Internal inconsistency in get: {this_name} != {name}")
211
212 finally:
213 # Reinstate the original card position
214 self.setCard(currentCard)
215
216 return value
217
218 raise KeyError(f"Supplied key, '{name}' of unsupported type")
219
220

◆ items()

astshim.fitsChanContinued.items ( self)
Iterate over each card, returning the keyword and value in a tuple.

Returns
-------
key : `str`
    The key associated with the card.  Can be an empty string for some
    comment styles.  The same key name can be returned multiple times
    and be associated with different values.
value : `str`, `int`, `bool`, `float`
    The value.

Notes
-----
The position of the iterator is internal to the FitsChan.  Do not
change the card position when iterating.

Definition at line 366 of file fitsChanContinued.py.

366def items(self):
367 """Iterate over each card, returning the keyword and value in a tuple.
368
369 Returns
370 -------
371 key : `str`
372 The key associated with the card. Can be an empty string for some
373 comment styles. The same key name can be returned multiple times
374 and be associated with different values.
375 value : `str`, `int`, `bool`, `float`
376 The value.
377
378 Notes
379 -----
380 The position of the iterator is internal to the FitsChan. Do not
381 change the card position when iterating.
382 """
383 self.clearCard()
384 nCards = self.nCard
385 thisCard = self.getCard()
386
387 while thisCard <= nCards:
388 name, value = _get_current_card_value(self)
389 yield name, value
390 self.setCard(thisCard + 1)
391 thisCard = self.getCard()
392
393
std::vector< SchemaItem< Flag > > * items

◆ iter()

astshim.fitsChanContinued.iter ( self)
The FitsChan is its own iterator, incrementing the card position on
each call.

The position of the iterator is handled internally in the FitsChan and
is moved to the start of the FitsChan by this call.
Whilst iterating do not change the internal card position.

The iterator will return 80-character header cards.

Definition at line 88 of file fitsChanContinued.py.

88def iter(self):
89 """The FitsChan is its own iterator, incrementing the card position on
90 each call.
91
92 The position of the iterator is handled internally in the FitsChan and
93 is moved to the start of the FitsChan by this call.
94 Whilst iterating do not change the internal card position.
95
96 The iterator will return 80-character header cards.
97 """
98 self.clearCard()
99 return self
100
101

◆ length()

astshim.fitsChanContinued.length ( self)

Definition at line 81 of file fitsChanContinued.py.

81def length(self):
82 return self.nCard
83
84

◆ next()

astshim.fitsChanContinued.next ( self)
Return each 80-character header card until we run out of cards.

Definition at line 105 of file fitsChanContinued.py.

105def next(self):
106 """Return each 80-character header card until we run out of cards.
107 """
108 card = self.findFits("%f", True)
109 if not card.found:
110 raise StopIteration
111 return card.value
112
113

◆ setitem()

astshim.fitsChanContinued.setitem ( self,
name,
value )
Set a new value.

Parameters
----------
name : `str` or `int`
    If the name is an integer index this corresponds to a position within
    the FitsChan.  Index values are 0-based. A negative index counts
    from the end of the FitsChan.  If the index matches the number of
    cards (e.g. the return value of `len()`) the new value will be
    appended to the end of the FitsChan.
    If the name is an empty string or `None`, the value will be inserted
    at the current card position as a comment card.
    If the name is a string corresponding to a header card that is already
    present in the FitsChan, the new value will overwrite the existing
    value leaving the header name and any comment unchanged.
    Any other cards matching that name later in the header will
    be removed.  If there is no header with that name, a new card will
    be inserted at the end of the FitsChan.
value : `str`, `int`, `float`, `bool`, `None`
    The new value to be inserted.  If an integer index is given it must be
    a complete FITS header card.  The string will be padded to 80
    characters.

Raises
------
IndexError
    Raised if the supplied integer index is out of range.
KeyError
    Raised if the supplied name is neither a string or an integer.
TypeError
    Raised if an integer index is given but the supplied value is not
    a string.

Definition at line 224 of file fitsChanContinued.py.

224def setitem(self, name, value):
225 """Set a new value.
226
227 Parameters
228 ----------
229 name : `str` or `int`
230 If the name is an integer index this corresponds to a position within
231 the FitsChan. Index values are 0-based. A negative index counts
232 from the end of the FitsChan. If the index matches the number of
233 cards (e.g. the return value of `len()`) the new value will be
234 appended to the end of the FitsChan.
235 If the name is an empty string or `None`, the value will be inserted
236 at the current card position as a comment card.
237 If the name is a string corresponding to a header card that is already
238 present in the FitsChan, the new value will overwrite the existing
239 value leaving the header name and any comment unchanged.
240 Any other cards matching that name later in the header will
241 be removed. If there is no header with that name, a new card will
242 be inserted at the end of the FitsChan.
243 value : `str`, `int`, `float`, `bool`, `None`
244 The new value to be inserted. If an integer index is given it must be
245 a complete FITS header card. The string will be padded to 80
246 characters.
247
248 Raises
249 ------
250 IndexError
251 Raised if the supplied integer index is out of range.
252 KeyError
253 Raised if the supplied name is neither a string or an integer.
254 TypeError
255 Raised if an integer index is given but the supplied value is not
256 a string.
257 """
258
259 if isinstance(name, int):
260 # Calculate position in FitsChan (0-based to 1-based)
261 newpos = _calc_card_pos(self, name)
262 self.setCard(newpos)
263
264 if not value:
265 value = " "
266
267 # Overwrite the entire value
268 self.putFits(value, True)
269 return
270
271 # A blank name results in a comment card being inserted at the
272 # current position
273 if not name:
274 self.setFitsCM(value, False)
275 return
276
277 if not isinstance(name, str):
278 raise KeyError(f"Supplied key, '{name}' of unsupported type")
279
280 # Get current card position and rewind
281 currentCard = self.getCard()
282 try:
283 self.clearCard()
284
285 # Look for a card with the specified name.
286 # We do not care about the result; if nothing is found we will be
287 # at the end of the header.
288 self.findFits(name, False)
289
290 # pyast seems to want to delete items if the value is None but
291 # astropy and PropertyList think the key should be undefined.
292 if value is None:
293 self.setFitsU(name, overwrite=True)
294 elif isinstance(value, int):
295 self.setFitsI(name, value, overwrite=True)
296 elif isinstance(value, float):
297 self.setFitsF(name, value, overwrite=True)
298 elif isinstance(value, bool):
299 self.setFitsL(name, value, overwrite=True)
300 else:
301 # Force to string.
302 self.setFitsS(name, str(value), overwrite=True)
303
304 # Delete any later cards with matching keyword
305 while True:
306 found = self.findFits(name, False)
307 if not found.found:
308 break
309 self.delFits()
310 finally:
311 # Try to reinstate the current card
312 self.setCard(currentCard)
313
314

◆ to_string()

astshim.fitsChanContinued.to_string ( self)
A FitsChan string representation is a FITS header with newlines
after each 80-character header card.

Definition at line 117 of file fitsChanContinued.py.

117def to_string(self):
118 """A FitsChan string representation is a FITS header with newlines
119 after each 80-character header card.
120 """
121 return "\n".join(c for c in self)
122
123

Variable Documentation

◆ getFitsCF

astshim.fitsChanContinued.getFitsCF

Definition at line 50 of file fitsChanContinued.py.

◆ getFitsF

astshim.fitsChanContinued.getFitsF

Definition at line 48 of file fitsChanContinued.py.

◆ getFitsS

astshim.fitsChanContinued.getFitsS

Definition at line 49 of file fitsChanContinued.py.

◆ items

astshim.fitsChanContinued.items

Definition at line 394 of file fitsChanContinued.py.