30 using std::runtime_error;
34 using namespace hippodraw;
62 fits_get_version ( & version );
77 ifstream test ( name.c_str (), std::ios::in );
78 if ( test.is_open () == false ) {
79 string what (
"FitsController: File `" );
81 what +=
"' not found";
82 throw std::runtime_error ( what );
86 int status = file -> status();
89 string what (
"cfitsio: Error opening file `" );
93 throw runtime_error ( what );
98 file = first -> second;
118 const vector < string > &
135 const std::string & name )
139 const vector < string > & names
141 unsigned int size = names.size ();
143 for (
unsigned int i = 0; i <
size; i++ ) {
144 if ( name == names[i] ) {
151 string what (
"FitsController: File `" );
154 what +=
"does not have extensison with name `";
157 throw runtime_error ( what );
166 const std::string & name,
171 string ds_name = filename;
176 if ( file == NULL )
return NULL;
178 int retval = file -> moveToHDU ( index );
183 catch (
const runtime_error & e ) {
187 ntuple -> setTitle ( name );
188 ntuple -> setName ( ds_name );
190 controller -> registerNTuple ( ds_name, ntuple );
191 controller -> registerDataSourceFile ( ntuple );
204 = dynamic_cast <
const FitsNTuple & > ( source );
210 if ( file == 0 )
return;
215 vector < long > sizes;
216 file -> fillAxisSizes ( sizes );
217 if ( sizes.size () > 3 ) {
218 string what (
"FitsController: greater then 3D images not supported" );
219 throw std::runtime_error ( what );
222 plotter -> setNumberOfBins (
Axes::X, sizes[0] );
223 plotter -> setNumberOfBins (
Axes::Y, sizes[1] );
225 vector < double > deltas;
226 file -> fillImageDeltas ( deltas );
227 plotter -> setBinWidth (
Axes::X, deltas[0] );
228 plotter -> setBinWidth (
Axes::Y, deltas[1] );
230 vector < double > ref_values;
231 file -> fillRefPixelValues ( ref_values );
232 vector < int > ref_indices;
233 file -> fillRefPixelIndices ( ref_indices );
237 if ((file ->pixCenter ())==
true) pixToRef=0.5;
240 double x_orig = - deltas[0] * ( ref_indices[0]-1+pixToRef ) + ref_values[0];
241 double y_orig = - deltas[1] * ( ref_indices[1]-1+pixToRef ) + ref_values[1];
248 if ( deltas[0] < 0. ) {
249 range.
setRange ( x_orig + sizes[0] * deltas[0], x_orig, -deltas[0] );
252 range.
setRange ( x_orig, x_orig + (sizes[0] ) * deltas[0], 1. );
254 plotter -> setRange (
Axes::X, range,
false,
true );
256 range.
setLength ( ( sizes[1] ) * deltas[1] );
257 plotter -> setRange (
Axes::Y, range,
false,
true );
259 plotter -> matrixTranspose (
true );
261 bool yes = file -> isHammerAitoff ();
273 const std::string & filename )
277 long row =
static_cast<long> ( ntuple -> rows() );
278 int column =
static_cast<int> (ntuple -> columns());
279 const vector <string> labels = ntuple -> getLabels();
280 vector < vector < int > > shapes;
282 for (
int i = 0; i <
column; i++ ){
283 vector < int >
shape;
284 ntuple -> fillShape ( shape, i );
285 shapes.push_back ( shape );
288 const string fullname = ntuple -> getName();
289 string::size_type pos1 = fullname.find_last_of (
":" );
290 string::size_type pos2 = fullname.find_last_of (
"/" );
292 if ( pos1 != string::npos && pos1!=1 ) {
293 extname = fullname.substr ( pos1+2 );
295 else if (pos2 != string::npos) {
296 extname =
"<no name>";
302 file -> writeHDU ( row, column, labels, shapes, extname );
303 for (
int i = 0; i <
column; i++ ) {
304 const vector < double > & col = ntuple -> getColumn (i );
305 file -> writeColumn ( i, col );
308 file -> writeCloseFile ();
320 = controller -> findDataSource ( name );
321 if ( ntuple == 0 )
return;
329 const std::vector <double> &
data,
330 const std::string & filename )
335 long xx =
static_cast<long> ( x );
336 long yy =
static_cast<long> ( y );
338 double xlow = 0.0 -
static_cast<double> (x) / 2 ;
339 double ylow = 0.0 -
static_cast<double> (y) / 2;
341 file -> writeImageHDU ( xx,yy );
342 file -> writeRefPixelValues ( xlow, ylow );
343 file -> writePix ( xx, yy, data );
345 file -> writeCloseFile ();
355 vector < int >
shape;
356 source -> fillShape ( shape, column );
357 size_t rank = shape.size ();
360 for (
size_t i = 1; i <
rank; i++ ) {
369 const std::string & filename,
370 const std::string & dsname,
371 const std::vector < std::string > & column_list,
372 const std::vector < const TupleCut * > & cut_list)
374 if ( column_list.empty() )
return 1;
378 unsigned int columnNumber = column_list.size();
381 vector < bool > acceptArray;
384 long rows = std::count ( acceptArray.begin(), acceptArray.end(), true );
385 int columns =
static_cast<int> (columnNumber);
389 vector < int > col_indices ( columnNumber );
391 for (
unsigned int i = 0; i < columnNumber; i++ ) {
392 const string & label = column_list [ i ];
393 int index = ds -> indexOf ( label );
395 ds -> throwIfInvalidLabel ( label );
397 col_indices [i] = index;
400 vector < size_t > sizes;
401 vector < vector < int > > shapes;
402 for (
int i = 0; i < columns; i++ ) {
404 sizes.push_back ( size );
405 vector < int >
shape;
406 ds -> fillShape ( shape, col_indices[i] );
407 shapes.push_back ( shape );
410 file -> writeHDU ( rows, columns, column_list,
414 for (
unsigned int k = 0; k < columnNumber; k++ ) {
415 std::vector < double > tempColumn;
416 if ( sizes [ k ] == 1 ) {
417 tempColumn.reserve (size );
420 tempColumn.reserve ( size * sizes[k] );
422 for (
unsigned int i = 0; i<
size; i++ ) {
423 if ( acceptArray[i]==
true ) {
424 int index = col_indices[k];
425 if ( sizes [ k ] == 1 ) {
426 tempColumn.push_back ( ds -> valueAtNoCache (i, index) );
429 double * array = ds -> doubleArrayAt ( i, index );
430 for ( std::size_t l = 0; l < sizes [ k ]; l++ ) {
431 tempColumn.push_back ( array[l] );
436 file -> writeColumn ( k, tempColumn );
441 file -> writeCloseFile ();