| [1738] | 1 | // ArchTOIPipe           (C)     CEA/DAPNIA/SPP IN2P3/LAL | 
|---|
|  | 2 | //                               Eric Aubourg | 
|---|
|  | 3 | //                               Christophe Magneville | 
|---|
|  | 4 | //                               Reza Ansari | 
|---|
| [2194] | 5 | // $Id: fitstoirdr.cc,v 1.42 2002-09-16 13:28:29 aubourg Exp $ | 
|---|
| [1738] | 6 |  | 
|---|
| [1365] | 7 | #include "fitstoirdr.h" | 
|---|
|  | 8 | #include "toimanager.h" | 
|---|
| [1696] | 9 | #include <sched.h> | 
|---|
| [1365] | 10 |  | 
|---|
|  | 11 |  | 
|---|
| [1717] | 12 | FITSTOIReader::FITSTOIReader(string fn,int buff_sz) { | 
|---|
| [1365] | 13 | fname = fn; | 
|---|
| [1480] | 14 | allfn.push_back(fn); | 
|---|
| [1717] | 15 | Buff_Sz = (buff_sz>0) ? buff_sz: 1000; | 
|---|
|  | 16 | cout<<"FITSTOIReader::FITSTOIReader"<<endl; | 
|---|
|  | 17 | cout<<"FITSTOIReader::inited "<<inited<<" bsz="<<Buff_Sz<<endl; | 
|---|
| [1365] | 18 | name = "rdr"; | 
|---|
| [1480] | 19 | fptr = NULL; | 
|---|
| [1629] | 20 | totnscount = 0; | 
|---|
| [1725] | 21 |  | 
|---|
|  | 22 | implicitSN = false; | 
|---|
|  | 23 | implicitSNStart = 0; | 
|---|
| [2058] | 24 |  | 
|---|
|  | 25 | // Variables rajoutee pour gerer les fichiers de flag de LevelS Reza 18/6/2002 | 
|---|
|  | 26 | sepFlagfile = false; | 
|---|
|  | 27 | fptrflg = NULL; | 
|---|
| [1365] | 28 | } | 
|---|
|  | 29 |  | 
|---|
|  | 30 | FITSTOIReader::~FITSTOIReader() { | 
|---|
|  | 31 | } | 
|---|
|  | 32 |  | 
|---|
| [1994] | 33 | void FITSTOIReader::setImplicitSN(long snStart) { | 
|---|
| [1725] | 34 | implicitSN = true; | 
|---|
|  | 35 | implicitSNStart = snStart; | 
|---|
|  | 36 | } | 
|---|
|  | 37 |  | 
|---|
| [1994] | 38 | void FITSTOIReader::setBufferSize(int buffsz) | 
|---|
|  | 39 | { | 
|---|
|  | 40 | Buff_Sz = (buffsz>0) ? buffsz: 1024; | 
|---|
|  | 41 | return; | 
|---|
|  | 42 | } | 
|---|
|  | 43 |  | 
|---|
| [1365] | 44 | pthread_mutex_t fits_mutex = PTHREAD_MUTEX_INITIALIZER; | 
|---|
|  | 45 | void fits_lock(); | 
|---|
|  | 46 | void fits_unlock(); | 
|---|
|  | 47 |  | 
|---|
|  | 48 | void fits_lock() { | 
|---|
|  | 49 | pthread_mutex_lock(&fits_mutex); | 
|---|
|  | 50 | } | 
|---|
|  | 51 | void fits_unlock() { | 
|---|
|  | 52 | pthread_mutex_unlock(&fits_mutex); | 
|---|
|  | 53 | } | 
|---|
|  | 54 |  | 
|---|
| [1480] | 55 | void FITSTOIReader::openFile(string fn) { | 
|---|
| [1365] | 56 | fits_lock(); | 
|---|
| [1480] | 57 | if (fptr) { | 
|---|
|  | 58 | fits_close_file(fptr,&fstatus); | 
|---|
|  | 59 | fptr = NULL; | 
|---|
|  | 60 | } | 
|---|
|  | 61 | fname = fn; | 
|---|
|  | 62 | cout << "FITSTOIReader::open FileName=" << fname << endl; | 
|---|
| [1365] | 63 | fstatus = 0; | 
|---|
|  | 64 | // Open file | 
|---|
|  | 65 | fits_open_file(&fptr,fname.c_str(),READONLY,&fstatus); | 
|---|
|  | 66 | if (fstatus != 0) { | 
|---|
|  | 67 | fits_report_error(stderr, fstatus); | 
|---|
|  | 68 | fits_unlock(); | 
|---|
| [2058] | 69 | throw IOExc("FITSTOIReader::openFile() fitsio error"); | 
|---|
| [1365] | 70 | } | 
|---|
|  | 71 |  | 
|---|
|  | 72 | // Go to first extension, which should be a BINTABLE | 
|---|
|  | 73 |  | 
|---|
|  | 74 | int simple, bitpix, naxis; | 
|---|
|  | 75 | long naxes; | 
|---|
|  | 76 | long pcount, gcount; | 
|---|
|  | 77 | int extend; | 
|---|
|  | 78 | fits_read_imghdr(fptr, 1, &simple, &bitpix, | 
|---|
|  | 79 | &naxis, &naxes, &pcount, &gcount, &extend, &fstatus); | 
|---|
|  | 80 |  | 
|---|
|  | 81 | fits_movabs_hdu(fptr, 2, NULL, &fstatus); | 
|---|
|  | 82 |  | 
|---|
|  | 83 | fits_get_num_cols(fptr,&ncols,&fstatus); | 
|---|
|  | 84 | fits_get_num_rows(fptr,&nrows,&fstatus); | 
|---|
|  | 85 |  | 
|---|
| [1454] | 86 | cout << "FITSTOIReader cols = " << ncols << " rows=" << nrows << endl; | 
|---|
| [1725] | 87 | if (implicitSN) { | 
|---|
|  | 88 | firstSn = implicitSNStart; | 
|---|
|  | 89 | } else { | 
|---|
|  | 90 | int anyNul; | 
|---|
|  | 91 | double y; | 
|---|
|  | 92 | fits_read_col_dbl(fptr,1,1,1,1,0,&y,&anyNul,&fstatus); | 
|---|
|  | 93 | firstSn = (int) (y+.1); | 
|---|
|  | 94 | } | 
|---|
| [2058] | 95 |  | 
|---|
|  | 96 | // Ouverture fichier de flag separe  de LevelS (Reza 18/6/2002) | 
|---|
|  | 97 | if (sepFlagfile) { | 
|---|
| [2069] | 98 | cout << " FITSTOIReader::openFile() - Opening separate flag file " << sepFlagFileName | 
|---|
| [2062] | 99 | << " NColFlags= " << sepFlagCols.size() << endl; | 
|---|
| [2058] | 100 | fits_open_file(&fptrflg,sepFlagFileName.c_str(),READONLY,&fstatus); | 
|---|
|  | 101 | if (fstatus != 0) { | 
|---|
|  | 102 | fits_report_error(stderr, fstatus); | 
|---|
|  | 103 | fits_unlock(); | 
|---|
|  | 104 | throw IOExc("FITSTOIReader::openFile() - sepFlagfile open fitsio error"); | 
|---|
|  | 105 | } | 
|---|
|  | 106 | fits_movabs_hdu(fptrflg, 2, NULL, &fstatus); | 
|---|
|  | 107 | if (fstatus != 0) { | 
|---|
|  | 108 | fits_report_error(stderr, fstatus); | 
|---|
|  | 109 | fits_unlock(); | 
|---|
|  | 110 | throw IOExc("FITSTOIReader::openFile() - sepFlagfile fits_movabs_hdu(2) fitsio error"); | 
|---|
|  | 111 | } | 
|---|
| [2065] | 112 | long nrowsflg = 0; | 
|---|
| [2058] | 113 | fits_get_num_rows(fptrflg,&nrowsflg,&fstatus); | 
|---|
|  | 114 | if (nrows != nrowsflg) { | 
|---|
|  | 115 | cerr << " FITSTOIReader::openFile()/Error: Different NRows in flag and data files!" << endl; | 
|---|
|  | 116 | fits_unlock(); | 
|---|
|  | 117 | throw ParmError("FITSTOIReader::openFile() Different NRows in flag and data files"); | 
|---|
|  | 118 | } | 
|---|
| [2065] | 119 | int ncolsflg = 0; | 
|---|
| [2066] | 120 | fits_get_num_cols(fptrflg,&ncolsflg,&fstatus); | 
|---|
| [2065] | 121 | if (ncolsflg < sepFlagCols.size()) { | 
|---|
|  | 122 | cerr << " FITSTOIReader::openFile()/Error: ncolsflg (=" << ncolsflg | 
|---|
|  | 123 | << ") < sepFlagCols.size() (=" << sepFlagCols.size() << ")" << endl; | 
|---|
|  | 124 | fits_unlock(); | 
|---|
|  | 125 | throw ParmError("FITSTOIReader::openFile() Different NRows in flag and data files"); | 
|---|
|  | 126 | } | 
|---|
| [2058] | 127 | } | 
|---|
|  | 128 | // | 
|---|
| [1480] | 129 | fits_unlock(); | 
|---|
|  | 130 | } | 
|---|
| [1365] | 131 |  | 
|---|
| [1480] | 132 | void FITSTOIReader::init() { | 
|---|
| [2058] | 133 |  | 
|---|
|  | 134 | // Modif pour fichiers de flag separe de LevelS (Reza 18/6/2002) | 
|---|
|  | 135 | if (sepFlagfile && (allfn.size() > 1) ) { | 
|---|
|  | 136 | cerr << "FITSTOIReader::init()/Error- Multiple files and separate flag file not allowed !"<<endl; | 
|---|
|  | 137 | throw ParmError("FITSTOIReader::init() Multiple files and separate flag file not allowed"); | 
|---|
|  | 138 | } | 
|---|
|  | 139 |  | 
|---|
| [1480] | 140 | openFile(allfn.front()); | 
|---|
|  | 141 |  | 
|---|
|  | 142 | fits_lock(); | 
|---|
| [1725] | 143 | // si pas implicitSN, la premiere colonne est le sampleNum. | 
|---|
|  | 144 | // Sinon, le samplenum est la fitsline + offset. | 
|---|
| [1527] | 145 | int itoi=-1; | 
|---|
| [1725] | 146 | int col1 = implicitSN ? 0 : 1; | 
|---|
|  | 147 | for (int i=col1; i<ncols; i++) { | 
|---|
| [1365] | 148 | char templt[10]; | 
|---|
|  | 149 | sprintf(templt, "%d", i+1); | 
|---|
|  | 150 | char colname[200]; | 
|---|
|  | 151 | int colnum; | 
|---|
|  | 152 | fits_get_colname(fptr, CASESEN, templt, colname, &colnum, &fstatus); | 
|---|
|  | 153 | cout << "FITSTOIReader col " << colname << endl; | 
|---|
| [2041] | 154 | // On verifie si c'est une colonne de flag | 
|---|
|  | 155 | if (!strncmp(colname, "fg_", 3) || !strncmp(colname, "FLAG_", 5) ) { | 
|---|
| [1527] | 156 | colsinput[itoi].second=true; | 
|---|
|  | 157 | } else { | 
|---|
|  | 158 | declareOutput(colname); | 
|---|
|  | 159 | itoi++; | 
|---|
|  | 160 | colsinput[itoi] = pair<int,bool>(i,false); | 
|---|
|  | 161 | } | 
|---|
| [1365] | 162 | } | 
|---|
|  | 163 | fits_unlock(); | 
|---|
| [1480] | 164 |  | 
|---|
|  | 165 | snBegin = firstSn; | 
|---|
| [1800] | 166 | if (forcedMinIn > 0 && forcedMinIn > snBegin) { | 
|---|
|  | 167 | snBegin = forcedMinIn; | 
|---|
| [1787] | 168 | } | 
|---|
| [1480] | 169 | openFile(allfn.back()); | 
|---|
|  | 170 | snEnd = firstSn+nrows-1; | 
|---|
| [1800] | 171 | if (forcedMaxIn > 0 && forcedMaxIn < snEnd) { | 
|---|
|  | 172 | snEnd = forcedMaxIn; | 
|---|
|  | 173 | } | 
|---|
| [2187] | 174 | /* init */ | 
|---|
|  | 175 | //  snMin=snBegin;     NNNNNOOOOOONNNNNN !!!! | 
|---|
|  | 176 | //  snMax=snEnd; | 
|---|
| [1480] | 177 | cout << "FITSTOIReader range " << snBegin << " -> " << snEnd << endl; | 
|---|
| [1365] | 178 | } | 
|---|
|  | 179 |  | 
|---|
|  | 180 | int FITSTOIReader::calcMinOut() { | 
|---|
| [1800] | 181 | chkinit(); | 
|---|
| [1367] | 182 | TOIManager* mgr = TOIManager::getManager(); | 
|---|
|  | 183 | int firstReq = mgr->getRequestedBegin(); | 
|---|
| [1480] | 184 | return snBegin > firstReq ? snBegin : firstReq; | 
|---|
| [1365] | 185 | } | 
|---|
|  | 186 |  | 
|---|
|  | 187 | int FITSTOIReader::calcMaxOut() { | 
|---|
| [1800] | 188 | chkinit(); | 
|---|
| [1367] | 189 | TOIManager* mgr = TOIManager::getManager(); | 
|---|
|  | 190 | int lastReq = mgr->getRequestedEnd(); | 
|---|
| [1480] | 191 | return snEnd < lastReq ? snEnd : lastReq; | 
|---|
| [1365] | 192 | } | 
|---|
|  | 193 |  | 
|---|
| [2187] | 194 |  | 
|---|
|  | 195 | // ajout vf 31/07/2002 | 
|---|
|  | 196 | bool FITSTOIReader::checkSampleLimits(long& min, long& max, int pass) | 
|---|
|  | 197 | { | 
|---|
|  | 198 | bool sample_ok=true; | 
|---|
|  | 199 | chkinit(); | 
|---|
|  | 200 | return TOIProcessor::checkSampleLimits(min, max, pass); | 
|---|
|  | 201 | /* | 
|---|
|  | 202 | cout << "check " << name << " in  " << min << " - " << max << " ; " << snMin << " - " << snMax << endl; | 
|---|
|  | 203 |  | 
|---|
|  | 204 | // on verifie qu'on peut effectivement produire | 
|---|
|  | 205 |  | 
|---|
|  | 206 | if (min < snBegin) { | 
|---|
|  | 207 | min = snBegin; | 
|---|
|  | 208 | } | 
|---|
|  | 209 |  | 
|---|
|  | 210 | if (max > snEnd) { | 
|---|
|  | 211 | max = snEnd; | 
|---|
|  | 212 | } | 
|---|
|  | 213 |  | 
|---|
|  | 214 |  | 
|---|
|  | 215 | // si intersection des intervals vide on leve une exception | 
|---|
|  | 216 | //if (min >= snEnd || max <= snBegin) { | 
|---|
|  | 217 | //cerr << " FITSTOIReader::checkSampleLimits(long& min long& max)/Error Sample out of bounds" << endl; | 
|---|
|  | 218 | //throw ParmError("  FITSTOIReader::checkSampleLimits(long& min long& max) min >= snEnd || max <= snBegin"); | 
|---|
|  | 219 | //} | 
|---|
|  | 220 |  | 
|---|
|  | 221 | // ajustements si necessaires | 
|---|
|  | 222 | if (min < snMin) { | 
|---|
|  | 223 | snMin = min; | 
|---|
|  | 224 | } | 
|---|
|  | 225 | if (max > snMax) { | 
|---|
|  | 226 | snMax = max; | 
|---|
|  | 227 | } | 
|---|
|  | 228 |  | 
|---|
|  | 229 |  | 
|---|
|  | 230 | min=min<snMin?snMin:min; | 
|---|
|  | 231 | max=max>snMax?snMax:max; | 
|---|
|  | 232 |  | 
|---|
|  | 233 | // cas sans contraintes, on retourne nos bornes | 
|---|
|  | 234 | if (min>max) { | 
|---|
|  | 235 | min = snBegin; | 
|---|
|  | 236 | max = snEnd; | 
|---|
|  | 237 | } | 
|---|
|  | 238 |  | 
|---|
|  | 239 | cout << "check " << name << " out " << min << " - " << max << " ; " << snMin << " - " << snMax << endl; | 
|---|
|  | 240 | //cout << "fitstoirdr : limites verifiees : " << snBegin << " , " << snEnd << " : " << sample_ok << endl; | 
|---|
|  | 241 | return sample_ok; | 
|---|
|  | 242 | */ | 
|---|
|  | 243 | } | 
|---|
|  | 244 |  | 
|---|
|  | 245 | void FITSTOIReader::calcSampleLimits(long& min, long& max) | 
|---|
|  | 246 | { | 
|---|
|  | 247 | chkinit(); | 
|---|
|  | 248 | cout << "calc  " << name << " in  " << min << " - " << max << " ; " << snBegin << " - " << snEnd << endl; | 
|---|
|  | 249 |  | 
|---|
|  | 250 | min=min<snMin?snMin:min; | 
|---|
|  | 251 | max=max>snMax?snMax:max; | 
|---|
|  | 252 | snBegin=snMin; | 
|---|
|  | 253 | snEnd=snMax; | 
|---|
|  | 254 | cout << "calc  " << name << " out " << min << " - " << max << " ; " << snBegin << " - " << snEnd << endl; | 
|---|
|  | 255 | //cout << "fitstoirdr : limites temporaires calculees : " << snBegin << " , " << snEnd << endl; | 
|---|
|  | 256 |  | 
|---|
|  | 257 | } | 
|---|
|  | 258 | // fin ajout vf | 
|---|
|  | 259 |  | 
|---|
|  | 260 |  | 
|---|
|  | 261 |  | 
|---|
| [1480] | 262 | void FITSTOIReader::addFile(string fn) { | 
|---|
|  | 263 | allfn.push_back(fn); | 
|---|
|  | 264 | } | 
|---|
| [1365] | 265 |  | 
|---|
| [2058] | 266 | void FITSTOIReader::setFlagFile(string fn, vector<FlagToiDef> flags) | 
|---|
|  | 267 | { | 
|---|
|  | 268 | if (flags.size() < 1) { | 
|---|
|  | 269 | cerr << " FITSTOIReader::setFlagFile()/Error flag.size() = 0 ! " << endl; | 
|---|
|  | 270 | throw ParmError("FITSTOIReader::setFlagFile() flag.size() = 0"); | 
|---|
|  | 271 | } | 
|---|
|  | 272 |  | 
|---|
|  | 273 | sepFlagfile = true; | 
|---|
|  | 274 | sepFlagFileName = fn; | 
|---|
|  | 275 | sepFlagCols =  flags; | 
|---|
|  | 276 | } | 
|---|
|  | 277 |  | 
|---|
| [1365] | 278 | void FITSTOIReader::run() { | 
|---|
| [1480] | 279 | for (vector<string>::iterator i=allfn.begin(); i!=allfn.end(); i++) { | 
|---|
|  | 280 | openFile(*i); | 
|---|
| [1994] | 281 | if (Buff_Sz > 1) run2();  // Lecture bufferise | 
|---|
|  | 282 | else run1();              // Lecture un echantillon a la fois | 
|---|
| [1480] | 283 | } | 
|---|
| [2058] | 284 | fits_lock(); | 
|---|
|  | 285 | if (fptr) { | 
|---|
|  | 286 | fits_close_file(fptr,&fstatus); | 
|---|
|  | 287 | fptr = NULL; | 
|---|
|  | 288 | } | 
|---|
|  | 289 | if (sepFlagfile && fptrflg) { | 
|---|
|  | 290 | fits_close_file(fptrflg,&fstatus); | 
|---|
|  | 291 | fptrflg = NULL; | 
|---|
|  | 292 | } | 
|---|
|  | 293 | fits_unlock(); | 
|---|
| [1480] | 294 | } | 
|---|
|  | 295 |  | 
|---|
| [1725] | 296 | // run 1 : deprecated. NON MAINTENU. Incompatible avec implicit SN. | 
|---|
| [1994] | 297 | //                     ^^^^^^^^^^^^  Reza , 13/5/2002 , Je viens de rajouter | 
|---|
|  | 298 | //                                   implicitSNStart et switvh run1/run2 | 
|---|
|  | 299 | //                                   suivant buffersize | 
|---|
|  | 300 |  | 
|---|
| [1480] | 301 | void FITSTOIReader::run1() { | 
|---|
| [1365] | 302 | // Il faudrait optimiser en fonction de ce qui a ete demande comme samplenum, | 
|---|
|  | 303 | // mais cela implique de gerer aussi bien echant uniforme que non. | 
|---|
|  | 304 | // On pourrait aussi lire plusieurs elements d'un coup. | 
|---|
|  | 305 | int ncols = outIx.size(); | 
|---|
| [2067] | 306 | cout << "FITSTOIReader::run1() reader reading... NRows=" << nrows << " firstSn= " | 
|---|
| [1454] | 307 | << firstSn << endl; | 
|---|
| [1629] | 308 |  | 
|---|
| [1721] | 309 | double* tabdata = new double[getNOut()]; | 
|---|
|  | 310 | uint_8* tabflag = new uint_8[getNOut()]; | 
|---|
| [1712] | 311 |  | 
|---|
| [1721] | 312 | for (long i=0; i<nrows; i++) { | 
|---|
| [1365] | 313 | int anyNul; | 
|---|
|  | 314 | double y; | 
|---|
| [1710] | 315 | fits_lock(); | 
|---|
| [1994] | 316 | long sn; | 
|---|
|  | 317 | if (implicitSN) { | 
|---|
|  | 318 | fits_read_col_dbl(fptr,1,i+1,1,1,0,&y,&anyNul,&fstatus); | 
|---|
|  | 319 | sn = (long) (y+.1); | 
|---|
|  | 320 | } | 
|---|
|  | 321 | else sn = implicitSNStart+i; | 
|---|
| [1712] | 322 | //fits_unlock(); | 
|---|
| [1365] | 323 | TOIManager* mgr = TOIManager::getManager(); | 
|---|
| [1712] | 324 | if (sn > mgr->getRequestedEnd()) {fits_unlock(); break;} | 
|---|
|  | 325 | if (sn < mgr->getRequestedBegin()) {fits_unlock(); continue;} | 
|---|
| [1454] | 326 | // if (sn < mgr->getRequestedBegin()+10) cout << "rdr out " << sn << endl; | 
|---|
| [1716] | 327 | int k; | 
|---|
|  | 328 | for (k=0; k<getNOut(); k++) { | 
|---|
| [1527] | 329 | int j = colsinput[k].first; | 
|---|
|  | 330 | if ( !checkOutputTOIIndex(k) )  continue;  // Reza - Si TOI non connecte | 
|---|
| [1712] | 331 | //fits_lock(); | 
|---|
| [1365] | 332 | fits_read_col_dbl(fptr,j+1,i+1,1,1,0,&y,&anyNul,&fstatus); | 
|---|
| [1712] | 333 | tabdata[k] = y; | 
|---|
| [1527] | 334 | long flg = 0; | 
|---|
|  | 335 | if (colsinput[k].second) { | 
|---|
|  | 336 | fits_read_col_lng(fptr,j+2,i+1,1,1,0,&flg,&anyNul,&fstatus); | 
|---|
|  | 337 | } | 
|---|
| [2058] | 338 |  | 
|---|
|  | 339 | if (sepFlagfile) { // Ajout Reza (18/6/2002) pour fichier de flags separe | 
|---|
| [2065] | 340 | unsigned char sflg; | 
|---|
| [2058] | 341 | flg = 0; | 
|---|
|  | 342 | for(int skf=0; skf<sepFlagCols.size(); skf++) { | 
|---|
| [2065] | 343 | fits_read_col_byt(fptrflg, skf+1, i+1,1,1,0,&sflg,&anyNul,&fstatus); | 
|---|
| [2058] | 344 | if (sflg) flg |= sepFlagCols[skf]; | 
|---|
|  | 345 | } | 
|---|
|  | 346 | }  // Fin modif pour fichier de flags separe (18/6/2002) | 
|---|
|  | 347 |  | 
|---|
| [1712] | 348 | tabflag[k] = flg; | 
|---|
|  | 349 | //      fits_unlock(); | 
|---|
|  | 350 | //putData(k, sn, y, flg); | 
|---|
| [1365] | 351 | } | 
|---|
| [1712] | 352 | fits_unlock(); | 
|---|
| [1716] | 353 | for (k=0; k<getNOut(); k++) { | 
|---|
| [1712] | 354 | putData(k, sn, tabdata[k], tabflag[k]); | 
|---|
|  | 355 | } | 
|---|
|  | 356 | /*     if (i%50==0)  { | 
|---|
|  | 357 | // fits_unlock(); | 
|---|
| [1696] | 358 | sched_yield(); | 
|---|
| [1712] | 359 | //fits_lock(); | 
|---|
|  | 360 | }*/ | 
|---|
| [1629] | 361 | totnscount++; | 
|---|
| [1365] | 362 | } | 
|---|
| [1710] | 363 | //fits_unlock(); | 
|---|
| [1721] | 364 | delete[] tabflag; | 
|---|
|  | 365 | delete[] tabdata; | 
|---|
| [1365] | 366 | cout << "reader done reading... " << pthread_self() << endl; | 
|---|
|  | 367 | } | 
|---|
| [1717] | 368 |  | 
|---|
|  | 369 | void FITSTOIReader::run2() | 
|---|
|  | 370 | // ---- Version bufferisee (Christophe 20/10/2001) | 
|---|
|  | 371 | { | 
|---|
|  | 372 | int ncols = outIx.size(); | 
|---|
| [2067] | 373 | cout<<"FITSTOIReader::run2() reader reading... NRows="<<nrows<<" firstSn= " <<firstSn<<endl; | 
|---|
| [1717] | 374 |  | 
|---|
|  | 375 | //////// Prepare buffer, allocate memory | 
|---|
|  | 376 | double *samplenum = new double[Buff_Sz]; | 
|---|
|  | 377 | vector<double*> colval; | 
|---|
|  | 378 | vector<long*> colflg; | 
|---|
|  | 379 | for(int k=0; k<getNOut(); k++) { | 
|---|
|  | 380 | colval.push_back(NULL); | 
|---|
|  | 381 | colflg.push_back(NULL); | 
|---|
|  | 382 | if(!checkOutputTOIIndex(k)) continue; | 
|---|
|  | 383 | colval[k] = new double[Buff_Sz]; | 
|---|
| [2064] | 384 | // modif || sepFlagfile pour fichier de flag separe (Reza 18/6/2002) | 
|---|
|  | 385 | if((colsinput[k].second) || sepFlagfile) colflg[k] = new long[Buff_Sz]; | 
|---|
| [1717] | 386 | } | 
|---|
| [1744] | 387 | uint_8 * tmpflg = new uint_8[Buff_Sz]; | 
|---|
| [1717] | 388 |  | 
|---|
| [2058] | 389 | // Ajout Reza (18/6/2002) pour fichier de flags separe | 
|---|
| [2065] | 390 | unsigned char* stmpflg = NULL; | 
|---|
|  | 391 | if (sepFlagfile) stmpflg = new unsigned char[Buff_Sz]; | 
|---|
| [2058] | 392 | // Fin modif pour fichier de flags separe (18/6/2002) | 
|---|
|  | 393 |  | 
|---|
|  | 394 |  | 
|---|
| [1801] | 395 | TOIManager* mgr = TOIManager::getManager(); | 
|---|
|  | 396 |  | 
|---|
| [1717] | 397 | //////// Read data and put into pipe | 
|---|
|  | 398 | long ideb=-1,ifin=-1; | 
|---|
| [1836] | 399 | for(long i=0; i<nrows; i+=Buff_Sz) { | 
|---|
| [1994] | 400 | fits_lock();   // lock en debut de boucle de lecture - Reza 13/05/2002 | 
|---|
| [1717] | 401 | // faut-il lire dans le fichier fits ? | 
|---|
| [1836] | 402 | if(i<ideb || i>ifin) { // Toujours vrai avec le += Buff_Sz | 
|---|
| [1717] | 403 | ideb = i; | 
|---|
|  | 404 | ifin = ideb+Buff_Sz-1; | 
|---|
|  | 405 | if(ifin>=nrows) ifin=nrows-1; | 
|---|
|  | 406 | long n = ifin-ideb+1; | 
|---|
|  | 407 | int anyNul; | 
|---|
| [1725] | 408 | if (implicitSN) { | 
|---|
| [2194] | 409 | if (ideb+implicitSNStart > snEnd | 
|---|
| [2011] | 410 | || (forcedMaxIn > 0 && ideb+implicitSNStart > forcedMaxIn)) { | 
|---|
|  | 411 | fits_unlock();  // unlock avant de casser la boucle - Reza 16/05/2002 | 
|---|
|  | 412 | break; | 
|---|
|  | 413 | } | 
|---|
| [2194] | 414 | if (ifin+implicitSNStart < snBegin | 
|---|
| [2011] | 415 | || (forcedMinIn > 0 && ifin+implicitSNStart < forcedMinIn)) { | 
|---|
|  | 416 | fits_unlock();  // unlock avant de continuer - Reza 16/05/2002 | 
|---|
|  | 417 | continue; | 
|---|
|  | 418 | } | 
|---|
| [1725] | 419 | for (long j=0; j<Buff_Sz; j++) { | 
|---|
|  | 420 | samplenum[j] = j+ideb+implicitSNStart; | 
|---|
|  | 421 | } | 
|---|
| [1994] | 422 | //---- Pas la peine, fait en debut de boucle - Reza 13/05/2002  fits_lock(); | 
|---|
| [1725] | 423 | } else { | 
|---|
| [1994] | 424 | //---- Pas la peine, fait en debut de boucle - Reza 13/05/2002 fits_lock(); | 
|---|
| [1725] | 425 | fits_read_col_dbl(fptr,1,ideb+1,1,n,0,samplenum,&anyNul,&fstatus); | 
|---|
| [2194] | 426 | if (samplenum[0] > snEnd | 
|---|
| [1836] | 427 | || (forcedMaxIn > 0 && samplenum[0] > forcedMaxIn)) { | 
|---|
| [1994] | 428 | fits_unlock();  // unlock avant de casser la boucle - Reza 13/05/2002 | 
|---|
| [1801] | 429 | break; | 
|---|
|  | 430 | } | 
|---|
| [2194] | 431 | if (samplenum[n-1] < snBegin | 
|---|
| [1836] | 432 | || (forcedMinIn > 0 && samplenum[n-1] < forcedMinIn)) { | 
|---|
| [2011] | 433 | fits_unlock(); | 
|---|
| [1801] | 434 | continue; | 
|---|
|  | 435 | } | 
|---|
| [1725] | 436 | } | 
|---|
| [1717] | 437 | for(int k=0; k<getNOut(); k++) { | 
|---|
|  | 438 | if(colval[k]==NULL)  continue; | 
|---|
|  | 439 | int j = colsinput[k].first; | 
|---|
|  | 440 | fits_read_col_dbl(fptr,j+1,ideb+1,1,n,0,colval[k],&anyNul,&fstatus); | 
|---|
| [2067] | 441 | if (fstatus !=0) { | 
|---|
|  | 442 | cerr << " RzBug - j+1" << j+1 << " ideb= " << ideb << endl; | 
|---|
|  | 443 | fits_report_error(stderr,fstatus); | 
|---|
|  | 444 | } | 
|---|
| [2063] | 445 |  | 
|---|
|  | 446 | //--- Ajout Reza (18/6/2002) pour fichier de flags separe | 
|---|
| [2058] | 447 | if (sepFlagfile) { | 
|---|
|  | 448 | int sjj; | 
|---|
|  | 449 | for(sjj=0; sjj<n; sjj++) colflg[k][sjj] = 0; | 
|---|
|  | 450 | for(int skf=0; skf<sepFlagCols.size(); skf++) { | 
|---|
| [2065] | 451 | fits_read_col_byt(fptrflg, skf+1, ideb+1,1,n,0,stmpflg,&anyNul,&fstatus); | 
|---|
|  | 452 | if (fstatus !=0) { | 
|---|
| [2067] | 453 | cerr << " RzBug2 - skf=" << skf << " ideb= " << ideb << endl; | 
|---|
| [2065] | 454 | fits_report_error(stderr,fstatus); | 
|---|
|  | 455 | } | 
|---|
| [2061] | 456 | for(sjj=0; sjj<n; sjj++) { | 
|---|
| [2073] | 457 | if (stmpflg[sjj]) colflg[k][sjj] |= sepFlagCols[skf]; | 
|---|
| [2061] | 458 | } | 
|---|
| [2058] | 459 | } | 
|---|
| [2068] | 460 | } | 
|---|
|  | 461 | else if(colflg[k]!=NULL) | 
|---|
|  | 462 | fits_read_col_lng(fptr,j+2,ideb+1,1,n,0,colflg[k],&anyNul,&fstatus); | 
|---|
|  | 463 | //--- Fin modif pour fichier de flags separe (18/6/2002) | 
|---|
| [1717] | 464 | } | 
|---|
|  | 465 | if(fstatus!=0) { | 
|---|
|  | 466 | fits_report_error(stderr,fstatus); | 
|---|
| [1994] | 467 | fits_unlock(); // On supprime le lock avant le throw - Reza 13/05/2002 | 
|---|
| [2068] | 468 | throw IOExc("FITSTOIReader::run2: Error Reading Fits file\n"); | 
|---|
| [1717] | 469 | } | 
|---|
|  | 470 | } | 
|---|
| [2011] | 471 | fits_unlock();   // unlock en fin de boucle de lecture - Reza 13/05/2002 | 
|---|
| [1717] | 472 |  | 
|---|
|  | 473 | long ip = i-ideb; // pointeurs dans les buffers | 
|---|
|  | 474 | long sn = (long) (samplenum[ip]+.1); | 
|---|
| [1744] | 475 | if (ip == 0) { | 
|---|
|  | 476 | for(int k=0; k<getNOut(); k++) { | 
|---|
|  | 477 | if(colval[k]==NULL)  continue; | 
|---|
|  | 478 | if (colflg[k] != NULL) { | 
|---|
|  | 479 | for (int ii=0; ii<Buff_Sz; ii++) { | 
|---|
|  | 480 | tmpflg[ii] = colflg[k][ii]; | 
|---|
|  | 481 | } | 
|---|
|  | 482 | putData(k, sn, ifin-ideb+1, colval[k], tmpflg); | 
|---|
|  | 483 | } else { | 
|---|
|  | 484 | putData(k, sn, ifin-ideb+1, colval[k]); | 
|---|
|  | 485 | } | 
|---|
|  | 486 | } | 
|---|
|  | 487 | } | 
|---|
| [1994] | 488 | totnscount += (ifin-ideb+1); | 
|---|
| [1717] | 489 | } | 
|---|
|  | 490 |  | 
|---|
|  | 491 | //////// des-allocate buffers | 
|---|
|  | 492 | delete [] samplenum; | 
|---|
| [1744] | 493 | delete [] tmpflg; | 
|---|
| [2058] | 494 | if (sepFlagfile) delete [] stmpflg; | 
|---|
| [1763] | 495 | {for(int k=0; k<getNOut(); k++) { | 
|---|
| [1717] | 496 | if(colval[k]!=NULL) delete [] colval[k]; | 
|---|
|  | 497 | if(colflg[k]!=NULL) delete [] colflg[k]; | 
|---|
| [1763] | 498 | }} | 
|---|
| [1717] | 499 | colval.resize(0); colflg.resize(0); | 
|---|
|  | 500 |  | 
|---|
| [1994] | 501 | cout << "reader (buffered) done reading... " << pthread_self() << endl; | 
|---|
| [2061] | 502 |  | 
|---|
| [1717] | 503 | } | 
|---|
| [2187] | 504 |  | 
|---|
|  | 505 |  | 
|---|
|  | 506 | // affichage des limites | 
|---|
|  | 507 | void FITSTOIReader::printLimits() | 
|---|
|  | 508 | { | 
|---|
|  | 509 | cout << "fitstoirdr " << name <<" : limites calculees : " << snBegin << " , " << snEnd << endl; | 
|---|
|  | 510 | } | 
|---|
|  | 511 |  | 
|---|
|  | 512 |  | 
|---|
|  | 513 |  | 
|---|
|  | 514 |  | 
|---|
|  | 515 |  | 
|---|
|  | 516 |  | 
|---|
|  | 517 |  | 
|---|
|  | 518 |  | 
|---|
|  | 519 |  | 
|---|
|  | 520 |  | 
|---|
|  | 521 |  | 
|---|
|  | 522 |  | 
|---|
|  | 523 |  | 
|---|
|  | 524 |  | 
|---|
|  | 525 |  | 
|---|
|  | 526 |  | 
|---|
|  | 527 |  | 
|---|