58 #include "ops_cmdline.h"
76 Interp(
char *ind,
char *weight );
77 int size() {
return ind.size(); }
92 FILE *iin = fopen( indf,
"r" );
93 while( fgets( buf, 8192, iin )!=NULL ) {
95 char *l1 = strdup(buf);
96 char *ptr = strtok( l1,
" " );
97 while((ptr=strtok( NULL,
" " ))) n++;
100 int *ip =
new int[n];
101 istringstream oss( buf );
102 for(
int i=0; i<n; i++ )
106 FILE *win = fopen( wf,
"r" );
107 for(
int i=0; i<ind.size(); i++ ) {
108 fgets( buf, 8192, win );
109 float *wp =
new float[n];
110 istringstream oss( buf );
111 for(
int j=0; j<n; j++ )
136 fprintf( stderr,
"Y must be an IGB file\n\n" );
140 gzFile in1 = (gzFile)(h1->
fileptr());
141 gzFile in2 = (gzFile)(h2->
fileptr());
142 FILE* out = (FILE *)(hout->
fileptr());
145 for(
int i=0; i<h1->
t(); i++ ) {
150 bool skip_second_torg =
overlap( h1, h2 );
151 for(
int i=0; i<h2->
t(); i++ ) {
154 skip_second_torg =
false;
164 fwrite( x,
sizeof(
data_t), nx, out );
165 fwrite( y,
sizeof(
data_t), ny, out );
174 static Parser hParser;
175 static bool init=
false;
178 hParser.DefineVar(
"X", x );
179 hParser.SetExpr(expr);
183 hParser.Eval(result, n);
185 catch (Parser::exception_type &e)
187 std::cerr << e.GetMsg() << std::endl;
213 hParser.DefineVar(
"X", &a );
214 hParser.DefineVar(
"Y", &b );
215 hParser.SetExpr(expr);
219 for(
int i=0; i<n; i++ ) {
222 b = x1[nc>0 ? i%nc : i];
223 y[i] = hParser.Eval();
225 catch (Parser::exception_type &e)
227 std::cerr << e.GetMsg() << std::endl;
239 int older= (t%2) ? 0 : slsz;
240 int old = older ? 0 : slsz;
243 for(
int i=0;i<slsz;i++){
244 data_t d = (x[i]-odat[old+i])/dt;
245 fwrite( &d,
sizeof(
data_t), 1, out );
248 for(
int i=0;i<slsz;i++){
249 data_t d = (x[i]-odat[older+i])/dt/2.;
250 fwrite( &d,
sizeof(
data_t), 1, out );
253 for(
int i=0;i<slsz;i++)
254 odat[older+i] = x[i];
261 for(
int i=0;i<slsz;i++){
263 data_t d = (x[i]-old[i])/dt;
264 fwrite( &d,
sizeof(
data_t), 1, out );
274 for(
int i=0;i<slsz;i++){
275 data_t datum = x[i]*a + b*y[i%nc];
276 fwrite( &datum,
sizeof(
data_t), 1, out );
284 for(
int i=0;i<slsz;i++){
285 data_t datum = x[i]*a + b*y[i];
286 fwrite( &datum,
sizeof(
data_t), 1, out );
294 for(
int c=0; c<nc; c++ ) {
296 #pragma omp parallel for reduction( +:s )
297 for(
int i=c;i<slsz;i+=nc)
299 sumf[c] = s/double(slsz);
301 fwrite( &sumf,
sizeof(sumf[0]), nc, out );
308 #pragma omp parallel for
309 for(
int i=0; i<
sum.size(); i++){
310 sum[i] += fac * x[i];
316 #pragma omp parallel for
317 for(
int i=0; i<
sum.size(); i++){
318 sum[i] += fac * (x[i] - mean[i]) * (x[i] - mean[i]);
325 for(
int i=0;i<slsz;i++){
327 fwrite( &datum,
sizeof(
data_t), 1, out );
337 for(
int i=0;i<slsz;i++){
339 if (std::isinf(datum)) {
343 if (std::isnan(datum)){
347 fwrite( &datum,
sizeof(
data_t), 1, out );
349 if (INF_FLAG) std::cout <<
"Infinite number(s) detected (and set to zero)" << endl;
350 if (NAN_FLAG) std::cout <<
"NaN(s) detected (and set to zero)" << endl;
360 for(
int i=0;i<slsz;i++){
361 data_t datum = x[i]/y[i%nc];
362 if (std::isinf(datum)) {
366 if (std::isnan(datum)){
370 fwrite( &datum,
sizeof(datum), 1, out );
372 if (INF_FLAG) std::cout <<
"Infinite number(s) detected (and set to zero)" << endl;
373 if (NAN_FLAG) std::cout <<
"NaN(s) detected (and set to zero)" << endl;
379 for(
int i=0;i<slsz;i++){
381 fwrite( &datum,
sizeof(
data_t), 1, out );
388 for(
int i=0;i<slsz;i++){
389 data_t datum = x[i]*y[i%nc];
390 fwrite( &datum,
sizeof(datum), 1, out );
398 for(
int i=0; i<nc; i++ )
min[i]=x[i];
399 #pragma omp parallel for
400 for(
int i=nc;i<slsz*nc;i++){
411 #pragma omp parallel for
412 for(
int i=0; i<n; i++ ){
422 #pragma omp parallel for
423 for(
int i=0; i<n; i++ ){
434 for(
int i=0; i<nc; i++ )
max[i]=x[i];
435 #pragma omp parallel for
436 for(
int i=nc;i<slsz*nc;i++){
446 for(
int i=0;i<slsz;i++){
448 fwrite( &datum,
sizeof(
data_t), 1, out );
455 void Xbox(
data_t *dat,
int x,
int y, FILE *out,
int d,
int nc )
462 for(
int j=0; j<y; j++ )
463 for(
int i=0; i<x; i++ ) {
465 if( j<fm || j>y-fp-1 || i<fm || i>x-fp-1 )
468 for(
int m=j-fm; m<=j+fp; m++ )
469 for(
int n=i-fm; n<=i+fp; n++ )
473 fwrite( &datum,
sizeof(
data_t), 1, out );
480 int tfinal, FILE *out )
482 unsigned int curr = (t%3)*sz;
483 unsigned int old = (curr+2*sz)%(3*sz);
484 unsigned int older = (curr+sz)%(3*sz);
486 memcpy( scr.data()+curr, dat,
sizeof(
data_t)*sz );
489 fwrite( dat,
sizeof(
data_t), sz, out );
492 for(
int i=0; i<sz; i++ )
493 if( scr[old+i]>upper || scr[old+i]<lower ) {
494 if( scr[curr+i]>upper || scr[curr+i]<lower )
495 scr[old+i] = scr[older+i];
497 scr[old+i] = (scr[older+i]+scr[curr+i])/2.;
499 fwrite( scr.data()+old,
sizeof(
data_t), sz, out );
503 fwrite( dat,
sizeof(
data_t), sz, out );
517 for(
int i=0; i<n; i+=nc){
519 for(
int j=0; j<nc; j++ )
520 mag += x[i+j]*x[i+j];
522 fwrite( &
mag,
sizeof(
mag), 1, out );
539 for(
int i=0; i<n; i+=nc){
541 for(
int j=0; j<nc; j++ )
542 dot += x[i+j]*y[k*i+j];
543 fwrite( &
dot,
sizeof(
dot), 1, out );
566 else if( s==1 || s==2 )
569 #pragma omp parallel for
570 for(
int i=0; i<n; i++ )
571 runInt[i] += x[i]*scale;
581 #pragma omp parallel for
582 for(
int i=0; i<n; i++ )
584 reduce[i] += x[i]/2.;
603 for(
int i=0; i<idx.size(); i++ ) {
605 for(
int j=0; j<n; j++ )
606 datum += dat[idx[i][j]]*w[i][j];
607 fwrite( &datum,
sizeof(
data_t), 1, out );
626 vector<data_t> slice( slice_mem );
628 for(
int t=0; t< h->
t(); t++ ) {
630 for(
int j=0; j<slice_mem; j++ ){
632 fwrite( &datum,
sizeof(
data_t), 1, out );
657 data_t *extrem = big+2*sz;
659 if( !t ) memcpy( old, dat,
sizeof(
data_t)*sz );
661 #pragma omp parallel for
662 for(
int i=0; i<sz; i++ ) {
663 data_t dV = dat[i] - old[i];
664 if( dV*change[i] < 0 ) {
665 data_t pp = fabs( extrem[i]-old[i] );
666 if( pp > maxpp[i] ) maxpp[i] = pp;
667 change[i] = copysign( 1., dV );
669 }
else if( change[i]==0. && dV != 0 ) {
670 change[i] = copysign( 1., dV );
673 memcpy( old, dat,
sizeof(
data_t)*sz );
681 for(
int i=0; i<n; i++ )
683 fwrite( s+i,
sizeof(
data_t), 1, out );
685 fprintf( out,
"%g\n", s[i] );
695 fwrite( &datum,
sizeof(
data_t), 1, out );
697 fprintf( out,
"%g\n", i );
703 void ravgX_ta(
data_t *dat1,
int sz,
int t,
int a, vector<data_t>& tmp, FILE *out )
705 vector <data_t>
sum( sz, 0 );
707 #pragma omp parallel for
708 for(
int i=0; i<sz; i++ ) {
710 tmp[i+(t%a)*sz] = dat1[i];
712 for(
int j=0; j<a; j++ ) {
713 sum[i] += tmp[i+j*sz];
732 while( gzgets( in, buf, 1024 ) != Z_NULL &&
733 sscanf( buf,
"%f %f %f %f", datum, datum+1, datum+2, datum+3 )==nc )
734 for(
int i=0; i<nc; i++ ) y.push_back( datum[i] );
747 for(
int i=0; i<n; i++ ) {
759 if( !getenv(
"OMP_NUM_THREADS") )
760 omp_set_num_threads(1);
763 gengetopt_args_info opts;
768 if (cmdline_parser (argc, argv, &opts) != 0)
771 if( !opts.inputs_num ) {
772 cerr <<
"Must specify one or two IGB files" << endl;
777 gzFile in1 = !strcmp(opts.inputs[0],
"-" ) ?
778 gzdopen( dup(0),
"r" ):
779 gzopen( opts.inputs[0],
"r" );
781 cerr <<
"File not found: " << opts.inputs[0] << endl;
786 if( h1->
read(
true) & 0xff ) {
787 cerr <<
"File 1 is not a proper IGB file: "<< opts.inputs[0] << endl;
792 if( opts.interpolate_flag )
793 interp =
new Interp( opts.inputs[1], opts.inputs[2] );
798 switch( opts.op_arg ) {
799 case op_arg_aXPLUS_bY:
802 case op_arg_joinXY_t:
803 case op_arg_joinXY_i:
810 else if( opts.expression_given )
811 if( strchr( opts.expression_arg,
'Y' ) )
822 if( opts.inputs_num<2 ) {
823 cerr <<
"A 2nd file is needed : " << endl;
826 if( (in2=gzopen( opts.inputs[1],
"r" ))==NULL ) {
827 cerr <<
"file 2 not found : " << opts.inputs[1] << endl;
832 if( h2->
read(
true) & 0xff ) {
842 cerr <<
"incompatile file sizes! Y must have " << h1->
t()*h1->
num_components()
844 <<
" entries" << endl;
850 cerr <<
"Number of data components do not match" << endl;
857 if( h2->
t()!=1 && opts.op_arg != op_arg_joinXY_t ) {
858 cerr <<
"Second IGB file time does not match" << endl;
862 }
else if( h2->
slice_sz()==1 && h2->
t()==h1->
t() )
864 else if ( h2->
t()==h1->
t() )
866 else if ( h2->
slice_sz()==1 && h2->
t()==1 )
869 cerr <<
"incompatile IGB file sizes!" << endl;
878 string fname = opts.output_file_arg;
882 if( fname.length()<5 || fname.substr(fname.length()-4,4)!=
".igb" )
883 fname += opts.extension_arg;
884 out = fopen( fname.c_str(),
"w" );
889 switch( opts.op_arg ) {
890 case op_arg_ravgX_ta:
891 hout->
t(h1->
t()-opts.a_arg+1);
893 case op_arg_joinXY_i:
901 case op_arg_joinXY_t:
933 if( opts.interpolate_flag ) {
934 hout->
x( interp->
size() );
942 if( opts.op_arg == op_arg_joinXY_t ) {
949 std::vector<std::vector<float>> dat3;
955 std::vector<data_t> t_reduce;
956 std::vector<data_t> big_scratch;
957 switch( opts.op_arg ) {
963 t_reduce.assign( h1_slice_comps, 0 );
965 case op_arg_ravgX_ta :
966 big_scratch.assign( h1_slice_comps*opts.a_arg, 0 );
968 case op_arg_sclip_ab :
969 big_scratch.assign( h1_slice_comps*3, 0 );
972 big_scratch.assign( h1_slice_comps, 0 );
976 big_scratch.assign( h1_slice_comps*3, 0 );
979 big_scratch.assign( h1_slice_comps*3, 0 );
980 t_reduce.assign( h1_slice_comps, 0 );
985 if( opts.expression_given )
986 big_scratch.assign( h1_slice_comps*opts.a_arg, 0 );
989 for(
int t=0; t<h1->
t(); t++ ) {
995 if(opts.op_arg == op_arg_stdD_i)
996 dat3.push_back(dat1);
1001 float *Yptr =
Y.data();
1005 if( !t && (opts.op_arg==op_arg_minX_i ||
1006 opts.op_arg==op_arg_maxX_i ))
1009 if( !t && (opts.op_arg==op_arg_norm_i) ) {
1010 copy( dat1.begin(), dat1.end(), big_scratch.begin() );
1011 copy( dat1.begin(), dat1.end(), big_scratch.begin()+h1_slice_comps );
1014 if( opts.expression_given ){
1016 eval_expr( dat1.data(), h1_slice_comps, opts.expression_arg, out, big_scratch.data() );
1019 eval_expr( dat1.data(), Yptr, h1_slice_comps, opts.expression_arg,
1024 if( opts.interpolate_given )
1027 switch( opts.op_arg ) {
1028 case op_arg_aXPLUS_bY:
1030 aXPLUS_bY(dat1.data(), Yptr, opts.a_arg, opts.b_arg,
1031 h1_slice_comps,out);
1033 aXPLUS_bY(dat1.data(), Yptr, opts.a_arg, opts.b_arg,
1036 case op_arg_aXPLUS_b:
1037 aXPLUS_b(dat1.data(),opts.a_arg,opts.b_arg,h1_slice_comps,out);
1041 XdivY(dat1.data(), Yptr, h1_slice_comps, out);
1047 XmulY( dat1.data(), Yptr, h1_slice_comps, out);
1061 minXi( dat1.data(), t_reduce.data(), t_reduce.size() );
1064 maxXi( dat1.data(), t_reduce.data(), t_reduce.size() );
1068 avgXi( dat1.data(), t_reduce, 1.0f);
1070 case op_arg_ravgX_ta :
1071 ravgX_ta( dat1.data(), h1_slice_comps, t, opts.a_arg, big_scratch, out );
1076 case op_arg_sclip_ab :
1077 sclip_ab( dat1.data(), h1_slice_comps, opts.a_arg, opts.b_arg, big_scratch, t, h1->
t(), out );
1079 case op_arg_diff_f :
1082 case op_arg_diff_c :
1083 center_diff( dat1.data(), h1_slice_comps, big_scratch, t, h1->
inc_t(), out );
1085 case op_arg_joinXY_i:
1087 join_space( dat1.data(), h1_slice_comps, Yptr,
1090 join_space( dat1.data(), h1_slice_comps,
Y.data(),
Y.size(), out);
1099 case op_arg_intX_i :
1101 int lastT = h1->
t()-1;
1102 int lastSimp = lastT - (lastT%3);
1103 if( t<=lastSimp && lastSimp!=0 )
1104 simp38( dat1.data(), h1_slice_comps, t==0||t==lastSimp?-1:t, t_reduce.data() );
1105 if( t>=lastSimp && lastSimp!=lastT )
1106 midpt( dat1.data(), h1_slice_comps, t==lastSimp||t==lastT, t_reduce.data() );
1110 minXi( dat1.data(), big_scratch.data(), h1_slice_comps );
1111 maxXi( dat1.data(), big_scratch.data()+h1_slice_comps, h1_slice_comps );
1114 maxP2P( dat1.data(), big_scratch.data(), t_reduce.data(), h1_slice_comps, t );
1124 switch( opts.op_arg ) {
1127 t_reduce[i] /= (
data_t)(h1->
t());
1132 t_reduce[i] /= (
data_t)(h1->
t());
1133 std::vector<data_t> mean;
1134 mean.assign(t_reduce.begin(), t_reduce.end());
1135 std::fill(t_reduce.begin(), t_reduce.end(), 0);
1136 for(
int t=0; t<h1->
t(); t++ ) {
1138 varXi( dat3[t].data(), mean.data(), t_reduce, 1.0f);
1141 t_reduce[i] = std::sqrt(t_reduce[i] / ((
data_t)(h1->
t() - 1)));
1146 t_reduce[i] *= h1->
inc_t();
1149 normalize( h1, out, big_scratch.data(), big_scratch.data()+h1_slice_comps );
1155 if( t_reduce.size() )
void dot(data_t *x, data_t *y, int n, int nc, FILE *out, bool pt)
perform dot product
void midpt(T *x, int n, bool end, data_t *reduce)
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)
bool overlap(IGBheader *first, IGBheader *second)
void maxXt(data_t *x, int slsz, int nc, float t, FILE *out)
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 simp38(T *x, int n, int t, data_t *runInt)
Simpson's 3/8 rule.
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)