From cdd70d64153b8c4ff62eae0e5bb49f6da3b0a8ca Mon Sep 17 00:00:00 2001
From: JanThorbecke <janth@xs4all.nl>
Date: Mon, 16 Mar 2020 09:44:02 +0100
Subject: [PATCH] MME algorithm changes for paper

---
 fdelmodc/fdelmodc.c                  |   4 +-
 marchenko/Makefile                   |   2 +-
 marchenko/demo/oneD/README_PRIMARIES |   7 +-
 marchenko/demo/oneD/epsPrimaries.scr |  41 ++++-
 marchenko/demo/oneD/iterations.scr   |  23 ++-
 marchenko/demo/oneD/model.scr        |  24 +++
 marchenko/demo/oneD/primaries.scr    |   7 +-
 marchenko/marchenko_primaries.c      | 215 +++++++++++++++------------
 marchenko/synthesis.c                |  11 +-
 utils/getFileInfo.c                  |  28 ++--
 10 files changed, 236 insertions(+), 126 deletions(-)

diff --git a/fdelmodc/fdelmodc.c b/fdelmodc/fdelmodc.c
index 878f6b6..f780b78 100644
--- a/fdelmodc/fdelmodc.c
+++ b/fdelmodc/fdelmodc.c
@@ -132,8 +132,8 @@ char *sdoc[] = {
 "                     - 1=monopole",
 "                     - 2=dipole +/- vertical oriented",
 "                     - 3=dipole - + horizontal oriented",
-//"                     - 4=dipole +/0/-",
-//"                     - 5=dipole + -",
+"                     - 4=dipole +/0/-",
+"                     - 5=dipole + -",
 "   dip=0 ............. dip for double-couple source",
 "   strike=0 .......... strike for double-couple source",
 "   xsrc=middle ....... x-position of (first) shot ",
diff --git a/marchenko/Makefile b/marchenko/Makefile
index cd1c541..704ba08 100644
--- a/marchenko/Makefile
+++ b/marchenko/Makefile
@@ -37,7 +37,7 @@ SRCH	= marchenko.c \
 		getpars.c
 
 SRCP	= marchenko_primaries.c \
-		synthesis.c  \
+		synthesisp.c  \
 		getFileInfo.c  \
 		readData.c \
 		readShotData.c \
diff --git a/marchenko/demo/oneD/README_PRIMARIES b/marchenko/demo/oneD/README_PRIMARIES
index 5eda719..7b97347 100644
--- a/marchenko/demo/oneD/README_PRIMARIES
+++ b/marchenko/demo/oneD/README_PRIMARIES
@@ -2,10 +2,9 @@ Description of files:
 
 
 1) model.scr computes the model and the 'basis' shot of R => shot5_rp.su
-2) p5all.scr create from basis shot full Reflection response matrix => shotsdx5_rp.su (3.3 GB)
-3) primaries.scr computes the internal multiple attenuated (middle) shot record.
-4) itertions.scr computes the intermediate results of the multiple attenutation scheme and produces all output files that are used in the manuscript.
-5) epsPrimaries.scr selected output form 4) are converted to .eps pictures that are used in the Figures to explain the method.
+2) primaries.scr computes the internal multiple attenuated (middle) shot record.
+3) itertions.scr computes the intermediate results of the multiple attenutation scheme and produces all output files that are used in the manuscript.
+4) epsPrimaries.scr selected output from 3) are converted to .eps pictures that are used in the Figures to explain the method.
    reproduce the postscript files of the manuscript using SU postscript plotting programs.
 
 extra scripts
diff --git a/marchenko/demo/oneD/epsPrimaries.scr b/marchenko/demo/oneD/epsPrimaries.scr
index 00949d8..2d05f4c 100755
--- a/marchenko/demo/oneD/epsPrimaries.scr
+++ b/marchenko/demo/oneD/epsPrimaries.scr
@@ -133,6 +133,40 @@ supsimage < $file hbox=6 wbox=4 labelsize=14 linewidth=0.0 \
 done
 fi
 
+if [[ "$1" == "inaction" ]];
+then
+rm vplus.su
+istart=200
+for (( iter=1; iter<=29; iter+=2 ))
+do
+piter=$(printf %03d $iter)
+echo $piter
+file=f1plus_${istart}${piter}.su
+file_base=${file%.su}
+suwind < $file key=offset min=0 max=0 >> vplus.su
+done
+
+basop file_in=vplus.su file_out=vplus_env.su choice=4
+sumax < vplus_env.su verbose=1 mode=max 
+supsmax < vplus_env.su n=15 verbose=1 mode=max \
+	style=normal linewidth=2.0 f1=1 labelsize=14 label1="iteration number" label2="amplitude" \
+    d1num=2 d2num=0.2 wbox=6 hbox=3 grid1=dot grid2=dot n1tic=2 n2tic=2 x2end=2.9 x2beg=1.8 > v1plus_max.eps
+
+file=f1plus_${istart}001.su
+file_base=${file%.su}
+supsimage < $file hbox=6 wbox=4 labelsize=14 linewidth=0.0 \
+	n1tic=2 d2=5 x1beg=0 x1end=$nsd d1=1 d1num=100 \
+	label1="time sample number" label2="lateral distance" \
+    f2=-2250 f2num=-2000 d2num=1000 clip=$clipiter > $file_base.eps
+
+file=f1min_${istart}030.su
+file_base=${file%.su}
+supsimage hbox=6 wbox=4 labelsize=14 linewidth=0.0 < $file\
+	n1tic=2 d2=5 x1beg=0 x1end=$nsd d1=1 d1num=100 \
+	label1="time sample number" label2="lateral distance" \
+    f2=-2250 f2num=-2000 d2num=1000 clip=$clipf1 > $file_base.eps
+fi
+
 if [[ "$1" == "Figure5" ]];
 then
 for (( iter=1; iter<=21; iter+=2 ))
@@ -148,7 +182,8 @@ supsimage < $file hbox=6 wbox=4 labelsize=14 linewidth=0.0 \
 done
 fi
 
-exit;
+if [[ "$1" == "Figure7" ]];
+then
 #iterations
 for (( iter=0; iter<=31; iter+=2 ))
 do
@@ -174,7 +209,10 @@ supsimage hbox=6 wbox=4 labelsize=14 linewidth=0.0 < $file\
     f2=-2250 f2num=-2000 d2num=1000 clip=$clipf1 > $file_base.eps
 
 done
+fi
 
+if [[ "$1" == "Figure8" ]];
+then
 iter=32
 piter=$(printf %03d $iter)
 echo $piter
@@ -187,6 +225,7 @@ supsimage hbox=6 wbox=4 labelsize=14 linewidth=0.0 < $file\
 	label1="time sample number" label2="lateral distance" \
     f2=-2250 f2num=-2000 d2num=1000 clip=$clipf1 > $file_base.eps
 done
+fi
 
 exit;
 
diff --git a/marchenko/demo/oneD/iterations.scr b/marchenko/demo/oneD/iterations.scr
index 3cc1ec7..f6f774f 100755
--- a/marchenko/demo/oneD/iterations.scr
+++ b/marchenko/demo/oneD/iterations.scr
@@ -3,10 +3,16 @@
 #second reflector at time:
 # 800/1800+600/2300
 # .70531400966183574878 => sample 176
-#third reflector at time:
+#third reflector at time model.scr:
 # 800/1800+600/2300+800/2000
 # 1.10531400966183574878 sample 276
+#third reflector at time modepm.scr
+#800/1800+600/3200+520/2000
+#.96531400966183574878 sample 241
 
+
+R=shotsdx5_rp.su
+makewave fp=20 dt=0.004 file_out=wave.su nt=2048 t0=0.0 scale=0 scfft=1
 select=451
 
 if [[ "$1" == "Figure3467" ]];
@@ -15,7 +21,7 @@ for istart in 276
 do
 (( iend = istart + 1 ))
 
-../../marchenko_primaries file_shot=shotsdx5_rp.su ishot=$select file_src=wave.su \
+../../marchenko_primaries file_shot=$R ishot=$select file_src=wave.su \
 	nshots=901 verbose=2 istart=$istart iend=$iend fmax=90 \
 	pad=512 niter=33 smooth=8 niterskip=600 shift=16 file_rr=pred_rr_${istart}.su T=0 file_iter=iter.su 
 done
@@ -27,17 +33,26 @@ for istart in 246 256 266 276 286 296 306 316
 do
 (( iend = istart + 1 ))
 
-../../marchenko_primaries file_shot=shotsdx5_rp.su ishot=$select file_src=wave.su \
+../../marchenko_primaries file_shot=$R ishot=$select file_src=wave.su \
 	nshots=901 verbose=2 istart=$istart iend=$iend fmax=90 \
 	pad=512 niter=33 smooth=8 niterskip=600 shift=16 file_rr=pred_rr_${istart}.su T=0 file_iter=iter.su 
 done
 fi
 
+if [[ "$1" == "inaction" ]];
+then
+istart=200
+(( iend = istart + 1 ))
+../../marchenko_primaries file_shot=$R ishot=$select file_src=wave.su \
+	nshots=901 verbose=2 istart=$istart iend=$iend fmax=90 \
+	pad=512 niter=30 smooth=8 niterskip=600 shift=16 file_rr=pred_rr_${istart}.su T=0 file_iter=iter.su 
+fi
+
 if [[ "$1" == "Figure10" ]];
 then
 istart=276
 (( iend = istart + 1 ))
-../../marchenko_primaries file_shot=shotsdx5_rp.su ishot=$select file_src=wave.su \
+../../marchenko_primaries file_shot=$R ishot=$select file_src=wave.su \
 	nshots=901 verbose=2 istart=$istart iend=$iend fmax=90 \
 	pad=512 niter=33 smooth=8 niterskip=600 shift=16 file_rr=pred_rr_${istart}.su T=1 file_iter=iterT.su 
 fi
diff --git a/marchenko/demo/oneD/model.scr b/marchenko/demo/oneD/model.scr
index 9165e87..1a5e0de 100755
--- a/marchenko/demo/oneD/model.scr
+++ b/marchenko/demo/oneD/model.scr
@@ -75,3 +75,27 @@ fdelmodc \
 sudiff shot5_fd_rp.su shot5_hom_fd_rp.su > shot5_rp.su
 
 
+# Generate the full R matrix for a fixed spread geometry.
+
+dxshot=5000 # with scalco factor of 1000
+ishot=0
+nshots=901
+
+rm shotsdx5_rp.su 
+
+while (( ishot < nshots ))
+do
+
+	(( xsrc = -2250000 + ${ishot}*${dxshot} ))
+	(( tr1 = $nshots - ${ishot} ))
+	(( tr2 = ${tr1} + $nshots - 1 ))
+	echo xsrc=$xsrc tr1=$tr1 tr2=$tr2
+
+	(( ishot = $ishot + 1))
+
+	suwind < shot5_rp.su key=tracl min=$tr1 max=$tr2 | \
+	sushw key=sx,gx,fldr,trwf \
+	a=$xsrc,-2250000,$ishot,$nshots b=0,$dxshot,0,0 j=0,$nshots,0,0 | \
+	suchw key1=offset key2=gx key3=sx c=-1 d=1000 >> shotsdx5_rp.su
+
+done
diff --git a/marchenko/demo/oneD/primaries.scr b/marchenko/demo/oneD/primaries.scr
index b5398ef..ca454a6 100755
--- a/marchenko/demo/oneD/primaries.scr
+++ b/marchenko/demo/oneD/primaries.scr
@@ -4,6 +4,8 @@
 #SBATCH --ntasks=1
 #SBATCH --time=2:40:00
 
+# Generate the model and Reflection data
+#modelpm.scr 
 
 #cd $SLURM_SUBMIT_DIR
 
@@ -11,18 +13,19 @@ export PATH=$HOME/src/OpenSource/bin:$PATH:
 export OMP_NUM_THREADS=10
 
 #shot record to remove internal multiples
+R=shotsdx5_rp.su
 select=451
 
 makewave fp=20 dt=0.004 file_out=wave.su nt=2048 t0=0.0 scale=0 scfft=1
 
-../../marchenko_primaries file_shot=shotsdx5_rp.su ishot=$select file_src=wave.su \
+../../marchenko_primaries file_shot=$R ishot=$select file_src=wave.su \
 	nshots=901 verbose=2 istart=40 iend=500 fmax=90 pad=1024 \
 	niter=31 smooth=10 niterec=2 niterskip=50 shift=20 file_rr=pred_rr.su T=0 file_update=update.su
 
 exit;
 
 #for reference original shot record from Reflection matrix
-suwind key=fldr min=$select max=$select < shotsdx5_rp.su itmax=2047 > shotsx0.su
+suwind key=fldr min=$select max=$select < $R itmax=2047 > shotsx0.su
 fconv file_in1=shotsx0.su file_in2=wave.su file_out=shotw.su
 
 # for displaying results
diff --git a/marchenko/marchenko_primaries.c b/marchenko/marchenko_primaries.c
index d893a33..b6775fd 100644
--- a/marchenko/marchenko_primaries.c
+++ b/marchenko/marchenko_primaries.c
@@ -37,7 +37,7 @@ int writeData(FILE *fp, float *data, segy *hdrs, int n1, int n2);
 int disp_fileinfo(char *file, int n1, int n2, float f1, float f2, float d1, float d2, segy *hdrs);
 double wallclock_time(void);
 
-void synthesis(complex *Refl, complex *Fop, float *Top, float *RNi, int nx, int nt, int nxs, int nts, float dt, float *xsyn, int
+void synthesisp(complex *Refl, complex *Fop, float *Top, float *RNi, int nx, int nt, int nxs, int nts, float dt, float *xsyn, int
 Nfoc, float *xrcv, float *xsrc, int *xnx, float fxse, float fxsb, float dxs, float dxsrc, float dx, int ntfft, int
 nw, int nw_low, int nw_high,  int mode, int reci, int nshots, int *ixpos, int npos, double *tfft, int *isxcount, int
 *reci_xsrc,  int *reci_xrcv, float *ixmask, int verbose);
@@ -72,7 +72,6 @@ char *sdoc[] = {
 "   src_angle=0 .............. angle with horizontal of plane source array",
 "   src_velo=1500 ............ velocity to use in src_angle definition",
 "   t0=0.1 ................... time shift in plane-wave source wavelet for migration",
-//"   xorig=nrecv/2 ............ center of plane-wave",
 " MARCHENKO ITERATIONS ",
 "   niter=22 ................. number of iterations to initialize and restart",
 "   niterec=2 ................ number of iterations in recursive part of the time-samples",
@@ -92,16 +91,17 @@ char *sdoc[] = {
 //"   countmin=0 ............... 0.3*nxrcv; minimum number of reciprocal traces for a contribution",
 " OUTPUT DEFINITION ",
 "   file_rr= ................. output file with primary only shot record",
+"   file_dd= ................. output file with input of the algorithm ",
 "   file_iter= ............... output file with -Mi(-t) for each iteration: writes",
 "              ............... M0.su=M0 : initialisation of algorithm",
 "              ............... RMi: iterative terms ",
-"              ............... f1min.su: f1min terms ",
+"              ............... u1min.su: u1min terms ",
 "   file_update= ............. output file with updates only => removed internal multiples",
 "   T=0 ...................... :1 compute transmission-losses compensated primaries ",
 "   verbose=0 ................ silent option; >0 displays info",
 " ",
 " ",
-" author  : Lele Zhang & Jan Thorbecke : 2019 ",
+" author  : Lele Zhang & Jan Thorbecke : 2020 ",
 " ",
 NULL};
 /**************** end self doc ***********************************/
@@ -109,27 +109,28 @@ NULL};
 int main (int argc, char **argv)
 {
     FILE    *fp_out, *fp_rr, *fp_w, *fp_up;
-	size_t  nread;
-    int     i, j, k, l, ret, nshots, Nfoc, nt, nx, nts, nxs, ngath;
-    int     size, n1, n2, ntap, tap, di, ntraces, tr;
+	size_t  nread, sizea, size;
+    int     i, j, k, l, ret, nshots, Nfoc, nt, nx, nts, nxs, ngath, nacq;
+    int     n1, n2, ntap, tap, di, ntraces, tr;
     int     nw, nw_low, nw_high, nfreq, *xnx, *xnxsyn;
-    int     reci, countmin, mode, ixa, ixb, n2out, verbose, ntfft;
+    int     reci, countmin, mode, n2out, verbose, ntfft;
     int     iter, niter, niterec, recur, niterskip, niterrun, tracf, *muteW;
     int     hw, ii, iw, ishot, istart, iend;
-    int     smooth, *ixpos, npos, ix, m, pad, T, isms, isme, perc;
-    int     nshots_r, *isxcount, *reci_xsrc, *reci_xrcv, shift, plane_wave, xorig;
+    int     smooth, *ixpos, *ixp, npos, ix, ixrcv, m, pad, T, isms, isme, perc;
+    int     nshots_r, *isxcount, *reci_xsrc, *reci_xrcv, shift, plane_wave;
     float   fmin, fmax, tom, deltom, *tapersh, *tapersy, fxf, dxf, *xsrc, *xrcv, *zsyn, *zsrc, *xrcvsyn;
     double  t0, t1, t2, t3, t4, tsyn, tread, tfft, tcopy, tii;
 	double  energyMi, *energyM0;
     float   tt0, d1, d2, f1, f2, fxsb, fxse, ft, fx, *xsyn, dxsrc;
     float   *M0, *DD, *RR, *SRC, dt, dx, dxs, scl, mem, scltap;
-    float   *rtrace, *tmpdata, *f1min, *f1plus, *RMi, *Mi, *trace;
+    float   *rtrace, *tmpdata, *u1min, *v1plus, *RMi, *Mi, *trace;
 	float   *Mup, *Msp, *maxval;
     float   xmin, xmax, scale, tsq;
 	float   Q, f0, *ixmask, *costaper;
 	float   src_velo, src_angle, grad2rad, p, *twplane;
     complex *Refl, *Fop, *ctrace, *cwave, csum, cwav;
     char    *file_tinv, *file_shot, *file_rr, *file_src, *file_iter, *file_update;
+	char    *file_dd;
     segy    *hdrs_out, hdr;
 
     initargs(argc, argv);
@@ -142,6 +143,7 @@ int main (int argc, char **argv)
     if (!getparstring("file_tinv", &file_tinv)) file_tinv = NULL;
     if(!getparstring("file_src", &file_src)) file_src = NULL;
     if (!getparstring("file_rr", &file_rr)) verr("parameter file_rr not found");
+    if (!getparstring("file_dd", &file_rr)) file_dd = NULL;
     if (!getparstring("file_iter", &file_iter)) file_iter = NULL;
     if (!getparstring("file_update", &file_update)) file_update = NULL;
     
@@ -188,7 +190,7 @@ int main (int argc, char **argv)
 	smooth = MIN(smooth, shift);
     if (smooth) {
         costaper = (float *)malloc(smooth*sizeof(float));
-        scl = M_PI/((float)smooth);
+        scl = M_PI/((float)smooth+1);
         for (i=0; i<smooth; i++) {
             costaper[i] = 0.5*(1.0+cos((i+1)*scl));
         }
@@ -200,6 +202,7 @@ int main (int argc, char **argv)
         ngath = 0; /* setting ngath=0 scans all traces; n2 contains maximum traces/gather */
         ret = getFileInfo(file_tinv, &n1, &n2, &ngath, &d1, &d2, &f1, &f2, &xmin, &xmax, &scl, &ntraces);
         Nfoc = ngath;
+        nacq = n2;
         nxs = n2; 
         nts = n1;
         dxs = d2; 
@@ -220,27 +223,28 @@ int main (int argc, char **argv)
         if(!getparint("ishot", &ishot)) ishot=1+(nshots-1)/2;
 		ishot -= 1; /* shot numbering starts at 0 */
         Nfoc = 1;
-        nxs  = nx;
+        nacq = NINT((xmax-xmin)/dx)+1;
+        nxs  = nshots;
         nts  = nt;
         dxs  = dx;
-        fxsb = fx;
+        fxsb = xmin;
+        fxse = xmax;
     }
-    assert (nxs >= nshots); /* ToDo allow other geometries */
-    //if(!getparint("xorig", &xorig)) xorig=-(nxs-1)/2;
+    assert (nacq >= nshots); /* ToDo allow other geometries */
 
 	/* compute time delay for plane-wave responses */
-    twplane = (float *) calloc(nxs,sizeof(float)); /* initialize with zeros */
+    twplane = (float *) calloc(nacq,sizeof(float)); /* initialize with zeros */
 	if (plane_wave==1) {
         grad2rad = 17.453292e-3;
         p = sin(src_angle*grad2rad)/src_velo;
         if (p < 0.0) {
-			for (i=0; i<nxs; i++) {
-				twplane[i] = fabsf((nxs-i-1)*dxs*p)+tt0;
-				if (verbose >=3) vmess("plane-wave delay-time i=%d x=%f t=%f", i, dxs*(nxs-i-1), twplane[i]);
+			for (i=0; i<nacq; i++) {
+				twplane[i] = fabsf((nacq-i-1)*dxs*p)+tt0;
+				if (verbose >=3) vmess("plane-wave delay-time i=%d x=%f t=%f", i, dxs*(nacq-i-1), twplane[i]);
             }
         }
 		else {
-			for (i=0; i<nxs; i++) {
+			for (i=0; i<nacq; i++) {
 				twplane[i] = (i)*dxs*p+tt0;
 				if (verbose >=3) vmess("plane-wave delay-time i=%d x=%f t=%f", i, dxs*(i), twplane[i]);
 			}
@@ -260,19 +264,19 @@ int main (int argc, char **argv)
 
 /*================ Allocating all data arrays ================*/
 
-    Fop     = (complex *)calloc(nxs*nw*Nfoc,sizeof(complex));
-    f1min   = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
-    f1plus  = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
-    RMi     = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
+    Fop     = (complex *)calloc(nacq*nw*Nfoc,sizeof(complex));
+    RMi     = (float *)calloc(Nfoc*nacq*ntfft,sizeof(float));
+    DD      = (float *)calloc(Nfoc*nacq*ntfft,sizeof(float));
     Mi      = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
-    M0     = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
-    DD      = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
+    M0      = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
+    u1min   = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
+    v1plus  = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
     SRC     = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
     RR      = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
     Mup     = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
     Msp     = (float *)calloc(Nfoc*nxs*ntfft,sizeof(float));
     trace   = (float *)malloc(ntfft*sizeof(float));
-    ixpos   = (int *)malloc(nxs*sizeof(int));
+    ixpos   = (int *)malloc(nacq*sizeof(int));
     energyM0= (double *)malloc(Nfoc*sizeof(double));
     xrcvsyn = (float *)calloc(Nfoc*nxs,sizeof(float));
     xsyn    = (float *)malloc(Nfoc*sizeof(float));
@@ -363,8 +367,8 @@ int main (int argc, char **argv)
 /*================ Reading shot records ================*/
 
     mode=1;
-    readShotData(file_shot, xrcv, xsrc, zsrc, xnx, Refl, nw, nw_low, ngath, nx, nx, fxsb, dxs, ntfft, 
-         mode, scale, tsq,  Q, f0, reci, &nshots_r, isxcount, reci_xsrc, reci_xrcv, ixmask,verbose);
+    readShotData(file_shot, xrcv, xsrc, zsrc, xnx, Refl, nw, nw_low, nshots, nx, nx, fxsb, dxs, ntfft, 
+         mode, scale, tsq, Q, f0, reci, &nshots_r, isxcount, reci_xsrc, reci_xrcv, ixmask,verbose);
 
     if (tap == 2 || tap == 3) {
     	tapersh = (float *)malloc(nx*sizeof(float));
@@ -402,19 +406,30 @@ int main (int argc, char **argv)
         dxsrc = dx;
     }
 
+/*================ set focusing postions in R ================*/
+
+    synthesisPositions(nx, nt, nacq, nts, dt, xsyn, Nfoc, xrcv, xsrc, xnx, fxse, fxsb,
+        dxs, dxsrc, dx, nshots, ixpos, &npos, isxcount, countmin, reci, verbose);
+
+    if (verbose) {
+        vmess("synthesisPositions: nshots=%d npos=%d", nshots, npos);
+    }
+
 /*================ Defining focusing operator(s) from R ================*/
 /* M0 = -R(ishot,-t) */
 
     /* use ishot from Refl, complex-conjugate(time reverse), scale with -1 and convolve with wavelet */
     if (file_tinv == NULL) {
         if (verbose) vmess("Selecting M0 from Refl of %s", file_shot);
-        nts   = ntfft;
+        nts = ntfft;
+		//nxs = xnx[ishot];
 
         scl   = 1.0/((float)2.0*ntfft);
         rtrace = (float *)calloc(ntfft,sizeof(float));
         ctrace = (complex *)calloc(nfreq+1,sizeof(complex));
 
         for (i = 0; i < xnx[ishot]; i++) {
+			ixrcv = NINT((xrcv[ishot*nx+i]-fxsb)/dxs);
             for (j = nw_low, m = 0; j <= nw_high; j++, m++) {
                 ctrace[j].r =  Refl[ishot*nw*nx+m*nx+i].r*cwave[j].r + Refl[ishot*nw*nx+m*nx+i].i*cwave[j].i;
                 ctrace[j].i = -Refl[ishot*nw*nx+m*nx+i].i*cwave[j].r + Refl[ishot*nw*nx+m*nx+i].r*cwave[j].i;;
@@ -422,7 +437,7 @@ int main (int argc, char **argv)
             /* transfrom result back to time domain */
             cr1fft(ctrace, rtrace, ntfft, 1);
             for (j = 0; j < nts; j++) {
-                DD[0*nxs*nts+i*nts+j] = -1.0*scl*rtrace[j];
+                DD[0*nxs*nts+ixrcv*nts+j] = -1.0*scl*rtrace[j];
             }
 		    /* remove taper at edges for selected shot record */
     	    //if (tap == 2 || tap == 3) scltap= scl/tapersh[i];
@@ -439,15 +454,16 @@ int main (int argc, char **argv)
 		//for (i=0; i<nxs; i++) twplane[i] = dt*(maxval[i]-maxval[ishot]);
         //for (i = 0; i < xnx[ishot]; i++) fprintf(stderr,"maxval[%d] = %f tw=%f\n", i, dt*maxval[i], twplane[i]);
 
-		/* construct plane wave (time reversed and multiplid with -1) from all shot records */
+		/* construct plane wave (time reversed and multiplied with -1) from all shot records */
 		if (plane_wave==1) {
-        	for (l=0; l<nshots; l++) {
+			nxs = nshots;
+        	for (l=0; l<nxs; l++) {
+				ix = ixpos[l];
 				memset(ctrace, 0, sizeof(complex)*(nfreq+1));
             	for (j = nw_low, m = 0; j <= nw_high; j++, m++) {
-            		tom = j*deltom*twplane[l];
+            		tom = j*deltom*twplane[ix];
 					csum.r=0.0; csum.i=0.0;
         			for (i = 0; i < xnx[l]; i++) {
-            			tom = j*deltom*twplane[i];
             			csum.r += Refl[l*nw*nx+m*nx+i].r*cos(-tom) - Refl[l*nw*nx+m*nx+i].i*sin(-tom);
             			csum.i += Refl[l*nw*nx+m*nx+i].i*cos(-tom) + Refl[l*nw*nx+m*nx+i].r*sin(-tom);
             		}
@@ -458,11 +474,11 @@ int main (int argc, char **argv)
             	/* transfrom result back to time domain */
             	cr1fft(ctrace, rtrace, ntfft, 1);
             	for (j = 0; j < nts; j++) {
-               		DD[0*nxs*nts+l*nts+j] = -1.0*scl*rtrace[j];
+               		DD[0*nxs*nts+ix*nts+j] = -1.0*scl*rtrace[j];
         		}
 				/* compute Source wavelet for plane-wave imaging */
             	for (j = nw_low, m = 0; j <= nw_high; j++, m++) {
-            		tom = j*deltom*twplane[l];
+            		tom = j*deltom*twplane[ix];
             		csum.r = cos(-tom);
             		csum.i = sin(-tom);
                 	/* Optional add wavelet to SRC-field */
@@ -483,14 +499,17 @@ int main (int argc, char **argv)
         xsyn[0] = xsrc[ishot];
         zsyn[0] = zsrc[ishot];
         xnxsyn[0] = xnx[ishot];
+        /* find minimum and maximum postions in header values */
+/*
         fxse = fxsb = xrcv[0];
-        /* check consistency of header values */
         for (l=0; l<nshots; l++) {
             for (i = 0; i < nx; i++) {
                 fxsb = MIN(xrcv[l*nx+i],fxsb);
                 fxse = MAX(xrcv[l*nx+i],fxse);
             }
         }
+*/
+/* not needed xmin and xmax are the same */
         dxf = dx;
         dxs = dx;
     }
@@ -507,13 +526,16 @@ int main (int argc, char **argv)
         if (verbose) vmess("Taper for operator applied ntap=%d", ntap);
         for (l = 0; l < Nfoc; l++) {
             for (i = 0; i < nxs; i++) {
+				ix = ixpos[i];
                 for (j = 0; j < nts; j++) {
-                    DD[l*nxs*nts+i*nts+j] *= tapersy[i];
+                    DD[l*nxs*nts+ix*nts+j] *= tapersy[i];
                 }   
             }   
         }   
     	free(tapersy);
     }
+    ixp = (int *)malloc(nxs*sizeof(int));
+    for (i=0; i<nxs; i++) ixp[i] = i;
 
 /*================ Check the size of the files ================*/
 
@@ -525,9 +547,10 @@ int main (int argc, char **argv)
     if ((NINT(di*dxs) != NINT(dxf)) && verbose) 
         vwarn("dx in receiver (%.2f) and operator (%.2f) don't match",dx,dxs);
     if (verbose) {
-        vmess("Number of receivers in focusop  = %d", nxs);
+        vmess("Number of receivers in tinv     = %d", nxs);
         vmess("number of shots                 = %d", nshots);
         vmess("number of receiver/shot         = %d", nx);
+        vmess("number of receiver acquisition  = %d", nacq);
         vmess("first model position            = %.2f", fxsb);
         vmess("last model position             = %.2f", fxse);
         vmess("first source position fxf       = %.2f", fxf);
@@ -550,14 +573,14 @@ int main (int argc, char **argv)
         if (file_iter != NULL)  {
 			vmess("Iterations output file          = %s ", file_iter);
 			vmess("Initialisation input data       = M0_%06d.su ", 1000*istart);
-			vmess("f1min intermediate array        = f1min_%03d'iter'.su ", istart);
+			vmess("u1min intermediate array        = u1min_%03d'iter'.su ", istart);
 			vmess("Mi intermediate array           = Mi_%03d'iter'.su ", istart);
 		}
     }
 
 /*================ initializations ================*/
 
-    if (reci) n2out = nxs;
+    if (reci) n2out = nacq;
     else n2out = nshots;
     mem = Nfoc*n2out*ntfft*sizeof(float)/1048576.0;
     if (verbose) {
@@ -567,15 +590,6 @@ int main (int argc, char **argv)
         vmess("Size of output data/file        = %.1f MB", mem);
     }
 
-	ixa=0; ixb=0;
-
-    synthesisPositions(nx, nt, nxs, nts, dt, xsyn, Nfoc, xrcv, xsrc, xnx, fxse, fxsb,
-        dxs, dxsrc, dx, nshots, ixpos, &npos, isxcount, countmin, reci, verbose);
-
-    if (verbose) {
-        vmess("synthesisPositions: nshots=%d npos=%d", nshots, npos);
-    }
-
 /*================ set variables for output data ================*/
 
     n1 = nts; 
@@ -616,16 +630,22 @@ int main (int argc, char **argv)
     perc=(iend-istart)/100;if(!perc)perc=1;
 
     if (plane_wave) {
-		writeDataIter("SRCplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, NINT(src_angle));
-		/* make DD causal again and undo the -1 multplication */
-        for (l=0; l<nshots; l++) {
-            j=0;
-            SRC[l*nts+j] = -1.0*DD[l*nts+j];
-            for (j = 1; j < nts; j++) {
-                SRC[l*nts+j] = -1.0*DD[l*nts+nts-j];
-            }
+		writeDataIter("SRCplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, NINT(src_angle));
+	}
+	/* make DD causal again and undo the -1 multiplication */
+    for (l=0; l<npos; l++) {
+		ix = ixpos[l];
+        j=0;
+        SRC[l*nts+j] = -1.0*DD[ix*nts+j];
+        for (j = 1; j < nts; j++) {
+            SRC[l*nts+j] = -1.0*DD[ix*nts+nts-j];
         }
-		writeDataIter("DDplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, NINT(src_angle));
+    }
+    if (plane_wave) {
+	writeDataIter("DDplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, NINT(src_angle));
+	}
+	else {
+	writeDataIter("DDshot.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, ishot);
 	}
 	free(SRC);
 
@@ -635,40 +655,43 @@ int main (int argc, char **argv)
 
 /*================ initialization ================*/
 
+        memset(M0, 0, Nfoc*nxs*ntfft*sizeof(float));
+        memset(v1plus, 0, Nfoc*nxs*ntfft*sizeof(float));
         /* once every 'niterskip' time-steps start from fresh M0 and do niter (~20) iterations */
 		if ( ((ii-istart)%niterskip==0) || (ii==istart) ) {
 			niterrun=niter;
 			recur=0;
-			if (verbose>1) vmess("Doing %d iterations to reset recursion at time-sample %d\n",niterrun,ii);
+			if (verbose>2) vmess("Doing %d iterations to reset recursion at time-sample %d\n",niterrun,ii);
             for (l = 0; l < Nfoc; l++) {
-                for (i = 0; i < nxs; i++) {
-					iw = NINT((ii*dt+twplane[i])/dt);
-					//iw = ii;
+                for (i = 0; i < npos; i++) {
+                    ix = ixpos[i];
+					iw = NINT((ii*dt+twplane[ix])/dt);
                     for (j = 0; j < nts; j++) {
-                        M0[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+i*nts+j];
+                        M0[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+ix*nts+j];
                     }
 					/* apply mute window for samples above nts-ii */
                     for (j = 0; j < MIN(nts, nts-iw+isms); j++) {
                         M0[l*nxs*nts+i*nts+j] = 0.0;
                     }
                     for (j = nts-iw+isms, k=1; j < MIN(nts, nts-iw+isme); j++, k++) {
+						//fprintf(stderr,"j=%d smooth-k=%d taper=%f\n",j,smooth-k,costaper[smooth-k]);
                         M0[l*nxs*nts+i*nts+j] *= costaper[smooth-k];
                     }
                 }
                 for (i = 0; i < npos; i++) {
                     ix = ixpos[i];
                     j = 0;
-                    f1min[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+j];
+                    u1min[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+j];
                     for (j = 1; j < nts; j++) {
-                       f1min[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+nts-j];
+                       u1min[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+nts-j];
                     }
 			    }
 			}
         	if (file_iter != NULL) {
-           	    writeDataIter("M0.su", M0, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, 1000*ii);
+           	    writeDataIter("M0.su", M0, hdrs_out, ntfft, nacq, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii);
 			}
 		}
-		else { /* use f1min from previous iteration as starting point and do niterec iterations */
+		else { /* use u1min from previous iteration as starting point and do niterec iterations */
 			niterrun=niterec;
 			recur=1;
 			if (verbose>1) vmess("Doing %d iterations using previous result at time-sample %d",niterrun,ii);
@@ -678,9 +701,9 @@ int main (int argc, char **argv)
                     ix = ixpos[i];
 					iw = NINT((ii*dt+twplane[ix])/dt);
 					//iw = ii;
-                    M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts] - f1min[l*nxs*nts+i*nts+j];
+                    M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts] - u1min[l*nxs*nts+i*nts+j];
                     for (j = 1; j < nts; j++) {
-                        M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+nts-j] - f1min[l*nxs*nts+i*nts+nts-j];
+                        M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+nts-j] - u1min[l*nxs*nts+i*nts+nts-j];
                     }
 					/* apply mute window for samples above nts-ii */
                     for (j = 0; j < MIN(nts,nts-iw+isms); j++) {
@@ -705,25 +728,26 @@ int main (int argc, char **argv)
     
 /*================ construction of Mi(-t) = - \int R(x,t) Mi(t)  ================*/
 
-            synthesis(Refl, Fop, Mi, RMi, nx, nt, nxs, nts, dt, xsyn, Nfoc,
+            synthesisp(Refl, Fop, Mi, RMi, nx, nt, nacq, nts, dt, xsyn, Nfoc,
                 xrcv, xsrc, xnx, fxse, fxsb, dxs, dxsrc, dx, ntfft, nw, nw_low, nw_high, mode,
                 reci, nshots, ixpos, npos, &tfft, isxcount, reci_xsrc, reci_xrcv, ixmask, verbose);
 
         	if (file_iter != NULL) {
-            	writeDataIter(file_iter, RMi, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, 1000*ii+iter+1);
+            	writeDataIter(file_iter, RMi, hdrs_out, ntfft, nacq, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, 1000*ii+iter+1);
         	}
 
 			if (verbose >=2) {
                 for (l = 0; l < Nfoc; l++) {
 			        energyMi = 0.0;
                     for (i = 0; i < npos; i++) {
+                    	ix = ixpos[i];
                         for (j = 0; j < nts; j++) {
-                            energyMi += RMi[l*nxs*nts+ix*nts+j]*RMi[l*nxs*nts+ix*nts+j];
+                            energyMi += RMi[l*nacq*nts+ix*nts+j]*RMi[l*nacq*nts+ix*nts+j];
 					    }
                     }
             		if (iter % 2 == 0) { 
-                    	if (iter==0) energyM0[Nfoc] = energyMi;
-                        vmess(" - iSyn %d: Mi at iteration %d has energy %e; relative to M0 %e", l, iter, sqrt(energyMi), sqrt(energyMi/energyM0[Nfoc]));
+                    	if (iter==0) energyM0[l] = energyMi;
+                        vmess(" - ii %d: Mi at iteration %d has energy %e; relative to M0 %e", ii, iter, sqrt(energyMi), sqrt(energyMi/energyM0[l]));
                    }
                 }
             }
@@ -736,9 +760,9 @@ int main (int argc, char **argv)
                 for (i = 0; i < npos; i++) {
                     j = 0;
                     ix = ixpos[i];
-                    Mi[l*nxs*nts+i*nts+j]    = -RMi[l*nxs*nts+ix*nts+j];
+                    Mi[l*nxs*nts+i*nts+j]    = -RMi[l*nacq*nts+ix*nts+j];
                     for (j = 1; j < nts; j++) {
-                        Mi[l*nxs*nts+i*nts+j]    = -RMi[l*nxs*nts+ix*nts+nts-j];
+                        Mi[l*nxs*nts+i*nts+j]    = -RMi[l*nacq*nts+ix*nts+nts-j];
                     }
                 }
             }
@@ -765,44 +789,41 @@ int main (int argc, char **argv)
                         for (j = MAX(0,iw+shift-smooth), k=1; j < MAX(0,iw+shift); j++, k++) {
                             Mi[l*nxs*nts+i*nts+j] *= costaper[smooth-k];
                         }
-                        f1plus[l*nxs*nts+i*nts+j] += Mi[l*nxs*nts+i*nts+j];
-                        for (j = 1; j < nts; j++) {
-                            f1plus[l*nxs*nts+i*nts+j] += Mi[l*nxs*nts+i*nts+j];
+                        for (j = 0; j < nts; j++) {
+                            v1plus[l*nxs*nts+i*nts+j] += Mi[l*nxs*nts+i*nts+j];
                         }
                     }
                 }
-/*
         		if (file_iter != NULL) {
-            		writeDataIter("f1plus.su", f1plus, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, 1000*ii+iter);
+            		writeDataIter("v1plus.su", v1plus, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
 				}
-*/
             }
             else {/* odd iterations: => f_1^-(t)  */
                 for (l = 0; l < Nfoc; l++) {
                     for (i = 0; i < npos; i++) {
                     	ix = ixpos[i];
-						if (recur==1) { /* use f1min from previous iteration */
+						if (recur==1) { /* use u1min from previous iteration */
                             for (j = 0; j < nts; j++) {
                                 Mi[l*nxs*nts+i*nts+j] += DD[l*nxs*nts+ix*nts+j];
 						    }
                             j = 0;
-                            f1min[l*nxs*nts+i*nts+j] = -Mi[l*nxs*nts+i*nts+j];
+                            u1min[l*nxs*nts+i*nts+j] = -Mi[l*nxs*nts+i*nts+j];
                             for (j = 1; j < nts; j++) {
-                                f1min[l*nxs*nts+i*nts+j] = -Mi[l*nxs*nts+i*nts+nts-j];
+                                u1min[l*nxs*nts+i*nts+j] = -Mi[l*nxs*nts+i*nts+nts-j];
                             }
         		        	if (file_update != NULL) {
 								j=0;
-                            	Mup[l*nxs*nts+i*nts+j] += f1min[l*nxs*nts+i*nts+j]+DD[l*nxs*nts+i*nts+j];
+                            	Mup[l*nxs*nts+i*nts+j] += u1min[l*nxs*nts+i*nts+j]+DD[l*nxs*nts+ix*nts+j];
                             	for (j = 1; j < nts; j++) {
-                                	Mup[l*nxs*nts+i*nts+j] += f1min[l*nxs*nts+i*nts+j]+DD[l*nxs*nts+i*nts+nts-j];
+                                	Mup[l*nxs*nts+i*nts+j] += u1min[l*nxs*nts+i*nts+j]+DD[l*nxs*nts+ix*nts+nts-j];
                             	}
 							}
 						}
 						else {
                             j = 0;
-                            f1min[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+j];
+                            u1min[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+j];
                             for (j = 1; j < nts; j++) {
-                                f1min[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+nts-j];
+                                u1min[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+nts-j];
                             }
         		        	if (file_update != NULL) {
 								j=0;
@@ -832,11 +853,11 @@ int main (int argc, char **argv)
                     }
                 }
         		if (file_iter != NULL) {
-            		writeDataIter("f1min.su", f1min, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, 1000*ii+iter+1);
+            		writeDataIter("u1min.su", u1min, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
 				}
             } /* end else (iter) branch */
         	if (file_iter != NULL) {
-                writeDataIter("Mi.su", Mi, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixpos, npos, 0, 1000*ii+iter+1);
+                writeDataIter("Mi.su", Mi, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
 			}
 
             t2 = wallclock_time();
@@ -850,7 +871,7 @@ int main (int argc, char **argv)
            		ix = ixpos[i];
 				iw = NINT((ii*dt+twplane[ix])/dt);
                 if ( iw<nts && iw>=0 )  {
-                    RR[l*nxs*nts+i*nts+iw] = f1min[l*nxs*nts+i*nts+iw];
+                    RR[l*nxs*nts+i*nts+iw] = u1min[l*nxs*nts+i*nts+iw];
        			    if (file_update != NULL) Msp[l*nxs*nts+i*nts+iw] = Mup[l*nxs*nts+i*nts+iw];
 				}
             }
@@ -875,8 +896,8 @@ int main (int argc, char **argv)
     free(Mi);
     free(energyM0);
     free(M0);
-    free(f1min);
-    free(f1plus);
+    free(u1min);
+    free(v1plus);
 
     t2 = wallclock_time();
     if (verbose) {
diff --git a/marchenko/synthesis.c b/marchenko/synthesis.c
index e975d87..237a016 100644
--- a/marchenko/synthesis.c
+++ b/marchenko/synthesis.c
@@ -89,16 +89,16 @@ nw, int nw_low, int nw_high,  int mode, int reci, int nshots, int *ixpos, int np
     ctrace = (complex *)calloc(ntfft,sizeof(complex));
 
 /* this first check is done to support an acquisition geometry that has more receiver than source
- * postions. In the first iteration the int R(x_r,x_s) Fop(x_r) d x_r results in a grid on x_s. 
- * so for the next interations onlt x_s traces have to be computed on Fop */
+ * positions. In the first iteration the int R(x_r,x_s) Fop(x_r) d x_r results in a grid on x_s. 
+ * so for the next interations only x_s traces have to be computed on Fop */
     if (!first) {
-    /* transform muted Ni (Top) to frequency domain, input for next iteration  */
+    	/* transform muted Ni (Top) to frequency domain, input for next iteration  */
         for (l = 0; l < Nfoc; l++) {
             /* set Fop to zero, so new operator can be defined within ixpos points */
            memset(&Fop[l*nxs*nw], 0, nxs*nw*sizeof(complex));
             for (i = 0; i < npos; i++) {
-                rc1fft(&Top[l*size+i*nts],ctrace,ntfft,-1);
                 ix = ixpos[i];
+                rc1fft(&Top[l*size+i*nts],ctrace,ntfft,-1);
                 for (iw=0; iw<nw; iw++) {
                     Fop[l*nxs*nw+iw*nxs+ix].r = ctrace[nw_low+iw].r;
                     Fop[l*nxs*nw+iw*nxs+ix].i = mode*ctrace[nw_low+iw].i;
@@ -107,7 +107,7 @@ nw, int nw_low, int nw_high,  int mode, int reci, int nshots, int *ixpos, int np
         }
     }
     else { /* only for first call to synthesis using all nxs traces in G_d */
-    /* transform G_d to frequency domain, over all nxs traces */
+    	/* transform G_d to frequency domain, over all nxs traces */
         first=0;
         for (l = 0; l < Nfoc; l++) {
             /* set Fop to zero, so new operator can be defined within all ix points */
@@ -271,6 +271,7 @@ float fxse, float fxsb, float dxs, float dxsrc, float dx, int nshots, int *ixpos
         for (k=0; k<nshots; k++) {
 
             ixsrc = NINT((xsrc[k] - fxsb)/dxs);
+                vmess("source position:     %.2f in operator %d", xsrc[k], ixsrc);
             if (verbose>=3) {
                 vmess("source position:     %.2f in operator %d", xsrc[k], ixsrc);
                 vmess("receiver positions:  %.2f <--> %.2f", xrcv[k*nx+0], xrcv[k*nx+nx-1]);
diff --git a/utils/getFileInfo.c b/utils/getFileInfo.c
index 5aec1a4..d93010a 100644
--- a/utils/getFileInfo.c
+++ b/utils/getFileInfo.c
@@ -43,6 +43,8 @@ int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *
     ret = fseeko( fp, 0, SEEK_END );
 	if (ret<0) perror("fseeko");
     bytes = ftello( fp );
+	*xmax = hdr.gx;
+	*xmin = hdr.gx;
 
     *n1 = hdr.ns;
     if ( (hdr.trid == 1) && (hdr.dt != 0) ) {
@@ -112,9 +114,7 @@ int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *
         one_shot    = 1;
         igath       = 0;
         fseeko( fp, 0, SEEK_SET );
-		offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
-    	*xmax = offset;
-    	*xmin = offset;
+		//offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
         dxrcv = *d2;
 
         while (!end_of_file) {
@@ -125,6 +125,8 @@ int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *
             sx_shot   = hdr.sx;
             gx_start  = hdr.gx;
             gx_end    = hdr.gx;
+    		*xmax = MAX(MAX(hdr.gx,*xmax),hdr.sx);
+    		*xmin = MIN(MIN(hdr.gx,*xmin),hdr.sx);
     
             itrace = 0;
             while (one_shot) {
@@ -132,9 +134,11 @@ int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *
                 itrace++;
                 if (hdr.gx != gx_end) dxrcv = MIN(dxrcv,abs(hdr.gx-gx_end));
                 gx_end = hdr.gx;
-				offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
-            	*xmax = MAX(*xmax,offset);
-            	*xmin = MIN(*xmin,offset);
+				//offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
+            	//*xmax = MAX(*xmax,offset);
+            	//*xmin = MIN(*xmin,offset);
+    			*xmax = MAX(MAX(hdr.gx,*xmax),hdr.sx);
+    			*xmin = MIN(MIN(hdr.gx,*xmin),hdr.sx);
                 nread = fread( &hdr, 1, TRCBYTES, fp );
                 if (nread != TRCBYTES) {
                     one_shot = 0;
@@ -167,14 +171,18 @@ int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *
 
         fseeko( fp, -trace_sz, SEEK_END );
         nread = fread( &hdr, 1, TRCBYTES, fp );
-		offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
-        *xmax = MAX(*xmax,offset);
-        *xmin = MIN(*xmin,offset);
-		*xmin = MIN(sx_shot,hdr.sx*scl);
+		//offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
+        //*xmax = MAX(*xmax,offset);
+        //*xmin = MIN(*xmin,offset);
+		//*xmin = MIN(sx_shot,hdr.sx*scl);
+    	*xmax = MAX(MAX(hdr.gx,*xmax),hdr.sx);
+    	*xmin = MIN(MIN(hdr.gx,*xmin),hdr.sx);
 		*ngath = ntraces/(*n2);
     }
 //    *nxm = NINT((*xmax-*xmin)/dxrcv)+1;
 	*nxm = (int)ntraces;
+	*xmax *= scl;
+	*xmin *= scl;
 
     fclose( fp );
     free(trace);
-- 
GitLab