PEARL Procedures rev-distro-3.1.0-0-gea838b3-dirty
Igor procedures for the analysis of PEARL data
Loading...
Searching...
No Matches
pearl-area-profiles.ipf
Go to the documentation of this file.
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
5#pragma version = 1.05
6
20
26
55threadsafe function /wave ad_extract_rod(dataset, x1, x2, y1, y2, z1, z2, destname, [noavg, sdev, pscale])
56 wave dataset
57 variable x1, x2, y1, y2, z1, z2
58 string destname
59 variable noavg
60 variable sdev
61 variable pscale
62
63 if (wavedims(dataset) != 3)
64 return $""
65 endif
66 if (ParamIsDefault(noavg))
67 noavg = 0
68 endif
69 if (ParamIsDefault(sdev))
70 sdev = 0
71 endif
72 if (ParamIsDefault(pscale))
73 pscale = 0
74 endif
75
76 variable p1, p2, q1, q2, r1, r2
77 if (pscale)
78 p1 = x1
79 p2 = x2
80 q1 = y1
81 q2 = y2
82 r1 = z1
83 r2 = z2
84 else
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))
91 endif
92
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)
99 else
100 return $""
101 endif
102end
103
107threadsafe function /wave ad_extract_rod_x(dataset, q1, q2, r1, r2, destname, [noavg, sdev])
108 wave dataset
109 variable q1, q2, r1, r2
110 // -inf < q1 < q2 < +inf, -inf < r1 < r2 < +inf
111 string destname
112 variable noavg
113 variable sdev
114
115 if (ParamIsDefault(noavg))
116 noavg = 0
117 endif
118 if (ParamIsDefault(sdev))
119 sdev = 0
120 endif
121 variable avg = !noavg && !sdev
122
123 q1 = max(q1, 0)
124 q2 = min(q2, dimsize(dataset, 1) - 1)
125 r1 = max(r1, 0)
126 r2 = min(r2, dimsize(dataset, 2) - 1)
127
128 if (strlen(destname) > 0)
129 duplicate /r=[][q1,q1][r1,r1]/o dataset, $destname
130 wave w_dest = $destname
131 else
132 duplicate /r=[][q1,q1][r1,r1] /free dataset, w_dest
133 endif
134 redimension /n=(dimsize(w_dest, 0)) w_dest
135 setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
136
137 w_dest = 0
138 variable qq, rr
139 variable nn = 0
140 for (qq = q1; qq <= q2; qq += 1)
141 for (rr = r1; rr <= r2; rr += 1)
142 w_dest += dataset[p][qq][rr]
143 nn += 1
144 endfor
145 endfor
146
147 if (sdev)
148 duplicate /free w_dest, w_squares
149 w_squares = 0
150 for (qq = q1; qq <= q2; qq += 1)
151 for (rr = r1; rr <= r2; rr += 1)
152 w_squares += dataset[p][qq][rr]^2
153 endfor
154 endfor
155 endif
156
157 if (avg)
158 w_dest /= nn
159 elseif (sdev)
160 w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
161 endif
162
163 return w_dest
164end
165
169threadsafe function /wave ad_extract_rod_y(dataset, p1, p2, r1, r2, destname, [noavg, sdev])
170 wave dataset
171 variable p1, p2, r1, r2
172 // 0 <= p1 < p2 < dimsize(0), 0 <= r1 < r2 < dimsize(2)
173 string destname
174 variable noavg
175 variable sdev
176
177 if (ParamIsDefault(noavg))
178 noavg = 0
179 endif
180 if (ParamIsDefault(sdev))
181 sdev = 0
182 endif
183 variable avg = !noavg && !sdev
184
185 p1 = max(p1, 0)
186 p2 = min(p2, dimsize(dataset, 0) - 1)
187 r1 = max(r1, 0)
188 r2 = min(r2, dimsize(dataset, 2) - 1)
189
190 if (strlen(destname) > 0)
191 duplicate /r=[p1,p1][][r1,r1]/o dataset, $destname
192 wave w_dest = $destname
193 else
194 duplicate /r=[p1,p1][][r1,r1] /free dataset, w_dest
195 endif
196 redimension /n=(dimsize(w_dest, 1)) w_dest
197 setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
198
199 w_dest = 0
200 variable pp, rr
201 variable nn = 0
202 for (pp = p1; pp <= p2; pp += 1)
203 for (rr = r1; rr <= r2; rr += 1)
204 w_dest += dataset[pp][p][rr]
205 nn += 1
206 endfor
207 endfor
208
209 if (sdev)
210 duplicate /free w_dest, w_squares
211 w_squares = 0
212 for (pp = p1; pp <= p2; pp += 1)
213 for (rr = r1; rr <= r2; rr += 1)
214 w_squares += dataset[pp][p][rr]^2
215 nn += 1
216 endfor
217 endfor
218 endif
219
220 if (avg)
221 w_dest /= nn
222 elseif (sdev)
223 w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
224 endif
225
226 return w_dest
227end
228
232threadsafe function /wave ad_extract_rod_z(dataset, p1, p2, q1, q2, destname, [noavg, sdev])
233 wave dataset
234 variable p1, p2, q1, q2
235 // 0 <= p1 < p2 < dimsize(0), 0 <= q1 < q2 < dimsize(1)
236 string destname
237 variable noavg
238 variable sdev
239
240 if (ParamIsDefault(noavg))
241 noavg = 0
242 endif
243 if (ParamIsDefault(sdev))
244 sdev = 0
245 endif
246 variable avg = !noavg && !sdev
247
248 p1 = max(p1, 0)
249 p2 = min(p2, dimsize(dataset, 0) - 1)
250 q1 = max(q1, 0)
251 q2 = min(q2, dimsize(dataset, 1) - 1)
252
253 if (strlen(destname) > 0)
254 duplicate /r=[p1,p1][q1,q1][]/o dataset, $destname
255 wave w_dest = $destname
256 else
257 duplicate /r=[p1,p1][q1,q1][] /free dataset, w_dest
258 endif
259 redimension /n=(dimsize(w_dest, 2)) w_dest
260 setscale /p x dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
261
262 w_dest = 0
263 variable pp, qq
264 variable nn = 0
265 for (pp = p1; pp <= p2; pp += 1)
266 for (qq = q1; qq <= q2; qq += 1)
267 w_dest += dataset[pp][qq][p]
268 nn += 1
269 endfor
270 endfor
271
272 if (sdev)
273 duplicate /free w_dest, w_squares
274 w_squares = 0
275 for (pp = p1; pp <= p2; pp += 1)
276 for (qq = q1; qq <= q2; qq += 1)
277 w_squares += dataset[pp][qq][p]^2
278 nn += 1
279 endfor
280 endfor
281 endif
282
283 if (avg)
284 w_dest /= nn
285 elseif (sdev)
286 w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
287 endif
288
289 return w_dest
290end
291
314threadsafe function /wave ad_extract_slab(dataset, x1, x2, y1, y2, z1, z2, destname, [noavg, pscale])
315 wave dataset
316 variable x1, x2, y1, y2, z1, z2
317 string destname
318 variable noavg
319 variable pscale
320
321 if (wavedims(dataset) != 3)
322 return $""
323 endif
324 if (ParamIsDefault(noavg))
325 noavg = 0
326 endif
327 if (ParamIsDefault(pscale))
328 pscale = 0
329 endif
330
331 variable p1, p2, q1, q2, r1, r2
332 if (pscale)
333 p1 = x1
334 p2 = x2
335 q1 = y1
336 q2 = y2
337 r1 = z1
338 r2 = z2
339 else
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))
346 endif
347
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)
354 else
355 return $""
356 endif
357end
358
359threadsafe function /wave ad_extract_slab_x(dataset, p1, p2, destname, [noavg])
360 wave dataset
361 variable p1, p2
362 // x coordinate range (point scaling) to be integrated
363 // -inf <= p1 < p2 <= +inf
364 string destname // name of destination wave. to be created in current data folder. overrides existing.
365 // if empty, the function returns a free wave
366 variable noavg // zero or default = average, non-zero = sum
367
368 if (ParamIsDefault(noavg))
369 noavg = 0
370 endif
371 p1 = max(p1, 0)
372 p2 = min(p2, dimsize(dataset, 0) - 1)
373
374 if (strlen(destname) > 0)
375 duplicate /r=[p1,p1][][]/o dataset, $destname
376 wave w_dest = $destname
377 else
378 duplicate /r=[p1,p1][][] /free dataset, w_dest
379 endif
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
383
384 w_dest = 0
385 variable pp
386 variable nn = 0
387 for (pp = p1; pp <= p2; pp += 1)
388 w_dest += dataset[pp][p][q]
389 nn += 1
390 endfor
391
392 if (noavg == 0)
393 w_dest /= nn
394 endif
395
396 return w_dest
397end
398
399threadsafe function /wave ad_extract_slab_y(dataset, q1, q2, destname, [noavg])
400 wave dataset
401 variable q1, q2
402 // y coordinate range (point scaling) to be integrated
403 // -inf <= q1 < q2 <= +inf
404 string destname // name of destination wave. to be created in current data folder. overrides existing.
405 // if empty, the function returns a free wave
406 variable noavg // zero or default = average, non-zero = sum
407
408 if (ParamIsDefault(noavg))
409 noavg = 0
410 endif
411 q1 = max(q1, 0)
412 q2 = min(q2, dimsize(dataset, 1) - 1)
413
414 if (strlen(destname) > 0)
415 duplicate /r=[][q1,q1][]/o dataset, $destname
416 wave w_dest = $destname
417 else
418 duplicate /r=[][q1,q1][] /free dataset, w_dest
419 endif
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
423
424 w_dest = 0
425 variable qq
426 variable nn = 0
427 for (qq = q1; qq <= q2; qq += 1)
428 w_dest += dataset[p][qq][q]
429 nn += 1
430 endfor
431
432 if (noavg == 0)
433 w_dest /= nn
434 endif
435
436 return w_dest
437end
438
439threadsafe function /wave ad_extract_slab_z(dataset, r1, r2, destname, [noavg])
440 wave dataset
441 variable r1, r2
442 // z coordinate range (point scaling) to be integrated
443 // -inf <= r1 < r2 <= +inf
444 string destname // name of destination wave. to be created in current data folder. overrides existing.
445 // if empty, the function returns a free wave
446 variable noavg // zero or default = average, non-zero = sum
447
448 if (ParamIsDefault(noavg))
449 noavg = 0
450 endif
451 r1 = max(r1, 0)
452 r2 = min(r2, dimsize(dataset, 2) - 1)
453
454 if (strlen(destname) > 0)
455 duplicate /r=[][][r1,r1]/o dataset, $destname
456 wave w_dest = $destname
457 else
458 duplicate /r=[][][r1,r1] /free dataset, w_dest
459 endif
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
463
464 w_dest = 0
465 variable rr
466 variable nn = 0
467 for (rr = r1; rr <= r2; rr += 1)
468 w_dest += dataset[p][q][rr]
469 nn += 1
470 endfor
471
472 if (noavg == 0)
473 w_dest /= nn
474 endif
475
476 return w_dest
477end
478
481threadsafe function /wave ad_profile_x(dataset, q1, q2, destname, [noavg])
482 wave dataset
483 variable q1, q2 // -inf <= q1 < q2 <= +inf
484 // deprecated: q2 = -1 stands for dimsize(0) - 1
485 string destname // name of destination wave. to be created in current data folder. overrides existing.
486 // if empty, the function returns a free wave
487 variable noavg // zero or default = average, non-zero = sum
488
489 if (ParamIsDefault(noavg))
490 noavg = 0
491 endif
492
493 if (strlen(destname) > 0)
494 duplicate /r=[0,0][] /o dataset, $destname
495 wave w_dest = $destname
496 else
497 duplicate /r=[0,0][] /free dataset, w_dest
498 endif
499
500 return ad_profile_x_w(dataset, q1, q2, w_dest, noavg=noavg)
501end
502
505threadsafe function /wave ad_profile_x_w(dataset, q1, q2, destwave, [noavg])
506 wave dataset
507 variable q1, q2 // -inf <= q1 < q2 <= +inf
508 // deprecated: q2 = -1 stands for dimsize(0) - 1
509 wave destwave // existing destination wave
510 variable noavg // zero or default = average, non-zero = sum
511
512 if (ParamIsDefault(noavg))
513 noavg = 0
514 endif
515
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
519
520 q1 = max(q1, 0)
521 if (q2 < 0)
522 q2 = inf
523 endif
524 q2 = min(q2, dimsize(dataset, 1) - 1)
525
526 destwave = 0
527 variable qq
528 variable nn = 0
529 for (qq = q1; qq <= q2; qq += 1)
530 destwave += dataset[p][qq]
531 nn += 1
532 endfor
533
534 if (noavg == 0)
535 destwave /= nn
536 endif
537
538 return destwave
539end
540
543threadsafe function /wave ad_profile_y(dataset, p1, p2, destname, [noavg])
544 wave dataset
545 variable p1, p2 // -inf <= p1 < p2 < inf
546 // deprecated: p2 = -1 stands for dimsize(0) - 1
547 string destname // name of destination wave. to be created in current data folder. overrides existing.
548 // if empty, the function returns a free wave
549 variable noavg // zero or default = average, non-zero = sum
550
551 if (ParamIsDefault(noavg))
552 noavg = 0
553 endif
554
555 if (strlen(destname) > 0)
556 duplicate /r=[][0,0] /o dataset, $destname
557 wave w_dest = $destname
558 else
559 duplicate /r=[][0,0] /free dataset, w_dest
560 endif
561 MatrixTranspose w_dest
562
563 return ad_profile_y_w(dataset, p1, p2, w_dest, noavg=noavg)
564end
565
568threadsafe function /wave ad_profile_y_w(dataset, p1, p2, destwave, [noavg])
569 wave dataset
570 variable p1, p2 // -inf <= p1 < p2 < inf
571 // deprecated: p2 = -1 stands for dimsize(0) - 1
572 wave destwave // existing destination wave
573 variable noavg // zero or default = average, non-zero = sum
574
575 if (ParamIsDefault(noavg))
576 noavg = 0
577 endif
578
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
582
583 p1 = max(p1, 0)
584 if (p2 < 0)
585 p2 = inf
586 endif
587 p2 = min(p2, dimsize(dataset, 0) - 1)
588
589 destwave = 0
590 variable pp
591 variable nn = 0
592 for (pp = p1; pp <= p2; pp += 1)
593 destwave += dataset[pp][p]
594 nn += 1
595 endfor
596
597 if (noavg == 0)
598 destwave /= nn
599 endif
600
601 return destwave
602end
603
604threadsafe function calc_y_profile_mins(image)
605 // experimental
606 wave image
607
608 wave yminlocs = ad_profile_x(image, 0, 0, "ymins", noavg=1)
609 variable nx = dimsize(image, 0)
610 variable ix
611 for (ix = 0; ix < nx; ix += 1)
612 wave profile = ad_profile_y(image, ix, ix, "", noavg=1)
613 wavestats /q/m=1 profile
614 yminlocs[ix] = v_minloc
615 endfor
616end
617
622function ad_collect_multiscan_y(dataset, positions, destwave, [noavg])
623 wave dataset
624 wave positions
625 wave destwave
626 variable noavg
627
628 variable tol = (wavemax(positions) - wavemin(positions)) / numpnts(positions) / 100
629
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
638
639 variable i
640 variable nx, ny
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]
648 endfor
649end
threadsafe wave ad_extract_slab_y(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
threadsafe wave ad_extract_rod_z(wave dataset, variable p1, variable p2, variable q1, variable q2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along Z dimension.
threadsafe wave ad_extract_rod_y(wave dataset, variable p1, variable p2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along Y dimension.
variable ad_collect_multiscan_y(wave dataset, wave positions, wave destwave, variable noavg=defaultValue)
collect profiles from a multi-scan.
threadsafe wave ad_extract_slab(wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg=defaultValue, variable pscale=defaultValue)
2D cut through 3D dataset, integrate in normal dimension
threadsafe wave ad_extract_slab_z(wave dataset, variable r1, variable r2, string destname, variable noavg=defaultValue)
threadsafe wave ad_extract_rod_x(wave dataset, variable q1, variable q2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along X dimension.
threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
threadsafe wave ad_extract_rod(wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg=defaultValue, variable sdev=defaultValue, variable pscale=defaultValue)
1D cut through 3D dataset, integrate in normal dimensions
threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
threadsafe wave ad_profile_x(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, new destination wave.
threadsafe variable calc_y_profile_mins(wave image)
threadsafe wave ad_profile_y(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along Y dimension, new destination wave.
threadsafe wave ad_extract_slab_x(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)