// ArchTOIPipe (C) CEA/DAPNIA/SPP IN2P3/LAL // Eric Aubourg // Christophe Magneville // Reza Ansari // $Id: fitstoirdr.cc,v 1.29 2002-06-03 14:23:39 ansari Exp $ #include "fitstoirdr.h" #include "toimanager.h" #include FITSTOIReader::FITSTOIReader(string fn,int buff_sz) { fname = fn; allfn.push_back(fn); Buff_Sz = (buff_sz>0) ? buff_sz: 1000; cout<<"FITSTOIReader::FITSTOIReader"<0) ? buffsz: 1024; return; } pthread_mutex_t fits_mutex = PTHREAD_MUTEX_INITIALIZER; void fits_lock(); void fits_unlock(); void fits_lock() { pthread_mutex_lock(&fits_mutex); } void fits_unlock() { pthread_mutex_unlock(&fits_mutex); } void FITSTOIReader::openFile(string fn) { fits_lock(); if (fptr) { fits_close_file(fptr,&fstatus); fptr = NULL; } fname = fn; cout << "FITSTOIReader::open FileName=" << fname << endl; fstatus = 0; // Open file fits_open_file(&fptr,fname.c_str(),READONLY,&fstatus); if (fstatus != 0) { fits_report_error(stderr, fstatus); fits_unlock(); throw IOExc("fitsio error"); } // Go to first extension, which should be a BINTABLE int simple, bitpix, naxis; long naxes; long pcount, gcount; int extend; fits_read_imghdr(fptr, 1, &simple, &bitpix, &naxis, &naxes, &pcount, &gcount, &extend, &fstatus); fits_movabs_hdu(fptr, 2, NULL, &fstatus); fits_get_num_cols(fptr,&ncols,&fstatus); fits_get_num_rows(fptr,&nrows,&fstatus); cout << "FITSTOIReader cols = " << ncols << " rows=" << nrows << endl; if (implicitSN) { firstSn = implicitSNStart; } else { int anyNul; double y; fits_read_col_dbl(fptr,1,1,1,1,0,&y,&anyNul,&fstatus); firstSn = (int) (y+.1); } fits_unlock(); } void FITSTOIReader::init() { openFile(allfn.front()); fits_lock(); // si pas implicitSN, la premiere colonne est le sampleNum. // Sinon, le samplenum est la fitsline + offset. int itoi=-1; int col1 = implicitSN ? 0 : 1; for (int i=col1; i(i,false); } } fits_unlock(); snBegin = firstSn; if (forcedMinIn > 0 && forcedMinIn > snBegin) { snBegin = forcedMinIn; } openFile(allfn.back()); snEnd = firstSn+nrows-1; if (forcedMaxIn > 0 && forcedMaxIn < snEnd) { snEnd = forcedMaxIn; } cout << "FITSTOIReader range " << snBegin << " -> " << snEnd << endl; } int FITSTOIReader::calcMinOut() { chkinit(); TOIManager* mgr = TOIManager::getManager(); int firstReq = mgr->getRequestedBegin(); return snBegin > firstReq ? snBegin : firstReq; } int FITSTOIReader::calcMaxOut() { chkinit(); TOIManager* mgr = TOIManager::getManager(); int lastReq = mgr->getRequestedEnd(); return snEnd < lastReq ? snEnd : lastReq; } void FITSTOIReader::addFile(string fn) { allfn.push_back(fn); } void FITSTOIReader::run() { for (vector::iterator i=allfn.begin(); i!=allfn.end(); i++) { openFile(*i); if (Buff_Sz > 1) run2(); // Lecture bufferise else run1(); // Lecture un echantillon a la fois } } // run 1 : deprecated. NON MAINTENU. Incompatible avec implicit SN. // ^^^^^^^^^^^^ Reza , 13/5/2002 , Je viens de rajouter // implicitSNStart et switvh run1/run2 // suivant buffersize void FITSTOIReader::run1() { // Il faudrait optimiser en fonction de ce qui a ete demande comme samplenum, // mais cela implique de gerer aussi bien echant uniforme que non. // On pourrait aussi lire plusieurs elements d'un coup. int ncols = outIx.size(); cout << "reader reading... NRows=" << nrows << " firstSn= " << firstSn << endl; double* tabdata = new double[getNOut()]; uint_8* tabflag = new uint_8[getNOut()]; for (long i=0; i mgr->getRequestedEnd()) {fits_unlock(); break;} if (sn < mgr->getRequestedBegin()) {fits_unlock(); continue;} // if (sn < mgr->getRequestedBegin()+10) cout << "rdr out " << sn << endl; int k; for (k=0; k