annotate Allan.c @ 23:65e277fdf01f

Correct DDS3 frequency adjustement on N3 measurement We need to take into account the phase locked loop divisor factor that links DDS1 frequency change to repetition rate change.
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Fri, 20 Jul 2012 16:50:11 +0200
parents d9aae7d7f2c6
children 0e9f95525a8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
1 #include <ansi_c.h>
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
2 #include <userint.h>
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
3
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
4 #include "YLCStuff.h"
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
5
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
6 #include "FXAllan.h" // Auto generated panel definitions and protypes
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
7 #include "Allan.h" // My own .h file, containing prototypes and definitions for the class Allan...
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
8
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
9
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
10
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
11 // ******************* Member functions : constructor and destructor *************************
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
12
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
13 int Allan_InitPanel(Allan_Data * Instance, char * title, double Normalizer, void (*OnCloseFunc)(int)) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
14
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
15 int i ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
16
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
17 if ((Instance->AllanPanel = LoadPanel (0, "FXAllan.uir", ALLANPANEL)) < 0)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
18 return -1;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
19 SetPanelAttribute(Instance->AllanPanel, ATTR_TITLE, title) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
20 SetPanelAttribute (Instance->AllanPanel, ATTR_CALLBACK_DATA, (void *)Instance); // the panel callback therefore knows which data structure it is associated to
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
21 Instance->OnClosePanel = OnCloseFunc ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
22 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
23 Instance->AllanVar[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
24 Instance->LastMean[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
25 Instance->BlocksNumber[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
26 Instance->CurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
27 Instance->NbCurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
28 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
29 Instance->Drift = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
30 DisplayPanel (Instance->AllanPanel);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
31 SetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, Normalizer) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
32 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
33 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
34
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
35
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
36
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
37 int Allan_ClosePanel(Allan_Data * Instance) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
38 Instance->OnClosePanel(Instance->AllanPanel) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
39 DiscardPanel (Instance->AllanPanel);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
40 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
41 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
42
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
43
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
44
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
45 // ******************** Member functions, callbacks (private) *******************************
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
46
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
47
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
48 int CVICALLBACK Allan_CB_Reset(int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
49 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
50 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
51 int i ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
52 Allan_Data * Instance = NULL;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
53
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
54 switch(event) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
55
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
56 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
57 GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
58 Allan_Reset(Instance) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
59 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
60
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
61 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
62
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
63 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
64 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
65
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
66 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
67 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
68
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
69 int CVICALLBACK Allan_CB_ChangeMax (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
70 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
71 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
72 int YMin, YMax ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
73
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
74 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
75 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
76 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
77 GetCtrlVal(panel, ALLANPANEL_MIN, &YMin) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
78 GetCtrlVal(panel, ALLANPANEL_MAX, &YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
79 if (YMin<YMax) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
80 SetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, pow(10,(double)YMin), pow(10,(double)YMax) ) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
81 SetCtrlVal(panel, ALLANPANEL_CHECKBOX_AUTOSCALE, FALSE) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
82 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
83 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
84
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
85 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
86
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
87 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
88 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
89 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
90 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
91
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
92 int CVICALLBACK Allan_CB_ChangeMin (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
93 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
94 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
95 int YMin, YMax ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
96
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
97 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
98 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
99 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
100 GetCtrlVal(panel, ALLANPANEL_MIN, &YMin) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
101 GetCtrlVal(panel, ALLANPANEL_MAX, &YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
102 if (YMin<YMax ) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
103 SetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, pow(10,(double)YMin), pow(10,(double)YMax) ) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
104 SetCtrlVal(panel, ALLANPANEL_CHECKBOX_AUTOSCALE, FALSE) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
105 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
106 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
107
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
108 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
109
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
110 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
111 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
112 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
113 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
114
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
115
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
116 int CVICALLBACK Allan_CB_ChangeAutoScale (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
117 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
118 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
119 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
120 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
121
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
122
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
123 int CVICALLBACK Allan_CB_ChangeNormalizer (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
124 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
125 { /*
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
126 bool AutoScale = FALSE;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
127 int NotCare = 20000000 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
128 double YMin = 10000000 , YMax = 64000000 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
129
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
130 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
131 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
132 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
133 GetCtrlVal(panel, ALLANPANEL_CHECKBOX_AUTOSCALE, &AutoScale) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
134 if (AutoScale) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
135 SetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT, VAL_LEFT_YAXIS, VAL_AUTOSCALE, YMin, YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
136 GetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT,VAL_LEFT_YAXIS, &NotCare, &YMin, &YMax ) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
137 SetCtrlVal(panel, ALLANPANEL_MIN, YMin);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
138 SetCtrlVal(panel, ALLANPANEL_MAX, YMax);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
139 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
140 else {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
141 GetCtrlVal(panel, ALLANPANEL_MIN, &YMin);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
142 GetCtrlVal(panel, ALLANPANEL_MAX, &YMax);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
143 SetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, YMin, YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
144 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
145 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
146 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
147
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
148 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
149 } */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
150 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
151 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
152
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
153
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
154
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
155 // ******************** Member functions, public *****************************************
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
156
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
157 int Allan_Reset(Allan_Data * Instance) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
158
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
159 int i ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
160
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
161 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
162 Instance->AllanVar[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
163 Instance->LastMean[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
164 Instance->BlocksNumber[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
165 Instance->CurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
166 Instance->NbCurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
167 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
168
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
169 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
170
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
171 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
172
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
173
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
174 int Allan_AddFrequency(Allan_Data * Instance, double Freq) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
175
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
176 int i, N;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
177 double CurrentMean, LastMean, Drift, Mean, Normalizer ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
178
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
179 N = Instance->BlocksNumber[0]+1 ; // the total number of points used, usefull to calculate drift rate
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
180 Mean = Instance->Mean ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
181 Drift = Instance->Drift ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
182
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
183 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, &Normalizer);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
184
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
185 if (N > 1) { // Drift measure needs at least 2 values !
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
186 Instance->Drift = (Drift*(N-2) + 6*(Freq-Mean)/N)/(N+1) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
187 SetCtrlVal(Instance->AllanPanel, ALLANPANEL_DRIFT, Instance->Drift/Normalizer ) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
188 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
189
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
190 // update mean value (usefull to calculate drift rate with linear regression incremental algorithm...)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
191 Instance->Mean = (Mean*(N-1)+Freq)/N ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
192
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
193
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
194 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
195 Instance->CurrentAverage[i] = (Instance->CurrentAverage[i]*Instance->NbCurrentAverage[i] + Freq)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
196 /(Instance->NbCurrentAverage[i]+1) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
197 Instance->NbCurrentAverage[i] +=1 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
198
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
199 if (Instance->NbCurrentAverage[i] >= pow(2,i) ) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
200
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
201 CurrentMean = Instance->CurrentAverage[i];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
202 LastMean = Instance->LastMean[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
203 N = Instance->BlocksNumber[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
204 N++ ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
205 Instance->CurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
206 Instance->NbCurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
207 if (N>1) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
208 Instance->AllanVar[i] = (Instance->AllanVar[i]*(N-2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
209 +0.5*pow(CurrentMean-LastMean,2))/(N-1) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
210 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
211 else { // ie if N=1, which is realized for the first completed block
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
212 Instance->FirstMean[i] = CurrentMean ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
213 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
214 Instance->LastMean[i] = CurrentMean ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
215 Instance->BlocksNumber[i] = N ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
216 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
217 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
218
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
219 Allan_Display(Instance, VAL_WHITE, VAL_BLUE) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
220
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
221 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
222 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
223
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
224 int Allan_Display (Allan_Data * Instance, int ColorPt, int ColorErrorBar){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
225
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
226 int PointsNumber = ALLAN_MAXPOINTSNUMBER ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
227 int i, N ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
228 double X[ALLAN_MAXPOINTSNUMBER] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
229 double Y[ALLAN_MAXPOINTSNUMBER] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
230 double Normalizer, DriftTau, FirstFreq, LastFreq, Error ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
231 bool DeDrift ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
232
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
233 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, &Normalizer) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
234 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_DEDRIFT, &DeDrift) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
235
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
236 for (i=0 ; i<PointsNumber ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
237 X[i] = pow(2,i) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
238 if (!DeDrift) { Y[i] = sqrt(Instance->AllanVar[i])/Normalizer ;}
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
239 else {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
240 DriftTau = Instance->Drift*X[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
241 N = Instance->BlocksNumber[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
242 if (N>=2) { // if enough data to calculate AVAR for tau = 2^i*tau0, and therefore, AllanVar[i] is meaningful
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
243 FirstFreq = Instance->FirstMean[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
244 LastFreq = Instance->LastMean[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
245 Y[i] = sqrt(Instance->AllanVar[i]+DriftTau*(DriftTau/2-(LastFreq-FirstFreq)/(N-1)))/Normalizer ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
246 // Not totaly sure it works... to be checked thoroughly
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
247 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
248 else { Y[i] = 0 ; } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
249 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
250 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
251
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
252 DeleteGraphPlot(Instance->AllanPanel, ALLANPANEL_ALLANPLOT, -1, VAL_IMMEDIATE_DRAW) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
253 PlotXY (Instance->AllanPanel, ALLANPANEL_ALLANPLOT, X, Y, PointsNumber,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
254 VAL_DOUBLE, VAL_DOUBLE, VAL_SCATTER, VAL_SOLID_SQUARE, VAL_SOLID, 1, ColorPt);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
255
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
256 for (i=0 ; i<PointsNumber ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
257 Error = 1/sqrt(Instance->BlocksNumber[i]) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
258 PlotLine (Instance->AllanPanel, ALLANPANEL_ALLANPLOT, X[i], Y[i]*(1-Error), X[i], Y[i]*(1+Error), ColorErrorBar);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
259 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
260
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
261
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
262 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
263 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
264
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
265 int Allan_DisplayErrorBars (Allan_Data * Instance, int color){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
266
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
267 int i;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
268 double X[ALLAN_MAXPOINTSNUMBER] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
269 double Val, Error, Normalizer;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
270
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
271 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, &Normalizer) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
272 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
273 X[i] = pow(2,i) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
274 Val = sqrt(Instance->AllanVar[i])/Normalizer ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
275 Error = 1/sqrt(Instance->BlocksNumber[i]) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
276 PlotLine (Instance->AllanPanel, ALLANPANEL_ALLANPLOT, X[i], Val*(1-Error), X[i], Val*(1+Error), color);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
277 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
278
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
279 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
280 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
281
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
282 int CVICALLBACK CB_GeneralAllanPanel (int panel, int event, void *callbackData,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
283 int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
284 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
285 Allan_Data * Instance = NULL;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
286
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
287
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
288 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
289 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
290 case EVENT_GOT_FOCUS:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
291
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
292 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
293 case EVENT_LOST_FOCUS:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
294
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
295 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
296 case EVENT_CLOSE:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
297 GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
298 Allan_ClosePanel(Instance) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
299
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
300 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
301 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
302 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
303 }