def fit(data,initialGuess,peakList,verbose=1):

    print 
    print 'Performing the image calibration'

    # create a nice Numeric data strucure to store all of the peak stuff in.
    # This lets us read our data easily once we get into C
    length = len(peakList)
    xValues = Numeric.zeros( (length), Numeric.Float64 )
    yValues = Numeric.zeros( (length), Numeric.Float64 )
    qReal = Numeric.zeros( (length), Numeric.Float64 )
    intensity = Numeric.zeros( (length), Numeric.Float64 )

    for peakIndex in range(len(peakList)):
        xPeak,yPeak,Qreal,Qfit,chi,width = peakList[peakIndex]
        xValues[peakIndex] =  xPeak
        yValues[peakIndex] = yPeak
        qReal[peakIndex] = Qreal
        intensity[peakIndex] = data[int(xPeak)][int(yPeak)]

    # make C do the hard work :)
    centerX,centerY,distance,energy,alpha,beta,rotation,covariance = FitWrap.fitCalibrationParameters(
            xValues,yValues,qReal,intensity,
            initialGuess.getCenterX()['val'],
            initialGuess.getCenterX()['fixed'],
            initialGuess.getCenterY()['val'],
            initialGuess.getCenterY()['fixed'],
            initialGuess.getDistance()['val'],
            initialGuess.getDistance()['fixed'],
            initialGuess.getEnergy()['val'],
            initialGuess.getEnergy()['fixed'],
            initialGuess.getAlpha()['val'],
            initialGuess.getAlpha()['fixed'],
            initialGuess.getBeta()['val'],
            initialGuess.getBeta()['fixed'],
            initialGuess.getRotation()['val'],
            initialGuess.getRotation()['fixed'],
            initialGuess.getPixelLength()['val'],
            initialGuess.getPixelHeight()['val'])

    print 'Covariance Matrix'
    print Numeric.array2string(covariance,precision=2)
    print 'Root of the diagonal of the covariance matrix (I think these are uncertanties)'
    print 'xc: ',sqrt(covariance[0][0])
    print 'yc: ',sqrt(covariance[1][1])
    print 'd: ',sqrt(covariance[2][2])
    print 'E: ',sqrt(covariance[3][3])
    print 'alpha: ',sqrt(covariance[4][4])
    print 'beta: ',sqrt(covariance[5][5])
    print 'rotation: ',sqrt(covariance[6][6])


    # add the fit data to a new calibration file
    ret = CalibrationData.CalibrationData() 
    ret.setCenterX(centerX, fixed = initialGuess.getCenterX()['fixed'] )
    ret.setCenterY(centerY, fixed = initialGuess.getCenterY()['fixed'] )
    ret.setDistance(distance, fixed = initialGuess.getDistance()['fixed'] )
    ret.setEnergy(energy, fixed = initialGuess.getEnergy()['fixed'] )
    ret.setAlpha(alpha, fixed = initialGuess.getAlpha()['fixed'] )
    ret.setBeta(beta, fixed = initialGuess.getBeta()['fixed'] )
    ret.setRotation(rotation, fixed = initialGuess.getRotation()['fixed'] )
    # pixel length & height don't change
    ret.setPixelLength(initialGuess.getPixelLength()['val'])
    ret.setPixelHeight(initialGuess.getPixelHeight()['val'])

    return ret,peakList
Example #2
0
def fit(data, initialGuess, peakList, verbose=1):

    print
    print 'Performing the image calibration'

    # create a nice Numeric data strucure to store all of the peak stuff in.
    # This lets us read our data easily once we get into C
    length = len(peakList)
    xValues = Numeric.zeros((length), Numeric.Float64)
    yValues = Numeric.zeros((length), Numeric.Float64)
    qReal = Numeric.zeros((length), Numeric.Float64)
    intensity = Numeric.zeros((length), Numeric.Float64)

    for peakIndex in range(len(peakList)):
        xPeak, yPeak, Qreal, Qfit, chi, width = peakList[peakIndex]
        xValues[peakIndex] = xPeak
        yValues[peakIndex] = yPeak
        qReal[peakIndex] = Qreal
        intensity[peakIndex] = data[int(xPeak)][int(yPeak)]

    # make C do the hard work :)
    centerX, centerY, distance, energy, alpha, beta, rotation, covariance = FitWrap.fitCalibrationParameters(
        xValues, yValues, qReal, intensity,
        initialGuess.getCenterX()['val'],
        initialGuess.getCenterX()['fixed'],
        initialGuess.getCenterY()['val'],
        initialGuess.getCenterY()['fixed'],
        initialGuess.getDistance()['val'],
        initialGuess.getDistance()['fixed'],
        initialGuess.getEnergy()['val'],
        initialGuess.getEnergy()['fixed'],
        initialGuess.getAlpha()['val'],
        initialGuess.getAlpha()['fixed'],
        initialGuess.getBeta()['val'],
        initialGuess.getBeta()['fixed'],
        initialGuess.getRotation()['val'],
        initialGuess.getRotation()['fixed'],
        initialGuess.getPixelLength()['val'],
        initialGuess.getPixelHeight()['val'])

    print 'Covariance Matrix'
    print Numeric.array2string(covariance, precision=2)
    print 'Root of the diagonal of the covariance matrix (I think these are uncertanties)'
    print 'xc: ', sqrt(covariance[0][0])
    print 'yc: ', sqrt(covariance[1][1])
    print 'd: ', sqrt(covariance[2][2])
    print 'E: ', sqrt(covariance[3][3])
    print 'alpha: ', sqrt(covariance[4][4])
    print 'beta: ', sqrt(covariance[5][5])
    print 'rotation: ', sqrt(covariance[6][6])

    # add the fit data to a new calibration file
    ret = CalibrationData.CalibrationData()
    ret.setCenterX(centerX, fixed=initialGuess.getCenterX()['fixed'])
    ret.setCenterY(centerY, fixed=initialGuess.getCenterY()['fixed'])
    ret.setDistance(distance, fixed=initialGuess.getDistance()['fixed'])
    ret.setEnergy(energy, fixed=initialGuess.getEnergy()['fixed'])
    ret.setAlpha(alpha, fixed=initialGuess.getAlpha()['fixed'])
    ret.setBeta(beta, fixed=initialGuess.getBeta()['fixed'])
    ret.setRotation(rotation, fixed=initialGuess.getRotation()['fixed'])
    # pixel length & height don't change
    ret.setPixelLength(initialGuess.getPixelLength()['val'])
    ret.setPixelHeight(initialGuess.getPixelHeight()['val'])

    return ret, peakList
    def fit(self,initialGuess,qData,maskedPixelInfo,
            numberOfChi=None,stddev=None,peakList=None):
        if (numberOfChi==None and peakList==None):
            raise Exception("Cannot fit the calibration data \
unless either the number of chi values or a peak list are given.")

        # make peak list
        print 
        print "Finding diffraction peaks..."
        if peakList == None:
            peakList = Fit.getPeakList(self.theDiffractionData.data,qData,
                    initialGuess,numberOfChi,stddev)

        print 
        print "Performing image calibration..."
        # do fitting

        bestGuess,peakList,covariance,initialResidual,finalResidual, \
                reasonForQuitting = Fit.fit(self.theDiffractionData.data,
                initialGuess,peakList,maskedPixelInfo)

        print " - Before fitting, the calculated residual \
per peak is ",initialResidual
        print " - After fitting, the calculated residual \
per peak is ",finalResidual
        print " - Reason for quitting the fit: %d, " % reasonForQuitting,
        if reasonForQuitting == 2:
            print "stopped by small gradient J^T e\n"
        elif reasonForQuitting == 2:
            print "stopped by small Dp\n"
        elif reasonForQuitting == 3:
            print "stopped by itmax\n"
        elif reasonForQuitting == 4:
            print "singular matrix. Restart from current p with increased \\mu\n"
        elif reasonForQuitting == 5:
            print "no further error reduction is possible. Restart with increased mu\n"
        elif reasonForQuitting == 6:
            print "stopped by small ||e||_2\n"
        else:
            print "Reason for quitting unknown\n"
        
        print "Covariance Matrix:"
        print Numeric.array2string(covariance,max_line_width=1000,precision=3)
        print
        print "Root of the diagonal of the covariance matrix (I think these are uncertainties)"
        print " - xc    %17.10f" % sqrt(covariance[0][0])
        print " - yc    %17.10f" % sqrt(covariance[1][1])
        print " - d     %17.10f" % sqrt(covariance[2][2])
        print " - E     %17.10f" % sqrt(covariance[3][3])
        print " - alpha %17.10f" % sqrt(covariance[4][4])
        print " - beta  %17.10f" % sqrt(covariance[5][5])
        print " - R     %17.10f" % sqrt(covariance[6][6])

        # create the string to save to a file (if requested)
        self.lastFitString = ""
        self.lastFitString += "Fit done of: %s\n" % self.theDiffractionData.filename
        self.lastFitString += "\n"
        self.lastFitString += "Initial Guess at calibration parameters:\n"
        self.lastFitString += str(initialGuess)
        self.lastFitString += "\n"
        self.lastFitString += "Before fitting, the calculated residual \
per peak is "+str(initialResidual)+"\n"
        self.lastFitString += "\n"
        self.lastFitString += "Refined calibration parameters:\n"
        self.lastFitString += str(bestGuess)
        self.lastFitString += "\n"
        self.lastFitString += "After fitting, the calculated residual \
per peak is "+str(finalResidual)+"\n"
        self.lastFitString += "\n"

        self.lastFitString += "Reason for quitting the fit: %d-" % reasonForQuitting
        if reasonForQuitting == 2:
            self.lastFitString += "stopped by small gradient J^T e\n"
        elif reasonForQuitting == 2:
            self.lastFitString += "stopped by small Dp\n"
        elif reasonForQuitting == 3:
            self.lastFitString += "stopped by itmax\n"
        elif reasonForQuitting == 4:
            self.lastFitString += "singular matrix. Restart from current p with increased \\mu\n"
        elif reasonForQuitting == 5:
            self.lastFitString += "no further error reduction is possible. Restart with increased mu\n"
        elif reasonForQuitting == 6:
            self.lastFitString += "stopped by small ||e||_2\n"
        else:
            self.lastFitString += "Reason for quitting unknown\n"
        
        self.lastFitString += "\n"

        self.lastFitString += "Covariance Matrix:\n"
        self.lastFitString += "%s\n" % Numeric.array2string(covariance,
                max_line_width=1000,precision=10)
        self.lastFitString += "\n"
        self.lastFitString += "Root of the diagonal of the \
covariance matrix (I think these are uncertainties)\n"
        self.lastFitString += "xc    %17.10f\n" % sqrt(covariance[0][0])
        self.lastFitString += "yc    %17.10f\n" % sqrt(covariance[1][1])
        self.lastFitString += "d     %17.10f\n" % sqrt(covariance[2][2])
        self.lastFitString += "E     %17.10f\n" % sqrt(covariance[3][3])
        self.lastFitString += "alpha %17.10f\n" % sqrt(covariance[4][4])
        self.lastFitString += "beta  %17.10f\n" % sqrt(covariance[5][5])
        self.lastFitString += "R     %17.10f\n" % sqrt(covariance[6][6])

        self.lastFitString += "\n"
        self.lastFitString += "Q Data used when calibrating:\n"
        self.lastFitString += str(qData)

        return bestGuess,peakList