1 | function absIndFound = idAuxCalcIndMeasAtGivenUndParams(allUndParams, undParamsToFind) |
---|
2 | %Calculates absolute flat index of element in multi-dim. array of undulator parameters |
---|
3 | %list of all un. params to look through: allUndParams = {{'phase', [-40, -20, 0, 20, 40]}, {'gap', [15.5, 25]}} |
---|
4 | %undulator parameters to find: undParamsToFind = {{'gap', 15.5}, {'phase', 40}} |
---|
5 | |
---|
6 | numAllParams = length(allUndParams); |
---|
7 | numParamsToFind = length(undParamsToFind); |
---|
8 | |
---|
9 | %maxNumParams = 3; |
---|
10 | if(numAllParams <= 0) %|| (numAllParams > maxNumParams)) |
---|
11 | absIndFound = -1; |
---|
12 | return; |
---|
13 | end |
---|
14 | if(numParamsToFind <= 0) %|| (numParamsToFind > maxNumParams)) |
---|
15 | absIndFound = -1; |
---|
16 | return; |
---|
17 | end |
---|
18 | if(numAllParams ~= numParamsToFind) |
---|
19 | absIndFound = -1; |
---|
20 | return; |
---|
21 | end |
---|
22 | |
---|
23 | arPerInd = zeros(numAllParams, 1); |
---|
24 | %fill-in array of periods |
---|
25 | arPerInd(numAllParams) = 1; |
---|
26 | prodSizes = 1; |
---|
27 | for i = 1:(numAllParams - 1) |
---|
28 | curParamInf = allUndParams{numAllParams - i + 1}; |
---|
29 | curParamValues = curParamInf{2}; |
---|
30 | prodSizes = prodSizes*length(curParamValues); |
---|
31 | arPerInd(numAllParams - i) = prodSizes; |
---|
32 | end |
---|
33 | |
---|
34 | absIndFound = -1; |
---|
35 | absIndCount = 0; |
---|
36 | %prevRelInd = -1; |
---|
37 | for i = 1:numAllParams |
---|
38 | curParamInf = allUndParams{i}; |
---|
39 | curParamName = curParamInf{1}; |
---|
40 | |
---|
41 | carParamValueToFind = 1e+23; |
---|
42 | for j = 1:numParamsToFind |
---|
43 | curParamToFindInf = undParamsToFind{j}; |
---|
44 | curParamNameToFind = curParamToFindInf{1}; |
---|
45 | if(strcmp(curParamName, curParamNameToFind)) |
---|
46 | carParamValueToFind = curParamToFindInf{2}; |
---|
47 | break; |
---|
48 | end |
---|
49 | end |
---|
50 | if(carParamValueToFind == 1e+23) |
---|
51 | return; |
---|
52 | end |
---|
53 | curParamValues = curParamInf{2}; |
---|
54 | numCurParamValues = length(curParamValues); |
---|
55 | absMinDif = 1e+23; |
---|
56 | indMinDif = -1; |
---|
57 | for k = 1:numCurParamValues |
---|
58 | curAbsDif = abs(curParamValues(k) - carParamValueToFind); |
---|
59 | if(absMinDif > curAbsDif) |
---|
60 | absMinDif = curAbsDif; |
---|
61 | indMinDif = k; |
---|
62 | end |
---|
63 | end |
---|
64 | %prevRelInd = indMinDif; |
---|
65 | absIndCount = absIndCount + (indMinDif - 1)*arPerInd(i); |
---|
66 | end |
---|
67 | absIndFound = absIndCount + 1; |
---|