| [1661] | 1 | /* Lecteur Fits de bolometre */
 | 
|---|
| [2615] | 2 | #include "sopnamsp.h"
 | 
|---|
| [1661] | 3 | #include "machdefs.h"
 | 
|---|
 | 4 | #include <stdlib.h>
 | 
|---|
 | 5 | #include <stdio.h>
 | 
|---|
 | 6 | #include "pexceptions.h"
 | 
|---|
 | 7 | #include "fboloread.h"
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | #define _NCOL_BOLO_MIN_ 5
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | /*!
 | 
|---|
 | 12 |   \class SOPHYA::FitsBoloRead
 | 
|---|
 | 13 |   \ingroup FitsIOServer
 | 
|---|
 | 14 |   Class for defining a bolometer by connecting columns out FITS files
 | 
|---|
 | 15 |   \verbatim
 | 
|---|
 | 16 |   -- Exemple:
 | 
|---|
 | 17 |   FitsBoloRead fbr(blen,bsens);
 | 
|---|
 | 18 |   fbr.SetDebug(2);
 | 
|---|
 | 19 | 
 | 
|---|
 | 20 |   fbr.SetBolo("bolomuv","bolo.fits",0);
 | 
|---|
 | 21 |   fbr.SetFlag("flag");
 | 
|---|
 | 22 |   fbr.SetSNum("samplenum");
 | 
|---|
 | 23 |   fbr.SetAlpha("alpha","alpha.fits",0);
 | 
|---|
 | 24 |   fbr.SetDelta("delta");
 | 
|---|
 | 25 |   int col1 = fbr.AddCol("altitude","other_file.fits");
 | 
|---|
 | 26 |   fbr.Print(2);
 | 
|---|
 | 27 |   cout<<"NRows= "<<fbr.GetNbLine()<<endl;
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 |   cout<<"Reading element by elements"<<endl;
 | 
|---|
| [3128] | 30 |   for(LONGLONG i=0; i<fbr.GetNbLine(); i++) {
 | 
|---|
| [1661] | 31 |     double a = fbr.GetAlpha(i);
 | 
|---|
 | 32 |     double d = fbr.GetDelta(i);
 | 
|---|
 | 33 |     double b = fbr.GetBolo(i);
 | 
|---|
 | 34 |     double s = fbr.GetSNum(i);
 | 
|---|
 | 35 |     double f = fbr.GetFlag(i);
 | 
|---|
 | 36 |     double c1 = fbr.GetCol(col1,i);
 | 
|---|
 | 37 |     cout<<i<<" s="<<(long long)s<<" b="<<b<<" f="<<f
 | 
|---|
 | 38 |         <<" a="<<a<<" d="<<d<<" c1="c1<<endl;
 | 
|---|
 | 39 |   }
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 |   cout<<"Reading with vectors"<<endl;
 | 
|---|
 | 42 |   TVector<double> Va,Vd,Vb,Vf;
 | 
|---|
 | 43 |   TVector<float> Vc1;
 | 
|---|
 | 44 |   TVector<int_4> Vs;
 | 
|---|
| [3128] | 45 |   for(LONGLONG i=0, istep=1000; i<fbr.GetNbLine(); i+=istep) {
 | 
|---|
 | 46 |     LONGLONG i2=i+istep-1; if(i2>=fbr.GetNbLine()) i2=fbr.GetNbLine()-1;
 | 
|---|
| [1661] | 47 |     fbr.GetSNum(i,i2,Vs);
 | 
|---|
 | 48 |     fbr.GetBolo(i,i2,Vb);
 | 
|---|
 | 49 |     fbr.GetFlag(i,i2,Vf);
 | 
|---|
 | 50 |     fbr.GetAlpha(i,i2,Va);
 | 
|---|
 | 51 |     fbr.GetDelta(i,i2,Vd);
 | 
|---|
 | 52 |     fbr.GetCol(col1,i,i2,Vc1);
 | 
|---|
 | 53 |   }
 | 
|---|
 | 54 |   \endverbatim
 | 
|---|
 | 55 | */
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 | //////////////////////////////////////////////////////////////
 | 
|---|
 | 58 | /*!
 | 
|---|
 | 59 |   Constructor. Define the structure of the bolometer columns connector.
 | 
|---|
 | 60 |   \param blen : read buffer length
 | 
|---|
 | 61 |   \param bsens : buffer reading direction
 | 
|---|
 | 62 |   \verbatim
 | 
|---|
 | 63 |   - bsens>0    read forward
 | 
|---|
 | 64 |     bsens<0    read backward
 | 
|---|
 | 65 |     bsens==0   read centered
 | 
|---|
 | 66 |   \endverbatim
 | 
|---|
 | 67 | */
 | 
|---|
 | 68 | FitsBoloRead::FitsBoloRead(long blen,long bsens)
 | 
|---|
 | 69 |   : NBline(0), DbgLevel(0), BuffLen(blen), BuffSens(bsens)
 | 
|---|
 | 70 | {
 | 
|---|
 | 71 |   for(int i=0;i<_NCOL_BOLO_MIN_;i++) {
 | 
|---|
 | 72 |     mFName.push_back("");
 | 
|---|
 | 73 |     mLabel.push_back("");
 | 
|---|
 | 74 |     mHDU.push_back(0);
 | 
|---|
 | 75 |     mFABT.push_back(NULL);
 | 
|---|
 | 76 |   }
 | 
|---|
 | 77 | }
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 | /*! Destructor */
 | 
|---|
 | 80 | FitsBoloRead::~FitsBoloRead(void)
 | 
|---|
 | 81 | {
 | 
|---|
 | 82 |  for(int i=0; i<(int)mFABT.size(); i++)
 | 
|---|
 | 83 |    if(mFABT[i]!=NULL) {delete mFABT[i]; mFABT[i]=NULL;}
 | 
|---|
 | 84 |  // NBline=0; mFABT.resize(_NCOL_BOLO_MIN_);
 | 
|---|
 | 85 | }
 | 
|---|
 | 86 | 
 | 
|---|
 | 87 | //////////////////////////////////////////////////////////////
 | 
|---|
 | 88 | /*!
 | 
|---|
 | 89 |  Add the column number "col" to the bolometer connector.
 | 
|---|
 | 90 |  Protected method. Do not use directly but read the doc.
 | 
|---|
 | 91 |  \param col : number of the column to be added
 | 
|---|
 | 92 |  \param label : label of the column
 | 
|---|
 | 93 |  \param fname : FITS file name containing the column
 | 
|---|
 | 94 |  \param ihdu : FITS HDU containing the column
 | 
|---|
 | 95 |  \verbatim
 | 
|---|
 | 96 |  - col<0     : add a new column
 | 
|---|
 | 97 |    col<size  : fill a new column
 | 
|---|
 | 98 |    col>=size : throw exception
 | 
|---|
 | 99 |  - The method also set the number of rows of the Bolometer connector
 | 
|---|
 | 100 |    as the smallest number of rows of the connected columns.
 | 
|---|
 | 101 |    That could be changed by using the SetNbLine() method.
 | 
|---|
 | 102 |  -----------------------------------------------------------------
 | 
|---|
 | 103 |  It is very boring to define all the fits file names and hdu for
 | 
|---|
 | 104 |    the predefined TOI SNum,Bolo,Flag,Alpha,Delta as some of them
 | 
|---|
 | 105 |    are in the same FITS file (and HDU).
 | 
|---|
 | 106 |  The connector pre-defined a logic as follow:
 | 
|---|
 | 107 |  ... if fname_Bolo=="" try fname_SNum
 | 
|---|
 | 108 |  ... if fname_SNum=="" try fname_Bolo
 | 
|---|
 | 109 |  ... if fname_Flag=="" try fname_Bolo first
 | 
|---|
 | 110 |  ...                       fname_SNum second.
 | 
|---|
 | 111 |  ... if fname_Alpha=="" try fname_Delta first
 | 
|---|
 | 112 |  ...                        fname_Bolo second
 | 
|---|
 | 113 |  ...                        fname_SNum third
 | 
|---|
 | 114 |  ... if fname_Delta=="" try fname_Alpha first
 | 
|---|
 | 115 |  ...                        fname_Bolo second
 | 
|---|
 | 116 |  ...                        fname_SNum third
 | 
|---|
 | 117 |  Of course, the decision differs depending on the order
 | 
|---|
 | 118 |    of calling the addcol() method.
 | 
|---|
 | 119 |  -----------------------------------------------------------------
 | 
|---|
 | 120 |  \endverbatim
 | 
|---|
 | 121 |  \warning ihdu[1,nhdu], col=[0,nrow-1]
 | 
|---|
 | 122 |  \return The number of the column added in the FitsBoloRead connector.
 | 
|---|
 | 123 | */
 | 
|---|
 | 124 | int FitsBoloRead::addcol(int col,const char *label,const char* fname,int ihdu)
 | 
|---|
 | 125 | {
 | 
|---|
 | 126 |  if(col>=(int)mFABT.size()) // Not an existing column
 | 
|---|
 | 127 |    throw ParmError("FitsBoloRead::addcol: column number not existing\n");
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 |  if(col>=0) {  // Already filled column
 | 
|---|
| [2087] | 130 |    if(mFABT[col]!=NULL) {delete mFABT[col]; mFABT[col]=NULL;}
 | 
|---|
| [1661] | 131 |  } else {      // Prepare for new column
 | 
|---|
 | 132 |    col=mFABT.size();
 | 
|---|
 | 133 |    mFName.push_back("");
 | 
|---|
 | 134 |    mLabel.push_back("");
 | 
|---|
 | 135 |    mHDU.push_back(0);
 | 
|---|
 | 136 |    mFABT.push_back(NULL);
 | 
|---|
 | 137 |  }
 | 
|---|
 | 138 | 
 | 
|---|
 | 139 |  if(fname) mFName[col] = fname; else mFName[col] = "";
 | 
|---|
 | 140 |  mLabel[col] = label;
 | 
|---|
 | 141 |  mHDU[col]   = ihdu;
 | 
|---|
 | 142 |  // Try to guess the fname and ihdu if not defined
 | 
|---|
 | 143 |  Gess_If_Not_Define(col);
 | 
|---|
 | 144 | 
 | 
|---|
 | 145 |  mFABT[col] =
 | 
|---|
 | 146 |    new FitsABTColRead(mFName[col].c_str(),mLabel[col].c_str()
 | 
|---|
 | 147 |                      ,mHDU[col],BuffLen,BuffSens,(int)DbgLevel);
 | 
|---|
 | 148 | 
 | 
|---|
 | 149 |  // Set the number of rows as the smallest of for connected columns
 | 
|---|
| [3128] | 150 |  LONGLONG nrows = mFABT[col]->GetNbLine();
 | 
|---|
| [1661] | 151 |  if(NBline==0) NBline = nrows;
 | 
|---|
 | 152 |  else if(nrows<NBline) NBline = nrows;
 | 
|---|
 | 153 | 
 | 
|---|
 | 154 |  return col;
 | 
|---|
 | 155 | }
 | 
|---|
 | 156 | 
 | 
|---|
 | 157 | /*!
 | 
|---|
 | 158 |   Guess what are the File name and HDU if they are not explicitly defined.
 | 
|---|
 | 159 |   (See addcol() doc)
 | 
|---|
 | 160 | */
 | 
|---|
 | 161 | void FitsBoloRead::Gess_If_Not_Define(int col)
 | 
|---|
 | 162 | {
 | 
|---|
 | 163 |  if(col<0 || col>=_NCOL_BOLO_MIN_) return; // Pas une colonne predefinie
 | 
|---|
 | 164 |  if(mFName[col].size()>0) return; // definition explicite
 | 
|---|
 | 165 | 
 | 
|---|
 | 166 |  if(col==ColSNum) {            // Cas du Sample Number
 | 
|---|
 | 167 |    if(mFName[ColBolo].size()>0)
 | 
|---|
 | 168 |      {mFName[col]=mFName[ColBolo]; mHDU[col]=mHDU[ColBolo]; return;}
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 |  } else if(col==ColBolo) {     // Cas du Bolo
 | 
|---|
 | 171 |    if(mFName[ColSNum].size()>0)
 | 
|---|
 | 172 |      {mFName[col]=mFName[ColSNum]; mHDU[col]=mHDU[ColSNum]; return;}
 | 
|---|
 | 173 | 
 | 
|---|
 | 174 |  } else if(col==ColFlag) {     // Cas du Flag
 | 
|---|
 | 175 |    if(mFName[ColBolo].size()>0)
 | 
|---|
 | 176 |      {mFName[col]=mFName[ColBolo]; mHDU[col]=mHDU[ColBolo]; return;}
 | 
|---|
 | 177 |    if(mFName[ColSNum].size()>0)
 | 
|---|
 | 178 |      {mFName[col]=mFName[ColSNum]; mHDU[col]=mHDU[ColSNum]; return;}
 | 
|---|
 | 179 | 
 | 
|---|
 | 180 |  } else if(col==ColAlpha) {    // Cas du Alpha
 | 
|---|
 | 181 |    if(mFName[ColDelta].size()>0)
 | 
|---|
 | 182 |      {mFName[col]=mFName[ColDelta]; mHDU[col]=mHDU[ColDelta]; return;}
 | 
|---|
 | 183 |    if(mFName[ColBolo].size()>0)
 | 
|---|
 | 184 |      {mFName[col]=mFName[ColBolo]; mHDU[col]=mHDU[ColBolo]; return;}
 | 
|---|
 | 185 |    if(mFName[ColSNum].size()>0)
 | 
|---|
 | 186 |      {mFName[col]=mFName[ColSNum]; mHDU[col]=mHDU[ColSNum]; return;}
 | 
|---|
 | 187 | 
 | 
|---|
 | 188 |  } else if(col==ColDelta) {    // Cas du Delta
 | 
|---|
 | 189 |    if(mFName[ColAlpha].size()>0)
 | 
|---|
 | 190 |      {mFName[col]=mFName[ColAlpha]; mHDU[col]=mHDU[ColAlpha]; return;}
 | 
|---|
 | 191 |    if(mFName[ColBolo].size()>0)
 | 
|---|
 | 192 |      {mFName[col]=mFName[ColBolo]; mHDU[col]=mHDU[ColBolo]; return;}
 | 
|---|
 | 193 |    if(mFName[ColSNum].size()>0)
 | 
|---|
 | 194 |      {mFName[col]=mFName[ColSNum]; mHDU[col]=mHDU[ColSNum]; return;}
 | 
|---|
 | 195 |  }
 | 
|---|
 | 196 | }
 | 
|---|
 | 197 | 
 | 
|---|
 | 198 | //////////////////////////////////////////////////////////////
 | 
|---|
 | 199 | /*! Set the number of rows for that class, choosing column "col"
 | 
|---|
 | 200 |   \param col : number of the column giving the number of rows
 | 
|---|
 | 201 |   \verbatim
 | 
|---|
 | 202 |   col : <0         set nrows to the smallest of all connected columns
 | 
|---|
 | 203 |   col : [0,ncol-1] set nrows to the number of rows of column "col"
 | 
|---|
 | 204 |   col : >=ncol     trow exception
 | 
|---|
 | 205 |   \endverbatim
 | 
|---|
 | 206 |   \warning By default, the number of rows is set to the smallest of all connected columns
 | 
|---|
 | 207 | */
 | 
|---|
 | 208 | void FitsBoloRead::SetNbLine(int col)
 | 
|---|
 | 209 | {
 | 
|---|
 | 210 |   if(col>=(int)mFABT.size())  // Bad column number
 | 
|---|
 | 211 |    throw ParmError("FitsBoloRead::SetNbLine: bad column number\n");
 | 
|---|
 | 212 | 
 | 
|---|
 | 213 |  if(col>=0) {  // existing column, return its NbLine
 | 
|---|
 | 214 |    if(mFABT[col]==NULL)
 | 
|---|
 | 215 |      throw NullPtrError("FitsBoloRead::SetNbLine: column not connected\n");
 | 
|---|
 | 216 |    NBline = mFABT[col]->GetNbLine();
 | 
|---|
| [2087] | 217 |    return;
 | 
|---|
| [1661] | 218 |  }
 | 
|---|
 | 219 | 
 | 
|---|
 | 220 |  // take the smallest NbLine for all columns
 | 
|---|
 | 221 |  NBline = 0;
 | 
|---|
 | 222 |  for(col=0; col<(int)mFABT.size(); col++) {
 | 
|---|
 | 223 |    if(mFABT[col]==NULL) continue;
 | 
|---|
| [3128] | 224 |    LONGLONG nbl = mFABT[col]->GetNbLine();
 | 
|---|
| [1661] | 225 |    if(nbl==0) continue;
 | 
|---|
 | 226 |    if(NBline==0 || nbl<NBline) NBline = nbl;
 | 
|---|
 | 227 |  }
 | 
|---|
 | 228 | }
 | 
|---|
 | 229 | 
 | 
|---|
 | 230 | //////////////////////////////////////////////////////////////
 | 
|---|
 | 231 | /*! Print */
 | 
|---|
 | 232 | void FitsBoloRead::Print(ostream& os,int lp) const
 | 
|---|
 | 233 | {
 | 
|---|
 | 234 |  os<<"FitsBoloRead::Print: NBline="<<NBline<<" NCol="<<GetNbCol()<<endl;
 | 
|---|
 | 235 |  for(int i=0; i<(int)mFABT.size(); i++) {
 | 
|---|
 | 236 |    if(mFABT[i]==NULL) {
 | 
|---|
 | 237 |       cout<<"...Col "<<i<<" not connected"<<endl;
 | 
|---|
 | 238 |       continue;
 | 
|---|
 | 239 |    } else {
 | 
|---|
 | 240 |      cout<<"--> Col "<<i<<" label="<<mLabel[i]<<" hdu="<<mHDU[i]
 | 
|---|
 | 241 |          <<"        FName="<<mFName[i]<<endl;
 | 
|---|
 | 242 |      if(lp>0) mFABT[i]->Print(os,lp);
 | 
|---|
 | 243 |    }
 | 
|---|
 | 244 |  }
 | 
|---|
 | 245 | }
 | 
|---|
 | 246 | 
 | 
|---|
 | 247 | #undef _NCOL_BOLO_MIN_
 | 
|---|