9#ifndef COLUMNVECTORDATA_H 
   10#define COLUMNVECTORDATA_H 1 
   49  class ColumnVectorData : 
public Column  
 
   53        ColumnVectorData(
const ColumnVectorData< T > &right);
 
   54        ColumnVectorData (Table* p = 0);
 
   55        ColumnVectorData (
int columnIndex, 
const string &columnName, 
ValueType type, 
const string &
format, 
const string &
unit, Table* p, 
int  rpt = 1, 
long w = 1, 
const string &
comment = 
"");
 
   58        virtual void readData (
long firstrow, 
long nelements, 
long firstelem = 1);
 
   59        virtual ColumnVectorData<T>* clone () 
const;
 
   60        virtual void setDimen ();
 
   61        void setDataLimits (T* limits);
 
   62        const T minLegalValue () 
const;
 
   63        void minLegalValue (T value);
 
   64        const T maxLegalValue () 
const;
 
   65        void maxLegalValue (T value);
 
   66        const T minDataValue () 
const;
 
   67        void minDataValue (T value);
 
   68        const T maxDataValue () 
const;
 
   69        void maxDataValue (T value);
 
   70        const std::vector<std::valarray<T> >& data () 
const;
 
   71        void setData (
const std::vector<std::valarray<T> >& value);
 
   72        const std::valarray<T>& data (
int i) 
const;
 
   73        void data (
int i, 
const std::valarray<T>& value);
 
   81        ColumnVectorData< T > & operator=(
const ColumnVectorData< T > &right);
 
   83        virtual bool compare (
const Column &right) 
const;
 
   84        void resizeDataObject (
const std::vector<std::valarray<T> >& indata, 
size_t firstRow);
 
   90        virtual void readColumnData (
long first, 
long last, T* nullValue = 0);
 
   91        virtual std::ostream& put (std::ostream& s) 
const;
 
   92        void writeData (
const std::valarray<T>& indata, 
long numRows, 
long firstRow = 1, T* nullValue = 0);
 
   93        void writeData (
const std::vector<std::valarray<T> >& indata, 
long firstRow = 1, T* nullValue = 0);
 
   99        virtual void readRow (
size_t row, T* nullValue = 0);
 
  101        virtual void readVariableRow (
size_t row, T* nullValue = 0);
 
  102        void readColumnData (
long firstrow, 
long nelements, 
long firstelem, T* nullValue = 0);
 
  103        void writeData (
const std::valarray<T>& indata, 
const std::vector<long>& vectorLengths, 
long firstRow = 1, T* nullValue = 0);
 
  104        void writeFixedRow (
const std::valarray<T>& data, 
long row, 
long firstElem = 1, T* nullValue = 0);
 
  105        void writeFixedArray (T* data, 
long nElements, 
long nRows, 
long firstRow, T* nullValue = 0);
 
  107        virtual void insertRows (
long first, 
long number = 1);
 
  108        virtual void deleteRows (
long first, 
long number = 1);
 
  109        virtual size_t getStoredDataSize() 
const;
 
  110        void doWrite (T* array, 
long row, 
long rowSize, 
long firstElem, T* nullValue);
 
  122        std::vector<std::valarray<T> > m_data;
 
  130  template <
typename T>
 
  131  inline void ColumnVectorData<T>::readData (
long firstrow, 
long nelements, 
long firstelem)
 
  133    readColumnData(firstrow,nelements,firstelem,
static_cast<T*
>(0));
 
  136  template <
typename T>
 
  137  inline const T ColumnVectorData<T>::minLegalValue ()
 const 
  139    return m_minLegalValue;
 
  142  template <
typename T>
 
  143  inline void ColumnVectorData<T>::minLegalValue (T value)
 
  145    m_minLegalValue = value;
 
  148  template <
typename T>
 
  149  inline const T ColumnVectorData<T>::maxLegalValue ()
 const 
  151    return m_maxLegalValue;
 
  154  template <
typename T>
 
  155  inline void ColumnVectorData<T>::maxLegalValue (T value)
 
  157    m_maxLegalValue = value;
 
  160  template <
typename T>
 
  161  inline const T ColumnVectorData<T>::minDataValue ()
 const 
  163    return m_minDataValue;
 
  166  template <
typename T>
 
  167  inline void ColumnVectorData<T>::minDataValue (T value)
 
  169    m_minDataValue = value;
 
  172  template <
typename T>
 
  173  inline const T ColumnVectorData<T>::maxDataValue ()
 const 
  175    return m_maxDataValue;
 
  178  template <
typename T>
 
  179  inline void ColumnVectorData<T>::maxDataValue (T value)
 
  181    m_maxDataValue = value;
 
  184  template <
typename T>
 
  185  inline const std::vector<std::valarray<T> >& ColumnVectorData<T>::data ()
 const 
  190  template <
typename T>
 
  191  inline void ColumnVectorData<T>::setData (
const std::vector<std::valarray<T> >& value)
 
  196  template <
typename T>
 
  197  inline const std::valarray<T>& ColumnVectorData<T>::data (
int i)
 const 
  199    return m_data[i - 1];
 
  202  template <
typename T>
 
  203  inline void ColumnVectorData<T>::data (
int i, 
const std::valarray<T>& value)
 
  205     if (m_data[i-1].size() != value.size())
 
  206        m_data[i-1].resize(value.size());
 
  207     m_data[i - 1] = value;
 
  212  template <
typename T>
 
  213  ColumnVectorData<T>::ColumnVectorData(
const ColumnVectorData<T> &right)
 
  215       m_minLegalValue(right.m_minLegalValue),
 
  216       m_maxLegalValue(right.m_maxLegalValue),
 
  217       m_minDataValue(right.m_minDataValue),
 
  218       m_maxDataValue(right.m_maxDataValue),
 
  223  template <
typename T>
 
  224  ColumnVectorData<T>::ColumnVectorData (Table* p)
 
  234  template <
typename T>
 
  235  ColumnVectorData<T>::ColumnVectorData (
int columnIndex, 
const string &columnName, ValueType type, 
const string &format, 
const string &unit, Table* p, 
int  rpt, 
long w, 
const string &comment)
 
  236        : Column(columnIndex,columnName,type,format,unit,p,rpt,w,comment),
 
  246  template <
typename T>
 
  247  ColumnVectorData<T>::~ColumnVectorData()
 
  253  template <
typename T>
 
  254  bool ColumnVectorData<T>::compare (
const Column &right)
 const 
  256          if ( !Column::compare(right) ) 
return false;
 
  257          const ColumnVectorData<T>& that = 
static_cast<const ColumnVectorData<T>&
>(right);
 
  258          size_t n = m_data.size();
 
  260          if ( that.m_data.size() != n ) 
return false;
 
  261          for (
size_t i = 0; i < n ; i++)
 
  263                const std::valarray<T>& thisValArray=m_data[i];
 
  264                const std::valarray<T>& thatValArray=that.m_data[i];
 
  265                size_t nn = thisValArray.size();
 
  266                if (thatValArray.size() != nn ) 
return false;
 
  268                for (
size_t j = 0; j < nn ; j++ ) 
 
  270                   if (thisValArray[j] != thatValArray[j])
 
  277  template <
typename T>
 
  278  ColumnVectorData<T>* ColumnVectorData<T>::clone ()
 const 
  280  return new ColumnVectorData<T>(*
this);
 
  283  template <
typename T>
 
  284  void ColumnVectorData<T>::resizeDataObject (
const std::vector<std::valarray<T> >& indata, 
size_t firstRow)
 
  291    const size_t lastInputRow(indata.size() + firstRow - 1);
 
  292    const size_t newLastRow = std::max(lastInputRow,
static_cast<size_t>(rows()));
 
  299    const size_t origNRows(m_data.size());
 
  302    if (newLastRow > origNRows) m_data.resize(newLastRow);
 
  309       for (
size_t iRow = firstRow-1; iRow < lastInputRow; ++iRow)
 
  311          std::valarray<T>& current = m_data[iRow];
 
  312          const size_t newSize = indata[iRow - (firstRow-1)].size();
 
  313          if (current.size() != newSize)
 
  314             current.resize(newSize);          
 
  325       for (
size_t iRow = firstRow-1; iRow < lastInputRow; ++iRow)
 
  327          if (m_data[iRow].size() != repeat())
 
  328             m_data[iRow].resize(repeat());
 
  333  template <
typename T>
 
  334  void ColumnVectorData<T>::setDimen ()
 
  337  FITSUtil:: auto_array_ptr<char> dimValue (
new char[FLEN_VALUE]);
 
  342  std::ostringstream key;
 
  344  key << 
"TDIM" << index();
 
  347  fits_read_key_str(fitsPointer(), key.str(), dimValue.get(),0,&status);
 
  349  fits_read_key_str(fitsPointer(),
const_cast<char*
>(key.str().c_str()),dimValue.get(),0,&status);
 
  354        dimen(String(dimValue.get()));
 
  358  template <
typename T>
 
  359  void ColumnVectorData<T>::readColumnData (
long first, 
long last, T* nullValue)
 
  366                std::cerr << 
"CCfits: More data requested than contained in table. ";
 
  367                std::cerr << 
"Extracting complete column.\n";
 
  371          long nelements = (last - first + 1)*repeat();
 
  374          readColumnData(first,nelements,1,nullValue);   
 
  375          if (first <= 1 && last == rows()) isRead(
true);
 
  378  template <
typename T>
 
  379  std::ostream& ColumnVectorData<T>::put (std::ostream& s)
 const 
  383    if ( FITS::verboseMode() )
 
  385          s << 
" Column Legal limits: ( " << m_minLegalValue << 
"," << m_maxLegalValue << 
" )\n"  
  386          << 
" Column Data  limits: ( " << m_minDataValue << 
"," << m_maxDataValue << 
" )\n";
 
  390      for (
size_t j = 0; j < m_data.size(); j++)
 
  392                  size_t n = m_data[j].size();
 
  395                          s << 
"Row " << j + 1 << 
" Vector Size " << n << 
'\n';
 
  396              for (
size_t k = 0; k < n - 1; k++)
 
  398                          s << m_data[j][k] << 
'\t';
 
  400                  s << m_data[j][n - 1] << 
'\n';
 
  408  template <
typename T>
 
  409  void ColumnVectorData<T>::writeData (
const std::valarray<T>& indata, 
long numRows, 
long firstRow, T* nullValue)
 
  418     if (numRows <= 0) 
throw InvalidNumberOfRows(numRows);
 
  421     std::ostrstream msgStr;
 
  423     std::ostringstream msgStr;
 
  425     if (indata.size() % 
static_cast<size_t>(numRows))
 
  427        msgStr << 
"To use this write function, input array size" 
  428           <<
"\n must be exactly divisible by requested num rows: " 
  430        throw InsufficientElements(msgStr.str());
 
  432     const size_t cellsize = indata.size()/
static_cast<size_t>(numRows);
 
  434     if (!varLength() && cellsize != repeat() )
 
  436        msgStr << 
"column: " << name() 
 
  437               <<  
"\n input data size: " << indata.size() 
 
  438               << 
" required: " << numRows*repeat();
 
  439        String msg(msgStr.str());
 
  440        throw InsufficientElements(msg);     
 
  443     std::vector<std::valarray<T> > internalFormat(numRows);
 
  447     for (
long j = 0; j < numRows; ++j)
 
  449        internalFormat[j].resize(cellsize);
 
  450        internalFormat[j] = indata[std::slice(cellsize*j,cellsize,1)];
 
  456     writeData(internalFormat,firstRow,nullValue);    
 
  459  template <
typename T>
 
  460  void ColumnVectorData<T>::writeData (
const std::vector<std::valarray<T> >& indata, 
long firstRow, T* nullValue)
 
  465    const size_t nInputRows(indata.size());   
 
  468    resizeDataObject(indata,firstRow); 
 
  477       const size_t endRow = nInputRows + firstRow-1;
 
  478       for (
size_t iRow = firstRow-1; iRow < endRow; ++iRow)
 
  480          m_data[iRow] = indata[iRow - (firstRow-1)];
 
  482          doWrite(&m_data[iRow][0], iRow+1, m_data[iRow].size(), 1, nullValue);
 
  484       parent()->updateRows();
 
  490       const size_t colRepeat = repeat();
 
  491       bool allEqualRepeat = 
true;
 
  492       for (
size_t i=0; i<nInputRows; ++i)
 
  494          const size_t sz = indata[i].size();
 
  500             std::ostringstream oss;
 
  502             oss << 
" vector column length " << colRepeat 
 
  503                <<
", input valarray length " << sz;
 
  504             throw InvalidRowParameter(oss.str());               
 
  507             allEqualRepeat = 
false;
 
  513          const size_t nElements (colRepeat*nInputRows);
 
  514          FITSUtil::CVAarray<T> convert;
 
  515          FITSUtil::auto_array_ptr<T> pArray(convert(indata));
 
  516          T* array = pArray.get();
 
  523          writeFixedArray(array,nElements,nInputRows,firstRow,nullValue);            
 
  525          for (
size_t j = 0; j < nInputRows ; ++j)
 
  527              const valarray<T>& input   = indata[j];
 
  528              valarray<T>& current = m_data[j + firstRow - 1];
 
  536          const size_t endRow = nInputRows + firstRow-1;
 
  537          for (
size_t iRow = firstRow-1; iRow<endRow; ++iRow)
 
  541             const valarray<T>& input = indata[iRow-(firstRow-1)];
 
  542             writeFixedRow(input, iRow, 1, nullValue);
 
  544          parent()->updateRows();          
 
  550  template <
typename T>
 
  551  void ColumnVectorData<T>::readRow (
size_t row, T* nullValue)
 
  557          if ( row > 
static_cast<size_t>(rows()) ) 
 
  562                  std::ostringstream msg;
 
  564                msg << 
" row requested: " << row << 
" row range: 1 - " << rows();                
 
  569                throw Column::InvalidRowNumber(msg.str()); 
 
  574          bool variable(type() < 0); 
 
  577          long nelements(repeat());
 
  581              readVariableRow(row,nullValue);
 
  585              readColumnData(row,nelements,1,nullValue);      
 
  589  template <
typename T>
 
  590  void ColumnVectorData<T>::readVariableRow (
size_t row, T* nullValue)
 
  595      if (fits_read_descript(fitsPointer(),index(),
static_cast<long>(row),
 
  596                      &repeat,&offset,&status)) 
throw FitsError(status);
 
  597      readColumnData(row,repeat,1,nullValue);   
 
  600  template <
typename T>
 
  601  void ColumnVectorData<T>::readColumnData (
long firstrow, 
long nelements, 
long firstelem, T* nullValue)
 
  605   FITSUtil::auto_array_ptr<T> pArray(
new T[nelements]); 
 
  606   T*     array = pArray.get();
 
  611   if (fits_read_col(fitsPointer(), abs(type()),index(), firstrow, firstelem,
 
  612                          nelements, nullValue, array, &anynul, &status) != 0)  
 
  613       throw FitsError(status);
 
  615   size_t countRead = 0;
 
  616   const size_t ONE = 1;
 
  618   if (m_data.size() != 
static_cast<size_t>(rows())) m_data.resize(rows());
 
  619   size_t vectorSize(0);
 
  623        vectorSize = std::max(repeat(),ONE); 
 
  632        vectorSize = nelements;       
 
  634   size_t n = nelements; 
 
  638   while ( countRead < n)
 
  640         std::valarray<T>& current = m_data[ii];
 
  641         if (current.size() != vectorSize) current.resize(vectorSize);
 
  642         int elementsInFirstRow = vectorSize-firstelem + 1;
 
  643         bool lastRow = ( (nelements - countRead) < vectorSize);
 
  646               int elementsInLastRow = nelements - countRead;
 
  647               std::valarray<T> ttmp(array + vectorSize*(ii-firstrow) + elementsInFirstRow,
 
  649               for (
int kk = 0; kk < elementsInLastRow; kk++) current[kk] = ttmp[kk];
 
  650               countRead += elementsInLastRow;
 
  656                if (firstelem == 1 || (firstelem > 1 && i > firstrow) )
 
  658                        std::valarray<T> ttmp(array + vectorSize*(ii - firstrow) + 
 
  659                                        elementsInFirstRow,vectorSize);
 
  663                        countRead += vectorSize;   
 
  669                                std::valarray<T> ttmp(array,elementsInFirstRow);
 
  670                                for (
size_t kk = firstelem ; kk < vectorSize ; kk++)
 
  671                                      current[kk] = ttmp[kk-firstelem];   
 
  672                                countRead += elementsInFirstRow;
 
  681  template <
typename T>
 
  682  void ColumnVectorData<T>::writeData (
const std::valarray<T>& indata, 
const std::vector<long>& vectorLengths, 
long firstRow, T* nullValue)
 
  687    const size_t N(vectorLengths.size());
 
  688    vector<long> sums(N);
 
  690    partial_sum(vectorLengths.begin(),vectorLengths.end(),sums.begin());
 
  692    if (indata.size() < 
static_cast<size_t>(sums[N-1]) )
 
  697        ostringstream msgStr;
 
  699        msgStr << 
" input data size: " << indata.size() << 
" vector length sum: " << sums[N-1];
 
  704        String msg(msgStr.str());
 
  705        throw InsufficientElements(msg);     
 
  708    vector<valarray<T> > vvArray(N);
 
  709    long& last = sums[0];
 
  710    vvArray[0].resize(last);
 
  711    for (
long jj = 0; jj < last; ++jj) vvArray[0][jj] = indata[jj];
 
  713    for (
size_t j = 1; j < N; ++j)
 
  715               valarray<T>& __tmp = vvArray[j];
 
  717               long& first = sums[j-1];
 
  718               long& jlast = sums[j];
 
  719               __tmp.resize(jlast - first);
 
  720               for (
long k = first; k < jlast; ++k)
 
  722                        __tmp[k - first] = indata[k];
 
  726    writeData(vvArray,firstRow,nullValue);
 
  729  template <
typename T>
 
  730  void ColumnVectorData<T>::writeFixedRow (
const std::valarray<T>& data, 
long row, 
long firstElem, T* nullValue)
 
  739    std::ostrstream msgStr;
 
  741    std::ostringstream msgStr;
 
  745       msgStr <<
"Calling ColumnVectorData::writeFixedRow for a variable length column.\n";
 
  746       throw FitsFatal(msgStr.str()); 
 
  749    std::valarray<T>& storedRow = m_data[row];    
 
  750    long inputSize = 
static_cast<long>(data.size());
 
  751    long storedSize(storedRow.size());
 
  752    if (storedSize != 
static_cast<long>(repeat()))
 
  754       msgStr<<
"stored array size vs. column width mismatch in ColumnVectorData::writeFixedRow.\n";
 
  755       throw FitsFatal(msgStr.str());
 
  758    if (inputSize + firstElem - 1 > storedSize)
 
  760          msgStr << 
" requested write " << firstElem << 
" to "  
  761                 << firstElem  + inputSize - 1 << 
" exceeds vector length " << repeat();
 
  762       throw InvalidRowParameter(msgStr.str());        
 
  777    std::valarray<T>& lvData = 
const_cast<std::valarray<T>&
>(data);
 
  778    T* inPointer = &lvData[0];
 
  779    doWrite(inPointer, row+1, inputSize, firstElem, nullValue); 
 
  782    const size_t offset = 
static_cast<size_t>(firstElem) - 1;
 
  783    for (
size_t iElem=0; iElem < static_cast<size_t>(inputSize); ++iElem)
 
  787       storedRow[iElem + offset] = inPointer[iElem];
 
  791  template <
typename T>
 
  792  void ColumnVectorData<T>::writeFixedArray (T* data, 
long nElements, 
long nRows, 
long firstRow, T* nullValue)
 
  801    if ( nElements < nRows*
static_cast<long>(repeat()) )
 
  804        std::ostrstream msgStr;
 
  806        std::ostringstream msgStr;
 
  808        msgStr << 
" input array size: " << nElements << 
" required " << nRows*repeat();
 
  809        String msg(msgStr.str());
 
  811            throw Column::InsufficientElements(msg);
 
  816       if (fits_write_colnull(fitsPointer(),abs(type()),index(),firstRow,
 
  817                           1,nElements,data,nullValue,&status)) 
throw FitsError(status);
 
  821       if (fits_write_col(fitsPointer(),abs(type()),index(),firstRow,
 
  822                           1,nElements,data,&status)) 
throw FitsError(status);
 
  825    parent()->updateRows();
 
  828  template <
typename T>
 
  829  void ColumnVectorData<T>::insertRows (
long first, 
long number)
 
  831    if (first >= 0 && first <= 
static_cast<long>(m_data.size()))
 
  833       typename std::vector<std::valarray<T> >::iterator in;
 
  836               in = m_data.begin()+first;
 
  844       m_data.insert(in,number,std::valarray<T>(T(),0));
 
  848  template <
typename T>
 
  849  void ColumnVectorData<T>::deleteRows (
long first, 
long number)
 
  855    const long curSize = 
static_cast<long>(m_data.size());
 
  856    if (curSize>0 && first <= curSize)
 
  858       const long last = std::min(curSize, first-1+number);
 
  859       m_data.erase(m_data.begin()+first-1,m_data.begin()+last);
 
  864  template <
typename T>
 
  865  size_t ColumnVectorData<T>::getStoredDataSize()
 const 
  867     return m_data.size();
 
  870  template <
typename T>
 
  871  void ColumnVectorData<T>::setDataLimits (T* limits)
 
  873    m_minLegalValue = limits[0];
 
  874    m_maxLegalValue = limits[1];
 
  875    m_minDataValue = std::max(limits[2],limits[0]);
 
  876    m_maxDataValue = std::min(limits[3],limits[1]);
 
  879  template <
typename T>
 
  880  void ColumnVectorData<T>::doWrite (T* array, 
long row, 
long rowSize, 
long firstElem, T* nullValue)
 
  888        if (fits_write_colnull(fitsPointer(),type(),index(),row, firstElem, rowSize,
 
  889                    array, nullValue,&status)) 
throw FitsError(status);
 
  893        if (fits_write_col(fitsPointer(),abs(type()),index(),row,firstElem,rowSize,
 
  894                    array,&status)) 
throw FitsError(status);
 
  910#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 
  912inline void ColumnVectorData<complex<float> >::setDataLimits (complex<float>* limits)
 
  914                m_minLegalValue = limits[0];
 
  915                m_maxLegalValue = limits[1];
 
  916                m_minDataValue =  limits[2];
 
  917                m_maxDataValue =  limits[3];
 
  922  ColumnVectorData<complex<float> >::setDataLimits (complex<float>* limits);
 
  925#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 
  927inline void ColumnVectorData<complex<double> >::setDataLimits (complex<double>* limits)
 
  929                m_minLegalValue = limits[0];
 
  930                m_maxLegalValue = limits[1];
 
  931                m_minDataValue =  limits[2];
 
  932                m_maxDataValue =  limits[3];
 
  937   ColumnVectorData<complex<double> >::setDataLimits (complex<double>* limits);
 
  941#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 
  943        inline void ColumnVectorData<std::complex<float> >::readColumnData(
long firstRow, 
 
  944                                long nelements, 
long firstElem, std::complex<float>* null )
 
  948            FITSUtil::auto_array_ptr<float> pArray(
new float[2*nelements]); 
 
  949            float*     array = pArray.get();
 
  952            if (fits_read_col_cmp(fitsPointer(),index(),firstRow, firstElem,
 
  953                            nelements,nulval,array,&anynul,&status) ) 
throw FitsError(status);
 
  955            if (m_data.size() != 
static_cast<size_t>(rows())) m_data.resize(rows());
 
  957            std::valarray<std::complex<float> > readData(nelements);
 
  958            for (
long j = 0; j < nelements; ++j)
 
  960                    readData[j] = std::complex<float>(array[2*j],array[2*j+1]);
 
  962            size_t countRead = 0;
 
  963            const size_t ONE = 1;
 
  965            if (m_data.size() != 
static_cast<size_t>(rows())) m_data.resize(rows());
 
  966            size_t vectorSize(0);
 
  969                 vectorSize = std::max(repeat(),ONE); 
 
  977                 vectorSize = nelements;       
 
  979            size_t n = nelements; 
 
  983            while ( countRead < n)
 
  985                    std::valarray<complex<float> >& current = m_data[ii];
 
  986                    if (current.size() != vectorSize) current.resize(vectorSize,0.);
 
  987                    int elementsInFirstRow = vectorSize-firstElem + 1;
 
  988                    bool lastRow = ( (nelements - countRead) < vectorSize);
 
  991                            int elementsInLastRow = nelements - countRead;
 
  992                            std::copy(&readData[countRead],&readData[0]+nelements,¤t[0]);
 
  993                            countRead += elementsInLastRow;
 
  998                            if (firstElem == 1 || (firstElem > 1 && i > firstRow) )
 
 1000                                    current = readData[std::slice(vectorSize*(ii-firstRow)+
 
 1001                                                               elementsInFirstRow,vectorSize,1)];
 
 1004                                    countRead += vectorSize;   
 
 1010                                            std::copy(&readData[0],&readData[0]+elementsInFirstRow,
 
 1011                                                                            ¤t[firstElem]);
 
 1012                                            countRead += elementsInFirstRow;
 
 1022void ColumnVectorData<complex<float> >::readColumnData(
long firstRow, 
 
 1024                        long firstElem, complex<float>* null);
 
 1027#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 
 1029    inline void ColumnVectorData<complex<double> >::readColumnData (
long firstRow, 
 
 1030              long nelements,
long firstElem, 
 
 1031              complex<double>* nullValue)
 
 1038            FITSUtil::auto_array_ptr<double> pArray(
new double[2*nelements]); 
 
 1039            double*     array = pArray.get();
 
 1042            if (fits_read_col_dblcmp(fitsPointer(),index(),firstRow, firstElem,
 
 1043                            nelements,nulval,array,&anynul,&status) ) 
throw FitsError(status);
 
 1045            if (m_data.size() != 
static_cast<size_t>(rows())) m_data.resize(rows());
 
 1047            std::valarray<std::complex<double> > readData(nelements);
 
 1048            for (
long j = 0; j < nelements; ++j)
 
 1050                    readData[j] = std::complex<double>(array[2*j],array[2*j+1]);
 
 1052            size_t countRead = 0;
 
 1053            const size_t ONE = 1;
 
 1055            if (m_data.size() != 
static_cast<size_t>(rows())) m_data.resize(rows());
 
 1056            size_t vectorSize(0);
 
 1059                 vectorSize = std::max(repeat(),ONE); 
 
 1067                 vectorSize = nelements;       
 
 1069            size_t n = nelements; 
 
 1073            while ( countRead < n)
 
 1075                    std::valarray<std::complex<double> >& current = m_data[ii];
 
 1076                    if (current.size() != vectorSize) current.resize(vectorSize,0.);
 
 1077                    int elementsInFirstRow = vectorSize-firstElem + 1;
 
 1078                    bool lastRow = ( (nelements - countRead) < vectorSize);
 
 1081                            int elementsInLastRow = nelements - countRead;
 
 1082                            std::copy(&readData[countRead],&readData[0]+nelements,¤t[0]);
 
 1083                            countRead += elementsInLastRow;
 
 1088                            if (firstElem == 1 || (firstElem > 1 && i > firstRow) )
 
 1090                                    current = readData[std::slice(vectorSize*(ii-firstRow)+
 
 1091                                                               elementsInFirstRow,vectorSize,1)];
 
 1094                                    countRead += vectorSize;   
 
 1100                                            std::copy(&readData[0],&readData[0]+elementsInFirstRow,
 
 1101                                                                            ¤t[firstElem]);
 
 1102                                            countRead += elementsInFirstRow;
 
 1112void ColumnVectorData<complex<double> >::readColumnData (
long firstRow, 
 
 1114                        long firstElem, complex<double>* null);
 
 1117#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 
 1119        inline void ColumnVectorData<complex<float> >::writeFixedArray 
 
 1120                        (complex<float>* data, 
long nElements, 
long nRows, 
long firstRow, 
 
 1121                         complex<float>* nullValue)
 
 1131                if ( nElements < nRows*
static_cast<long>(repeat()) )
 
 1133#ifdef SSTREAM_DEFECT 
 1134                        std::ostrstream msgStr;
 
 1136                        std::ostringstream msgStr;
 
 1138                        msgStr << 
" input array size: " << nElements 
 
 1139                                        << 
" required " << nRows*repeat();
 
 1140#ifdef SSTREAM_DEFECT 
 1141                        msgStr << std::ends;
 
 1145                        String msg(msgStr.str());
 
 1147                        throw Column::InsufficientElements(msg);
 
 1150                FITSUtil::auto_array_ptr<float> realData(
new float[2*nElements]);
 
 1152                for (
int j = 0; j < nElements; ++j)
 
 1154                        realData[2*j] = data[j].real();
 
 1155                        realData[2*j+1] = data[j].imag();       
 
 1160                if (fits_write_col_cmp(fitsPointer(),index(),firstRow,
 
 1161                        1,nElements,realData.get(),&status)) 
throw FitsError(status);
 
 1163                parent()->updateRows();
 
 1167void ColumnVectorData<complex<float> >::writeFixedArray 
 
 1168     (complex<float>* data, 
long nElements, 
long nRows, 
long firstRow, std::complex<float>* null);
 
 1171#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT 
 1173        inline void ColumnVectorData<complex<double> >::writeFixedArray 
 
 1174                        (complex<double>* data, 
long nElements, 
long nRows, 
long firstRow, 
 
 1175                         complex<double>* nullValue)
 
 1184                if ( nElements < nRows*
static_cast<long>(repeat()) )
 
 1186#ifdef SSTREAM_DEFECT 
 1187                        std::ostrstream msgStr;
 
 1189                        std::ostringstream msgStr;
 
 1191                        msgStr << 
" input array size: " << nElements 
 
 1192                                        << 
" required " << nRows*repeat();
 
 1193#ifdef SSTREAM_DEFECT 
 1194                        msgStr << std::ends;
 
 1197                        String msg(msgStr.str());
 
 1199                        throw Column::InsufficientElements(msg);
 
 1202                FITSUtil::auto_array_ptr<double> realData(
new double[2*nElements]);
 
 1204                for (
int j = 0; j < nElements; ++j)
 
 1206                        realData[2*j] = data[j].real();
 
 1207                        realData[2*j+1] = data[j].imag();       
 
 1212                if (fits_write_col_dblcmp(fitsPointer(),index(),firstRow,
 
 1213                        1,nElements,realData.get(),&status)) 
throw FitsError(status);
 
 1215                parent()->updateRows();
 
 1220void ColumnVectorData<complex<double> >::writeFixedArray 
 
 1221                (complex<double>* data, 
long nElements, 
long nRows, 
long firstRow, 
 
 1222                 std::complex<double>* null);
 
 1225#ifdef SPEC_TEMPLATE_DECL_DEFECT 
 1228  ColumnVectorData<std::complex<float> >::doWrite 
 
 1229  (std::complex<float>* data, 
long row, 
long rowSize, 
long firstElem, std::complex<float>* nullValue )
 
 1232    FITSUtil::auto_array_ptr<float> carray( 
new float[2*rowSize]); 
 
 1233    for ( 
long j = 0 ; j < rowSize; ++ j)
 
 1235    carray[2*j] = data[j].real();
 
 1236    carray[2*j + 1] = data[j].imag();
 
 1238    if (fits_write_col_cmp(fitsPointer(),index(),row,firstElem,rowSize,
 
 1239               carray.get(),&status)) 
throw FitsError(status);
 
 1245  ColumnVectorData<std::complex<double> >::doWrite
 
 1246  (std::complex<double>* data, 
long row, 
long rowSize, 
long firstElem, std::complex<double>* nullValue )
 
 1249    FITSUtil::auto_array_ptr<double> carray( 
new double[2*rowSize]); 
 
 1250    for ( 
long j = 0 ; j < rowSize; ++ j)
 
 1252    carray[2*j] = data[j].real();
 
 1253    carray[2*j + 1] = data[j].imag();
 
 1255    if (fits_write_col_dblcmp(fitsPointer(),index(),row,firstElem,rowSize,
 
 1256                  carray.get(),&status)) 
throw FitsError(status);
 
 1263ColumnVectorData<complex<float> >::doWrite 
 
 1264                ( complex<float>* data, 
long row, 
long rowSize, 
long firstElem, complex<float>* nullValue);
 
 1268ColumnVectorData<complex<double> >::doWrite 
 
 1269                ( complex<double>* data, 
long row, 
long rowSize, 
long firstElem, complex<double>* nullValue );
 
Column(const Column &right)
copy constructor, used in copying Columns to standard library containers.
Definition Column.cxx:171
 
const String & unit() const
get units of data in Column (TUNITn keyword)
Definition Column.h:1527
 
const String & comment() const
retrieve comment for Column
Definition Column.h:1517
 
const String & format() const
return TFORMn keyword
Definition Column.h:1522
 
ValueType type() const
returns the data type of the column
Definition Column.h:1437
 
Namespace enclosing all CCfits classes and globals definitions.
Definition AsciiTable.cxx:26
 
ValueType
CCfits value types and their CFITSIO equivalents (in caps)
Definition CCfits.h:81