Beispiel #1
0
def get2DoffDiagonal(wave1, wave2, mMin, mMax, intDir):
	"""
	Get the two dimensional off-diagonal terms for two de-isobarred waves
	"""
	integrals = getIntegralMatrixAverage(mMin,mMax,intDir,True, False)
	waves1=[]
	waves2=[]
	for key in integrals[0].iterkeys():
		if key.startswith(wave1):
			mev1 = float(key.split('_')[1])/1000
			mev2 = float(key.split('_')[2][:4])/1000
			waves1.append([mev1,mev2,integrals[0][key]])
		if key.startswith(wave2):
			mev1 = float(key.split('_')[1])/1000
			mev2 = float(key.split('_')[2][:4])/1000
			waves2.append([mev1,mev2,integrals[0][key]])
	ints = []
	res=[]
	ims=[]
	for ww1 in waves1:
		for ww2 in waves2:
			ints.append([ww1[0],ww1[1],ww2[0],ww2[1],abs(integrals[1][ww1[2]][ww2[2]])])
			res.append([ww1[0],ww1[1],ww2[0],ww2[1],integrals[1][ww1[2]][ww2[2]].real])
			ims.append([ww1[0],ww1[1],ww2[0],ww2[1],integrals[1][ww1[2]][ww2[2]].imag])
	return ints,res,ims
Beispiel #2
0
def get2DoffDiagonal(wave1, wave2, mMin, mMax, intDir):
    """
	Get the two dimensional off-diagonal terms for two de-isobarred waves
	"""
    integrals = getIntegralMatrixAverage(mMin, mMax, intDir, True, False)
    waves1 = []
    waves2 = []
    for key in integrals[0].iterkeys():
        if key.startswith(wave1):
            mev1 = float(key.split('_')[1]) / 1000
            mev2 = float(key.split('_')[2][:4]) / 1000
            waves1.append([mev1, mev2, integrals[0][key]])
        if key.startswith(wave2):
            mev1 = float(key.split('_')[1]) / 1000
            mev2 = float(key.split('_')[2][:4]) / 1000
            waves2.append([mev1, mev2, integrals[0][key]])
    ints = []
    res = []
    ims = []
    for ww1 in waves1:
        for ww2 in waves2:
            ints.append([
                ww1[0], ww1[1], ww2[0], ww2[1],
                abs(integrals[1][ww1[2]][ww2[2]])
            ])
            res.append([
                ww1[0], ww1[1], ww2[0], ww2[1],
                integrals[1][ww1[2]][ww2[2]].real
            ])
            ims.append([
                ww1[0], ww1[1], ww2[0], ww2[1],
                integrals[1][ww1[2]][ww2[2]].imag
            ])
    return ints, res, ims
Beispiel #3
0
def get_eigenbasis(mlow,mup,integrals,minindex,maxindex):
	dim = maxindex-minindex+1 # +1 since the maxindex das to be taken as well
	integral_data = getIntegralMatrixAverage(mlow,mup,integrals,False,False)
	matrix = []
	for i in range(dim):
		matrix.append([0.+0.j]*dim)
	for i in range(minindex,maxindex+1):
		for j in range(minindex,maxindex+1):
			matrix[i-minindex][j-minindex] = integral_data[1][i-1][j-1] # Indices are counted from 1(fortran style), matrix starts at [0][0](Python style)
	small_indices = []
	smalldim = 0
	for i in range(dim):
		if not matrix[i][i] == 0.j:
			small_indices.append(i)
			smalldim+=1
	bigeigenbasis  = []
	for i in range(dim):
		line = [0.+0.j]*dim
		bigeigenbasis.append(line)
	EV_STUFF = False
	if EV_STUFF:
		smallmatrix=[] # Only contains nonzero waves...
		for i in range(smalldim):
			smallmatrixline=[]
			ii = small_indices[i]
			for j in range(smalldim):	
				jj = small_indices[j]
				smallmatrixline.append(matrix[ii][jj])
			smallmatrix.append(smallmatrixline)
		smalleigenbasis = get_small_eigenbasis(smallmatrix)
	
		for i in range(smalldim):
			ii = small_indices[i]
			for j in range(smalldim):
				jj = small_indices[j]
				bigeigenbasis[ii][jj] = smalleigenbasis[i][j]
	else:
		for small_index in small_indices:
			bigeigenbases[small_index][small_index  ] = 1.+0.j
			try:
				
				bigeigenbases[small_index][small_index+1] = -.5+0.j
			except IndexError:
				pass
			try:
				bigeigenbases[small_index][small_index-1] = -.5+0.j
			except IndexError:
				pass
	return bigeigenbasis
Beispiel #4
0
def getMassDependentIntegrals(wave1, wave2, mMin, mMax, intDir, binWidth = 0.01):
	"""
	Retruns the mass-dependence of the off diagonal integrals for wave1 and wave2
	"""
	nBins = int((mMax-mMin)/binWidth)
	ret=[]
	res=[]
	ims=[]
	for i in range(nBins):
		integrals = getIntegralMatrixAverage(mMin+i*binWidth,mMin+(i+1)*binWidth,intDir, True, False)
		n1 = integrals[0][wave1]
		n2 = integrals[0][wave2]
		integral = integrals[1][n1][n2]
		ret.append([mMin+(i+.5)*binWidth,abs(integral)])
		res.append([mMin+(i+.5)*binWidth,integral.real])
		ims.append([mMin+(i+.5)*binWidth,integral.imag])
	return ret,res,ims
Beispiel #5
0
def getMassDependentIntegrals(wave1, wave2, mMin, mMax, intDir, binWidth=0.01):
    """
	Retruns the mass-dependence of the off diagonal integrals for wave1 and wave2
	"""
    nBins = int((mMax - mMin) / binWidth)
    ret = []
    res = []
    ims = []
    for i in range(nBins):
        integrals = getIntegralMatrixAverage(mMin + i * binWidth,
                                             mMin + (i + 1) * binWidth, intDir,
                                             True, False)
        n1 = integrals[0][wave1]
        n2 = integrals[0][wave2]
        integral = integrals[1][n1][n2]
        ret.append([mMin + (i + .5) * binWidth, abs(integral)])
        res.append([mMin + (i + .5) * binWidth, integral.real])
        ims.append([mMin + (i + .5) * binWidth, integral.imag])
    return ret, res, ims
Beispiel #6
0
def get_bad_vector(base1, base2, mMin, mMax, intDir):
    """
	Gets the 'bad' vector for the two de-siobarred waves
	"""
    integrals = getIntegralMatrixAverage(mMin, mMax, intDir, False, False)
    nwaves1 = []
    nwaves2 = []
    binning1 = []
    binning2 = []
    for key in integrals[0].iterkeys():
        if key.startswith(base1):
            nwaves1.append(integrals[0][key])
            mup = float(key.split('_')[2][:4]) / 1000
            mlo = float(key.split('_')[1]) / 1000
            if not mup in binning1:
                binning1.append(mup)
            if not mlo in binning1:
                binning1.append(mlo)
        if key.startswith(base2):
            nwaves2.append(integrals[0][key])
            mup = float(key.split('_')[2][:4]) / 1000
            mlo = float(key.split('_')[1]) / 1000
            if not mup in binning2:
                binning2.append(mup)
            if not mlo in binning2:
                binning2.append(mlo)
    binning1.sort()
    binning2.sort()
    nwaves1.sort()
    nwaves2.sort()
    excl_bin = 0
    dim1 = len(nwaves1)
    dim2 = len(nwaves2) - excl_bin
    DIM = dim1 + dim2
    aa = np.zeros((DIM, DIM), dtype=np.complex128)
    for i in range(dim1):
        for j in range(dim1):
            aa[i, j] = integrals[1][nwaves1[i]][nwaves1[j]]
    for i in range(dim1):
        for j in range(dim2):
            aa[i, j + dim1] = integrals[1][nwaves1[i]][nwaves2[excl_bin + j]]
            aa[j + dim1, i] = integrals[1][nwaves2[excl_bin + j]][nwaves1[i]]
    for i in range(dim2):
        for j in range(dim2):
            aa[i + dim1,
               j + dim1] = integrals[1][nwaves2[excl_bin +
                                                i]][nwaves2[excl_bin + j]]
    for i in range(DIM):
        for j in range(DIM):
            if i != j and not (aa[i, i] * aa[j, j]) == 0. + 0.j:
                aa[i, j] /= (aa[i, i] * aa[j, j])**.5
            elif i != j:
                aa[i, j] = 0. + 0.j
    for i in range(DIM):
        if aa[i, i] != 0. + 0.j:
            aa[i, i] = 1. + 0.j
    val, vec = la.eig(aa)
    vec = np.transpose(vec)
    mini = 0
    maxi = 0
    minev = abs(val[0])
    maxev = abs(val[0])
    valls = [abs(val[i]) for i in range(DIM)]
    valls.sort()
    outfile = open("GRAM_EV.txt", 'w')
    for i in range(DIM):
        outfile.write(str(i) + ' ' + str(valls[i]) + '\n')
    outfile.close()
    for i in range(DIM):
        #			print ":::",i,abs(val[i]),minev,maxev
        if abs(val[i]) < minev and not abs(val[i]) == 0.:
            mini = i
            minev = abs(val[i])
        if abs(val[i]) > maxev:
            maxi = i
            maxev = abs(val[i])

    minval = val[mini].real

    #	print '------------------------------------------'
    #	print minev,maxev,mini,maxi
    #	print '------------------------------------------'
    #	print vec[mini]
    #	print
    #	print vec[maxi]
    #	with open("GRAM_VEC",'w') as outfile:
    #		for i in range(DIM):
    #			outfile.write(str(i)+'  '+str(vec[mini][i].real)+'  '+str(vec[maxi][i].real)+'\n')
    minvec = vector([vec[mini][i].real for i in range(DIM)])
    maxvec = vector([vec[maxi][i].real for i in range(DIM)])
    #	return minvec, maxvec
    with open('minvec', 'w') as minnn:
        for val in minvec:
            minnn.write(str(val) + '  ')
    with open('diag_f0', 'w') as diagout:
        for nnn in nwaves1:
            diagout.write(str(integrals[1][nnn][nnn].real) + '  ')

    with open('diag_rho', 'w') as diagout:
        for nnn in nwaves2:
            diagout.write(str(integrals[1][nnn][nnn].real) + '  ')

    return minval
Beispiel #7
0
def compare_diag_offdiag(wave1, wave2, base1, base2, mMin, mMax, intDir):
    """
	Compares de-isobarred and constant isobar integrals
	"""
    integrals = getIntegralMatrixAverage(mMin, mMax, intDir, False, False)
    nwaves1 = []
    nwaves2 = []
    binning1 = []
    binning2 = []
    for key in integrals[0].iterkeys():
        print key, wave1, wave2
        if key.startswith(base1):
            nwaves1.append(integrals[0][key])
            mup = float(key.split('_')[2][:4]) / 1000
            mlo = float(key.split('_')[1]) / 1000
            if not mup in binning1:
                binning1.append(mup)
            if not mlo in binning1:
                binning1.append(mlo)
#			print key
        if key.startswith(wave1):
            nwave1 = integrals[0][key]
            print key, '<---- nwave1'
        if key.startswith(base2):
            nwaves2.append(integrals[0][key])
            mup = float(key.split('_')[2][:4]) / 1000
            mlo = float(key.split('_')[1]) / 1000
            if not mup in binning2:
                binning2.append(mup)
            if not mlo in binning2:
                binning2.append(mlo)

#			print key
        if key.startswith(wave2):
            nwave2 = integrals[0][key]
            print key, '<---- nwave2'
    binning1.sort()
    binning2.sort()
    nwaves1.sort()
    nwaves2.sort()
    diag1 = integrals[1][nwave1][nwave1]
    diag2 = integrals[1][nwave2][nwave2]
    offd = integrals[1][nwave1][nwave2]
    diag1_c = 0.
    for nn in nwaves1:
        for mm in nwaves1:
            diag1_c += integrals[1][nn][mm]
    diag2_c = 0.
    for nn in nwaves2:
        for mm in nwaves2:
            diag2_c += integrals[1][nn][mm]
    offd_c = 0.
    for nn in nwaves1:
        for mm in nwaves2:
            offd_c += integrals[1][nn][mm]


#	print diag1, diag1_c
#	print diag2, diag2_c
#	print offd, offd_c
#	print offd/(diag1*diag2)**.5
#	print binning1,binning2
    binning1 = numpy.asarray(binning1, dtype=numpy.float64)
    binning2 = numpy.asarray(binning2, dtype=numpy.float64)
    hist = TH2D('2d', '2d',
                len(binning1) - 1, binning1,
                len(binning2) - 1, binning2)
    mabiwi1 = 0.
    for i in range(len(binning1) - 1):
        biwi = binning1[i + 1] - binning1[i]
        if biwi > mabiwi1:
            mabiwi1 = biwi
    mabiwi2 = 0.
    for i in range(len(binning2) - 1):
        biwi = binning2[i + 1] - binning2[i]
        if biwi > mabiwi2:
            mabiwi2 = biwi
    print mabiwi1, mabiwi2
    iinntt = 0.
    for i in range(len(nwaves1)):
        n = nwaves1[i]
        bw1 = (binning1[i + 1] - binning1[i]) / mabiwi1
        for j in range(len(nwaves2)):
            bw2 = (binning2[j + 1] - binning2[j]) / mabiwi2
            m = nwaves2[j]
            integral_value = abs(integrals[1][n][m] / (diag1 * diag2)**.5)
            hist.SetBinContent(i + 1, j + 2, integral_value / bw1 / bw2)
            iinntt += integral_value
    print 'iinntt: ', iinntt
    return hist
def getData(path,compares,WRITE = False):
	"""calculates the amplitudes with the correct coefficients for the unphysical modes"""
	intFolder = path.replace("/fit/","/integrals/").split("text_fit_")[0]
	bestLikeFile = getBestLike(path)
	rawData = readTextFile(path+'/'+bestLikeFile)
	comparedata = []
	for comparepath in compares:
		comparedata.append(readTextFile(comparepath+'/'+getBestLike(comparepath)))

	mMin = rawData[0]["m3Pi"][0]
	mMax = rawData[0]["m3Pi"][1]
	rawIntegrals = getIntegralMatrixAverage(mMin,mMax,intFolder,False,False)
	isoBases = getDeIsobarredList(rawData)
	for key in isoBases.iterkeys(): # Integral indices are usually the same as fit indices, but keep them anyway to avoid later errors
		for ppt in isoBases[key]:
			ppt.append(rawIntegrals[0][ppt[2]])
	keyList = []
	for key in isoBases.iterkeys():
		keyList.append(key)
	if len(keyList) < 2: # If only one wave is de-isobarred, no additional comparefile is needed. To avoid the exception at (*), use the original data as compares
		comparedata.append(rawData)
	if len(keyList) == 0:
		return {}
	oneRow=[]
	starts=[]
	for key in keyList:
		starts.append(len(oneRow))
		for ppt in isoBases[key]:
			oneRow.append(ppt[:])
			wave = ppt[2]
			for com in comparedata:
				try:
					aa = com[0][wave]
					oneRow[-1].append(aa[0])
					oneRow[-1].append(aa[1])
					break
				except KeyError:
					pass
			if not len(oneRow[-1]) == 9:
				raise IndexError # No compare-vector found. (*)
#			print oneRow[-1]
	goodMatrix=[]

	dim = len(oneRow)
	rowResult=[complex(ppt[3],ppt[4])for ppt in oneRow]	
	comResult=[complex(ppt[7],ppt[8])for ppt in oneRow]
	for i in range(len(oneRow)):
		goodMatrix.append([0.+0.j]*len(oneRow))
	normalizers = []
	global_int_norm = 0.
	GLOBAL_NORM = False
	for i in range(len(oneRow)):
		try:
			normalizers.append(1./rawIntegrals[1][oneRow[i][6]][oneRow[i][6]])
		except ZeroDivisionError:
			normalizers.append(0.+0.j)
		for j in range(len(oneRow)):
			try:
				if not GLOBAL_NORM:
					goodMatrix[i][j] = rawIntegrals[1][oneRow[i][6]][oneRow[j][6]]/(rawIntegrals[1][oneRow[i][6]][oneRow[i][6]]*rawIntegrals[1][oneRow[j][6]][oneRow[j][6]])**.5
				else:
					goodMatrix[i][j] = rawIntegrals[1][oneRow[i][6]][oneRow[j][6]]
			except ZeroDivisionError:
				goodMatrix[i][j] = 0.+0.j

	if GLOBAL_NORM:
		global_int_norm = 0.
		for i in range(len(goodMatrix)):
			global_int_norm+=goodMatrix[i][i]
		for i in range(len(goodMatrix)):
			for j in range(len(goodMatrix)):
				goodMatrix[i][j]/=global_int_norm
	
	eigen = eigenBasis(goodMatrix)
	coeff = decompose(rowResult,eigen)
	normTo = 0 # number of de-isobarred wave to normalize 
	iiii = []
	vecs = []
	DONE = True
	valolo=[]
	for i in range(dim):
#		print coeff[i],
		valolo.append(eigen[i][0].real)
		if eigen[i][0] < 1E-2 and not eigen[i][0] == 0.:
			print eigen[i][0]
#			print "<<<"
			ccc0 = eigen[i][1][starts[normTo]]
			rrr0 = rowResult[starts[normTo]]
#			print rrr0/ccc0,"<<<<<<<<<<<<<<<<<<<<<<<<<<<"
			if not DONE:
				print i,'>>>>(',(rrr0/ccc0).real,',',(rrr0/ccc0).imag,')<<<<',i
				coeff[i] -= rrr0/ccc0
				DONE = True
			vecs.append(eigen[i][1][:])
			iiii.append(i)
		else:
			pass
#			print "   "
#	with open("./de_isobarred_corrected/vec",'w') as outoutout:
#		for i in range(dim):
#			outoutout.write(str(i))
#			for j in range(len(vecs)):
#				outoutout.write(' '+str(vecs[j][i].real))
#			outoutout.write('\n')
	if not len(vecs)==0:
		coeffs = get_physical_coefficients_intens(rowResult, comResult, vecs, starts)
		print coeffs
	#	coaff = [complex(0.,0.)]*len(coeff)
	#	coeff[2] -= complex(0.532412199699,0.33230841749)
	#	coeff[2] -= complex(0.596338098319,0.372208168472)
		for i in range(len(iiii)):
			coeff[iiii[i]]-=coeffs[i]


	reconstruct = [0.+0.j]*dim
	for i in range(dim):
		for j in range(dim):
			reconstruct[i]+=coeff[j]*eigen[j][1][i]

	if WRITE:
		with open("./de_isobarred_corrected/no_modes",'w') as outoutout:
			for i in range(dim):
				outoutout.write(str(i)+' '+str((abs(rowResult[i])**2*normalizers[i]).real)+' '+str((abs(reconstruct[i])**2*normalizers[i]).real)+' '+str(abs(comResult[i])**2*normalizers[i].real) +'\n')
#	valolo.sort()
#	with open("de_isobarred_corrected/val",'w') as outoutout:
#		for i in range(len(valolo)):
#			outoutout.write(str(i)+' '+str(valolo[i])+'\n')
#	print starts
	#starts, comResult, keyList
	mapResult = {}
	actNkey = -1
	for i in range(dim):
		comResult[i]*=normalizers[i].real**.5

	for i in range(len(comResult)):
		if i in starts:
			actNkey+=1
			actKey = keyList[actNkey]
			mapResult[actKey] = []
		mapResult[actKey].append(comResult[i])
#	print mapResult	

	return mapResult
Beispiel #9
0
def compare_diag_offdiag(wave1,wave2,base1,base2,mMin,mMax,intDir):
	"""
	Compares de-isobarred and constant isobar integrals
	"""
	integrals = getIntegralMatrixAverage(mMin,mMax,intDir,False, False)
	nwaves1 = []
	nwaves2 = []
	binning1=[]
	binning2=[]
	for key in integrals[0].iterkeys():
		print key, wave1, wave2
		if key.startswith(base1):
			nwaves1.append(integrals[0][key])
			mup = float(key.split('_')[2][:4])/1000
			mlo = float(key.split('_')[1])/1000
			if not mup in binning1:
				binning1.append(mup)
			if not mlo in binning1:
				binning1.append(mlo)
#			print key
		if key.startswith(wave1):
			nwave1 = integrals[0][key]
			print key,'<---- nwave1'
		if key.startswith(base2):
			nwaves2.append(integrals[0][key])
			mup = float(key.split('_')[2][:4])/1000
			mlo = float(key.split('_')[1])/1000
			if not mup in binning2:
				binning2.append(mup)
			if not mlo in binning2:
				binning2.append(mlo)

#			print key
		if key.startswith(wave2):
			nwave2 = integrals[0][key]
			print key,'<---- nwave2'
	binning1.sort()
	binning2.sort()
	nwaves1.sort()
	nwaves2.sort()
	diag1 = integrals[1][nwave1][nwave1]
	diag2 = integrals[1][nwave2][nwave2]
	offd  = integrals[1][nwave1][nwave2]
	diag1_c = 0.
	for nn in nwaves1:
		for mm in nwaves1:
			diag1_c+=integrals[1][nn][mm]
	diag2_c = 0.
	for nn in nwaves2:
		for mm in nwaves2:
			diag2_c+=integrals[1][nn][mm]
	offd_c = 0.
	for nn in nwaves1:
		for mm in nwaves2:
			offd_c+=integrals[1][nn][mm]
#	print diag1, diag1_c
#	print diag2, diag2_c
#	print offd, offd_c
#	print offd/(diag1*diag2)**.5
#	print binning1,binning2
	binning1 = numpy.asarray(binning1,dtype=numpy.float64)
	binning2 = numpy.asarray(binning2,dtype=numpy.float64)
	hist= TH2D('2d','2d',len(binning1)-1,binning1, len(binning2)-1, binning2)
	mabiwi1 = 0.
	for i in range(len(binning1)-1):
		biwi = binning1[i+1]-binning1[i]
		if biwi > mabiwi1:
			mabiwi1 = biwi
	mabiwi2 = 0.
	for i in range(len(binning2)-1):
		biwi = binning2[i+1]-binning2[i]
		if biwi > mabiwi2:
			mabiwi2=biwi
	print mabiwi1,mabiwi2
	iinntt=0.
	for i in range(len(nwaves1)):
		n = nwaves1[i]
		bw1 = (binning1[i+1]-binning1[i])/mabiwi1
		for j in range(len(nwaves2)):
			bw2 = (binning2[j+1]-binning2[j])/mabiwi2
			m = nwaves2[j]
			integral_value = abs(integrals[1][n][m]/(diag1*diag2)**.5)
			hist.SetBinContent(i+1,j+2,integral_value/bw1/bw2)
			iinntt += integral_value
	print 'iinntt: ',iinntt
	return hist
Beispiel #10
0
def get_bad_vector(base1,base2,mMin,mMax,intDir):
	"""
	Gets the 'bad' vector for the two de-siobarred waves
	"""
	integrals = getIntegralMatrixAverage(mMin,mMax,intDir,False, False)
	nwaves1 = []
	nwaves2 = []
	binning1=[]
	binning2=[]
	for key in integrals[0].iterkeys():
		if key.startswith(base1):
			nwaves1.append(integrals[0][key])
			mup = float(key.split('_')[2][:4])/1000
			mlo = float(key.split('_')[1])/1000
			if not mup in binning1:
				binning1.append(mup)
			if not mlo in binning1:
				binning1.append(mlo)
		if key.startswith(base2):
			nwaves2.append(integrals[0][key])
			mup = float(key.split('_')[2][:4])/1000
			mlo = float(key.split('_')[1])/1000
			if not mup in binning2:
				binning2.append(mup)
			if not mlo in binning2:
				binning2.append(mlo)
	binning1.sort()
	binning2.sort()
	nwaves1.sort()
	nwaves2.sort()
	excl_bin=0
	dim1 = len(nwaves1)
	dim2 = len(nwaves2)-excl_bin
	DIM = dim1 + dim2
	aa = np.zeros((DIM,DIM),dtype = np.complex128)
	for i in range(dim1):
		for j in range(dim1):
			aa[i,j] = integrals[1][nwaves1[i]][nwaves1[j]]
	for i in range(dim1):
		for j in range(dim2):
			aa[i,j+dim1] = integrals[1][nwaves1[i]][nwaves2[excl_bin+j]]
			aa[j+dim1,i] = integrals[1][nwaves2[excl_bin+j]][nwaves1[i]]
	for i in range(dim2):
		for j in range(dim2):
			aa[i+dim1,j+dim1] = integrals[1][nwaves2[excl_bin+i]][nwaves2[excl_bin+j]]
	for i in range(DIM):
		for j in range(DIM):
			if i!=j and not (aa[i,i]*aa[j,j]) == 0.+0.j:
				aa[i,j]/=(aa[i,i]*aa[j,j])**.5
			elif i!= j:
				aa[i,j] = 0.+0.j
	for i in range(DIM):
		if aa[i,i] != 0.+0.j:
			aa[i,i]=1.+0.j
	val,vec = la.eig(aa)
	vec = np.transpose(vec)
	mini = 0
	maxi = 0
	minev = abs(val[0]) 	
	maxev = abs(val[0]) 	
	valls = [abs(val[i]) for i in range(DIM)]
	valls.sort()
	outfile = open("GRAM_EV.txt",'w')
	for i in range(DIM):
		outfile.write(str(i)+' '+str(valls[i])+'\n')
	outfile.close()
	for i in range(DIM):
#			print ":::",i,abs(val[i]),minev,maxev
		if abs(val[i]) < minev and not abs(val[i]) == 0.:
			mini = i
			minev = abs(val[i])
		if abs(val[i]) > maxev:
			maxi = i
			maxev = abs(val[i])

	minval = val[mini].real

#	print '------------------------------------------'
#	print minev,maxev,mini,maxi
#	print '------------------------------------------'
#	print vec[mini]
#	print 
#	print vec[maxi]
#	with open("GRAM_VEC",'w') as outfile:
#		for i in range(DIM):
#			outfile.write(str(i)+'  '+str(vec[mini][i].real)+'  '+str(vec[maxi][i].real)+'\n')
	minvec = vector([vec[mini][i].real for i in range(DIM)])
	maxvec = vector([vec[maxi][i].real for i in range(DIM)])
#	return minvec, maxvec
	with open('minvec','w') as minnn:
		for val in minvec:
			minnn.write(str(val)+'  ')
	with open('diag_f0','w') as diagout:
		for nnn in nwaves1:
			diagout.write(str(integrals[1][nnn][nnn].real)+'  ')

	with open('diag_rho','w') as diagout:
		for nnn in nwaves2:
			diagout.write(str(integrals[1][nnn][nnn].real)+'  ')

	return minval
Beispiel #11
0
def getData(path, compares, WRITE=False):
    """calculates the amplitudes with the correct coefficients for the unphysical modes"""
    intFolder = path.replace("/fit/", "/integrals/").split("text_fit_")[0]
    bestLikeFile = getBestLike(path)
    rawData = readTextFile(path + '/' + bestLikeFile)
    comparedata = []
    for comparepath in compares:
        comparedata.append(
            readTextFile(comparepath + '/' + getBestLike(comparepath)))

    mMin = rawData[0]["m3Pi"][0]
    mMax = rawData[0]["m3Pi"][1]
    rawIntegrals = getIntegralMatrixAverage(mMin, mMax, intFolder, False,
                                            False)
    isoBases = getDeIsobarredList(rawData)
    for key in isoBases.iterkeys(
    ):  # Integral indices are usually the same as fit indices, but keep them anyway to avoid later errors
        for ppt in isoBases[key]:
            ppt.append(rawIntegrals[0][ppt[2]])
    keyList = []
    for key in isoBases.iterkeys():
        keyList.append(key)
    if len(
            keyList
    ) < 2:  # If only one wave is de-isobarred, no additional comparefile is needed. To avoid the exception at (*), use the original data as compares
        comparedata.append(rawData)
    if len(keyList) == 0:
        return {}
    oneRow = []
    starts = []
    for key in keyList:
        starts.append(len(oneRow))
        for ppt in isoBases[key]:
            oneRow.append(ppt[:])
            wave = ppt[2]
            for com in comparedata:
                try:
                    aa = com[0][wave]
                    oneRow[-1].append(aa[0])
                    oneRow[-1].append(aa[1])
                    break
                except KeyError:
                    pass
            if not len(oneRow[-1]) == 9:
                raise IndexError  # No compare-vector found. (*)
#			print oneRow[-1]
    goodMatrix = []

    dim = len(oneRow)
    rowResult = [complex(ppt[3], ppt[4]) for ppt in oneRow]
    comResult = [complex(ppt[7], ppt[8]) for ppt in oneRow]
    for i in range(len(oneRow)):
        goodMatrix.append([0. + 0.j] * len(oneRow))
    normalizers = []
    global_int_norm = 0.
    GLOBAL_NORM = False
    for i in range(len(oneRow)):
        try:
            normalizers.append(1. /
                               rawIntegrals[1][oneRow[i][6]][oneRow[i][6]])
        except ZeroDivisionError:
            normalizers.append(0. + 0.j)
        for j in range(len(oneRow)):
            try:
                if not GLOBAL_NORM:
                    goodMatrix[i][j] = rawIntegrals[1][oneRow[i][6]][oneRow[j][
                        6]] / (rawIntegrals[1][oneRow[i][6]][oneRow[i][6]] *
                               rawIntegrals[1][oneRow[j][6]][oneRow[j][6]])**.5
                else:
                    goodMatrix[i][j] = rawIntegrals[1][oneRow[i][6]][oneRow[j]
                                                                     [6]]
            except ZeroDivisionError:
                goodMatrix[i][j] = 0. + 0.j

    if GLOBAL_NORM:
        global_int_norm = 0.
        for i in range(len(goodMatrix)):
            global_int_norm += goodMatrix[i][i]
        for i in range(len(goodMatrix)):
            for j in range(len(goodMatrix)):
                goodMatrix[i][j] /= global_int_norm

    eigen = eigenBasis(goodMatrix)
    coeff = decompose(rowResult, eigen)
    normTo = 0  # number of de-isobarred wave to normalize
    iiii = []
    vecs = []
    DONE = True
    valolo = []
    for i in range(dim):
        #		print coeff[i],
        valolo.append(eigen[i][0].real)
        if eigen[i][0] < 1E-2 and not eigen[i][0] == 0.:
            print eigen[i][0]
            #			print "<<<"
            ccc0 = eigen[i][1][starts[normTo]]
            rrr0 = rowResult[starts[normTo]]
            #			print rrr0/ccc0,"<<<<<<<<<<<<<<<<<<<<<<<<<<<"
            if not DONE:
                print i, '>>>>(', (rrr0 /
                                   ccc0).real, ',', (rrr0 /
                                                     ccc0).imag, ')<<<<', i
                coeff[i] -= rrr0 / ccc0
                DONE = True
            vecs.append(eigen[i][1][:])
            iiii.append(i)
        else:
            pass
#			print "   "
#	with open("./de_isobarred_corrected/vec",'w') as outoutout:
#		for i in range(dim):
#			outoutout.write(str(i))
#			for j in range(len(vecs)):
#				outoutout.write(' '+str(vecs[j][i].real))
#			outoutout.write('\n')
    if not len(vecs) == 0:
        coeffs = get_physical_coefficients_intens(rowResult, comResult, vecs,
                                                  starts)
        print coeffs
        #	coaff = [complex(0.,0.)]*len(coeff)
        #	coeff[2] -= complex(0.532412199699,0.33230841749)
        #	coeff[2] -= complex(0.596338098319,0.372208168472)
        for i in range(len(iiii)):
            coeff[iiii[i]] -= coeffs[i]

    reconstruct = [0. + 0.j] * dim
    for i in range(dim):
        for j in range(dim):
            reconstruct[i] += coeff[j] * eigen[j][1][i]

    if WRITE:
        with open("./de_isobarred_corrected/no_modes", 'w') as outoutout:
            for i in range(dim):
                outoutout.write(
                    str(i) + ' ' +
                    str((abs(rowResult[i])**2 * normalizers[i]).real) + ' ' +
                    str((abs(reconstruct[i])**2 * normalizers[i]).real) + ' ' +
                    str(abs(comResult[i])**2 * normalizers[i].real) + '\n')
#	valolo.sort()
#	with open("de_isobarred_corrected/val",'w') as outoutout:
#		for i in range(len(valolo)):
#			outoutout.write(str(i)+' '+str(valolo[i])+'\n')
#	print starts
#starts, comResult, keyList
    mapResult = {}
    actNkey = -1
    for i in range(dim):
        comResult[i] *= normalizers[i].real**.5

    for i in range(len(comResult)):
        if i in starts:
            actNkey += 1
            actKey = keyList[actNkey]
            mapResult[actKey] = []
        mapResult[actKey].append(comResult[i])


#	print mapResult

    return mapResult