source: Sophya/trunk/SophyaLib/SkyT/specrespvector.cc@ 2444

Last change on this file since 2444 was 2344, checked in by ansari, 23 years ago

Compilation (fin ?) avec SGI-CC -LANG:std - Reza 10/03/2003

File size: 4.8 KB
RevLine 
[601]1//--------------------------------------------------------------------------
2// File and Version Information:
[2344]3// $Id: specrespvector.cc,v 1.10 2003-03-10 15:13:49 ansari Exp $
[601]4//
5// Description:
6// Aim of the class: To give the energy density
7// The unity used here is W/m^2/Hz/sr
8//
9// History (add to end):
10// Sophie Oct, 1999 - creation
11//
12//------------------------------------------------------------------------
13
14//---------------
15// C++ Headers --
16//---------------
17#include "machdefs.h"
[2322]18#include <iostream>
[601]19#include <math.h>
20// #include <typeinfo>
21
22#include "specrespvector.h"
23#include "pexceptions.h"
[806]24#include "fioarr.h"
[601]25//----------------
26// Constructor --
27//----------------
[909]28/*!
29 * \class SOPHYA::SpecRespVec
[927]30 \ingroup SkyT
[909]31 One may also want to defined the filter of a detector by two vectors:
32 one for the frequencies and one for the corresponding transmission values.
33 In this case on should use the SpecRespVec class !
34*/
[668]35SpecRespVec::SpecRespVec()
36 : SpectralResponse()
37{
38}
39
[909]40/*! Constructor:
41 \param nu vector of the frequencies
42 \param fdenu vector of the corresponding transmission values of the filter
43*/
[601]44SpecRespVec::SpecRespVec(Vector const & nu, Vector const & fdenu, double numin, double numax)
45 : SpectralResponse(numin, numax)
46{
47 if(nu.NElts() != fdenu.NElts())
48 throw SzMismatchError("SpecRespVec::SpecRespVec() - Non equal vector sizes");
49 _vecOfNu = nu;
50 _vecOfFDeNu = fdenu;
[669]51 _size = nu.NElts();
52 if(_vecOfNu.NElts() != _vecOfFDeNu.NElts()) cout << "vectors are not compatible" << exit;
53}
54
55SpecRespVec::SpecRespVec(Vector const & nu, Vector const & fdenu)
56 : SpectralResponse()
57{
58 if(nu.NElts() != fdenu.NElts())
59 throw SzMismatchError("SpecRespVec::SpecRespVec() - Non equal vector sizes");
60 _vecOfNu = nu;
61 _vecOfFDeNu = fdenu;
[601]62 _numin = nu(0);
63 _numax = nu(nu.NElts()-1);
[668]64 _size = nu.NElts();
[601]65 if(_vecOfNu.NElts() != _vecOfFDeNu.NElts()) cout << "vectors are not compatible" << exit;
66}
67
68
69//--------------
70// Destructor --
71//--------------
72SpecRespVec::~SpecRespVec()
73{
74}
75
76// ---------------------------
77// -- Function Definitions --
78// ---------------------------
79
80
81
[909]82/*! The transmission function extrapolates the transmission values for the
83 frequencies that are not present in the nu vector <BR>
84 given at the instanciation of the class.
85*/
[601]86double
87SpecRespVec::transmission(double nu) const
88{
89 if ( (nu < _numin) || (nu > _numax) ) return(0.);
[610]90 double value = 0.;
[601]91 int sizeVecOfNu = _vecOfNu.NElts();
[610]92 if(nu <= _vecOfNu(0)) return _vecOfFDeNu(0);
[601]93 if(nu >= _vecOfNu(sizeVecOfNu-1)) return _vecOfFDeNu(sizeVecOfNu-1);
94
95 for (int i=1; i<sizeVecOfNu; i++)
96 {
[610]97 if(nu < _vecOfNu(i))
[601]98 {
99 double up = _vecOfFDeNu(i) ;
100 double down = _vecOfFDeNu(i-1);
101 double xmin = _vecOfNu(i-1);
102 double xmax = _vecOfNu(i);
103 double a = ((up-down)/(xmax-xmin));
104 value = a*nu+(up-a*xmax);
105 return value;
106 }
107 }
108 return value;
109}
110
111
112
113void
114SpecRespVec::Print(ostream& os) const
115{
116
117 // os << "SpecRespVec::Print (" << typeid(*this).name()
118 //<< ") - Fmin,Fmax= " << minFreq() << "," << maxFreq() << endl;
119 os << "SpecRespVec ::Print - Fmin,Fmax= " << minFreq() << "," << maxFreq() << endl;
120 os << "MeanFreq= " << meanFreq() << " Transmission= " << transmission(meanFreq()) << endl;
121 os << "PeakFreq= " << peakFreq() << " Transmission= " << transmission(peakFreq()) << endl;
122
123}
[668]124
125
[2344]126DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
[668]127void
128ObjFileIO<SpecRespVec>::WriteSelf(POutPersist& s) const
129{
130 if(dobj == NULL)
131 {
132 cout << " ObjFileIO<SpecRespVec>::WriteSelf:: dobj= null " << endl;
133 return;
134 }
135
136 int_4 version, nothing;
137 version = 1;
138 nothing = 0; // Reserved for future use
139 s.PutI4(version);
140 s.PutI4(nothing);
141
142 s.PutR8(dobj->minFreq());
143 s.PutR8(dobj->maxFreq());
144
[669]145 // TVector<T> has Persistence Manager
146 s << dobj->getNuVec();
147 {
148 Vector& xv2 = dobj->getTNuVec();
149 cout << xv2 ;
[806]150 FIO_TArray<double> vio2(&xv2);
[669]151 vio2.Write(s);
152 }
[668]153}
154
[2344]155DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
[668]156void
157ObjFileIO<SpecRespVec>::ReadSelf(PInPersist& s)
158{
159 int_4 version, nothing;
160 version = 1;
161 nothing = 0; // Reserved for future use
162 s.GetI4(version);
163 s.GetI4(nothing);
164
165 if(dobj == NULL)
166 {
[669]167 dobj= new SpecRespVec();
168 ownobj= true;
[668]169 }
170 r_8 minf, maxf;
171 s.GetR8(minf);
172 s.GetR8(maxf);
173 dobj->setMinMaxFreq(minf, maxf);
174 // TVector<T> has Persistence Manager
[806]175 FIO_TArray<double> vio(&(dobj->getNuVec()));
[669]176 vio.Read(s);
[806]177 FIO_TArray<double> vio2(&(dobj->getTNuVec()));
[669]178 vio2.Read(s);
[668]179}
180
181
182#ifdef __CXX_PRAGMA_TEMPLATES__
183#pragma define_template ObjFileIO<SpecRespVec>
184#endif
185
186#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
187template class ObjFileIO<SpecRespVec>;
188#endif
Note: See TracBrowser for help on using the repository browser.