Ignore:
Timestamp:
Jun 2, 2017 11:29:54 AM (5 years ago)
Author:
srkline
Message:

moved dead time correction to before the solid angle correction, so that the dead time would be correcting counts, not counts per solid angle

added a routine to kill all of the waves and folders possible, if the overall DF kill failed. This is to prevent stray folders and waves from being present if different data files are loaded - since different data blocks are present for say, 3He data, data with temperature logging, etc.
This kill routine is used every time, before raw data is loaded, DIV or MASK loaded, or data is converted to WORK.

changed the "Save I(q)" button on the data display panel to save as ITX format, since the data has not been processed, and data can more easily be used for trimming input.

picking protocols in dialogs now excludes/includes appropriate waves

menus are consolidated

Fixed bug in SANS macros where the DRK[] item in the protocol could be null, and force the read of a DRK file, even if it was not desired.

File:
1 edited

Legend:

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

    r1041 r1042  
    100100                return(0) 
    101101        else 
     102         
     103                V_KillWavesFullTree($fromDF,fromStr,0,"",1)                     // this will traverse the whole tree, trying to kill what it can 
     104                 
    102105                // need to do this the hard way, duplicate/O recursively 
    103106                // see V_CopyToWorkFolder() 
     
    113116                // sample 
    114117                V_DuplicateDataFolder($(fromDF+":entry:sample"),fromStr,toStr,0,"",1)   //yes recursion here 
    115  
     118                // user 
     119                V_DuplicateDataFolder($(fromDF+":entry:user"),fromStr,toStr,0,"",1)     //yes recursion here 
     120                 
    116121        endif    
    117122         
     
    119124end 
    120125 
     126 
     127 
     128Function V_KillWavesInFolder(folderStr) 
     129        String folderStr 
     130         
     131        if(DataFolderExists(folderStr) && strlen(folderStr) != 0) 
     132                SetDataFolder $folderStr 
     133                KillWaves/A/Z 
     134        endif 
     135         
     136        SetDataFolder root: 
     137        return(0) 
     138end 
    121139 
    122140//////// 
     
    234252 
    235253End 
    236   
     254 
     255 
     256// ListDataFolder(dfr, level) 
     257// Recursively lists objects in data folder. 
     258// Pass data folder path for dfr and 0 for level. 
     259// pass level == 0 for the first call 
     260//  sNBName = "" prints nothing. any name will generate a notebook 
     261// 
     262// recurse == 0 will do only the specified folder, anything else will recurse all levels 
     263// toStr is the string name of the top-level folder only, not the full path 
     264// 
     265// 
     266Function V_KillWavesFullTree(dfr, fromStr, level, sNBName,recurse) 
     267        DFREF dfr 
     268        String fromStr 
     269//      String toStr 
     270        Variable level                  // Pass 0 to start 
     271        String sNBName 
     272        Variable recurse 
     273  
     274        String name 
     275        String dfName 
     276        String sString 
     277         
     278        String toDF = "" 
     279  
     280        if (level == 0)         // this is the data folder, generate if needed in the destination 
     281                name = GetDataFolder(1, dfr) 
     282                sPrintf sString, "%s (data folder)\r", name 
     283//              toDF = ReplaceString(fromStr,name,toStr,1)              // case-sensitive replace 
     284//              sprintf sString, "NewDataFolder/O %s\r",toDF 
     285//              NewDataFolder/O $(RemoveEnding(toDF,":"))                       // remove trailing semicolon if it's there 
     286                 
     287                V_WriteBrowserInfo_test(sString, 1, sNBName) 
     288        endif 
     289  
     290        dfName = GetDataFolder(1, dfr) 
     291//      toDF = ReplaceString(fromStr,dfName,toStr,1)            // case-sensitive replace 
     292        Variable i 
     293  
     294        String indentStr = "\t" 
     295        for(i=0; i<level; i+=1) 
     296                indentStr += "\t" 
     297        endfor 
     298  
     299        Variable numWaves = CountObjectsDFR(dfr, 1) 
     300        for(i=0; i<numWaves; i+=1) 
     301                name = GetIndexedObjNameDFR(dfr, 1, i) 
     302                // 
     303                // wave type does not matter now. Kill does not care 
     304                // 
     305                sPrintf sString, "Killing  %s\r",dfName+name 
     306                KillWaves/Z $(dfName+name) 
     307                 
     308                V_WriteBrowserInfo_test(sString, 2, sNBName) 
     309        endfor   
     310  
     311 // now kill the data folder if possible 
     312        KillDataFolder/Z $dfName 
     313         
     314         
     315        Variable numNumericVariables = CountObjectsDFR(dfr, 2)   
     316        for(i=0; i<numNumericVariables; i+=1) 
     317                name = GetIndexedObjNameDFR(dfr, 2, i) 
     318                sPrintf sString, "%s%s (numeric variable)\r", indentStr, name 
     319                V_WriteBrowserInfo_test(sString, 3, sNBName) 
     320        endfor   
     321  
     322        Variable numStringVariables = CountObjectsDFR(dfr, 3)    
     323        for(i=0; i<numStringVariables; i+=1) 
     324                name = GetIndexedObjNameDFR(dfr, 3, i) 
     325                sPrintf sString, "%s%s (string variable)\r", indentStr, name 
     326                V_WriteBrowserInfo_test(sString, 4, sNBName) 
     327        endfor   
     328 
     329        if(recurse)  
     330                Variable numDataFolders = CountObjectsDFR(dfr, 4)        
     331                for(i=0; i<numDataFolders; i+=1) 
     332                        name = GetIndexedObjNameDFR(dfr, 4, i) 
     333                        sPrintf sString, "%s%s (data folder)\r", indentStr, name 
     334                         dfName = GetDataFolder(1, dfr) 
     335                          
     336//                      toDF = ReplaceString(fromStr,dfName,toStr,1)            // case-sensitive replace 
     337//                      sprintf sString, "NewDataFolder/O %s\r",toDF+name 
     338//                      NewDataFolder/O $(toDF+name) 
     339                         
     340                         
     341                        V_WriteBrowserInfo_test(sString, 1, sNBName) 
     342                        DFREF childDFR = dfr:$(name) 
     343                        V_KillWavesFullTree(childDFR, fromStr, level+1, sNBName, recurse) 
     344                endfor   
     345        endif 
     346          
     347 
     348End 
     349  
     350 
     351 
    237352Function V_WriteBrowserInfo_test(sString, vType, sNBName) 
    238353        String sString 
     
    462577        endif 
    463578 
    464         // (3) solid angle correction 
     579 
     580        // (3) dead time correction 
     581        // TODO: 
     582        // x- remove the hard-wired test - done 
     583        // -- test for correct operation 
     584        // x- loop over all of the detectors 
     585        // x- B detector is a special case (do separately, then loop over NoB) 
     586        // -- this DOES alter the data 
     587        // -- verify the error propagation (not done yet) 
     588        // 
     589        Variable countRate 
     590        NVAR gDoDeadTimeCor = root:Packages:NIST:VSANS:Globals:gDoDeadTimeCor 
     591        if (gDoDeadTimeCor == 1) 
     592                Print "Doing DeadTime correction"// for "+ detStr 
     593                for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1) 
     594                        detStr = StringFromList(ii, ksDetectorListAll, ";") 
     595                        Wave w = V_getDetectorDataW(fname,detStr) 
     596                        Wave w_err = V_getDetectorDataErrW(fname,detStr) 
     597                        ctTime = V_getCount_time(fname) 
     598 
     599                        if(cmpstr(detStr,"B") == 0) 
     600                                Variable b_dt = V_getDetector_deadtime_B(fname,detStr) 
     601                                // do the correction for the back panel 
     602                                countRate = sum(w,-inf,inf)/ctTime              //use sum of detector counts 
     603 
     604                                w = w/(1-countRate*b_dt) 
     605                                w_err = w_err/(1-countRate*b_dt) 
     606                                                                 
     607                        else 
     608                                // do the corrections for 8 tube panels 
     609                                Wave w_dt = V_getDetector_deadtime(fname,detStr) 
     610                                V_DeadTimeCorrectionTubes(w,w_err,w_dt,ctTime) 
     611                                 
     612                        endif 
     613                endfor 
     614                 
     615        else 
     616                Print "Dead Time correction NOT DONE" 
     617        endif    
     618         
     619 
     620        // (4) solid angle correction 
    465621        // TODO -- this currently calculates the correction factor AND applys it to the data 
    466622        //  -- as a result, the data values are very large since they are divided by a very small 
     
    485641        endif    
    486642         
    487         // (4) dead time correction 
    488         // TODO: 
    489         // x- remove the hard-wired test - done 
    490         // -- test for correct operation 
    491         // x- loop over all of the detectors 
    492         // x- B detector is a special case (do separately, then loop over NoB) 
    493         // -- this DOES alter the data 
    494         // -- verify the error propagation (not done yet) 
    495         // 
    496         Variable countRate 
    497         NVAR gDoDeadTimeCor = root:Packages:NIST:VSANS:Globals:gDoDeadTimeCor 
    498         if (gDoDeadTimeCor == 1) 
    499                 Print "Doing DeadTime correction"// for "+ detStr 
    500                 for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1) 
    501                         detStr = StringFromList(ii, ksDetectorListAll, ";") 
    502                         Wave w = V_getDetectorDataW(fname,detStr) 
    503                         Wave w_err = V_getDetectorDataErrW(fname,detStr) 
    504                         ctTime = V_getCount_time(fname) 
    505  
    506                         if(cmpstr(detStr,"B") == 0) 
    507                                 Variable b_dt = V_getDetector_deadtime_B(fname,detStr) 
    508                                 // do the correction for the back panel 
    509                                 countRate = sum(w,-inf,inf)/ctTime              //use sum of detector counts 
    510  
    511                                 w = w/(1-countRate*b_dt) 
    512                                 w_err = w_err/(1-countRate*b_dt) 
    513                                                                  
    514                         else 
    515                                 // do the corrections for 8 tube panels 
    516                                 Wave w_dt = V_getDetector_deadtime(fname,detStr) 
    517                                 V_DeadTimeCorrectionTubes(w,w_err,w_dt,ctTime) 
    518                                  
    519                         endif 
    520                 endfor 
    521                  
    522         else 
    523                 Print "Dead Time correction NOT DONE" 
    524         endif    
    525          
    526          
     643                 
    527644        // (5) angle-dependent tube shadowing 
    528645        // TODO: 
Note: See TracChangeset for help on using the changeset viewer.