// ----------------------------------------------------------------------- // VOTableCatalogueWriter.cc: Writing output catalogues to VOTable files // ----------------------------------------------------------------------- // Copyright (C) 2006, Matthew Whiting, ATNF // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // Duchamp is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with Duchamp; if not, write to the Free Software Foundation, // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA // // Correspondence concerning Duchamp may be directed to: // Internet email: Matthew.Whiting [at] atnf.csiro.au // Postal address: Dr. Matthew Whiting // Australia Telescope National Facility, CSIRO // PO Box 76 // Epping NSW 1710 // AUSTRALIA // ----------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include namespace duchamp { VOTableCatalogueWriter::VOTableCatalogueWriter(): FileCatalogueWriter() { this->itsTableName=""; this->itsTableDescription=""; } VOTableCatalogueWriter::VOTableCatalogueWriter(std::string name): FileCatalogueWriter(name) { this->itsTableName=""; this->itsTableDescription=""; } VOTableCatalogueWriter::VOTableCatalogueWriter(const VOTableCatalogueWriter& other) { this->operator=(other); } VOTableCatalogueWriter& VOTableCatalogueWriter::operator= (const VOTableCatalogueWriter& other) { if(this==&other) return *this; ((FileCatalogueWriter &) *this) = other; this->itsTableName=other.itsTableName; this->itsTableDescription=other.itsTableDescription; return *this; } void VOTableCatalogueWriter::writeHeader() { if(this->itsOpenFlag){ this->itsFileStream<<"\n"; this->itsFileStream<<"itsFileStream<<" xsi:noNamespaceSchemaLocation=\"http://www.ivoa.net/xml/VOTable/VOTable/v1.1\">\n"; std::string ID,equinox,system; if(std::string(this->itsHead->WCS().lngtyp)=="RA") { //J2000 or B1950 if(this->itsHead->WCS().equinox==2000.){ ID=equinox= "J2000"; system="eq_FK5"; } else{ ID=equinox="B1950"; system="eq_FK4"; } this->itsFileStream <<" \n"; } else{ ID=system="galactic"; this->itsFileStream <<" \n"; } this->itsFileStream<<" \n"; this->itsFileStream<<" itsTableName<<"\">\n"; this->itsFileStream<<" "<itsTableDescription<<"\n"; } } void VOTableCatalogueWriter::writeParameters() { if(this->itsOpenFlag){ std::vector paramList = this->itsParam->getVOParams(); for(std::vector::iterator param=paramList.begin();paramitsFileStream << " "; param->printParam(this->itsFileStream); } } } void VOTableCatalogueWriter::writeStats() { if(this->itsOpenFlag){ VOParam threshParam("thresholdActual","","float",this->itsStats->getThreshold(),0,this->itsHead->getFluxUnits()); this->itsFileStream << " "; threshParam.printParam(this->itsFileStream); if(!this->itsParam->getFlagUserThreshold()){ VOParam middleParam("noiseMeanActual","","float",this->itsStats->getMiddle(),0,this->itsHead->getFluxUnits()); this->itsFileStream << " "; middleParam.printParam(this->itsFileStream); VOParam spreadParam("noiseSpreadActual","","float",this->itsStats->getSpread(),0,this->itsHead->getFluxUnits()); this->itsFileStream << " "; spreadParam.printParam(this->itsFileStream); } } } void VOTableCatalogueWriter::writeTableHeader() { std::map posUCDmap; posUCDmap.insert(std::pair("ra","pos.eq.ra")); posUCDmap.insert(std::pair("dec","pos.eq.dec")); posUCDmap.insert(std::pair("glon","pos.galactic.lng")); posUCDmap.insert(std::pair("glat","pos.galactic.lat")); Catalogues::Column &raCol=this->itsColumnSpecification->column("RAJD"); std::string lngUCDbase = posUCDmap[makelower(raCol.getName())]; Catalogues::Column &decCol=this->itsColumnSpecification->column("DECJD"); std::string latUCDbase = posUCDmap[makelower(decCol.getName())]; std::map specUCDmap; specUCDmap.insert(std::pair("VELO","phys.veloc;spect.dopplerVeloc")); specUCDmap.insert(std::pair("VOPT","phys.veloc;spect.dopplerVeloc.opt")); specUCDmap.insert(std::pair("VRAD","phys.veloc;spect.dopplerVeloc.rad")); specUCDmap.insert(std::pair("FREQ","em.freq")); specUCDmap.insert(std::pair("ENER","em.energy")); specUCDmap.insert(std::pair("WAVN","em.wavenumber")); specUCDmap.insert(std::pair("WAVE","em.wl")); specUCDmap.insert(std::pair("AWAV","em.wl")); specUCDmap.insert(std::pair("ZOPT","src.redshift")); specUCDmap.insert(std::pair("BETA","src.redshift; spect.dopplerVeloc")); std::string specUCDbase = specUCDmap[this->itsColumnSpecification->column("VEL").getName()]; for(size_t i=0;iitsColumnSpecification->size();i++){ Catalogues::Column *col = this->itsColumnSpecification->pCol(i); bool useFint=this->itsHead->isSpecOK(); if(col->doCol(Catalogues::VOTABLE,useFint)){ VOField field(*col); if(col->type()=="RAJD") field.setUCD(lngUCDbase+";meta.main"); if(col->type()=="WRA") field.setUCD("phys.angSize;"+lngUCDbase); if(col->type()=="DECJD") field.setUCD(latUCDbase+";meta.main"); if(col->type()=="WDEC") field.setUCD("phys.angSize;"+latUCDbase); if(col->type()=="VEL") field.setUCD(specUCDbase+";meta.main"); if(col->type()=="W20") field.setUCD("spect.line.width.20;"+specUCDbase); if(col->type()=="W50") field.setUCD("spect.line.width.50;"+specUCDbase); if(col->type()=="WVEL") field.setUCD("spect.line.width.full;"+specUCDbase); if(!this->itsHead->is2D()){ if(col->type()=="FINT") field.setUCD(field.UCD()+"spect.line.intensity"); if(col->type()=="FTOT") field.setUCD(field.UCD()+"spect.line.intensity"); if(col->type()=="FPEAK") field.setUCD(field.UCD()+"spect.line.intensity"); } this->itsFileStream << " "; field.printField(this->itsFileStream); } } this->itsFileStream<<" \n" <<" \n"; } void VOTableCatalogueWriter::writeEntry(Detection *object) { this->itsFileStream.setf(std::ios::fixed); this->itsFileStream<<" \n"; this->itsFileStream<<" "; for(size_t i=0;iitsColumnSpecification->size();i++){ Catalogues::Column *col = this->itsColumnSpecification->pCol(i); if(col->doCol(Catalogues::VOTABLE,this->itsHead->isSpecOK())){ this->itsFileStream<<""; } } this->itsFileStream<<"\n"; this->itsFileStream<<" \n"; } void VOTableCatalogueWriter::writeFooter() { this->itsFileStream<<" \n"; this->itsFileStream<<" \n"; this->itsFileStream<<"
"; object->printTableEntry(this->itsFileStream, *col); this->itsFileStream<<"
\n"; this->itsFileStream<<"
\n"; this->itsFileStream<<"
\n"; resetiosflags(std::ios::fixed); } }