10 #define COLUMNDATA_H 1 34 class ColumnData :
public Column
38 ColumnData(
const ColumnData< T > &right);
39 ColumnData (Table* p = 0);
40 ColumnData (
int columnIndex,
const string &columnName,
ValueType type,
const String &format,
const String &unit, Table* p,
int rpt = 1,
long w = 1,
const String &comment =
"");
43 virtual ColumnData<T>* clone ()
const;
44 virtual void readData (
long firstRow,
long nelements,
long firstElem = 1);
45 void setDataLimits (T* limits);
46 const T minLegalValue ()
const;
47 void minLegalValue (T value);
48 const T maxLegalValue ()
const;
49 void maxLegalValue (T value);
50 const T minDataValue ()
const;
51 void minDataValue (T value);
52 const T maxDataValue ()
const;
53 void maxDataValue (T value);
54 const std::vector<T>& data ()
const;
55 void setData (
const std::vector<T>& value);
57 void data (
int i, T value);
65 ColumnData< T > & operator=(
const ColumnData< T > &right);
67 void readColumnData (
long firstRow,
long nelements, T* nullValue = 0);
68 virtual bool compare (
const Column &right)
const;
69 virtual std::ostream& put (std::ostream& s)
const;
70 void writeData (T* indata,
long nRows = 1,
long firstRow = 1, T* nullValue = 0);
71 void writeData (
const std::vector<T>& indata,
long firstRow = 1, T* nullValue = 0);
73 virtual void insertRows (
long first,
long number = 1);
74 virtual void deleteRows (
long first,
long number = 1);
86 std::vector<T> m_data;
95 inline void ColumnData<T>::readData (
long firstRow,
long nelements,
long firstElem)
97 readColumnData(firstRow,nelements,static_cast<T*>(0));
100 template <
typename T>
101 inline const T ColumnData<T>::minLegalValue ()
const 103 return m_minLegalValue;
106 template <
typename T>
107 inline void ColumnData<T>::minLegalValue (T value)
109 m_minLegalValue = value;
112 template <
typename T>
113 inline const T ColumnData<T>::maxLegalValue ()
const 115 return m_maxLegalValue;
118 template <
typename T>
119 inline void ColumnData<T>::maxLegalValue (T value)
121 m_maxLegalValue = value;
124 template <
typename T>
125 inline const T ColumnData<T>::minDataValue ()
const 127 return m_minDataValue;
130 template <
typename T>
131 inline void ColumnData<T>::minDataValue (T value)
133 m_minDataValue = value;
136 template <
typename T>
137 inline const T ColumnData<T>::maxDataValue ()
const 139 return m_maxDataValue;
142 template <
typename T>
143 inline void ColumnData<T>::maxDataValue (T value)
145 m_maxDataValue = value;
148 template <
typename T>
149 inline const std::vector<T>& ColumnData<T>::data ()
const 154 template <
typename T>
155 inline void ColumnData<T>::setData (
const std::vector<T>& value)
160 template <
typename T>
161 inline T ColumnData<T>::data (
int i)
164 return m_data[i - 1];
167 template <
typename T>
168 inline void ColumnData<T>::data (
int i, T value)
171 m_data[i - 1] = value;
176 template <
typename T>
177 ColumnData<T>::ColumnData(
const ColumnData<T> &right)
179 m_minLegalValue(right.m_minLegalValue),
180 m_maxLegalValue(right.m_maxLegalValue),
181 m_minDataValue(right.m_minDataValue),
182 m_maxDataValue(right.m_maxDataValue),
187 template <
typename T>
188 ColumnData<T>::ColumnData (Table* p)
198 template <
typename T>
199 ColumnData<T>::ColumnData (
int columnIndex,
const string &columnName,
ValueType type,
const String &
format,
const String &
unit, Table* p,
int rpt,
long w,
const String &
comment)
200 :
Column(columnIndex,columnName,type,format,unit,p,rpt,w,comment),
210 template <
typename T>
211 ColumnData<T>::~ColumnData()
216 template <
typename T>
217 void ColumnData<T>::readColumnData (
long firstRow,
long nelements, T* nullValue)
219 if (
rows() < nelements )
221 std::cerr <<
"CCfits: More data requested than contained in table. ";
222 std::cerr <<
"Extracting complete column.\n";
229 FITSUtil::auto_array_ptr<T> array(
new T[nelements]);
234 nelements, nullValue, array.get(), &anynul, &status) )
throw FitsError(status);
237 if (m_data.size() !=
static_cast<size_t>(
rows() ) ) m_data.resize(
rows());
239 std::copy(&array[0],&array[nelements],m_data.begin()+firstRow-1);
243 template <
typename T>
244 bool ColumnData<T>::compare (
const Column &right)
const 246 if ( !Column::compare(right) )
return false;
247 const ColumnData<T>& that =
static_cast<const ColumnData<T>&
>(right);
248 unsigned int n = m_data.size();
249 if ( that.m_data.size() != n )
return false;
250 for (
unsigned int i = 0; i < n ; i++)
252 if (m_data[i] != that.m_data[i])
return false;
257 template <
typename T>
258 ColumnData<T>* ColumnData<T>::clone ()
const 260 return new ColumnData<T>(*this);
263 template <
typename T>
264 std::ostream& ColumnData<T>::put (std::ostream& s)
const 269 s <<
" Column Legal limits: ( " << m_minLegalValue <<
"," << m_maxLegalValue <<
" )\n" 270 <<
" Column Data limits: ( " << m_minDataValue <<
"," << m_maxDataValue <<
" )\n";
274 std::ostream_iterator<T> output(s,
"\n");
277 std::copy(m_data.begin(),m_data.end(),output);
283 template <
typename T>
284 void ColumnData<T>::writeData (T* indata,
long nRows,
long firstRow, T* nullValue)
292 long elementsToWrite(nRows + firstRow -1);
294 std::vector<T> __tmp(m_data);
297 if (elementsToWrite != static_cast<long>(m_data.size()))
300 m_data.resize(elementsToWrite,T());
303 std::copy(&indata[0],&indata[nRows],m_data.begin()+firstRow-1);
312 indata, nullValue, &status) != 0)
throw FitsError(status);
317 indata, &status) != 0)
throw FitsError(status);
327 if (status == NO_NULL)
throw NoNullValue(
name());
332 template <
typename T>
333 void ColumnData<T>::writeData (
const std::vector<T>& indata,
long firstRow, T* nullValue)
335 FITSUtil::CVarray<T> convert;
336 FITSUtil::auto_array_ptr<T> pcolData (convert(indata));
337 T* columnData = pcolData.get();
338 writeData(columnData,indata.size(),firstRow,nullValue);
341 template <
typename T>
342 void ColumnData<T>::insertRows (
long first,
long number)
344 FITSUtil::FitsNullValue<T> blank;
345 typename std::vector<T>::iterator in;
348 in = m_data.begin()+first;
356 m_data.insert(in,number,blank());
359 template <
typename T>
360 void ColumnData<T>::deleteRows (
long first,
long number)
362 m_data.erase(m_data.begin()+first-1,m_data.begin()+first-1+number);
365 template <
typename T>
366 void ColumnData<T>::setDataLimits (T* limits)
368 m_minLegalValue = limits[0];
369 m_maxLegalValue = limits[1];
370 m_minDataValue = std::max(limits[2],limits[0]);
371 m_maxDataValue = std::min(limits[3],limits[1]);
379 #if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 381 inline void ColumnData<complex<float> >::setDataLimits (complex<float>* limits)
383 m_minLegalValue = limits[0];
384 m_maxLegalValue = limits[1];
385 m_minDataValue = limits[2];
386 m_maxDataValue = limits[3];
390 void ColumnData<complex<float> >::setDataLimits (complex<float>* limits);
393 #if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 395 inline void ColumnData<complex<double> >::setDataLimits (complex<double>* limits)
397 m_minLegalValue = limits[0];
398 m_maxLegalValue = limits[1];
399 m_minDataValue = limits[2];
400 m_maxDataValue = limits[3];
404 void ColumnData<complex<double> >::setDataLimits (complex<double>* limits);
408 #if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 410 inline void ColumnData<string>::readColumnData (
long firstRow,
417 char** array =
new char*[nelements];
420 for ( ; j < nelements; ++j)
422 array[j] =
new char[
width() + 1];
428 nulval =
const_cast<char*
>(nullValue->c_str());
441 nulval,array, &anynul,&status) )
throw FitsError(status);
446 for (
int jj = 0; jj < nelements; ++jj)
457 if (m_data.size() !=
rows()) setData(std::vector<string>(
rows(),
string(nulval)));
461 for ( j = 0; j < nelements; j++)
463 m_data[j - 1 + firstRow] = string(array[j]);
466 for ( j = 0; j < nelements; j++)
478 void ColumnData<string>::readColumnData (
long firstRow,
long nelements,
string* nullValue);
482 #if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 484 inline void ColumnData<complex<float> >::readColumnData (
long firstRow,
486 complex<float>* nullValue)
491 FITSUtil::auto_array_ptr<float> pArray(
new float[nelements*2]);
492 float* array = pArray.get();
498 nulval,array, &anynul,&status) )
throw FitsError(status);
501 if (m_data.size() !=
rows()) m_data.resize(
rows());
505 for (
int j = 0; j < nelements; ++j)
508 m_data[j - 1 + firstRow] = std::complex<float>(array[2*j],array[2*j+1]);
515 void ColumnData<complex<float> >::readColumnData (
long firstRow,
long nelements,complex<float>* nullValue );
518 #if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 520 inline void ColumnData<complex<double> >::readColumnData (
long firstRow,
522 complex<double>* nullValue)
527 FITSUtil::auto_array_ptr<double> pArray(
new double[nelements*2]);
528 double* array = pArray.get();
534 nulval,array, &anynul,&status) )
throw FitsError(status);
539 if (m_data.size() !=
rows()) setData(std::vector<complex<double> >(
rows(),nulval));
543 for (
int j = 0; j < nelements; j++)
546 m_data[j - 1 + firstRow] = std::complex<double>(array[2*j],array[2*j+1]);
553 void ColumnData<complex<double> >::readColumnData (
long firstRow,
long nelements,complex<double>* nullValue);
556 #if SPEC_TEMPLATE_DECL_DEFECT 558 inline void ColumnData<string>::writeData (
const std::vector<string>& indata,
559 long firstRow,
string* nullValue)
562 char** columnData=FITSUtil::CharArray(indata);
564 if ( fits_write_colnull(
fitsPointer(), TSTRING,
index(), firstRow, 1, indata.size(),
565 columnData, 0, &status) != 0 )
566 throw FitsError(status);
567 unsigned long elementsToWrite (indata.size() + firstRow - 1);
568 std::vector<string> __tmp(m_data);
569 if (m_data.size() < elementsToWrite)
571 m_data.resize(elementsToWrite,
"");
572 std::copy(__tmp.begin(),__tmp.end(),m_data.begin());
574 std::copy(indata.begin(),indata.end(),m_data.begin()+firstRow-1);
577 for (
size_t i = 0; i < indata.size(); ++i)
579 delete [] columnData[i];
581 delete [] columnData;
585 void ColumnData<string>::writeData (
const std::vector<string>& inData,
long firstRow,
string* nullValue);
588 #ifdef SPEC_TEMPLATE_DECL_DEFECT 590 inline void ColumnData<complex<float> >::writeData (
const std::vector<complex<float> >& inData,
592 complex<float>* nullValue)
595 int nRows (inData.size());
596 FITSUtil::auto_array_ptr<float> pData(
new float[nRows*2]);
597 float* Data = pData.get();
598 std::vector<complex<float> > __tmp(m_data);
599 for (
int j = 0; j < nRows; ++j)
601 Data[ 2*j] = inData[j].real();
602 Data[ 2*j + 1] = inData[j].imag();
609 nRows,Data, &status) != 0)
throw FitsError(status);
610 long elementsToWrite(nRows + firstRow -1);
611 if (elementsToWrite > static_cast<long>(m_data.size()))
614 m_data.resize(elementsToWrite);
617 std::copy(inData.begin(),inData.end(),m_data.begin()+firstRow-1);
625 m_data.resize(__tmp.size());
633 void ColumnData<complex<float> >::writeData (
const std::vector<complex<float> >& inData,
long firstRow,
634 complex<float>* nullValue);
637 #ifdef SPEC_TEMPLATE_DECL_DEFECT 639 inline void ColumnData<complex<double> >::writeData (
const std::vector<complex<double> >& inData,
641 complex<double>* nullValue)
644 int nRows (inData.size());
645 FITSUtil::auto_array_ptr<double> pData(
new double[nRows*2]);
646 double* Data = pData.get();
647 std::vector<complex<double> > __tmp(m_data);
648 for (
int j = 0; j < nRows; ++j)
650 pData[ 2*j] = inData[j].real();
651 pData[ 2*j + 1] = inData[j].imag();
658 nRows,Data, &status) != 0)
throw FitsError(status);
659 long elementsToWrite(nRows + firstRow -1);
660 if (elementsToWrite > static_cast<long>(m_data.size()))
663 m_data.resize(elementsToWrite);
666 std::copy(inData.begin(),inData.end(),m_data.begin()+firstRow-1);
674 m_data.resize(__tmp.size());
682 void ColumnData<complex<double> >::writeData (
const std::vector<complex<double> >& inData,
long firstRow,
683 complex<double>* nullValue);
const String & name() const
return name of Column (TTYPEn keyword)
Definition: Column.h:1505
fitsfile * fitsPointer()
fits pointer corresponding to fits file containing column data.
Definition: Column.cxx:264
int rows() const
return the number of rows in the table.
Definition: Column.cxx:275
long width() const
return column data width
Definition: Column.h:1353
void updateRows()
update the number of rows in the table
Definition: Table.cxx:305
void makeHDUCurrent()
make HDU containing this the current HDU of the fits file.
Definition: Column.cxx:270
bool isRead() const
flag set to true if the entire column data has been read from disk
Definition: Column.h:1343
virtual std::ostream & put(std::ostream &s) const
internal implementation of << operator.
Definition: Column.cxx:302
static bool verboseMode()
return verbose setting for library
Definition: FITS.h:891
Namespace enclosing all CCfits classes and globals definitions.
Definition: AsciiTable.cxx:26
const String & unit() const
get units of data in Column (TUNITn keyword)
Definition: Column.h:1500
ValueType
CCfits value types and their CFITSIO equivalents (in caps)
Definition: CCfits.h:79
Column(const Column &right)
copy constructor, used in copying Columns to standard library containers.
Definition: Column.cxx:171
int index() const
get the Column index (the n in TTYPEn etc).
Definition: Column.h:1333
const String & comment() const
retrieve comment for Column
Definition: Column.h:1490
ValueType type() const
returns the data type of the column
Definition: Column.h:1410
const String & format() const
return TFORMn keyword
Definition: Column.h:1495
Table * parent() const
return a pointer to the Table which owns this Column
Definition: Column.cxx:312