TPCCLIB
Toggle main menu visibility
Loading...
Searching...
No Matches
libtpctac
tacnan.c
Go to the documentation of this file.
1
4
/*****************************************************************************/
5
#include "tpcclibConfig.h"
6
/*****************************************************************************/
7
#include "
tpcift.h
"
8
/*****************************************************************************/
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <math.h>
12
#include <time.h>
13
#include <string.h>
14
/*****************************************************************************/
15
#include "
tpctac.h
"
16
/*****************************************************************************/
17
18
/*****************************************************************************/
23
int
tacXNaNs
(
25
TAC
*tac
26
) {
27
if
(tac==NULL || tac->
sampleNr
<1)
return
(0);
28
29
int
fi, nan_nr=0;
30
if
(tac->
isframe
) {
31
for
(fi=0; fi<tac->
sampleNr
; fi++) {
32
if
(!isfinite(tac->
x1
[fi])) nan_nr++;
33
if
(!isfinite(tac->
x2
[fi])) nan_nr++;
34
}
35
}
else
{
36
for
(fi=0; fi<tac->
sampleNr
; fi++) {
37
if
(!isfinite(tac->
x
[fi])) nan_nr++;
38
}
39
}
40
return
(nan_nr);
41
}
42
/*****************************************************************************/
47
int
tacYNaNs
(
49
TAC
*tac,
51
const
int
i
52
) {
53
if
(tac==NULL || tac->
sampleNr
<1 || tac->
tacNr
<1 || i>=tac->
tacNr
)
return
(0);
54
55
int
ri, fi, nan_nr=0;
56
if
(i>=0) {
57
for
(fi=0; fi<tac->
sampleNr
; fi++)
58
if
(!isfinite(tac->
c
[i].
y
[fi])) nan_nr++;
59
return
(nan_nr);
60
}
61
for
(ri=0; ri<tac->
tacNr
; ri++)
62
for
(fi=0; fi<tac->
sampleNr
; fi++)
63
if
(!isfinite(tac->
c
[ri].
y
[fi])) nan_nr++;
64
return
(nan_nr);
65
}
66
/*****************************************************************************/
71
int
tacNaNs
(
73
TAC
*tac
74
) {
75
return
(
tacXNaNs
(tac)+
tacYNaNs
(tac, -1));
76
}
77
/*****************************************************************************/
78
79
/*****************************************************************************/
84
int
tacNotNaNs
(
86
TAC
*tac,
88
const
int
i
89
) {
90
if
(tac==NULL || tac->
sampleNr
<1 || tac->
tacNr
<1 || i>=tac->
tacNr
)
return
(0);
91
92
int
ri, fi, nan_nr=0;
93
for
(fi=0; fi<tac->
sampleNr
; fi++) {
94
/* First, check x value(s) */
95
if
(tac->
isframe
) {
96
if
(!isfinite(tac->
x1
[fi])) {nan_nr++;
continue
;}
97
if
(!isfinite(tac->
x2
[fi])) {nan_nr++;
continue
;}
98
}
else
{
99
if
(!isfinite(tac->
x
[fi])) {nan_nr++;
continue
;}
100
}
101
/* If ok, then check y value(s) */
102
if
(i>=0) {
103
if
(!isfinite(tac->
c
[i].
y
[fi])) nan_nr++;
104
continue
;
105
}
106
for
(ri=0; ri<tac->
tacNr
; ri++)
107
if
(!isfinite(tac->
c
[ri].
y
[fi])) {nan_nr++;
break
;}
108
}
// next sample
109
return
(tac->
sampleNr
-nan_nr);
110
}
111
/*****************************************************************************/
112
113
/*****************************************************************************/
121
int
tacFixNaNs
(
123
TAC
*tac
124
) {
125
if
(tac==NULL || tac->
sampleNr
<1 || tac->
tacNr
<1)
return
(1);
126
if
(
tacXNaNs
(tac)>0)
return
(2);
127
128
int
ri, fi, fj;
129
double
x1, x2, y1, y2, x, y;
130
/* If NaNs with negative sample times, then set value to zero */
131
for
(fi=0; fi<tac->
sampleNr
; fi++) {
132
if
(tac->
isframe
) x=0.5*(tac->
x1
[fi]+tac->
x2
[fi]);
else
x=tac->
x
[fi];
133
if
(x>0.0)
continue
;
134
for
(ri=0; ri<tac->
tacNr
; ri++)
135
if
(!isfinite(tac->
c
[ri].
y
[fi])) tac->
c
[ri].
y
[fi]=0.0;
136
}
137
/* Go through the data, finding previous and next good value */
138
for
(ri=0; ri<tac->
tacNr
; ri++)
if
(
tacYNaNs
(tac, ri)>0) {
139
x1=x2=y1=y2=nan(
""
);
140
for
(fi=0; fi<tac->
sampleNr
; fi++) {
141
if
(tac->
isframe
) x=0.5*(tac->
x1
[fi]+tac->
x2
[fi]);
else
x=tac->
x
[fi];
142
/* Save previous good point */
143
if
(isfinite(tac->
c
[ri].
y
[fi])) {y1=tac->
c
[ri].
y
[fi]; x1=x;
continue
;}
144
/* We have missing value if we are here */
145
/* Search for the next good point after this NaN */
146
x2=y2=nan(
""
);
147
for
(fj=fi+1; fj<tac->
sampleNr
; fj++) {
148
if
(!isfinite(tac->
c
[ri].
y
[fj]))
continue
;
149
if
(tac->
isframe
) x2=0.5*(tac->
x1
[fj]+tac->
x2
[fj]);
else
x2=tac->
x
[fj];
150
y2=tac->
c
[ri].
y
[fj];
151
break
;
152
}
153
/* If no good points after current point, then that is bad */
154
if
(!isfinite(x2))
return
(3);
155
/* If the point before is not available, then use (0,0) */
156
if
(!isfinite(x1)) x1=y1=0.0;
157
/* Now, interpolate value for current point */
158
if
(x2==x1) y=0.5*(y1+y2);
else
y=y2-(x2-x)*(y2-y1)/(x2-x1);
159
tac->
c
[ri].
y
[fi]=y;
160
}
// next sample
161
}
// next TAC
162
163
return
(0);
164
}
165
/*****************************************************************************/
166
167
/*****************************************************************************/
173
int
tacNthSample
(
175
TAC
*tac,
178
const
int
sn,
180
const
int
i
181
) {
182
if
(tac==NULL || tac->
sampleNr
<1 || tac->
tacNr
<1 || i>=tac->
tacNr
)
return
(-1);
183
if
(sn<1 || sn>tac->
sampleNr
)
return
(-1);
184
185
int
ri, fi, n=0;
186
for
(fi=0; fi<tac->
sampleNr
; fi++) {
187
/* First, check x value(s) */
188
if
(tac->
isframe
) {
189
if
(!isfinite(tac->
x1
[fi]) || !isfinite(tac->
x2
[fi]))
continue
;
190
}
else
{
191
if
(!isfinite(tac->
x
[fi]))
continue
;
192
}
193
/* If ok, then check y value(s) */
194
if
(i>=0) {
195
if
(!isfinite(tac->
c
[i].
y
[fi]))
continue
;
196
}
else
{
197
for
(ri=0; ri<tac->
tacNr
; ri++)
if
(!isfinite(tac->
c
[ri].
y
[fi]))
break
;
198
if
(ri!=tac->
tacNr
)
continue
;
199
}
200
n++;
201
if
(n==sn)
return
(fi);
202
}
// next sample, if necessary
203
return
(-1);
204
}
205
/*****************************************************************************/
206
207
/*****************************************************************************/
TACC::y
double * y
Definition
tpctac.h:75
TAC
Definition
tpctac.h:87
TAC::x
double * x
Definition
tpctac.h:97
TAC::sampleNr
int sampleNr
Definition
tpctac.h:89
TAC::isframe
int isframe
Definition
tpctac.h:95
TAC::c
TACC * c
Definition
tpctac.h:117
TAC::x2
double * x2
Definition
tpctac.h:101
TAC::x1
double * x1
Definition
tpctac.h:99
TAC::tacNr
int tacNr
Definition
tpctac.h:91
tacNaNs
int tacNaNs(TAC *tac)
Definition
tacnan.c:71
tacYNaNs
int tacYNaNs(TAC *tac, const int i)
Definition
tacnan.c:47
tacNthSample
int tacNthSample(TAC *tac, const int sn, const int i)
Definition
tacnan.c:173
tacNotNaNs
int tacNotNaNs(TAC *tac, const int i)
Definition
tacnan.c:84
tacXNaNs
int tacXNaNs(TAC *tac)
Definition
tacnan.c:23
tacFixNaNs
int tacFixNaNs(TAC *tac)
Definition
tacnan.c:121
tpcift.h
Header file for library libtpcift.
tpctac.h
Header file for library libtpctac.
Generated on
for TPCCLIB by
1.17.0