Exemple #1
0
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
Exemple #2
0
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 )
Exemple #3
0
 def write( self, filePath = 'moments', **kwargs ) :
     writeMoments( filePath, BasisFuncNames = self._basisFuncNames, Moments = self._coefficients, Correlations = self._correlations,
                  **kwargs )
Exemple #4
0
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 )