PEARL Procedures  rev-distro-3.0.0-0-gfa24916-dirty
Igor procedures for the analysis of PEARL data
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 
55 threadsafe 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
102 end
103 
107 threadsafe 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
164 end
165 
169 threadsafe 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
227 end
228 
232 threadsafe 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
290 end
291 
314 threadsafe 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
357 end
358 
359 threadsafe 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
397 end
398 
399 threadsafe 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
437 end
438 
439 threadsafe 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
477 end
478 
481 threadsafe 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)
501 end
502 
505 threadsafe 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
539 end
540 
543 threadsafe 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)
564 end
565 
568 threadsafe 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
602 end
603 
604 threadsafe 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
616 end
617 
622 function 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
649 end
calc_y_profile_mins
threadsafe variable calc_y_profile_mins(wave image)
Definition: pearl-area-profiles.ipf:604
ad_profile_x
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.
Definition: pearl-area-profiles.ipf:481
ad_profile_x_w
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.
Definition: pearl-area-profiles.ipf:505
ad_profile_y
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.
Definition: pearl-area-profiles.ipf:543
ad_extract_rod_x
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.
Definition: pearl-area-profiles.ipf:107
ad_extract_rod_z
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.
Definition: pearl-area-profiles.ipf:232
ad_collect_multiscan_y
variable ad_collect_multiscan_y(wave dataset, wave positions, wave destwave, variable noavg=defaultValue)
collect profiles from a multi-scan.
Definition: pearl-area-profiles.ipf:622
ad_extract_slab_z
threadsafe wave ad_extract_slab_z(wave dataset, variable r1, variable r2, string destname, variable noavg=defaultValue)
Definition: pearl-area-profiles.ipf:439
ad_extract_rod
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
Definition: pearl-area-profiles.ipf:55
ad_profile_y_w
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.
Definition: pearl-area-profiles.ipf:568
ad_extract_slab
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
Definition: pearl-area-profiles.ipf:314
ad_extract_slab_y
threadsafe wave ad_extract_slab_y(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
Definition: pearl-area-profiles.ipf:399
ad_extract_slab_x
threadsafe wave ad_extract_slab_x(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
Definition: pearl-area-profiles.ipf:359
ad_extract_rod_y
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.
Definition: pearl-area-profiles.ipf:169