2 ##################################
11 #from bl_instance.build_bl import *
13 from tools
.generic_utils
.time_formats
import *
14 from tools
.generic_utils
.time_intervals
import *
15 from tools
.archiving_extraction
import paramdata_filename
16 from splittingTime_byData
import *
18 ###################################
19 from bl_instance
.build_bl
import *
20 ###################################
23 ###############################################
24 ##startShift_hour = '07:00:00'
25 ##endShift_hour = '07:00:00'
27 STEADYPERIOD_MINLENGTH
= 60*10 # = 10 min
28 #steadyPeriod_maxLength_sec = 60*60*3 # = 3 hours
29 ###############################################
35 def __init__(self
, _steady_params
, _rel_timeInterval_sec
, _abs_timeInterval_str
, _monitor
= 0):
37 self
.steady_params
= _steady_params
# dict{name:val}
38 self
.rel_timeInterval
= _rel_timeInterval_sec
39 self
.abs_timeInterval
= _abs_timeInterval_str
40 self
.monitor
= _monitor
# is needed to order params following the beam_path
49 for p
in self
.monitor
.beamAccess_params
+ self
.monitor
.blSteadiness_params
:
50 if not p
.name
in self
.steady_params
.keys():
55 for p
in self
.monitor
.beamAccess_params
+ self
.monitor
.blSteadiness_params
:
56 params_str
+= p
.name
+ ' = ' + str(self
.steady_params
[p
.name
]) + '\n'
58 for p_name
in self
.steady_params
.keys():
59 params_str
+= p_name
+ ' = ' + str(self
.steady_params
[p_name
]) + '\n'
61 for p_name
in self
.steady_params
.keys():
62 params_str
+= p_name
+ ' = ' + str(self
.steady_params
[p_name
]) + '\n'
64 return ( '\n'+ str(self
.rel_timeInterval
) + ' -> ' + str(self
.abs_timeInterval
) + '\n'
69 def matches_condition(self
, param_name
, param_val
, delta
= -1):
71 if not param_name
in self
.steady_params
.keys():
72 print "Invalid param name in bl_steady.matches_condition"
78 return abs(self
.steady_params
[param_name
] - param_val
) <= delta
83 ###########################################################
84 def get_blSteadyStates(params_data
, overAll_timeInterval_str
):
86 params_breakMoments_vals
= {} ###
87 latest_firstMoment
= 0 # latest first data over all params
89 for p
in params_data
.keys():
92 if params_data
[p
][0][0] > latest_firstMoment
:
93 latest_firstMoment
= params_data
[p
][0][0]
95 params_breakMoments_vals
[p
] = get_breakMoments_vals(p
, params_data
[p
])
96 print numpy
.transpose(params_breakMoments_vals
[p
]) # DEBUG
98 'params_breakMoments_vals[p][0] = vector of moments (rel. time in sec.)'
99 'params_breakMoments_vals[p][1] = vector of corresponding values'
101 print '\nlatest_firstMoment = ', latest_firstMoment
, '\n' # DEBUG
103 for p
in params_breakMoments_vals
.keys():
104 p_n
= len(params_breakMoments_vals
[p
][0])
107 while (params_breakMoments_vals
[p
][0][m_inx
] < latest_firstMoment
and
114 first_val
= params_breakMoments_vals
[p
][1][m_inx
-1] # keep this val for each param
116 #for all params, remove all the stuff (moments and vals) preceeding the latest_firstMoment:
117 del params_breakMoments_vals
[p
][0][:m_inx
]
118 del params_breakMoments_vals
[p
][1][:m_inx
]
120 params_breakMoments_vals
[p
][0].insert(0, latest_firstMoment
)
121 params_breakMoments_vals
[p
][1].insert(0, first_val
)
124 params_breakMoments_vals
[p
][0].insert(0, latest_firstMoment
)
125 params_breakMoments_vals
[p
][1].insert(0, params_data
[p
][0][1])
128 params_breakMoments_vals
[p
][0].append(latest_firstMoment
)
129 params_breakMoments_vals
[p
][1].append(params_data
[p
][0][1])
132 overAll_breakMoments
= [] ###
133 for p
in params_breakMoments_vals
.keys():
134 overAll_breakMoments
+= params_breakMoments_vals
[p
][0]
136 overAll_breakMoments
= list(sets
.Set(overAll_breakMoments
))# removes duplicates
137 overAll_breakMoments
.sort()
138 print "overAll_breakMoments = ", overAll_breakMoments
, '\n' # DEBUG
140 params_steadyVals
= {} ###
141 for p
in params_breakMoments_vals
.keys():
143 p_valsNb
= len(params_breakMoments_vals
[p
][0])
146 params_steadyVals
[p
] = [params_breakMoments_vals
[p
][1][0]] # init: corresponding to the latest_firstMoment
148 overAll_i
= 1 # 0 corresponds to the latest_firstMoment for all params
149 for p_i
in range(1, p_valsNb
):
151 while overAll_breakMoments
[overAll_i
] < params_breakMoments_vals
[p
][0][p_i
]:
152 params_steadyVals
[p
].append(params_breakMoments_vals
[p
][1][p_i
-1])
155 def f(x
): return params_breakMoments_vals
[p
][1][p_valsNb
-1]
157 params_steadyVals
[p
] += map(f
, range( overAll_i
,len(overAll_breakMoments
) ))
159 print "params_steadyVals[", p
.name
, "] = ", params_steadyVals
[p
] # DEBUG
161 #print params_steadyVals # DEBUG
164 for mi
in range(len(overAll_breakMoments
)-1):
166 # if the interval is sufficiently long
167 if overAll_breakMoments
[mi
+1] - overAll_breakMoments
[mi
] >= STEADYPERIOD_MINLENGTH
:
171 curr_timeInterval_rel
= (overAll_breakMoments
[mi
], overAll_breakMoments
[mi
+1])
173 curr_timeInterval_abs
= rel2abs([curr_timeInterval_rel
], overAll_timeInterval_str
[0])[0]
175 for p
in params_breakMoments_vals
.keys():
176 #print mi, ' ', params_steadyVals[p][mi]
177 steady_params
[p
.name
] = params_steadyVals
[p
][mi
]
179 bl_steadyStates
.append( bl_steady(steady_params
, curr_timeInterval_rel
, curr_timeInterval_abs
, monitor
) )
180 #print bl_steadyStates[-1] # debug
183 last_moment
= str2sec(overAll_timeInterval_str
[1]) - str2sec(overAll_timeInterval_str
[0])
184 if last_moment
- overAll_breakMoments
[-1] >= STEADYPERIOD_MINLENGTH
:
188 last_timeInterval_rel
= (overAll_breakMoments
[-1], last_moment
)
189 last_timeInterval_abs
= rel2abs([last_timeInterval_rel
], overAll_timeInterval_str
[0])[0]
191 for p
in params_breakMoments_vals
.keys():
192 steady_params
[p
.name
] = params_steadyVals
[p
][-1]
194 bl_steadyStates
.append( bl_steady(steady_params
, last_timeInterval_rel
, last_timeInterval_abs
, monitor
) )
195 #print bl_steadyStates[-1] # debug
198 return bl_steadyStates
201 ############################
202 if __name__
== '__main__':
205 if len(sys
.argv
) < 2:
206 print "Correct use: " + sys
.argv
[0] + " date_str('Y-m-d') [data_path]"
209 date_str
= sys
.argv
[1]
210 year
, month
, day
= date_str
.split('-')
212 data_path
= bl_instance_path
+ os
.sep
+ 'extracted_data'
213 if len(sys
.argv
) == 3:
214 data_path
= sys
.argv
[2]
216 month_dir
= data_path
+ os
.sep
+ year
+ os
.sep
+ month
217 archived_dates
= os
.listdir(month_dir
)
218 #print archived_dates # debug
221 if not day
in archived_dates
:
222 print " No data for ", date_str
225 day_dir
= month_dir
+ os
.sep
+ day
227 data_files
= os
.listdir(day_dir
)
230 for elem
in beam_path
:
231 if isinstance(elem
, beam_monitor
)and not isinstance(elem
, extractable_beamMonitor
):
232 # until the first beam monitor
234 monitor
= elem
# just a notation for better readability
235 #print '\nMonitor: ', monitor.nickname # DEBUG
237 monitor
.define_blSteadiness(beam_path
)
240 for param
in monitor
.beamAccess_params
+ monitor
.blSteadiness_params
:
241 #print param.name # DEBUG
244 if param
.name
.replace('/', '.') in f
:
247 # supposing there is only one datafile for each param
249 #print param_datafile # DEBUG
251 param_data
= (numpy
.loadtxt( day_dir
+ os
.sep
+ param_datafile
, usecols
=(0,1), unpack
=True )) # as 2 colomns
252 param_data
= param_data
.transpose()
253 #print len(param_data)
256 overAll_timeInterval_str
= paramdata_filename
.filename2timeInterval(day_dir
+ os
.sep
+ param_datafile
)
257 #print overAll_timeInterval_str # DEBUG
259 params_data
[param
] = param_data
261 bl_steadyStates
= get_blSteadyStates(params_data
, overAll_timeInterval_str
)
263 print bl_steadyStates
265 ## for s in bl_steadyStates:
266 ## #if s.matches_condition( 'mono1/energy', 12.65, 0.0005):
267 ## if s.matches_condition( 'tdl.1/frontEndStateValue', 5.):
271 break # only until the first beam monitor