source: trunk/src/mainDuchamp.cc @ 1160

Last change on this file since 1160 was 1157, checked in by MatthewWhiting, 11 years ago

Adding version number to the binary catalogue output, and changing the usage message when we create the binary catalogue.

File size: 7.4 KB
RevLine 
[299]1// -----------------------------------------------------------------------
2// mainDuchamp.cc: Main program for Duchamp source finder.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
[3]28#include <iostream>
29#include <fstream>
30#include <string>
31#include <math.h>
32#include <unistd.h>
[80]33#include <time.h>
[57]34
[393]35#include <duchamp/duchamp.hh>
36#include <duchamp/param.hh>
37#include <duchamp/pgheader.hh>
38#include <duchamp/Detection/detection.hh>
39#include <duchamp/Cubes/cubes.hh>
40#include <duchamp/Utils/utils.hh>
41#include <duchamp/ATrous/atrous.hh>
[3]42
[378]43using namespace duchamp;
44
[3]45int main(int argc, char * argv[])
46{
47
[872]48  try {
49   
50
[232]51  std::string paramFile,fitsfile;
[85]52  Cube *cube = new Cube;
[3]53
[168]54  if(cube->getopts(argc,argv)==FAILURE) return FAILURE;
[3]55
56  if(cube->pars().getImageFile().empty()){
[914]57    DUCHAMPTHROW("Duchamp", "No input image has been given!. Use the imageFile parameter in the parameter file to specify the FITS file.");
[168]58    return FAILURE;
[3]59  }
60
[258]61  if(cube->pars().getFlagSubsection() || cube->pars().getFlagStatSec()){
[168]62    // make sure the subsection is OK.
63    if(cube->pars().verifySubsection() == FAILURE){
[914]64      DUCHAMPTHROW("Duchamp", "Unable to use the subsection provided.");
[168]65      return FAILURE;
66    }
67  }     
[164]68
[139]69  std::cout << "Opening image: "
70            << cube->pars().getFullImageFile() << std::endl;
71
[106]72  if( cube->getCube() == FAILURE){
[914]73    DUCHAMPTHROW("Duchamp", "Unable to open image file "<< cube->pars().getFullImageFile());
[168]74    return FAILURE;
[3]75  }
[103]76  else std::cout << "Opened successfully." << std::endl;
[3]77
[208]78  // Read in any saved arrays that are in FITS files on disk.
[475]79  if(!cube->pars().getFlagUsePrevious())
80    cube->readSavedArrays();
[71]81
[103]82  // Write the parameters to screen.
[1049]83  std::cout << cube->pars() << "\n";
[3]84
[475]85  if(cube->pars().getFlagUsePrevious()){
[1157]86    std::cout << "Reading detections from binary catalogue... \n";
[1146]87    if(cube->readBinaryCatalogue() == FAILURE){
[914]88      DUCHAMPTHROW("Duchamp", "Could not read detections from log file");
[475]89      return FAILURE;
90    }
91    else std::cout << "Done.\n";
[3]92  }
[475]93  else {
[3]94
[475]95    if(cube->pars().getFlagLog()){
96      // Prepare the log file.
97      cube->prepareLogFile(argc, argv);
98    }
[3]99
[475]100    //if(cube->pars().getFlagBlankPix()){
101    if(cube->pars().getFlagTrim()){
102      // Trim any blank pixels from the edges, and report the new size
103      // of the cube
104      std::cout<<"Trimming the Blank Pixels from the edges...  "<<std::flush;
105      cube->trimCube();
106      std::cout<<"Done."<<std::endl;
107      std::cout << "New dimensions:  " << cube->getDimX();
108      if(cube->getNumDim()>1) std::cout << "x" << cube->getDimY();
109      if(cube->getNumDim()>2) std::cout << "x" << cube->getDimZ();
110      std::cout << std::endl;
111    }
[3]112
[475]113    if(cube->pars().getFlagBaseline()){
114      std::cout<<"Removing the baselines... "<<std::flush;
115      cube->removeBaseline();
116      std::cout<<" Done.                 \n";
117    }
[60]118
[475]119    if(cube->pars().getFlagNegative()){
120      std::cout<<"Inverting the Cube... "<<std::flush;
121      cube->invert();
122      std::cout<<" Done.\n";
123    }
[3]124
[834]125    cube->Search();
[475]126    std::cout << "Done. Intermediate list has " << cube->getNumObj();
127    if(cube->getNumObj()==1) std::cout << " object.\n";
128    else std::cout << " objects.\n";
[3]129
[715]130    if(cube->getNumObj() > 0){
[475]131      if(cube->pars().getFlagGrowth())
132        std::cout<<"Merging, Growing and Rejecting...  "<<std::flush;
133      else
134        std::cout<<"Merging and Rejecting...  "<<std::flush;
135      cube->ObjectMerger();
136      std::cout<<"Done.                      "<<std::endl;
137    }
138    std::cout<<"Final object count = "<<cube->getNumObj()<<std::endl;
[60]139
[475]140    if(cube->pars().getFlagNegative()){
141      std::cout<<"Un-Inverting the Cube... "<<std::flush;
142      cube->reInvert();
143      std::cout<<" Done."<<std::endl;
144    }
[3]145
[475]146    if(cube->pars().getFlagBaseline()){
147      std::cout<<"Replacing the baselines...  "<<std::flush;
148      cube->replaceBaseline();
149      std::cout<<"Done."<<std::endl;
150    }
151
152    if(cube->pars().getFlagCubeTrimmed()){
153      std::cout<<"Replacing the trimmed pixels on the edges...  "<<std::flush;
154      cube->unTrimCube();
155      std::cout<<"Done."<<std::endl;
156    }
157
[3]158  }
159
160  if(cube->getNumObj()>0){
161
[748]162    std::cout << "Calculating final parameters and setting flags...  "<<std::flush;
[3]163    cube->calcObjectWCSparams();
[87]164
165    cube->setObjectFlags();
[3]166   
167    cube->sortDetections();
[475]168
[748]169    std::cout << "Done." << std::endl;
170
[3]171  }
[312]172 
[1049]173  cube->outputCatalogue();
[3]174
[315]175  if(USE_PGPLOT){
176    std::cout<<"Creating the maps...  "<<std::flush;
177    std::vector<std::string> devices;
[985]178    if(cube->nondegDim()>1){
179      if(cube->pars().getFlagXOutput()) devices.push_back("/xs");
180      if(cube->pars().getFlagMaps())
181        devices.push_back(cube->pars().getMomentMap()+"/vcps");
182      cube->plotMomentMap(devices);
183    }
184    if(cube->pars().getFlagMaps()){
185      if(cube->nondegDim()==1) cube->plotDetectionMap("/xs");
[315]186      cube->plotDetectionMap(cube->pars().getDetectionMap()+"/vcps");
[985]187    }
[258]188    std::cout << "Done.\n";
[315]189   
[994]190    if(cube->getNumObj()>0 && cube->pars().getFlagPlotSpectra()){
[1148]191      std::cout << "Plotting the spectra of detected objects... " << std::flush;
[315]192      cube->outputSpectra();
193      std::cout << "Done.\n";
194    }
[3]195  }
[315]196  else{
197    std::cout << "PGPLOT has not been enabled, so no graphical output.\n";
198  }
[3]199
[475]200  if(!cube->pars().getFlagUsePrevious()){
[1146]201   
202    if(cube->pars().getFlagWriteBinaryCatalogue() && (cube->getNumObj()>0)){
203      cube->writeBinaryCatalogue();
[475]204    }
205
[3]206  }
207
[1142]208  std::cout << "Writing to FITS files... \n";
[1121]209  cube->writeToFITS();
[1142]210  std::cout << "Done.\n";
[946]211 
[349]212  if(cube->pars().getFlagVOT()){
[1048]213    cube->outputDetectionsVOTable();
[3]214  }
215
[1077]216  // write annotation files, if required.
217  cube->outputAnnotations();
[20]218
[783]219  if(cube->pars().getFlagTextSpectra()){
[832]220    if(cube->pars().isVerbose()) std::cout << "Saving spectra to text file ... ";
[783]221    cube->writeSpectralData();
[832]222    if(cube->pars().isVerbose()) std::cout << "done.\n";
[783]223  }
224
[475]225  if(!cube->pars().getFlagUsePrevious() && cube->pars().getFlagLog()){
[313]226    // Open the logfile and write the time on the first line
227    std::ofstream logfile(cube->pars().getLogFile().c_str(),std::ios::app);
[1147]228    logfile << "# Duchamp completed: ";
[313]229    time_t now = time(NULL);
230    logfile << asctime( localtime(&now) );
231    logfile.close();
232  }
233
234
[3]235  delete cube;
236
[872]237  } catch (const DuchampError &err) {
[873]238    std::cout << "\nDuchamp failed with the following error:\n" << err.what() << "\n";
[872]239    exit(1);
240  }
241
[168]242  return SUCCESS;
[872]243
[3]244}
245
Note: See TracBrowser for help on using the repository browser.