-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathassign_UID.m
More file actions
executable file
·135 lines (129 loc) · 4.32 KB
/
Copy pathassign_UID.m
File metadata and controls
executable file
·135 lines (129 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
function out = assign_UID(EPICS_PID,EPICS_SCANSTEP,EPICS_DATASET,varargin)
% IMAGE_PID,IMAGE_SCANSTEP,AIDA_PID,AIDA_SCANSTEP)
% function [epics_UID, image_UID, aida_UID] =
% assign_UID(EPICS_PID,EPICS_SCANSTEP,EPICS_DATASET,optional_struct
% IMAGE_PID,IMAGE_SCANSTEP,AIDA_PID,AIDA_SCANSTEP)
%
% Inputs:
% EPICS_PID: Vector of pulse IDs from PATT_SYS1_1_PULSEID (required)
% EPICS_SCANSTEP: Vector of scan steps (required)
% EPICS_DATASET: Vector of dataset (required)
% optional_struct: Struct containing the following optional fields: (optional)
% optional_struct.IMAGE_PID: Vector of pulse IDs from E200_readImages (optional)
% optional_struct.IMAGE_SCANSTEP: Vector of scan steps (optional)
% optional_struct.AIDA_PID: Vector of pulse IDs from AIDA struct (optional)
% optional_struct.AIDA_SCANSTEP: Vector of scan steps (optional)
%
% Outputs:
% epics_UID: Vector of unique IDs as long as EPICS_PID
% image_UID: Vector of unique IDs as long as IMAGE_PID
% aida_UID: Vector of unique IDs as long as AIDA_PID
%
% Enumerate EPICS shots in steps in datasets and create a
% unique ID (UID). Assign UID to image and AIDA data.
% Deconstruct optional_struct into variables
if nargin==4
optional_struct=varargin{1};
str=fieldnames(optional_struct);
for i=1:size(str,1)
eval([str{i} '= optional_struct.' str{i} ';']);
end
end
% EPICS_SHOT is the index of the shot in the step in the dataset
step = unique(EPICS_SCANSTEP);
EPICS_SHOT = [];
for i = 1:length(step)
EPICS_SHOT = [EPICS_SHOT (1:sum(EPICS_SCANSTEP == step(i)))];
end
% Create UID from dataset, scan step, and shot number
epics_UID = 1e8*EPICS_DATASET+1e4*EPICS_SCANSTEP+EPICS_SHOT;
out.epics_UID=epics_UID;
% Assign UID to image data
if exist('IMAGE_PID')
image_UID = [];
for i = 1:length(step)
% display(i)
% display(step)
% size(step)
% display(IMAGE_PID);
% display(IMAGE_SCANSTEP);
% isolate pulse IDs for relevant scan step
EPID = EPICS_PID(EPICS_SCANSTEP == step(i));
EUID = epics_UID(EPICS_SCANSTEP == step(i));
IPID = IMAGE_PID(IMAGE_SCANSTEP == step(i));
% determine if pulse IDs return to zero during scan step
e_lo = EPID(1:(end-1));
e_hi = EPID(2:end);
i_lo = IPID(1:(end-1));
i_hi = IPID(2:end);
j = find(e_hi < e_lo,1,'first');
k = find(i_hi < i_lo,1,'first');
% find image pulse IDs in EPICS pulse ID vector
if isempty(j) && isempty(k) % monotonic
[discard,discard,ib] = intersect(IPID,EPID);
else % not monotonic
if ~isempty(k)
iid_lo = IPID(1:k);
iid_hi = IPID((k+1):end);
else
iid_lo = [];
iid_hi = IPID;
end
[discard,discard,ib_lo] = intersect(iid_lo,EPID);
[discard,discard,ib_hi] = intersect(iid_hi,EPID);
if isrowcustom(ib_lo); ib_lo = ib_lo'; end;
if isrowcustom(ib_hi); ib_hi = ib_hi'; end;
ib = [ib_lo; ib_hi];
end
% assign image UID
image_UID = [image_UID EUID(ib)];
end
out.image_UID=image_UID;
end
% Assign UID to aida data
if exist('AIDA_PID')
aida_UID = [];
for i = 1:length(step)
% isolate pulse IDs for relevant scan step
EPID = EPICS_PID(EPICS_SCANSTEP == step(i));
EUID = epics_UID(EPICS_SCANSTEP == step(i));
APID = AIDA_PID(AIDA_SCANSTEP == step(i));
% determine if pulse IDs return to zero during scan step
e_lo = EPID(1:(end-1));
e_hi = EPID(2:end);
a_lo = APID(1:(end-1));
a_hi = APID(2:end);
j = find(e_hi < e_lo,1,'first');
k = find(a_hi < a_lo,1,'first');
% find aida pulse IDs in EPICS pulse ID vector
if isempty(j) && isempty(k) % monotonic
[discard,discard,ab] = intersect(APID,EPID);
else % not monotonic
if ~isempty(k)
aid_lo = APID(1:k);
aid_hi = APID((k+1):end);
else
aid_lo = [];
aid_hi = APID;
end
[discard,discard,ab_lo] = intersect(aid_lo,EPID);
[discard,discard,ab_hi] = intersect(aid_hi,EPID);
if isrowcustom(ab_lo); ab_lo = ab_lo'; end;
if isrowcustom(ab_hi); ab_hi = ab_hi'; end;
ab = [ab_lo; ab_hi];
end
% assign image UID
aida_UID = [aida_UID EUID(ab)];
end
out.aida_UID=aida_UID;
end
end
function out = isrowcustom(var)
[xsize,ysize] = size(var);
yisint = (round(ysize) == ysize);
if ( xsize == 1 ) && ( yisint ) && ( ysize > 0 )
out = true;
else
out = false;
end
end