source: tags/release-1.2.2/src/Devel/spectralSelection.cc

Last change on this file was 1018, checked in by MatthewWhiting, 12 years ago

size_t changes for the development code

File size: 5.6 KB
Line 
1// -----------------------------------------------------------------------
2// spectralSelection.cc: A text-based menu to select a particular 1D
3//                       spectrum.
4// -----------------------------------------------------------------------
5// Copyright (C) 2006, Matthew Whiting, ATNF
6//
7// This program is free software; you can redistribute it and/or modify it
8// under the terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// Duchamp is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15// for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with Duchamp; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
20//
21// Correspondence concerning Duchamp may be directed to:
22//    Internet email: Matthew.Whiting [at] atnf.csiro.au
23//    Postal address: Dr. Matthew Whiting
24//                    Australia Telescope National Facility, CSIRO
25//                    PO Box 76
26//                    Epping NSW 1710
27//                    AUSTRALIA
28// -----------------------------------------------------------------------
29#include <iostream>
30#include <fstream>
31#include <iomanip>
32#include <sstream>
33#include <string>
34#include <duchamp/param.hh>
35#include <duchamp/Devel/devel.hh>
36#include <duchamp/Cubes/cubes.hh>
37#include <vector>
38
39using namespace duchamp;
40
41void spectralSelection(std::vector<float> &xvalues,
42                       std::vector<float> &yvalues,
43                       size_t &zdim)
44{
45  std::cout << "Do you want:\t 1) HI Cubes?\n";
46  std::cout << "\t\t 2) PHFS quasar spectra?\n";
47  std::cout << "\t\t 3) Orion Chandra time series?\n";
48  std::cout << "\t\t 4) 2BL spectra?\n";
49  std::cout << "\t\t 5) Gaussian noise?\n";
50  std::cout << "\t\t 6) Gaussian noise with a single Gaussian source?\n";
51  std::cout << "\t\t 7) As for 6) but with absorption as well?"<<std::endl;
52  std::cout << "\t\t 8) A unit pulse at the central pixel?\n";
53  std::cout << "\t\t 9) B1555-140 spectra?\n";
54  std::cout << "\t\t10) To enter your own filename (text file only)?\n";
55  int choice=0;
56  while((choice<1)||(choice>10)){
57    std::cout << "Enter choice (1 -- 10) : ";
58    std::cin >> choice;
59  }
60 
61  std::string fname;
62  zdim=0;
63
64  std::vector<float> specx,specy;
65
66  if(choice==1){
67    fname=menu();
68    std::cerr << fname <<std::endl;
69    char ans;
70    duchamp::Cube *cube = new duchamp::Cube;
71    duchamp::Param par;
72    std::cout << "Remove Milky Way emission (y/n)? : ";
73    std::cin >> ans;
74    par.setFlagMW(ans=='y');
75    par.setImageFile(fname);
76    par.setVerbosity(false);
77    cube->saveParam(par);
78    if(cube->getCube()==FAILURE) std::cerr << "Cannot read cube!";
79    zdim = cube->getDimZ();
80    if(par.getFlagMW()) cube->removeMW();
81    zdim = cube->getDimZ();
82
83    long xpos,ypos;
84    std::cout << "Enter x (1--"<<cube->getDimX()
85              << ") and y (1--"<<cube->getDimY()
86              << ") positions: ";
87    std::cin >> xpos >> ypos;
88
89    xpos -= cube->pars().getXOffset();
90    ypos -= cube->pars().getYOffset();
91    float *array = new float[cube->getSize()];
92    cube->getArray(array);
93    specx.resize(zdim);
94    specy.resize(zdim);
95    const int offset = 0;
96    int ct=0;
97    for(int zpos=0;zpos<zdim;zpos++){
98      specx[ct] = float(zpos);
99      specy[ct] = 0.;
100      for(int x=xpos-offset;x<=xpos+offset;x++){
101        for(int y=ypos-offset;y<=ypos+offset;y++){
102          size_t cubepos = y * cube->getDimX() + x
103            + zpos * cube->getDimX() * cube->getDimY();
104          specy[ct] += array[cubepos];
105        }
106      }
107      specy[ct] /= (2*offset+1)*(2*offset+1);
108      ct++;
109    }
110    delete cube;
111    delete [] array;
112  }
113  else if((choice==7)||(choice==6)||(choice==5)){
114    zdim=1024;
115    specx.resize(zdim);
116    specy.resize(zdim);
117    float *tempx = new float[zdim];
118    float *tempy = new float[zdim];
119    getRandomSpectrum(zdim,tempx,tempy);
120    for(int i=0;i<zdim;i++) specx[i] = tempx[i];
121    for(int i=0;i<zdim;i++) specy[i] = tempy[i];
122    delete [] tempx;
123    delete [] tempy;
124    if((choice==7)||(choice==6)){
125      float src,snr,loc=-1,fwhm,snrAbs,fwhmAbs;
126      std::cout << "Enter signal-to-noise of source: ";
127      std::cin >> snr;
128      while((loc<0)||(loc>=zdim)){
129        std::cout << "Enter location of source (0 -- "<<zdim<<"), and FHWM: ";
130        std::cin >> loc >> fwhm;
131      }
132      for(int i=0;i<zdim;i++){
133        src = snr * exp( -(specx[i]-loc)*(specx[i]-loc)/(fwhm*fwhm) );
134        specy[i] += src;
135      }
136      if(choice==7){
137        fwhmAbs=fwhm;
138        snrAbs = snr;
139        while(fwhmAbs>=fwhm && snrAbs>=snr){
140          std::cout << "Enter SNR (<" << snr
141                    << ") and FWHM (<" << fwhm
142                    << ") of absorption line: ";
143          std::cin >> snrAbs >> fwhmAbs;
144        }
145        for(int i=0;i<zdim;i++){
146          src = snrAbs * exp(-(specx[i]-loc)*(specx[i]-loc)/(fwhmAbs*fwhmAbs));
147          specy[i] -= src;
148        }
149      }
150    }
151  }
152  else if(choice==8){
153    zdim=1024;
154    specx.resize(zdim);
155    specy.resize(zdim);
156    for(int i=0;i<zdim;i++){
157      specx[i] = i;
158      specy[i] = 0.;
159    }
160    specy[zdim/2] = 1.;
161  }
162  else{
163    if(choice==2) fname=specMenu();
164    else if(choice==3) fname=orionMenu();
165    else if(choice==4) fname=twoblMenu();
166    else if(choice==9) fname=b1555Menu();
167    else {
168      std::cout << "Enter filename (full path): ";
169      std::cin >> fname;
170    }
171    std::ifstream fin(fname.c_str());
172    float a; float b;
173    specx.resize(0);
174    specy.resize(0);
175    while(fin>>a>>b){
176      specx.push_back(a);
177      specy.push_back(b);
178      zdim++;
179    }
180   
181  }
182
183  xvalues = specx;
184  yvalues = specy;
185
186}
Note: See TracBrowser for help on using the repository browser.