1 #pragma TextEncoding = "UTF-8"
2 #pragma rtGlobals=3 // Use modern global access method and strict wave access.
3 #pragma IgorVersion = 6.1
4 #pragma ModuleName = PearlAreaProfiles
55 threadsafe
function /wave
ad_extract_rod(dataset, x1, x2, y1, y2, z1, z2, destname, [noavg, sdev, pscale])
57 variable x1, x2, y1, y2, z1, z2
63 if (wavedims(dataset) != 3)
66 if (ParamIsDefault(noavg))
69 if (ParamIsDefault(sdev))
72 if (ParamIsDefault(pscale))
76 variable p1, p2, q1, q2, r1, r2
85 p1 = round((x1 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
86 p2 = round((x2 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
87 q1 = round((y1 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
88 q2 = round((y2 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
89 r1 = round((z1 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
90 r2 = round((z2 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
93 if ((numtype(p1) == 2) || (numtype(p2) == 2))
94 return
ad_extract_rod_x(dataset, min(q1, q2), max(q1, q2), min(r1, r2), max(r1, r2), destname, noavg=noavg, sdev=sdev)
95 elseif ((numtype(q1) == 2) || (numtype(q2) == 2))
96 return
ad_extract_rod_y(dataset, min(p1, p2), max(p1, p2), min(r1, r2), max(r1, r2), destname, noavg=noavg, sdev=sdev)
97 elseif ((numtype(r1) == 2) || (numtype(r2) == 2))
98 return
ad_extract_rod_z(dataset, min(p1, p2), max(p1, p2), min(q1, q2), max(q1, q2), destname, noavg=noavg, sdev=sdev)
107 threadsafe function /wave
ad_extract_rod_x(dataset, q1, q2, r1, r2, destname, [noavg, sdev])
109 variable q1, q2, r1, r2
115 if (ParamIsDefault(noavg))
118 if (ParamIsDefault(sdev))
121 variable avg = !noavg && !sdev
124 q2 = min(q2, dimsize(dataset, 1) - 1)
126 r2 = min(r2, dimsize(dataset, 2) - 1)
128 if (strlen(destname) > 0)
129 duplicate /r=[][q1,q1][r1,r1]/o dataset, $destname
130 wave w_dest = $destname
132 duplicate /r=[][q1,q1][r1,r1] /free dataset, w_dest
134 redimension /n=(dimsize(w_dest, 0)) w_dest
135 setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
140 for (qq = q1; qq <= q2; qq += 1)
141 for (rr = r1; rr <= r2; rr += 1)
142 w_dest += dataset[p][qq][rr]
148 duplicate /free w_dest, w_squares
150 for (qq = q1; qq <= q2; qq += 1)
151 for (rr = r1; rr <= r2; rr += 1)
152 w_squares += dataset[p][qq][rr]^2
160 w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
169 threadsafe function /wave
ad_extract_rod_y(dataset, p1, p2, r1, r2, destname, [noavg, sdev])
171 variable p1, p2, r1, r2
177 if (ParamIsDefault(noavg))
180 if (ParamIsDefault(sdev))
183 variable avg = !noavg && !sdev
186 p2 = min(p2, dimsize(dataset, 0) - 1)
188 r2 = min(r2, dimsize(dataset, 2) - 1)
190 if (strlen(destname) > 0)
191 duplicate /r=[p1,p1][][r1,r1]/o dataset, $destname
192 wave w_dest = $destname
194 duplicate /r=[p1,p1][][r1,r1] /free dataset, w_dest
196 redimension /n=(dimsize(w_dest, 1)) w_dest
197 setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
202 for (pp = p1; pp <= p2; pp += 1)
203 for (rr = r1; rr <= r2; rr += 1)
204 w_dest += dataset[pp][p][rr]
210 duplicate /free w_dest, w_squares
212 for (pp = p1; pp <= p2; pp += 1)
213 for (rr = r1; rr <= r2; rr += 1)
214 w_squares += dataset[pp][p][rr]^2
223 w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
232 threadsafe function /wave
ad_extract_rod_z(dataset, p1, p2, q1, q2, destname, [noavg, sdev])
234 variable p1, p2, q1, q2
240 if (ParamIsDefault(noavg))
243 if (ParamIsDefault(sdev))
246 variable avg = !noavg && !sdev
249 p2 = min(p2, dimsize(dataset, 0) - 1)
251 q2 = min(q2, dimsize(dataset, 1) - 1)
253 if (strlen(destname) > 0)
254 duplicate /r=[p1,p1][q1,q1][]/o dataset, $destname
255 wave w_dest = $destname
257 duplicate /r=[p1,p1][q1,q1][] /free dataset, w_dest
259 redimension /n=(dimsize(w_dest, 2)) w_dest
260 setscale /p x dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
265 for (pp = p1; pp <= p2; pp += 1)
266 for (qq = q1; qq <= q2; qq += 1)
267 w_dest += dataset[pp][qq][p]
273 duplicate /free w_dest, w_squares
275 for (pp = p1; pp <= p2; pp += 1)
276 for (qq = q1; qq <= q2; qq += 1)
277 w_squares += dataset[pp][qq][p]^2
286 w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
314 threadsafe function /wave
ad_extract_slab(dataset, x1, x2, y1, y2, z1, z2, destname, [noavg, pscale])
316 variable x1, x2, y1, y2, z1, z2
321 if (wavedims(dataset) != 3)
324 if (ParamIsDefault(noavg))
327 if (ParamIsDefault(pscale))
331 variable p1, p2, q1, q2, r1, r2
340 p1 = round((x1 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
341 p2 = round((x2 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
342 q1 = round((y1 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
343 q2 = round((y2 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
344 r1 = round((z1 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
345 r2 = round((z2 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
348 if ((numtype(p1) < 2) && (numtype(p2) < 2))
349 return
ad_extract_slab_x(dataset, min(p1, p2), max(p1, p2), destname, noavg=noavg)
350 elseif ((numtype(q1) < 2) && (numtype(q2) < 2))
351 return
ad_extract_slab_y(dataset, min(q1, q2), max(q1, q2), destname, noavg=noavg)
352 elseif ((numtype(r1) < 2) && (numtype(r2) < 2))
353 return
ad_extract_slab_z(dataset, min(r1, r2), max(r1, r2), destname, noavg=noavg)
368 if (ParamIsDefault(noavg))
372 p2 = min(p2, dimsize(dataset, 0) - 1)
374 if (strlen(destname) > 0)
375 duplicate /r=[p1,p1][][]/o dataset, $destname
376 wave w_dest = $destname
378 duplicate /r=[p1,p1][][] /free dataset, w_dest
380 redimension /n=(dimsize(w_dest, 1), dimsize(w_dest, 2)) w_dest
381 setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
382 setscale /p y dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
387 for (pp = p1; pp <= p2; pp += 1)
388 w_dest += dataset[pp][p][q]
408 if (ParamIsDefault(noavg))
412 q2 = min(q2, dimsize(dataset, 1) - 1)
414 if (strlen(destname) > 0)
415 duplicate /r=[][q1,q1][]/o dataset, $destname
416 wave w_dest = $destname
418 duplicate /r=[][q1,q1][] /free dataset, w_dest
420 redimension /n=(dimsize(w_dest, 0), dimsize(w_dest, 2)) w_dest
421 setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
422 setscale /p y dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
427 for (qq = q1; qq <= q2; qq += 1)
428 w_dest += dataset[p][qq][q]
448 if (ParamIsDefault(noavg))
452 r2 = min(r2, dimsize(dataset, 2) - 1)
454 if (strlen(destname) > 0)
455 duplicate /r=[][][r1,r1]/o dataset, $destname
456 wave w_dest = $destname
458 duplicate /r=[][][r1,r1] /free dataset, w_dest
460 redimension /n=(dimsize(w_dest, 0), dimsize(w_dest, 1)) w_dest
461 setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
462 setscale /p y dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
467 for (rr = r1; rr <= r2; rr += 1)
468 w_dest += dataset[p][q][rr]
481 threadsafe function /wave
ad_profile_x(dataset, q1, q2, destname, [noavg])
489 if (ParamIsDefault(noavg))
493 if (strlen(destname) > 0)
494 duplicate /r=[0,0][] /o dataset, $destname
495 wave w_dest = $destname
497 duplicate /r=[0,0][] /free dataset, w_dest
512 if (ParamIsDefault(noavg))
516 redimension /n=(dimsize(dataset, 0)) destwave
517 setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), destwave
518 setscale d 0, 0, waveunits(dataset, -1), destwave
524 q2 = min(q2, dimsize(dataset, 1) - 1)
529 for (qq = q1; qq <= q2; qq += 1)
530 destwave += dataset[p][qq]
543 threadsafe function /wave
ad_profile_y(dataset, p1, p2, destname, [noavg])
551 if (ParamIsDefault(noavg))
555 if (strlen(destname) > 0)
556 duplicate /r=[][0,0] /o dataset, $destname
557 wave w_dest = $destname
559 duplicate /r=[][0,0] /free dataset, w_dest
561 MatrixTranspose w_dest
575 if (ParamIsDefault(noavg))
579 redimension /n=(dimsize(dataset, 1)) destwave
580 setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), destwave
581 setscale d 0, 0, waveunits(dataset, -1), destwave
587 p2 = min(p2, dimsize(dataset, 0) - 1)
592 for (pp = p1; pp <= p2; pp += 1)
593 destwave += dataset[pp][p]
608 wave yminlocs =
ad_profile_x(image, 0, 0, "ymins", noavg=1)
609 variable nx = dimsize(image, 0)
611 for (ix = 0; ix < nx; ix += 1)
613 wavestats /q/m=1 profile
614 yminlocs[ix] = v_minloc
628 variable tol = (wavemax(positions) - wavemin(positions)) / numpnts(positions) / 100
630 duplicate /free positions, positions_sorted
631 sort positions_sorted, positions_sorted
632 duplicate /free positions_sorted, positions_diff
633 differentiate /p /meth=2 positions_sorted /d=positions_diff
634 positions_diff[0] = 1
635 extract /free positions_sorted, positions_unique, positions_diff > tol
636 variable n_unique = numpnts(positions_unique)
637 redimension /n=(dimsize(dataset, 0), n_unique) destwave
641 for (i = 0; i < n_unique; i += 1)
642 extract /free dataset, data_extract, abs(positions[q] - positions_unique[i]) < tol
643 nx = dimsize(dataset, 0)
644 ny = dimsize(data_extract, 0) / nx
645 redimension /n=(nx, ny) data_extract
646 wave profile =
ad_profile_x(data_extract, -inf, inf, "", noavg=noavg)
647 destwave[][i] = profile[p]