source: Sophya/trunk/SophyaExt/FitsIOServer/fboloread.cc@ 3049

Last change on this file since 3049 was 2615, checked in by cmv, 21 years ago

using namespace sophya enleve de machdefs.h, nouveau sopnamsp.h cmv 10/09/2004

File size: 7.9 KB
RevLine 
[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*/
68FitsBoloRead::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 */
80FitsBoloRead::~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*/
124int 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*/
161void 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*/
208void 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 */
232void 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_
Note: See TracBrowser for help on using the repository browser.