class ScalarsHDFAnalyzer(HDFAnalyzer): corrections = obj( mpc = obj(ElecElec=-1,MPC=1), kc = obj(KEcorr=1) ) def __init__(self,exclude): HDFAnalyzer.__init__(self) self.info.exclude = exclude #end def def load_data_local(self,data=None): if data==None: self.error('attempted load without data') #end if exclude = self.info.exclude self.data = QAHDFdata() for var in data.keys(): if not var in exclude and not str(var)[0]=='_': self.data[var] = data[var] del data[var] #end if #end for corrvars = ['LocalEnergy','ElecElec','MPC','KEcorr'] if set(corrvars)<set(self.data.keys()): Ed,Ved,Vmd,Kcd = self.data.tuple(*corrvars) E,E2 = Ed.value,Ed.value_squared Ve,Ve2 = Ved.value,Ved.value_squared Vm,Vm2 = Vmd.value,Vmd.value_squared Kc,Kc2 = Kcd.value,Kcd.value_squared self.data.LocalEnergy_mpc_kc = obj( value = E-Ve+Vm+Kc, value_squared = E2+Ve2+Vm2+Kc2 + 2*(E*(-Ve+Vm+Kc)-Ve*(Vm+Kc)+Vm*Kc) ) #end if #end def load_data_local def analyze_local(self): nbe = QAanalyzer.method_info.nblocks_exclude self.info.nblocks_exclude = nbe for varname,val in self.data.iteritems(): (mean,var,error,kappa)=simstats(val.value[nbe:,...].ravel()) self[varname] = obj( mean = mean, variance = val.value_squared[nbe:,...].mean()-mean**2, sample_variance = var, error = error, kappa = kappa ) #end for self.correct('mpc','kc') #end def analyze_local def correct(self,*corrections): corrkey='' for corr in corrections: corrkey+=corr+'_' #end for corrkey=corrkey[:-1] if set(corrections)>set(self.corrections.keys()): self.warn('correction '+corrkey+' is unknown and cannot be applied') return #end if if not 'data' in self: self.warn('correction '+corrkey+' cannot be applied because data is not present') return #end if varname = 'LocalEnergy_'+corrkey if varname in self and varname in self.data: return #end if corrvars = ['LocalEnergy'] signs = [1] for corr in corrections: for var,sign in self.corrections[corr].iteritems(): corrvars.append(var) signs.append(sign) #end for #end for missing = list(set(corrvars)-set(self.data.keys())) if len(missing)>0: self.warn('correction '+corrkey+' cannot be applied because '+str(missing)+' are missing') return #end if le = self.data.LocalEnergy E,E2 = 0*le.value,0*le.value_squared n = len(corrvars) for i in range(n): ed = self.data[corrvars[i]] e,e2 = ed.value,ed.value_squared s = signs[i] E += s*e E2 += e2 for j in range(i+1,n): eo = self.data[corrvars[j]].value so = signs[j] E2 += 2*s*e*so*eo #end for #end for val = obj(value=E,value_squared=E2) self.data[varname] = val nbe = self.info.nblocks_exclude (mean,var,error,kappa)=simstats(val.value[nbe:,...].ravel()) self[varname] = obj( mean = mean, variance = val.value_squared[nbe:,...].mean()-mean**2, sample_variance = var, error = error, kappa = kappa )