def test_chain_iter(): if sys.version_info[0] >= 3: raise SkipTest("Python 3 support not implemented") chain = TreeChain('tree', FILE_PATHS) assert_equal(len(chain), 3) # 3 files entries = 0 for entry in chain: entries += 1 assert_equal(entries, 300) entries = 0 for entry in chain: entries += 1 assert_equal(entries, 300) assert_equal(chain.GetEntries(), 300) assert_equal(chain.GetEntriesFast(), 300)
def test_chain_draw(): if sys.version_info[0] >= 3: raise SkipTest("Python 3 support not implemented") chain = TreeChain('tree', FILE_PATHS) hist = Hist(100, 0, 1) chain.draw('a_x', hist=hist) assert_equal(hist.Integral() > 0, True) assert_equal(hist.GetEntries(), 300) # check that Draw can be repeated hist2 = Hist(100, 0, 1) chain.draw('a_x', hist=hist2) assert_equal(hist.Integral(), hist2.Integral()) # draw into a graph graph = chain.draw("a_x:a_y") assert_true(isinstance(graph, _GraphBase)) assert_equal(len(graph), chain.GetEntries()) assert_equal(len(graph), 300)
class neriX_analysis: __GERMANIUM_SLOPE = '693.505789' __GERMANIUM_INTERCEPT = '1.717426' def __init__(self, fileToLoad=None, lFilesToLoad=None, degreeSetting=None, cathodeSetting=None, anodeSetting=None): if fileToLoad == None and lFilesToLoad == None: print 'Need to use a file or list of files!' sys.exit() elif fileToLoad == None and lFilesToLoad != None: print 'Given list of files - creating TChain' print 'Note: degree, cathode, and anode setting are fixed' print 'Note: can only use files from the same run' elif fileToLoad != None and lFilesToLoad == None: print 'Given single file - creating TTree' else: print 'Can only give filename OR list of files. Cannot give both!' sys.exit() PARAMETERS_INDEX = neriX_datasets.PARAMETERS_INDEX ANODE_INDEX = neriX_datasets.ANODE_INDEX CATHODE_INDEX = neriX_datasets.CATHODE_INDEX DEGREE_INDEX = neriX_datasets.DEGREE_INDEX dRunFiles = neriX_datasets.run_files lRuns = neriX_datasets.runsInUse lParameters = None if fileToLoad != None: # check neriX_datasets for file and parameters if fileToLoad[-5:] != '.root': fileToLoad += '.root' self.filename = fileToLoad[-22:] # just grab neriX portion for run in lRuns: try: lParameters = dRunFiles[run][self.filename] currentRun = run break except KeyError: continue if not lParameters: print 'File does not appear in neriX_datasets.py' print 'Please check if the file exists and that your spelling is correct' sys.exit() self.runNumber = currentRun if fileToLoad[0] == 'n' or fileToLoad[0] == 'c': pathToFile = neriX_config.pathToData + 'run_' + str( self.runNumber) + '/' + str(fileToLoad) else: pathToFile = fileToLoad self.rootFile = File(pathToFile, 'read') if self.rootFile.keys() == []: print 'Problem opening file - please check name entered' print 'Entered: ' + pathToFile sys.exit(1) self.anodeSetting = dRunFiles[self.runNumber][ self.filename][ANODE_INDEX] self.cathodeSetting = dRunFiles[self.runNumber][ self.filename][CATHODE_INDEX] self.degreeSetting = dRunFiles[self.runNumber][ self.filename][DEGREE_INDEX] # load trees self.T1 = self.rootFile.T1 self.T2 = self.rootFile.T2 self.T3 = self.rootFile.T3 try: self.T4 = self.rootFile.T4 except AttributeError: self.T4 = None self.T1.SetName('T1_' + self.filename) self.T2.SetName('T2_' + self.filename) self.T3.SetName('T3_' + self.filename) if self.T4: self.T4.SetName('T4_' + self.filename) self.T1.create_buffer() self.T2.create_buffer() self.T3.create_buffer() if self.T4: self.T4.create_buffer() self.T1.AddFriend('T2_' + self.filename) self.T2.AddFriend('T1_' + self.filename) self.T1.AddFriend('T3_' + self.filename) if self.T4: self.T1.AddFriend('T4_' + self.filename) if lFilesToLoad != None: # check neriX_datasets for file and parameters for currentFile in lFilesToLoad: if currentFile[-5:] != '.root': currentFile += '.root' # sort files lFilesToLoad.sort() lRootFiles = [] # check run number and set it for run in lRuns: try: # check run of first file lParameters = dRunFiles[run][lFilesToLoad[0][-22:]] currentRun = run break except KeyError: continue if not lParameters: print 'Current file does not appear in neriX_datasets.py' print 'Please check if the file exists and that your spelling is correct' sys.exit() self.runNumber = currentRun # loop through files and add ones that match settings given to init for currentFile in lFilesToLoad: try: lParameters = dRunFiles[self.runNumber][currentFile[-22:]] # check if settings match if lParameters[ DEGREE_INDEX] == degreeSetting and lParameters[ ANODE_INDEX] == anodeSetting and lParameters[ CATHODE_INDEX] == cathodeSetting: # settings match so add proper filename with proper path if currentFile[0] == 'n' or currentFile[0] == 'c': pathToFile = neriX_config.pathToData + 'run_' + str( self.runNumber) + '/' + str(currentFile) else: pathToFile = currentFile lRootFiles.append(pathToFile) print 'Added ' + pathToFile[-22:] + ' to chain.' else: print currentFile[ -22:] + ' does not have proper settings - skipping...' except KeyError: print currentFile[-22:] + ' cannot be found in run ' + str( self.runNumber) # open first file to check if it has T4 branch rootFile = File(lRootFiles[0], 'read') #print TreeChain('T1', lRootFiles[0]).__dict__ self.T1 = TreeChain('T1', lRootFiles) self.T2 = TreeChain('T2', lRootFiles) self.T3 = TreeChain('T3', lRootFiles) try: rootFile.T4 self.T4 = TreeChain('T4', lRootFiles) except: self.T4 = None # erase test file del rootFile self.T1.create_buffer() self.T2.create_buffer() self.T3.create_buffer() if self.T4: self.T4.create_buffer() self.T1.AddFriend('T2') self.T1.AddFriend('T3') if self.T4: self.T1.AddFriend('T4') self.T1.SetName('T1_' + str(degreeSetting) + '_' + str(cathodeSetting) + '_' + str(anodeSetting)) self.T2.SetName('T2_' + str(degreeSetting) + '_' + str(cathodeSetting) + '_' + str(anodeSetting)) self.T3.SetName('T3_' + str(degreeSetting) + '_' + str(cathodeSetting) + '_' + str(anodeSetting)) if self.T4: self.T4.SetName('T4_' + str(degreeSetting) + '_' + str(cathodeSetting) + '_' + str(anodeSetting)) self.anodeSetting = anodeSetting self.cathodeSetting = cathodeSetting self.degreeSetting = degreeSetting # even though not the filename need it for later use self.filename = str(degreeSetting) + '_' + str( cathodeSetting) + '_' + str(anodeSetting) #define helpful aliases self.T1.SetAlias('dt', '(S2sPeak[0]-S1sPeak[0])/100.') self.T1.SetAlias('X', 'S2sPosFann[0][0]') self.T1.SetAlias('Y', 'S2sPosFann[0][1]') if self.T4: self.T1.SetAlias('R', 'sqrt(pow(ctNNPos[0],2)+pow(ctNNPos[1],2))') else: self.T1.SetAlias( 'R', 'sqrt(pow(S2sPosFann[0][0],2)+pow(S2sPosFann[0][1],2))') self.T1.SetAlias('czS1sTotBottom', '(S1sTotBottom[0]/(0.863098 + (-0.00977873)*Z))') self.T1.SetAlias('ctS1sTotBottom', 'czS1sTotBottom') self.T1.SetAlias('s1asym', '(S1sTotTop[0]-S1sTotBottom[0])/S1sTot[0]') self.T1.SetAlias('s2asym', '(S2sTotTop[0]-S2sTotBottom[0])/S2sTot[0]') if self.cathodeSetting == 0.345: self.T1.SetAlias('Z', '-1.511*(S2sPeak[0]-S1sPeak[0])/100') elif self.cathodeSetting == 1.054: self.T1.SetAlias('Z', '-1.717*(S2sPeak[0]-S1sPeak[0])/100') elif self.cathodeSetting == 2.356: self.T1.SetAlias('Z', '-1.958*(S2sPeak[0]-S1sPeak[0])/100') elif self.cathodeSetting == 5.500: self.T1.SetAlias('Z', '-2.208*(S2sPeak[0]-S1sPeak[0])/100') else: print 'Incorrect field entered - cannot correct Z' #will need to change these constants depending on Ge Calibratio self.T1.SetAlias( 'GeEnergy', self.__GERMANIUM_SLOPE + '*GeHeight[0] + ' + self.__GERMANIUM_INTERCEPT) self.T1.SetAlias('eDep', '661.657 - GeEnergy') self.Xrun = '(EventId != -1)' #add a cut so that add statements work # create event list self.eList = root.TEventList('eList_' + self.filename) root.SetOwnership(self.eList, True) def get_tree(self): if _tree in self.T1.keys(): return self.T1._tree else: return self.T1 def get_run(self): return self.runNumber def get_filename(self): return self.filename def get_T1(self): return self.T1 def get_T2(self): return self.T2 def get_T3(self): return self.T3 def get_T4(self): return self.T4 def add_dt_cut(self, lowdt=2., highdt=13.): Xdt = '((dt > ' + str(lowdt) + ') && (dt < ' + str(highdt) + '))' self.Xrun = self.Xrun + ' && ' + Xdt def add_radius_cut(self, lowRadius=0., highRadius=20.): Xradius = '((R > ' + str(lowRadius) + ') && (R < ' + str( highRadius) + '))' self.Xrun = self.Xrun + ' && ' + Xradius def add_eDep_cut(self, lowEnergy=-2., highEnergy=35.): Xedep = '((eDep > ' + str(lowEnergy) + ') && (eDep < ' + str( highEnergy) + '))' self.Xrun = self.Xrun + ' && ' + Xedep def add_single_scatter_cut(self): self.Xrun += ' && (Alt$(S2sTot[1],0)<15000.)' def add_s1_trig_cut(self): Xtrig = '' if self.degreeSetting < 0: return if self.get_timestamp(0) < 1418997600: # 12/19/14 at 9 AM Xtrig = '((((TrigLeftEdge[] - S1sPeak[0]) > 0.) && ((TrigLeftEdge[] - S1sPeak[0]) < 50.)) && ((TrigArea[] > (2.2e-8) && TrigArea[] < (2.9e-8)) || (TrigArea[] > (8.2e-8) && TrigArea[] < (10.2e-8)) || (TrigArea[] > (1.50e-7) && TrigArea[] < (1.64e-7)) || (TrigArea[] > 2.2e-7 && TrigArea[] < 2.3e-7)))' #Xtrig3 elif self.get_timestamp(0) > 1418997600: Xtrig = '((((TrigLeftEdge[] - S1sPeak[0]) > 0.) && ((TrigLeftEdge[] - S1sPeak[0]) < 50.)) && ((TrigArea[] > (3.0e-8) && TrigArea[] < (4.8e-8)) || (TrigArea[] > (9.2e-8) && TrigArea[] < (10.6e-8)) || (TrigArea[] > (1.50e-7) && TrigArea[] < (1.7e-7))))' # Xtrig4 self.Xrun += ' && ' + Xtrig def add_cut(self, sCut): self.Xrun += ' && ' + sCut def reset_cuts(self): self.Xrun = 'S1sCoin[0] > 0' def get_degree_setting(self): return self.degreeSetting def get_cathode_setting(self): return self.cathodeSetting def get_anode_setting(self): return self.anodeSetting def get_cuts(self): return self.Xrun def get_timestamp(self, eventNumber=0): self.T1.GetEntry(eventNumber) return self.T1.TimeSec def get_livetime(self): return self.get_timestamp(self.T1.GetEntries() - 1) - self.get_timestamp(0) def set_event_list(self, cuts=None): if cuts == None: cuts = self.Xrun #self.reset_event_list() print 'Original elements in tree: ' + str(self.T1.GetEntries()) #if '_tree' in self.T1.__dict__: # root.TTree.Draw(self.T1._tree, '>>eList_' + self.filename, root.TCut(cuts), '') #second arg should be cuts #else: root.TTree.Draw(self.T1, '>>eList_' + self.filename, root.TCut(cuts), '') #second arg should be cuts self.T1.SetEventList(self.eList) print 'Elements after cuts: ' + str(self.eList.GetN()) def reset_event_list(self): self.T1.SetEventList(0) if ('elist_' + self.filename) in locals(): self.eList.Clear() self.eList.Reset() self.eList.SetDirectory(0) #del self.eList def get_event_list(self): return self.eList def reset_tree(self): if 'T1' in locals(): del self.T1 if 'T2' in locals(): del self.T2 if 'T3' in locals(): del self.T3 #test = neriX_analysis('nerix_140914_1631.root') #test.get_timestamp(1) #print test.get_livetime()