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/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 hasattr(self, '_par_file'):
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 comments of
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
- return os.path.join(
671
- self.detector_data_path, detector_files[scan_step_index])
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 TiffFile(image_file) as tiff_file:
677
- image_data = tiff_file.asarray()
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[1]
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ChessAnalysisPipeline
3
- Version: 0.0.14
3
+ Version: 0.0.15
4
4
  Summary: CHESS analysis pipeline framework
5
5
  Home-page: https://github.com/CHESSComputing/ChessAnalysisPipeline
6
6
  Author: Keara Soloway, Rolf Verberg, Valentin Kuznetsov
@@ -1,24 +1,27 @@
1
1
  CHAP/TaskManager.py,sha256=NEqg2jAq10kbScE18XtzY3liqkIdAtysaR-gMG5tBzs,6803
2
- CHAP/__init__.py,sha256=CjKQO1ao0OkBYJyBjtyt-kNq6PHBVlDPl65EvhyVGnw,1073
3
- CHAP/pipeline.py,sha256=wyOMT0fuXsVL2sPCRynfIXpTZraI2USxzAyyMz1DkdY,8984
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=yRwK8OgcoDQrGUbHULmFoWXkodbWXQBhHGzqDLJrm-k,7891
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=MP_8flMD7b-hq5O_x7GfGN9TFx-DnFLwQx3Am6bs5NI,1056
10
- CHAP/common/processor.py,sha256=orJiphJPQL6ZnM0CKYPgpIH1-G-ZERkMoeRGNStvTV8,55608
11
- CHAP/common/reader.py,sha256=Ph6St2H-6HB3O8pKbsNSEUe-fWOXn6qch-zCMf1n0D8,13597
12
- CHAP/common/writer.py,sha256=6LH0FoKHh30ixwM3qTHBoMyki0A0PODY8n7jr1Fo1-0,12654
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=WzJ8Z-TRoQsG83wAQqIEDCJKsGQtf6RNgVRWjfmmiog,39296
16
- CHAP/edd/__init__.py,sha256=5GfA6Rr8ixps4_qC2V6G_WdDA2eqleykYHz-ZRvRXcs,554
17
- CHAP/edd/models.py,sha256=2Shnqkemf8xgHGEVzMZtaTF025lMJncRyPDJ9DcHtxo,37229
18
- CHAP/edd/processor.py,sha256=oKXDGoZCHLCYvO2SbVZBHgmX8anrkm5KmFLyFBRBCd8,78164
19
- CHAP/edd/reader.py,sha256=O0KeZcqACsZ8ngrliPU6I3u8SeQT0Aq866jCTbruXqc,94
20
- CHAP/edd/utils.py,sha256=07hSeBk7hVpHJE9bbJQupaSSul4hjcyK33a9I1PrPHs,42888
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=TTq1QbIK1h2xVpPWXwc41fWaDCavmufcTOK3N-MxGh0,8293
36
- CHAP/tomo/processor.py,sha256=mF9gCugvsEPsUgwFM_3GuzdpAxouJ7H8lMov73C_HHk,155112
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=3blWv3cFKA4woMNUUI8d1WZFc4izlgMbfUPNAyBDiRs,183
40
- CHAP/utils/fit.py,sha256=jF1ZjjFWMXXBqhWHNbHhOnUJgCXTU_jdqD3dKTCtRGk,130694
41
- CHAP/utils/general.py,sha256=ATVpbfNRp0dRBgioLmAeJcb7mAAWmrVHUYqphE18vCg,72270
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=UUmSDW9l002gi4yW7W9xy2rBJ0n-UgHQOiaK3g-pHzE,55782
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.14.dist-info/LICENSE,sha256=GrJL25aZivxje_x-zBbeWASvdmgztxv8kBMhIP4XSMo,1075
50
- ChessAnalysisPipeline-0.0.14.dist-info/METADATA,sha256=U9FLhH71SVqIu4TPV7acfJOspAAFiF0G-rZEn7aFh0Y,1542
51
- ChessAnalysisPipeline-0.0.14.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
52
- ChessAnalysisPipeline-0.0.14.dist-info/entry_points.txt,sha256=w-KIKdUjmj5GCobrFC4_jexCsFB4yMXYjrsMWrhI6Co,42
53
- ChessAnalysisPipeline-0.0.14.dist-info/top_level.txt,sha256=BKhggOWLb9dD6oQm1RXrkJPnXm-zJxVzQef1iXYtt2k,11
54
- ChessAnalysisPipeline-0.0.14.dist-info/RECORD,,
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,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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.