ChessAnalysisPipeline 0.0.14__py3-none-any.whl → 0.0.15__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ChessAnalysisPipeline might be problematic. Click here for more details.
- CHAP/__init__.py +1 -1
- CHAP/common/__init__.py +9 -0
- CHAP/common/models/map.py +295 -55
- CHAP/common/processor.py +846 -10
- CHAP/common/reader.py +171 -0
- CHAP/common/writer.py +181 -18
- CHAP/edd/__init__.py +10 -3
- CHAP/edd/models.py +822 -451
- CHAP/edd/processor.py +2221 -756
- CHAP/edd/reader.py +672 -0
- CHAP/edd/utils.py +846 -292
- CHAP/foxden/__init__.py +6 -0
- CHAP/foxden/processor.py +42 -0
- CHAP/foxden/writer.py +65 -0
- CHAP/pipeline.py +1 -1
- CHAP/runner.py +4 -4
- CHAP/tomo/models.py +7 -5
- CHAP/tomo/processor.py +118 -39
- CHAP/utils/__init__.py +1 -0
- CHAP/utils/fit.py +1292 -1315
- CHAP/utils/general.py +393 -53
- CHAP/utils/models.py +567 -0
- CHAP/utils/scanparsers.py +141 -28
- ChessAnalysisPipeline-0.0.15.dist-info/LICENSE +60 -0
- {ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/METADATA +1 -1
- {ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/RECORD +29 -25
- {ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/WHEEL +1 -1
- ChessAnalysisPipeline-0.0.14.dist-info/LICENSE +0 -21
- {ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/entry_points.txt +0 -0
- {ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/top_level.txt +0 -0
CHAP/utils/scanparsers.py
CHANGED
|
@@ -2,6 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
# -*- coding: utf-8 -*-
|
|
4
4
|
|
|
5
|
+
"""Parsing data from certain CHESS SPEC scans is supported by a family
|
|
6
|
+
of classes derived from the base class, `ScanParser` (defined
|
|
7
|
+
below). An instance of `ScanParser` represents a single SPEC scan --
|
|
8
|
+
each instance is initialized with the name of a specific spec file and
|
|
9
|
+
integer scan number. Access to certain data collected by that scan
|
|
10
|
+
(counter data, positioner values, scan shape, detector data, etc.) are
|
|
11
|
+
made available through the properties and methods of that object.
|
|
12
|
+
|
|
13
|
+
`ScanParser` is just an incomplete abstraction -- one should not
|
|
14
|
+
declare or work with an instance of `ScanParser` directly. Instead,
|
|
15
|
+
one must find the appropriate concrete subclass to use for the
|
|
16
|
+
particular type of scan one wishes to parse, then declare an instance
|
|
17
|
+
of that specific class to begin accessing data from that scan.
|
|
18
|
+
|
|
19
|
+
Basic usage examples:
|
|
20
|
+
1. Print out the position of a the SPEC positioner motor with mnemonic
|
|
21
|
+
`'mne0'` for a SAXS/WAXS scan collected at FMB:
|
|
22
|
+
```python
|
|
23
|
+
from CHAP.utils.scanparsers import FMBSAXSWAXSScanParser
|
|
24
|
+
sp = FMBSAXSWAXSScanParser('/path/to/fmb/saxswaxs/spec/file', 1)
|
|
25
|
+
print(sp.get_spec_positioner_value('mne0'))
|
|
26
|
+
```
|
|
27
|
+
1. Store all the detector data collected by the detector with prefix
|
|
28
|
+
`'det'` over a rotation series collected at SMB in the variable
|
|
29
|
+
`data`:
|
|
30
|
+
```python
|
|
31
|
+
from CHAP.utils.scanparsers import SMBRotationScanParser
|
|
32
|
+
sp = SMBRotationScanParser('/path/to/smb/rotation/spec/file', 1)
|
|
33
|
+
data = sp.get_detector_data('det')
|
|
34
|
+
```
|
|
35
|
+
"""
|
|
36
|
+
|
|
5
37
|
# System modules
|
|
6
38
|
from csv import reader
|
|
7
39
|
from fnmatch import filter as fnmatch_filter
|
|
@@ -58,6 +90,7 @@ class ScanParser:
|
|
|
58
90
|
and len(scanparser.spec_args) == 5):
|
|
59
91
|
self._rams4_args = scanparser.spec_args
|
|
60
92
|
|
|
93
|
+
def __repr_(self):
|
|
61
94
|
return (f'{self.__class__.__name__}'
|
|
62
95
|
f'({self.spec_file_name}, {self.scan_number}) '
|
|
63
96
|
f'-- {self.spec_command}')
|
|
@@ -303,6 +336,7 @@ class SMBScanParser(ScanParser):
|
|
|
303
336
|
|
|
304
337
|
self._pars = None
|
|
305
338
|
self._par_file_pattern = f'*-*-{self.scan_name}'
|
|
339
|
+
self._par_file = None
|
|
306
340
|
|
|
307
341
|
def get_scan_name(self):
|
|
308
342
|
return os.path.basename(self.scan_path)
|
|
@@ -343,7 +377,7 @@ class SMBScanParser(ScanParser):
|
|
|
343
377
|
raise RuntimeError(f'{self.scan_title}: cannot find scan pars '
|
|
344
378
|
'without a "SCAN_N" column in the par file')
|
|
345
379
|
|
|
346
|
-
if
|
|
380
|
+
if getattr(self, '_par_file'):
|
|
347
381
|
par_file = self._par_file
|
|
348
382
|
else:
|
|
349
383
|
par_files = fnmatch_filter(
|
|
@@ -353,6 +387,7 @@ class SMBScanParser(ScanParser):
|
|
|
353
387
|
raise RuntimeError(f'{self.scan_title}: cannot find the .par '
|
|
354
388
|
'file for this scan directory')
|
|
355
389
|
par_file = os.path.join(self.scan_path, par_files[0])
|
|
390
|
+
self._par_file = par_file
|
|
356
391
|
par_dict = None
|
|
357
392
|
with open(par_file) as f:
|
|
358
393
|
par_reader = reader(f, delimiter=' ')
|
|
@@ -373,22 +408,21 @@ class SMBScanParser(ScanParser):
|
|
|
373
408
|
except:
|
|
374
409
|
pass
|
|
375
410
|
par_dict[par_col_name] = par_value
|
|
376
|
-
|
|
377
411
|
if par_dict is None:
|
|
378
412
|
raise RuntimeError(f'{self.scan_title}: could not find scan pars '
|
|
379
413
|
f'for scan number {self.scan_number}')
|
|
380
414
|
return par_dict
|
|
381
415
|
|
|
382
416
|
def get_counter_gain(self, counter_name):
|
|
383
|
-
"""Return the gain of a counter as recorded in the
|
|
384
|
-
a scan in a SPEC file converted to nA/V.
|
|
417
|
+
"""Return the gain of a counter as recorded in the user lines
|
|
418
|
+
of a scan in a SPEC file converted to nA/V.
|
|
385
419
|
|
|
386
420
|
:param counter_name: the name of the counter
|
|
387
421
|
:type counter_name: str
|
|
388
422
|
:rtype: str
|
|
389
423
|
"""
|
|
390
424
|
counter_gain = None
|
|
391
|
-
for comment in self.spec_scan.comments:
|
|
425
|
+
for comment in self.spec_scan.comments + self.spec_scan.user_lines:
|
|
392
426
|
match = re.search(
|
|
393
427
|
f'{counter_name} gain: ' # start of counter gain comments
|
|
394
428
|
'(?P<gain_value>\d+) ' # gain numerical value
|
|
@@ -399,6 +433,7 @@ class SMBScanParser(ScanParser):
|
|
|
399
433
|
gain_scalar = 1 if unit_prefix == 'n' \
|
|
400
434
|
else 1e3 if unit_prefix == 'u' else 1e6
|
|
401
435
|
counter_gain = f'{float(match["gain_value"])*gain_scalar} nA/V'
|
|
436
|
+
break
|
|
402
437
|
|
|
403
438
|
if counter_gain is None:
|
|
404
439
|
raise RuntimeError(f'{self.scan_title}: could not get gain for '
|
|
@@ -415,6 +450,7 @@ class LinearScanParser(ScanParser):
|
|
|
415
450
|
|
|
416
451
|
self._spec_scan_motor_mnes = None
|
|
417
452
|
self._spec_scan_motor_vals = None
|
|
453
|
+
self._spec_scan_motor_vals_relative = None
|
|
418
454
|
self._spec_scan_shape = None
|
|
419
455
|
self._spec_scan_dwell = None
|
|
420
456
|
|
|
@@ -427,9 +463,17 @@ class LinearScanParser(ScanParser):
|
|
|
427
463
|
@property
|
|
428
464
|
def spec_scan_motor_vals(self):
|
|
429
465
|
if self._spec_scan_motor_vals is None:
|
|
430
|
-
self._spec_scan_motor_vals = self.get_spec_scan_motor_vals(
|
|
466
|
+
self._spec_scan_motor_vals = self.get_spec_scan_motor_vals(
|
|
467
|
+
relative=False)
|
|
431
468
|
return self._spec_scan_motor_vals
|
|
432
469
|
|
|
470
|
+
@property
|
|
471
|
+
def spec_scan_motor_vals_relative(self):
|
|
472
|
+
if self._spec_scan_motor_vals_relative is None:
|
|
473
|
+
self._spec_scan_motor_vals_relative = \
|
|
474
|
+
self.get_spec_scan_motor_vals(relative=True)
|
|
475
|
+
return self._spec_scan_motor_vals_relative
|
|
476
|
+
|
|
433
477
|
@property
|
|
434
478
|
def spec_scan_shape(self):
|
|
435
479
|
if self._spec_scan_shape is None:
|
|
@@ -453,13 +497,17 @@ class LinearScanParser(ScanParser):
|
|
|
453
497
|
"""
|
|
454
498
|
raise NotImplementedError
|
|
455
499
|
|
|
456
|
-
def get_spec_scan_motor_vals(self):
|
|
500
|
+
def get_spec_scan_motor_vals(self, relative=False):
|
|
457
501
|
"""Return the values visited by each of the scanned motors. If
|
|
458
502
|
there is more than one motor scanned (in a "flymesh" scan, for
|
|
459
503
|
example), the order of motor values in the returned tuple will
|
|
460
504
|
go from the fastest moving motor's values first to the slowest
|
|
461
505
|
moving motor's values last.
|
|
462
506
|
|
|
507
|
+
:param relative: If `True`, return scanned motor positions
|
|
508
|
+
*relative* to the scanned motors' positions before the scan
|
|
509
|
+
started, defaults to False.
|
|
510
|
+
:type relative: bool, optional
|
|
463
511
|
:rtype: tuple
|
|
464
512
|
"""
|
|
465
513
|
raise NotImplementedError
|
|
@@ -554,14 +602,14 @@ class FMBLinearScanParser(LinearScanParser, FMBScanParser):
|
|
|
554
602
|
m2_mne_i = 5
|
|
555
603
|
m2_mne = self.spec_args[m2_mne_i]
|
|
556
604
|
return (m1_mne, m2_mne)
|
|
557
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
605
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
558
606
|
return (self.spec_args[0],)
|
|
559
607
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
560
608
|
return ('Time',)
|
|
561
609
|
raise RuntimeError(f'{self.scan_title}: cannot determine scan motors '
|
|
562
610
|
f'for scans of type {self.spec_macro}')
|
|
563
611
|
|
|
564
|
-
def get_spec_scan_motor_vals(self):
|
|
612
|
+
def get_spec_scan_motor_vals(self, relative=False):
|
|
565
613
|
if self.spec_macro in ('flymesh', 'mesh', 'flydmesh', 'dmesh'):
|
|
566
614
|
m1_start = float(self.spec_args[1])
|
|
567
615
|
m1_end = float(self.spec_args[2])
|
|
@@ -583,14 +631,22 @@ class FMBLinearScanParser(LinearScanParser, FMBScanParser):
|
|
|
583
631
|
m2_npt = int(self.spec_args[m2_nint_i]) + 1
|
|
584
632
|
fast_mot_vals = np.linspace(m1_start, m1_end, m1_npt)
|
|
585
633
|
slow_mot_vals = np.linspace(m2_start, m2_end, m2_npt)
|
|
634
|
+
if relative:
|
|
635
|
+
fast_mot_vals -= self.get_spec_positioner_value(
|
|
636
|
+
self.spec_scan_motor_mnes[0])
|
|
637
|
+
slow_mot_vals -= self.get_spec_positioner_value(
|
|
638
|
+
self.spec_scan_motor_mnes[1])
|
|
586
639
|
return (fast_mot_vals, slow_mot_vals)
|
|
587
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
640
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
588
641
|
mot_vals = np.linspace(float(self.spec_args[1]),
|
|
589
642
|
float(self.spec_args[2]),
|
|
590
643
|
int(self.spec_args[3])+1)
|
|
644
|
+
if relative:
|
|
645
|
+
mot_vals -= self.get_spec_positioner_value(
|
|
646
|
+
self.spec_scan_motor_mnes[0])
|
|
591
647
|
return (mot_vals,)
|
|
592
648
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
593
|
-
return self.spec_scan.data[:,0]
|
|
649
|
+
return (self.spec_scan.data[:,0],)
|
|
594
650
|
raise RuntimeError(f'{self.scan_title}: cannot determine scan motors '
|
|
595
651
|
f'for scans of type {self.spec_macro}')
|
|
596
652
|
|
|
@@ -607,11 +663,11 @@ class FMBLinearScanParser(LinearScanParser, FMBScanParser):
|
|
|
607
663
|
m2_nint_i = 8
|
|
608
664
|
slow_mot_npts = int(self.spec_args[m2_nint_i]) + 1
|
|
609
665
|
return (fast_mot_npts, slow_mot_npts)
|
|
610
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
666
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
611
667
|
mot_npts = int(self.spec_args[3])+1
|
|
612
668
|
return (mot_npts,)
|
|
613
669
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
614
|
-
return len(np.array(self.spec_scan.data[:,0]))
|
|
670
|
+
return (len(np.array(self.spec_scan.data[:,0])),)
|
|
615
671
|
raise RuntimeError(f'{self.scan_title}: cannot determine scan shape '
|
|
616
672
|
f'for scans of type {self.spec_macro}')
|
|
617
673
|
|
|
@@ -624,7 +680,7 @@ class FMBLinearScanParser(LinearScanParser, FMBScanParser):
|
|
|
624
680
|
# Accommodate pre-summer-2022 format
|
|
625
681
|
dwell = float(self.spec_args[8])
|
|
626
682
|
return dwell
|
|
627
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
683
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
628
684
|
return float(self.spec_args[4])
|
|
629
685
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
630
686
|
return float(self.spec_args[1])
|
|
@@ -667,14 +723,28 @@ class FMBSAXSWAXSScanParser(FMBLinearScanParser):
|
|
|
667
723
|
def get_detector_data_file(self, detector_prefix, scan_step_index:int):
|
|
668
724
|
detector_files = list_fmb_saxswaxs_detector_files(
|
|
669
725
|
self.detector_data_path, detector_prefix)
|
|
670
|
-
|
|
671
|
-
|
|
726
|
+
if len(detector_files) == self.spec_scan_npts:
|
|
727
|
+
return os.path.join(
|
|
728
|
+
self.detector_data_path, detector_files[scan_step_index])
|
|
729
|
+
else:
|
|
730
|
+
scan_step = self.get_scan_step(scan_step_index)
|
|
731
|
+
for f in detector_files:
|
|
732
|
+
filename, _ = os.path.splitext(f)
|
|
733
|
+
file_indices = tuple(
|
|
734
|
+
[int(i) for i in \
|
|
735
|
+
filename.split('_')[-len(self.spec_scan_shape):]])
|
|
736
|
+
if file_indices == scan_step:
|
|
737
|
+
return os.path.join(self.detector_data_path, f)
|
|
738
|
+
raise RuntimeError(
|
|
739
|
+
'Could not find a matching detector data file for detector '
|
|
740
|
+
+ f'{detector_prefix} at scan step index {scan_step_index}')
|
|
672
741
|
|
|
673
742
|
def get_detector_data(self, detector_prefix, scan_step_index:int):
|
|
743
|
+
import fabio
|
|
674
744
|
image_file = self.get_detector_data_file(detector_prefix,
|
|
675
745
|
scan_step_index)
|
|
676
|
-
with
|
|
677
|
-
image_data =
|
|
746
|
+
with fabio.open(image_file) as det_file:
|
|
747
|
+
image_data = det_file.data
|
|
678
748
|
return image_data
|
|
679
749
|
|
|
680
750
|
|
|
@@ -715,7 +785,7 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
715
785
|
"""
|
|
716
786
|
|
|
717
787
|
def get_spec_scan_dwell(self):
|
|
718
|
-
if self.spec_macro in ('flymesh', 'mesh'):
|
|
788
|
+
if self.spec_macro in ('flymesh', 'mesh', 'flydmesh', 'dmesh'):
|
|
719
789
|
try:
|
|
720
790
|
# Try post-summer-2022 format
|
|
721
791
|
dwell = float(self.spec_args[4])
|
|
@@ -723,7 +793,7 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
723
793
|
# Accommodate pre-summer-2022 format
|
|
724
794
|
dwell = float(self.spec_args[8])
|
|
725
795
|
return dwell
|
|
726
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
796
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
727
797
|
return float(self.spec_args[4])
|
|
728
798
|
if self.spec_macro == 'tseries':
|
|
729
799
|
return float(self.spec_args[1])
|
|
@@ -733,7 +803,7 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
733
803
|
f'for scans of type {self.spec_macro}')
|
|
734
804
|
|
|
735
805
|
def get_spec_scan_motor_mnes(self):
|
|
736
|
-
if self.spec_macro in ('flymesh', 'mesh'):
|
|
806
|
+
if self.spec_macro in ('flymesh', 'mesh', 'flydmesh', 'dmesh'):
|
|
737
807
|
m1_mne = self.spec_args[0]
|
|
738
808
|
try:
|
|
739
809
|
# Try post-summer-2022 format
|
|
@@ -745,15 +815,15 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
745
815
|
m2_mne_i = 5
|
|
746
816
|
m2_mne = self.spec_args[m2_mne_i]
|
|
747
817
|
return (m1_mne, m2_mne)
|
|
748
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
818
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
749
819
|
return (self.spec_args[0],)
|
|
750
820
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
751
821
|
return ('Time',)
|
|
752
822
|
raise RuntimeError(f'{self.scan_title}: cannot determine scan motors '
|
|
753
823
|
f'for scans of type {self.spec_macro}')
|
|
754
824
|
|
|
755
|
-
def get_spec_scan_motor_vals(self):
|
|
756
|
-
if self.spec_macro in ('flymesh', 'mesh'):
|
|
825
|
+
def get_spec_scan_motor_vals(self, relative=False):
|
|
826
|
+
if self.spec_macro in ('flymesh', 'mesh', 'flydmesh', 'dmesh'):
|
|
757
827
|
m1_start = float(self.spec_args[1])
|
|
758
828
|
m1_end = float(self.spec_args[2])
|
|
759
829
|
m1_npt = int(self.spec_args[3]) + 1
|
|
@@ -774,11 +844,19 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
774
844
|
m2_npt = int(self.spec_args[m2_nint_i]) + 1
|
|
775
845
|
fast_mot_vals = np.linspace(m1_start, m1_end, m1_npt)
|
|
776
846
|
slow_mot_vals = np.linspace(m2_start, m2_end, m2_npt)
|
|
847
|
+
if relative:
|
|
848
|
+
fast_mot_vals -= self.spec_positioner_values[
|
|
849
|
+
self.spec_scan_motor_mnes[0]]
|
|
850
|
+
slow_mot_vals -= self.spec_positioner_values[
|
|
851
|
+
self.spec_scan_motor_mnes[1]]
|
|
777
852
|
return (fast_mot_vals, slow_mot_vals)
|
|
778
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
853
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
779
854
|
mot_vals = np.linspace(float(self.spec_args[1]),
|
|
780
855
|
float(self.spec_args[2]),
|
|
781
856
|
int(self.spec_args[3])+1)
|
|
857
|
+
if relative:
|
|
858
|
+
mot_vals -= self.get_spec_positioner_value(
|
|
859
|
+
self.spec_scan_motor_mnes[0])
|
|
782
860
|
return (mot_vals,)
|
|
783
861
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
784
862
|
return (self.spec_scan.data[:,0],)
|
|
@@ -786,7 +864,7 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
786
864
|
f'for scans of type {self.spec_macro}')
|
|
787
865
|
|
|
788
866
|
def get_spec_scan_shape(self):
|
|
789
|
-
if self.spec_macro in ('flymesh', 'mesh'):
|
|
867
|
+
if self.spec_macro in ('flymesh', 'mesh', 'flydmesh', 'dmesh'):
|
|
790
868
|
fast_mot_npts = int(self.spec_args[3]) + 1
|
|
791
869
|
try:
|
|
792
870
|
# Try post-summer-2022 format
|
|
@@ -798,7 +876,7 @@ class SMBLinearScanParser(LinearScanParser, SMBScanParser):
|
|
|
798
876
|
m2_nint_i = 8
|
|
799
877
|
slow_mot_npts = int(self.spec_args[m2_nint_i]) + 1
|
|
800
878
|
return (fast_mot_npts, slow_mot_npts)
|
|
801
|
-
if self.spec_macro in ('flyscan', 'ascan'):
|
|
879
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
802
880
|
mot_npts = int(self.spec_args[3])+1
|
|
803
881
|
return (mot_npts,)
|
|
804
882
|
if self.spec_macro in ('tseries', 'loopscan'):
|
|
@@ -1162,6 +1240,41 @@ class SMBMCAScanParser(MCAScanParser, SMBLinearScanParser):
|
|
|
1162
1240
|
+ f'{detector_data_format}. Allowed values are: '
|
|
1163
1241
|
+ ', '.join(self.detector_data_formats))
|
|
1164
1242
|
|
|
1243
|
+
def get_spec_scan_motor_vals(self, relative=True):
|
|
1244
|
+
if not relative:
|
|
1245
|
+
# The scanned motor's recorded position in the spec.log
|
|
1246
|
+
# file's "#P" lines does not always give the right offset
|
|
1247
|
+
# to use to obtain absolute motor postions from relative
|
|
1248
|
+
# motor positions (or relative from actual). Sometimes,
|
|
1249
|
+
# the labx/y/z/ometotal value from the scan's .par file is
|
|
1250
|
+
# the quantity for the offset that _should_ be used, but
|
|
1251
|
+
# there is currently no consistent way to determine when
|
|
1252
|
+
# to use the labx/y/z/ometotal .par file value and when to
|
|
1253
|
+
# use the spec file "#P" lines value. Because the relative
|
|
1254
|
+
# motor values are the only ones currently used in EDD
|
|
1255
|
+
# workflows, obtain them from relevant values available in
|
|
1256
|
+
# the .par file, and defer implementation for absolute
|
|
1257
|
+
# motor postions to later.
|
|
1258
|
+
return super().get_spec_scan_motor_vals(relative=True)
|
|
1259
|
+
# raise NotImplementedError('Only relative motor values are available.')
|
|
1260
|
+
if self.spec_macro in ('flymesh', 'mesh', 'flydmesh', 'dmesh'):
|
|
1261
|
+
mot_vals_axis0 = np.linspace(self.pars['fly_axis0_start'],
|
|
1262
|
+
self.pars['fly_axis0_end'],
|
|
1263
|
+
self.pars['fly_axis0_npts'])
|
|
1264
|
+
mot_vals_axis1 = np.linspace(self.pars['fly_axis1_start'],
|
|
1265
|
+
self.pars['fly_axis1_end'],
|
|
1266
|
+
self.pars['fly_axis1_npts'])
|
|
1267
|
+
return (mot_vals_axis0, mot_vals_axis1)
|
|
1268
|
+
if self.spec_macro in ('flyscan', 'ascan', 'flydscan', 'dscan'):
|
|
1269
|
+
mot_vals = np.linspace(self.pars['fly_axis0_start'],
|
|
1270
|
+
self.pars['fly_axis0_end'],
|
|
1271
|
+
self.pars['fly_axis0_npts'])
|
|
1272
|
+
return (mot_vals,)
|
|
1273
|
+
if self.spec_macro in ('tseries', 'loopscan'):
|
|
1274
|
+
return (self.spec_scan.data[:,0],)
|
|
1275
|
+
raise RuntimeError(f'{self.scan_title}: cannot determine scan motors '
|
|
1276
|
+
f'for scans of type {self.spec_macro}')
|
|
1277
|
+
|
|
1165
1278
|
def init_detector_data_format(self):
|
|
1166
1279
|
"""Determine and set a value for the instance variable
|
|
1167
1280
|
`detector_data_format` based on the presence / absence of
|
|
@@ -1348,7 +1461,7 @@ class SMBMCAScanParser(MCAScanParser, SMBLinearScanParser):
|
|
|
1348
1461
|
full_filename)[:,element_index,:]
|
|
1349
1462
|
i_0 = i * self.spec_scan_shape[0]
|
|
1350
1463
|
if len(self.spec_scan_shape) == 2:
|
|
1351
|
-
i_f = i_0 + self.spec_scan_shape[
|
|
1464
|
+
i_f = i_0 + self.spec_scan_shape[0]
|
|
1352
1465
|
else:
|
|
1353
1466
|
i_f = self.spec_scan_npts
|
|
1354
1467
|
detector_data[i_0:i_f] = element_data
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Valentin Kuznetsov
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
Some code in CHAP.utils has been based or taken from the lmfit library whose
|
|
25
|
+
licence is below.
|
|
26
|
+
|
|
27
|
+
Copyright 2022 Matthew Newville, The University of Chicago
|
|
28
|
+
Renee Otten, Brandeis University
|
|
29
|
+
Till Stensitzki, Freie Universitat Berlin
|
|
30
|
+
A. R. J. Nelson, Australian Nuclear Science and Technology Organisation
|
|
31
|
+
Antonino Ingargiola, University of California, Los Angeles
|
|
32
|
+
Daniel B. Allen, Johns Hopkins University
|
|
33
|
+
Michal Rawlik, Eidgenossische Technische Hochschule, Zurich
|
|
34
|
+
|
|
35
|
+
Redistribution and use in source and binary forms, with or without
|
|
36
|
+
modification, are permitted provided that the following conditions are met:
|
|
37
|
+
|
|
38
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
39
|
+
this list of conditions and the following disclaimer.
|
|
40
|
+
|
|
41
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
42
|
+
notice, this list of conditions and the following disclaimer in the
|
|
43
|
+
documentation and/or other materials provided with the distribution.
|
|
44
|
+
|
|
45
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
46
|
+
contributors may be used to endorse or promote products derived from this
|
|
47
|
+
software without specific prior written permission.
|
|
48
|
+
|
|
49
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
50
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
51
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
52
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
53
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
54
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
55
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
56
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
57
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
58
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
59
|
+
POSSIBILITY OF SUCH DAMAGE.
|
|
60
|
+
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
CHAP/TaskManager.py,sha256=NEqg2jAq10kbScE18XtzY3liqkIdAtysaR-gMG5tBzs,6803
|
|
2
|
-
CHAP/__init__.py,sha256=
|
|
3
|
-
CHAP/pipeline.py,sha256=
|
|
2
|
+
CHAP/__init__.py,sha256=hMZq2tCAKpAjqjLuN2CzDgMqCVZ9qDExUkrrNDbpUTE,1073
|
|
3
|
+
CHAP/pipeline.py,sha256=86Lxffg_1oOD0t96-EGjo2rCfypDkLwXh4O6n-eU7tU,8987
|
|
4
4
|
CHAP/processor.py,sha256=nqg1uK5jvADl35xuR6VIdU5uVGFVt-rzivnaZyOWruA,2639
|
|
5
5
|
CHAP/reader.py,sha256=wGzAl_p5UnR7fC7Cie29S7RZTFFLcdOuhbViNDzH-4s,2534
|
|
6
|
-
CHAP/runner.py,sha256=
|
|
6
|
+
CHAP/runner.py,sha256=K_3ss0eLKZEJBnJTIoljq6ObpMHpI3BW187LnyeTY-Q,7913
|
|
7
7
|
CHAP/server.py,sha256=JAh5a7ZPh_Vx7fm0uI_g2WHLVxLn8s1uwBX8oMJ3G9c,3648
|
|
8
8
|
CHAP/writer.py,sha256=9hed3_51AwSSH3kNisMR6Wq6mLInNGpgktPG5G_s-DM,2589
|
|
9
|
-
CHAP/common/__init__.py,sha256=
|
|
10
|
-
CHAP/common/processor.py,sha256=
|
|
11
|
-
CHAP/common/reader.py,sha256=
|
|
12
|
-
CHAP/common/writer.py,sha256=
|
|
9
|
+
CHAP/common/__init__.py,sha256=_vD2RcbP-6GGiiXgS9_Z1crqQBdCJYf0cZBDGIaEVNU,1279
|
|
10
|
+
CHAP/common/processor.py,sha256=0uiMgVr_S_Vi9zkoW0jw8sI9VAoEwuNPpGig-gNvpQ0,90804
|
|
11
|
+
CHAP/common/reader.py,sha256=Vp1pu9nKZkI2SvdzfZNV_b1OCiGwLNwHU14WAXdToeo,20408
|
|
12
|
+
CHAP/common/writer.py,sha256=6RfRXXmKh3xouhzzfdRLCL7JD56wI4PAlx8zV2hOAiQ,19229
|
|
13
13
|
CHAP/common/models/__init__.py,sha256=MpmtY6biXgC7AaedznoSqFJJZ54YU8tBPgwzYJIVJ1c,200
|
|
14
14
|
CHAP/common/models/integration.py,sha256=0WM2Q15XFQf-uydMALh3snbpoop-c5N6Pnf_O7ikXW0,27175
|
|
15
|
-
CHAP/common/models/map.py,sha256=
|
|
16
|
-
CHAP/edd/__init__.py,sha256=
|
|
17
|
-
CHAP/edd/models.py,sha256=
|
|
18
|
-
CHAP/edd/processor.py,sha256=
|
|
19
|
-
CHAP/edd/reader.py,sha256=
|
|
20
|
-
CHAP/edd/utils.py,sha256=
|
|
15
|
+
CHAP/common/models/map.py,sha256=gWQXIs2qDjlJVpHiXNZwaWSSAkiDS0YD9YiC3MhmufY,50071
|
|
16
|
+
CHAP/edd/__init__.py,sha256=6Xy1Eb5fFm1lTBHumsDsY4D-gSIjJaXM8qbTSsDk8CE,946
|
|
17
|
+
CHAP/edd/models.py,sha256=O4W3KgvVyJIO_IszzIekoH2dKKwueLg367gVDApgvmo,53021
|
|
18
|
+
CHAP/edd/processor.py,sha256=cQtom7myX_3y2RuAZvaVHRlkVb2YCg7GMullGmoDD0A,142268
|
|
19
|
+
CHAP/edd/reader.py,sha256=WdLYjtwVwvOxUeMzMBPQf4XplSH3_5Jzkc5X5_uTvLY,28833
|
|
20
|
+
CHAP/edd/utils.py,sha256=jF8kz-feR16QIc-MbZEgl0jmTcBs63Bfnb2a0DrS4vU,66377
|
|
21
21
|
CHAP/edd/writer.py,sha256=Y1CXWMRU87XeeDp4g4-sUgPP2UbCguYZUR_Cg5Ci6l8,94
|
|
22
|
+
CHAP/foxden/__init__.py,sha256=6H6mqd_-qu8BiBDM0aRx5edcYLOse6Z_x3TsDf7E4J0,149
|
|
23
|
+
CHAP/foxden/processor.py,sha256=-wHpgtiru1zJYaf1zd9pUl5bxjetu-yH_cAIKaEnqB4,1058
|
|
24
|
+
CHAP/foxden/writer.py,sha256=jijYSaVAK0EwIichgYFk2Bh3ytPbBAmL_wy8aQRKY8I,2151
|
|
22
25
|
CHAP/inference/__init__.py,sha256=GwpEKEMHY1-3AE7HWKBdBz_i7N1sz7xwve6y9tZ7Skk,263
|
|
23
26
|
CHAP/inference/processor.py,sha256=TYYPtZ3YlZS1kgvGr6I_9RvSaR0kn9PKL98A3QwqeDI,2065
|
|
24
27
|
CHAP/inference/reader.py,sha256=O0KeZcqACsZ8ngrliPU6I3u8SeQT0Aq866jCTbruXqc,94
|
|
@@ -32,23 +35,24 @@ CHAP/sin2psi/processor.py,sha256=6ytGpsK5u6tyUTzOJqAlcRdaimA4QfXZ6xpwGf2QMFo,97
|
|
|
32
35
|
CHAP/sin2psi/reader.py,sha256=O0KeZcqACsZ8ngrliPU6I3u8SeQT0Aq866jCTbruXqc,94
|
|
33
36
|
CHAP/sin2psi/writer.py,sha256=Y1CXWMRU87XeeDp4g4-sUgPP2UbCguYZUR_Cg5Ci6l8,94
|
|
34
37
|
CHAP/tomo/__init__.py,sha256=7cwm1ufJkDKqrp2OPH_z7tKAOQ0S_RJbNainK0soKNo,328
|
|
35
|
-
CHAP/tomo/models.py,sha256=
|
|
36
|
-
CHAP/tomo/processor.py,sha256=
|
|
38
|
+
CHAP/tomo/models.py,sha256=f8UMb1JpHtpEm1D5RsqnWJvioa3IzLde8UAvDTyUYfo,8472
|
|
39
|
+
CHAP/tomo/processor.py,sha256=h3om_nN6W4E6uNhj3aXwZBJCTHPdWQd6E4bXGO-nfNk,159059
|
|
37
40
|
CHAP/tomo/reader.py,sha256=7nNP_KyIR-ghrrajCR2k5IsJnrLm6BIy-eAXIDXrQe8,123
|
|
38
41
|
CHAP/tomo/writer.py,sha256=J7q_nmsqi_zbgAS-LvAciiBqtYD8hHJ4QmwS2oZAM2Q,123
|
|
39
|
-
CHAP/utils/__init__.py,sha256=
|
|
40
|
-
CHAP/utils/fit.py,sha256=
|
|
41
|
-
CHAP/utils/general.py,sha256=
|
|
42
|
+
CHAP/utils/__init__.py,sha256=0bV7tjiTk1h9y0NQm92PNFrGcs40lFB6CzISEXMczqU,223
|
|
43
|
+
CHAP/utils/fit.py,sha256=JZKx2n5GrPmtQFxxkorMD_mvtzrEvBUfRwgMCItp__E,122419
|
|
44
|
+
CHAP/utils/general.py,sha256=wjdVHUr-zqODfeaVmoIS5_HLe3sg757oZ176x_pRG40,83450
|
|
42
45
|
CHAP/utils/material.py,sha256=NnLHAin3PrDxZiG6of8v7vFma0nAeOIRZJuXxSN_xj8,11495
|
|
46
|
+
CHAP/utils/models.py,sha256=UrccAjeuM1D6YbJTSX0fuhHXhFF6HeYHDRyi2i61qm4,18722
|
|
43
47
|
CHAP/utils/parfile.py,sha256=GxBWG6EVKQnV1I_r_m4nfJrCb0VGAn6tjEfuxVTg-aA,7227
|
|
44
|
-
CHAP/utils/scanparsers.py,sha256=
|
|
48
|
+
CHAP/utils/scanparsers.py,sha256=IJXTHPDyCm_n41LfNdnd5kMXodroijm3ltXTLLWDEAk,61950
|
|
45
49
|
MLaaS/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
50
|
MLaaS/ktrain.py,sha256=SPDUOQgjBDSx7sI8vZNXog9orvSyKmzpe6TdGHol9qM,7467
|
|
47
51
|
MLaaS/mnist_img.py,sha256=ppDtlo6yrNQy0oIhFZVOnLvHJrR3ZPZ3PjZTtJY8l0E,2738
|
|
48
52
|
MLaaS/tfaas_client.py,sha256=zpZ201wwcQBW1XkzDakD9Kl_NRSESAUdbnN6k6Ey15A,14889
|
|
49
|
-
ChessAnalysisPipeline-0.0.
|
|
50
|
-
ChessAnalysisPipeline-0.0.
|
|
51
|
-
ChessAnalysisPipeline-0.0.
|
|
52
|
-
ChessAnalysisPipeline-0.0.
|
|
53
|
-
ChessAnalysisPipeline-0.0.
|
|
54
|
-
ChessAnalysisPipeline-0.0.
|
|
53
|
+
ChessAnalysisPipeline-0.0.15.dist-info/LICENSE,sha256=IbeOUUh4pqaZbUvtbkPFMfTH2YYFlRUNtRKr0TQeUpg,3076
|
|
54
|
+
ChessAnalysisPipeline-0.0.15.dist-info/METADATA,sha256=VoAlJGQY01DwuEAUlr8td8zVVfHlxotJOjHlAMdwyo8,1542
|
|
55
|
+
ChessAnalysisPipeline-0.0.15.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
56
|
+
ChessAnalysisPipeline-0.0.15.dist-info/entry_points.txt,sha256=w-KIKdUjmj5GCobrFC4_jexCsFB4yMXYjrsMWrhI6Co,42
|
|
57
|
+
ChessAnalysisPipeline-0.0.15.dist-info/top_level.txt,sha256=BKhggOWLb9dD6oQm1RXrkJPnXm-zJxVzQef1iXYtt2k,11
|
|
58
|
+
ChessAnalysisPipeline-0.0.15.dist-info/RECORD,,
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2023 Valentin Kuznetsov
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
{ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{ChessAnalysisPipeline-0.0.14.dist-info → ChessAnalysisPipeline-0.0.15.dist-info}/top_level.txt
RENAMED
|
File without changes
|