annotate Allan.c @ 120:84fb0796936b

Add KK counter measurement interval synchronization to PPS trigger
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Tue, 17 Sep 2013 14:18:20 +0200
parents 0e9f95525a8f
children bd28161e5ac2
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 Allan_Data * Instance = NULL;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
52
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
53 switch(event) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
54
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
55 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
56 GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
57 Allan_Reset(Instance) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
58 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
59
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
60 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
61
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
62 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
63 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
64
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
65 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
66 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
67
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
68 int CVICALLBACK Allan_CB_ChangeMax (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
69 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
70 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
71 int YMin, YMax ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
72
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
73 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
74 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
75 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
76 GetCtrlVal(panel, ALLANPANEL_MIN, &YMin) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
77 GetCtrlVal(panel, ALLANPANEL_MAX, &YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
78 if (YMin<YMax) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
79 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
80 SetCtrlVal(panel, ALLANPANEL_CHECKBOX_AUTOSCALE, FALSE) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
81 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
82 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
83
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
84 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
85
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
86 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
87 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
88 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
89 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
90
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
91 int CVICALLBACK Allan_CB_ChangeMin (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
92 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
93 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
94 int YMin, YMax ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
95
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
96 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
97 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
98 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
99 GetCtrlVal(panel, ALLANPANEL_MIN, &YMin) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
100 GetCtrlVal(panel, ALLANPANEL_MAX, &YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
101 if (YMin<YMax ) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
102 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
103 SetCtrlVal(panel, ALLANPANEL_CHECKBOX_AUTOSCALE, FALSE) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
104 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
105 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
106
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
107 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
108
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
109 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
110 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
111 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
112 }
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 int CVICALLBACK Allan_CB_ChangeAutoScale (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
116 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
117 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
118 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
119 }
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 int CVICALLBACK Allan_CB_ChangeNormalizer (int panel, int control, int event,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
123 void *callbackData, int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
124 { /*
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
125 bool AutoScale = FALSE;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
126 int NotCare = 20000000 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
127 double YMin = 10000000 , YMax = 64000000 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
128
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
129 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
130 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
131 case EVENT_COMMIT:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
132 GetCtrlVal(panel, ALLANPANEL_CHECKBOX_AUTOSCALE, &AutoScale) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
133 if (AutoScale) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
134 SetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT, VAL_LEFT_YAXIS, VAL_AUTOSCALE, YMin, YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
135 GetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT,VAL_LEFT_YAXIS, &NotCare, &YMin, &YMax ) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
136 SetCtrlVal(panel, ALLANPANEL_MIN, YMin);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
137 SetCtrlVal(panel, ALLANPANEL_MAX, YMax);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
138 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
139 else {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
140 GetCtrlVal(panel, ALLANPANEL_MIN, &YMin);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
141 GetCtrlVal(panel, ALLANPANEL_MAX, &YMax);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
142 SetAxisScalingMode(panel, ALLANPANEL_ALLANPLOT, VAL_LEFT_YAXIS, VAL_MANUAL, YMin, YMax) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
143 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
144 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
145 case EVENT_RIGHT_CLICK:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
146
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
147 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
148 } */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
149 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
150 }
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 // ******************** Member functions, public *****************************************
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
155
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
156 int Allan_Reset(Allan_Data * Instance) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
157
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
158 int i ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
159
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
160 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
161 Instance->AllanVar[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
162 Instance->LastMean[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
163 Instance->BlocksNumber[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
164 Instance->CurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
165 Instance->NbCurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
166 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
167
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
168 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
169
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 int Allan_AddFrequency(Allan_Data * Instance, double Freq) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
174
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
175 int i, N;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
176 double CurrentMean, LastMean, Drift, Mean, Normalizer ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
177
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
178 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
179 Mean = Instance->Mean ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
180 Drift = Instance->Drift ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
181
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
182 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, &Normalizer);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
183
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
184 if (N > 1) { // Drift measure needs at least 2 values !
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
185 Instance->Drift = (Drift*(N-2) + 6*(Freq-Mean)/N)/(N+1) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
186 SetCtrlVal(Instance->AllanPanel, ALLANPANEL_DRIFT, Instance->Drift/Normalizer ) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
187 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
188
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
189 // update mean value (usefull to calculate drift rate with linear regression incremental algorithm...)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
190 Instance->Mean = (Mean*(N-1)+Freq)/N ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
191
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
192
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
193 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
194 Instance->CurrentAverage[i] = (Instance->CurrentAverage[i]*Instance->NbCurrentAverage[i] + Freq)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
195 /(Instance->NbCurrentAverage[i]+1) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
196 Instance->NbCurrentAverage[i] +=1 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
197
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
198 if (Instance->NbCurrentAverage[i] >= pow(2,i) ) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
199
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
200 CurrentMean = Instance->CurrentAverage[i];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
201 LastMean = Instance->LastMean[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
202 N = Instance->BlocksNumber[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
203 N++ ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
204 Instance->CurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
205 Instance->NbCurrentAverage[i] = 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
206 if (N>1) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
207 Instance->AllanVar[i] = (Instance->AllanVar[i]*(N-2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
208 +0.5*pow(CurrentMean-LastMean,2))/(N-1) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
209 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
210 else { // ie if N=1, which is realized for the first completed block
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
211 Instance->FirstMean[i] = CurrentMean ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
212 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
213 Instance->LastMean[i] = CurrentMean ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
214 Instance->BlocksNumber[i] = N ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
215 } ;
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 Allan_Display(Instance, VAL_WHITE, VAL_BLUE) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
219
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
220 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
221 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
222
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
223 int Allan_Display (Allan_Data * Instance, int ColorPt, int ColorErrorBar){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
224
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
225 int PointsNumber = ALLAN_MAXPOINTSNUMBER ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
226 int i, N ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
227 double X[ALLAN_MAXPOINTSNUMBER] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
228 double Y[ALLAN_MAXPOINTSNUMBER] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
229 double Normalizer, DriftTau, FirstFreq, LastFreq, Error ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
230 bool DeDrift ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
231
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
232 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, &Normalizer) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
233 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_DEDRIFT, &DeDrift) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
234
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
235 for (i=0 ; i<PointsNumber ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
236 X[i] = pow(2,i) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
237 if (!DeDrift) { Y[i] = sqrt(Instance->AllanVar[i])/Normalizer ;}
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
238 else {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
239 DriftTau = Instance->Drift*X[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
240 N = Instance->BlocksNumber[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
241 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
242 FirstFreq = Instance->FirstMean[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
243 LastFreq = Instance->LastMean[i] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
244 Y[i] = sqrt(Instance->AllanVar[i]+DriftTau*(DriftTau/2-(LastFreq-FirstFreq)/(N-1)))/Normalizer ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
245 // Not totaly sure it works... to be checked thoroughly
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
246 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
247 else { Y[i] = 0 ; } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
248 } ;
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 DeleteGraphPlot(Instance->AllanPanel, ALLANPANEL_ALLANPLOT, -1, VAL_IMMEDIATE_DRAW) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
252 PlotXY (Instance->AllanPanel, ALLANPANEL_ALLANPLOT, X, Y, PointsNumber,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
253 VAL_DOUBLE, VAL_DOUBLE, VAL_SCATTER, VAL_SOLID_SQUARE, VAL_SOLID, 1, ColorPt);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
254
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
255 for (i=0 ; i<PointsNumber ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
256 Error = 1/sqrt(Instance->BlocksNumber[i]) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
257 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
258 } ;
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 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
262 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
263
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
264 int Allan_DisplayErrorBars (Allan_Data * Instance, int color){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
265
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
266 int i;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
267 double X[ALLAN_MAXPOINTSNUMBER] ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
268 double Val, Error, Normalizer;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
269
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
270 GetCtrlVal(Instance->AllanPanel, ALLANPANEL_NORMALIZER, &Normalizer) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
271 for (i=0 ; i<ALLAN_MAXPOINTSNUMBER ; i++) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
272 X[i] = pow(2,i) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
273 Val = sqrt(Instance->AllanVar[i])/Normalizer ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
274 Error = 1/sqrt(Instance->BlocksNumber[i]) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
275 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
276 } ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
277
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
278 return 0 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
279 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
280
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
281 int CVICALLBACK CB_GeneralAllanPanel (int panel, int event, void *callbackData,
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
282 int eventData1, int eventData2)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
283 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
284 Allan_Data * Instance = NULL;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
285
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
286
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
287 switch (event)
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
288 {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
289 case EVENT_GOT_FOCUS:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
290
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
291 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
292 case EVENT_LOST_FOCUS:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
293
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
294 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
295 case EVENT_CLOSE:
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
296 GetPanelAttribute (panel, ATTR_CALLBACK_DATA, &Instance);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
297 Allan_ClosePanel(Instance) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
298
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
299 break;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
300 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
301 return 0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
302 }