61 #include "ops_cmdline.h"
80 Interp(
char *ind,
char *weight );
81 int size() {
return ind.size(); }
96 FILE *iin = fopen( indf,
"r" );
97 while( fgets( buf, 8192, iin )!=NULL ) {
99 char *l1 = strdup(buf);
100 char *ptr = strtok( l1,
" " );
101 while((ptr=strtok( NULL,
" " ))) n++;
104 int *ip =
new int[n];
105 istringstream oss( buf );
106 for(
int i=0; i<n; i++ )
110 FILE *win = fopen( wf,
"r" );
111 for(
int i=0; i<ind.size(); i++ ) {
112 fgets( buf, 8192, win );
113 float *wp =
new float[n];
114 istringstream oss( buf );
115 for(
int j=0; j<n; j++ )
140 fprintf( stderr,
"Y must be an IGB file\n\n" );
144 gzFile in1 = (gzFile)(h1->
fileptr());
145 gzFile in2 = (gzFile)(h2->
fileptr());
146 FILE* out = (FILE *)(hout->
fileptr());
149 for(
int i=0; i<h1->
t(); i++ ) {
154 bool skip_second_torg =
overlap( h1, h2 );
155 for(
int i=0; i<h2->
t(); i++ ) {
158 skip_second_torg =
false;
168 fwrite( x,
sizeof(
data_t), nx, out );
169 fwrite( y,
sizeof(
data_t), ny, out );
178 static Parser hParser;
179 static bool init=
false;
182 hParser.DefineVar(
"X", x );
183 hParser.SetExpr(expr);
187 hParser.Eval(result, n);
189 catch (Parser::exception_type &e)
191 std::cerr << e.GetMsg() << std::endl;
217 hParser.DefineVar(
"X", &a );
218 hParser.DefineVar(
"Y", &b );
219 hParser.SetExpr(expr);
223 for(
int i=0; i<n; i++ ) {
226 b = x1[nc>0 ? i%nc : i];
227 y[i] = hParser.Eval();
229 catch (Parser::exception_type &e)
231 std::cerr << e.GetMsg() << std::endl;
243 int older= (t%2) ? 0 : slsz;
244 int old = older ? 0 : slsz;
247 for(
int i=0;i<slsz;i++){
248 data_t d = (x[i]-odat[old+i])/dt;
249 fwrite( &d,
sizeof(
data_t), 1, out );
252 for(
int i=0;i<slsz;i++){
253 data_t d = (x[i]-odat[older+i])/dt/2.;
254 fwrite( &d,
sizeof(
data_t), 1, out );
257 for(
int i=0;i<slsz;i++)
258 odat[older+i] = x[i];
265 for(
int i=0;i<slsz;i++){
267 data_t d = (x[i]-old[i])/dt;
268 fwrite( &d,
sizeof(
data_t), 1, out );
278 for(
int i=0;i<slsz;i++){
279 data_t datum = x[i]*a + b*y[i%nc];
280 fwrite( &datum,
sizeof(
data_t), 1, out );
288 for(
int i=0;i<slsz;i++){
289 data_t datum = x[i]*a + b*y[i];
290 fwrite( &datum,
sizeof(
data_t), 1, out );
298 for(
int c=0; c<nc; c++ ) {
300 #pragma omp parallel for reduction( +:s )
301 for(
int i=c;i<slsz;i+=nc)
303 sumf[c] = s/double(slsz);
305 fwrite( &sumf,
sizeof(sumf[0]), nc, out );
312 #pragma omp parallel for
313 for(
int i=0; i<
sum.size(); i++){
314 sum[i] += fac * x[i];
320 #pragma omp parallel for
321 for(
int i=0; i<
sum.size(); i++){
322 sum[i] += fac * (x[i] - mean[i]) * (x[i] - mean[i]);
329 for(
int i=0;i<slsz;i++){
331 fwrite( &datum,
sizeof(
data_t), 1, out );
341 for(
int i=0;i<slsz;i++){
343 if (std::isinf(datum)) {
347 if (std::isnan(datum)){
351 fwrite( &datum,
sizeof(
data_t), 1, out );
353 if (INF_FLAG) std::cout <<
"Infinite number(s) detected (and set to zero)" << endl;
354 if (NAN_FLAG) std::cout <<
"NaN(s) detected (and set to zero)" << endl;
364 for(
int i=0;i<slsz;i++){
365 data_t datum = x[i]/y[i%nc];
366 if (std::isinf(datum)) {
370 if (std::isnan(datum)){
374 fwrite( &datum,
sizeof(datum), 1, out );
376 if (INF_FLAG) std::cout <<
"Infinite number(s) detected (and set to zero)" << endl;
377 if (NAN_FLAG) std::cout <<
"NaN(s) detected (and set to zero)" << endl;
383 for(
int i=0;i<slsz;i++){
385 fwrite( &datum,
sizeof(
data_t), 1, out );
392 for(
int i=0;i<slsz;i++){
393 data_t datum = x[i]*y[i%nc];
394 fwrite( &datum,
sizeof(datum), 1, out );
402 for(
int i=0; i<nc; i++ )
min[i]=x[i];
403 #pragma omp parallel for
404 for(
int i=nc;i<slsz*nc;i++){
415 #pragma omp parallel for
416 for(
int i=0; i<n; i++ ){
427 #pragma omp parallel for
428 for(
int i=0; i<n; i++ ){
438 #pragma omp parallel for
439 for(
int i=0; i<n; i++ ){
451 for(
int i=0; i<nc; i++ ){
455 for(
int i=nc;i<slsz*nc;i++){
456 if( x[i]>
max[i%nc] ){
461 fwrite( Imax,
sizeof(
int), nc, out );
469 for(
int i=0; i<nc; i++ )
max[i]=x[i];
470 #pragma omp parallel for
471 for(
int i=nc;i<slsz*nc;i++){
481 for(
int i=0;i<slsz;i++){
483 fwrite( &datum,
sizeof(
data_t), 1, out );
490 void Xbox(
data_t *dat,
int x,
int y, FILE *out,
int d,
int nc )
497 for(
int j=0; j<y; j++ )
498 for(
int i=0; i<x; i++ ) {
500 if( j<fm || j>y-fp-1 || i<fm || i>x-fp-1 )
503 for(
int m=j-fm; m<=j+fp; m++ )
504 for(
int n=i-fm; n<=i+fp; n++ )
508 fwrite( &datum,
sizeof(
data_t), 1, out );
515 int tfinal, FILE *out )
517 unsigned int curr = (t%3)*sz;
518 unsigned int old = (curr+2*sz)%(3*sz);
519 unsigned int older = (curr+sz)%(3*sz);
521 memcpy( scr.data()+curr, dat,
sizeof(
data_t)*sz );
524 fwrite( dat,
sizeof(
data_t), sz, out );
527 for(
int i=0; i<sz; i++ )
528 if( scr[old+i]>upper || scr[old+i]<lower ) {
529 if( scr[curr+i]>upper || scr[curr+i]<lower )
530 scr[old+i] = scr[older+i];
532 scr[old+i] = (scr[older+i]+scr[curr+i])/2.;
534 fwrite( scr.data()+old,
sizeof(
data_t), sz, out );
538 fwrite( dat,
sizeof(
data_t), sz, out );
552 for(
int i=0; i<n; i+=nc){
554 for(
int j=0; j<nc; j++ )
555 mag += x[i+j]*x[i+j];
557 fwrite( &
mag,
sizeof(
mag), 1, out );
574 for(
int i=0; i<n; i+=nc){
576 for(
int j=0; j<nc; j++ )
577 dot += x[i+j]*y[k*i+j];
578 fwrite( &
dot,
sizeof(
dot), 1, out );
602 else if( s==1 || s==2 )
605 #pragma omp parallel for
606 for(
int i=0; i<n; i++ )
607 runInt[i] += x[i]*scale;
617 #pragma omp parallel for
618 for(
int i=0; i<n; i++ )
620 reduce[i] += dt*x[i]/2.;
622 reduce[i] += dt*x[i];
639 for(
int i=0; i<idx.size(); i++ ) {
641 for(
int j=0; j<n; j++ )
642 datum += dat[idx[i][j]]*w[i][j];
643 fwrite( &datum,
sizeof(
data_t), 1, out );
662 vector<data_t> slice( slice_mem );
664 for(
int t=0; t< h->
t(); t++ ) {
666 for(
int j=0; j<slice_mem; j++ ){
668 fwrite( &datum,
sizeof(
data_t), 1, out );
693 data_t *extrem = big+2*sz;
695 if( !t ) memcpy( old, dat,
sizeof(
data_t)*sz );
697 #pragma omp parallel for
698 for(
int i=0; i<sz; i++ ) {
699 data_t dV = dat[i] - old[i];
700 if( dV*change[i] < 0 ) {
701 data_t pp = fabs( extrem[i]-old[i] );
702 if( pp > maxpp[i] ) maxpp[i] = pp;
703 change[i] = copysign( 1., dV );
705 }
else if( change[i]==0. && dV != 0 ) {
706 change[i] = copysign( 1., dV );
709 memcpy( old, dat,
sizeof(
data_t)*sz );
717 for(
int i=0; i<n; i++ )
719 fwrite( s+i,
sizeof(
data_t), 1, out );
721 fprintf( out,
"%g\n", s[i] );
731 fwrite( &datum,
sizeof(
data_t), 1, out );
733 fprintf( out,
"%g\n", i );
739 void ravgX_ta(
data_t *dat1,
int sz,
int t,
int a, vector<data_t>& tmp, FILE *out )
741 vector <data_t>
sum( sz, 0 );
743 #pragma omp parallel for
744 for(
int i=0; i<sz; i++ ) {
746 tmp[i+(t%a)*sz] = dat1[i];
748 for(
int j=0; j<a; j++ ) {
749 sum[i] += tmp[i+j*sz];
768 while( gzgets( in, buf, 1024 ) != Z_NULL &&
769 sscanf( buf,
"%f %f %f %f", datum, datum+1, datum+2, datum+3 )==nc )
770 for(
int i=0; i<nc; i++ ) y.push_back( datum[i] );
783 for(
int i=0; i<n; i++ ) {
795 if( !getenv(
"OMP_NUM_THREADS") )
796 omp_set_num_threads(1);
799 gengetopt_args_info opts;
804 if (cmdline_parser (argc, argv, &opts) != 0)
808 gzFile in1 = (!opts.inputs_num || !strcmp(opts.inputs[0],
"-")) ?
809 gzdopen( dup(0),
"r" ):
810 gzopen( opts.inputs[0],
"r" );
812 cerr <<
"File not found: " << opts.inputs[0] << endl;
817 if( h1->
read(
true) & 0xff ) {
818 cerr <<
"File 1 is not a proper IGB file: "<< opts.inputs[0] << endl;
823 if( opts.interpolate_flag )
824 interp =
new Interp( opts.inputs[1], opts.inputs[2] );
829 switch( opts.op_arg ) {
830 case op_arg_aXPLUS_bY:
833 case op_arg_joinXY_t:
834 case op_arg_joinXY_i:
841 else if( opts.expression_given )
842 if( strchr( opts.expression_arg,
'Y' ) )
853 if( opts.inputs_num<2 ) {
854 cerr <<
"A 2nd file is needed : " << endl;
857 if( (in2=gzopen( opts.inputs[1],
"r" ))==NULL ) {
858 cerr <<
"file 2 not found : " << opts.inputs[1] << endl;
863 if( h2->
read(
true) & 0xff ) {
872 else if( opts.op_arg != op_arg_joinXY_i ) {
873 cerr <<
"incompatile file sizes! Y must have " << h1->
t()*h1->
num_components()
875 <<
" entries" << endl;
881 cerr <<
"Number of data components do not match" << endl;
888 if( h2->
t()!=1 && opts.op_arg != op_arg_joinXY_t ) {
889 cerr <<
"Second IGB file time does not match" << endl;
893 }
else if( h2->
slice_sz()==1 && h2->
t()==h1->
t() )
895 else if ( h2->
t()==h1->
t() )
897 else if ( h2->
slice_sz()==1 && h2->
t()==1 )
899 else if( opts.op_arg != op_arg_joinXY_i ) {
900 cerr <<
"incompatile IGB file sizes!" << endl;
909 string fname = opts.output_file_arg;
913 if( fname.length()<5 || fname.substr(fname.length()-4,4)!=
".igb" )
914 fname += opts.extension_arg;
915 out = fopen( fname.c_str(),
"w" );
920 switch( opts.op_arg ) {
921 case op_arg_ravgX_ta:
922 hout->
t(h1->
t()-opts.a_arg+1);
924 case op_arg_joinXY_i:
932 case op_arg_joinXY_t:
969 cerr <<
"Unrecognized argument: " << opts.op_arg << endl;
971 if( opts.interpolate_flag ) {
972 hout->
x( interp->
size() );
980 if( opts.op_arg == op_arg_joinXY_t ) {
987 std::vector<std::vector<float>> dat3;
993 std::vector<data_t> t_reduce;
994 std::vector<data_t> big_scratch;
995 switch( opts.op_arg ) {
1000 case op_arg_intX_i :
1001 case op_arg_intX_t :
1002 t_reduce.assign( h1_slice_comps, 0 );
1005 t_reduce.assign( h1_slice_comps, 0 );
1006 big_scratch.assign( h1_slice_comps, 0 );
1008 case op_arg_ravgX_ta :
1009 big_scratch.assign( h1_slice_comps*opts.a_arg, 0 );
1011 case op_arg_sclip_ab :
1012 big_scratch.assign( h1_slice_comps*3, 0 );
1014 case op_arg_diff_f :
1015 big_scratch.assign( h1_slice_comps, 0 );
1017 case op_arg_diff_c :
1018 case op_arg_norm_i :
1019 big_scratch.assign( h1_slice_comps*3, 0 );
1021 case op_arg_maxP2P :
1022 big_scratch.assign( h1_slice_comps*3, 0 );
1023 t_reduce.assign( h1_slice_comps, 0 );
1028 if( opts.expression_given )
1029 big_scratch.assign( h1_slice_comps*opts.a_arg, 0 );
1032 for(
int t=0; t<h1->
t(); t++ ) {
1038 if(opts.op_arg == op_arg_stdD_i)
1039 dat3.push_back(dat1);
1041 if( Yigb && (Ytype&
Tbit || !t) )
1044 float *Yptr =
Y.data();
1050 if( opts.op_arg==op_arg_minX_i || opts.op_arg==op_arg_maxX_i ) {
1052 }
else if( opts.op_arg==op_arg_norm_i ) {
1053 copy( dat1.begin(), dat1.end(), big_scratch.begin() );
1054 copy( dat1.begin(), dat1.end(), big_scratch.begin()+h1_slice_comps );
1055 }
else if( opts.op_arg==op_arg_t_maxX) {
1060 if( opts.expression_given ){
1062 eval_expr( dat1.data(), h1_slice_comps, opts.expression_arg, out, big_scratch.data() );
1065 eval_expr( dat1.data(), Yptr, h1_slice_comps, opts.expression_arg,
1070 if( opts.interpolate_given )
1073 switch( opts.op_arg ) {
1074 case op_arg_aXPLUS_bY:
1076 aXPLUS_bY(dat1.data(), Yptr, opts.a_arg, opts.b_arg,
1077 h1_slice_comps,out);
1079 aXPLUS_bY(dat1.data(), Yptr, opts.a_arg, opts.b_arg,
1082 case op_arg_aXPLUS_b:
1083 aXPLUS_b(dat1.data(),opts.a_arg,opts.b_arg,h1_slice_comps,out);
1087 XdivY(dat1.data(), Yptr, h1_slice_comps, out);
1093 XmulY( dat1.data(), Yptr, h1_slice_comps, out);
1110 minXi( dat1.data(), t_reduce.data(), t_reduce.size() );
1113 maxXi( dat1.data(), t_reduce.data(), t_reduce.size() );
1116 t_maxX( dat1.data(), big_scratch.data(), t_reduce.data(), t_reduce.size(), t );
1120 avgXi( dat1.data(), t_reduce, 1.0f);
1122 case op_arg_ravgX_ta :
1123 ravgX_ta( dat1.data(), h1_slice_comps, t, opts.a_arg, big_scratch, out );
1128 case op_arg_sclip_ab :
1129 sclip_ab( dat1.data(), h1_slice_comps, opts.a_arg, opts.b_arg, big_scratch, t, h1->
t(), out );
1131 case op_arg_diff_f :
1134 case op_arg_diff_c :
1135 center_diff( dat1.data(), h1_slice_comps, big_scratch, t, h1->
inc_t(), out );
1137 case op_arg_joinXY_i:
1139 join_space( dat1.data(), h1_slice_comps, Yptr,
1142 join_space( dat1.data(), h1_slice_comps,
Y.data(),
Y.size(), out);
1151 case op_arg_intX_i :
1152 case op_arg_intX_t :
1154 int lastT = h1->
t()-1;
1155 int lastSimp = lastT - (lastT%3);
1156 if( t<=lastSimp && lastSimp!=0 )
1157 simp38( dat1.data(), h1_slice_comps, t==0||t==lastSimp?-1:t, t_reduce.data(),
1159 if( t>=lastSimp && lastSimp!=lastT )
1160 midpt( dat1.data(), h1_slice_comps, t==lastSimp||t==lastT, t_reduce.data(),
1163 if( opts.op_arg == op_arg_intX_t )
1164 fwrite( t_reduce.data(),
sizeof(t_reduce[0]), t_reduce.size(), out );
1167 minXi( dat1.data(), big_scratch.data(), h1_slice_comps );
1168 maxXi( dat1.data(), big_scratch.data()+h1_slice_comps, h1_slice_comps );
1171 maxP2P( dat1.data(), big_scratch.data(), t_reduce.data(), h1_slice_comps, t );
1176 cerr <<
"Unrecognized argument: " << opts.op_arg << endl;
1181 switch( opts.op_arg ) {
1184 t_reduce[i] /= (
data_t)(h1->
t());
1189 t_reduce[i] /= (
data_t)(h1->
t());
1190 std::vector<data_t> mean;
1191 mean.assign(t_reduce.begin(), t_reduce.end());
1192 std::fill(t_reduce.begin(), t_reduce.end(), 0);
1193 for(
int t=0; t<h1->
t(); t++ ) {
1195 varXi( dat3[t].data(), mean.data(), t_reduce, 1.0f);
1198 t_reduce[i] = std::sqrt(t_reduce[i] / ((
data_t)(h1->
t() - 1)));
1202 normalize( h1, out, big_scratch.data(), big_scratch.data()+h1_slice_comps );
1205 for(
int i=0; i<t_reduce.size(); i++ )
1206 t_reduce[i] = h1->
org_t() + t_reduce[i]*h1->
inc_t();
1212 if( t_reduce.size() )
void dot(data_t *x, data_t *y, int n, int nc, FILE *out, bool pt)
perform dot product
int main(int argc, char *argv[])
void minXt(data_t *x, int slsz, int nc, float t, FILE *out)
void forward_diff(data_t *x, int slsz, vector< data_t > &old, int t, float dt, FILE *out)
void aXPLUS_b(data_t *x, data_t a, data_t b, int slsz, FILE *out)
void simp38(T *x, int n, int t, data_t *runInt, float dt)
Simpson's 3/8 rule.
bool overlap(IGBheader *first, IGBheader *second)
void i_maxX(data_t *x, int slsz, int nc, float t, FILE *out)
void maxXt(data_t *x, int slsz, int nc, float t, FILE *out)
void midpt(T *x, int n, bool end, data_t *reduce, float dt)
void XmulY(data_t *x, data_t *y, int slsz, FILE *out)
void eval_expr(data_t *x, int n, char *expr, FILE *out, data_t *result)
void maxP2P(data_t *dat, data_t *big, data_t *maxpp, int sz, int t)
find the maximum peak-to-peak value at each point
void read_vector(vector< data_t > &y, gzFile in, int nc)
void minXi(data_t *x, data_t *mn, size_t n)
void interpolate(data_t *dat, vector< int * > &idx, vector< float * > &w, int n, FILE *out)
interpolate within points
void avgXi(data_t *x, vector< data_t > &sum, const data_t fac)
void output_scratch(data_t *s, FILE *out, int n, bool bin)
void ravgX_ta(data_t *dat1, int sz, int t, int a, vector< data_t > &tmp, FILE *out)
void maxXi(data_t *x, data_t *mx, size_t n)
void t_maxX(data_t *x, data_t *mx, data_t *tm, size_t n, float t)
void normalize(IGBheader *h, FILE *out, T *min, T *max)
normalize pixels over all time
void XPLUS_a(data_t *x, data_t a, int slsz, FILE *out)
void sclip_ab(data_t *dat, int sz, data_t upper, data_t lower, vector< data_t > &scr, int t, int tfinal, FILE *out)
void varXi(data_t *x, data_t *mean, vector< data_t > &sum, const data_t fac)
void join_space(data_t *x, int nx, data_t *y, int ny, FILE *out)
std::string cmdline_str(int n, char *w[])
void avgXt(data_t *x, int slsz, int nc, float t, FILE *out)
void XdivY(data_t *x, data_t *y, int slsz, FILE *out)
void joinXY(IGBheader *h1, IGBheader *h2, IGBheader *hout)
void Xbox(data_t *dat, int x, int y, FILE *out, int d, int nc)
void aXPLUS_bY(data_t *x, data_t *y, data_t a, data_t b, int slsz, int nc, FILE *out)
void center_diff(data_t *x, int slsz, vector< data_t > &odat, int t, float dt, FILE *out)
void magnitude(data_t *x, int n, int nc, FILE *out)
determine magnitude at each point
Interp(char *ind, char *weight)
constructor
double mag(const Point &vect)
vector magnitude
T sum(const vector< T > &vec)
Compute sum of a vector's entries.
constexpr T min(T a, T b)
constexpr T max(T a, T b)