OPAL (Object Oriented Parallel Accelerator Library) 2024.2
OPAL
Ctunes.cpp
Go to the documentation of this file.
1/*****************************************************************************/
2/* */
3/* Class TUNE */
4/* ============== */
5/* */
6/* ASM, September 2001 */
7/*****************************************************************************/
8#include <algorithm>
9#include <memory>
10#include <vector>
11#include <cstring>
12
13#include "Utility/Inform.h"
14
15#include "Algorithms/Ctunes.h"
16#include "Algorithms/lomb.h"
17
18extern Inform *gmsg;
19
20//RANLIB_class rndm(265314159,4);
21
22
24 ofac(0.0),
25 hifac(0.0),
26 Qmin(0.0),
27 Qmax(0.0)
28/*---------------------------------------------------------------------------*
29 * constructor
30 * ===========
31 *
32 *---------------------------------------------------------------------------*/
33{
34}
35
37/*---------------------------------------------------------------------------*
38 * destructor
39 * ==========
40 *
41 *---------------------------------------------------------------------------*/
42{
43
44 // Do nothing......
45
46}
47
48int TUNE_class::lombAnalysis(std::vector<double> &x, std::vector<double> &y, int /*nhis*/, double Norm)
49/*-----------------------------------------------------------------------------
50 * Launch Lomb analysis and plot results
51 * =======================================
52 *
53 *---------------------------------------------------------------------------*/
54{
55
56 int Ndat = x.size();
57 int i, nout, jmax;
58 int pairc;
59 int datcnt = 0;
60 int stat = 0;
61 double prob, probi;
62 double tofac = 0.8;
63
64 LOMB_TYPE tlom;
65
66 CI_lt p, q;
67
68 std::vector<LOMB_TYPE> lodata, lodata2;
69 /*---------------------------------------------------------------------------*/
70
71 /*
72 * Do Lomb analysis
73 * ================
74 */
75
76 for(int j = 0; j < Ndat; j++) {
77 tlom.x = x[j];
78 tlom.y = y[j];
79 lodata.push_back(tlom);
80 }
81
82 p = lodata.begin();
83 q = lodata.end();
84
85 datcnt = (int) count_if(p, q, Lomb_eq(0.));
86
87 if(datcnt > (q - p - 10)) {
88 *gmsg << "* Just found " << datcnt << " data points that are == 0!" << endl;
89 return(-1);
90 }
91
92 // this parameterset works ok in most cases.....
93 ofac = 4.0;
94 hifac = 0.8;
95 Qmin = 0.2;
96 Qmax = 0.4;
97
98 std::unique_ptr<LOMB_class> la(new LOMB_class(1));
99
100 stat = 0;
101 stat = la->period(&lodata, &lodata2, ofac, hifac, &nout, &jmax, &prob, 0);
102 if(stat != 0) {
103 *gmsg << "* @C3ERROR: Lomb analysis failed!" << endl;
104 return(-1);
105 }
106
107 double pairx[nout];
108 double pairy[nout];
109
110 pairc = 0;
111 for(i = 0; i < nout; i++) {
112 if(lodata2[i].y > 2.) {
113 pairx[pairc] = lodata2[i].x;
114 pairy[pairc] = lodata2[i].y;
115 if((pairy[pairc] > pairy[pairc-1]) &&
116 (pairy[pairc] > lodata2[i+1].y)) {
117 probi = la->signi(&pairy[pairc], &nout, &tofac);
118 if(pairy[pairc] > 4.) {
119 *gmsg << std::fixed
120 << std::setw(12) << std::setprecision(8) << pairx[pairc]*Norm << " "
121 << std::setw(8) << std::setprecision(2) << pairy[pairc] << " "
122 << std::setw(8) << std::setprecision(3) << probi << " "
123 << i << endl;
124 }
125 }
126 pairc++;
127 }
128 }
129
130 *gmsg << "* ===> Max: "
131 << std::fixed
132 << std::setw(12) << std::setprecision(8) << lodata2[jmax].x * Norm << " "
133 << std::setw(8) << std::setprecision(2) << lodata2[jmax].y << " "
134 << endl;
135
136 return(0);
137}
138
139
140int TUNE_class::lombAnalysis(double *x, double *y, int Ndat, int /*nhis*/)
141/*-----------------------------------------------------------------------------
142 * Launch Lomb analysis and plot results
143 * =======================================
144 *
145 *---------------------------------------------------------------------------*/
146{
147 int i, nout, jmax;
148 int pairc;
149 int datcnt = 0;
150 int stat = 0;
151 double prob, probi;
152 double tofac = 0.8;
153
154 LOMB_TYPE tlom;
155
156 CI_lt p, q;
157
158 std::vector<LOMB_TYPE> lodata, lodata2;
159 /*---------------------------------------------------------------------------*/
160
161 *gmsg << "* TUNE_class LombAnalysis requested" << endl;
162
163 /*
164 * Do Lomb analysis
165 * ================
166 */
167
168 for(int j = 0; j < Ndat; j++) {
169 tlom.x = x[j];
170 tlom.y = y[j];
171 lodata.push_back(tlom);
172 }
173
174 p = lodata.begin();
175 q = lodata.end();
176
177 datcnt = count_if(p, q, Lomb_eq(0.));
178
179 if(datcnt > (q - p - 10)) {
180 *gmsg << "* Just found " << datcnt << "data points that are == 0!" << endl;
181 return(-1);
182 }
183
184 // this parameterset works ok in most cases.....
185 ofac = 4.0;
186 hifac = 0.8;
187 Qmin = 0.2;
188 Qmax = 0.4;
189
190 std::unique_ptr<LOMB_class> la(new LOMB_class(1));
191
192 stat = 0;
193 stat = la->period(&lodata, &lodata2, ofac, hifac, &nout, &jmax, &prob, 0);
194 if(stat != 0) {
195 *gmsg << "* @C3ERROR: Lomb analysis failed!" << endl;
196 return(-1);
197 }
198
199 *gmsg << "* =====> jmax = " << jmax << endl;
200
201 double pairx[nout];
202 double pairy[nout];
203
204 *gmsg << "* ********** Peaks in Data: **************" << endl;
205
206 /*
207 ada make histogram
208 hbook1(nhis,"Lomb data",nout,
209 (float)lodata2[0].x,
210 (float)lodata2[nout-1].x);
211
212 */
213 pairc = 0;
214 for(i = 0; i < nout; i++) {
215 /* ada book histogram
216 Hf1(nhis,(float)lodata2[i].x,(float)lodata2[i].y);
217 */
218 if(lodata2[i].y > 2.) {
219 pairx[pairc] = lodata2[i].x;
220 pairy[pairc] = lodata2[i].y;
221 if((pairy[pairc] > pairy[pairc-1]) &&
222 (pairy[pairc] > lodata2[i+1].y)) {
223 probi = la->signi(&pairy[pairc], &nout, &tofac);
224 if(pairy[pairc] > 4.) {
225 *gmsg << std::fixed
226 << std::setw(12) << std::setprecision(8) << pairx[pairc] << " "
227 << std::setw(8) << std::setprecision(2) << pairy[pairc] << " "
228 << std::setw(8) << std::setprecision(3) << probi << " "
229 << i << endl;
230 }
231 }
232 pairc++;
233 }
234 }
235
236 *gmsg << "* ===> Max: "
237 << std::fixed
238 << std::setw(12) << std::setprecision(8) << lodata2[jmax].x << " "
239 << std::setw(8) << std::setprecision(2) << lodata2[jmax].y << " "
240 << endl;
241
242 return(0);
243
244}
std::vector< LOMB_TYPE >::const_iterator CI_lt
Definition lomb.h:17
struct @200015056163273022273334152327230342020122005225 LOMB_TYPE
Inform * gmsg
Definition Main.cpp:70
Inform & endl(Inform &inf)
Definition Inform.cpp:42
double hifac
Definition Ctunes.h:16
int lombAnalysis(double *x, double *y, int Ndat, int nhis)
Definition Ctunes.cpp:140
virtual ~TUNE_class(void)
Definition Ctunes.cpp:36
double Qmax
Definition Ctunes.h:17
double Qmin
Definition Ctunes.h:17
double ofac
Definition Ctunes.h:16
Definition lomb.h:20