source: trunk/src/Outputs/columns.cc @ 1133

Last change on this file since 1133 was 1133, checked in by MatthewWhiting, 11 years ago

Ticket #132 - New code to fit the ellipse to the moment-0 map thresholded at half its peak - this then provides FWHM esimates for major/minor axes. Also have adaptive units for these axes, scaling to get the numbers not too small and adjusting the units accordingly. 2D images also have the shape calculated too now.

File size: 33.2 KB
Line 
1// -----------------------------------------------------------------------
2// columns.cc: Define a set of columns for Duchamp output.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
28#include <iostream>
29#include <sstream>
30
31#include <math.h>
32#include <duchamp/duchamp.hh>
33#include <duchamp/fitsHeader.hh>
34#include <vector>
35#include <string>
36#include <duchamp/Detection/detection.hh>
37#include <duchamp/Outputs/columns.hh>
38
39namespace duchamp
40{
41
42  namespace Catalogues
43  {
44
45
46    Column::Column()
47    {
48      /// @brief Set the default values for the parameters.
49      this->itsWidth=1;
50      this->itsPrecision=0;
51      this->itsName=" ";
52      this->itsUnits=" ";
53      this->itsType="";
54      this->itsUCD = "";
55      this->itsDatatype = "";
56      this->itsExtraInfo="";
57      this->itsColID="";
58    }
59
60    Column::Column(std::string type)
61    {
62      operator=(defaultColumn(type));
63    }
64
65    Column::Column(const Column& c)
66    {
67      operator=(c);
68    }
69
70    Column& Column::operator=(const Column& c)
71    {
72      if(this==&c) return *this;
73      this->itsWidth = c.itsWidth;
74      this->itsPrecision = c.itsPrecision;
75      this->itsName = c.itsName;
76      this->itsUnits = c.itsUnits;
77      this->itsUCD = c.itsUCD;
78      this->itsDatatype = c.itsDatatype;
79      this->itsExtraInfo = c.itsExtraInfo;
80      this->itsColID = c.itsColID;
81      this->itsType = c.itsType;
82      return *this;
83    }
84
85    Column::Column(std::string type, std::string name, std::string units, int width, int prec, std::string ucd, std::string datatype, std::string colID, std::string extraInfo):
86      itsType(type), itsName(name), itsUnits(units), itsWidth(width), itsPrecision(prec), itsUCD(ucd), itsDatatype(datatype), itsColID(colID), itsExtraInfo(extraInfo)
87    {
88      /// A generic constructor designed to make a Column other than
89      /// the predefined ones listed in the Column namespace
90      /// \param name The title of the column
91      /// \param units What units the column takes
92      /// \param width The starting width
93      /// \param prec The starting precision
94      /// \param ucd The UCD relating to the quantity (VOTable use only)
95      /// \param datatype The datatype (float/char/int/etc) of the quantity (VOTable)
96      /// \param colID The column ID string used in the FIELD entry of a VOTable
97      /// \param extraInfo Other information used in the VOTable (eg. a reference to a COOSYS)
98   }
99
100    //------------------------------------------------------------
101
102    void Column::changePrec(int p)
103    {
104      /// A direct way to alter the precision without having to use
105      /// Column::upPrec(). If the precision increases, the width will
106      /// increase by the same amount. If it decreases, no change is
107      /// made to the width.
108      /// \param p The new precision value.
109
110      if(p > this->itsPrecision) this->itsWidth += (p-this->itsPrecision);
111      this->itsPrecision = p;
112
113    }
114   
115    //------------------------------------------------------------
116    void Column::printTitle(std::ostream &stream)
117    {
118      stream << std::setw(this->itsWidth)
119             << std::setfill(' ')
120             << this->itsName;
121    }
122
123    void Column::printUnits(std::ostream &stream)
124    {
125      stream << std::setw(this->itsWidth)
126             << std::setfill(' ')
127             << this->itsUnits;
128    }
129 
130    void Column::printDash (std::ostream &stream)
131    {
132      stream << std::setw(this->itsWidth)
133             << std::setfill('-')
134             << ""
135             << std::setfill(' ');
136    }
137
138    void Column::printBlank(std::ostream &stream)
139    {
140      stream << std::setw(this->itsWidth)
141             << std::setfill(' ')
142             << "";
143    }
144 
145    template <class T> void Column::printEntry(std::ostream &stream, T value)
146    {
147      ///  \param stream Where the printing is done.
148      ///  \param value  The value to be printed.
149
150      stream << std::setprecision(this->itsPrecision)
151             << std::setw(this->itsWidth)
152             << std::setfill(' ')
153             << value;
154    }
155    template void Column::printEntry<int>(std::ostream &stream, int value);
156    template void Column::printEntry<long>(std::ostream &stream, long value);
157    template void Column::printEntry<unsigned int>(std::ostream &stream, unsigned int value);
158    template void Column::printEntry<unsigned long>(std::ostream &stream, unsigned long value);
159    template void Column::printEntry<float>(std::ostream &stream, float value);
160    template void Column::printEntry<double>(std::ostream &stream, double value);
161    template void Column::printEntry<std::string>(std::ostream &stream, std::string value);
162
163 
164    bool Column::doCol(DESTINATION tableType, bool flagFint)
165    {
166      ///  @details Determines whether a given column is used for a
167      ///  given table type, based on the Column::type string.
168      /// \param tableType The type of table: one of FILE, SCREEN, LOG, VOTABLE.
169      /// \param flagFint Whether to use FINT (true) or FTOT
170      /// (false). This defaults to true, so need not be given. It only
171      /// applies to the screen and votable cases -- both are written for the
172      /// results file case.
173      /// \return True if column is used for given table type. False
174      /// otherwise. False if tableType not one of four listed.
175     
176 
177      std::string FileList[37]={"NUM","NAME","X","Y","Z","RA","DEC","VEL","MAJ","MIN","PA","WRA","WDEC",
178                                "W50","W20","WVEL","FINT","FTOT","FPEAK","SNRPEAK",
179                                "X1","X2","Y1","Y2","Z1","Z2","NPIX","FLAG","XAV","YAV",
180                                "ZAV","XCENT","YCENT","ZCENT","XPEAK","YPEAK","ZPEAK"};
181      std::string ScreenList[22]={"NUM","NAME","X","Y","Z","RA","DEC","VEL","MAJ","MIN","PA",
182                                  "W50","FPEAK","SNRPEAK","X1","X2","Y1",
183                                  "Y2","Z1","Z2","NPIX","FLAG"};
184      std::string LogList[16]={"NUM","X","Y","Z","FTOT","FPEAK","SNRPEAK",
185                               "X1","X2","Y1","Y2","Z1","Z2","NPIX","NUMCH","SPATSIZE"};
186      std::string VOList[23]={"NUM","NAME","RAJD","DECJD","VEL","MAJ","MIN","PA",
187                            "W50","W20","WVEL","FPEAK","SNRPEAK","FLAG","XAV","YAV",
188                            "ZAV","XCENT","YCENT","ZCENT","XPEAK","YPEAK","ZPEAK"};
189
190      bool doIt=false;
191      if(tableType == FILE){
192        for(int i=0;i<37 && !doIt;i++) doIt = doIt || (this->itsType==FileList[i]);
193      }
194      else if(tableType == SCREEN){
195        if(this->itsType=="FTOT") doIt = !flagFint;
196        else if(this->itsType == "FINT") doIt = flagFint;
197        else for(int i=0;i<22 && !doIt;i++) doIt = doIt || (this->itsType==ScreenList[i]);
198      }
199      else if(tableType == LOG){
200        for(int i=0;i<16 && !doIt;i++) doIt = doIt || (this->itsType==LogList[i]);
201      }
202      else if(tableType == VOTABLE){
203        if(this->itsType=="FTOT") doIt = !flagFint;
204        else if(this->itsType == "FINT") doIt = flagFint;
205        else for(int i=0;i<23 && !doIt;i++) doIt = doIt || (this->itsType==VOList[i]);
206      }
207      return doIt;
208       
209    }
210
211    Column defaultColumn(std::string type)
212    {
213      // type|name|units|width|prec|ucd|datatype|extraInfo
214      if (type == "NUM") return Column(type,"Obj#","",5,0,"meta.id","int","col_objnum","");
215      else if(type=="NAME") return Column(type,"Name","",8,0,"meta.id;meta.main","char","col_name","");
216      else if(type=="X") return Column(type,"X","",6,prXYZ,"pos.cartesian.x","float","col_x","");
217      else if(type=="Y") return Column(type,"Y","",6,prXYZ,"pos.cartesian.y","float","col_y","");
218      else if(type=="Z") return Column(type,"Z","",6,prXYZ,"pos.cartesian.z","float","col_z","");
219      else if(type=="RA") return Column(type,"RA","",11,0,"","char","col_ra",coordRef);
220      else if(type=="DEC") return Column(type,"DEC","",10,0,"","char","col_dec",coordRef);
221      else if(type=="RAJD") return Column(type,"RAJD","[deg]",11,prPOS,"","float","col_rajd",coordRef);
222      else if(type=="DECJD") return Column(type,"DECJD","[deg]",11,prPOS,"","float","col_decjd",coordRef);
223      else if(type=="VEL") return Column(type,"VEL","",7,prVEL,"","float","col_vel","");
224      else if(type=="MAJ") return Column(type,"MAJ","[deg]",6,prWPOS,"phys.angSize.smajAxis","float","col_maj",coordRef);
225      else if(type=="MIN") return Column(type,"MIN","[deg]",6,prWPOS,"phys.angSize.sminAxis","float","col_min",coordRef);
226      else if(type=="PA") return Column(type,"PA","[deg]",7,prWPOS,"pos.posAng;phys.angSize","float","col_pa",coordRef);
227      else if(type=="WRA") return Column(type,"w_RA","[arcmin]",9,prWPOS,"","float","col_wra",coordRef);
228      else if(type=="WDEC") return Column(type,"w_DEC","[arcmin]",9,prWPOS,"","float","col_wdec",coordRef);
229      else if(type=="W50") return Column(type,"w_50","",7,prVEL,"","float","col_w50","");
230      else if(type=="W20") return Column(type,"w_20","",7,prVEL,"","float","col_w20","");
231      else if(type=="WVEL") return Column(type,"w_VEL","",7,prVEL,"","float","col_wvel","");
232      else if(type=="FINT") return Column(type,"F_int","",10,prFLUX,"phot.flux.density.integrated","float","col_fint","");
233      else if(type=="FTOT") return Column(type,"F_tot","",10,prFLUX,"phot.flux.density","float","col_ftot","");
234      else if(type=="FPEAK") return Column(type,"F_peak","",9,prFLUX,"phot.flux;stat.max","float","col_fpeak","");
235      else if(type=="SNRPEAK") return Column(type,"S/Nmax","",7,prSNR,"stat.snr;phot.flux","float","col_snrmax","");
236      else if(type=="X1") return Column(type,"X1","",4,0,"pos.cartesian.x;stat.min","int","col_x1","");
237      else if(type=="Y1") return Column(type,"Y1","",4,0,"pos.cartesian.y;stat.min","int","col_y1","");
238      else if(type=="Z1") return Column(type,"Z1","",4,0,"pos.cartesian.z;stat.min","int","col_z1","");
239      else if(type=="X2") return Column(type,"X2","",4,0,"pos.cartesian.x;stat.max","int","col_x2","");
240      else if(type=="Y2") return Column(type,"Y2","",4,0,"pos.cartesian.y;stat.max","int","col_y2","");
241      else if(type=="Z2") return Column(type,"Z2","",4,0,"pos.cartesian.z;stat.max","int","col_z2","");
242      else if(type=="NPIX") return Column(type,"Npix","[pix]",6,0,"","int","col_npix","");
243      else if(type=="FLAG") return Column(type,"Flag","",5,0,"meta.code.qual","char","col_flag","");
244      else if(type=="XAV") return Column(type,"X_av","",6,prXYZ,"pos.cartesian.x;stat.mean","float","col_xav","");
245      else if(type=="YAV") return Column(type,"Y_av","",6,prXYZ,"pos.cartesian.y;stat.mean","float","col_yav","");
246      else if(type=="ZAV") return Column(type,"Z_av","",6,prXYZ,"pos.cartesian.z;stat.mean","float","col_zav","");
247      else if(type=="XCENT") return Column(type,"X_cent","",7,prXYZ,"pos.cartesian.x;stat.centroid","float","col_xcent","");
248      else if(type=="YCENT") return Column(type,"Y_cent","",7,prXYZ,"pos.cartesian.y;stat.centroid","float","col_ycent","");
249      else if(type=="ZCENT") return Column(type,"Z_cent","",7,prXYZ,"pos.cartesian.z;stat.centroid","float","col_zcent","");
250      else if(type=="XPEAK") return Column(type,"X_peak","",7,prXYZ,"pos.cartesian.x;phot.flux;stat.max","int","col_xpeak","");
251      else if(type=="YPEAK") return Column(type,"Y_peak","",7,prXYZ,"pos.cartesian.y;phot.flux;stat.max","int","col_ypeak","");
252      else if(type=="ZPEAK") return Column(type,"Z_peak","",7,prXYZ,"pos.cartesian.z;phot.flux;stat.max","int","col_zpeak","");
253      else if(type=="NUMCH") return Column(type,"Nch","",6,0,"em.bin;stat.sum","int","col_nch","");
254      else if(type=="SPATSIZE") return Column(type,"Sp_size","",8,0,"instr.pixel;stat.sum","int","col_spsize","");
255      else {
256        Column col;
257        col.setType(type);
258        return col;
259      }
260
261    }
262
263    CatalogueSpecification getFullColSet(std::vector<Detection> &objectList, FitsHeader &head)
264    {
265      ///  @details A function that returns a catalogue specification
266      ///  containing information on the columns necessary for output
267      ///  to the results file:
268      ///  Obj#,NAME,X,Y,Z,RA,DEC,VEL,w_RA,w_DEC,w_VEL,F_tot,F_int,F_peak,
269      ///  X1,X2,Y1,Y2,Z1,Z2,Npix,Flag,
270      ///  XAV,YAV,ZAV,XCENT,YCENT,ZCENT,XPEAK,YPEAK,ZPEAK
271      ///
272      ///   Each object in the provided objectList is checked to see if it
273      ///   requires any column to be widened, or for that column to have
274      ///   its precision increased.
275      ///
276      ///   Both Ftot and Fint are provided -- it is up to the calling
277      ///   function to determine which to use.
278      ///
279      /// \param objectList A std::vector list of Detection objects that the
280      /// columns need to fit.
281      /// \param head The FitsHeader object defining the World Coordinate
282      /// System.
283      /// \return A CatalogueSpecification
284
285      CatalogueSpecification newset;
286
287      // desired precisions for fluxes, velocities and SNR value
288      int precVel,precFlux,precSNR;
289      if(objectList.size()>0){
290        precVel=objectList[0].getVelPrec();
291        precFlux=objectList[0].getFpeakPrec(); // same as FintPrec at this point.
292        precSNR=objectList[0].getSNRPrec();
293      }
294      else {
295        precVel = prVEL;
296        precFlux = prFLUX;
297        precSNR = prSNR;
298      }
299
300      // set up the default columns
301      newset.addColumn( Column("NUM") );
302      newset.addColumn( Column("NAME") );
303      newset.addColumn( Column("X") );
304      newset.addColumn( Column("Y") );
305      newset.addColumn( Column("Z") );
306      newset.addColumn( Column("RA") );
307      newset.addColumn( Column("DEC") );
308      newset.addColumn( Column("RAJD") );
309      newset.addColumn( Column("DECJD") );
310      newset.addColumn( Column("VEL") );
311      newset.addColumn( Column("MAJ") );
312      newset.addColumn( Column("MIN") );
313      newset.addColumn( Column("PA") );
314      newset.addColumn( Column("WRA") );
315      newset.addColumn( Column("WDEC") );
316      newset.addColumn( Column("W50") );
317      newset.addColumn( Column("W20") );
318      newset.addColumn( Column("WVEL") );
319      newset.addColumn( Column("FINT") );
320      newset.addColumn( Column("FTOT") );
321      newset.addColumn( Column("FPEAK") );
322      newset.addColumn( Column("SNRPEAK") );
323      newset.addColumn( Column("X1") );
324      newset.addColumn( Column("X2") );
325      newset.addColumn( Column("Y1") );
326      newset.addColumn( Column("Y2") );
327      newset.addColumn( Column("Z1") );
328      newset.addColumn( Column("Z2") );
329      newset.addColumn( Column("NPIX") );
330      newset.addColumn( Column("FLAG") );
331      newset.addColumn( Column("XAV") );
332      newset.addColumn( Column("YAV") );
333      newset.addColumn( Column("ZAV") );
334      newset.addColumn( Column("XCENT") );
335      newset.addColumn( Column("YCENT") );
336      newset.addColumn( Column("ZCENT") );
337      newset.addColumn( Column("XPEAK") );
338      newset.addColumn( Column("YPEAK") );
339      newset.addColumn( Column("ZPEAK") );
340      newset.addColumn( Column("NUMCH") );
341      newset.addColumn( Column("SPATSIZE") );
342
343
344      // Now test each object against each new column
345      std::vector<Detection>::iterator obj;
346      for(obj = objectList.begin(); obj < objectList.end(); obj++){
347        std::string tempstr;
348        int tempwidth;
349        float val,minval;
350        double valD,minvalD;
351
352        // Obj#
353        tempwidth = int( log10(obj->getID()) + 1) + 1;
354        for(int i=newset.column("NUM").getWidth();i<tempwidth;i++) newset.column("NUM").widen();
355
356        // Name
357        tempwidth = obj->getName().size() + 1;
358        for(int i=newset.column("NAME").getWidth();i<tempwidth;i++) newset.column("NAME").widen();
359
360        // X position
361        val = obj->getXcentre() + obj->getXOffset();
362        if((val<1.)&&(val>0.)){
363          minval = pow(10, -1. * (newset.column("X").getPrecision()+1));
364          if(val < minval) newset.column("X").upPrec();
365        }
366        tempwidth = int( log10(val) + 1) + newset.column("X").getPrecision() + 2;
367        for(int i=newset.column("X").getWidth();i<tempwidth;i++) newset.column("X").widen();
368        // Y position
369        val = obj->getYcentre() + obj->getYOffset();
370        if((val<1.)&&(val>0.)){
371          minval = pow(10, -1. * (newset.column("Y").getPrecision()+1));
372          if(val < minval) newset.column("Y").upPrec();
373        }
374        tempwidth = int( log10(val) + 1) + newset.column("Y").getPrecision() + 2;
375        for(int i=newset.column("Y").getWidth();i<tempwidth;i++) newset.column("Y").widen();
376        // Z position
377        val = obj->getZcentre() + obj->getZOffset();
378        if((val<1.)&&(val>0.)){
379          minval = pow(10, -1. * (newset.column("Z").getPrecision()+1));
380          if((val>0.)&&(val < minval)) newset.column("Z").upPrec();
381        }
382        tempwidth = int( log10(val) + 1) + newset.column("Z").getPrecision() + 2;
383        for(int i=newset.column("Z").getWidth();i<tempwidth;i++) newset.column("Z").widen();
384
385        if(head.isWCS()){ 
386          // RA -- assign correct title. Check width but should be ok by definition
387          tempstr = head.lngtype();
388          newset.column("RA").setName(tempstr);
389          tempwidth = obj->getRAs().size() + 1;
390          for(int i=newset.column("RA").getWidth();i<tempwidth;i++) newset.column("RA").widen();
391     
392          // Dec -- assign correct title. Check width, should be ok by definition
393          tempstr = head.lattype();
394          newset.column("DEC").setName(tempstr);
395          tempwidth = obj->getDecs().size() + 1;
396          for(int i=newset.column("DEC").getWidth();i<tempwidth;i++) newset.column("DEC").widen();
397
398          // RA decimal degrees -- assign correct title. Check width but should be OK
399          tempstr = head.lngtype();
400          newset.column("RAJD").setName(tempstr);
401          valD = obj->getRA();
402          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("RAJD").getPrecision() + 2;
403          for(int i=newset.column("RAJD").getWidth();i<tempwidth;i++) newset.column("RAJD").widen();
404     
405          // Dec decimal degrees -- assign correct title. Check width but should be OK
406          tempstr = head.lattype();
407          newset.column("DECJD").setName(tempstr);
408          valD = obj->getDec();
409          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("DECJD").getPrecision() + 2;
410          for(int i=newset.column("DECJD").getWidth();i<tempwidth;i++) newset.column("DECJD").widen();
411
412          // Vel -- check width, title and units.
413          if(head.canUseThirdAxis()){
414            if(head.WCS().spec < 0)  // if it's not a spectral axis
415              newset.column("VEL").setName( head.WCS().ctype[2] );
416            else
417              newset.column("VEL").setName(head.getSpectralType());
418            tempwidth = newset.column("VEL").getName().size() + 1;
419            for(int i=newset.column("VEL").getWidth();i<tempwidth;i++) newset.column("VEL").widen();
420            if(head.getSpectralUnits().size()>0)
421              newset.column("VEL").setUnits("[" + head.getSpectralUnits() + "]");
422            tempwidth = newset.column("VEL").getUnits().size() + 1;
423            for(int i=newset.column("VEL").getWidth();i<tempwidth;i++) newset.column("VEL").widen();
424       
425            valD = obj->getVel();
426            if((fabs(valD) < 1.)&&(valD>0.)){
427              minvalD = pow(10, -1. * (newset.column("VEL").getPrecision()+1));
428              if(valD < minvalD) newset.column("VEL").upPrec();
429            }
430            tempwidth = int(log10(fabs(valD)) + 1) + newset.column("VEL").getPrecision() + 2;
431            if(valD<0) tempwidth++;
432            for(int i=newset.column("VEL").getWidth();i<tempwidth;i++) newset.column("VEL").widen();
433          }
434
435          // MAJ -- check width & title. leave units for the moment.
436          newset.column("MAJ").setUnits("["+head.getShapeUnits()+"]");
437          tempwidth = newset.column("MAJ").getUnits().size() + 1;
438          for(int i=newset.column("MAJ").getWidth();i<tempwidth;i++) newset.column("MAJ").widen();
439          valD = obj->getMajorAxis();
440          if((fabs(valD) < 1.)&&(valD>0.)){
441            minvalD = pow(10, -1. * (newset.column("MAJ").getPrecision()));
442            if(valD < minvalD) newset.column("MAJ").upPrec();
443          }
444          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("MAJ").getPrecision() + 2;
445          if(valD<0) tempwidth++;
446          for(int i=newset.column("MAJ").getWidth();i<tempwidth;i++) newset.column("MAJ").widen();
447
448          // MIN -- check width & title. leave units for the moment.
449          newset.column("MIN").setUnits("["+head.getShapeUnits()+"]");
450          tempwidth = newset.column("MIN").getUnits().size() + 1;
451          for(int i=newset.column("MIN").getWidth();i<tempwidth;i++) newset.column("MIN").widen();
452          valD = obj->getMinorAxis();
453          if((fabs(valD) < 1.)&&(valD>0.)){
454            minvalD = pow(10, -1. * (newset.column("MIN").getPrecision()));
455            if(valD < minvalD) newset.column("MIN").upPrec();
456          }
457          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("MIN").getPrecision() + 2;
458          if(valD<0) tempwidth++;
459          for(int i=newset.column("MIN").getWidth();i<tempwidth;i++) newset.column("MIN").widen();
460
461          // PA -- check width & title. leave units for the moment.
462          tempwidth = newset.column("PA").getUnits().size() + 1;
463          for(int i=newset.column("PA").getWidth();i<tempwidth;i++) newset.column("PA").widen();
464          valD = obj->getPositionAngle();
465          if((fabs(valD) < 1.)&&(valD>0.)){
466            minvalD = pow(10, -1. * (newset.column("PA").getPrecision()+1));
467            if(valD < minvalD) newset.column("PA").upPrec();
468          }
469          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("PA").getPrecision() + 2;
470          if(valD<0) tempwidth++;
471          for(int i=newset.column("PA").getWidth();i<tempwidth;i++) newset.column("PA").widen();
472
473          // w_RA -- check width & title. leave units for the moment.
474          tempstr = "w_" + head.lngtype();
475          newset.column("WRA").setName(tempstr);
476          tempwidth = newset.column("RA").getUnits().size() + 1;
477          for(int i=newset.column("WRA").getWidth();i<tempwidth;i++) newset.column("WRA").widen();
478          valD = obj->getRAWidth();
479          if((fabs(valD) < 1.)&&(valD>0.)){
480            minvalD = pow(10, -1. * (newset.column("WRA").getPrecision()+1));
481            if(valD < minvalD) newset.column("WRA").upPrec();
482          }
483          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("WRA").getPrecision() + 2;
484          if(valD<0) tempwidth++;
485          for(int i=newset.column("WRA").getWidth();i<tempwidth;i++) newset.column("WRA").widen();
486
487          // w_DEC -- check width & title. leave units for the moment.
488          tempstr = "w_" + head.lattype();
489          newset.column("WDEC").setName(tempstr);
490          tempwidth = newset.column("DEC").getUnits().size() + 1;
491          for(int i=newset.column("WDEC").getWidth();i<tempwidth;i++) newset.column("WDEC").widen();
492          valD = obj->getDecWidth();
493          if((fabs(valD) < 1.)&&(valD>0.)){
494            minvalD = pow(10, -1. * (newset.column("WDEC").getPrecision()+1));
495            if(valD < minvalD) newset.column("WDEC").upPrec();
496          }
497          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("WDEC").getPrecision() + 2;
498          if(valD<0) tempwidth++;
499          for(int i=newset.column("WDEC").getWidth();i<tempwidth;i++) newset.column("WDEC").widen();
500
501          // w_50 -- check width, title and units.
502          if(head.canUseThirdAxis()){
503            if(head.getSpectralUnits().size()>0)
504              newset.column("W50").setUnits("[" + head.getSpectralUnits() + "]");
505            tempwidth = newset.column("W50").getUnits().size() + 1;
506            for(int i=newset.column("W50").getWidth();i<tempwidth;i++) newset.column("W50").widen();
507            valD = obj->getW50();
508            if((fabs(valD) < 1.)&&(valD>0.)){
509              minvalD = pow(10, -1. * (newset.column("W50").getPrecision()+1));
510              if(valD < minvalD) newset.column("W50").upPrec();
511            }
512            tempwidth = int( log10(fabs(valD)) + 1) + newset.column("W50").getPrecision() + 2;
513            if(valD<0) tempwidth++;
514            for(int i=newset.column("W50").getWidth();i<tempwidth;i++) newset.column("W50").widen();
515          }
516
517          // w_20 -- check width, title and units.
518          if(head.canUseThirdAxis()){
519            if(head.getSpectralUnits().size()>0)
520              newset.column("W20").setUnits("[" + head.getSpectralUnits() + "]");
521            tempwidth = newset.column("W20").getUnits().size() + 1;
522            for(int i=newset.column("W20").getWidth();i<tempwidth;i++)newset.column("W20").widen();
523            valD = obj->getW20();
524            if((fabs(valD) < 1.)&&(valD>0.)){
525              minvalD = pow(10, -1. * (newset.column("W20").getPrecision()+1));
526              if(valD < minvalD) newset.column("W20").upPrec();
527            }
528            tempwidth = int( log10(fabs(valD)) + 1) + newset.column("W20").getPrecision() + 2;
529            if(valD<0) tempwidth++;
530            for(int i=newset.column("W20").getWidth();i<tempwidth;i++) newset.column("W20").widen();
531          }
532
533          // w_Vel -- check width, title and units.
534          if(head.canUseThirdAxis()){
535            if(head.WCS().spec < 0) // if it's not a spectral axis
536              newset.column("WVEL").setName( std::string("w_") + head.WCS().ctype[2] );
537            else
538              newset.column("WVEL").setName(std::string("w_")+head.getSpectralType());
539            if(head.getSpectralUnits().size()>0)
540              newset.column("WVEL").setUnits("[" + head.getSpectralUnits() + "]");
541            tempwidth = newset.column("WVEL").getUnits().size() + 1;
542            for(int i=newset.column("WVEL").getWidth();i<tempwidth;i++)newset.column("WVEL").widen();
543            tempwidth = newset.column("WVEL").getName().size() + 1;
544            for(int i=newset.column("WVEL").getWidth();i<tempwidth;i++) newset.column("WVEL").widen();
545            valD = obj->getVelWidth();
546            if((fabs(valD) < 1.)&&(valD>0.)){
547              minvalD = pow(10, -1. * (newset.column("WVEL").getPrecision()+1));
548              if(valD < minvalD) newset.column("WVEL").upPrec();
549            }
550            tempwidth = int( log10(fabs(valD)) + 1) + newset.column("WVEL").getPrecision() + 2;
551            if(valD<0) tempwidth++;
552            for(int i=newset.column("WVEL").getWidth();i<tempwidth;i++) newset.column("WVEL").widen();
553          }
554
555          // F_int -- check width & units
556          if(head.getIntFluxUnits().size()>0)
557            newset.column("FINT").setUnits("[" + head.getIntFluxUnits() + "]");
558          tempwidth = newset.column("FINT").getUnits().size() + 1;
559          for(int i=newset.column("FINT").getWidth();i<tempwidth;i++) newset.column("FINT").widen();
560          valD = obj->getIntegFlux();
561          if((fabs(valD) < 1.)// &&(valD>0.)
562             ){
563            int minprec = int(fabs(log10(fabs(valD))))+2;
564            for(int i=newset.column("FINT").getPrecision();i<minprec;i++) newset.column("FINT").upPrec();
565          }
566          tempwidth = int( log10(fabs(valD)) + 1) + newset.column("FINT").getPrecision() + 2;
567          if(valD<0) tempwidth++;
568          for(int i=newset.column("FINT").getWidth();i<tempwidth;i++) newset.column("FINT").widen();
569     
570        }
571
572        // F_tot
573        newset.column("FTOT").setUnits("[" + head.getFluxUnits() + "]");
574        tempwidth = newset.column("FTOT").getUnits().size() + 1;
575        for(int i=newset.column("FTOT").getWidth();i<tempwidth;i++) newset.column("FTOT").widen();
576        val = obj->getTotalFlux();
577        //     std::cerr << val << "\n";
578        if((fabs(val) < 1.)// &&(val>0.)
579           ){
580          int minprec = int(fabs(log10(fabs(val))))+2;
581          for(int i=newset.column("FTOT").getPrecision();i<minprec;i++) newset.column("FTOT").upPrec();
582        }
583        tempwidth = int( log10(fabs(val)) + 1) + newset.column("FTOT").getPrecision() + 2;
584        if(val<0) tempwidth++;
585        for(int i=newset.column("FTOT").getWidth();i<tempwidth;i++) newset.column("FTOT").widen();
586
587        // F_peak
588        newset.column("FPEAK").setUnits("[" + head.getFluxUnits() + "]");
589        tempwidth = newset.column("FPEAK").getUnits().size() + 1;
590        for(int i=newset.column("FPEAK").getWidth();i<tempwidth;i++) newset.column("FPEAK").widen();
591        val = obj->getPeakFlux();
592        if((fabs(val) < 1.)// &&(val>0.)
593           ){
594          int minprec = int(fabs(log10(fabs(val))))+2;
595          for(int i=newset.column("FPEAK").getPrecision();i<minprec;i++) newset.column("FPEAK").upPrec();
596        }
597        tempwidth = int( log10(fabs(val)) + 1) + newset.column("FPEAK").getPrecision() + 2;
598        if(val<0) tempwidth++;
599        for(int i=newset.column("FPEAK").getWidth();i<tempwidth;i++) newset.column("FPEAK").widen();
600
601        // S/N_peak
602        val = obj->getPeakSNR();
603        if((fabs(val) < 1.)&&(val>0.)){
604          minval = pow(10, -1. * (newset.column("SNRPEAK").getPrecision()+1));
605          if(val < minval) newset.column("SNRPEAK").upPrec();
606        }
607        tempwidth = int( log10(fabs(val)) + 1) + newset.column("SNRPEAK").getPrecision() +2;
608        if(val<0) tempwidth++;
609        for(int i=newset.column("SNRPEAK").getWidth();i<tempwidth;i++) newset.column("SNRPEAK").widen();
610
611        // X1 position
612        val = obj->getXmin() + obj->getXOffset();
613        tempwidth = int( log10(val) + 1) + newset.column("X1").getPrecision() + 1;
614        for(int i=newset.column("X1").getWidth();i<tempwidth;i++) newset.column("X1").widen();
615        // X2 position
616        val = obj->getXmax() + obj->getXOffset();
617        tempwidth = int( log10(val) + 1) + newset.column("X2").getPrecision() + 1;
618        for(int i=newset.column("X2").getWidth();i<tempwidth;i++) newset.column("X2").widen();
619        // Y1 position
620        val = obj->getYmin() + obj->getYOffset();
621        tempwidth = int( log10(val) + 1) + newset.column("Y1").getPrecision() + 1;
622        for(int i=newset.column("Y1").getWidth();i<tempwidth;i++) newset.column("Y1").widen();
623        // Y2 position
624        val = obj->getYmax() + obj->getYOffset();
625        tempwidth = int( log10(val) + 1) + newset.column("Y2").getPrecision() + 1;
626        for(int i=newset.column("Y2").getWidth();i<tempwidth;i++) newset.column("Y2").widen();
627        // Z1 position
628        val = obj->getZmin() + obj->getZOffset();
629        tempwidth = int( log10(val) + 1) + newset.column("Z1").getPrecision() + 1;
630        for(int i=newset.column("Z1").getWidth();i<tempwidth;i++) newset.column("Z1").widen();
631        // Z2 position
632        val = obj->getZmax() + obj->getZOffset();
633        tempwidth = int( log10(val) + 1) + newset.column("Z2").getPrecision() + 1;
634        for(int i=newset.column("Z2").getWidth();i<tempwidth;i++) newset.column("Z2").widen();
635
636        // Npix
637        tempwidth = int( log10(obj->getSize()) + 1) +
638          newset.column("NPIX").getPrecision() + 1;
639        for(int i=newset.column("NPIX").getWidth();i<tempwidth;i++) newset.column("NPIX").widen();
640   
641        // average X position
642        val = obj->getXaverage() + obj->getXOffset();
643        if((val<1.)&&(val>0.)){
644          minval = pow(10, -1. * (newset.column("XAV").getPrecision()+1));
645          if(val < minval) newset.column("XAV").upPrec();
646        }
647        tempwidth = int( log10(val) + 1) + newset.column("XAV").getPrecision() + 2;
648        for(int i=newset.column("XAV").getWidth();i<tempwidth;i++) newset.column("XAV").widen();
649        // average Y position
650        val = obj->getYaverage() + obj->getYOffset();
651        if((val<1.)&&(val>0.)){
652          minval = pow(10, -1. * (newset.column("YAV").getPrecision()+1));
653          if(val < minval) newset.column("YAV").upPrec();
654        }
655        tempwidth = int( log10(val) + 1) + newset.column("YAV").getPrecision() + 2;
656        for(int i=newset.column("YAV").getWidth();i<tempwidth;i++) newset.column("YAV").widen();
657        // average Z position
658        val = obj->getZaverage() + obj->getZOffset();
659        if((val<1.)&&(val>0.)){
660          minval = pow(10, -1. * (newset.column("ZAV").getPrecision()+1));
661          if((val>0.)&&(val < minval)) newset.column("ZAV").upPrec();
662        }
663        tempwidth = int( log10(val) + 1) + newset.column("ZAV").getPrecision() + 2;
664        for(int i=newset.column("ZAV").getWidth();i<tempwidth;i++) newset.column("ZAV").widen();
665   
666        // X position of centroid
667        val = obj->getXCentroid() + obj->getXOffset();
668        if((val<1.)&&(val>0.)){
669          minval = pow(10, -1. * (newset.column("XCENT").getPrecision()+1));
670          if(val < minval) newset.column("XCENT").upPrec();
671        }
672        tempwidth = int( log10(val) + 1) + newset.column("XCENT").getPrecision() + 2;
673        for(int i=newset.column("XCENT").getWidth();i<tempwidth;i++) newset.column("XCENT").widen();
674        // Y position of centroid
675        val = obj->getYCentroid() + obj->getYOffset();
676        if((val<1.)&&(val>0.)){
677          minval = pow(10, -1. * (newset.column("YCENT").getPrecision()+1));
678          if(val < minval) newset.column("YCENT").upPrec();
679        }
680        tempwidth = int( log10(val) + 1) + newset.column("YCENT").getPrecision() + 2;
681        for(int i=newset.column("YCENT").getWidth();i<tempwidth;i++) newset.column("YCENT").widen();
682        // Z position of centroid
683        val = obj->getZCentroid() + obj->getZOffset();
684        if((val<1.)&&(val>0.)){
685          minval = pow(10, -1. * (newset.column("ZCENT").getPrecision()+1));
686          if((val>0.)&&(val < minval)) newset.column("ZCENT").upPrec();
687        }
688        tempwidth = int( log10(val) + 1) + newset.column("ZCENT").getPrecision() + 2;
689        for(int i=newset.column("ZCENT").getWidth();i<tempwidth;i++) newset.column("ZCENT").widen();
690   
691        // X position of peak flux
692        val = obj->getXPeak() + obj->getXOffset();
693        if((val<1.)&&(val>0.)){
694          minval = pow(10, -1. * (newset.column("XPEAK").getPrecision()+1));
695          if(val < minval) newset.column("XPEAK").upPrec();
696        }
697        tempwidth = int( log10(val) + 1) + newset.column("XPEAK").getPrecision() + 2;
698        for(int i=newset.column("XPEAK").getWidth();i<tempwidth;i++) newset.column("XPEAK").widen();
699        // Y position of peak flux
700        val = obj->getYPeak() + obj->getYOffset();
701        if((val<1.)&&(val>0.)){
702          minval = pow(10, -1. * (newset.column("YPEAK").getPrecision()+1));
703          if(val < minval) newset.column("YPEAK").upPrec();
704        }
705        tempwidth = int( log10(val) + 1) + newset.column("YPEAK").getPrecision() + 2;
706        for(int i=newset.column("YPEAK").getWidth();i<tempwidth;i++) newset.column("YPEAK").widen();
707        // Z position of peak flux
708        val = obj->getZPeak() + obj->getZOffset();
709        if((val<1.)&&(val>0.)){
710          minval = pow(10, -1. * (newset.column("ZPEAK").getPrecision()+1));
711          if((val>0.)&&(val < minval)) newset.column("ZPEAK").upPrec();
712        }
713        tempwidth = int( log10(val) + 1) + newset.column("ZPEAK").getPrecision() + 2;
714        for(int i=newset.column("ZPEAK").getWidth();i<tempwidth;i++) newset.column("ZPEAK").widen();
715
716        //Number of contiguous channels
717        tempwidth = int( log10(obj->getMaxAdjacentChannels()) + 1) +
718          newset.column("NUMCH").getPrecision() + 1;
719        for(int i=newset.column("NUMCH").getWidth();i<tempwidth;i++) newset.column("NUMCH").widen();
720        //Spatial size
721        tempwidth = int( log10(obj->getSpatialSize()) + 1) +
722          newset.column("SPATSIZE").getPrecision() + 1;
723        for(int i=newset.column("SPATSIZE").getWidth();i<tempwidth;i++) newset.column("SPATSIZE").widen();
724       
725      }
726     
727      return newset;
728
729    }
730
731  }
732
733}
Note: See TracBrowser for help on using the repository browser.