| [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; | 
|---|
|  | 30 | for(long i=0; i<fbr.GetNbLine(); i++) { | 
|---|
|  | 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; | 
|---|
|  | 45 | for(long i=0, istep=1000; i<fbr.GetNbLine(); i+=istep) { | 
|---|
|  | 46 | long i2=i+istep-1; if(i2>=fbr.GetNbLine()) i2=fbr.GetNbLine()-1; | 
|---|
|  | 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 | 
|---|
|  | 150 | long nrows = mFABT[col]->GetNbLine(); | 
|---|
|  | 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; | 
|---|
|  | 224 | long nbl = mFABT[col]->GetNbLine(); | 
|---|
|  | 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_ | 
|---|