Ignore:
Timestamp:
Mar 13, 2017 1:39:33 PM (6 years ago)
Author:
srkline
Message:

adding to the functionality of the data reduction protocol

getting the 1D plotting to work both as a standalone plot and part of the reduction protocol (where the choices are all made and fed in)

added log/lin toggle to 1D display. abc exponent scaling is fundamentally more messy, and has been shelved for now. Revisit if demand is there.

fixed bug in how raw data files are identified, to prevent .abs files from being incorrectly identified as raw (if same name before extension). Works correctly now, but may need tweak in future if naming scheme changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_DataPlotting.ipf

    r1023 r1027  
    55 
    66// 
    7 // functions to plot the averaged data in various views. 
     7// functions to plot the averaged data in various views and binning types 
    88// 
    99 
     
    2020// -- color coding of the different panels (data tags/arrows/toggle on/off)? 
    2121// -- VERIFY accuracy 
     22// 
    2223// -- decide what to add to the control bar 
     24// ()()() In SANS, there are only 3 waves (q-i-s) and these are copied over to the plot1D folder, and the copy 
     25//    of the data is plotted, not the data in the WORK folder. Then for rescaling, a "fresh" copy of the data is 
     26//    fetched, and then rescaled. The plot automatically reflects these changes. 
     27//  --- for VSANS, this is much more difficult since there are multiple possibilites of 1D data, depending on the 
     28//     binning chosen. Currently, the data is plotted directly from the WORK folder, so this would need to be changed 
     29//     at the start, then deciding which waves to copy over. Messy. Very Messy. For now, simply toggle log/lin 
     30// 
    2331// -- at the very least, add a log/lin toggle for the axes 
    2432// 
     
    3038//    and to the function Draw_Plot1D() for the drawing of the plot 
    3139// 
    32 Function V_PlotData_Panel() 
    33  
     40// If -9999 is passed in as the "binType", then read the proper value from the popup on the graph. 
     41//  otherwise, assume that a proper value has been passed in, say from the reduction protocol 
     42// 
     43Function V_PlotData_Panel(binType) 
     44        Variable binType 
    3445 
    3546        DoWindow/F V_1D_Data 
    3647        if(V_flag==0) 
    3748         
     49//              NewDataFolder/O root:Packages:NIST:VSANS:Globals:Plot_1D 
     50//              Variable/G root:Packages:NIST:VSANS:Globals:Plot_1D:gYMode = 1 
     51//              Variable/G root:Packages:NIST:VSANS:Globals:Plot_1D:gXMode = 1 
     52//              Variable/G root:Packages:NIST:VSANS:Globals:Plot_1D:gExpA = 1 
     53//              Variable/G root:Packages:NIST:VSANS:Globals:Plot_1D:gExpB = 1 
     54//              Variable/G root:Packages:NIST:VSANS:Globals:Plot_1D:gExpC = 1 
     55                 
     56                 
    3857                Display /W=(277,526,748,938)/N=V_1D_Data/K=1 
    39 //              Display /W=(476,96,850,429)/N=V_1D_Data/K=1 
     58 
    4059                ControlBar 70 
    4160                 
     
    4463                PopupMenu popup0,value= "One;Two;Four;Slit Mode;" 
    4564                PopupMenu popup0,mode=1,proc=V_BinningModePopup 
    46 //              PopupMenu ymodel,pos={16,5},size={71,20},title="y-axis" 
     65                 
     66                CheckBox check0,pos={18.00,36.00},size={57.00,16.00},proc=V_Plot1D_LogCheckProc,title="Log Axes" 
     67                CheckBox check0,value= 1 
     68         
     69//              PopupMenu ymodel,pos={150,5},size={71,20},title="y-axis" 
    4770//              PopupMenu ymodel,help={"This popup selects how the y-axis will be linearized based on the chosen data"} 
    4871//              PopupMenu ymodel,value= #"\"I;log(I);ln(I);1/I;I^a;Iq^a;I^a q^b;1/sqrt(I);ln(Iq);ln(Iq^2)\"" 
    49 //              PopupMenu ymodel,mode=NumVarOrDefault("root:myGlobals:Plot_1d:gYMode", 1 ),proc=YMode_PopMenuProc 
    50 //              PopupMenu xmodel,pos={150,5},size={74,20},title="x-axis" 
     72//              PopupMenu ymodel,mode=NumVarOrDefault("root:Packages:NIST:VSANS:Globals:Plot_1d:gYMode", 1 ),proc=V_YMode_PopMenuProc 
     73//              PopupMenu xmodel,pos={220,5},size={74,20},title="x-axis" 
    5174//              PopupMenu xmodel,help={"This popup selects how the x-axis will be linearized given the chosen data"} 
    5275//              PopupMenu xmodel,value= #"\"q;log(q);q^2;q^c\"" 
    53 //              PopupMenu xmodel,mode=NumVarOrDefault("root:myGlobals:Plot_1d:gXMode", 1 ),proc=XMode_PopMenuProc 
    54 //              Button Rescale,pos={281,4},size={70,20},proc=Rescale_Plot_1D_ButtonProc,title="Rescale" 
    55 //              Button Rescale,help={"Rescale the x and y-axes of the data"},disable=1 
    56  
    57 //              SetVariable expa,pos={28,28},size={80,15},title="pow \"a\"" 
     76//              PopupMenu xmodel,mode=NumVarOrDefault("root:Packages:NIST:VSANS:Globals:Plot_1d:gXMode", 1 ),proc=V_XMode_PopMenuProc 
     77////            Button Rescale,pos={281,5},size={70,20},proc=V_Rescale_Plot_1D_ButtonProc,title="Rescale" 
     78////            Button Rescale,help={"Rescale the x and y-axes of the data"},disable=1 
     79// 
     80//              SetVariable expa,pos={120,28},size={80,15},title="pow \"a\"" 
    5881//              SetVariable expa,help={"This sets the exponent \"a\" for some y-axis formats. The value is ignored if the model does not use an adjustable exponent"} 
    59 //              SetVariable expa,limits={-2,10,0},value= root:myGlobals:Plot_1d:gExpA 
    60 //              SetVariable expb,pos={27,46},size={80,15},title="pow \"b\"" 
     82//              SetVariable expa,limits={-2,10,0},value= root:Packages:NIST:VSANS:Globals:Plot_1d:gExpA 
     83//              SetVariable expb,pos={120,46},size={80,15},title="pow \"b\"" 
    6184//              SetVariable expb,help={"This sets the exponent \"b\" for some x-axis formats. The value is ignored if the model does not use an adjustable exponent"} 
    62 //              SetVariable expb,limits={0,10,0},value= root:myGlobals:Plot_1d:gExpB 
    63 // 
    64 //              SetVariable expc,pos={167,28},size={80,15},title="pow \"c\"" 
     85//              SetVariable expb,limits={0,10,0},value= root:Packages:NIST:VSANS:Globals:Plot_1d:gExpB 
     86// 
     87//              SetVariable expc,pos={220,28},size={80,15},title="pow \"c\"" 
    6588//              SetVariable expc,help={"This sets the exponent \"c\" for some x-axis formats. The value is ignored if the model does not use \"c\" as an adjustable exponent"} 
    66 //              SetVariable expc,limits={-10,10,0},value= root:myGlobals:Plot_1d:gExpC 
    67                  
    68                 Button AllQ,pos={281,28},size={70,20},proc=V_AllQ_Plot_1D_ButtonProc,title="All Q" 
     89//              SetVariable expc,limits={-10,10,0},value= root:Packages:NIST:VSANS:Globals:Plot_1d:gExpC 
     90                 
     91                Button AllQ,pos={320,28},size={70,20},proc=V_AllQ_Plot_1D_ButtonProc,title="All Q" 
    6992                Button AllQ,help={"Show the full q-range of the dataset"} 
    7093                 
    71         endif 
    72                  
    73          
    74         SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType 
    75  
    76         V_QBinAllPanels(type) 
     94                Legend/C/N=text0/J/X=72.00/Y=60.00 
     95        endif 
     96                 
     97         
     98        SVAR workType = root:Packages:NIST:VSANS:Globals:gCurDispType 
     99 
     100        if(binType == -9999) 
     101                binType = V_GetBinningPopMode()         //dummy passed in, replace with value from panel 
     102        endif 
     103        V_QBinAllPanels(workType,binType) 
    77104 
    78105// TODO: 
    79106// x- "B" detector is currently skipped - Q is not yet calculated 
    80         Execute ("V_Back_IQ_Graph(\""+type+"\")") 
    81         Execute ("V_Middle_IQ_Graph(\""+type+"\")") 
    82         Execute ("V_Front_IQ_Graph(\""+type+"\")") 
    83          
     107        String str 
     108        sprintf str,"(\"%s\",%d)",workType,binType 
     109         
     110        Execute ("V_Back_IQ_Graph"+str) 
     111//      Print "V_Back_IQ_Graph"+str 
     112        Execute ("V_Middle_IQ_Graph"+str) 
     113        Execute ("V_Front_IQ_Graph"+str) 
     114 
    84115         
    85116End 
     117 
     118Function V_Plot1D_LogCheckProc(cba) : CheckBoxControl 
     119        STRUCT WMCheckboxAction &cba 
     120 
     121        switch( cba.eventCode ) 
     122                case 2: // mouse up 
     123                        Variable checked = cba.checked 
     124                                 
     125                                ModifyGraph log=(checked) 
     126                         
     127                        break 
     128                case -1: // control being killed 
     129                        break 
     130        endswitch 
     131 
     132        return 0 
     133End 
     134 
     135// 
     136////function to set the popItem (mode) of the graph, to re-create the graph based on user preferences 
     137//Function V_YMode_PopMenuProc(ctrlName,popNum,popStr) : PopupMenuControl 
     138//      String ctrlName 
     139//      Variable popNum 
     140//      String popStr 
     141// 
     142//      Variable/G root:Packages:NIST:VSANS:Globals:Plot_1d:gYMode=popNum 
     143//      V_Rescale_Plot_1D_ButtonProc("") 
     144//End 
     145// 
     146////function to set the popItem (mode) of the graph, to re-create the graph based on user preferences 
     147//Function V_XMode_PopMenuProc(ctrlName,popNum,popStr) : PopupMenuControl 
     148//      String ctrlName 
     149//      Variable popNum 
     150//      String popStr 
     151// 
     152//      Variable/G root:Packages:NIST:VSANS:Globals:Plot_1d:gXMode=popNum 
     153//      V_Rescale_Plot_1D_ButtonProc("") 
     154//End 
     155 
     156 
     157//function to rescale the axes of the graph as selected from the popups and the  
     158// entered values of the exponents 
     159//** assumes the current waves are unknown, so it goes and gets a "fresh" copy from 
     160//the data folder specified by the waves on the graph, which is the same folder that 
     161//contains the "fresh" copy of the 1D data 
     162// 
     163// for log(10) scaling, simply modify the axes, not the data - gives better plots 
     164// 
     165//Function V_Rescale_Plot_1D_ButtonProc(ctrlName) : ButtonControl 
     166//      String ctrlName 
     167//       
     168//      DoWindow/F V_1D_Data 
     169////Scaling exponents and background value 
     170//      Variable pow_a,pow_b,pow_c 
     171//      ControlInfo expa 
     172//      pow_a = V_value 
     173//      ControlInfo expb 
     174//      pow_b = V_value 
     175//      ControlInfo expc 
     176//      pow_c = V_value 
     177//       
     178////check for physical limits on exponent values, abort if bad values found 
     179//      if((pow_a < -2) || (pow_a > 10)) 
     180//              Abort "Exponent a must be in the range (-2,10)" 
     181//      endif 
     182//      if((pow_b < 0) || (pow_b > 10)) 
     183//              Abort "Exponent b must be in the range (0,10)" 
     184//      endif 
     185//      //if q^c is the x-scaling, c must be be within limits and also non-zero 
     186//      ControlInfo xModel 
     187//      If (cmpstr("q^c",S_Value) == 0) 
     188//              if(pow_c == 0)  
     189//                      Abort "Exponent c must be non-zero, q^0 = 1" 
     190//              endif 
     191//              if((pow_c < -10) || (pow_c > 10)) 
     192//                      Abort "Exponent c must be in the range (-10,10)" 
     193//              endif 
     194//      endif           //check q^c exponent 
     195//       
     196//// get the current experimental q, I, and std dev. waves 
     197//      SVAR curFolder=root:Packages:NIST:VSANS:Globals:gDataDisplayType 
     198// 
     199//// what is the binning? == what waves do we need to copy over 
     200//       
     201// 
     202//      //get the untarnished data, so we can rescale it freshly here 
     203//      Wave yw = $("root:Packages:NIST:"+curFolder+":aveint") 
     204//      Wave ew = $("root:Packages:NIST:"+curFolder+":sigave") 
     205//      //get the correct x values 
     206//      NVAR isPhiAve= root:myGlobals:Plot_1d:isPhiAve  //0 signifies (normal) x=qvals 
     207//      if(isPhiAve) 
     208//              //x is angle 
     209//              Wave xw=$("root:Packages:NIST:"+curFolder+":phival") 
     210//      else 
     211//              //x is q-values 
     212//              Wave xw=$("root:Packages:NIST:"+curFolder+":qval") 
     213//      endif 
     214//      Wave yAxisWave=root:myGlobals:Plot_1d:yAxisWave         //refs to waves to be modified, hard-wired positions 
     215//      Wave xAxisWave=root:myGlobals:Plot_1d:xAxisWave 
     216//      Wave yErrWave=root:myGlobals:Plot_1d:yErrWave 
     217//       
     218//      //variables set for each model to control look of graph 
     219//      String xlabel,ylabel,xstr,ystr 
     220//      Variable logLeft=0,logBottom=0 
     221//      //check for proper y-scaling selection, make the necessary waves 
     222//      ControlInfo yModel 
     223//      ystr = S_Value 
     224//      do 
     225//              If (cmpstr("I",S_Value) == 0) 
     226//                      SetScale d 0,0,"1/cm",yAxisWave 
     227//                      yErrWave = ew 
     228//                      yAxisWave = yw 
     229//                      ylabel = "I(q)" 
     230//                      break    
     231//              endif 
     232//              If (cmpstr("ln(I)",S_Value) == 0) 
     233//                      SetScale d 0,0,"",yAxisWave 
     234//                      yErrWave = ew/yw 
     235//                      yAxisWave = ln(yw) 
     236//                      ylabel = "ln(I)" 
     237//                      break    
     238//              endif 
     239//              If (cmpstr("log(I)",S_Value) == 0) 
     240//                      SetScale d 0,0,"",yAxisWave 
     241//                      yAxisWave = yw 
     242//                      yErrWave = ew 
     243//                      logLeft=1                               //scale the axis, not the wave 
     244//                      ylabel = "I(q)" 
     245////                    yErrWave = ew/(2.30*yw) 
     246////                    yAxisWave = log(yw) 
     247////                    ylabel = "log(I)" 
     248//                      break    
     249//              endif 
     250//              If (cmpstr("1/I",S_Value) == 0) 
     251//                      SetScale d 0,0,"",yAxisWave 
     252//                      yErrWave = ew/yw^2 
     253//                      yAxisWave = 1/yw 
     254//                      ylabel = "1/I" 
     255//                      break 
     256//              endif 
     257//              If (cmpstr("I^a",S_Value) == 0) 
     258//                      SetScale d 0,0,"",yAxisWave 
     259//                      yErrWave = ew*abs(pow_a*(yw^(pow_a-1))) 
     260//                      yAxisWave = yw^pow_a 
     261//                      ylabel = "I^"+num2str(pow_a) 
     262//                      break 
     263//              endif 
     264//              If (cmpstr("Iq^a",S_Value) == 0) 
     265//                      SetScale d 0,0,"",yAxisWave 
     266//                      yErrWave = ew*xw^pow_a 
     267//                      yAxisWave = yw*xw^pow_a 
     268//                      ylabel = "I*q^"+num2str(pow_a) 
     269//                      break 
     270//              endif 
     271//              If (cmpstr("I^a q^b",S_Value) == 0) 
     272//                      SetScale d 0,0,"",yAxisWave 
     273//                      yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))*xw^pow_b 
     274//                      yAxisWave = yw^pow_a*xw^pow_b 
     275//                      ylabel = "I^" + num2str(pow_a) + "q^"+num2str(pow_b) 
     276//                      break 
     277//              endif 
     278//              If (cmpstr("1/sqrt(I)",S_Value) == 0) 
     279//                      SetScale d 0,0,"",yAxisWave 
     280//                      yErrWave = 0.5*ew*yw^(-1.5) 
     281//                      yAxisWave = 1/sqrt(yw) 
     282//                      ylabel = "1/sqrt(I)" 
     283//                      break 
     284//              endif 
     285//              If (cmpstr("ln(Iq)",S_Value) == 0) 
     286//                      SetScale d 0,0,"",yAxisWave 
     287//                      yErrWave =ew/yw 
     288//                      yAxisWave = ln(xw*yw) 
     289//                      ylabel = "ln(q*I)" 
     290//                      break 
     291//              endif 
     292//              If (cmpstr("ln(Iq^2)",S_Value) == 0) 
     293//                      SetScale d 0,0,"",yAxisWave 
     294//                      yErrWave = ew/yw 
     295//                      yAxisWave = ln(xw*xw*yw) 
     296//                      ylabel = "ln(I*q^2)" 
     297//                      break 
     298//              endif 
     299//              //more ifs for each case as they are added 
     300//               
     301//              // if selection not found, abort 
     302//              DoAlert 0,"Y-axis scaling incorrect. Aborting" 
     303//              Abort 
     304//      while(0)        //end of "case" statement for y-axis scaling 
     305//       
     306//      //check for proper x-scaling selection 
     307//      SVAR/Z angst = root:Packages:NIST:gAngstStr  
     308//      String dum 
     309//       
     310//      ControlInfo xModel 
     311//      xstr = S_Value 
     312//      do 
     313//              If (cmpstr("q",S_Value) == 0)    
     314//                      SetScale d 0,0,"",xAxisWave 
     315//                      xAxisWave = xw 
     316//                      if(isPhiAve) 
     317//                              xlabel="Angle (deg)" 
     318//                      else 
     319//                              xlabel = "q ("+angst+"\\S-1\\M)" 
     320//                      endif 
     321//                      break    
     322//              endif 
     323//              If (cmpstr("q^2",S_Value) == 0)  
     324//                      SetScale d 0,0,"",xAxisWave 
     325//                      xAxisWave = xw*xw 
     326//                      if(isPhiAve) 
     327//                              xlabel="(Angle (deg) )^2" 
     328//                      else 
     329//                              xlabel = "q^2 ("+angst+"\\S-2\\M)" 
     330//                      endif 
     331//                      break    
     332//              endif 
     333//              If (cmpstr("log(q)",S_Value) == 0)       
     334//                      SetScale d 0,0,"",xAxisWave 
     335//                      xAxisWave = xw          //scale the axis, not the wave 
     336//                      //xAxisWave = log(xw) 
     337//                      logBottom=1 
     338//                      if(isPhiAve) 
     339//                              //xlabel="log(Angle (deg))" 
     340//                              xlabel="Angle (deg)" 
     341//                      else 
     342//                              //xlabel = "log(q)" 
     343//                              xlabel = "q ("+angst+"\\S-1\\M)" 
     344//                      endif 
     345//                      break    
     346//              endif 
     347//              If (cmpstr("q^c",S_Value) == 0) 
     348//                      SetScale d 0,0,"",xAxisWave 
     349//                      xAxisWave = xw^pow_c 
     350//                      dum = num2str(pow_c) 
     351//                      if(isPhiAve) 
     352//                              xlabel="Angle^"+dum 
     353//                      else 
     354//                              xlabel = "q^"+dum+" ("+angst+"\\S-"+dum+"\\M)" 
     355//                      endif 
     356//                      break 
     357//              endif 
     358//       
     359//              //more ifs for each case 
     360//               
     361//              // if selection not found, abort 
     362//              DoAlert 0,"X-axis scaling incorrect. Aborting" 
     363//              Abort 
     364//      while(0)        //end of "case" statement for x-axis scaling 
     365//       
     366//      Label left ylabel 
     367//      Label bottom xlabel     //E denotes "scaling"  - may want to use "units" instead         
     368//      ModifyGraph log(left)=(logLeft) 
     369//      ModifyGraph log(bottom)=(logBottom) 
     370//       
     371//End 
     372 
    86373 
    87374//function to restore the graph axes to full scale, undoing any zooming 
     
    104391        SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType 
    105392 
    106         V_QBinAllPanels(type) 
    107  
    108         Execute ("V_Back_IQ_Graph(\""+type+"\")") 
    109         Execute ("V_Middle_IQ_Graph(\""+type+"\")") 
    110         Execute ("V_Front_IQ_Graph(\""+type+"\")") 
     393        V_QBinAllPanels(type,popNum) 
     394 
     395        String str 
     396        sprintf str,"(\"%s\",%d)",Type,popNum 
     397 
     398        Execute ("V_Back_IQ_Graph"+str) 
     399        Execute ("V_Middle_IQ_Graph"+str) 
     400        Execute ("V_Front_IQ_Graph"+str) 
     401                 
     402//      Execute ("V_Back_IQ_Graph(\""+type+"\")") 
     403//      Execute ("V_Middle_IQ_Graph(\""+type+"\")") 
     404//      Execute ("V_Front_IQ_Graph(\""+type+"\")") 
    111405         
    112406        return(0)        
     
    116410 
    117411        Variable binType 
     412         
     413        if(WinType("V_1D_Data")==0) 
     414                DoAlert 0,"V_1D_Data window is not open, called from V_GetBinningPopMode()" 
     415                return(0) 
     416        endif 
     417         
    118418        ControlInfo/W=V_1D_Data popup0 
    119419        strswitch(S_Value)      // string switch 
     
    133433                default:                        // optional default expression executed 
    134434                        binType = 0 
    135                         Abort "Binning mode not found in        V_QBinAllPanels() "// when no case matches 
     435                        Abort "Binning mode not found in V_GetBinningPopMode() "// when no case matches 
    136436        endswitch 
    137437         
     
    151451// input "type" is the data type and defines the folder 
    152452// 
    153 Proc V_Middle_IQ_Graph(type)  
     453Proc V_Middle_IQ_Graph(type,binType)  
    154454        String type 
    155  
    156455        Variable binType 
    157456 
    158         binType = V_GetBinningPopMode() 
     457//      binType = V_GetBinningPopMode() 
    159458        SetDataFolder $("root:Packages:NIST:VSANS:"+type) 
    160459 
     
    316615// 
    317616// 
    318 Proc V_Front_IQ_Graph(type)  
     617Proc V_Front_IQ_Graph(type,binType)  
    319618        String type 
    320  
    321619        Variable binType 
    322620 
    323621 
    324         binType = V_GetBinningPopMode() 
     622//      binType = V_GetBinningPopMode() 
    325623        SetDataFolder $("root:Packages:NIST:VSANS:"+type) 
    326624 
     
    486784// 
    487785////////////to plot the back panel I(q) 
    488 Proc V_Back_IQ_Graph(type) 
     786Proc V_Back_IQ_Graph(type,binType) 
    489787        String type 
     788        Variable binType 
    490789         
    491790//      SetDataFolder root:Packages:NIST:VSANS:VCALC:entry:instrument:detector_B 
    492791 
    493         Variable binType 
    494  
    495         binType = V_GetBinningPopMode() 
     792//      Variable binType 
     793 
     794//      binType = V_GetBinningPopMode() 
    496795         
    497796        SetDataFolder $("root:Packages:NIST:VSANS:"+type)        
Note: See TracChangeset for help on using the changeset viewer.