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

Last change on this file since 2479 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
Line 
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: specrespvector.cc,v 1.10 2003-03-10 15:13:49 ansari Exp $
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"
18#include <iostream>
19#include <math.h>
20// #include <typeinfo>
21
22#include "specrespvector.h"
23#include "pexceptions.h"
24#include "fioarr.h"
25//----------------
26// Constructor --
27//----------------
28/*!
29 * \class SOPHYA::SpecRespVec
30 \ingroup SkyT
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*/
35SpecRespVec::SpecRespVec()
36 : SpectralResponse()
37{
38}
39
40/*! Constructor:
41 \param nu vector of the frequencies
42 \param fdenu vector of the corresponding transmission values of the filter
43*/
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;
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;
62 _numin = nu(0);
63 _numax = nu(nu.NElts()-1);
64 _size = nu.NElts();
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
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*/
86double
87SpecRespVec::transmission(double nu) const
88{
89 if ( (nu < _numin) || (nu > _numax) ) return(0.);
90 double value = 0.;
91 int sizeVecOfNu = _vecOfNu.NElts();
92 if(nu <= _vecOfNu(0)) return _vecOfFDeNu(0);
93 if(nu >= _vecOfNu(sizeVecOfNu-1)) return _vecOfFDeNu(sizeVecOfNu-1);
94
95 for (int i=1; i<sizeVecOfNu; i++)
96 {
97 if(nu < _vecOfNu(i))
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}
124
125
126DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
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
145 // TVector<T> has Persistence Manager
146 s << dobj->getNuVec();
147 {
148 Vector& xv2 = dobj->getTNuVec();
149 cout << xv2 ;
150 FIO_TArray<double> vio2(&xv2);
151 vio2.Write(s);
152 }
153}
154
155DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
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 {
167 dobj= new SpecRespVec();
168 ownobj= true;
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
175 FIO_TArray<double> vio(&(dobj->getNuVec()));
176 vio.Read(s);
177 FIO_TArray<double> vio2(&(dobj->getTNuVec()));
178 vio2.Read(s);
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.