2017-02-22 3 views
0

Donc j'utilise pyroot pour faire l'analyse de données. La chaîne de code d'analyse exécute différents plugins sur les données et les affiche dans un fichier racine, stockant la sortie de chaque plug-in dans leur propre fichier TDirectoryFile dans le fichier racine. J'ai écrit une fonction qui prend le nom du fichier racine et le nom du plugin et devrait renvoyer les plugins TDirectoryFile. Cependant, il retourne à la place un NoneType, puis se bloque dès que j'essaye de faire quelque chose avec l'objet.python ne renvoie pas Noneobject, quand il devrait retourner l'objet racine TDirectoryFile

from ROOT import * 

def getPluginData(fName,pName): 
    tfile=TFile("Analyzer.root") 
    plugin= tfile.Get("MuIndNeuSpallPlugin") 
    #outputs <class 'ROOT.TDirectoryFile'> 
    print type(MuIndNeuSpallPlugin) 
    return plugin 


#This should be a <class 'ROOTTDirectoryFile'.>, but is a NoneType instead 
MuIndNeuSpallPlugin=getPluginData("Analyzer.root","MuIndNeuSpallPlugin") 
+0

Est-ce que 'print (tfile.ls())' après avoir initialisé le fichier tfile indique que 'MuIndNeuSpallPlugin' est une clé? 'Get()' renvoie None si la clé n'est pas valide – jarcobi889

+0

Donc MuIndNeuSpallPlugin est définitivement une clé. En fait, mon code d'origine n'a pas utilisé une fonction fonctionne très bien. C'est comme quand python quitte la portée de la fonction, il oublie simplement ce qu'est le plugin, et retourne un NoneType à la place. –

+0

Avez-vous par hasard ce code original que vous pourriez ajouter à la question à titre de comparaison? Si non, pourriez-vous lancer 'tfile.ls()' juste pour les coups de pied et les fous rires et voir ce qu'il crache? Tout le reste semble être dans l'ordre que je peux voir, en plus de ne pas utiliser les variables 'fName' et' pName'. – jarcobi889

Répondre

0

donc sur mon post sur l'affiche parler racine (https://root.cern.ch/phpBB3/viewtopic.php?f=14&t=23242)a expliqué pourquoi cela se produit. En fait tfile est défini dans la fonction et lorsque la fonction descopes, son compteur d'utilisation est réduite à 0 et son C++ version est supprimée. La plugin, qui est TDirectoryFile, est contenue dans le fichier tfile, donc quand tfile est supprimé, il va avec lui.La solution est de définir tfile dans la portée globale, passez-le au lieu d'une chaîne de son nom de fichier

ROOT import *

def getPluginData(tfile,pName): 
    plugin= tfile.Get(pName) 
    print type(MuIndNeuSpallPlugin) 
    return plugin 
tfile=TFile("Analyzer.root") 
MuIndNeuSpallPlugin=getPluginData(tfile,"MuIndNeuSpallPlugin") 

T ses œuvres, mais je sens ce contre-intuitif ou du moins pas très pythonique, et sorte de python casse.

+0

Pourquoi définir 'getPluginData' du tout? Pourquoi ne pas simplement utiliser 'MuIndNeuSpallPlugin = tfile.Get (" MuIndNeuSpallPlugin ")'? Cela me semble plus simple. – cco

+0

Parce que j'ai beaucoup de fichiers racine, et chaque fichier racine a de nombreux plugins, j'ai seulement posté la version de code pour la lisibilité. –