<resource schema="pcslg">
	<meta name="creationDate">2016-04-25T13:22:00</meta>
	<meta name="schema-rank">100</meta>
	<meta name="title">The Panchromatic High-Resolution Spectroscopic Survey of
		Local Group Star Clusters PCSLG</meta>
	<meta name="creator">Schönebeck, F.; Puzia, T. H.; Pasquali, A.;
		Grebel, E.K.; Kissler-Patig, M.; Kuntschner, H.;
		Lyubenova, M.; Perina, S.
	</meta>
	<meta name="description">
		This dataset contains spectroscopic observations of 29 globular clusters in
		the Magellanic Clouds and the Milky Way performed with VLT/X-shooter over
		eight full nights.
	</meta>

	<meta name="subject">spectroscopy</meta>
	<meta name="subject">globular-star-clusters</meta>
	<meta name="subject">magellanic-clouds</meta>
	<meta name="subject">milky-way-galaxy</meta>

	<meta name="source">2014A&amp;A...572A..13S</meta>
	<meta name="type">Survey</meta>
	<meta name="facility">VLT, European Southern Observatory, Chile</meta>
	<meta name="coverage">
		<meta name="waveband">Optical</meta>
	</meta>

	<table id="data" onDisk="true">
		<meta name="_associatedDatalinkService">
			<meta name="serviceId">sdl</meta>
			<meta name="idColumn">ssa_pubDID</meta>
		</meta>
		<mixin instrument="X-shooter"
			creationType="archival"
			creator="F. Schönebeck"
			dataSource="survey"
			fluxCalibration="ABSOLUTE"
			reference="2014A&amp;A...572A..13S"
			spectralCalibration="ABSOLUTE"
			spectralResolution="5e-10"
			fluxUnit="erg.cm**-2.s**-1.A**-1"
			spectralUnit="Angstrom">//ssap#hcd</mixin>

		<column original="accref">
			<property name="targetType"
				>application/x-votable+xml;content=datalink</property>
			<property name="targetTitle">Datalink</property>
		</column>

		<column name="ssa_targname" type="text" required="True"
			utype="ssa:Target.Name" ucd="meta.id;src"
			tablehead="Object" verbLevel="15"
			description="Common name of object observed.">
			<values fromdb="ssa_targname from \qName"/>
		</column>
	</table>

	<coverage>
		<updater sourceTable="data"/>
		<spectral>1.96678e-19 6.40789e-19</spectral>
		<temporal>57492 57492</temporal>
		<spatial>6/12405,16647,19091,21017,28973,33321,33330,34242,37294,39642,48434</spatial>
	</coverage>

	<table id="spectrum">
		<mixin ssaTable="data"
			fluxDescription="Calibrated flux"
			spectralDescription="Wavelength">//ssap#sdm-instance</mixin>
		<column name="error"
			unit="erg.cm**-2.s**-1.A**-1" ucd="stat.error;phot.flux"
			description="Estimated error (note that adjacent pixels are highly
				correlated)."/>
	</table>

	<data id="import">
		<property key="previewDir">previews</property>
		<sources pattern="data/*.fits"/>
			<fitsProdGrammar qnd="True">
			<rowfilter procDef="//products#define">
				<bind name="table">"\schema.data"</bind>
				<bind key="path">\dlMetaURI{sdl}</bind>
				<bind key="mime">'application/x-votable+xml;content=datalink'</bind>
				<bind name="preview">\standardPreviewPath</bind>
				<bind name="preview_mime">"image/png"</bind>
			</rowfilter>
		</fitsProdGrammar>

		<make table="data">
			<rowmaker idmaps="ssa_*">
				<var name="specVal">float(@CRVAL1)</var>
				<var name="specPix">float(@CRPIX1)</var>
				<var name="specDel">float(@CDELT1)</var>
				<var name="specLen">int(@NAXIS1)</var>

				<var name="specMin">(@specVal+(1-@specPix)*@specDel)*1e-10</var>
				<var name="specMax">(@specVal+(@specLen-@specPix)*@specDel)*1e-10</var>

				<apply name="computeAperture">
					<code>
						decs, ras = [], []
						for key in vars:
							if re.match("DEC[0-9]", key):
								decs.append(vars[key])
							if re.match("RA[0-9]", key):
								ras.append(vars[key])
						decSize = max(decs)-min(decs)
						raSize = (max(ras)-min(ras))*math.cos(@DEC*DEG)
						@aperture = max(raSize, decSize)/2.
					</code>
				</apply>

				<apply procDef="//ssap#setMeta">
					<bind name="dstitle">"PCSLG "+@OBJECT</bind>
					<bind name="pubDID">\standardPubDID</bind>
					<bind name="targname">@OBJECT</bind>
					<bind name="alpha">@RA</bind>
					<bind name="delta">@DEC</bind>
					<bind name="cdate">@DATE</bind>
					<bind name="bandpass">"IR, Optical, UV"</bind>
					<bind name="targclass">"GlCl"</bind>
					<bind name="bandpass">"IR, Optical, UV"</bind>
					<bind name="dateObs">@DATE</bind>
					<bind name="length">@specLen</bind>
					<bind name="specext">@specMax-@specMin</bind>
					<bind name="specend">@specMax</bind>
					<bind name="specstart">@specMin</bind>
					<bind name="specmid">(@specMax+@specMin)/2.</bind>
					<bind name="aperture">@aperture</bind>
				</apply>
			</rowmaker>
		</make>
	</data>

	<data id="build_sdm_data" auto="False">
		<embeddedGrammar>
			<iterator>
				<setup>
					<code>
						from gavo.protocols import products
						from gavo.utils import pyfits
						from gavo.utils import fitstools
					</code>
				</setup>
				<code>
					fitsPath = os.path.join(base.getConfig("inputsdir"),
						self.sourceToken["accref"])
					hdus = pyfits.open(fitsPath)
					hdr = hdus[0].header
					ax = fitstools.WCSAxis.fromHeader(hdr, 1)

					for spec, (flux, error) in enumerate(zip(hdus[0].data, hdus[1].data)):
						yield {"spectral": ax.pix0ToPhys(spec), "flux": flux,
							"error": error}
					hdus.close()
				</code>
			</iterator>
		</embeddedGrammar>
		<make table="spectrum">
			<parmaker>
				<apply procDef="//ssap#feedSSAToSDM"/>
			</parmaker>
		</make>
	</data>

	<service id="sdl" allowed="dlget,dlmeta,static">
		<meta name="title">PCSLG Datalink Service</meta>
		<property name="staticData">data</property>

		<datalinkCore>
			<descriptorGenerator procDef="//soda#sdm_genDesc">
				<setup>
					<code>
						class PCSLGDescriptor(ssap.SSADescriptor):
							suppressAutoLinks = True
							def __init__(self, *args, **kwargs):
								kwargs["accessPath"] = os.path.join(
									base.getConfig("inputsDir"), kwargs["accref"])
								ssap.SSADescriptor.__init__(self, *args, **kwargs)
					</code>
				</setup>
				<bind name="ssaTD">"\rdId#data"</bind>
				<bind name="descriptorClass">PCSLGDescriptor</bind>
			</descriptorGenerator>

			<metaMaker semantics="#progenitor">
				<code>
					yield descriptor.makeLinkFromFile(
						os.path.join(base.getConfig("inputsDir"), descriptor.accref),
						description="Original data (as FITS arrays)",
						contentType="application/fits")
				</code>
			</metaMaker>
			<metaMaker semantics="#this">
				<code>
					if descriptor.pubDID:
						yield descriptor.makeLink(
							self.parent.getURL("dlget"
								)+"?ID=%s"%urllib.parse.quote(descriptor.pubDID),
							description="The full dataset as an SDM VOTable",
							contentLength=2000000,
							contentType="application/x-votable+xml",
							contentQualifier="#spectrum")
				</code>
			</metaMaker>
			<metaMaker semantics="#preview">
				<code>
					from gavo.protocols import products
					yield descriptor.makeLink(
						products.makeProductLink(
							products.RAccref(descriptor.accref, inputDict={"preview": True})),
						description="A preview for the spectrum",
						contentType="image/png",
						contentLength=1000)
				</code>
			</metaMaker>

			<dataFunction procDef="//soda#sdm_genData">
				<bind name="builder">"\rdId#build_sdm_data"</bind>
			</dataFunction>
			<FEED source="//soda#sdm_plainfluxcalib"/>
			<FEED source="//soda#sdm_cutout"/>
			<FEED source="//soda#sdm_format"/>
		</datalinkCore>
	</service>

	<service id="web" defaultRenderer="form">
		<meta name="shortName">PCSLG Web</meta>
		<meta name="title">PCSLG Web Interface</meta>
		<meta name="_related" title="PCSLG SSAP"
			>\internallink{pcslg/q/ssa/info}</meta>

		<dbCore queriedTable="data">
			<condDesc buildFrom="ssa_location"/>
			<condDesc buildFrom="ssa_dateObs"/>
			<condDesc buildFrom="ssa_targname"/>
		</dbCore>

		<outputTable>
			<autoCols>accref, mime, ssa_targname,
				ssa_aperture, ssa_dateObs</autoCols>
			<FEED source="//ssap#atomicCoords"/>
			<outputField original="ssa_specstart" displayHint="displayUnit=Angstrom"/>
			<outputField original="ssa_specend" displayHint="displayUnit=Angstrom"/>
		</outputTable>
	</service>

	<service id="ssa" allowed="form,ssap.xml">
		<meta name="shortName">PCSLG SSAP</meta>
		<meta name="ssap.dataSource">pointed</meta>
		<meta name="ssap.testQuery">MAXREC=1</meta>
		<meta name="ssap.creationType">archival</meta>
		<meta name="ssap.complianceLevel">query</meta>

		<publish render="ssap.xml" sets="ivo_managed"/>
		<publish render="form" sets="ivo_managed,local" service="web"/>

		<ssapCore queriedTable="data">
			<property name="previews">auto</property>
			<FEED source="//ssap#hcd_condDescs"/>
		</ssapCore>
	</service>

	<regSuite title="PCSLG spectra">
    <regTest title="PCSLG SSA interface works" id="spectra">
      <url REQUEST="queryData"
        PUBDID="ivo://org.gavo.dc/~?pcslg/data/NGC1904.fits"
        >ssa/ssap.xml</url>
      <code>
        rows = self.getVOTableRows()
        self.assertEqual(len(rows), 1)
        self.assertEqual(rows[0]['accsize'], 1128960)
        self.assertEqual(rows[0]['ssa_dstitle'], 'PCSLG NGC1904')
      </code>
    </regTest>

    <regTest title="PCSLG preview">
      <url preview="True">/getproduct/pcslg/data/NGC1904.fits</url>
      <code>
        self.assertHasStrings("PNG", "0PLTE", "66666666666666666")
      </code>
    </regTest>
  </regSuite>
</resource>
