Ignore:
Timestamp:
May 18, 2018 10:32:22 AM (5 years ago)
Author:
srkline
Message:

Significant restructuring of V_ExecuteProtocol to make the logic of the flow more tractable and adaptable in the future.

Added major change to VSANS event mode reduction panel to allow F and M binned events to be saved to a copy of the correspondng data file. A new data reduction panel for multiple slice reduction is now presented for Event data. This allows reduction of a single slice (all 8 F,M panels, back ignored), or all of the slices.

File:
1 edited

Legend:

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

    r1098 r1100  
    10091009 
    10101010 
    1011         PopupMenu popup_sam,pos={85,68},size={51,23},proc=SAMFilePopMenuProc 
     1011        PopupMenu popup_sam,pos={85,68},size={51,23},proc=V_SAMFilePopMenuProc 
    10121012        PopupMenu popup_sam,mode=1,value= #"V_getSAMList()"      
    1013         PopupMenu popup_bkg,pos={85,164},size={51,23},proc=BKGFilePopMenuProc 
     1013        PopupMenu popup_bkg,pos={85,164},size={51,23},proc=V_BKGFilePopMenuProc 
    10141014        PopupMenu popup_bkg,mode=1,value= #"V_getBGDList()" 
    1015         PopupMenu popup_emp,pos={85,213},size={51,23},proc=EMPFilePopMenuProc 
     1015        PopupMenu popup_emp,pos={85,213},size={51,23},proc=V_EMPFilePopMenuProc 
    10161016        PopupMenu popup_emp,mode=1,value= #"V_getEMPList()" 
    1017         PopupMenu popup_div,pos={85,263},size={51,23},proc=DIVFilePopMenuProc 
     1017        PopupMenu popup_div,pos={85,263},size={51,23},proc=V_DIVFilePopMenuProc 
    10181018        PopupMenu popup_div,mode=1,value= #"V_getDIVList()" 
    1019         PopupMenu popup_msk,pos={85,356},size={51,23},proc=MSKFilePopMenuProc 
     1019        PopupMenu popup_msk,pos={85,356},size={51,23},proc=V_MSKFilePopMenuProc 
    10201020        PopupMenu popup_msk,mode=1,value= #"V_getMSKList()"      
    10211021                 
     
    11281128 
    11291129 
    1130 Function SAMFilePopMenuProc(pa) : PopupMenuControl 
     1130Function V_SAMFilePopMenuProc(pa) : PopupMenuControl 
    11311131        STRUCT WMPopupAction &pa 
    11321132 
     
    11461146 
    11471147 
    1148 Function BKGFilePopMenuProc(pa) : PopupMenuControl 
     1148Function V_BKGFilePopMenuProc(pa) : PopupMenuControl 
    11491149        STRUCT WMPopupAction &pa 
    11501150 
     
    11631163End 
    11641164 
    1165 Function EMPFilePopMenuProc(pa) : PopupMenuControl 
     1165Function V_EMPFilePopMenuProc(pa) : PopupMenuControl 
    11661166        STRUCT WMPopupAction &pa 
    11671167 
     
    11801180End 
    11811181 
    1182 Function DIVFilePopMenuProc(pa) : PopupMenuControl 
     1182Function V_DIVFilePopMenuProc(pa) : PopupMenuControl 
    11831183        STRUCT WMPopupAction &pa 
    11841184 
     
    11971197End 
    11981198 
    1199 Function MSKFilePopMenuProc(pa) : PopupMenuControl 
     1199Function V_MSKFilePopMenuProc(pa) : PopupMenuControl 
    12001200        STRUCT WMPopupAction &pa 
    12011201 
     
    19111911        //11 = unused 
    19121912 
     1913////////////////////////////// 
     1914// DIV 
     1915////////////////////////////// 
    19131916// for VSANS, DIV is used on each data file as it is converted to WORK, so it needs to be 
    19141917//  the first thing in place, before any data or backgrounds are loaded 
    19151918 
    1916  
    1917 // 
    1918 // DONE: 
    1919 // x- this is no longer done after the COR step, and CAL is not produced as output of DIV        
    1920 // x- needs to be aware of the file name passed in 
    1921 // x- PromptForPath does not exist in VSANS. Need a better (automated) way to find the file. 
    1922  
    1923 //check for work.div file (prot[2]) 
    1924 //load in if needed 
    1925 // no math is done here, DIV is applied as files are converted to WORK (the first operation in VSANS) 
    1926 // 
    1927         String divFileName = "" 
    1928  
    1929         If(cmpstr("none",prot[2])!=0)           // if !0, then there's a file requested 
    1930                 If(cmpstr("ask",prot[2]) == 0) 
    1931                         //ask user for file 
    1932 //                       junkStr = PromptForPath("Select the detector sensitivity file") 
    1933                         Prompt divFileName,"DIV File",popup,V_GetDIVList() 
    1934                         DoPrompt "Select File",divFileName 
    1935  
    1936                         If(strlen(divFileName)==0) 
    1937                                 SetDataFolder root: 
    1938                                 Abort "No file selected, data reduction aborted" 
    1939                         Endif 
    1940                         V_LoadHDF5Data(divFileName,"DIV") 
    1941                 else 
    1942                         //assume it's a path, and that the first (and only) item is the path:file 
    1943                         //list processing is necessary to remove any final comma 
    1944                         junkStr = pathStr + StringFromList(0, prot[2],"," ) 
    1945                         V_LoadHDF5Data(junkStr,"DIV") 
    1946                 Endif 
    1947          
    1948         else 
    1949         // DIV step is being skipped 
    1950                 NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor 
    1951                 Variable saved_gDoDIVCor = gDoDIVCor 
    1952                 gDoDIVCor = 0                   // protocol says to turn it off for now (reset later) 
    1953         Endif 
    1954  
     1919        //check for work.div file (prot[2]) 
     1920        //load in if needed 
     1921        // no math is done here, DIV is applied as files are converted to WORK (the first operation in VSANS) 
     1922        // 
     1923 
     1924        // save the state of the DIV preference 
     1925        NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor 
     1926        Variable saved_gDoDIVCor = gDoDIVCor 
     1927         
     1928        err = V_Proto_LoadDIV(prot[2]) 
     1929         
     1930        if(err) 
     1931                SetDataFolder root: 
     1932                Abort "No file selected, data reduction aborted" 
     1933        endif 
     1934 
     1935////////////////////////////// 
     1936// SAM 
     1937////////////////////////////// 
    19551938 
    19561939// TODO: 
     
    19631946        activeType = "SAM" 
    19641947        msgStr = "Select sample data" 
    1965         //Ask for SAM file or parse 
    1966         do 
    1967                 if((cmpstr(samStr,"ask") == 0) || (cmpstr(samStr,"")==0) )              //zero if strings are equal 
    1968                         err = V_LoadHDF5Data("","RAW")          //will prompt for file 
    1969                         if(err) 
    1970                                 PathInfo/S catPathName 
    1971                                 Abort "reduction sequence aborted" 
    1972                         endif 
    1973                         V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
    1974                         err =  V_Raw_to_work(activeType)                //this is the first file (default) 
    1975                         //Ask for another SAM file 
    1976                         do 
    1977                                 DoAlert 1,"Do you want to add another Sample file?" 
    1978                                 if(V_flag == 1)         //yes 
    1979                                         err = V_LoadHDF5Data("","RAW")          //will prompt for file 
    1980                                         if(err) 
    1981                                                 PathInfo/S catPathName 
    1982                                                 Abort "reduction sequence aborted" 
    1983                                         endif 
    1984                                         V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
    1985                                         err = V_Add_raw_to_work(activeType) 
    1986                                         notDone = 1 
    1987                                 else 
    1988                                         notDone = 0 
    1989                                 endif 
    1990                         while(notDone) 
    1991                         break 
    1992                 Endif 
    1993                 //"none" is not an option - you always need a sample file - "none" will never return zero 
    1994                 //if not "ask" AND not "none" then try to parse the filenames 
    1995                 If((cmpstr(samStr,"none") != 0) && (cmpstr(samStr,"ask") != 0)) 
    1996                         //filesOK = AreFilesThere(activeType,samStr)            //return 1 if correct files are already there 
    1997                         filesOK = 0             // Feb 2008, always force a reload of files. Maybe slow, but always correct  
    1998                         if(!filesOK) 
    1999                                 //add the correct file(s) to SAM 
    2000                                  
    2001                                 // TODO: only one file is allowed currently 
    2002                                 err = V_AddFilesInList(activeType,samStr) 
    2003                                  
    2004                                 if(err) 
    2005                                         //Print "samstr = ",samStr 
    2006                                         Abort "SAM file not found, reset SAM file" 
    2007                                 Endif 
    2008                         Endif 
    2009                 Endif 
    2010         While(0) 
     1948         
     1949        err = V_Proto_LoadFile(samStr,activeType,msgStr) 
     1950        if(err) 
     1951                PathInfo/S catPathName 
     1952                SetDataFolder root: 
     1953                Abort "No file selected, data reduction aborted" 
     1954        endif 
     1955         
    20111956        // TODO 
    20121957        // -- this may not be the most reliable way to pass the file name (for naming of the saved file later) 
     
    20161961        //always update 
    20171962        V_UpdateDisplayInformation(ActiveType) 
    2018          
    2019         //check for bkg file  -- "ask" might not fail - "ask?" will - ? not allowed in VAX filenames 
     1963 
     1964 
     1965////////////////////////////// 
     1966// BGD 
     1967////////////////////////////// 
     1968         
     1969        //check for BGD file  -- "ask" might not fail - "ask?" will - ? not allowed in VAX filenames 
    20201970        // add if needed 
    20211971        //use a "case" statement 
    20221972        msgStr = "Select background file" 
    20231973        activeType = "BGD" 
    2024         do 
    2025                 if(cmpstr(prot[0],"ask") == 0)          //zero if strings are equal 
    2026                         err = V_LoadHDF5Data("","RAW")          //will prompt for file 
    2027                         if(err) 
    2028                                 PathInfo/S catPathName 
    2029                                 Abort "reduction sequence aborted" 
    2030                         endif 
    2031                         V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
    2032                         err =  V_Raw_to_work(activeType)                //this is the first file (default) 
    2033                         //Ask for another BGD file 
    2034                         do 
    2035                                 DoAlert 1,"Do you want to add another Background file?" 
    2036                                 if(V_flag == 1)         //yes 
    2037                                         err = V_LoadHDF5Data("","RAW")          //will prompt for file 
    2038                                         if(err) 
    2039                                                 PathInfo/S catPathName 
    2040                                                 Abort "reduction sequence aborted" 
    2041                                         endif 
    2042                                         V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
    2043                                         err = V_Add_raw_to_work(activeType) 
    2044                                         notDone = 1 
    2045                                 else 
    2046                                         notDone = 0 
    2047                                 endif 
    2048                         while(notDone) 
    2049                         V_UpdateDisplayInformation(ActiveType)  //update before breaking from loop 
    2050                         break 
    2051                 Endif 
    2052                 If(cmpstr(prot[0],"none") == 0) 
    2053                         //clean out the BKG folder? 
    2054                         //KillDataFolder root:BKG 
    2055                         //NewDataFolder/O root:BKG 
    2056                         break 
    2057                 Endif 
    2058                 //if not "ask" AND not "none" then try to parse the filenames 
    2059                 If((cmpstr(prot[0],"none") != 0) && (cmpstr(prot[0],"ask") != 0)) 
    2060                         //filesOK = AreFilesThere(activeType,prot[0]) 
    2061                         filesOK = 0             // Feb 2008, always force a reload of files. Maybe slow, but always correct  
    2062                         if(!filesOK) 
    2063                                 //add the correct file(s) to BGD 
    2064                                 string bgdStr = prot[0] 
    2065                                 err = V_AddFilesInList(activeType,bgdStr) 
    2066                                 If(err) 
    2067                                         Abort "BGD file not found. Reset BGD file list" 
    2068                                 Endif 
    2069                         Endif 
    2070                         V_UpdateDisplayInformation(ActiveType)          //update before breaking from loop 
    2071                 Endif 
    2072         While(0) 
    2073          
     1974         
     1975        err = V_Proto_LoadFile(prot[0],activeType,msgStr) 
     1976        if(err) 
     1977                PathInfo/S catPathName 
     1978                SetDataFolder root: 
     1979                Abort "No file selected, data reduction aborted" 
     1980        endif 
     1981 
     1982//      //Loader is in charge of updating, since it knows if data was loaded 
     1983//      V_UpdateDisplayInformation(ActiveType) 
     1984 
     1985 
     1986////////////////////////////// 
     1987// EMP 
     1988//////////////////////////////   
    20741989         
    20751990        //check for emp file (prot[1]) 
     
    20771992        msgStr = "Select empty cell data" 
    20781993        activeType = "EMP" 
    2079         do 
    2080                 if(cmpstr(prot[1],"ask") == 0) 
    2081                         err = V_LoadHDF5Data("","RAW")          //will prompt for file 
    2082                         if(err) 
    2083                                 PathInfo/S catPathName 
    2084                                 Abort "reduction sequence aborted" 
    2085                         endif 
    2086                         V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
    2087                         err =  V_Raw_to_work(activeType)                //this is the first file (default) 
    2088                         //Ask for another EMP file 
    2089                         do 
    2090                                 DoAlert 1,"Do you want to add another Empty Cell file?" 
    2091                                 if(V_flag == 1)         //yes 
    2092                                         err = V_LoadHDF5Data("","RAW")          //will prompt for file 
    2093                                         if(err) 
    2094                                                 PathInfo/S catPathName 
    2095                                                 Abort "reduction sequence aborted" 
    2096                                         endif 
    2097                                         V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
    2098                                         err = V_Add_raw_to_work(activeType) 
    2099                                         notDone = 1 
    2100                                 else 
    2101                                         notDone = 0 
    2102                                 endif 
    2103                         while(notDone) 
    2104                         V_UpdateDisplayInformation(ActiveType)          //update before breaking from loop 
    2105                         break 
    2106                 Endif 
    2107                 If(cmpstr(prot[1],"none") == 0) 
    2108                         //clean out the EMP folder? 
    2109                         //KillDataFolder root:Packages:NIST:EMP 
    2110                         //NewDataFolder/O root:Packages:NIST:EMP 
    2111                         break 
    2112                 Endif 
    2113                 //if not "ask" AND not "none" then try to parse the filenames 
    2114                 If((cmpstr(prot[1],"none") != 0) && (cmpstr(prot[1],"ask") != 0)) 
    2115                         //filesOK = AreFilesThere(activeType,prot[1]) 
    2116                         filesOK = 0             // Feb 2008, always force a reload of files. Maybe slow, but always correct  
    2117                         if(!filesOK) 
    2118                                 //add the correct file(s) to BGD 
    2119                                 err = V_AddFilesInList(activeType,prot[1]) 
    2120                                 If(err) 
    2121                                         Abort "EMP file not found. Reset EMP file list" 
    2122                                 Endif 
    2123                         Endif 
    2124                         V_UpdateDisplayInformation(ActiveType)  //update before breaking from loop 
    2125                 Endif 
    2126         While(0) 
    2127          
     1994         
     1995        err = V_Proto_LoadFile(prot[1],activeType,msgStr) 
     1996        if(err) 
     1997                PathInfo/S catPathName 
     1998                SetDataFolder root: 
     1999                Abort "No file selected, data reduction aborted" 
     2000        endif 
     2001 
     2002//      //Loader is in charge of updating, since it knows if data was loaded 
     2003//      V_UpdateDisplayInformation(ActiveType) 
     2004 
     2005 
     2006////////////////////////////// 
     2007// CORRECT 
     2008////////////////////////////// 
     2009 
    21282010        //do the CORRECT step based on the answers to emp and bkg subtraction 
    21292011        //by setting the proper"mode" 
     
    21632045//      endif 
    21642046 
    2165  
    2166          
    21672047        //dispatch to the proper "mode" of Correct() 
    2168         Variable mode=4,val 
    2169         do 
    2170                 if( (cmpstr("none",prot[0]) == 0)       && (cmpstr("none",prot[1]) == 0) ) 
    2171                         //no subtraction (mode = 4), 
    2172                         mode = 4 
    2173                 Endif 
    2174                 If((cmpstr(prot[0],"none") != 0) && (cmpstr(prot[1],"none") == 0)) 
    2175                         //subtract BGD only 
    2176                         mode=2 
    2177                 Endif 
    2178                 If((cmpstr(prot[0],"none") == 0) && (cmpstr(prot[1],"none") != 0)) 
    2179                         //subtract EMP only 
    2180                         mode=3 
    2181                 Endif 
    2182                 If((cmpstr(prot[0],"none") != 0) && (cmpstr(prot[1],"none") != 0)) 
    2183                         // bkg and emp subtraction are to be done (BOTH not "none") 
    2184                         mode=1 
    2185                 Endif 
    2186                 activeType = "COR" 
    2187                 //add in DRK mode (0= no used, 10 = used) 
    2188                 val = NumberByKey("DRKMODE",prot[6],"=","," ) 
    2189                 mode += val 
    2190 //              print "mode = ",mode 
    2191                 err = V_Correct(mode) 
    2192                 if(err) 
    2193                         SetDataFolder root: 
    2194                         Abort "error in Correct, called from executeprotocol, normal cor" 
    2195                 endif 
    2196                 V_UpdateDisplayInformation(ActiveType)          //update before breaking from loop 
    2197         While(0) 
    2198  
    2199  
    2200 //////////////////////////////////////////////////////// 
    2201 // Absolute scale 
    2202  
    2203 // x- calculation works, needs proper inputs (solid angle aware) 
    2204 // x-   Open beam method needs to be verified in V_AskForAbsoluteParams_Quest() 
    2205         Variable c2,c3,c4,c5,kappa_err 
    2206         //do absolute scaling if desired 
    2207 //              DoAlert 0,"Abs step incomplete" 
    2208  
    2209         if(cmpstr("none",prot[4])!=0) 
    2210                 if(cmpstr("ask",prot[4])==0) 
    2211                         //get the params from the user 
    2212                         Execute "V_AskForAbsoluteParams_Quest()" 
    2213                         //then from the list 
    2214                         SVAR junkAbsStr = root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr 
    2215                         c2 = NumberByKey("TSTAND", junkAbsStr, "=", ";")        //parse the list of values 
    2216                         c3 = NumberByKey("DSTAND", junkAbsStr, "=", ";") 
    2217                         c4 = NumberByKey("IZERO", junkAbsStr, "=", ";") 
    2218                         c5 = NumberByKey("XSECT", junkAbsStr, "=", ";") 
    2219                         kappa_err = NumberByKey("SDEV", junkAbsStr, "=", ";") 
    2220                 else 
    2221                         //get the parames from the list 
    2222                         c2 = NumberByKey("TSTAND", prot[4], "=", ";")   //parse the list of values 
    2223                         c3 = NumberByKey("DSTAND", prot[4], "=", ";") 
    2224                         c4 = NumberByKey("IZERO", prot[4], "=", ";") 
    2225                         c5 = NumberByKey("XSECT", prot[4], "=", ";") 
    2226                         kappa_err = NumberByKey("SDEV", prot[4], "=", ";") 
    2227                 Endif 
    2228                 //get the sample trans and thickness from the activeType folder 
    2229                 Variable c0 = V_getSampleTransmission(activeType)               //sample transmission 
    2230                 Variable c1 = V_getSampleThickness(activeType)          //sample thickness 
    2231                  
    2232                 err = V_Absolute_Scale(activeType,c0,c1,c2,c3,c4,c5,kappa_err) 
    2233                 if(err) 
    2234                         SetDataFolder root: 
    2235                         Abort "Error in V_Absolute_Scale(), called from V_ExecuteProtocol" 
    2236                 endif 
    2237                 activeType = "ABS" 
    2238                 V_UpdateDisplayInformation(ActiveType)                  //update before breaking from loop 
    2239         Endif 
    2240  
     2048//      V_Dispatch_to_Correct(bgdStr,empStr,drkStr) 
     2049        V_Dispatch_to_Correct(prot[0],prot[1],prot[6]) 
     2050         
     2051        if(err) 
     2052                PathInfo/S catPathName 
     2053                SetDataFolder root: 
     2054                Abort "error in Correct, called from executeprotocol, normal cor" 
     2055        endif 
     2056        activeType = "COR" 
     2057 
     2058// always update - COR will always be generated 
     2059        V_UpdateDisplayInformation(ActiveType)           
     2060 
     2061 
     2062////////////////////////////// 
     2063//  ABSOLUTE SCALE 
     2064////////////////////////////// 
     2065 
     2066        err = V_Proto_ABS_Scale(prot[4],activeType)             //activeType is pass-by-reference and updated IF ABS is used 
     2067         
     2068        if(err) 
     2069                SetDataFolder root: 
     2070                Abort "Error in V_Absolute_Scale(), called from V_ExecuteProtocol" 
     2071        endif 
     2072//      activeType = "ABS" 
     2073 
     2074 
     2075////////////////////////////// 
     2076// MASK 
     2077////////////////////////////// 
    22412078// 
    22422079// DONE 
     
    22452082// x- the regular case of the file name specified by the protocol works correctly 
    22462083// x- don't create a null mask if not used, it will handle the error and print out that the mask is missing 
    2247  
    2248 //mask data if desired (this is done automatically when the data is binned to I(q)) and is 
     2084// 
     2085//mask data if desired (mask is applied when the data is binned to I(q)) and is 
    22492086//not done explicitly here 
    22502087         
    22512088        //check for mask 
    22522089        //doesn't change the activeType 
    2253         String mskFileName="" 
    2254          
    2255         if(cmpstr("none",prot[3])!=0) 
    2256                 If(cmpstr("ask",prot[3])==0) 
    2257                         //get file from user 
    2258                         // x- fill in the get file prompt, and handle the result 
    2259                         Prompt mskFileName,"MASK File",popup,V_PickMASKButton("") 
    2260                         DoPrompt "Select File",mskFileName 
    2261 //                      if (V_Flag) 
    2262 //                              return 0                                                                        // user cancelled 
    2263 //                      endif 
    2264  
    2265                         If(strlen(mskFileName)==0)              //use cancelled 
    2266                                 //if none desired, make sure that the old mask is deleted 
    2267                                 KillDataFolder/Z root:Packages:NIST:VSANS:MSK: 
    2268                                 NewDataFolder/O root:Packages:NIST:VSANS:MSK 
    2269                                  
    2270                                 DoAlert 0,"No Mask file selected, data not masked" 
    2271                         else 
    2272                                 //read in the file from the selection 
    2273                                 V_LoadHDF5Data(mskFileName,"MSK") 
    2274                         Endif 
    2275                 else 
    2276                         //just read it in from the protocol 
    2277                         //list processing is necessary to remove any final comma 
    2278                         mskFileName = pathStr + StringFromList(0, prot[3],"," ) 
    2279                         V_LoadHDF5Data(mskFileName,"MSK") 
    2280                 Endif 
    2281                  
    2282         else 
    2283                 //if none desired, make sure that the old mask is deleted 
    2284 // TODO 
    2285 // x- clean out the data folder 
    2286 // x- note that V_KillNamedDataFolder() points to RawVSANS, and won't work 
    2287 // -- what happens if the kill fails? need error handling 
    2288 // 
    2289                 KillDataFolder/Z root:Packages:NIST:VSANS:MSK: 
    2290                 NewDataFolder/O root:Packages:NIST:VSANS:MSK 
    2291  
    2292         Endif 
    2293          
     2090        V_Proto_ReadMask(prot[3]) 
     2091 
     2092         
     2093////////////////////////////// 
     2094// AVERAGING 
     2095////////////////////////////// 
    22942096 
    22952097        // average/save data as specified 
     
    23102112                Endif 
    23112113        Endif 
     2114 
     2115 
     2116        String detGroup = StringByKey("DETGROUP",prot[5],"=",";")               //only for annular, null if not present 
     2117 
    23122118         
    23132119//convert the folder to linear scale before averaging, then revert by calling the window hook 
    23142120// (not needed for VSANS, data is always linear scale) 
    2315  
    2316 // 
    2317 //       x- need to convert BINTYPE keyword into a numerical value to pass 
    2318 // 
    23192121 
    23202122// 
     
    23492151        String collimationStr 
    23502152        collimationStr = V_IdentifyCollimation(activeType) 
    2351  
    2352  
     2153         
    23532154 
    23542155//////////////////////////////////////// 
    2355 // dispatch to averaging and resolution 
     2156// DISPATCH TO AVERAGING 
    23562157///////////////////////////////////////// 
    23572158// 
    23582159// TODO: 
    2359 // -- do I calculate the proper resolution here? I've already decoded the binning type 
     2160// -- do I calculate the proper resolution here?, YES, I've already decoded the binning type 
    23602161//   and the averaging type has been specified by the protocol. 
    23612162// 
    2362 // currently, the resolution is calculated every time that the data is averaged (in VC_fDoBinning_QxQy2D) 
     2163// so currently, the resolution is calculated every time that the data is averaged (in VC_fDoBinning_QxQy2D) 
    23632164// 
    23642165// -- if I calculate the resolution here, then the Trimming routines must be updated 
     
    23672168//    a different solution 
    23682169// 
    2369         strswitch(av_type)      //dispatch to the proper routine to average to 1D data 
    2370                 case "none":             
    2371                         //still do nothing 
    2372                         // set binType and binTypeStr to bad flags 
    2373                         binTypeStr = "none" 
    2374                         binType = -999999 
    2375                         break                    
    2376  
    2377                 case "Circular": 
    2378                         V_QBinAllPanels_Circular(activeType,binType,collimationStr)             // this does a default circular average 
    2379                         break 
    2380                          
    2381                 case "Sector": 
    2382 //                      CircularAverageTo1D(activeType) 
    2383                         break 
    2384                 case "Sector_PlusMinus": 
    2385 //                      Sector_PlusMinus1D(activeType) 
    2386                         break 
    2387                 case "Rectangular": 
    2388 //                      RectangularAverageTo1D(activeType) 
    2389                         break 
    2390  
    2391                 case "Annular": 
    2392                         String detGroup = StringByKey("DETGROUP",prot[5],"=",";") 
    2393                         Variable qCtr_Ann = NumberByKey("QCENTER",prot[5],"=",";") 
    2394                         Variable qWidth = NumberByKey("QDELTA",prot[5],"=",";") 
    2395                         V_QBinAllPanels_Annular(activeType,detGroup,qCtr_Ann,qWidth) 
    2396                         break 
    2397  
    2398                 case "Narrow_Slit": 
    2399                         V_QBinAllPanels_Slit(activeType,binType)                // this does a tall, narrow slit average 
    2400                         break 
    2401                          
    2402                 case "2D_ASCII":         
    2403                         //do nothing 
    2404                         break 
    2405                 case "QxQy_ASCII": 
    2406                         //do nothing 
    2407                         break 
    2408                 case "PNG_Graphic": 
    2409                         //do nothing 
    2410                         break 
    2411                 default:         
    2412                         //do nothing 
    2413         endswitch 
     2170 
     2171        V_Proto_doAverage(prot[5],av_type,activeType,binType,collimationStr) 
    24142172 
    24152173 
    24162174 
    24172175//////////////////////// 
    2418 // plotting of the data, another strswitch (with an if() out front) 
     2176// PLOT THE DATA 
    24192177//////////////////////// 
    24202178 
    2421         String doPlot = StringByKey("PLOT",prot[5],"=",";") 
    2422          
    2423         If( (cmpstr(doPlot,"Yes")==0) && (cmpstr(av_type,"none") != 0) )         
    2424                  
    2425                 strswitch(av_type)      //dispatch to the proper routine to PLOT 1D data 
    2426                         case "none":             
    2427                                 //still do nothing 
    2428                                 break                    
    2429  
    2430                         case "Circular": 
    2431                                 V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY) 
    2432                                 V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned                              
    2433                                 break 
    2434                         case "Sector": 
    2435         //                      CircularAverageTo1D(activeType) 
    2436                                 break 
    2437                         case "Sector_PlusMinus": 
    2438         //                      Sector_PlusMinus1D(activeType) 
    2439                                 break 
    2440                         case "Rectangular": 
    2441         //                      RectangularAverageTo1D(activeType) 
    2442                                 break 
    2443  
    2444                         case "Annular": 
    2445                                 V_Phi_Graph_Proc(activeType,detGroup) 
    2446                                 break 
    2447  
    2448                         case "Narrow_Slit": 
    2449                         // these are the same plotting routines as for standard circular average 
    2450                                 V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY) 
    2451                                 V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned 
    2452                                 break 
    2453                          
    2454                         case "2D_ASCII":         
    2455                                 //do nothing 
    2456                                 break 
    2457                         case "QxQy_ASCII": 
    2458                                 //do nothing 
    2459                                 break 
    2460                         case "PNG_Graphic": 
    2461                                 //do nothing 
    2462                                 break 
    2463                         default:         
    2464                                 //do nothing 
    2465                 endswitch 
    2466  
    2467         endif           // end of plotting switch 
    2468  
    2469  
     2179        V_Proto_doPlot(prot[5],av_type,activeType,binType,detGroup) 
     2180         
     2181         
    24702182 
    24712183////////////////////     
    2472 //save data if desired - dispatch as needed 
     2184// SAVE THE DATA 
    24732185//////////////////// 
    24742186 
     
    24772189//    local variable samFileLoaded is the file name loaded (contains the extension) 
    24782190// 
    2479         String fullpath = "", newfileName="" 
    2480         String saveType = StringByKey("SAVE",prot[5],"=",";")           //does user want to save data? 
    2481  
    2482         If( (cmpstr(saveType[0,2],"Yes")==0) && (cmpstr(av_type,"none") != 0) )          
    2483                 //then save 
    2484                 newFileName = RemoveEnding(samFileLoaded,".nxs.ngv") 
    2485                  
    2486                 //pick ABS or AVE extension 
    2487                 String exten = activeType 
    2488                 if(cmpstr(exten,"ABS") != 0) 
    2489                         exten = "AVE" 
    2490                 endif 
    2491 //              if(cmpstr(av_type,"2D_ASCII") == 0) 
    2492 //                      exten = "ASC" 
    2493 //              endif 
    2494 //              if(cmpstr(av_type,"QxQy_ASCII") == 0) 
    2495 //                      exten = "DAT" 
    2496 //              endif 
    2497                  
    2498 //              // add an "x" to the file extension if the output is XML 
    2499 //              // currently (2010), only for ABS and AVE (1D) output 
    2500 //              if( cmpstr(exten,"ABS") == 0 || cmpstr(exten,"AVE") == 0 ) 
    2501 //                      if(useXMLOutput == 1) 
    2502 //                              exten += "x" 
    2503 //                      endif 
    2504 //              endif 
    2505                                  
    2506                 //Path is catPathName, symbolic path 
    2507                 //if this doesn't exist, a dialog will be presented by setting dialog = 1 
    2508                 // 
    2509                 Variable dialog = 0 
    2510  
    2511                 PathInfo/S catPathName 
    2512                 String item = StringByKey("NAME",prot[5],"=",";")               //Auto or Manual naming 
    2513                 String autoname = StringByKey("AUTONAME",prot[5],"=",";")               //autoname -  will get empty string if not present 
    2514                 If((cmpstr(item,"Manual")==0) || (cmpstr(newFileName,"") == 0)) 
    2515                         //manual name if requested or if no name can be derived from header 
    2516                         fullPath = newfileName + "."+ exten //puts possible new name or null string in dialog 
    2517                         dialog = 1              //force dialog for user to enter name 
    2518                 else 
    2519                         //auto-generate name and prepend path - won't put up any dialogs since it has all it needs 
    2520                         //use autoname if present 
    2521                         if (cmpstr(autoname,"") != 0) 
    2522                                 fullPath = S_Path + autoname + "." +exten 
    2523                         else 
    2524                                 fullPath = S_Path + newFileName+"." + exten 
    2525                         endif    
    2526                 Endif 
    2527                 // 
    2528                 strswitch(av_type)       
    2529                         case "Annular": 
    2530                                 V_fWrite1DAnnular("root:Packages:NIST:VSANS:",activeType,detGroup,newFileName+".phi") 
    2531                                 Print "data written to:  "+ newFileName+".phi" 
    2532  
    2533                                 break 
    2534  
    2535                         case "Circular":                //in SANS, this was the default, but is dangerous, so make it explicit here 
    2536                         case "Sector":          // TODO: this falls through - which luckily works for now... 
    2537                         case "Rectangular":             // TODO: this falls through - which luckily works for now... 
    2538                         case "Narrow_Slit":             // TODO: this falls through - which luckily works for now... 
    2539  
    2540 // no VSANS support of XML output at this point                  
    2541 //                              if (useXMLOutput == 1) 
    2542 //                                      WriteXMLWaves_W_Protocol(activeType,fullPath,dialog) 
    2543 //                              else 
    2544 //                                      WriteWaves_W_Protocol(activeType,fullpath,dialog) 
    2545 //                              endif 
    2546 // 
    2547                                 if(cmpstr(saveType,"Yes - Concatenate")==0) 
    2548                                         V_Trim1DDataStr(activeType,binType,prot[7],prot[8])                     // x- passing null strings uses global or default trim values 
    2549  
    2550                                         V_ConcatenateForSave("root:Packages:NIST:VSANS:",activeType,"",binType)         // this removes q=0 point, concatenates, sorts 
    2551                                  
    2552                                         prot[9] = collimationStr 
    2553                                          
    2554                                         V_Write1DData("root:Packages:NIST:VSANS:",activeType,newFileName+"."+exten)             //don't pass the full path, just the name 
    2555                                  
    2556                                 endif 
    2557                                  
    2558                                 if(cmpstr(saveType,"Yes - Individual")==0) 
    2559                                         // remove the q=0 point from the back detector, if it's there 
    2560                                         // does not trim any other points from the data 
    2561                                         V_RemoveQ0_B(activeType) 
    2562                                         V_Write1DData_ITX("root:Packages:NIST:VSANS:",activeType,newFileName,binType) 
    2563                                 endif 
    2564                                 Print "data written to:  "+ newFileName+"."+exten 
    2565  
    2566                                 break 
    2567          
    2568                                  
    2569                                 case "2D_ASCII": 
    2570 //                              Fast2DExport(activeType,fullPath,dialog) 
    2571                                 break 
    2572                         case "QxQy_ASCII": 
    2573 //                              QxQy_Export(activeType,fullPath,dialog) 
    2574                                 break 
    2575                         case "PNG_Graphic": 
    2576 //                              SaveAsPNG(activeType,fullpath,dialog) 
    2577                                 break 
    2578  
    2579                         default: 
    2580                                 DoAlert 0, "av_type not found in dispatch to write file" 
    2581                 endswitch 
    2582                  
    2583         Endif 
    2584          
    2585         //done with everything in protocol list 
    2586          
     2191// V_Proto_SaveFile(avgStr,activeType,samFileLoaded,av_type,binType,detGroup,trimBegStr,trimEndStr) 
     2192 
     2193        prot[9] = collimationStr 
     2194 
     2195        V_Proto_SaveFile(prot[5],activeType,samFileLoaded,av_type,binType,detGroup,prot[7],prot[8]) 
     2196         
     2197////////////////////////////// 
     2198// DONE WITH THE PROTOCOL 
     2199//////////////////////////////   
    25872200         
    25882201        // reset any global preferences that I had changed 
     
    30302643        return(0) 
    30312644end 
     2645 
     2646 
     2647/////////////////////////////////////// 
     2648// 
     2649// individual steps in the protocol 
     2650// 
     2651////////////////////////////////////// 
     2652 
     2653Function V_Proto_LoadDIV(protStr) 
     2654        String protStr 
     2655         
     2656        String divFileName = "",junkStr="",pathStr="" 
     2657        PathInfo catPathName                    //this is where the files are 
     2658        pathStr=S_path 
     2659 
     2660        If(cmpstr("none",protStr)!=0)           // if !0, then there's a file requested 
     2661                If(cmpstr("ask",protStr) == 0) 
     2662                        //ask user for file 
     2663//                       junkStr = PromptForPath("Select the detector sensitivity file") 
     2664                        Prompt divFileName,"DIV File",popup,V_GetDIVList() 
     2665                        DoPrompt "Select File",divFileName 
     2666 
     2667                        If(strlen(divFileName)==0) 
     2668                                // 
     2669                                return(1)               //error 
     2670//                              SetDataFolder root: 
     2671//                              Abort "No file selected, data reduction aborted" 
     2672                        Endif 
     2673                        V_LoadHDF5Data(divFileName,"DIV") 
     2674                else 
     2675                        //assume it's a path, and that the first (and only) item is the path:file 
     2676                        //list processing is necessary to remove any final comma 
     2677                        junkStr = pathStr + StringFromList(0, protStr,"," ) 
     2678                        V_LoadHDF5Data(junkStr,"DIV") 
     2679                Endif 
     2680         
     2681        else 
     2682        // DIV step is being skipped 
     2683                NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor 
     2684//              Variable saved_gDoDIVCor = gDoDIVCor 
     2685                gDoDIVCor = 0                   // protocol says to turn it off for now (reset later) 
     2686        Endif 
     2687         
     2688        return(0) 
     2689End 
     2690 
     2691// 
     2692// fileStr is the file name (or list of names) 
     2693// activeType is the target work folder 
     2694// msgStr is the string for the prompt 
     2695// 
     2696Function V_Proto_LoadFile(fileStr,activeType,msgStr) 
     2697        String fileStr,activeType,msgStr 
     2698         
     2699        Variable err,filesOK,notDone 
     2700         
     2701        //Ask for Type file or parse 
     2702        do 
     2703                if((cmpstr(fileStr,"ask") == 0) || (cmpstr(fileStr,"")==0) )            //zero if strings are equal 
     2704                        err = V_LoadHDF5Data("","RAW")          //will prompt for file 
     2705                        if(err) 
     2706                                return(err)     //error 
     2707                                //PathInfo/S catPathName 
     2708                                //Abort "reduction sequence aborted" 
     2709                        endif 
     2710                        V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
     2711                        err =  V_Raw_to_work(activeType)                //this is the first file (default) 
     2712                        //Ask for another TYPE file 
     2713                        do 
     2714                                DoAlert 1,"Do you want to add another "+activeType+" file?" 
     2715                                if(V_flag == 1)         //yes 
     2716                                        err = V_LoadHDF5Data("","RAW")          //will prompt for file 
     2717                                        if(err) 
     2718                                                return(1)               //error 
     2719                                                //PathInfo/S catPathName 
     2720                                                //Abort "reduction sequence aborted" 
     2721                                        endif 
     2722                                        V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded 
     2723                                        err = V_Add_raw_to_work(activeType) 
     2724                                        notDone = 1 
     2725                                else 
     2726                                        notDone = 0 
     2727                                endif 
     2728                        while(notDone) 
     2729                        //Loader is in charge of updating, since it knows if data was loaded 
     2730                        V_UpdateDisplayInformation(ActiveType) 
     2731                        break 
     2732                Endif 
     2733                //"none" is not an option - you always need a sample file - "none" will never return zero 
     2734                //if not "ask" AND not "none" then try to parse the filenames 
     2735                If((cmpstr(fileStr,"none") != 0) && (cmpstr(fileStr,"ask") != 0)) 
     2736                        //filesOK = AreFilesThere(activeType,fileStr)           //return 1 if correct files are already there 
     2737                        filesOK = 0             // Feb 2008, always force a reload of files. Maybe slow, but always correct  
     2738                        if(!filesOK) 
     2739                                //add the correct file(s) to Type 
     2740                                 
     2741                                // TODO: only one file is allowed currently 
     2742                                err = V_AddFilesInList(activeType,fileStr) 
     2743                                 
     2744                                if(err) 
     2745                                        //Print "fileStr = ",fileStr 
     2746                                        DoAlert 0, fileStr + " file not found, reset file" 
     2747                                        return(err)             //error 
     2748                                Endif 
     2749                        Endif 
     2750                        //Loader is in charge of updating, since it knows if data was loaded 
     2751                        V_UpdateDisplayInformation(ActiveType) 
     2752                Endif 
     2753        While(0) 
     2754         
     2755 
     2756         
     2757        return(0) 
     2758End 
     2759 
     2760Function V_Dispatch_to_Correct(bgdStr,empStr,drkStr) 
     2761        String bgdStr,empStr,drkStr 
     2762         
     2763        Variable mode=4,val,err 
     2764         
     2765        if( (cmpstr("none",bgdStr) == 0)        && (cmpstr("none",empStr) == 0) ) 
     2766        //no subtraction (mode = 4), 
     2767                mode = 4 
     2768        Endif 
     2769        If((cmpstr(bgdStr,"none") != 0) && (cmpstr(empStr,"none") == 0)) 
     2770                //subtract BGD only 
     2771                mode=2 
     2772        Endif 
     2773        If((cmpstr(bgdStr,"none") == 0) && (cmpstr(empStr,"none") != 0)) 
     2774                //subtract EMP only 
     2775                mode=3 
     2776        Endif 
     2777        If((cmpstr(bgdStr,"none") != 0) && (cmpstr(empStr,"none") != 0)) 
     2778                // bkg and emp subtraction are to be done (BOTH not "none") 
     2779                mode=1 
     2780        Endif 
     2781//      activeType = "COR" 
     2782        //add in DRK mode (0= not used, 10 = used) 
     2783        val = NumberByKey("DRKMODE",drkStr,"=","," ) 
     2784        mode += val 
     2785//              print "mode = ",mode 
     2786        err = V_Correct(mode) 
     2787        if(err) 
     2788                return(err) 
     2789//              SetDataFolder root: 
     2790//              Abort "error in Correct, called from executeprotocol, normal cor" 
     2791        endif 
     2792 
     2793//      //Loader is in charge of updating, since it knows if data was loaded 
     2794//      V_UpdateDisplayInformation("COR") 
     2795 
     2796         
     2797        return(0) 
     2798End 
     2799 
     2800 
     2801 
     2802 
     2803Function V_Proto_ABS_Scale(absStr,activeType) 
     2804        String absStr,&activeType 
     2805         
     2806        Variable c2,c3,c4,c5,kappa_err,err 
     2807        //do absolute scaling if desired 
     2808//              DoAlert 0,"Abs step incomplete" 
     2809 
     2810        if(cmpstr("none",absStr)!=0) 
     2811                if(cmpstr("ask",absStr)==0) 
     2812                        //get the params from the user 
     2813                        Execute "V_AskForAbsoluteParams_Quest()" 
     2814                        //then from the list 
     2815                        SVAR junkAbsStr = root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr 
     2816                        c2 = NumberByKey("TSTAND", junkAbsStr, "=", ";")        //parse the list of values 
     2817                        c3 = NumberByKey("DSTAND", junkAbsStr, "=", ";") 
     2818                        c4 = NumberByKey("IZERO", junkAbsStr, "=", ";") 
     2819                        c5 = NumberByKey("XSECT", junkAbsStr, "=", ";") 
     2820                        kappa_err = NumberByKey("SDEV", junkAbsStr, "=", ";") 
     2821                else 
     2822                        //get the parames from the list 
     2823                        c2 = NumberByKey("TSTAND", absStr, "=", ";")    //parse the list of values 
     2824                        c3 = NumberByKey("DSTAND", absStr, "=", ";") 
     2825                        c4 = NumberByKey("IZERO", absStr, "=", ";") 
     2826                        c5 = NumberByKey("XSECT", absStr, "=", ";") 
     2827                        kappa_err = NumberByKey("SDEV", absStr, "=", ";") 
     2828                Endif 
     2829                //get the sample trans and thickness from the activeType folder 
     2830                Variable c0 = V_getSampleTransmission(activeType)               //sample transmission 
     2831                Variable c1 = V_getSampleThickness(activeType)          //sample thickness 
     2832                 
     2833                err = V_Absolute_Scale(activeType,c0,c1,c2,c3,c4,c5,kappa_err) 
     2834                if(err) 
     2835                        return(err) 
     2836                        SetDataFolder root: 
     2837                        Abort "Error in V_Absolute_Scale(), called from V_ExecuteProtocol" 
     2838                endif 
     2839                activeType = "ABS" 
     2840                V_UpdateDisplayInformation(ActiveType)                  //update before breaking from loop 
     2841        Endif 
     2842         
     2843        return(0) 
     2844End 
     2845 
     2846 
     2847Function V_Proto_ReadMask(maskStr) 
     2848        String maskStr 
     2849         
     2850        //check for mask 
     2851        //doesn't change the activeType 
     2852        String mskFileName="",pathStr="" 
     2853        PathInfo catPathName                    //this is where the files are 
     2854        pathStr=S_path 
     2855                 
     2856        if(cmpstr("none",maskStr)!=0) 
     2857                If(cmpstr("ask",maskStr)==0) 
     2858                        //get file from user 
     2859                        // x- fill in the get file prompt, and handle the result 
     2860                        Prompt mskFileName,"MASK File",popup,V_PickMASKButton("") 
     2861                        DoPrompt "Select File",mskFileName 
     2862//                      if (V_Flag) 
     2863//                              return 0                                                                        // user cancelled 
     2864//                      endif 
     2865 
     2866                        If(strlen(mskFileName)==0)              //use cancelled 
     2867                                //if none desired, make sure that the old mask is deleted 
     2868                                KillDataFolder/Z root:Packages:NIST:VSANS:MSK: 
     2869                                NewDataFolder/O root:Packages:NIST:VSANS:MSK 
     2870                                 
     2871                                DoAlert 0,"No Mask file selected, data not masked" 
     2872                        else 
     2873                                //read in the file from the selection 
     2874                                V_LoadHDF5Data(mskFileName,"MSK") 
     2875                        Endif 
     2876                else 
     2877                        //just read it in from the protocol 
     2878                        //list processing is necessary to remove any final comma 
     2879                        mskFileName = pathStr + StringFromList(0, maskStr,"," ) 
     2880                        V_LoadHDF5Data(mskFileName,"MSK") 
     2881                Endif 
     2882                 
     2883        else 
     2884                //if none desired, make sure that the old mask is deleted 
     2885// TODO 
     2886// x- clean out the data folder 
     2887// x- note that V_KillNamedDataFolder() points to RawVSANS, and won't work 
     2888// -- what happens if the kill fails? need error handling 
     2889// 
     2890                KillDataFolder/Z root:Packages:NIST:VSANS:MSK: 
     2891                NewDataFolder/O root:Packages:NIST:VSANS:MSK 
     2892 
     2893        Endif 
     2894         
     2895        return(0) 
     2896End 
     2897 
     2898 
     2899Function V_Proto_doAverage(avgStr,av_type,activeType,binType,collimationStr) 
     2900        String avgStr,av_type,activeType 
     2901        Variable binType 
     2902        String collimationStr 
     2903         
     2904         
     2905        strswitch(av_type)      //dispatch to the proper routine to average to 1D data 
     2906                case "none":             
     2907                        //still do nothing 
     2908                        // set binType and binTypeStr to bad flags 
     2909                        String binTypeStr = "none" 
     2910                        binType = -999999 
     2911                        break                    
     2912 
     2913                case "Circular": 
     2914                        V_QBinAllPanels_Circular(activeType,binType,collimationStr)             // this does a default circular average 
     2915                        break 
     2916                         
     2917                case "Sector": 
     2918//                      CircularAverageTo1D(activeType) 
     2919                        break 
     2920                case "Sector_PlusMinus": 
     2921//                      Sector_PlusMinus1D(activeType) 
     2922                        break 
     2923                case "Rectangular": 
     2924//                      RectangularAverageTo1D(activeType) 
     2925                        break 
     2926 
     2927                case "Annular": 
     2928                        String detGroup = StringByKey("DETGROUP",avgStr,"=",";") 
     2929                        Variable qCtr_Ann = NumberByKey("QCENTER",avgStr,"=",";") 
     2930                        Variable qWidth = NumberByKey("QDELTA",avgStr,"=",";") 
     2931                        V_QBinAllPanels_Annular(activeType,detGroup,qCtr_Ann,qWidth) 
     2932                        break 
     2933 
     2934                case "Narrow_Slit": 
     2935                        V_QBinAllPanels_Slit(activeType,binType)                // this does a tall, narrow slit average 
     2936                        break 
     2937                         
     2938                case "2D_ASCII":         
     2939                        //do nothing 
     2940                        break 
     2941                case "QxQy_ASCII": 
     2942                        //do nothing 
     2943                        break 
     2944                case "PNG_Graphic": 
     2945                        //do nothing 
     2946                        break 
     2947                default:         
     2948                        //do nothing 
     2949        endswitch 
     2950 
     2951         
     2952        return(0) 
     2953End 
     2954 
     2955 
     2956 
     2957 
     2958 
     2959Function V_Proto_doPlot(plotStr,av_type,activeType,binType,detGroup) 
     2960        String plotStr,av_type,activeType 
     2961        Variable binType 
     2962        String detGroup 
     2963         
     2964        String doPlot = StringByKey("PLOT",plotStr,"=",";") 
     2965         
     2966        If( (cmpstr(doPlot,"Yes")==0) && (cmpstr(av_type,"none") != 0) )         
     2967                 
     2968                strswitch(av_type)      //dispatch to the proper routine to PLOT 1D data 
     2969                        case "none":             
     2970                                //still do nothing 
     2971                                break                    
     2972 
     2973                        case "Circular": 
     2974                                V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY) 
     2975                                V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned                              
     2976                                break 
     2977                        case "Sector": 
     2978        //                      CircularAverageTo1D(activeType) 
     2979                                break 
     2980                        case "Sector_PlusMinus": 
     2981        //                      Sector_PlusMinus1D(activeType) 
     2982                                break 
     2983                        case "Rectangular": 
     2984        //                      RectangularAverageTo1D(activeType) 
     2985                                break 
     2986 
     2987                        case "Annular": 
     2988                                V_Phi_Graph_Proc(activeType,detGroup) 
     2989                                break 
     2990 
     2991                        case "Narrow_Slit": 
     2992                        // these are the same plotting routines as for standard circular average 
     2993                                V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY) 
     2994                                V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned 
     2995                                break 
     2996                         
     2997                        case "2D_ASCII":         
     2998                                //do nothing 
     2999                                break 
     3000                        case "QxQy_ASCII": 
     3001                                //do nothing 
     3002                                break 
     3003                        case "PNG_Graphic": 
     3004                                //do nothing 
     3005                                break 
     3006                        default:         
     3007                                //do nothing 
     3008                endswitch 
     3009 
     3010        endif           // end of plotting switch 
     3011         
     3012        return(0) 
     3013end 
     3014 
     3015 
     3016Function V_Proto_SaveFile(avgStr,activeType,samFileLoaded,av_type,binType,detGroup,trimBegStr,trimEndStr) 
     3017        String avgStr,activeType,samFileLoaded,av_type 
     3018        Variable binType 
     3019        String detGroup,trimBegStr,trimEndStr 
     3020         
     3021        String fullpath = "", newfileName="" 
     3022        String saveType = StringByKey("SAVE",avgStr,"=",";")            //does user want to save data? 
     3023 
     3024        If( (cmpstr(saveType[0,2],"Yes")==0) && (cmpstr(av_type,"none") != 0) )          
     3025                //then save 
     3026                newFileName = RemoveEnding(samFileLoaded,".nxs.ngv") 
     3027                 
     3028                //pick ABS or AVE extension 
     3029                String exten = activeType 
     3030                if(cmpstr(exten,"ABS") != 0) 
     3031                        exten = "AVE" 
     3032                endif 
     3033//              if(cmpstr(av_type,"2D_ASCII") == 0) 
     3034//                      exten = "ASC" 
     3035//              endif 
     3036//              if(cmpstr(av_type,"QxQy_ASCII") == 0) 
     3037//                      exten = "DAT" 
     3038//              endif 
     3039                 
     3040//              // add an "x" to the file extension if the output is XML 
     3041//              // currently (2010), only for ABS and AVE (1D) output 
     3042//              if( cmpstr(exten,"ABS") == 0 || cmpstr(exten,"AVE") == 0 ) 
     3043//                      if(useXMLOutput == 1) 
     3044//                              exten += "x" 
     3045//                      endif 
     3046//              endif 
     3047                                 
     3048                //Path is catPathName, symbolic path 
     3049                //if this doesn't exist, a dialog will be presented by setting dialog = 1 
     3050                // 
     3051                Variable dialog = 0 
     3052 
     3053                PathInfo/S catPathName 
     3054                String item = StringByKey("NAME",avgStr,"=",";")                //Auto or Manual naming 
     3055                String autoname = StringByKey("AUTONAME",avgStr,"=",";")                //autoname -  will get empty string if not present 
     3056                If((cmpstr(item,"Manual")==0) || (cmpstr(newFileName,"") == 0)) 
     3057                        //manual name if requested or if no name can be derived from header 
     3058                        fullPath = newfileName + "."+ exten //puts possible new name or null string in dialog 
     3059                        dialog = 1              //force dialog for user to enter name 
     3060                else 
     3061                        //auto-generate name and prepend path - won't put up any dialogs since it has all it needs 
     3062                        //use autoname if present 
     3063                        if (cmpstr(autoname,"") != 0) 
     3064                                fullPath = S_Path + autoname + "." +exten 
     3065                        else 
     3066                                fullPath = S_Path + newFileName+"." + exten 
     3067                        endif    
     3068                Endif 
     3069                // 
     3070                strswitch(av_type)       
     3071                        case "Annular": 
     3072                                V_fWrite1DAnnular("root:Packages:NIST:VSANS:",activeType,detGroup,newFileName+".phi") 
     3073                                Print "data written to:  "+ newFileName+".phi" 
     3074 
     3075                                break 
     3076 
     3077                        case "Circular":                //in SANS, this was the default, but is dangerous, so make it explicit here 
     3078                        case "Sector":          // TODO: this falls through - which luckily works for now... 
     3079                        case "Rectangular":             // TODO: this falls through - which luckily works for now... 
     3080                        case "Narrow_Slit":             // TODO: this falls through - which luckily works for now... 
     3081 
     3082// no VSANS support of XML output at this point                  
     3083//                              if (useXMLOutput == 1) 
     3084//                                      WriteXMLWaves_W_Protocol(activeType,fullPath,dialog) 
     3085//                              else 
     3086//                                      WriteWaves_W_Protocol(activeType,fullpath,dialog) 
     3087//                              endif 
     3088// 
     3089                                if(cmpstr(saveType,"Yes - Concatenate")==0) 
     3090                                        V_Trim1DDataStr(activeType,binType,trimBegStr,trimEndStr)                       // x- passing null strings uses global or default trim values 
     3091 
     3092                                        V_ConcatenateForSave("root:Packages:NIST:VSANS:",activeType,"",binType)         // this removes q=0 point, concatenates, sorts 
     3093                                 
     3094//                                      prot[9] = collimationStr 
     3095                                         
     3096                                        V_Write1DData("root:Packages:NIST:VSANS:",activeType,newFileName+"."+exten)             //don't pass the full path, just the name 
     3097                                 
     3098                                endif 
     3099                                 
     3100                                if(cmpstr(saveType,"Yes - Individual")==0) 
     3101                                        // remove the q=0 point from the back detector, if it's there 
     3102                                        // does not trim any other points from the data 
     3103                                        V_RemoveQ0_B(activeType) 
     3104                                        V_Write1DData_ITX("root:Packages:NIST:VSANS:",activeType,newFileName,binType) 
     3105                                endif 
     3106                                Print "data written to:  "+ newFileName+"."+exten 
     3107 
     3108                                break 
     3109         
     3110                                 
     3111                                case "2D_ASCII": 
     3112//                              Fast2DExport(activeType,fullPath,dialog) 
     3113                                break 
     3114                        case "QxQy_ASCII": 
     3115//                              QxQy_Export(activeType,fullPath,dialog) 
     3116                                break 
     3117                        case "PNG_Graphic": 
     3118//                              SaveAsPNG(activeType,fullpath,dialog) 
     3119                                break 
     3120 
     3121                        default: 
     3122                                DoAlert 0, "av_type not found in dispatch to write file" 
     3123                endswitch 
     3124                 
     3125        Endif    
     3126        return(0) 
     3127End 
     3128 
     3129 
Note: See TracChangeset for help on using the changeset viewer.