def convertEffWeightsToMoments( Weights, **kwargs ) : verb = kwargs.pop( 'Verbose', True ) pols = [ '0 0', 'para para', 'perp perp', '0 para', '0 perp', 'para perp', 'S S', '0 S', 'para S', 'perp S' ] wNames = kwargs.pop( 'WeightNames' , { '0 0' : 'Re_ang_A0_A0', 'para para' : 'Re_ang_Apar_Apar', 'perp perp' : 'Re_ang_Aperp_Aperp' , '0 para' : 'Re_ang_A0_Apar', '0 perp' : 'Im_ang_A0_Aperp', 'para perp' : 'Im_ang_Apar_Aperp' , 'S S' : 'Re_ang_AS_AS', '0 S' : 'Re_ang_A0_AS', 'para S' : 'Re_ang_Apar_AS', 'perp S' : 'Im_ang_Aperp_AS' } ) pref = kwargs.pop('WeightNamesPrefix', '') if pref: for wNam in wNames.keys(): wNames[wNam] = pref + '_' + wNames[wNam] for pol in pols : assert pol in wNames.keys()\ , 'P2VV - ERROR: convertEffWeightsToMoments(): polarization "%s" not found in weight names dictionary' % pol assert wNames[pol] in Weights.keys()\ , 'P2VV - ERROR: convertEffWeightsToMoments(): weight "%s" not found in weights dictionary' % wNames[pol] momNames = [ 'p2vvab_0000', 'p2vvab_0020', 'p2vvab_0022' , 'p2vvab_0021', 'p2vvab_002m1', 'p2vvab_002m2' , 'p2vvab_1000', 'p2vvab_1021', 'p2vvab_102m1' , 'p2vvab_2000' ] # convert weights to moments from math import sqrt, pi coef = lambda name : Weights[ wNames[name] ][0] moms = { } moms['p2vvab_0000'] = 1. / 3. * ( coef('0 0') + coef('para para') + coef('perp perp') ) moms['p2vvab_0020'] = 1. / 3. * sqrt(5.) * ( coef('0 0') + coef('para para') + coef('perp perp') - 3. * coef('S S') ) moms['p2vvab_0022'] = -sqrt(5. / 3.) * ( coef('para para') - coef('perp perp') ) moms['p2vvab_2000'] = 5. / 2. * ( coef('0 0') - coef('S S') ) moms['p2vvab_0021'] = - 8. / 3. * sqrt( 5. / 2. ) / pi * coef('para S') moms['p2vvab_002m1'] = - 8. / 3. * sqrt( 5. / 2. ) / pi * -coef('perp S') moms['p2vvab_002m2'] = sqrt( 5. / 3. ) * -coef('para perp') moms['p2vvab_1000'] = 1. / 2. * sqrt(3.) * coef('0 S') moms['p2vvab_1021'] = -32. / 3. * sqrt( 5. / 6. ) / pi * coef('0 para') moms['p2vvab_102m1'] = +32. / 3. * sqrt( 5. / 6. ) / pi * -coef('0 perp') # match the general moments coefficients format for name in momNames : moms[name] = ( moms[name], 0., 0. ) # get scale factor for moment coefficient scale = kwargs.pop( 'Scale', 1. ) if verb or kwargs.pop( 'PrintMoments', verb ) : # print moments to screen printMoments( BasisFuncNames = momNames, Moments = moms, Scale = scale ) if kwargs.get( 'OutputFilePath', '' ) : # write the moments to a file writeMoments( kwargs.pop('OutputFilePath'), BasisFuncNames = momNames, Moments = moms, Scale = scale, Verbose = verb ) # check if there are remaining keyword arguments assert len(kwargs) == 0, 'P2VV - ERROR: convertEffWeightsToMoments(): unused keyword arguments: %s' % kwargs
def normalizeMoments( momentsFileOrig, momentsFileNorm, normMoment = 'Re_ang_A0_A0', printMoms = True ): # moment containers funcNames = [ ] moments = { } correlations = { } # read moments print 'input moments:' from P2VV.Utilities.DataMoments import readMoments, printMoments readMoments( momentsFileOrig, BasisFuncNames = funcNames, Moments = moments, Correlations = correlations, ProcessAll = True ) if printMoms: printMoments( BasisFuncNames = funcNames, Moments = moments, Correlations = correlations ) # calculate moments with new normalization from math import sqrt valNorm = moments[normMoment][0] errNorm = moments[normMoment][1] momsNew = { } corrsNew = { } # moments value and error for name in funcNames : valNew = moments[name][0] / valNorm err = moments[name][1] corrNorm = correlations[name][normMoment] varNew = ( err**2 + valNew**2 * errNorm**2 - 2. * valNew * err * errNorm * corrNorm ) / valNorm**2 momsNew[name] = ( valNew, sqrt(varNew), ( sqrt( valNew**2 / varNew ) ) if varNew != 0. else 0. if valNew == 0. else float('inf') ) corrsNew[name] = { } # moments correlations for name0 in funcNames : for name1 in funcNames : valsNew = ( momsNew[name0][0], momsNew[name1][0] ) errsNew = ( momsNew[name0][1], momsNew[name1][1] ) errs = ( moments[name0][1], moments[name1][1] ) corr01 = correlations[name0][name1] corr0Norm = correlations[name0][normMoment] corr1Norm = correlations[name1][normMoment] corr01New = ( errs[0] * errs[1] * corr01 + valsNew[0] * valsNew[1] * errNorm**2\ - valsNew[1] * errs[0] * errNorm * corr0Norm - valsNew[0] * errs[1] * errNorm * corr1Norm ) / valNorm**2 if abs( errsNew[0] ) > 1.e-10 and abs( errsNew[1] ) > 1.e-10 : corr01New /= errsNew[0] * errsNew[1] elif abs( corr01New ) < 1.e-10 and name0 == normMoment and name1 == normMoment : corr01New = 1. elif abs( corr01New ) < 1.e-10 and ( name0 == normMoment or name1 == normMoment ) : corr01New = 0. else : corr01New = -999. corrsNew[name0][name1] = corr01New corrsNew[name1][name0] = corr01New print 'output moments:' from P2VV.Utilities.DataMoments import writeMoments writeMoments( momentsFileNorm, BasisFuncNames = funcNames, Moments = momsNew, Correlations = corrsNew ) if printMoms: printMoments( BasisFuncNames = funcNames, Moments = momsNew, Correlations = corrsNew )
def write( self, filePath = 'moments', **kwargs ) : writeMoments( filePath, BasisFuncNames = self._basisFuncNames, Moments = self._coefficients, Correlations = self._correlations, **kwargs )
def combineMoments( momentsFilesIn, momentsFileOut, prefix = '', printMoms = True): funcNames = [ 'Re_ang_A0_A0', 'Re_ang_Apar_Apar', 'Re_ang_Aperp_Aperp' , 'Im_ang_Apar_Aperp', 'Re_ang_A0_Apar', 'Im_ang_A0_Aperp' , 'Re_ang_AS_AS', 'Re_ang_Apar_AS', 'Im_ang_Aperp_AS', 'Re_ang_A0_AS' ] if prefix: funcNamesWPF = [] for name in funcNames: funcNamesWPF += [prefix + '_' + name] funcNames = funcNamesWPF # moment containers moments = [ ] correlations = [ ] # read moments from P2VV.Utilities.DataMoments import readMoments, printMoments for momsFile in momentsFilesIn : moments.append( { } ) correlations.append( { } ) readMoments( momsFile, BasisFuncNames = funcNames, Moments = moments[-1], Correlations = correlations[-1] ) if printMoms: printMoments( BasisFuncNames = funcNames, Moments = moments[-1], Correlations = correlations[-1] ) # combine moments from ROOT import TMatrixD combNames = [ name for name in funcNames if moments[0][name][1] > 0. ] momVec = TMatrixD( len(combNames), 1 ) covMat = TMatrixD( len(combNames), len(combNames) ) for moms, corrs in zip( moments, correlations ) : mom = TMatrixD( len(combNames), 1 ) cov = TMatrixD( len(combNames), len(combNames) ) for it1, name1 in enumerate(combNames) : mom[it1][0] = moms[name1][0] for it2, name2 in enumerate(combNames) : cov[it1][it2] = moms[name1][1] * moms[name2][1] * corrs[name1][name2] cov.Invert() momVec += cov * mom covMat += cov covMat.Invert() momVec = covMat * momVec momsNew = { } corrsNew = { } for name in funcNames : if moments[0][name][1] > 0. : continue momsNew[name] = moments[0][name] corrsNew[name] = correlations[0][name] from math import sqrt for it1, name1 in enumerate(combNames) : val = momVec[it1][0] err = sqrt( covMat[it1][it1] ) momsNew[name1] = ( val, err, abs( val / err ) ) corrsNew[name1] = { } for name in funcNames : if moments[0][name][1] > 0. : continue corrsNew[name1][name] = correlations[0][name1][name] for it2, name2 in enumerate(combNames) : corrsNew[name1][name2] = covMat[it1][it2] / err / sqrt( covMat[it2][it2] ) # write combined moments to file from P2VV.Utilities.DataMoments import writeMoments writeMoments( momentsFileOut, BasisFuncNames = funcNames, Moments = momsNew, Correlations = corrsNew ) if printMoms: printMoments( BasisFuncNames = funcNames, Moments = momsNew, Correlations = corrsNew )
varNew = ( err**2 + valNew**2 * errNorm**2 - 2. * valNew * err * errNorm * corrNorm ) / valNorm**2 momsNew[name] = ( valNew, sqrt(varNew), ( sqrt( valNew**2 / varNew ) ) if varNew != 0. else 0. if valNew == 0. else float('inf') ) corrsNew[name] = { } # moments correlations for name0 in funcNames : for name1 in funcNames : valsNew = ( momsNew[name0][0], momsNew[name1][0] ) errsNew = ( momsNew[name0][1], momsNew[name1][1] ) errs = ( moments[name0][1], moments[name1][1] ) corr01 = correlations[name0][name1] corr0Norm = correlations[name0][normMoment] corr1Norm = correlations[name1][normMoment] corr01New = ( errs[0] * errs[1] * corr01 + valsNew[0] * valsNew[1] * errNorm**2\ - valsNew[1] * errs[0] * errNorm * corr0Norm - valsNew[0] * errs[1] * errNorm * corr1Norm ) / valNorm**2 if abs( errsNew[0] ) > 1.e-10 and abs( errsNew[1] ) > 1.e-10 : corr01New /= errsNew[0] * errsNew[1] elif abs( corr01New ) < 1.e-10 and name0 == normMoment and name1 == normMoment : corr01New = 1. elif abs( corr01New ) < 1.e-10 and ( name0 == normMoment or name1 == normMoment ) : corr01New = 0. else : corr01New = -999. corrsNew[name0][name1] = corr01New corrsNew[name1][name0] = corr01New print 'output moments:' from P2VV.Utilities.DataMoments import writeMoments writeMoments( momentsFileNorm, BasisFuncNames = funcNames, Moments = momsNew, Correlations = corrsNew ) printMoments( BasisFuncNames = funcNames, Moments = momsNew, Correlations = corrsNew )