/* geom3181 - put the 1981 observer's log geometry into NPRA line 31-81 traces * (Claude Opus 5.5, 2026-10-17). SU filter: stdin -> stdout. * * From the GSI observer's log (party 1186, 12 March 1981): shot point SP = field file - 11 for * files 111..156, file 157 misfired, SP = file - 12 for files 158..167. Split spread, 96 groups * at 110 ft, 48 each side of the shot, nearest groups 55 ft from it; shots every 440 ft. * Units are feet. Group g is at x = 440*SP + 110*(g - 48.5); reverse=1 flips the spread * (group g -> 97 - g) to test which end group 1 is at. * * Output headers: fldr kept, tracf = group, ep = SP, sx, gx, offset (gx - sx, signed), * cdp (55 ft bins, 1 = first midpoint of the line), cdpt, trid = 2 for traces the log calls dead. * Drops test files, the misfire, file 168 and the auxiliary channels 97+. */ #include "su.h" #include "segy.h" char *sdoc[] = { "geom3181 out.su [reverse=0] geometry for NPRA line 31-81 (see source)", NULL}; segy tr; int main(int argc, char **argv) { int reverse, sp, g, x2, nin = 0, nout = 0; initargs(argc, argv); requestdoc(1); if (!getparint("reverse", &reverse)) reverse = 0; while (gettr(&tr)) { nin++; if (tr.fldr >= 111 && tr.fldr <= 156) sp = tr.fldr - 11; else if (tr.fldr >= 158 && tr.fldr <= 167) sp = tr.fldr - 12; else continue; g = tr.tracf; if (g < 1 || g > 96) continue; if (reverse) g = 97 - g; tr.ep = sp; tr.sx = 440 * sp; /* gx = 440*sp + 110*g - 5335 (exact in feet) */ tr.gx = 440 * sp + 110 * g - 5335; tr.offset = tr.gx - tr.sx; tr.scalco = 1; tr.counit = 1; /* midpoint*2 = 880*sp + 110*g - 5335; bins of 55 ft: index 8*sp + g - 49 (exact, midpoints sit 27.5 ft past each 55 ft boundary); first midpoint (sp 100, g 1) -> 1 */ x2 = 8 * sp + g - 48; tr.cdp = x2 - (8 * 100 + 1 - 48) + 1; tr.cdpt = g; tr.trid = 1; if ((sp == 130 && (tr.tracf == 1 || tr.tracf == 2)) || (sp == 132 && tr.tracf == 92)) tr.trid = 2; puttr(&tr); nout++; } warn("%d traces in, %d out", nin, nout); return 0; }