source: trunk/external-alma/components/SpectralComponents/test/tGaussianMultipletSpectralElement.cc @ 2980

Last change on this file since 2980 was 2980, checked in by Malte Marquarding, 10 years ago

Add a copy of casacore/components/SpectralComponents to external-alma directory to prepare for its removal from casacore-trunk. DOn;t activate in SConscript yet.

File size: 10.2 KB
Line 
1//# tProfileFit1D.cc: test the ProfileFit1D class
2//# Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2004
3//# Associated Universities, Inc. Washington DC, USA.
4//#
5//# This program is free software; you can redistribute it and/or modify it
6//# under the terms of the GNU General Public License as published by the Free
7//# Software Foundation; either version 2 of the License, or (at your option)
8//# any later version.
9//#
10//# This program is distributed in the hope that it will be useful, but WITHOUT
11//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13//# more details.
14//#
15//# You should have received a copy of the GNU General Public License along
16//# with this program; if not, write to the Free Software Foundation, Inc.,
17//# 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18//#
19//# Correspondence concerning AIPS++ should be addressed as follows:
20//#        Internet email: aips2-request@nrao.edu.
21//#        Postal address: AIPS++ Project Office
22//#                        National Radio Astronomy Observatory
23//#                        520 Edgemont Road
24//#                        Charlottesville, VA 22903-2475 USA
25//#
26
27#include <casa/aips.h>
28#include <casa/Arrays/ArrayMath.h>
29#include <casa/Containers/Record.h>
30#include <casa/Utilities/PtrHolder.h>
31#include <components/SpectralComponents/PolynomialSpectralElement.h>
32
33#include <components/SpectralComponents/GaussianSpectralElement.h>
34#include <components/SpectralComponents/GaussianMultipletSpectralElement.h>
35#include <components/SpectralComponents/SpectralElementFactory.h>
36
37#include <casa/Utilities/Assert.h>
38#include <casa/Arrays/ArrayIO.h>
39
40#include <casa/Arrays/Vector.h>
41
42#include <casa/iostream.h>
43
44#include <casa/namespace.h>
45
46#include <vector>
47
48int main() {
49
50        {
51                cout << "Test that exception is thrown if there is "
52                        << "a mismatch between number of Gaussians and "
53                        << "number of relationships between them" << endl;
54                GaussianSpectralElement g1(4,4,4);
55                GaussianSpectralElement g2(5,5,5);
56                vector<GaussianSpectralElement> doublet(2);
57                doublet[0] = g1;
58                doublet[1] = g2;
59                Matrix<Double> relations(2, 3, 0);
60                relations(0,0) = 4;
61                Bool result = True;
62                try {
63                        GaussianMultipletSpectralElement(doublet, relations);
64                        result = False;
65                }
66                catch (AipsError) {}
67                AlwaysAssert(result, AipsError);
68        }
69        {
70                cout << "Test that exception is thrown if relations "
71                        << "does not have three columns" << endl;
72                GaussianSpectralElement g1(4, 4, 4);
73                GaussianSpectralElement g2(5, 5, 5);
74                vector<GaussianSpectralElement> doublet(2);
75                doublet[0] = g1;
76                doublet[1] = g2;
77                Matrix<Double> relations(1, 4, 0);
78                relations(0,0) = 4;
79                Bool result = True;
80                try {
81                        GaussianMultipletSpectralElement(doublet, relations);
82                        result = False;
83                }
84                catch (AipsError) {}
85                AlwaysAssert(result, AipsError);
86        }
87        {
88                cout << "Test that exception is thrown if there is "
89                        << "an amplitude fixing incompatibility" << endl;
90                GaussianSpectralElement g1(4, 4, 4);
91                GaussianSpectralElement g2(5, 5, 5);
92                g2.fixAmpl();
93                cout << "g1 " << g1 << endl;
94                cout << "g2 " << g2 << endl;
95                std::vector<GaussianSpectralElement> doublet(2);
96                doublet[0] = g1;
97                cout << "doub 0 " << doublet[0] << " " << &doublet[0]  << endl;
98                cout << "doub 1 " << doublet[1] << " " << &doublet[1] << endl;
99
100                doublet[1] = g2;
101                cout << "doub 0 " << doublet[0] << " " << &doublet[0]  << endl;
102                cout << "doub 1 " << doublet[1] << " " << &doublet[1] << endl;
103                cout << "g1 " << g1 << endl;
104                                cout << "g2 " << g2 << endl;
105                Matrix<Double> relations(1, 3, 0);
106                relations(0,0) = 4;
107                Bool result = True;
108                try {
109                        GaussianMultipletSpectralElement(doublet, relations);
110                        result = False;
111                }
112                catch (AipsError x) {}
113                AlwaysAssert(result, AipsError);
114        }
115        {
116                cout << "Test that exception is thrown if there is "
117                        << "a center fixing incompatibility" << endl;
118                GaussianSpectralElement g1(4, 4, 4);
119                GaussianSpectralElement g2(5, 5, 5);
120                g2.fixCenter();
121                vector<GaussianSpectralElement> doublet(2);
122                doublet[0] = g1;
123                doublet[1] = g2;
124                Matrix<Double> relations(1, 3, 0);
125                relations(0,1) = 4;
126                Bool result = True;
127                try {
128                        GaussianMultipletSpectralElement(doublet, relations);
129                        result = False;
130                }
131                catch (AipsError x) {}
132                AlwaysAssert(result, AipsError);
133        }
134        {
135                cout << "Test that exception is thrown if there is "
136                        << "a width fixing incompatibility" << endl;
137                GaussianSpectralElement g1(4, 4, 4);
138                GaussianSpectralElement g2(5, 5, 5);
139                g2.fixFWHM();
140                vector<GaussianSpectralElement> doublet(2);
141                doublet[0] = g1;
142                doublet[1] = g2;
143                Matrix<Double> relations(1, 3, 0);
144                relations(0, 2) = 4;
145                Bool result = True;
146                try {
147                        GaussianMultipletSpectralElement(doublet, relations);
148                        result = False;
149                }
150                catch (AipsError x) {}
151                AlwaysAssert(result, AipsError);
152        }
153        {
154                cout << "Test gaussians were correctly constructed " << endl;
155                GaussianSpectralElement g1(4, 4.4, 4.6);
156                GaussianSpectralElement g2(5, 5.2, 5.8);
157                vector<GaussianSpectralElement> gaussians(2);
158                gaussians[0] = g1;
159                gaussians[1] = g2;
160                Matrix<Double> relations(1, 3, 0);
161                Double ampRatio = 4.5;
162                relations(0, 0) = ampRatio;
163                GaussianMultipletSpectralElement doublet(gaussians, relations);
164                for (uInt i=0; i<gaussians.size(); i++) {
165                        Vector<Double> expected = gaussians[i].get();
166                        if (i==1) {
167                                expected[0] = ampRatio*gaussians[0].getAmpl();
168                        }
169                        Vector<Double> got = doublet.getGaussians()[i].get();
170                        cout << "*** got " << got << endl;
171                        cout << "*** exp " << expected << endl;
172                        AlwaysAssert(allTrue(got == expected), AipsError);
173                }
174
175                relations = 0;
176                Double centerOff = -20;
177                relations(0, 1) = centerOff;
178                doublet = GaussianMultipletSpectralElement(gaussians, relations);
179                for (uInt i=0; i<gaussians.size(); i++) {
180                        Vector<Double> expected = gaussians[i].get();
181                        if (i==1) {
182                                expected[1] = centerOff + gaussians[0].getCenter();
183                        }
184                        Vector<Double> got = doublet.getGaussians()[i].get();
185                        AlwaysAssert(allTrue(got == expected), AipsError);
186                }
187                relations = 0;
188                Vector<Double> x(5, 2);
189                Double sigmaRatio = 0.5;
190                relations(0, 2) = sigmaRatio;
191                doublet = GaussianMultipletSpectralElement(gaussians, relations);
192                for (uInt i=0; i<gaussians.size(); i++) {
193                        Vector<Double> expected = gaussians[i].get();
194                        if (i==1) {
195                                expected[2] = sigmaRatio * gaussians[0].getSigma();
196                        }
197                        Vector<Double> got = doublet.getGaussians()[i].get();
198                        AlwaysAssert(allTrue(got == expected), AipsError);
199                }
200        }
201        {
202                cout << "Test toRecord()/fromRecord()" << endl;
203                GaussianSpectralElement g1(4.6, 4.5, 4.4);
204                GaussianSpectralElement g2(5.6, 5.2, 5.5);
205                vector<GaussianSpectralElement> gaussians(2);
206                gaussians[0] = g1;
207                gaussians[1] = g2;
208                Matrix<Double> relations(1, 3, 0);
209                relations(0, 2) = 4;
210                GaussianMultipletSpectralElement doublet(gaussians, relations);
211                Record myRec;
212                cout << "doublet real " << doublet << endl;
213                doublet.toRecord(myRec);
214                cout << "myrec " << myRec << endl;
215        cout << __FILE__ << " " << __LINE__ << endl;
216                PtrHolder<SpectralElement> ptr(SpectralElementFactory::fromRecord(myRec));
217        cout << __FILE__ << " " << __LINE__ << endl;
218                GaussianMultipletSpectralElement out = *dynamic_cast<GaussianMultipletSpectralElement*>(
219                        ptr.ptr()
220                );
221        cout << __FILE__ << " " << __LINE__ << endl;
222                cout << "out " << out << endl;
223                cout << "doublet " << doublet << endl;
224                AlwaysAssert(out == doublet, AipsError);
225        }
226        {
227                cout << "Test setting/getting" << endl;
228                GaussianSpectralElement g1(4.6, 4.5, 4.4);
229                GaussianSpectralElement g2(5.6, 5.2, 5.5);
230                GaussianSpectralElement g3(6.6, 6.2, 6.5);
231
232                Vector<Double> errs(3, 0);
233                errs[0] = 0.1;
234                errs[1] = 0.2;
235                errs[2] = 0.3;
236                g1.setError(errs);
237                Vector<Bool> fixed(3, False);
238                fixed[1] = True;
239                g1.fix(fixed);
240
241
242                vector<GaussianSpectralElement> gaussians(3);
243                gaussians[0] = g1;
244                gaussians[1] = g2;
245                gaussians[2] = g3;
246
247                Matrix<Double> relations(2, 3, 0);
248                relations(0, 2) = 4;
249                relations(1, 1) = 10;
250                GaussianMultipletSpectralElement triplet(gaussians, relations);
251
252                Vector<Double> g(7, 0);
253                uInt j = 0;
254                for (uInt i=0; i<9; i++) {
255                        if (i != 5 && i != 7) {
256                                g[j] = gaussians[i/3].get()[i%3];
257                                j++;
258                        }
259                }
260                AlwaysAssert(allNear(triplet.get(), g, 1e-8), AipsError);
261                AlwaysAssert(
262                        allNear(
263                                gaussians[0].get(), triplet.getGaussians()[0].get(), 1e-8
264                        ), AipsError
265                );
266                AlwaysAssert(
267                        allNear(
268                                gaussians[0].getError(), triplet.getGaussians()[0].getError(), 1e-8
269                        ), AipsError
270                );
271                AlwaysAssert(
272                        allTrue(
273                                gaussians[0].fixed() == triplet.getGaussians()[0].fixed()
274                        ), AipsError
275                );
276                Vector<Double> z = gaussians[1].get();
277                z[2] = relations(0, 2) * gaussians[0].getSigma();
278                Vector<Double> err = gaussians[1].getError();
279                err[2] = relations(0, 2) * gaussians[0].getSigmaErr();
280                AlwaysAssert(
281                        allNear(
282                                z, triplet.getGaussians()[1].get(), 1e-8
283                        ), AipsError
284                );
285                AlwaysAssert(
286                        allNear(
287                                err, triplet.getGaussians()[1].getError(), 1e-8
288                        ), AipsError
289                );
290                AlwaysAssert(
291                        allTrue(
292                                gaussians[1].fixed() == triplet.getGaussians()[1].fixed()
293                        ), AipsError
294                );
295                z = gaussians[2].get();
296                z[1] = relations(1, 1) + gaussians[0].getCenter();
297                err = gaussians[2].getError();
298                err[1] = gaussians[0].getCenterErr();
299                AlwaysAssert(
300                        allNear(
301                                z, triplet.getGaussians()[2].get(), 1e-8
302                        ), AipsError
303                );
304                AlwaysAssert(
305                        allNear(
306                                err, triplet.getGaussians()[2].getError(), 1e-8
307                        ), AipsError
308                );
309                cout << gaussians[2].fixed() << endl;
310                cout << triplet.getGaussians()[2].fixed() << endl;
311                cout << fixed << endl;
312                AlwaysAssert(
313                        allTrue(
314                                triplet.getGaussians()[2].fixed() == fixed
315                        ), AipsError
316                );
317                cout << triplet.getFunction() << endl;
318                Vector<Double> parms(7);
319                for (uInt i=0; i < parms.size(); i++) {
320                        parms[i] = 10+i;
321                }
322                triplet.set(parms);
323
324                AlwaysAssert(
325                        allNear(
326                                triplet.get(), parms, 1e-5
327                        ), AipsError
328                );
329                Vector<Double> exp(3);
330                exp[0] = parms[0];
331                exp[1] = parms[1];
332                exp[2] = parms[2];
333                AlwaysAssert(
334                        allNear(
335                                triplet.getGaussians()[0].get(), exp, 1e-5
336                        ), AipsError
337                );
338                exp[0] = parms[3];
339                exp[1] = parms[4];
340                exp[2] = relations(0, 2) * parms[2];
341                AlwaysAssert(
342                        allNear(
343                                triplet.getGaussians()[1].get(), exp, 1e-5
344                        ), AipsError
345                );
346                exp[0] = parms[5];
347                exp[1] = relations(1, 1) + parms[1];
348                exp[2] = parms[6];
349                AlwaysAssert(
350                        allNear(
351                                triplet.getGaussians()[2].get(), exp, 1e-5
352                        ), AipsError
353                );
354
355
356
357
358
359        }
360        cout << "ok" << endl;
361        return 0;
362
363
364}
Note: See TracBrowser for help on using the repository browser.