Changeset 1263


Ignore:
Timestamp:
Mar 26, 2014 2:15:16 PM (8 years ago)
Author:
vondreele
Message:

comment out the LEAVE_WINDOW in ValidatedTextCtrl? - leads to weird behavior when just moving mouse around.
Add SASD Model Add facility for Particle Modeling
Add Neutron CW SASD import & change default file extensions for SASD.
Begin Unified & Model fit routines - they don't do anything yet

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r1262 r1263  
    135135] = [wx.NewId() for item in range(1)]
    136136
    137 [ wxID_MODELCOPY,wxID_MODELFIT,wxID_ELEMENTADD,wxID_ELEMENTDELETE,wxID_ADDSUBSTANCE,
    138     wxID_LOADSUBSTANCE,wxID_DELETESUBSTANCE,wxID_COPYSUBSTANCE,
    139 ] = [wx.NewId() for item in range(8)]
     137[ wxID_MODELCOPY,wxID_MODELFIT,wxID_MODELADD,wxID_ELEMENTADD,wxID_ELEMENTDELETE,
     138    wxID_ADDSUBSTANCE,wxID_LOADSUBSTANCE,wxID_DELETESUBSTANCE,wxID_COPYSUBSTANCE,
     139] = [wx.NewId() for item in range(9)]
    140140
    141141[ wxID_SELECTPHASE,
     
    304304        # When the mouse is moved away or the widget loses focus,
    305305        # display the last saved value, if an expression
    306         self.Bind(wx.EVT_LEAVE_WINDOW, self._onLeaveWindow)
     306#        self.Bind(wx.EVT_LEAVE_WINDOW, self._onLeaveWindow) #leads to weird behavior
    307307        self.Bind(wx.EVT_TEXT_ENTER, self._onLoseFocus)
    308308        self.Bind(wx.EVT_KILL_FOCUS, self._onLoseFocus)
     
    26042604        self.ModelEdit = wx.Menu(title='')
    26052605        self.ModelMenu.Append(menu=self.ModelEdit, title='Models')
     2606        self.ModelEdit.Append(id=wxID_MODELADD,kind=wx.ITEM_NORMAL,text='Add',
     2607            help='Add new term to model')
    26062608        self.ModelEdit.Append(id=wxID_MODELFIT, kind=wx.ITEM_NORMAL,text='Fit',
    26072609            help='Fit model parameters to data')
  • trunk/GSASIIpwdGUI.py

    r1260 r1263  
    4343VERY_LIGHT_GREY = wx.Colour(235,235,235)
    4444WACV = wx.ALIGN_CENTER_VERTICAL
     45Pwr10 = unichr(0x0b9)+unichr(0x0b0)
     46Pwr20 = unichr(0x0b2)+unichr(0x0b0)
     47Pwrm1 = unichr(0x207b)+unichr(0x0b9)
     48Pwrm2 = unichr(0x207b)+unichr(0x0b2)
     49Pwrm4 = unichr(0x207b)+unichr(0x2074)   #really -d but looks like -4 as a superscript
    4550# trig functions in degrees
    4651sind = lambda x: math.sin(x*math.pi/180.)
     
    8893        'IPG':{'Niter':100,'Approach':0.8,'Power':-1},'Reg':{},},           
    8994        'Unified':{'Levels':[],},           
    90         'Particle':{'Levels':[],},
     95        'Particle':{'Matrix':{'Name':'vacuum','VolFrac':[0.0,False]},'Levels':[],},
    9196        'Current':'Size dist.',
    9297        }
     
    23802385       
    23812386        Indx = {}
    2382         Pwr10 = unichr(0x0b9)+unichr(0x0b0)
    2383         Pwrm2 = unichr(0x207b)+unichr(0x0b2)
    2384         Pwrm1 = unichr(0x207b)+unichr(0x0b9)
    23852387        substSizer = wx.BoxSizer(wx.VERTICAL)
    23862388        substSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Substance list: wavelength: %.5fA'%(wave)),
     
    23972399                Substance = data['Substances'][name]
    23982400                Elems = Substance['Elements']
    2399                 for El in Elems:
     2401                for El in Elems:    #do elements as pull downs for isotopes for neutrons
    24002402                    elSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' '+El+': '),
    24012403                        0,WACV)
     
    24252427                    label=' Scattering density  : %.2f *10%scm%s'%(Substance['Scatt density'],Pwr10,Pwrm2)),
    24262428                    0,WACV)               
    2427                 substSizer.Add(wx.StaticText(G2frame.dataDisplay,
     2429                substSizer.Add(wx.StaticText(G2frame.dataDisplay,       #allow neutrons here into NAnom density & NAbsorption
    24282430                    label=' Anomalous density : %.2f *10%scm%s'%(Substance['XAnom density'],Pwr10,Pwrm2)),
    24292431                    0,WACV)               
     
    24802482    if 'Power' not in data['Size']['IPG']:
    24812483        data['Size']['IPG']['Power'] = -1
     2484    if 'Matrix' not in data['Particle']:
     2485        data['Particle']['Matrix'] = {'Name':'vacuum','VolFrac':[0.0,False]}
    24822486    #end patches
    24832487   
     
    24852489        print 'copy model'
    24862490        print data
     2491       
     2492    def OnAddModel(event):
     2493        if data['Current'] == 'Particle fit':
     2494            data['Particle']['Levels'].append({'Selected':'Volume',
     2495                'Controls':{'FormFact':'Sphere','DistType':'LogNormal','Material':'vacuum','FFargs':{}},
     2496                'LogNormal':{'Volume':[0.05,False],'MinSize':[10.,False],'Mean':[100.,False],'StdDev':[10.,False]},
     2497                'Gaussian':{'Volume':[0.05,False],'Mean':[100.,False],'StdDev':[10.,False],},
     2498                'LSW':{'Volume':[0.05,False],'Position':[100.0,False],},
     2499                'Schulz-Zimm':{'Volume':[0.05,False],'Mean':[100.,False],'StdDev':[10.,False],}
     2500                })
     2501                   
     2502        elif data['Current'] == 'Unified fit':
     2503            data['Unified']['Levels'].append({'Type':'Guinier','GuinScale':[100,False],'RadGyr':[100,False],
     2504                'PorodScale':[0.01,False],'PorodPwr':[4.,False],})
     2505        wx.CallAfter(UpdateModelsGrid,G2frame,data)
    24872506       
    24882507    def OnFitModel(event):
     
    24972516            G2plt.PlotPatterns(G2frame,plotType='SASD',newPlot=True)
    24982517            G2plt.PlotSASDSizeDist(G2frame)
    2499        
     2518           
     2519        elif data['Current'] == 'Unified fit':
     2520            G2sasd.UnifiedFit(Profile,ProfDict,Limits,Substances,Sample,data)
     2521            G2plt.PlotPatterns(G2frame,plotType='SASD',newPlot=True)
     2522           
     2523        elif data['Current'] == 'Particle fit':
     2524            G2sasd.ModelFit(Profile,ProfDict,Limits,Substances,Sample,data)
     2525            G2plt.PlotPatterns(G2frame,plotType='SASD',newPlot=True)
     2526           
    25002527    def OnSelectFit(event):
    25012528        data['Current'] = fitSel.GetValue()
     
    25642591        mindiam = wx.ComboBox(G2frame.dataDisplay,value=str(data['Size']['MinDiam']),choices=minDias,
    25652592            style=wx.CB_DROPDOWN)
     2593        mindiam.Bind(wx.EVT_LEAVE_WINDOW,OnIntVal)
    25662594        mindiam.Bind(wx.EVT_TEXT_ENTER,OnIntVal)       
    25672595        mindiam.Bind(wx.EVT_KILL_FOCUS,OnIntVal)
     
    25722600        maxdiam = wx.ComboBox(G2frame.dataDisplay,value=str(data['Size']['MaxDiam']),choices=maxDias,
    25732601            style=wx.CB_DROPDOWN)
     2602        maxdiam.Bind(wx.EVT_LEAVE_WINDOW,OnIntVal)
    25742603        maxdiam.Bind(wx.EVT_TEXT_ENTER,OnIntVal)       
    25752604        maxdiam.Bind(wx.EVT_KILL_FOCUS,OnIntVal)
     
    26372666       
    26382667    def PartSizer():
    2639         for item in data['Particle']: print item,data['Particle'][item]
     2668       
     2669        ffChoices = {'Sphere':{},'Spheroid':{'Aspect ratio':[1.0,False]},
     2670            'Cylinder':{'Length':[100.,False]},'CylinderD':{'Diameter':[100.,False]},
     2671            'CylinderAR':{'Aspect ratio':[1.0,False]},'UniSphere':{},
     2672            'UniRod':{'Length':[100.,False]},'UniRodAR':{'Aspect ratio':[1.0,False]},
     2673            'UniDisk':{'Thickness':[100.,False]},
     2674            'UniTube':{'Length':[100.,False],'Thickness':[10.,False]},}
     2675
     2676        def OnValue(event):
     2677            Obj = event.GetEventObject()
     2678            item,parm,selected,sldrObj = Indx[Obj.GetId()]
     2679            try:
     2680                value = float(Obj.GetValue())
     2681                if value <= 0.:
     2682                    raise ValueError
     2683            except ValueError:
     2684                value = item[0]
     2685            item[0] = value
     2686            Obj.SetValue('%.3g'%(value))
     2687            if parm == selected:
     2688                sldrObj.SetRange(1000.*(np.log10(value)-2),1000.*(np.log10(value)+2))
     2689                sldrObj.SetValue(1000.*np.log10(value))
     2690           
     2691        def AfterChange(invalid,value,tc):
     2692            if invalid:
     2693                return
     2694            parm,selected,sldrObj = Indx[tc.GetId()]
     2695            print 'Change',parm,value           
     2696            if parm == selected:
     2697                sldrObj.SetRange(1000.*(np.log10(value)-2),1000.*(np.log10(value)+2))
     2698                sldrObj.SetValue(1000.*np.log10(value))
     2699            #want to update function & plot it here
     2700               
     2701        def OnSelect(event):
     2702            Obj = event.GetEventObject()
     2703            item,key = Indx[Obj.GetId()]
     2704            item[key] = Obj.GetValue()
     2705            if 'Refine' not in Obj.GetLabel():
     2706                if 'FormFact' in key:
     2707                    item['FFargs'] = ffChoices[Obj.GetValue()]
     2708                wx.CallAfter(UpdateModelsGrid,G2frame,data)
     2709           
     2710        def OnDelLevel(event):
     2711            Obj = event.GetEventObject()
     2712            item = Indx[Obj.GetId()]
     2713            del data['Particle']['Levels'][item]
     2714            wx.CallAfter(UpdateModelsGrid,G2frame,data)
     2715           
     2716        def OnRadio(event):
     2717            Obj = event.GetEventObject()
     2718            parm,item,key,sldrObj,parmObj = Indx[Obj.GetId()]
     2719            Indx[sldrObj.GetId()][2] = parmObj
     2720            item[key] = Obj.GetLabel()
     2721            value = parm[0]
     2722            sldrObj.SetRange(1000.*(np.log10(value)-2),1000.*(np.log10(value)+2))
     2723            sldrObj.SetValue(1000.*np.log10(value))
     2724           
     2725        def OnSlider(event):
     2726            Obj = event.GetEventObject()
     2727            item,key,pvObj = Indx[Obj.GetId()]
     2728            item[key] = 10.**float(Obj.GetValue()/1000.)
     2729            pvObj.SetValue('%.3g'%(item[key]))
     2730           
     2731        Indx = {}
    26402732        partSizer = wx.BoxSizer(wx.VERTICAL)
    2641         partSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Particle fit parameters: '),0,WACV)
     2733        topSizer = wx.BoxSizer(wx.HORIZONTAL)
     2734        topSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Particle fit parameters: '),0,WACV)
     2735        topSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Matrix: '),0,WACV)
     2736        matsel = wx.ComboBox(G2frame.dataDisplay,value=data['Particle']['Matrix']['Name'],
     2737            choices=Substances['Substances'].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2738        Indx[matsel.GetId()] = [data['Particle']['Matrix'],'Name']
     2739        matsel.Bind(wx.EVT_COMBOBOX,OnSelect) #Do neutron test here?
     2740        rhoMat = Substances['Substances'][data['Particle']['Matrix']['Name']].get('XAnom density',0.0)       
     2741        topSizer.Add(matsel,0,WACV)
     2742        topSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Volume fraction: '),0,WACV)
     2743        volfrac = G2gd.ValidatedTxtCtrl(G2frame.dataDisplay,data['Particle']['Matrix']['VolFrac'],0,
     2744                typeHint=float,OnLeave=AfterChange)
     2745        topSizer.Add(volfrac,0,WACV)
     2746        volVar = wx.CheckBox(G2frame.dataDisplay,label=' Refine?')
     2747        volVar.SetValue(data['Particle']['Matrix']['VolFrac'][1])
     2748        Indx[volVar.GetId()] = [data['Particle']['Matrix']['VolFrac'],1]
     2749        volVar.Bind(wx.EVT_CHECKBOX, OnSelect)
     2750        topSizer.Add(volVar,0,WACV)
     2751        partSizer.Add(topSizer,0,)
     2752        for ilev,level in enumerate(data['Particle']['Levels']):
     2753            G2gd.HorizontalLine(partSizer,G2frame.dataDisplay)
     2754            topLevel = wx.BoxSizer(wx.HORIZONTAL)
     2755            topLevel.Add(wx.StaticText(G2frame.dataDisplay,label=' Model level %d:           '%(ilev)),0,WACV)
     2756            delBtn = wx.Button(G2frame.dataDisplay,label=' Delete?')
     2757            Indx[delBtn.GetId()] = ilev
     2758            delBtn.Bind(wx.EVT_BUTTON,OnDelLevel)
     2759            topLevel.Add(delBtn,0,WACV)
     2760            partSizer.Add(topLevel,0)
     2761            ctrlSizer = wx.FlexGridSizer(0,4,5,5)
     2762            ctrlSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Form Factor: '),0,WACV)
     2763            ffChoice = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['FormFact'],choices=ffChoices.keys(),
     2764                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2765            Indx[ffChoice.GetId()] = [level['Controls'],'FormFact']
     2766            ffChoice.Bind(wx.EVT_COMBOBOX,OnSelect)
     2767            ctrlSizer.Add(ffChoice,0,WACV)
     2768            ctrlSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Distribution: '),0,WACV)
     2769            Distchoice = ['LogNormal','Gaussian','LSW','Schulz-Zimm']   
     2770            distChoice = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['DistType'],choices=Distchoice,
     2771                style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2772            Indx[distChoice.GetId()] = [level['Controls'],'DistType']
     2773            distChoice.Bind(wx.EVT_COMBOBOX,OnSelect)
     2774            ctrlSizer.Add(distChoice,0,WACV)
     2775            ctrlSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Material: '),0,WACV)
     2776            matSel = wx.ComboBox(G2frame.dataDisplay,value=level['Controls']['Material'],
     2777                choices=Substances['Substances'].keys(),style=wx.CB_READONLY|wx.CB_DROPDOWN)
     2778            Indx[matSel.GetId()] = [level['Controls'],'Material']
     2779            matSel.Bind(wx.EVT_COMBOBOX,OnSelect)       
     2780            ctrlSizer.Add(matSel,0,WACV) #do neutron test here?
     2781            rho = Substances['Substances'][level['Controls']['Material']].get('XAnom density',0.0)
     2782            contrast = rho**2-rhoMat**2
     2783            ctrlSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Resonant X-ray contrast: '),0,WACV)
     2784            ctrlSizer.Add(wx.StaticText(G2frame.dataDisplay,label='  %.2f 10%scm%s'%(contrast,Pwr20,Pwrm4)),0,WACV)
     2785           
     2786            partSizer.Add(ctrlSizer,0)
     2787            lvlSizer = wx.BoxSizer(wx.HORIZONTAL)
     2788            parmSizer = wx.FlexGridSizer(0,3,5,5)
     2789            Parms = level[level['Controls']['DistType']]
     2790            FFargs = level['Controls']['FFargs']
     2791            parm = level['Selected']
     2792            value = np.log10(Parms[parm][0])
     2793            valMinMax = [value-2,value+2]
     2794            valueSldr = wx.Slider(parent=G2frame.dataDisplay,minValue=1000.*valMinMax[0],
     2795                maxValue=1000.*valMinMax[1],style=wx.SL_VERTICAL|wx.SL_INVERSE,value=1000.*value)
     2796            sldrId = valueSldr.GetId()
     2797            for iparm,parm in enumerate(list(Parms)):
     2798                if not iparm:
     2799                    radio = wx.RadioButton(G2frame.dataDisplay,label=parm,style=wx.RB_GROUP)
     2800                else:
     2801                    radio = wx.RadioButton(G2frame.dataDisplay,label=parm)
     2802                Indx[radio.GetId()] = [Parms[parm],level,'Selected',valueSldr]
     2803                radio.Bind(wx.EVT_RADIOBUTTON,OnRadio)
     2804                parmSizer.Add(radio,0,WACV)
     2805                parmValue = wx.TextCtrl(G2frame.dataDisplay,value='%.3g'%(Parms[parm][0]),
     2806                    style=wx.TE_PROCESS_ENTER)
     2807                parmValue.Bind(wx.EVT_TEXT_ENTER,OnValue)       
     2808                parmValue.Bind(wx.EVT_KILL_FOCUS,OnValue)
     2809#                parmValue = G2gd.ValidatedTxtCtrl(G2frame.dataDisplay,Parms[parm],0,
     2810#                    typeHint=float,OnLeave=AfterChange)
     2811                Indx[parmValue.GetId()] = [Parms[parm],parm,level['Selected'],valueSldr]
     2812                Indx[radio.GetId()].append(parmValue)
     2813                if parm == level['Selected']:
     2814                    radio.SetValue(True)
     2815                    pvObj = parmValue
     2816                parmSizer.Add(parmValue,0,WACV)
     2817                parmVar = wx.CheckBox(G2frame.dataDisplay,label='Refine?')
     2818                parmVar.SetValue(Parms[parm][1])
     2819                Indx[parmVar.GetId()] = [Parms[parm],1]
     2820                parmVar.Bind(wx.EVT_CHECKBOX, OnSelect)
     2821                parmSizer.Add(parmVar,0,WACV)
     2822            for parm in list(FFargs):
     2823                radio = wx.RadioButton(G2frame.dataDisplay,label=parm)
     2824                Indx[radio.GetId()] = [FFargs[parm],level,'Selected',valueSldr]
     2825                radio.Bind(wx.EVT_RADIOBUTTON,OnRadio)
     2826                parmSizer.Add(radio,0,WACV)
     2827                parmValue = wx.TextCtrl(G2frame.dataDisplay,value='%.3g'%(FFargs[parm][0]),
     2828                    style=wx.TE_PROCESS_ENTER)
     2829                parmValue.Bind(wx.EVT_TEXT_ENTER,OnValue)       
     2830                parmValue.Bind(wx.EVT_KILL_FOCUS,OnValue)
     2831#                parmValue = G2gd.ValidatedTxtCtrl(G2frame.dataDisplay,FFargs[parm],0,
     2832#                    typeHint=float,OnLeave=AfterChange)
     2833                Indx[parmValue.GetId()] = [FFargs[parm],parm,level['Selected'],valueSldr]
     2834                Indx[radio.GetId()].append(parmValue)
     2835                if parm == level['Selected']:
     2836                    radio.SetValue(True)
     2837                    pvObj = parmValue
     2838                parmSizer.Add(parmValue,0,WACV)
     2839                parmVar = wx.CheckBox(G2frame.dataDisplay,label='Refine?')
     2840                parmVar.SetValue(FFargs[parm][1])
     2841                Indx[parmVar.GetId()] = [FFargs[parm],1]
     2842                parmVar.Bind(wx.EVT_CHECKBOX, OnSelect)
     2843                parmSizer.Add(parmVar,0,WACV)
     2844            lvlSizer.Add(parmSizer,0,)
     2845            Indx[sldrId] = [Parms[level['Selected']],0,pvObj]
     2846            valueSldr.Bind(wx.EVT_SCROLL,OnSlider)
     2847            lvlSizer.Add(valueSldr,1,wx.EXPAND)
     2848            partSizer.Add(lvlSizer,0,)
    26422849        return partSizer
    26432850       
    26442851    def UnifSizer():
    2645         for item in data['Unified']: print item,data['Unified'][item]
     2852        print data['Unified']
    26462853        unifSizer = wx.BoxSizer(wx.VERTICAL)
    26472854        unifSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Unified fit parameters: '),0,WACV)
     
    26742881    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyModel, id=G2gd.wxID_MODELCOPY)
    26752882    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitModel, id=G2gd.wxID_MODELFIT)
     2883    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddModel, id=G2gd.wxID_MODELADD)
    26762884    Indx = {}
    26772885    mainSizer = wx.BoxSizer(wx.VERTICAL)
  • trunk/GSASIIsasd.py

    r1260 r1263  
    783783    data['Size']['Distribution'] = [Bins,Dbins,BinMag/(2.*Dbins)]
    784784       
     785################################################################################
     786#### Unified fit
     787################################################################################
     788
     789def UnifiedFit(Profile,ProfDict,Limits,Substances,Sample,data):
     790    print 'do unified fit'
     791   
     792def UnifiedFxn(Q,G,Rg,B,Rgcf,P,SQfxn,args=[]):
     793    termA = G*np.exp(-((Q*Rg)**2)/3.)
     794    termB = B*np.exp(-((Q*Rgcf)**2)/3.)
     795    termC = (scsp.erf(Q*Rg/np.sqrt(6))**3/Q)**P
     796    return SQfxn(Q,args)*termA+(termB*termC)
     797   
     798
     799
     800################################################################################
     801#### Modelling
     802################################################################################
     803
     804def ModelFit(Profile,ProfDict,Limits,Substances,Sample,data):
     805    print 'do model fit'
     806           
    785807   
    786808################################################################################
  • trunk/imports/G2sad_xye.py

    r1230 r1263  
    88########### SVN repository information ###################
    99'''
    10 *Module G2sad_xye: small angle q step .xye data*
     10*Module G2sad_xye: small angle q step .sad data*
    1111------------------------------------
    1212
     
    2323npasind = lambda x: 180.*np.arcsin(x)/np.pi
    2424
    25 class txt_ReaderClass(G2IO.ImportSmallAngleData):
    26     'Routines to import q SAXD data from a .txt or .dat file'
     25class txt_XRayReaderClass(G2IO.ImportSmallAngleData):
     26    'Routines to import X-ray q SAXD data from a .xsad or .xdat file'
    2727    def __init__(self):
    2828        super(self.__class__,self).__init__( # fancy way to self-reference
    29             extensionlist=('.txt','.dat'),
     29            extensionlist=('.xsad','.xdat'),
    3030            strictExtension=False,
    31             formatName = 'q step QIE data',
    32             longFormatName = 'q stepped text data file in Q,I,E order; E optional'
     31            formatName = 'q step X-ray QIE data',
     32            longFormatName = 'q stepped X-ray text data file in Q,I,E order; E optional'
    3333            )
    3434
     
    121121            traceback.print_exc(file=sys.stdout)
    122122            return False
     123
     124class txt_CWNeutronReaderClass(G2IO.ImportSmallAngleData):
     125    'Routines to import neutron CW q SAXD data from a .nsad or .ndat file'
     126    def __init__(self):
     127        super(self.__class__,self).__init__( # fancy way to self-reference
     128            extensionlist=('.nsad','.ndat'),
     129            strictExtension=False,
     130            formatName = 'q step neutron CW QIE data',
     131            longFormatName = 'q stepped neutron CW text data file in Q,I,E order; E optional'
     132            )
     133
     134    # Validate the contents -- make sure we only have valid lines
     135    def ContentsValidator(self, filepointer):
     136        'Look through the file for expected types of lines in a valid q-step file'
     137        Ndata = 0
     138        for i,S in enumerate(filepointer):
     139            vals = S.split()
     140            if len(vals) >= 2:
     141                try:
     142                    data = [float(val) for val in vals]
     143                    Ndata += 1
     144                except ValueError:
     145                    pass
     146        if not Ndata:     
     147            self.errors = 'No 2 or more column numeric data found'
     148            return False
     149        return True # no errors encountered
     150
     151    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
     152        print 'Read a q-step text file'
     153        x = []
     154        y = []
     155        w = []
     156        try:
     157            wave = 1.5428   #Cuka default
     158            Temperature = 300
     159            Ndata = 0
     160            for i,S in enumerate(filepointer):
     161                if len(S) == 1:     #skip blank line
     162                    continue
     163                if '=' in S:
     164                    self.comments.append(S[:-1])
     165                    if 'wave' in S.split('=')[0].lower():
     166                        try:
     167                            wave = float(S.split('=')[1])
     168                        except:
     169                            pass
     170                    continue
     171                vals = S.split()
     172                if len(vals) >= 2:
     173                    try:
     174                        data = [float(val) for val in vals]
     175                        x.append(float(data[0]))
     176                        f = float(data[1])
     177                        if f <= 0.0:
     178                            y.append(0.0)
     179                            w.append(1.0)
     180                        elif len(vals) > 2:
     181                            y.append(float(data[1]))
     182                            w.append(1.0/float(data[2])**2)
     183                        else:
     184                            y.append(float(data[1]))
     185                            w.append(1.0/float(data[1]))
     186                    except ValueError:
     187                        msg = 'Error in line '+str(i+1)
     188                        print msg
     189                        continue
     190            N = len(x)
     191            for S in self.comments:
     192                if 'Temp' in S.split('=')[0]:
     193                    try:
     194                        Temperature = float(S.split('=')[1])
     195                    except:
     196                        pass
     197            self.instdict['wave'] = wave
     198            self.instdict['type'] = 'LNC'
     199            x = np.array(x)
     200            if np.any(x > 2.):         #q must be nm-1
     201                x /= 10.
     202            self.smallangledata = [
     203                x, # x-axis values q
     204                np.array(y), # small angle pattern intensities
     205                np.array(w), # 1/sig(intensity)^2 values (weights)
     206                np.zeros(N), # calc. intensities (zero)
     207                np.zeros(N), # obs-calc profiles
     208                ]
     209            self.smallangleentry[0] = filename
     210            self.smallangleentry[2] = 1 # xye file only has one bank
     211            self.idstring = ospath.basename(filename)
     212            # scan comments for temperature
     213            self.Sample['Temperature'] = Temperature
     214   
     215            return True
     216        except Exception as detail:
     217            self.errors += '\n  '+str(detail)
     218            print self.formatName+' read error:'+str(detail) # for testing
     219            import traceback
     220            traceback.print_exc(file=sys.stdout)
     221            return False
Note: See TracChangeset for help on using the changeset viewer.