@@ -325,20 +325,32 @@ def extract(self, name, example):
325
325
# handle special functions; perform a drop in replacement
326
326
if re .match ('@spectrodir[|]' , template ):
327
327
template = re .sub ('@spectrodir[|]' , os .environ ['BOSS_SPECTRO_REDUX' ], template )
328
- elif re .search ('@platedir[|]' , template ):
328
+ if re .search ('@platedir[|]' , template ):
329
329
template = re .sub ('@platedir[|]' , r'(.*)/{plateid:0>6}' , template )
330
- elif re .search ('@definitiondir[|]' , template ):
330
+ if re .search ('@definitiondir[|]' , template ):
331
331
template = re .sub ('@definitiondir[|]' , '{designid:0>6}' , template )
332
- elif re .search ('@apgprefix[|]' , template ):
332
+ if re .search ('@apgprefix[|]' , template ):
333
333
template = re .sub ('@apgprefix[|]' , '{prefix}' , template )
334
- elif re .search ('@healpixgrp[|]' , template ):
334
+ if re .search ('@healpixgrp[|]' , template ):
335
335
template = re .sub ('@healpixgrp[|]' , '{healpixgrp}' , template )
336
- elif re .search ('@configgrp[|]' , template ):
336
+ if re .search ('@configgrp[|]' , template ):
337
337
template = re .sub ('@configgrp[|]' , '{configgrp}' , template )
338
- elif re .search ('@isplate[|]' , template ):
338
+ if re .search ('@isplate[|]' , template ):
339
339
template = re .sub ('@isplate[|]' , '{isplate}' , template )
340
- elif re .search ('@pad_fieldid[|]' , template ):
340
+ if re .search ('@pad_fieldid[|]' , template ):
341
341
template = re .sub ('@pad_fieldid[|]' , '{fieldid}' , template )
342
+ if re .search ('@spcoaddfolder[|]' ,template ):
343
+ template = re .sub ('@spcoaddfolder[|]' , '{spcoaddfolder}' , template )
344
+ if re .search ('@sptypefolder[|]' ,template ):
345
+ template = re .sub ('@sptypefolder[|]' , '{sptypefolder}' , template )
346
+ if re .search ('@epochflag[|]' , template ):
347
+ template = re .sub ('@epochflag[|]' , '{epochflag}' , template )
348
+ if re .search ('@spcoaddobs[|]' ,template ):
349
+ template = re .sub ('@spcoaddobs[|]' , '{obs}' , template )
350
+ if re .search ('@spcoaddgrp[|]' ,template ):
351
+ template = re .sub ('@spcoaddgrp[|]' , '{spcoaddgrp}' , template )
352
+ if re .search ('@fieldgrp[|]' ,template ):
353
+ template = re .sub ('@fieldgrp[|]' , '{fieldgrp}' , template )
342
354
if re .search ('@plateid6[|]' , template ):
343
355
template = re .sub ('@plateid6[|]' , '{plateid:0>6}' , template )
344
356
if re .search ('@component_default[|]' , template ):
@@ -347,6 +359,8 @@ def extract(self, name, example):
347
359
template = re .sub ('@cat_id_groups[|]' , '{cat_id_groups}' , template )
348
360
if re .search ('@sdss_id_groups[|]' , template ):
349
361
template = re .sub ('@sdss_id_groups[|]' , '{sdss_id_groups}' , template )
362
+ if re .search ('@tilegrp[|]' , template ):
363
+ template = re .sub ('@tilegrp[|]' , '{tilegrp}' , template )
350
364
351
365
# check if template has any brackets
352
366
haskwargs = re .search ('[{}]' , template )
@@ -386,12 +400,28 @@ def extract(self, name, example):
386
400
drval = re .match ('^DR[1-9][0-9]' , value ).group (0 )
387
401
otherval = value .split (drval )[- 1 ]
388
402
pdict = {keys [0 ]: drval , keys [1 ]: otherval }
403
+ elif keys == ['fieldid' ,'isplate' ]:
404
+ # for {fieldid}{isplate} as isplate is calculated automatically
405
+ if value .endswith ('p' ) and value [:- 1 ].isdigit ():
406
+ value = value [:- 1 ]
407
+ pdict = {keys [0 ]:value }
408
+ elif keys == ['run2d' ,'epochflag' ]:
409
+ # for {run2d}{epochflag} as epochflag is calculated automatically
410
+ pdict = {keys [0 ]:value .replace ('-epoch' ,'' )}
411
+ elif keys == ['coadd' , 'obs' ]:
412
+ value = value .split ('_' )
413
+ if len (value ) == 1 :
414
+ value .append ('' )
415
+ pdict = {keys [0 ]: value [0 ], keys [1 ]: value [1 ]}
389
416
elif keys [0 ] in ['rc' , 'br' , 'filter' , 'camrow' ]:
390
417
# for {camrow}{camcol}, {filter}{camcol}, {br}{id}, etc
391
418
pdict = {keys [0 ]: value [0 ], keys [1 ]: value [1 :]}
392
419
else :
393
420
raise ValueError ('This case has not yet been accounted for.' )
394
421
path_dict .update (pdict )
422
+ elif keys [0 ] in ['sptypefolder' ,'fieldgrp' ,'spcoaddfolder' ,'spcoaddgrp' ]:
423
+ # supress the keys since they are automatically calculated
424
+ continue
395
425
else :
396
426
path_dict [keys [0 ]] = value
397
427
return path_dict
@@ -678,7 +708,7 @@ def full(self, filetype, **kwargs):
678
708
if not skip_tag_check :
679
709
template = re .sub (r'tags/(v?[0-9._]+)' , r'\1' , template , count = 1 )
680
710
681
- return self ._check_compression (template )
711
+ return self ._check_compression (os . path . normpath ( template ) )
682
712
683
713
@staticmethod
684
714
def check_modules (template , permanent = None ):
@@ -1531,8 +1561,184 @@ def pad_fieldid(self, filetype, **kwargs):
1531
1561
return str (fieldid )
1532
1562
if fieldid .isnumeric ():
1533
1563
return str (fieldid ).zfill (6 )
1534
- else :
1535
- return fieldid
1564
+ return fieldid
1565
+
1566
+ def spcoaddfolder (self , filetype , ** kwargs ):
1567
+ ''' Returns the reorganized subfolder structure for the BOSS idlspec2d run2d version
1568
+
1569
+ Parameters
1570
+ ---------
1571
+ filetype : str
1572
+ File type parameter
1573
+ run2d : str
1574
+ BOSS idlspec2d run2d version
1575
+ coadd : str
1576
+ Name of the custom coadd schema
1577
+ Returns
1578
+ -------
1579
+ sptypefolder : str
1580
+ '''
1581
+
1582
+ run2d = kwargs .get ('run2d' , None )
1583
+ coaddname = kwargs .get ('coadd' , None )
1584
+
1585
+ if (not run2d ):
1586
+ return ''
1587
+ if (('v5' in run2d ) or (str (run2d ) in ['26' ,'103' ,'104' ]) or
1588
+ ('v6_0' in run2d ) or ('v6_1' in run2d )):
1589
+ return ''
1590
+ if filetype .lower () in ['spall_coadd' ,'spall-lite_coadd' ,'spallline_coadd' ]:
1591
+ return 'summary'
1592
+ if filetype .lower () in ['speclite_coadd' ,'specfull_coadd' ,
1593
+ 'spallfield_coadd' ,'spalllinefield_coadd' ]:
1594
+ return coaddname
1595
+ return 'fields'
1596
+
1597
+
1598
+ def spcoaddgrp (self , filetype , ** kwargs ):
1599
+ ''' Returns the coadd group (field group analog) subfolder structure for the BOSS idlspec2d run2d version
1600
+
1601
+ Parameters
1602
+ ---------
1603
+ filetype : str
1604
+ File type parameter
1605
+ run2d : str
1606
+ BOSS idlspec2d run2d version
1607
+ coadd : str
1608
+ Name of the custom coadd schema
1609
+ Returns
1610
+ -------
1611
+ spcoaddgrp : str
1612
+ '''
1613
+ run2d = kwargs .get ('run2d' , None )
1614
+ coaddname = kwargs .get ('coadd' , None )
1615
+
1616
+ if (not run2d ):
1617
+ return ''
1618
+ if (('v5' in run2d ) or (str (run2d ) in ['26' ,'103' ,'104' ]) or
1619
+ ('v6_0' in run2d ) or ('v6_1' in run2d )):
1620
+ return ''
1621
+ return coaddname
1622
+
1623
+ def sptypefolder (self , filetype , ** kwargs ):
1624
+ ''' Returns the reorganized subfolder structure for the BOSS idlspec2d run2d version
1625
+
1626
+ Parameters
1627
+ ---------
1628
+ filetype : str
1629
+ File type parameter
1630
+ run2d : str
1631
+ BOSS idlspec2d run2d version
1632
+ Returns
1633
+ -------
1634
+ sptypefolder : str
1635
+ '''
1636
+
1637
+ run2d = kwargs .get ('run2d' , None )
1638
+
1639
+ if (not run2d ) or ('v5' in run2d ) or (str (run2d ) in ['26' ,'103' ,'104' ]):
1640
+ return ''
1641
+ if ('v6_0' in run2d ) or ('v6_1' in run2d ):
1642
+ if filetype .lower () in ['speclite_epoch' ,'specfull_epoch' ,
1643
+ 'spallfield_epoch' ,'spalllinefield_epoch' ]:
1644
+ return 'epoch/spectra'
1645
+ if 'epoch' in filetype .lower ():
1646
+ return 'epoch'
1647
+ return ''
1648
+ if filetype .lower () in ['fieldlist_epoch' ,'spall_epoch' ,
1649
+ 'spall-lite_epoch' ,'spallline_epoch' ]:
1650
+ return 'summary/epoch'
1651
+ if filetype .lower () in ['speclite_epoch' ,'specfull_epoch' ,
1652
+ 'spallfield_epoch' ,'spalllinefield_epoch' ]:
1653
+ return 'spectra/epoch'
1654
+ if filetype .lower () in ['conflist' ,'fieldlist' ,'spall' ,
1655
+ 'spall-lite' ,'spallline' ]:
1656
+ return 'summary/daily'
1657
+ if filetype .lower () in ['speclite' ,'specfull' ,
1658
+ 'spallfield' ,'spalllinefield' ]:
1659
+ return 'daily'
1660
+ return 'fields'
1661
+
1662
+ def spcoaddobs (self , filetype , ** kwargs ):
1663
+ ''' Returns the formatted observatory flag for custom coadds for the BOSS idlspec2d
1664
+
1665
+ Parameters
1666
+ ----------
1667
+ filetype : str
1668
+ File type parameter
1669
+ run2d : str
1670
+ BOSS idlspec2d run2d version
1671
+ obs : str
1672
+ Observatory of observations: LCO, APO, ''(for merged)
1673
+
1674
+ Returns
1675
+ -------
1676
+ obs : str
1677
+ '''
1678
+
1679
+ obs = kwargs .get ('obs' , None )
1680
+ run2d = kwargs .get ('run2d' , None )
1681
+
1682
+ if not obs or obs == '' :
1683
+ return ''
1684
+ if (('v5' in run2d ) or (str (run2d ) in ['26' ,'103' ,'104' ]) or
1685
+ (('v6_0' in run2d ) or ('v6_1' in run2d )) and obs .lower ()) == 'apo' :
1686
+ return ''
1687
+ if obs == '*' :
1688
+ return obs
1689
+ return '_{}' .format (obs .lower ())
1690
+
1691
+ def epochflag (self , filetype , ** kwargs ):
1692
+ ''' Returns the flag for epoch coadds for the BOSS idlspec2d
1693
+
1694
+ Parameters
1695
+ ----------
1696
+ filetype : str
1697
+ File type parameter
1698
+ run2d : str
1699
+ BOSS idlspec2d run2d version
1700
+
1701
+ Returns
1702
+ -------
1703
+ epochflag : str
1704
+ '''
1705
+
1706
+ run2d = kwargs .get ('run2d' , None )
1707
+ if (('v5' in run2d ) or (str (run2d ) in ['26' ,'103' ,'104' ]) or
1708
+ ('v6_0' in run2d ) or ('v6_1' in run2d )):
1709
+ return ''
1710
+ return '-epoch'
1711
+
1712
+ def fieldgrp (self , filetype , ** kwargs ):
1713
+ ''' Returns the fieldid group for the BOSS idlspec2d run2d version
1714
+
1715
+ Parameters
1716
+ ---------
1717
+ filetype : str
1718
+ File type parameter
1719
+ run2d : str
1720
+ BOSS idlspec2d run2d version
1721
+ fieldid : str or int
1722
+ Field ID number. Will be converted to str internally.
1723
+
1724
+ Returns
1725
+ -------
1726
+ fieldgrp : str
1727
+ '''
1728
+
1729
+ fieldid = kwargs .get ('fieldid' , None )
1730
+ run2d = kwargs .get ('run2d' , None )
1731
+
1732
+ if (not fieldid ):
1733
+ return ''
1734
+
1735
+ if (('v5' in run2d ) or (str (run2d ) in ['26' ,'103' ,'104' ]) or
1736
+ ('v6_0' in run2d ) or ('v6_1' in run2d )):
1737
+ return ''
1738
+ fieldid = str (fieldid )
1739
+ if fieldid .isnumeric ():
1740
+ return '{:0>3d}XXX' .format (int (fieldid ) // 1000 )
1741
+ return fieldid
1536
1742
1537
1743
def tilegrp (self , filetype , ** kwargs ):
1538
1744
''' Returns LVM tile id group subdirectory
0 commit comments