OPAL (Object Oriented Parallel Accelerator Library)  2024.1
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 
18 extern 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 
48 int 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 
140 int 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 }
int lombAnalysis(double *x, double *y, int Ndat, int nhis)
Definition: Ctunes.cpp:140
Definition: lomb.h:20
std::vector< LOMB_TYPE >::const_iterator CI_lt
Definition: lomb.h:17
double hifac
Definition: Ctunes.h:16
virtual ~TUNE_class(void)
Definition: Ctunes.cpp:36
double y
Definition: lomb.h:14
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
TUNE_class()
Definition: Ctunes.cpp:23
Definition: Inform.h:42
double x
Definition: lomb.h:14
double Qmin
Definition: Ctunes.h:17
double ofac
Definition: Ctunes.h:16
Definition: lomb.h:13
double Qmax
Definition: Ctunes.h:17
Inform * gmsg
Definition: Main.cpp:70