source: trunk/src/mainDuchamp.cc @ 1441

Last change on this file since 1441 was 1361, checked in by MatthewWhiting, 10 years ago

Ticket #219 - largely addressing the problem. When doing negative + baseline modes, need to undo the inversion & baseline removal in two steps, so that we get the right sequencing of parameterisation and inversion of values. Also removing the reInvert() function, as it is no longer used.

File size: 7.9 KB
Line 
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// -----------------------------------------------------------------------
28#include <iostream>
29#include <fstream>
30#include <string>
31#include <math.h>
32#include <unistd.h>
33#include <time.h>
34
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>
42
43using namespace duchamp;
44
45int main(int argc, char * argv[])
46{
47
48  try {
49   
50
51  std::string paramFile,fitsfile;
52  Cube *cube = new Cube;
53
54  if(cube->getopts(argc,argv)==FAILURE) return FAILURE;
55
56  if(cube->pars().getImageFile().empty()){
57    DUCHAMPTHROW("Duchamp", "No input image has been given!. Use the imageFile parameter in the parameter file to specify the FITS file.");
58    return FAILURE;
59  }
60
61  if(cube->pars().getFlagSubsection() || cube->pars().getFlagStatSec()){
62    // make sure the subsection is OK.
63    if(cube->pars().verifySubsection() == FAILURE){
64      DUCHAMPTHROW("Duchamp", "Unable to use the subsection provided.");
65      return FAILURE;
66    }
67  }     
68
69  std::cout << "Opening image: "
70            << cube->pars().getFullImageFile() << std::endl;
71
72  if( cube->getCube() == FAILURE){
73    DUCHAMPTHROW("Duchamp", "Unable to open image file "<< cube->pars().getFullImageFile());
74    return FAILURE;
75  }
76  else std::cout << "Opened successfully." << std::endl;
77
78  // Read in any saved arrays that are in FITS files on disk.
79  if(!cube->pars().getFlagUsePrevious())
80    cube->readSavedArrays();
81
82  // Write the parameters to screen.
83  std::cout << cube->pars() << "\n";
84
85  if(cube->pars().getFlagUsePrevious()){
86    std::cout << "Reading detections from binary catalogue... \n";
87    if(cube->readBinaryCatalogue() == FAILURE){
88      DUCHAMPTHROW("Duchamp", "Could not read detections from log file");
89      return FAILURE;
90    }
91    else std::cout << "Done.\n";
92  }
93  else {
94
95    if(cube->pars().getFlagLog()){
96      // Prepare the log file.
97      cube->prepareLogFile(argc, argv);
98    }
99
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    }
112
113    if(cube->pars().getFlagBaseline()){
114      std::cout<<"Removing the baselines... "<<std::flush;
115      cube->removeBaseline();
116      std::cout<<" Done.                 \n";
117    }
118   
119    if(cube->pars().getFlagNegative()){
120      std::cout<<"Inverting the Cube... "<<std::flush;
121      cube->invert();
122      std::cout<<" Done.\n";
123    }
124
125    cube->Search();
126    std::cout << "Done. Intermediate list has " << cube->getNumObj();
127    if(cube->getNumObj()==1) std::cout << " object.\n";
128    else std::cout << " objects.\n";
129
130    if(cube->getNumObj() > 0){
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;
139
140
141    if(cube->pars().getFlagNegative()){
142      std::cout<<"Un-Inverting the Cube... "<<std::flush;
143      cube->invert(!cube->pars().getFlagBaseline(),true);
144      std::cout<<" Done."<<std::endl;
145    }
146
147    if(cube->pars().getFlagBaseline() && !cube->pars().getFlagNegative()){
148      std::cout<<"Replacing the baselines...  "<<std::flush;
149      cube->replaceBaseline();
150      std::cout<<"Done."<<std::endl;
151    }
152   
153    if(cube->pars().getFlagCubeTrimmed()){
154      std::cout<<"Replacing the trimmed pixels on the edges...  "<<std::flush;
155      cube->unTrimCube();
156      std::cout<<"Done."<<std::endl;
157    }
158   
159  }
160
161  if(cube->getNumObj()>0){
162
163    std::cout << "Calculating final parameters and setting flags...  "<<std::flush;
164    cube->calcObjectWCSparams();
165
166    cube->setObjectFlags();
167   
168    cube->sortDetections();
169
170    std::cout << "Done." << std::endl;
171
172  }
173 
174  if(cube->pars().getFlagNegative() && cube->pars().getFlagBaseline()){
175    std::cout<<"Un-Inverting the Cube... "<<std::flush;
176    cube->invert(true,true);
177    std::cout<<" Done."<<std::endl;
178  }
179
180  if(cube->pars().getFlagBaseline() && cube->pars().getFlagNegative()){
181    std::cout<<"Replacing the baselines...  "<<std::flush;
182    cube->replaceBaseline(false);
183    std::cout<<"Done."<<std::endl;
184  }
185
186  cube->outputCatalogue();
187
188  if(USE_PGPLOT){
189    std::cout<<"Creating the maps...  "<<std::flush;
190    std::vector<std::string> devices;
191    if(cube->nondegDim()>1){
192      if(cube->pars().getFlagXOutput()) devices.push_back("/xs");
193      if(cube->pars().getFlagMaps())
194        devices.push_back(cube->pars().getMomentMap()+"/vcps");
195      cube->plotMomentMap(devices);
196    }
197    if(cube->pars().getFlagMaps()){
198      if(cube->nondegDim()==1) cube->plotDetectionMap("/xs");
199      cube->plotDetectionMap(cube->pars().getDetectionMap()+"/vcps");
200    }
201    std::cout << "Done.\n";
202   
203    if(cube->getNumObj()>0 && cube->pars().getFlagPlotSpectra()){
204      std::cout << "Plotting the spectra of detected objects... " << std::flush;
205      cube->outputSpectra();
206      std::cout << "Done.\n";
207    }
208  }
209  else{
210    std::cout << "PGPLOT has not been enabled, so no graphical output.\n";
211  }
212
213  if(!cube->pars().getFlagUsePrevious()){
214   
215    if(cube->pars().getFlagWriteBinaryCatalogue() && (cube->getNumObj()>0)){
216      cube->writeBinaryCatalogue();
217    }
218
219  }
220
221  std::cout << "Writing to FITS files... \n";
222  cube->writeToFITS();
223  std::cout << "Done.\n";
224 
225  if(cube->pars().getFlagVOT()){
226    cube->outputDetectionsVOTable();
227  }
228
229  // write annotation files, if required.
230  cube->outputAnnotations();
231
232  if(cube->pars().getFlagTextSpectra()){
233    if(cube->pars().isVerbose()) std::cout << "Saving spectra to text file ... ";
234    cube->writeSpectralData();
235    if(cube->pars().isVerbose()) std::cout << "done.\n";
236  }
237
238  if(!cube->pars().getFlagUsePrevious() && cube->pars().getFlagLog()){
239    // Open the logfile and write the time on the first line
240    std::ofstream logfile(cube->pars().getLogFile().c_str(),std::ios::app);
241    logfile << "# Duchamp completed: ";
242    time_t now = time(NULL);
243    logfile << asctime( localtime(&now) );
244    logfile.close();
245  }
246
247
248  delete cube;
249
250  } catch (const DuchampError &err) {
251    std::cout << "\nDuchamp failed with the following error:\n" << err.what() << "\n";
252    exit(1);
253  }
254
255  return SUCCESS;
256
257}
258
Note: See TracBrowser for help on using the repository browser.