#include <QFramework/TQNTupleDumperAnalysisJob.h>
#include <QFramework/TQStringUtils.h>
#include <QFramework/TQUtils.h>
#include <QFramework/TQToken.h>
#include <QFramework/TQObservable.h>
#include <QFramework/TQCut.h>
#include <QFramework/TQPathManager.h>
#include <TString.h>
#include "TBranch.h"
#include "TTree.h"
#include <stdexcept>
#include <map>
#include <vector>
#include <QFramework/TQLibrary.h>
ClassImp(TQNTupleDumperAnalysisJob)
TQMessageStream TQNTupleDumperAnalysisJob::fErrMsg(new std::stringstream());
const std::map<TQNTupleDumperAnalysisJob::VarType,bool> TQNTupleDumperAnalysisJob::isVectorBranchMap {
{TQNTupleDumperAnalysisJob::VarType::UNKNOWN, false},
{TQNTupleDumperAnalysisJob::VarType::INT, false},
{TQNTupleDumperAnalysisJob::VarType::INT32, false},
{TQNTupleDumperAnalysisJob::VarType::INT64, false},
{TQNTupleDumperAnalysisJob::VarType::FLOAT, false},
{TQNTupleDumperAnalysisJob::VarType::DOUBLE, false},
{TQNTupleDumperAnalysisJob::VarType::UI, false},
{TQNTupleDumperAnalysisJob::VarType::UL, false},
{TQNTupleDumperAnalysisJob::VarType::ULI, false},
{TQNTupleDumperAnalysisJob::VarType::ULL, false},
{TQNTupleDumperAnalysisJob::VarType::ULLI, false},
{TQNTupleDumperAnalysisJob::VarType::UINT32, false},
{TQNTupleDumperAnalysisJob::VarType::UINT64, false},
{TQNTupleDumperAnalysisJob::VarType::VECTORINT, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORINT32, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORINT64, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORFLOAT, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORDOUBLE, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORUI, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORUL, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORULI, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORULL, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORULLI, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORUINT32, true},
{TQNTupleDumperAnalysisJob::VarType::VECTORUINT64, true}
};
namespace TQNTupleDumperAnalysisJobHelpers {
class BranchHandle {
public:
const TString name;
TBranch* branch = 0;
virtual ~BranchHandle(){};
BranchHandle(const TString& bname) :
name(bname) {}
virtual void setValue(double x, int index = 0) = 0;
virtual double getValue(int index = 0) const = 0;
virtual int getNValues() const = 0;
virtual void resetValue() = 0;
virtual TString getValuesAsString() const { return TString(""); }
const char* getName() const {
return name.Data();
}
};
template<class T>
class BranchHandleT : public BranchHandle {
public:
mutable T element = 0;
virtual void setValue(double x, int index = 0) final override {
DEBUGfunc("setting value of branch %s@%p to %g",this->getName(),this->branch,x);
if (index != 0) {throw std::runtime_error(TString::Format("Caught attempt to set value of scalar branch handle with index != 0 (%d)",index).Data()); return;}
this->element = (T)x;
}
virtual double getValue(int = 0) const final override {
return (double)(this->element);
}
virtual int getNValues() const final override {return 1;}
virtual void resetValue() final override {
this->element = (T)0.;
}
virtual TString getValuesAsString() const final override {
return TString::Format("%.4f",this->getValue());
}
BranchHandleT(TTree* tree, const TString& bname) :
BranchHandle(bname) {
this->branch = tree->GetBranch(name);
if(this->branch){
tree->SetBranchAddress(name,&element);
} else {
this->branch = tree->Branch(name, &element);
}
DEBUGfunc("setting branch %s@%p to address %p",this->getName(),this->branch,&element);
}
};
template<class T>
class BranchHandleVectorT : public BranchHandle {
public:
mutable std::vector<T> element;
virtual void setValue(double x, int index = 0) final override {
DEBUGfunc("setting value of branch %s[%d]@%p to %g",this->getName(),index,this->branch,x);
if (! (index<(int)element.size()) ) element.resize(index+1);
this->element[index] = (T)x;
}
virtual double getValue(int i) const final override {
if (i<(int)element.size()) return (double)(this->element[i]);
throw std::runtime_error(TString::Format("Caught attempt to access TQNTupleDumperAnalysisJobHelpers::BranchHandleVectorT::element out of bounds in handle '%s'!",this->getName()).Data());
}
virtual int getNValues() const final override {return (int)element.size();}
virtual void resetValue() final override {
element.clear();
}
virtual TString getValuesAsString() const final override {
TString retval = "{";
for (int i=0; i<this->getNValues(); ++i) {
if (i!=0) retval.Append(", ");
retval.Append(TString::Format("%.4f",this->getValue(i)));
}
retval.Append("}");
return retval;
}
BranchHandleVectorT(TTree* tree, const TString& bname) :
BranchHandle(bname) {
this->branch = tree->GetBranch(name);
if(this->branch){
tree->SetBranchAddress(name,&element);
} else {
this->branch = tree->Branch(name, &element);
}
DEBUGfunc("setting branch %s@%p to address %p",this->getName(),this->branch,&element);
}
};
class TreeHandle {
public:
TTree* tree = 0;
std::vector<TQToken*> tokens;
std::vector<BranchHandle*> branches;
~TreeHandle() noexcept(false){
for(auto b:branches){
delete b;
}
if(tokens.size() > 0){
throw std::runtime_error("trying to delete TreeHandle with remaining tree tokens!");
}
}
void empty(){
for(auto branch:branches){
branch->resetValue();
}
}
void fill(){
this->tree->Fill();
}
void print(){
for(auto b:branches){
std::cout << b->getName() << " = " << b->getValuesAsString().Data() << std::endl;
}
}
BranchHandle* getBranch(const TString& name,TQNTupleDumperAnalysisJob::VarType type){
DEBUGfunc("requested branch '%s'",name.Data());
for(size_t i=0; i<branches.size(); ++i){
if(TQStringUtils::equal(branches[i]->getName(),name)){
DEBUGfunc("returning existing branch '%s@%p'",name.Data(),branches[i]);
return branches[i];
}
}
BranchHandle* b = NULL;
switch(type){
case TQNTupleDumperAnalysisJob::INT:
b = new BranchHandleT<int>(tree,name); break;
case TQNTupleDumperAnalysisJob::INT32:
b = new BranchHandleT<int32_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::INT64:
b = new BranchHandleT<int64_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::DOUBLE:
b = new BranchHandleT<double>(tree,name); break;
case TQNTupleDumperAnalysisJob::FLOAT:
b = new BranchHandleT<float>(tree,name); break;
case TQNTupleDumperAnalysisJob::UI:
b = new BranchHandleT<unsigned int>(tree,name); break;
case TQNTupleDumperAnalysisJob::UL:
b = new BranchHandleT<unsigned long>(tree,name); break;
case TQNTupleDumperAnalysisJob::ULI:
b = new BranchHandleT<unsigned long int>(tree,name); break;
case TQNTupleDumperAnalysisJob::ULL:
b = new BranchHandleT<unsigned long long>(tree,name); break;
case TQNTupleDumperAnalysisJob::ULLI:
b = new BranchHandleT<unsigned long long int>(tree,name); break;
case TQNTupleDumperAnalysisJob::UINT32:
b = new BranchHandleT<uint32_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::UINT64:
b = new BranchHandleT<uint64_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORINT:
b = new BranchHandleVectorT<int>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORINT32:
b = new BranchHandleVectorT<int32_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORINT64:
b = new BranchHandleVectorT<int64_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORDOUBLE:
b = new BranchHandleVectorT<double>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORFLOAT:
b = new BranchHandleVectorT<float>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORUI:
b = new BranchHandleVectorT<unsigned int>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORUL:
b = new BranchHandleVectorT<unsigned long>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORULI:
b = new BranchHandleVectorT<unsigned long int>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORULL:
b = new BranchHandleVectorT<unsigned long long>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORULLI:
b = new BranchHandleVectorT<unsigned long long int>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORUINT32:
b = new BranchHandleVectorT<uint32_t>(tree,name); break;
case TQNTupleDumperAnalysisJob::VECTORUINT64:
b = new BranchHandleVectorT<uint64_t>(tree,name); break;
default:
throw std::runtime_error(TString::Format("in TQNTupleDumperAnalysisJob, encountered unknown variable type for '%s'",name.Data()).Data());
}
this->branches.push_back(b);
DEBUGfunc("returning new branch '%s@%p'",name.Data(),b);
return b;
}
TQToken* getToken(){
DEBUGfunc("attempting to get token for '%s'",tree->GetName());
TQToken* tok = new TQToken();
tok->setContent(this);
this->tokens.push_back(tok);
return tok;
}
bool returnToken(TQToken* tok){
DEBUGfunc("attempting to return token for '%s'",tree->GetName());
bool found = false;
for (auto it = tokens.begin(); it != tokens.end() ; )
{
if (tok == (*it))
{
DEBUGfunc("returning token %p", (*it));
it = tokens.erase(it);
found = true;
}
else
{
it++;
}
}
if(found){
delete tok;
} else {
DEBUGfunc("unable to return token %p",tok);
}
return found;
}
bool hasTokens(){
return (tokens.size() > 0);
}
void close(){
TDirectory* d = gDirectory;
gDirectory = tree->GetDirectory();
DEBUGfunc("writing tree '%s' with %d entries to directory '%s'",tree->GetName(),tree->GetEntries(),gDirectory->GetName());
tree->Write("", TObject::kOverwrite);
gDirectory = d;
for(auto b:this->branches){
delete b;
}
this->branches.clear();
}
TreeHandle(TTree* t) : tree(t) {};
};
class FileHandle {
bool hasBeenOpened = false;
TString filename = "";
TFile* file = 0;
std::map<const TString,TreeHandle*> trees;
public:
FileHandle(const TString& name) : filename(name) {};
TQToken* getTreeToken(const TString& treename){
if(!file){
DEBUGfunc("attempting to open file '%s'",filename.Data());
if(hasBeenOpened){
file = TFile::Open(filename,"UPDATE");
} else {
TQUtils::ensureDirectoryForFile(filename);
file = TFile::Open(filename,"RECREATE");
}
}
if(!file || !file->IsOpen()){
DEBUGfunc("invalid file '%s'",filename.Data());
if(file) delete file;
return NULL;
}
hasBeenOpened = true;
DEBUGfunc("attempting to find tree '%s' in file '%s'",treename.Data(),filename.Data());
if(trees.find(treename) == trees.end()){
TTree* t = dynamic_cast<TTree*>(file->Get(treename));
if(!t){
t = new TTree(treename,treename);
t->SetMaxVirtualSize(1e15);
t->SetDirectory(file);
}
trees.emplace(treename,new TreeHandle(t));
}
DEBUGfunc("attempting to get tree token for '%s':'%s'",filename.Data(),treename.Data());
return trees[treename]->getToken();
}
bool returnTreeToken(const TString& treename, TQToken* tok){
DEBUGfunc("attempting to return tree token for '%s':'%s'",filename.Data(),treename.Data());
if(trees.find(treename) == trees.end()){
return false;
}
bool found = trees[treename]->returnToken(tok);
for (auto it = trees.begin(); it != trees.end() ; )
{
if (!(*it).second->hasTokens())
{
(*it).second->close();
delete (*it).second;
it = trees.erase(it);
}
else
{
it++;
}
}
if(trees.size() == 0){
file->Close();
delete file;
file = NULL;
}
return found;
}
};
std::map<const TString,FileHandle*> gFiles;
}
using namespace TQNTupleDumperAnalysisJobHelpers;
TQToken* TQNTupleDumperAnalysisJob::getTreeToken(const TString& filename, const TString& treename){
if(gFiles.find(filename) == gFiles.end()){
gFiles.emplace(filename,new FileHandle(filename));
}
TQToken* tok = gFiles[filename]->getTreeToken(treename);
return tok;
}
bool TQNTupleDumperAnalysisJob::returnTreeToken(const TString& filename, const TString& treename, TQToken* tok){
if(gFiles.find(filename) == gFiles.end()){
return false;
}
return gFiles[filename]->returnTreeToken(treename,tok);
}
TQNTupleDumperAnalysisJob::TQNTupleDumperAnalysisJob(const TString& name) :
TQAnalysisJob(name)
{
}
TQNTupleDumperAnalysisJob::VarType TQNTupleDumperAnalysisJob::getVarType (TString typestr){
typestr.ToLower();
DEBUGclass("trying to match type '%s'",typestr.Data());
if(TQStringUtils::equal(typestr,"int")){
return VarType::INT;
}
if(TQStringUtils::equal(typestr,"int32_t")){
return VarType::INT32;
}
if(TQStringUtils::equal(typestr,"int64_t")){
return VarType::INT64;
}
if(TQStringUtils::equal(typestr,"float")){
return VarType::FLOAT;
}
if(TQStringUtils::equal(typestr,"double")){
return VarType::DOUBLE;
}
if(TQStringUtils::equal(typestr,"unsigned int")){
return VarType::UI;
}
if(TQStringUtils::equal(typestr,"unsigned long")){
return VarType::UL;
}
if(TQStringUtils::equal(typestr,"unsigned long int")){
return VarType::ULI;
}
if(TQStringUtils::equal(typestr,"unsigned long long")){
return VarType::ULL;
}
if(TQStringUtils::equal(typestr,"unsigned long long int")){
return VarType::ULLI;
}
if(TQStringUtils::equal(typestr,"uint32_t")){
return VarType::UINT32;
}
if(TQStringUtils::equal(typestr,"uint64_t")){
return VarType::UINT64;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<int>")) {
return VarType::VECTORINT;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<int32_t>")) {
return VarType::VECTORINT32;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<int64_t>")) {
return VarType::VECTORINT64;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<float>")) {
return VarType::VECTORFLOAT;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<double>")) {
return VarType::VECTORDOUBLE;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedint>")) {
return VarType::VECTORUI;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlong>")) {
return VarType::VECTORUL;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlongint>")) {
return VarType::VECTORULI;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlonglong>")) {
return VarType::VECTORULL;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<unsignedlonglongint>")) {
return VarType::VECTORULLI;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<uint32_t>")) {
return VarType::VECTORUINT32;
}
if(TQStringUtils::equal(TQStringUtils::minimize(typestr),"vector<uint64_t>")) {
return VarType::VECTORUINT64;
}
return VarType::UNKNOWN;
}
TString TQNTupleDumperAnalysisJob::getTypeString (VarType type){
switch(type){
case TQNTupleDumperAnalysisJob::VarType::INT:
return "int";
case TQNTupleDumperAnalysisJob::VarType::INT32:
return "int32_t";
case TQNTupleDumperAnalysisJob::VarType::INT64:
return "int64_t";
case TQNTupleDumperAnalysisJob::VarType::FLOAT:
return "float";
case TQNTupleDumperAnalysisJob::VarType::DOUBLE:
return "double";
case TQNTupleDumperAnalysisJob::VarType::UI:
return "unsigned int";
case TQNTupleDumperAnalysisJob::VarType::UL:
return "unsigned long";
case TQNTupleDumperAnalysisJob::VarType::ULI:
return "unsigned long int";
case TQNTupleDumperAnalysisJob::VarType::ULL:
return "unsigned long long";
case TQNTupleDumperAnalysisJob::VarType::ULLI:
return "unsigned long long int";
case TQNTupleDumperAnalysisJob::VarType::UINT32:
return "uint32_t";
case TQNTupleDumperAnalysisJob::VarType::UINT64:
return "uint64_t";
case TQNTupleDumperAnalysisJob::VarType::VECTORINT:
return "vector<int>";
case TQNTupleDumperAnalysisJob::VarType::VECTORINT32:
return "vector<int32_t>";
case TQNTupleDumperAnalysisJob::VarType::VECTORINT64:
return "vector<int64_t>";
case TQNTupleDumperAnalysisJob::VarType::VECTORFLOAT:
return "vector<float>";
case TQNTupleDumperAnalysisJob::VarType::VECTORDOUBLE:
return "vector<double>";
case TQNTupleDumperAnalysisJob::VarType::VECTORUI:
return "vector<unsigned int>";
case TQNTupleDumperAnalysisJob::VarType::VECTORUL:
return "vector<unsigned long>";
case TQNTupleDumperAnalysisJob::VarType::VECTORULI:
return "vector<unsigned long int>";
case TQNTupleDumperAnalysisJob::VarType::VECTORULL:
return "vector<unsigned long long>";
case TQNTupleDumperAnalysisJob::VarType::VECTORULLI:
return "vector<unsigned long long int>";
case TQNTupleDumperAnalysisJob::VarType::VECTORUINT32:
return "vector<uint32_t>";
case TQNTupleDumperAnalysisJob::VarType::VECTORUINT64:
return "vector<uint64_t>";
default:
return TQStringUtils::makeBoldRed("invalid");
}
}
int TQNTupleDumperAnalysisJob::nVariables(){
return this->fTypes.size();
}
void TQNTupleDumperAnalysisJob::printBranches(){
std::cout<< TQStringUtils::makeBoldBlue(this->Class()->GetName()) << " " << TQStringUtils::makeBoldWhite(this->GetName()) << std::endl;
for(size_t i=0; i<this->fTypes.size(); ++i){
std::cout << TQStringUtils::fixedWidth(this->getTypeString(this->fTypes[i]),10,"l") << " " <<
TQStringUtils::makeBoldWhite(TQStringUtils::fixedWidth(this->fVarNames[i],20,"l")) << " " <<
TQStringUtils::fixedWidth(this->fExpressions[i],50,"l") << std::endl;
}
}
bool TQNTupleDumperAnalysisJob::bookVariable(const TString& type, const TString& name, const TString& definition){
DEBUGclass("called with arguments '%s','%s','%s'",type.Data(),name.Data(),definition.Data());
return this->bookVariable(this->getVarType(type),name,definition);
}
bool TQNTupleDumperAnalysisJob::bookVariable(VarType type, const TString& name, const TString& definition){
DEBUGclass("called with arguments '%d','%s','%s'",type,name.Data(),definition.Data());
if(type == VarType::UNKNOWN){
ERRORclass("cannot book variable '%s' of unknown type!",name.Data());
return false;
}
this->fTypes.push_back(type);
this->fExpressions.push_back(definition);
this->fVarNames.push_back(name);
return true;
}
bool TQNTupleDumperAnalysisJob::initializeTree(TQTaggable* tags) {
DEBUGclass("entering function");
TQTaggable tempTags;
tempTags.setTagString("cut",this->fCut->GetName());
this->fActiveFileName = tempTags.replaceInTextRecursive( tags->replaceInTextRecursive(this->fFileName,"~",false) );
this->fActiveTreeName = tempTags.replaceInTextRecursive( tags->replaceInTextRecursive(this->fTreeName.Data(),"~",false) );
if(fActiveFileName.Contains("$") || fActiveTreeName.Contains("$")){
ERRORclass("unexpanded placeholders encountered in TQNTupleDumperAnalysisJob::initializeTree: file='%s', tree='%s'. available tags:",fActiveFileName.Data(),fActiveTreeName.Data());
tags->printTags();
throw std::runtime_error("unexpanded placeholders");
return false;
}
DEBUGclass("initializing output file '%s' for '%s'",fActiveFileName.Data(),fActiveTreeName.Data());
this->fActiveFileName = TQPathManager::getPathManager()->getLocalPath(this->fActiveFileName);
DEBUGclass("File will temporarily be written to %s", this->fActiveFileName.Data());
this->fTreeToken = TQNTupleDumperAnalysisJob::getTreeToken(fActiveFileName,fActiveTreeName);
if(!this->fTreeToken){
throw std::runtime_error(TString::Format("unable to open ouptut for '%s':'%s'",fActiveFileName.Data(),fActiveTreeName.Data()).Data());
return false;
}
DEBUGclass("retrieving tree handler");
this->fTreeHandler = (TQNTupleDumperAnalysisJobHelpers::TreeHandle*)(this->fTreeToken->getContent());
DEBUGclass("getting branches");
const size_t size = this->fVarNames.size();
for(size_t i=0; i<size; ++i){
this->fBranches.push_back(this->fTreeHandler->getBranch(this->fVarNames[i],this->fTypes[i]));
DEBUGclass("registered branch '%s' at position %p",this->fVarNames[i].Data(),this->fBranches[i]);
}
if(this->fWriteWeight){
this->fWeightBranch = this->fTreeHandler->getBranch(this->fWeightName,VarType::DOUBLE);
DEBUGclass("registered weight branch '%s' at position %p",this->fWeightName.Data(),this->fWeightBranch);
}
DEBUGclass("done");
return true;
}
void TQNTupleDumperAnalysisJob::writeWeights(bool write, const TString& name){
this->fWriteWeight = write;
this->fWeightName = name;
}
bool TQNTupleDumperAnalysisJob::finalizeTree() {
DEBUGclass("finalizing...");
bool ok = TQNTupleDumperAnalysisJob::returnTreeToken(this->fActiveFileName,this->fActiveTreeName,this->fTreeToken);
this->fActiveFileName.Clear();
this->fActiveTreeName.Clear();
this->fBranches.clear();
this->fTreeToken = NULL;
this->fTreeHandler = NULL;
return ok;
}
bool TQNTupleDumperAnalysisJob::initializeSelf() {
DEBUGclass("initializing observables");
for(size_t i=0; i<this->fVarNames.size(); ++i){
TQObservable* obs = TQObservable::getObservable(this->fExpressions[i],this->fSample);
if (!obs->initialize(this->fSample)) {
ERRORclass("Failed to initialize observable obtained from expression '%s' in TQNTupleDumperAnalysisJob with filename:treename='%s:%s' for sample '%s'",this->fExpressions[i].Data(), this->fFileName.Data(), this->fTreeName.Data() ,this->fSample->getPath().Data());
return false;
}
this->fObservables.push_back(obs);
}
if(!this->fTreeHandler){
DEBUGclass("initializing tree");
this->poolAt = this->fSample;
if(!this->initializeTree(this->fSample)) return false;
}
DEBUGclass("done");
return true;
}
bool TQNTupleDumperAnalysisJob::finalizeSelf() {
DEBUGclass("finalizing observables");
for(size_t i=0; i<this->fVarNames.size(); ++i){
this->fObservables[i]->finalize();
}
this->fObservables.clear();
if(this->poolAt == this->fSample){
DEBUGclass("finalizing tree");
this->poolAt = nullptr;
if(!this->finalizeTree()) return false;
}
this->fExpectSingleEntryPerEvent = false;
return true;
}
bool TQNTupleDumperAnalysisJob::initializeSampleFolder(TQSampleFolder* sf){
if (!sf) return false;
if(!this->poolAt){
TQTaggable tempTags;
tempTags.setTagString("cut",this->fCut->GetName());
TString filename = tempTags.replaceInTextRecursive( sf->replaceInTextRecursive(this->fFileName, "~", false) );
TString treename = tempTags.replaceInTextRecursive( sf->replaceInTextRecursive(this->fTreeName, "~", false) );
bool pool = (!(filename.Contains("$")) && (!(treename.Contains("$"))));
sf->getTagBool(".aj.pool.trees",pool);
if(pool && !this->fTreeHandler){
DEBUG("starting to pool at sample folder '%s'",sf->GetName());
this->poolAt = sf;
this->initializeTree(sf);
}
}
return true;
}
bool TQNTupleDumperAnalysisJob::finalizeSampleFolder(TQSampleFolder* sf){
bool ok = true;
if(sf == this->poolAt){
ok = this->finalizeTree();
this->poolAt = NULL;
}
return ok;
}
int TQNTupleDumperAnalysisJob::getNentriesToCreate() const {
if (fExpectSingleEntryPerEvent) return 1;
int nEntries = -1;
#ifdef _DEBUG_
TQObservable* refObs = nullptr;
#endif
for (size_t i=0; i<fTypes.size(); ++i) {
if (fObservables[i]->getObservableType() != TQObservable::ObservableType::vector) continue;
if (isVectorBranchMap.at(fTypes[i])) continue;
DEBUGclass("found non-trivial observable / branch type combination in TQNTupleDumperAnalysisJob '%s'",this->GetName());
if (nEntries<0) {
nEntries = fObservables[i]->getNevaluations();
#ifdef _DEBUG_
refObs = fObservables[i];
#endif
}
else if (fObservables[i]->getNevaluations() != nEntries) {
#ifdef _DEBUG_
throw std::runtime_error(TString::Format("Found inconsistent number of evaluations between different vector observables in TQNTupleDumperAnalysisJob '%s': %d vs %d evaluations (from observables with expressions '%s' vs '%s').",
this->GetName(),
refObs ? refObs->getNevaluations() : std::numeric_limits<int>::quiet_NaN(),
fObservables[i] ? fObservables[i]->getNevaluations() : std::numeric_limits<int>::quiet_NaN(),
refObs ? refObs->getExpression().Data() : "<observable n/a>",
fObservables[i] ? fObservables[i]->getExpression().Data() : "<observable n/a>"
).Data());
#else//simplified error message
throw std::runtime_error(TString::Format("Found inconsistent number of evaluations between different vector observables in TQNTupleDumperAnalysisJob '%s'",this->GetName()).Data());
#endif
return -1;
}
}
if (nEntries<0) {
this->fExpectSingleEntryPerEvent = true;
return 1;
}
return nEntries;
}
bool TQNTupleDumperAnalysisJob::execute(double weight) {
if(!this->fTreeHandler){
DEBUGclass("invalid treehandler!");
return false;
}
int nToCreate = this->getNentriesToCreate();
if (nToCreate<0) {
ERRORclass("Failed to obtain valid number of entries to create in TQNTupleDumperAnalysisJob '%s'",this->GetName());
return false;
}
for (int entry = 0; entry<nToCreate; ++entry) {
this->fTreeHandler->empty();
for(size_t i=0; i<this->fBranches.size(); ++i){
if (this->fObservables[i]->getObservableType() == TQObservable::ObservableType::vector && !isVectorBranchMap.at(fTypes[i])) {
TRY(
fBranches[i]->setValue(this->fObservables[i]->getValueAt(entry),0);
,TString::Format("Failed to set value for branch '%s' using observable '%s'",fBranches[i]->getName(),this->fObservables[i]->GetName())
)
} else {
for (int vecIndex = this->fObservables[i]->getNevaluations()-1; vecIndex>=0; --vecIndex) {
TRY(
fBranches[i]->setValue(this->fObservables[i]->getValueAt(vecIndex),vecIndex);
,TString::Format("Failed to set value for branch '%s' using observable '%s'",fBranches[i]->getName(),this->fObservables[i]->GetName())
)
}
}
}
if(this->fWriteWeight){
fWeightBranch->setValue(weight*fSample->getNormalisation());
}
DEBUGclass("filling event %d from instance %s at cut %s",fObservables[0]->getCurrentEntry() ,this->GetName(),this->fCut->GetName());
#ifdef _DEBUG_
this->fTreeHandler->print();
#endif
this->fTreeHandler->fill();
}
return true;
}
TObjArray * TQNTupleDumperAnalysisJob::getBranchNames() {
TObjArray * bNames = new TObjArray();
for (size_t i = 0; i < this->fObservables.size(); ++i) {
TQObservable* obs = this->fObservables[i];
if(obs){
TCollection* c = obs->getBranchNames();
if(c){
if(c->GetEntries() > 0) bNames -> AddAll(c);
delete c;
}
}
}
return bNames;
}
TQNTupleDumperAnalysisJob::TQNTupleDumperAnalysisJob(TQNTupleDumperAnalysisJob* other) :
TQAnalysisJob(other ? other->GetName() : "TQNTupleDumperAnalysisJob"),
fTreeName(other ? other->fTreeName : "invalid"),
fFileName(other ? other->fFileName : "invalid.root"),
fWriteWeight(other ? other->fWriteWeight : true),
fWeightName(other ? other->fWeightName : "weight")
{
if(other){
for(int i=0; i<other->nVariables(); ++i){
this->bookVariable(other->fTypes[i], other->fVarNames[i], other->fExpressions[i]);
}
}
}
TQAnalysisJob * TQNTupleDumperAnalysisJob::getClone() {
return new TQNTupleDumperAnalysisJob(this);
}
int TQNTupleDumperAnalysisJob::importJobsFromTextFiles(const std::vector<TString>& filenames, TQCut* basecut, TQTaggable* aliases, const TString& channelFilter, bool verbose){
if(filenames.size() < 1){
ERRORfunc("importing no nTuples from empty files list!");
return -1;
}
std::map<TString,std::vector<TString> > nTupleDefinitions;
std::vector<TString> assignments;
TString buffer;
for(size_t i=0; i<filenames.size(); i++){
std::vector<TString>* lines = TQStringUtils::readFileLines(filenames[i]);
if(!lines){
if(verbose) ERRORfunc("unable to open file '%s'",filenames[i].Data());
continue;
}
for(size_t j=0; j<lines->size(); j++){
TString line(lines->at(j));
TQStringUtils::readBlanks(line);
if(line.IsNull()) continue;
if(!line.BeginsWith("@")){
TString name, def;
if(!TQStringUtils::readUpTo(line,name,":")){
if(verbose) ERRORfunc("unable to parse nTuple definition '%s'",line.Data());
continue;
}
TQStringUtils::removeLeading(line,": ");
bool foundSemicolon = false;
while(!foundSemicolon) {
TQStringUtils::readUpTo(line,def,";","()[]{}");
if(line.Length()>0) {
foundSemicolon = true;
} else {
++j;
if (j>=lines->size()) {
ERRORfunc("Failed to parse nTuple definition for '%s': could not find terminating semicolon!");
return -1;
}
TQStringUtils::removeTrailing(def,"\n");
line.Append(lines->at(j));
}
}
DEBUGclass("found definition: '%s', assigning as '%s'",def.Data(),name.Data());
nTupleDefinitions[TQStringUtils::trim(name)] = TQStringUtils::tokenizeVector(def,",",true,"{}()[]","\"\"''");
} else if(TQStringUtils::removeLeading(line,"@") == 1){
DEBUGclass("found assignment: '%s'",line.Data());
assignments.push_back(line);
} else {
if(verbose) WARNfunc("encountered unknown token: '%s'",line.Data());
}
}
delete lines;
}
struct JobInfo {
TQNTupleDumperAnalysisJob* job;
TString cuts;
};
std::vector<JobInfo> jobs;
for(size_t i=0; i<assignments.size(); i++){
TString assignment = assignments[i];
DEBUGclass("looking at assignment '%s'",assignment.Data());
TString channel;
if(TQStringUtils::readBlock(assignment,channel) && !channel.IsNull() && !TQStringUtils::matches(channel,channelFilter)) continue;
TString cuts,nTuples;
TQStringUtils::readUpTo(assignment,cuts,":");
TQStringUtils::readToken(assignment,buffer," :");
TQStringUtils::readUpTo(assignment,nTuples,";");
TQStringUtils::readToken(assignment,buffer,"; ");
DEBUGclass("nTuples: '%s'",nTuples.Data());
DEBUGclass("cuts: '%s'",cuts.Data());
DEBUGclass("spare symbols: '%s'",buffer.Data());
std::vector<TString> vNtups = TQStringUtils::split(nTuples,",");
if(vNtups.size() < 1){
if(verbose) ERRORfunc("no nTuples listed in assignment '%s'",assignments[i].Data());
continue;
}
for(size_t j=0; j<vNtups.size(); j++){
TString ntupbooking(aliases ? aliases->replaceInTextRecursive(vNtups[j]) : vNtups[j]);
TString ntupname,filename,treename;
TQStringUtils::removeLeading(ntupbooking," ");
TQStringUtils::readUpTo(ntupbooking,ntupname," >");
TQStringUtils::readToken(ntupbooking,buffer," >");
TQStringUtils::readUpTo(ntupbooking,filename," :");
TQStringUtils::readToken(ntupbooking,buffer," :");
TQStringUtils::readUpTo(ntupbooking,treename," ;");
DEBUGclass("ntup: '%s'",ntupname.Data());
DEBUGclass("filname: '%s'",filename.Data());
DEBUGclass("treename: '%s'",treename.Data());
std::vector<TString> def = nTupleDefinitions[ntupname];
if(def.empty()){
if(verbose) ERRORfunc("unable to find nTuple definition for name '%s', skipping",vNtups[j].Data());
continue;
}
bool is_new_job = true;
TQNTupleDumperAnalysisJob* job = nullptr;
for (JobInfo& job_info : jobs) {
if (job_info.job->getFileName() == filename && job_info.job->getTreeName() == treename && job_info.cuts == cuts) {
DEBUGclass("Found existing job with same filename, treename, and cuts");
job = job_info.job;
job->SetName((TString(job->GetName()) + "_" + ntupname).Data());
is_new_job = false;
break;
}
}
if (is_new_job) {
job = new TQNTupleDumperAnalysisJob(ntupname);
job->setTreeName(treename);
job->setFileName(filename);
}
for(size_t i=0; i<def.size(); i++){
TString branch(aliases ? aliases->replaceInTextRecursive(def[i]) : def[i]);
const TString bakbranch(branch);
DEBUGclass("parsing definition '%s'",branch.Data());
TQStringUtils::removeLeading(branch," \t");
TString type_name;
TQStringUtils::readUpToText(branch,type_name,"<<");
TQStringUtils::removeLeading(type_name," \t");
TQStringUtils::removeTrailing(type_name," \t");
int sep = TQStringUtils::findLastOf(type_name,"\t ");
TString typeStr = TQStringUtils::trim(type_name(0,sep));
TString name = type_name(sep+1,type_name.Length()-sep-1);
DEBUGclass("type of the branch '%s'",typeStr.Data());
DEBUGclass("name of the branch '%s'",name.Data());
TQStringUtils::removeLeading(branch," <\t");
if( !typeStr.IsNull() && !name.IsNull() && !branch.IsNull()){
DEBUGclass("booking variable '%s' (%s) with expression '%s'",name.Data(),typeStr.Data(),branch.Data());
job->bookVariable(typeStr,name,branch);
} else {
TQNTupleDumperAnalysisJob::setErrorMessage(TString::Format("unable to parse variable definition: '%s', expected syntax is 'type name << expression'. The following elements have been extracted from your definition: type = '%s', name = '%s', expression = '%s'",bakbranch.Data(), typeStr.Data(), name.Data(), branch.Data() ));
}
}
if(job->nVariables() < 1){
DEBUGclass("error booking nTuple for '%s', function says '%s'",fErrMsg.getMessages().Data());
delete job;
} else {
if (is_new_job) {
jobs.push_back({job, cuts});
}
}
}
}
int retval = 0;
for (JobInfo& job_info : jobs) {
if(verbose) job_info.job->printBranches();
basecut->addAnalysisJob(job_info.job, job_info.cuts);
retval += 1;
delete job_info.job;
}
DEBUGclass("end of function call, found %d ntuple definitions",retval);
return retval;
}
TString TQNTupleDumperAnalysisJob::getErrorMessage() {
return fErrMsg.getMessages();
}
void TQNTupleDumperAnalysisJob::setErrorMessage(const TString& message) {
fErrMsg.sendClassFunctionMessage(TQMessageStream::INFO,TQNTupleDumperAnalysisJob::Class(),"<anonymous>",message);
}
TString TQNTupleDumperAnalysisJob::getTreeName() const {
return this->fTreeName;
}
void TQNTupleDumperAnalysisJob::setTreeName (const TString& treename){
this->fTreeName=treename;
}
TString TQNTupleDumperAnalysisJob::getFileName() const {
return this->fFileName;
}
void TQNTupleDumperAnalysisJob::setFileName (const TString& filename){
this->fFileName = filename;
}
TQNTupleDumperAnalysisJob.cxx:1 TQNTupleDumperAnalysisJob.cxx:2 TQNTupleDumperAnalysisJob.cxx:3 TQNTupleDumperAnalysisJob.cxx:4 TQNTupleDumperAnalysisJob.cxx:5 TQNTupleDumperAnalysisJob.cxx:6 TQNTupleDumperAnalysisJob.cxx:7 TQNTupleDumperAnalysisJob.cxx:8 TQNTupleDumperAnalysisJob.cxx:9 TQNTupleDumperAnalysisJob.cxx:10 TQNTupleDumperAnalysisJob.cxx:11 TQNTupleDumperAnalysisJob.cxx:12 TQNTupleDumperAnalysisJob.cxx:13 TQNTupleDumperAnalysisJob.cxx:14 TQNTupleDumperAnalysisJob.cxx:15 TQNTupleDumperAnalysisJob.cxx:16 TQNTupleDumperAnalysisJob.cxx:17 TQNTupleDumperAnalysisJob.cxx:18 TQNTupleDumperAnalysisJob.cxx:19 TQNTupleDumperAnalysisJob.cxx:20 TQNTupleDumperAnalysisJob.cxx:21 TQNTupleDumperAnalysisJob.cxx:22 TQNTupleDumperAnalysisJob.cxx:23 TQNTupleDumperAnalysisJob.cxx:24 TQNTupleDumperAnalysisJob.cxx:25 TQNTupleDumperAnalysisJob.cxx:26 TQNTupleDumperAnalysisJob.cxx:27 TQNTupleDumperAnalysisJob.cxx:28 TQNTupleDumperAnalysisJob.cxx:29 TQNTupleDumperAnalysisJob.cxx:30 TQNTupleDumperAnalysisJob.cxx:31 TQNTupleDumperAnalysisJob.cxx:32 TQNTupleDumperAnalysisJob.cxx:33 TQNTupleDumperAnalysisJob.cxx:34 TQNTupleDumperAnalysisJob.cxx:35 TQNTupleDumperAnalysisJob.cxx:36 TQNTupleDumperAnalysisJob.cxx:37 TQNTupleDumperAnalysisJob.cxx:38 TQNTupleDumperAnalysisJob.cxx:39 TQNTupleDumperAnalysisJob.cxx:40 TQNTupleDumperAnalysisJob.cxx:41 TQNTupleDumperAnalysisJob.cxx:42 TQNTupleDumperAnalysisJob.cxx:43 TQNTupleDumperAnalysisJob.cxx:44 TQNTupleDumperAnalysisJob.cxx:45 TQNTupleDumperAnalysisJob.cxx:46 TQNTupleDumperAnalysisJob.cxx:47 TQNTupleDumperAnalysisJob.cxx:48 TQNTupleDumperAnalysisJob.cxx:49 TQNTupleDumperAnalysisJob.cxx:50 TQNTupleDumperAnalysisJob.cxx:51 TQNTupleDumperAnalysisJob.cxx:52 TQNTupleDumperAnalysisJob.cxx:53 TQNTupleDumperAnalysisJob.cxx:54 TQNTupleDumperAnalysisJob.cxx:55 TQNTupleDumperAnalysisJob.cxx:56 TQNTupleDumperAnalysisJob.cxx:57 TQNTupleDumperAnalysisJob.cxx:58 TQNTupleDumperAnalysisJob.cxx:59 TQNTupleDumperAnalysisJob.cxx:60 TQNTupleDumperAnalysisJob.cxx:61 TQNTupleDumperAnalysisJob.cxx:62 TQNTupleDumperAnalysisJob.cxx:63 TQNTupleDumperAnalysisJob.cxx:64 TQNTupleDumperAnalysisJob.cxx:65 TQNTupleDumperAnalysisJob.cxx:66 TQNTupleDumperAnalysisJob.cxx:67 TQNTupleDumperAnalysisJob.cxx:68 TQNTupleDumperAnalysisJob.cxx:69 TQNTupleDumperAnalysisJob.cxx:70 TQNTupleDumperAnalysisJob.cxx:71 TQNTupleDumperAnalysisJob.cxx:72 TQNTupleDumperAnalysisJob.cxx:73 TQNTupleDumperAnalysisJob.cxx:74 TQNTupleDumperAnalysisJob.cxx:75 TQNTupleDumperAnalysisJob.cxx:76 TQNTupleDumperAnalysisJob.cxx:77 TQNTupleDumperAnalysisJob.cxx:78 TQNTupleDumperAnalysisJob.cxx:79 TQNTupleDumperAnalysisJob.cxx:80 TQNTupleDumperAnalysisJob.cxx:81 TQNTupleDumperAnalysisJob.cxx:82 TQNTupleDumperAnalysisJob.cxx:83 TQNTupleDumperAnalysisJob.cxx:84 TQNTupleDumperAnalysisJob.cxx:85 TQNTupleDumperAnalysisJob.cxx:86 TQNTupleDumperAnalysisJob.cxx:87 TQNTupleDumperAnalysisJob.cxx:88 TQNTupleDumperAnalysisJob.cxx:89 TQNTupleDumperAnalysisJob.cxx:90 TQNTupleDumperAnalysisJob.cxx:91 TQNTupleDumperAnalysisJob.cxx:92 TQNTupleDumperAnalysisJob.cxx:93 TQNTupleDumperAnalysisJob.cxx:94 TQNTupleDumperAnalysisJob.cxx:95 TQNTupleDumperAnalysisJob.cxx:96 TQNTupleDumperAnalysisJob.cxx:97 TQNTupleDumperAnalysisJob.cxx:98 TQNTupleDumperAnalysisJob.cxx:99 TQNTupleDumperAnalysisJob.cxx:100 TQNTupleDumperAnalysisJob.cxx:101 TQNTupleDumperAnalysisJob.cxx:102 TQNTupleDumperAnalysisJob.cxx:103 TQNTupleDumperAnalysisJob.cxx:104 TQNTupleDumperAnalysisJob.cxx:105 TQNTupleDumperAnalysisJob.cxx:106 TQNTupleDumperAnalysisJob.cxx:107 TQNTupleDumperAnalysisJob.cxx:108 TQNTupleDumperAnalysisJob.cxx:109 TQNTupleDumperAnalysisJob.cxx:110 TQNTupleDumperAnalysisJob.cxx:111 TQNTupleDumperAnalysisJob.cxx:112 TQNTupleDumperAnalysisJob.cxx:113 TQNTupleDumperAnalysisJob.cxx:114 TQNTupleDumperAnalysisJob.cxx:115 TQNTupleDumperAnalysisJob.cxx:116 TQNTupleDumperAnalysisJob.cxx:117 TQNTupleDumperAnalysisJob.cxx:118 TQNTupleDumperAnalysisJob.cxx:119 TQNTupleDumperAnalysisJob.cxx:120 TQNTupleDumperAnalysisJob.cxx:121 TQNTupleDumperAnalysisJob.cxx:122 TQNTupleDumperAnalysisJob.cxx:123 TQNTupleDumperAnalysisJob.cxx:124 TQNTupleDumperAnalysisJob.cxx:125 TQNTupleDumperAnalysisJob.cxx:126 TQNTupleDumperAnalysisJob.cxx:127 TQNTupleDumperAnalysisJob.cxx:128 TQNTupleDumperAnalysisJob.cxx:129 TQNTupleDumperAnalysisJob.cxx:130 TQNTupleDumperAnalysisJob.cxx:131 TQNTupleDumperAnalysisJob.cxx:132 TQNTupleDumperAnalysisJob.cxx:133 TQNTupleDumperAnalysisJob.cxx:134 TQNTupleDumperAnalysisJob.cxx:135 TQNTupleDumperAnalysisJob.cxx:136 TQNTupleDumperAnalysisJob.cxx:137 TQNTupleDumperAnalysisJob.cxx:138 TQNTupleDumperAnalysisJob.cxx:139 TQNTupleDumperAnalysisJob.cxx:140 TQNTupleDumperAnalysisJob.cxx:141 TQNTupleDumperAnalysisJob.cxx:142 TQNTupleDumperAnalysisJob.cxx:143 TQNTupleDumperAnalysisJob.cxx:144 TQNTupleDumperAnalysisJob.cxx:145 TQNTupleDumperAnalysisJob.cxx:146 TQNTupleDumperAnalysisJob.cxx:147 TQNTupleDumperAnalysisJob.cxx:148 TQNTupleDumperAnalysisJob.cxx:149 TQNTupleDumperAnalysisJob.cxx:150 TQNTupleDumperAnalysisJob.cxx:151 TQNTupleDumperAnalysisJob.cxx:152 TQNTupleDumperAnalysisJob.cxx:153 TQNTupleDumperAnalysisJob.cxx:154 TQNTupleDumperAnalysisJob.cxx:155 TQNTupleDumperAnalysisJob.cxx:156 TQNTupleDumperAnalysisJob.cxx:157 TQNTupleDumperAnalysisJob.cxx:158 TQNTupleDumperAnalysisJob.cxx:159 TQNTupleDumperAnalysisJob.cxx:160 TQNTupleDumperAnalysisJob.cxx:161 TQNTupleDumperAnalysisJob.cxx:162 TQNTupleDumperAnalysisJob.cxx:163 TQNTupleDumperAnalysisJob.cxx:164 TQNTupleDumperAnalysisJob.cxx:165 TQNTupleDumperAnalysisJob.cxx:166 TQNTupleDumperAnalysisJob.cxx:167 TQNTupleDumperAnalysisJob.cxx:168 TQNTupleDumperAnalysisJob.cxx:169 TQNTupleDumperAnalysisJob.cxx:170 TQNTupleDumperAnalysisJob.cxx:171 TQNTupleDumperAnalysisJob.cxx:172 TQNTupleDumperAnalysisJob.cxx:173 TQNTupleDumperAnalysisJob.cxx:174 TQNTupleDumperAnalysisJob.cxx:175 TQNTupleDumperAnalysisJob.cxx:176 TQNTupleDumperAnalysisJob.cxx:177 TQNTupleDumperAnalysisJob.cxx:178 TQNTupleDumperAnalysisJob.cxx:179 TQNTupleDumperAnalysisJob.cxx:180 TQNTupleDumperAnalysisJob.cxx:181 TQNTupleDumperAnalysisJob.cxx:182 TQNTupleDumperAnalysisJob.cxx:183 TQNTupleDumperAnalysisJob.cxx:184 TQNTupleDumperAnalysisJob.cxx:185 TQNTupleDumperAnalysisJob.cxx:186 TQNTupleDumperAnalysisJob.cxx:187 TQNTupleDumperAnalysisJob.cxx:188 TQNTupleDumperAnalysisJob.cxx:189 TQNTupleDumperAnalysisJob.cxx:190 TQNTupleDumperAnalysisJob.cxx:191 TQNTupleDumperAnalysisJob.cxx:192 TQNTupleDumperAnalysisJob.cxx:193 TQNTupleDumperAnalysisJob.cxx:194 TQNTupleDumperAnalysisJob.cxx:195 TQNTupleDumperAnalysisJob.cxx:196 TQNTupleDumperAnalysisJob.cxx:197 TQNTupleDumperAnalysisJob.cxx:198 TQNTupleDumperAnalysisJob.cxx:199 TQNTupleDumperAnalysisJob.cxx:200 TQNTupleDumperAnalysisJob.cxx:201 TQNTupleDumperAnalysisJob.cxx:202 TQNTupleDumperAnalysisJob.cxx:203 TQNTupleDumperAnalysisJob.cxx:204 TQNTupleDumperAnalysisJob.cxx:205 TQNTupleDumperAnalysisJob.cxx:206 TQNTupleDumperAnalysisJob.cxx:207 TQNTupleDumperAnalysisJob.cxx:208 TQNTupleDumperAnalysisJob.cxx:209 TQNTupleDumperAnalysisJob.cxx:210 TQNTupleDumperAnalysisJob.cxx:211 TQNTupleDumperAnalysisJob.cxx:212 TQNTupleDumperAnalysisJob.cxx:213 TQNTupleDumperAnalysisJob.cxx:214 TQNTupleDumperAnalysisJob.cxx:215 TQNTupleDumperAnalysisJob.cxx:216 TQNTupleDumperAnalysisJob.cxx:217 TQNTupleDumperAnalysisJob.cxx:218 TQNTupleDumperAnalysisJob.cxx:219 TQNTupleDumperAnalysisJob.cxx:220 TQNTupleDumperAnalysisJob.cxx:221 TQNTupleDumperAnalysisJob.cxx:222 TQNTupleDumperAnalysisJob.cxx:223 TQNTupleDumperAnalysisJob.cxx:224 TQNTupleDumperAnalysisJob.cxx:225 TQNTupleDumperAnalysisJob.cxx:226 TQNTupleDumperAnalysisJob.cxx:227 TQNTupleDumperAnalysisJob.cxx:228 TQNTupleDumperAnalysisJob.cxx:229 TQNTupleDumperAnalysisJob.cxx:230 TQNTupleDumperAnalysisJob.cxx:231 TQNTupleDumperAnalysisJob.cxx:232 TQNTupleDumperAnalysisJob.cxx:233 TQNTupleDumperAnalysisJob.cxx:234 TQNTupleDumperAnalysisJob.cxx:235 TQNTupleDumperAnalysisJob.cxx:236 TQNTupleDumperAnalysisJob.cxx:237 TQNTupleDumperAnalysisJob.cxx:238 TQNTupleDumperAnalysisJob.cxx:239 TQNTupleDumperAnalysisJob.cxx:240 TQNTupleDumperAnalysisJob.cxx:241 TQNTupleDumperAnalysisJob.cxx:242 TQNTupleDumperAnalysisJob.cxx:243 TQNTupleDumperAnalysisJob.cxx:244 TQNTupleDumperAnalysisJob.cxx:245 TQNTupleDumperAnalysisJob.cxx:246 TQNTupleDumperAnalysisJob.cxx:247 TQNTupleDumperAnalysisJob.cxx:248 TQNTupleDumperAnalysisJob.cxx:249 TQNTupleDumperAnalysisJob.cxx:250 TQNTupleDumperAnalysisJob.cxx:251 TQNTupleDumperAnalysisJob.cxx:252 TQNTupleDumperAnalysisJob.cxx:253 TQNTupleDumperAnalysisJob.cxx:254 TQNTupleDumperAnalysisJob.cxx:255 TQNTupleDumperAnalysisJob.cxx:256 TQNTupleDumperAnalysisJob.cxx:257 TQNTupleDumperAnalysisJob.cxx:258 TQNTupleDumperAnalysisJob.cxx:259 TQNTupleDumperAnalysisJob.cxx:260 TQNTupleDumperAnalysisJob.cxx:261 TQNTupleDumperAnalysisJob.cxx:262 TQNTupleDumperAnalysisJob.cxx:263 TQNTupleDumperAnalysisJob.cxx:264 TQNTupleDumperAnalysisJob.cxx:265 TQNTupleDumperAnalysisJob.cxx:266 TQNTupleDumperAnalysisJob.cxx:267 TQNTupleDumperAnalysisJob.cxx:268 TQNTupleDumperAnalysisJob.cxx:269 TQNTupleDumperAnalysisJob.cxx:270 TQNTupleDumperAnalysisJob.cxx:271 TQNTupleDumperAnalysisJob.cxx:272 TQNTupleDumperAnalysisJob.cxx:273 TQNTupleDumperAnalysisJob.cxx:274 TQNTupleDumperAnalysisJob.cxx:275 TQNTupleDumperAnalysisJob.cxx:276 TQNTupleDumperAnalysisJob.cxx:277 TQNTupleDumperAnalysisJob.cxx:278 TQNTupleDumperAnalysisJob.cxx:279 TQNTupleDumperAnalysisJob.cxx:280 TQNTupleDumperAnalysisJob.cxx:281 TQNTupleDumperAnalysisJob.cxx:282 TQNTupleDumperAnalysisJob.cxx:283 TQNTupleDumperAnalysisJob.cxx:284 TQNTupleDumperAnalysisJob.cxx:285 TQNTupleDumperAnalysisJob.cxx:286 TQNTupleDumperAnalysisJob.cxx:287 TQNTupleDumperAnalysisJob.cxx:288 TQNTupleDumperAnalysisJob.cxx:289 TQNTupleDumperAnalysisJob.cxx:290 TQNTupleDumperAnalysisJob.cxx:291 TQNTupleDumperAnalysisJob.cxx:292 TQNTupleDumperAnalysisJob.cxx:293 TQNTupleDumperAnalysisJob.cxx:294 TQNTupleDumperAnalysisJob.cxx:295 TQNTupleDumperAnalysisJob.cxx:296 TQNTupleDumperAnalysisJob.cxx:297 TQNTupleDumperAnalysisJob.cxx:298 TQNTupleDumperAnalysisJob.cxx:299 TQNTupleDumperAnalysisJob.cxx:300 TQNTupleDumperAnalysisJob.cxx:301 TQNTupleDumperAnalysisJob.cxx:302 TQNTupleDumperAnalysisJob.cxx:303 TQNTupleDumperAnalysisJob.cxx:304 TQNTupleDumperAnalysisJob.cxx:305 TQNTupleDumperAnalysisJob.cxx:306 TQNTupleDumperAnalysisJob.cxx:307 TQNTupleDumperAnalysisJob.cxx:308 TQNTupleDumperAnalysisJob.cxx:309 TQNTupleDumperAnalysisJob.cxx:310 TQNTupleDumperAnalysisJob.cxx:311 TQNTupleDumperAnalysisJob.cxx:312 TQNTupleDumperAnalysisJob.cxx:313 TQNTupleDumperAnalysisJob.cxx:314 TQNTupleDumperAnalysisJob.cxx:315 TQNTupleDumperAnalysisJob.cxx:316 TQNTupleDumperAnalysisJob.cxx:317 TQNTupleDumperAnalysisJob.cxx:318 TQNTupleDumperAnalysisJob.cxx:319 TQNTupleDumperAnalysisJob.cxx:320 TQNTupleDumperAnalysisJob.cxx:321 TQNTupleDumperAnalysisJob.cxx:322 TQNTupleDumperAnalysisJob.cxx:323 TQNTupleDumperAnalysisJob.cxx:324 TQNTupleDumperAnalysisJob.cxx:325 TQNTupleDumperAnalysisJob.cxx:326 TQNTupleDumperAnalysisJob.cxx:327 TQNTupleDumperAnalysisJob.cxx:328 TQNTupleDumperAnalysisJob.cxx:329 TQNTupleDumperAnalysisJob.cxx:330 TQNTupleDumperAnalysisJob.cxx:331 TQNTupleDumperAnalysisJob.cxx:332 TQNTupleDumperAnalysisJob.cxx:333 TQNTupleDumperAnalysisJob.cxx:334 TQNTupleDumperAnalysisJob.cxx:335 TQNTupleDumperAnalysisJob.cxx:336 TQNTupleDumperAnalysisJob.cxx:337 TQNTupleDumperAnalysisJob.cxx:338 TQNTupleDumperAnalysisJob.cxx:339 TQNTupleDumperAnalysisJob.cxx:340 TQNTupleDumperAnalysisJob.cxx:341 TQNTupleDumperAnalysisJob.cxx:342 TQNTupleDumperAnalysisJob.cxx:343 TQNTupleDumperAnalysisJob.cxx:344 TQNTupleDumperAnalysisJob.cxx:345 TQNTupleDumperAnalysisJob.cxx:346 TQNTupleDumperAnalysisJob.cxx:347 TQNTupleDumperAnalysisJob.cxx:348 TQNTupleDumperAnalysisJob.cxx:349 TQNTupleDumperAnalysisJob.cxx:350 TQNTupleDumperAnalysisJob.cxx:351 TQNTupleDumperAnalysisJob.cxx:352 TQNTupleDumperAnalysisJob.cxx:353 TQNTupleDumperAnalysisJob.cxx:354 TQNTupleDumperAnalysisJob.cxx:355 TQNTupleDumperAnalysisJob.cxx:356 TQNTupleDumperAnalysisJob.cxx:357 TQNTupleDumperAnalysisJob.cxx:358 TQNTupleDumperAnalysisJob.cxx:359 TQNTupleDumperAnalysisJob.cxx:360 TQNTupleDumperAnalysisJob.cxx:361 TQNTupleDumperAnalysisJob.cxx:362 TQNTupleDumperAnalysisJob.cxx:363 TQNTupleDumperAnalysisJob.cxx:364 TQNTupleDumperAnalysisJob.cxx:365 TQNTupleDumperAnalysisJob.cxx:366 TQNTupleDumperAnalysisJob.cxx:367 TQNTupleDumperAnalysisJob.cxx:368 TQNTupleDumperAnalysisJob.cxx:369 TQNTupleDumperAnalysisJob.cxx:370 TQNTupleDumperAnalysisJob.cxx:371 TQNTupleDumperAnalysisJob.cxx:372 TQNTupleDumperAnalysisJob.cxx:373 TQNTupleDumperAnalysisJob.cxx:374 TQNTupleDumperAnalysisJob.cxx:375 TQNTupleDumperAnalysisJob.cxx:376 TQNTupleDumperAnalysisJob.cxx:377 TQNTupleDumperAnalysisJob.cxx:378 TQNTupleDumperAnalysisJob.cxx:379 TQNTupleDumperAnalysisJob.cxx:380 TQNTupleDumperAnalysisJob.cxx:381 TQNTupleDumperAnalysisJob.cxx:382 TQNTupleDumperAnalysisJob.cxx:383 TQNTupleDumperAnalysisJob.cxx:384 TQNTupleDumperAnalysisJob.cxx:385 TQNTupleDumperAnalysisJob.cxx:386 TQNTupleDumperAnalysisJob.cxx:387 TQNTupleDumperAnalysisJob.cxx:388 TQNTupleDumperAnalysisJob.cxx:389 TQNTupleDumperAnalysisJob.cxx:390 TQNTupleDumperAnalysisJob.cxx:391 TQNTupleDumperAnalysisJob.cxx:392 TQNTupleDumperAnalysisJob.cxx:393 TQNTupleDumperAnalysisJob.cxx:394 TQNTupleDumperAnalysisJob.cxx:395 TQNTupleDumperAnalysisJob.cxx:396 TQNTupleDumperAnalysisJob.cxx:397 TQNTupleDumperAnalysisJob.cxx:398 TQNTupleDumperAnalysisJob.cxx:399 TQNTupleDumperAnalysisJob.cxx:400 TQNTupleDumperAnalysisJob.cxx:401 TQNTupleDumperAnalysisJob.cxx:402 TQNTupleDumperAnalysisJob.cxx:403 TQNTupleDumperAnalysisJob.cxx:404 TQNTupleDumperAnalysisJob.cxx:405 TQNTupleDumperAnalysisJob.cxx:406 TQNTupleDumperAnalysisJob.cxx:407 TQNTupleDumperAnalysisJob.cxx:408 TQNTupleDumperAnalysisJob.cxx:409 TQNTupleDumperAnalysisJob.cxx:410 TQNTupleDumperAnalysisJob.cxx:411 TQNTupleDumperAnalysisJob.cxx:412 TQNTupleDumperAnalysisJob.cxx:413 TQNTupleDumperAnalysisJob.cxx:414 TQNTupleDumperAnalysisJob.cxx:415 TQNTupleDumperAnalysisJob.cxx:416 TQNTupleDumperAnalysisJob.cxx:417 TQNTupleDumperAnalysisJob.cxx:418 TQNTupleDumperAnalysisJob.cxx:419 TQNTupleDumperAnalysisJob.cxx:420 TQNTupleDumperAnalysisJob.cxx:421 TQNTupleDumperAnalysisJob.cxx:422 TQNTupleDumperAnalysisJob.cxx:423 TQNTupleDumperAnalysisJob.cxx:424 TQNTupleDumperAnalysisJob.cxx:425 TQNTupleDumperAnalysisJob.cxx:426 TQNTupleDumperAnalysisJob.cxx:427 TQNTupleDumperAnalysisJob.cxx:428 TQNTupleDumperAnalysisJob.cxx:429 TQNTupleDumperAnalysisJob.cxx:430 TQNTupleDumperAnalysisJob.cxx:431 TQNTupleDumperAnalysisJob.cxx:432 TQNTupleDumperAnalysisJob.cxx:433 TQNTupleDumperAnalysisJob.cxx:434 TQNTupleDumperAnalysisJob.cxx:435 TQNTupleDumperAnalysisJob.cxx:436 TQNTupleDumperAnalysisJob.cxx:437 TQNTupleDumperAnalysisJob.cxx:438 TQNTupleDumperAnalysisJob.cxx:439 TQNTupleDumperAnalysisJob.cxx:440 TQNTupleDumperAnalysisJob.cxx:441 TQNTupleDumperAnalysisJob.cxx:442 TQNTupleDumperAnalysisJob.cxx:443 TQNTupleDumperAnalysisJob.cxx:444 TQNTupleDumperAnalysisJob.cxx:445 TQNTupleDumperAnalysisJob.cxx:446 TQNTupleDumperAnalysisJob.cxx:447 TQNTupleDumperAnalysisJob.cxx:448 TQNTupleDumperAnalysisJob.cxx:449 TQNTupleDumperAnalysisJob.cxx:450 TQNTupleDumperAnalysisJob.cxx:451 TQNTupleDumperAnalysisJob.cxx:452 TQNTupleDumperAnalysisJob.cxx:453 TQNTupleDumperAnalysisJob.cxx:454 TQNTupleDumperAnalysisJob.cxx:455 TQNTupleDumperAnalysisJob.cxx:456 TQNTupleDumperAnalysisJob.cxx:457 TQNTupleDumperAnalysisJob.cxx:458 TQNTupleDumperAnalysisJob.cxx:459 TQNTupleDumperAnalysisJob.cxx:460 TQNTupleDumperAnalysisJob.cxx:461 TQNTupleDumperAnalysisJob.cxx:462 TQNTupleDumperAnalysisJob.cxx:463 TQNTupleDumperAnalysisJob.cxx:464 TQNTupleDumperAnalysisJob.cxx:465 TQNTupleDumperAnalysisJob.cxx:466 TQNTupleDumperAnalysisJob.cxx:467 TQNTupleDumperAnalysisJob.cxx:468 TQNTupleDumperAnalysisJob.cxx:469 TQNTupleDumperAnalysisJob.cxx:470 TQNTupleDumperAnalysisJob.cxx:471 TQNTupleDumperAnalysisJob.cxx:472 TQNTupleDumperAnalysisJob.cxx:473 TQNTupleDumperAnalysisJob.cxx:474 TQNTupleDumperAnalysisJob.cxx:475 TQNTupleDumperAnalysisJob.cxx:476 TQNTupleDumperAnalysisJob.cxx:477 TQNTupleDumperAnalysisJob.cxx:478 TQNTupleDumperAnalysisJob.cxx:479 TQNTupleDumperAnalysisJob.cxx:480 TQNTupleDumperAnalysisJob.cxx:481 TQNTupleDumperAnalysisJob.cxx:482 TQNTupleDumperAnalysisJob.cxx:483 TQNTupleDumperAnalysisJob.cxx:484 TQNTupleDumperAnalysisJob.cxx:485 TQNTupleDumperAnalysisJob.cxx:486 TQNTupleDumperAnalysisJob.cxx:487 TQNTupleDumperAnalysisJob.cxx:488 TQNTupleDumperAnalysisJob.cxx:489 TQNTupleDumperAnalysisJob.cxx:490 TQNTupleDumperAnalysisJob.cxx:491 TQNTupleDumperAnalysisJob.cxx:492 TQNTupleDumperAnalysisJob.cxx:493 TQNTupleDumperAnalysisJob.cxx:494 TQNTupleDumperAnalysisJob.cxx:495 TQNTupleDumperAnalysisJob.cxx:496 TQNTupleDumperAnalysisJob.cxx:497 TQNTupleDumperAnalysisJob.cxx:498 TQNTupleDumperAnalysisJob.cxx:499 TQNTupleDumperAnalysisJob.cxx:500 TQNTupleDumperAnalysisJob.cxx:501 TQNTupleDumperAnalysisJob.cxx:502 TQNTupleDumperAnalysisJob.cxx:503 TQNTupleDumperAnalysisJob.cxx:504 TQNTupleDumperAnalysisJob.cxx:505 TQNTupleDumperAnalysisJob.cxx:506 TQNTupleDumperAnalysisJob.cxx:507 TQNTupleDumperAnalysisJob.cxx:508 TQNTupleDumperAnalysisJob.cxx:509 TQNTupleDumperAnalysisJob.cxx:510 TQNTupleDumperAnalysisJob.cxx:511 TQNTupleDumperAnalysisJob.cxx:512 TQNTupleDumperAnalysisJob.cxx:513 TQNTupleDumperAnalysisJob.cxx:514 TQNTupleDumperAnalysisJob.cxx:515 TQNTupleDumperAnalysisJob.cxx:516 TQNTupleDumperAnalysisJob.cxx:517 TQNTupleDumperAnalysisJob.cxx:518 TQNTupleDumperAnalysisJob.cxx:519 TQNTupleDumperAnalysisJob.cxx:520 TQNTupleDumperAnalysisJob.cxx:521 TQNTupleDumperAnalysisJob.cxx:522 TQNTupleDumperAnalysisJob.cxx:523 TQNTupleDumperAnalysisJob.cxx:524 TQNTupleDumperAnalysisJob.cxx:525 TQNTupleDumperAnalysisJob.cxx:526 TQNTupleDumperAnalysisJob.cxx:527 TQNTupleDumperAnalysisJob.cxx:528 TQNTupleDumperAnalysisJob.cxx:529 TQNTupleDumperAnalysisJob.cxx:530 TQNTupleDumperAnalysisJob.cxx:531 TQNTupleDumperAnalysisJob.cxx:532 TQNTupleDumperAnalysisJob.cxx:533 TQNTupleDumperAnalysisJob.cxx:534 TQNTupleDumperAnalysisJob.cxx:535 TQNTupleDumperAnalysisJob.cxx:536 TQNTupleDumperAnalysisJob.cxx:537 TQNTupleDumperAnalysisJob.cxx:538 TQNTupleDumperAnalysisJob.cxx:539 TQNTupleDumperAnalysisJob.cxx:540 TQNTupleDumperAnalysisJob.cxx:541 TQNTupleDumperAnalysisJob.cxx:542 TQNTupleDumperAnalysisJob.cxx:543 TQNTupleDumperAnalysisJob.cxx:544 TQNTupleDumperAnalysisJob.cxx:545 TQNTupleDumperAnalysisJob.cxx:546 TQNTupleDumperAnalysisJob.cxx:547 TQNTupleDumperAnalysisJob.cxx:548 TQNTupleDumperAnalysisJob.cxx:549 TQNTupleDumperAnalysisJob.cxx:550 TQNTupleDumperAnalysisJob.cxx:551 TQNTupleDumperAnalysisJob.cxx:552 TQNTupleDumperAnalysisJob.cxx:553 TQNTupleDumperAnalysisJob.cxx:554 TQNTupleDumperAnalysisJob.cxx:555 TQNTupleDumperAnalysisJob.cxx:556 TQNTupleDumperAnalysisJob.cxx:557 TQNTupleDumperAnalysisJob.cxx:558 TQNTupleDumperAnalysisJob.cxx:559 TQNTupleDumperAnalysisJob.cxx:560 TQNTupleDumperAnalysisJob.cxx:561 TQNTupleDumperAnalysisJob.cxx:562 TQNTupleDumperAnalysisJob.cxx:563 TQNTupleDumperAnalysisJob.cxx:564 TQNTupleDumperAnalysisJob.cxx:565 TQNTupleDumperAnalysisJob.cxx:566 TQNTupleDumperAnalysisJob.cxx:567 TQNTupleDumperAnalysisJob.cxx:568 TQNTupleDumperAnalysisJob.cxx:569 TQNTupleDumperAnalysisJob.cxx:570 TQNTupleDumperAnalysisJob.cxx:571 TQNTupleDumperAnalysisJob.cxx:572 TQNTupleDumperAnalysisJob.cxx:573 TQNTupleDumperAnalysisJob.cxx:574 TQNTupleDumperAnalysisJob.cxx:575 TQNTupleDumperAnalysisJob.cxx:576 TQNTupleDumperAnalysisJob.cxx:577 TQNTupleDumperAnalysisJob.cxx:578 TQNTupleDumperAnalysisJob.cxx:579 TQNTupleDumperAnalysisJob.cxx:580 TQNTupleDumperAnalysisJob.cxx:581 TQNTupleDumperAnalysisJob.cxx:582 TQNTupleDumperAnalysisJob.cxx:583 TQNTupleDumperAnalysisJob.cxx:584 TQNTupleDumperAnalysisJob.cxx:585 TQNTupleDumperAnalysisJob.cxx:586 TQNTupleDumperAnalysisJob.cxx:587 TQNTupleDumperAnalysisJob.cxx:588 TQNTupleDumperAnalysisJob.cxx:589 TQNTupleDumperAnalysisJob.cxx:590 TQNTupleDumperAnalysisJob.cxx:591 TQNTupleDumperAnalysisJob.cxx:592 TQNTupleDumperAnalysisJob.cxx:593 TQNTupleDumperAnalysisJob.cxx:594 TQNTupleDumperAnalysisJob.cxx:595 TQNTupleDumperAnalysisJob.cxx:596 TQNTupleDumperAnalysisJob.cxx:597 TQNTupleDumperAnalysisJob.cxx:598 TQNTupleDumperAnalysisJob.cxx:599 TQNTupleDumperAnalysisJob.cxx:600 TQNTupleDumperAnalysisJob.cxx:601 TQNTupleDumperAnalysisJob.cxx:602 TQNTupleDumperAnalysisJob.cxx:603 TQNTupleDumperAnalysisJob.cxx:604 TQNTupleDumperAnalysisJob.cxx:605 TQNTupleDumperAnalysisJob.cxx:606 TQNTupleDumperAnalysisJob.cxx:607 TQNTupleDumperAnalysisJob.cxx:608 TQNTupleDumperAnalysisJob.cxx:609 TQNTupleDumperAnalysisJob.cxx:610 TQNTupleDumperAnalysisJob.cxx:611 TQNTupleDumperAnalysisJob.cxx:612 TQNTupleDumperAnalysisJob.cxx:613 TQNTupleDumperAnalysisJob.cxx:614 TQNTupleDumperAnalysisJob.cxx:615 TQNTupleDumperAnalysisJob.cxx:616 TQNTupleDumperAnalysisJob.cxx:617 TQNTupleDumperAnalysisJob.cxx:618 TQNTupleDumperAnalysisJob.cxx:619 TQNTupleDumperAnalysisJob.cxx:620 TQNTupleDumperAnalysisJob.cxx:621 TQNTupleDumperAnalysisJob.cxx:622 TQNTupleDumperAnalysisJob.cxx:623 TQNTupleDumperAnalysisJob.cxx:624 TQNTupleDumperAnalysisJob.cxx:625 TQNTupleDumperAnalysisJob.cxx:626 TQNTupleDumperAnalysisJob.cxx:627 TQNTupleDumperAnalysisJob.cxx:628 TQNTupleDumperAnalysisJob.cxx:629 TQNTupleDumperAnalysisJob.cxx:630 TQNTupleDumperAnalysisJob.cxx:631 TQNTupleDumperAnalysisJob.cxx:632 TQNTupleDumperAnalysisJob.cxx:633 TQNTupleDumperAnalysisJob.cxx:634 TQNTupleDumperAnalysisJob.cxx:635 TQNTupleDumperAnalysisJob.cxx:636 TQNTupleDumperAnalysisJob.cxx:637 TQNTupleDumperAnalysisJob.cxx:638 TQNTupleDumperAnalysisJob.cxx:639 TQNTupleDumperAnalysisJob.cxx:640 TQNTupleDumperAnalysisJob.cxx:641 TQNTupleDumperAnalysisJob.cxx:642 TQNTupleDumperAnalysisJob.cxx:643 TQNTupleDumperAnalysisJob.cxx:644 TQNTupleDumperAnalysisJob.cxx:645 TQNTupleDumperAnalysisJob.cxx:646 TQNTupleDumperAnalysisJob.cxx:647 TQNTupleDumperAnalysisJob.cxx:648 TQNTupleDumperAnalysisJob.cxx:649 TQNTupleDumperAnalysisJob.cxx:650 TQNTupleDumperAnalysisJob.cxx:651 TQNTupleDumperAnalysisJob.cxx:652 TQNTupleDumperAnalysisJob.cxx:653 TQNTupleDumperAnalysisJob.cxx:654 TQNTupleDumperAnalysisJob.cxx:655 TQNTupleDumperAnalysisJob.cxx:656 TQNTupleDumperAnalysisJob.cxx:657 TQNTupleDumperAnalysisJob.cxx:658 TQNTupleDumperAnalysisJob.cxx:659 TQNTupleDumperAnalysisJob.cxx:660 TQNTupleDumperAnalysisJob.cxx:661 TQNTupleDumperAnalysisJob.cxx:662 TQNTupleDumperAnalysisJob.cxx:663 TQNTupleDumperAnalysisJob.cxx:664 TQNTupleDumperAnalysisJob.cxx:665 TQNTupleDumperAnalysisJob.cxx:666 TQNTupleDumperAnalysisJob.cxx:667 TQNTupleDumperAnalysisJob.cxx:668 TQNTupleDumperAnalysisJob.cxx:669 TQNTupleDumperAnalysisJob.cxx:670 TQNTupleDumperAnalysisJob.cxx:671 TQNTupleDumperAnalysisJob.cxx:672 TQNTupleDumperAnalysisJob.cxx:673 TQNTupleDumperAnalysisJob.cxx:674 TQNTupleDumperAnalysisJob.cxx:675 TQNTupleDumperAnalysisJob.cxx:676 TQNTupleDumperAnalysisJob.cxx:677 TQNTupleDumperAnalysisJob.cxx:678 TQNTupleDumperAnalysisJob.cxx:679 TQNTupleDumperAnalysisJob.cxx:680 TQNTupleDumperAnalysisJob.cxx:681 TQNTupleDumperAnalysisJob.cxx:682 TQNTupleDumperAnalysisJob.cxx:683 TQNTupleDumperAnalysisJob.cxx:684 TQNTupleDumperAnalysisJob.cxx:685 TQNTupleDumperAnalysisJob.cxx:686 TQNTupleDumperAnalysisJob.cxx:687 TQNTupleDumperAnalysisJob.cxx:688 TQNTupleDumperAnalysisJob.cxx:689 TQNTupleDumperAnalysisJob.cxx:690 TQNTupleDumperAnalysisJob.cxx:691 TQNTupleDumperAnalysisJob.cxx:692 TQNTupleDumperAnalysisJob.cxx:693 TQNTupleDumperAnalysisJob.cxx:694 TQNTupleDumperAnalysisJob.cxx:695 TQNTupleDumperAnalysisJob.cxx:696 TQNTupleDumperAnalysisJob.cxx:697 TQNTupleDumperAnalysisJob.cxx:698 TQNTupleDumperAnalysisJob.cxx:699 TQNTupleDumperAnalysisJob.cxx:700 TQNTupleDumperAnalysisJob.cxx:701 TQNTupleDumperAnalysisJob.cxx:702 TQNTupleDumperAnalysisJob.cxx:703 TQNTupleDumperAnalysisJob.cxx:704 TQNTupleDumperAnalysisJob.cxx:705 TQNTupleDumperAnalysisJob.cxx:706 TQNTupleDumperAnalysisJob.cxx:707 TQNTupleDumperAnalysisJob.cxx:708 TQNTupleDumperAnalysisJob.cxx:709 TQNTupleDumperAnalysisJob.cxx:710 TQNTupleDumperAnalysisJob.cxx:711 TQNTupleDumperAnalysisJob.cxx:712 TQNTupleDumperAnalysisJob.cxx:713 TQNTupleDumperAnalysisJob.cxx:714 TQNTupleDumperAnalysisJob.cxx:715 TQNTupleDumperAnalysisJob.cxx:716 TQNTupleDumperAnalysisJob.cxx:717 TQNTupleDumperAnalysisJob.cxx:718 TQNTupleDumperAnalysisJob.cxx:719 TQNTupleDumperAnalysisJob.cxx:720 TQNTupleDumperAnalysisJob.cxx:721 TQNTupleDumperAnalysisJob.cxx:722 TQNTupleDumperAnalysisJob.cxx:723 TQNTupleDumperAnalysisJob.cxx:724 TQNTupleDumperAnalysisJob.cxx:725 TQNTupleDumperAnalysisJob.cxx:726 TQNTupleDumperAnalysisJob.cxx:727 TQNTupleDumperAnalysisJob.cxx:728 TQNTupleDumperAnalysisJob.cxx:729 TQNTupleDumperAnalysisJob.cxx:730 TQNTupleDumperAnalysisJob.cxx:731 TQNTupleDumperAnalysisJob.cxx:732 TQNTupleDumperAnalysisJob.cxx:733 TQNTupleDumperAnalysisJob.cxx:734 TQNTupleDumperAnalysisJob.cxx:735 TQNTupleDumperAnalysisJob.cxx:736 TQNTupleDumperAnalysisJob.cxx:737 TQNTupleDumperAnalysisJob.cxx:738 TQNTupleDumperAnalysisJob.cxx:739 TQNTupleDumperAnalysisJob.cxx:740 TQNTupleDumperAnalysisJob.cxx:741 TQNTupleDumperAnalysisJob.cxx:742 TQNTupleDumperAnalysisJob.cxx:743 TQNTupleDumperAnalysisJob.cxx:744 TQNTupleDumperAnalysisJob.cxx:745 TQNTupleDumperAnalysisJob.cxx:746 TQNTupleDumperAnalysisJob.cxx:747 TQNTupleDumperAnalysisJob.cxx:748 TQNTupleDumperAnalysisJob.cxx:749 TQNTupleDumperAnalysisJob.cxx:750 TQNTupleDumperAnalysisJob.cxx:751 TQNTupleDumperAnalysisJob.cxx:752 TQNTupleDumperAnalysisJob.cxx:753 TQNTupleDumperAnalysisJob.cxx:754 TQNTupleDumperAnalysisJob.cxx:755 TQNTupleDumperAnalysisJob.cxx:756 TQNTupleDumperAnalysisJob.cxx:757 TQNTupleDumperAnalysisJob.cxx:758 TQNTupleDumperAnalysisJob.cxx:759 TQNTupleDumperAnalysisJob.cxx:760 TQNTupleDumperAnalysisJob.cxx:761 TQNTupleDumperAnalysisJob.cxx:762 TQNTupleDumperAnalysisJob.cxx:763 TQNTupleDumperAnalysisJob.cxx:764 TQNTupleDumperAnalysisJob.cxx:765 TQNTupleDumperAnalysisJob.cxx:766 TQNTupleDumperAnalysisJob.cxx:767 TQNTupleDumperAnalysisJob.cxx:768 TQNTupleDumperAnalysisJob.cxx:769 TQNTupleDumperAnalysisJob.cxx:770 TQNTupleDumperAnalysisJob.cxx:771 TQNTupleDumperAnalysisJob.cxx:772 TQNTupleDumperAnalysisJob.cxx:773 TQNTupleDumperAnalysisJob.cxx:774 TQNTupleDumperAnalysisJob.cxx:775 TQNTupleDumperAnalysisJob.cxx:776 TQNTupleDumperAnalysisJob.cxx:777 TQNTupleDumperAnalysisJob.cxx:778 TQNTupleDumperAnalysisJob.cxx:779 TQNTupleDumperAnalysisJob.cxx:780 TQNTupleDumperAnalysisJob.cxx:781 TQNTupleDumperAnalysisJob.cxx:782 TQNTupleDumperAnalysisJob.cxx:783 TQNTupleDumperAnalysisJob.cxx:784 TQNTupleDumperAnalysisJob.cxx:785 TQNTupleDumperAnalysisJob.cxx:786 TQNTupleDumperAnalysisJob.cxx:787 TQNTupleDumperAnalysisJob.cxx:788 TQNTupleDumperAnalysisJob.cxx:789 TQNTupleDumperAnalysisJob.cxx:790 TQNTupleDumperAnalysisJob.cxx:791 TQNTupleDumperAnalysisJob.cxx:792 TQNTupleDumperAnalysisJob.cxx:793 TQNTupleDumperAnalysisJob.cxx:794 TQNTupleDumperAnalysisJob.cxx:795 TQNTupleDumperAnalysisJob.cxx:796 TQNTupleDumperAnalysisJob.cxx:797 TQNTupleDumperAnalysisJob.cxx:798 TQNTupleDumperAnalysisJob.cxx:799 TQNTupleDumperAnalysisJob.cxx:800 TQNTupleDumperAnalysisJob.cxx:801 TQNTupleDumperAnalysisJob.cxx:802 TQNTupleDumperAnalysisJob.cxx:803 TQNTupleDumperAnalysisJob.cxx:804 TQNTupleDumperAnalysisJob.cxx:805 TQNTupleDumperAnalysisJob.cxx:806 TQNTupleDumperAnalysisJob.cxx:807 TQNTupleDumperAnalysisJob.cxx:808 TQNTupleDumperAnalysisJob.cxx:809 TQNTupleDumperAnalysisJob.cxx:810 TQNTupleDumperAnalysisJob.cxx:811 TQNTupleDumperAnalysisJob.cxx:812 TQNTupleDumperAnalysisJob.cxx:813 TQNTupleDumperAnalysisJob.cxx:814 TQNTupleDumperAnalysisJob.cxx:815 TQNTupleDumperAnalysisJob.cxx:816 TQNTupleDumperAnalysisJob.cxx:817 TQNTupleDumperAnalysisJob.cxx:818 TQNTupleDumperAnalysisJob.cxx:819 TQNTupleDumperAnalysisJob.cxx:820 TQNTupleDumperAnalysisJob.cxx:821 TQNTupleDumperAnalysisJob.cxx:822 TQNTupleDumperAnalysisJob.cxx:823 TQNTupleDumperAnalysisJob.cxx:824 TQNTupleDumperAnalysisJob.cxx:825 TQNTupleDumperAnalysisJob.cxx:826 TQNTupleDumperAnalysisJob.cxx:827 TQNTupleDumperAnalysisJob.cxx:828 TQNTupleDumperAnalysisJob.cxx:829 TQNTupleDumperAnalysisJob.cxx:830 TQNTupleDumperAnalysisJob.cxx:831 TQNTupleDumperAnalysisJob.cxx:832 TQNTupleDumperAnalysisJob.cxx:833 TQNTupleDumperAnalysisJob.cxx:834 TQNTupleDumperAnalysisJob.cxx:835 TQNTupleDumperAnalysisJob.cxx:836 TQNTupleDumperAnalysisJob.cxx:837 TQNTupleDumperAnalysisJob.cxx:838 TQNTupleDumperAnalysisJob.cxx:839 TQNTupleDumperAnalysisJob.cxx:840 TQNTupleDumperAnalysisJob.cxx:841 TQNTupleDumperAnalysisJob.cxx:842 TQNTupleDumperAnalysisJob.cxx:843 TQNTupleDumperAnalysisJob.cxx:844 TQNTupleDumperAnalysisJob.cxx:845 TQNTupleDumperAnalysisJob.cxx:846 TQNTupleDumperAnalysisJob.cxx:847 TQNTupleDumperAnalysisJob.cxx:848 TQNTupleDumperAnalysisJob.cxx:849 TQNTupleDumperAnalysisJob.cxx:850 TQNTupleDumperAnalysisJob.cxx:851 TQNTupleDumperAnalysisJob.cxx:852 TQNTupleDumperAnalysisJob.cxx:853 TQNTupleDumperAnalysisJob.cxx:854 TQNTupleDumperAnalysisJob.cxx:855 TQNTupleDumperAnalysisJob.cxx:856 TQNTupleDumperAnalysisJob.cxx:857 TQNTupleDumperAnalysisJob.cxx:858 TQNTupleDumperAnalysisJob.cxx:859 TQNTupleDumperAnalysisJob.cxx:860 TQNTupleDumperAnalysisJob.cxx:861 TQNTupleDumperAnalysisJob.cxx:862 TQNTupleDumperAnalysisJob.cxx:863 TQNTupleDumperAnalysisJob.cxx:864 TQNTupleDumperAnalysisJob.cxx:865 TQNTupleDumperAnalysisJob.cxx:866 TQNTupleDumperAnalysisJob.cxx:867 TQNTupleDumperAnalysisJob.cxx:868 TQNTupleDumperAnalysisJob.cxx:869 TQNTupleDumperAnalysisJob.cxx:870 TQNTupleDumperAnalysisJob.cxx:871 TQNTupleDumperAnalysisJob.cxx:872 TQNTupleDumperAnalysisJob.cxx:873 TQNTupleDumperAnalysisJob.cxx:874 TQNTupleDumperAnalysisJob.cxx:875 TQNTupleDumperAnalysisJob.cxx:876 TQNTupleDumperAnalysisJob.cxx:877 TQNTupleDumperAnalysisJob.cxx:878 TQNTupleDumperAnalysisJob.cxx:879 TQNTupleDumperAnalysisJob.cxx:880 TQNTupleDumperAnalysisJob.cxx:881 TQNTupleDumperAnalysisJob.cxx:882 TQNTupleDumperAnalysisJob.cxx:883 TQNTupleDumperAnalysisJob.cxx:884 TQNTupleDumperAnalysisJob.cxx:885 TQNTupleDumperAnalysisJob.cxx:886 TQNTupleDumperAnalysisJob.cxx:887 TQNTupleDumperAnalysisJob.cxx:888 TQNTupleDumperAnalysisJob.cxx:889 TQNTupleDumperAnalysisJob.cxx:890 TQNTupleDumperAnalysisJob.cxx:891 TQNTupleDumperAnalysisJob.cxx:892 TQNTupleDumperAnalysisJob.cxx:893 TQNTupleDumperAnalysisJob.cxx:894 TQNTupleDumperAnalysisJob.cxx:895 TQNTupleDumperAnalysisJob.cxx:896 TQNTupleDumperAnalysisJob.cxx:897 TQNTupleDumperAnalysisJob.cxx:898 TQNTupleDumperAnalysisJob.cxx:899 TQNTupleDumperAnalysisJob.cxx:900 TQNTupleDumperAnalysisJob.cxx:901 TQNTupleDumperAnalysisJob.cxx:902 TQNTupleDumperAnalysisJob.cxx:903 TQNTupleDumperAnalysisJob.cxx:904 TQNTupleDumperAnalysisJob.cxx:905 TQNTupleDumperAnalysisJob.cxx:906 TQNTupleDumperAnalysisJob.cxx:907 TQNTupleDumperAnalysisJob.cxx:908 TQNTupleDumperAnalysisJob.cxx:909 TQNTupleDumperAnalysisJob.cxx:910 TQNTupleDumperAnalysisJob.cxx:911 TQNTupleDumperAnalysisJob.cxx:912 TQNTupleDumperAnalysisJob.cxx:913 TQNTupleDumperAnalysisJob.cxx:914 TQNTupleDumperAnalysisJob.cxx:915 TQNTupleDumperAnalysisJob.cxx:916 TQNTupleDumperAnalysisJob.cxx:917 TQNTupleDumperAnalysisJob.cxx:918 TQNTupleDumperAnalysisJob.cxx:919 TQNTupleDumperAnalysisJob.cxx:920 TQNTupleDumperAnalysisJob.cxx:921 TQNTupleDumperAnalysisJob.cxx:922 TQNTupleDumperAnalysisJob.cxx:923 TQNTupleDumperAnalysisJob.cxx:924 TQNTupleDumperAnalysisJob.cxx:925 TQNTupleDumperAnalysisJob.cxx:926 TQNTupleDumperAnalysisJob.cxx:927 TQNTupleDumperAnalysisJob.cxx:928 TQNTupleDumperAnalysisJob.cxx:929 TQNTupleDumperAnalysisJob.cxx:930 TQNTupleDumperAnalysisJob.cxx:931 TQNTupleDumperAnalysisJob.cxx:932 TQNTupleDumperAnalysisJob.cxx:933 TQNTupleDumperAnalysisJob.cxx:934 TQNTupleDumperAnalysisJob.cxx:935 TQNTupleDumperAnalysisJob.cxx:936 TQNTupleDumperAnalysisJob.cxx:937 TQNTupleDumperAnalysisJob.cxx:938 TQNTupleDumperAnalysisJob.cxx:939 TQNTupleDumperAnalysisJob.cxx:940 TQNTupleDumperAnalysisJob.cxx:941 TQNTupleDumperAnalysisJob.cxx:942 TQNTupleDumperAnalysisJob.cxx:943 TQNTupleDumperAnalysisJob.cxx:944 TQNTupleDumperAnalysisJob.cxx:945 TQNTupleDumperAnalysisJob.cxx:946 TQNTupleDumperAnalysisJob.cxx:947 TQNTupleDumperAnalysisJob.cxx:948 TQNTupleDumperAnalysisJob.cxx:949 TQNTupleDumperAnalysisJob.cxx:950 TQNTupleDumperAnalysisJob.cxx:951 TQNTupleDumperAnalysisJob.cxx:952 TQNTupleDumperAnalysisJob.cxx:953 TQNTupleDumperAnalysisJob.cxx:954 TQNTupleDumperAnalysisJob.cxx:955 TQNTupleDumperAnalysisJob.cxx:956 TQNTupleDumperAnalysisJob.cxx:957 TQNTupleDumperAnalysisJob.cxx:958 TQNTupleDumperAnalysisJob.cxx:959 TQNTupleDumperAnalysisJob.cxx:960 TQNTupleDumperAnalysisJob.cxx:961 TQNTupleDumperAnalysisJob.cxx:962 TQNTupleDumperAnalysisJob.cxx:963 TQNTupleDumperAnalysisJob.cxx:964 TQNTupleDumperAnalysisJob.cxx:965 TQNTupleDumperAnalysisJob.cxx:966 TQNTupleDumperAnalysisJob.cxx:967 TQNTupleDumperAnalysisJob.cxx:968 TQNTupleDumperAnalysisJob.cxx:969 TQNTupleDumperAnalysisJob.cxx:970 TQNTupleDumperAnalysisJob.cxx:971 TQNTupleDumperAnalysisJob.cxx:972 TQNTupleDumperAnalysisJob.cxx:973 TQNTupleDumperAnalysisJob.cxx:974 TQNTupleDumperAnalysisJob.cxx:975 TQNTupleDumperAnalysisJob.cxx:976 TQNTupleDumperAnalysisJob.cxx:977 TQNTupleDumperAnalysisJob.cxx:978 TQNTupleDumperAnalysisJob.cxx:979 TQNTupleDumperAnalysisJob.cxx:980 TQNTupleDumperAnalysisJob.cxx:981 TQNTupleDumperAnalysisJob.cxx:982 TQNTupleDumperAnalysisJob.cxx:983 TQNTupleDumperAnalysisJob.cxx:984 TQNTupleDumperAnalysisJob.cxx:985 TQNTupleDumperAnalysisJob.cxx:986 TQNTupleDumperAnalysisJob.cxx:987 TQNTupleDumperAnalysisJob.cxx:988 TQNTupleDumperAnalysisJob.cxx:989 TQNTupleDumperAnalysisJob.cxx:990 TQNTupleDumperAnalysisJob.cxx:991 TQNTupleDumperAnalysisJob.cxx:992 TQNTupleDumperAnalysisJob.cxx:993 TQNTupleDumperAnalysisJob.cxx:994 TQNTupleDumperAnalysisJob.cxx:995 TQNTupleDumperAnalysisJob.cxx:996 TQNTupleDumperAnalysisJob.cxx:997 TQNTupleDumperAnalysisJob.cxx:998 TQNTupleDumperAnalysisJob.cxx:999 TQNTupleDumperAnalysisJob.cxx:1000 TQNTupleDumperAnalysisJob.cxx:1001 TQNTupleDumperAnalysisJob.cxx:1002 TQNTupleDumperAnalysisJob.cxx:1003 TQNTupleDumperAnalysisJob.cxx:1004 TQNTupleDumperAnalysisJob.cxx:1005 TQNTupleDumperAnalysisJob.cxx:1006 TQNTupleDumperAnalysisJob.cxx:1007 TQNTupleDumperAnalysisJob.cxx:1008 TQNTupleDumperAnalysisJob.cxx:1009 TQNTupleDumperAnalysisJob.cxx:1010 TQNTupleDumperAnalysisJob.cxx:1011 TQNTupleDumperAnalysisJob.cxx:1012 TQNTupleDumperAnalysisJob.cxx:1013 TQNTupleDumperAnalysisJob.cxx:1014 TQNTupleDumperAnalysisJob.cxx:1015 TQNTupleDumperAnalysisJob.cxx:1016 TQNTupleDumperAnalysisJob.cxx:1017 TQNTupleDumperAnalysisJob.cxx:1018 TQNTupleDumperAnalysisJob.cxx:1019 TQNTupleDumperAnalysisJob.cxx:1020 TQNTupleDumperAnalysisJob.cxx:1021 TQNTupleDumperAnalysisJob.cxx:1022 TQNTupleDumperAnalysisJob.cxx:1023 TQNTupleDumperAnalysisJob.cxx:1024 TQNTupleDumperAnalysisJob.cxx:1025 TQNTupleDumperAnalysisJob.cxx:1026 TQNTupleDumperAnalysisJob.cxx:1027 TQNTupleDumperAnalysisJob.cxx:1028 TQNTupleDumperAnalysisJob.cxx:1029 TQNTupleDumperAnalysisJob.cxx:1030 TQNTupleDumperAnalysisJob.cxx:1031 TQNTupleDumperAnalysisJob.cxx:1032 TQNTupleDumperAnalysisJob.cxx:1033 TQNTupleDumperAnalysisJob.cxx:1034 TQNTupleDumperAnalysisJob.cxx:1035 TQNTupleDumperAnalysisJob.cxx:1036 TQNTupleDumperAnalysisJob.cxx:1037 TQNTupleDumperAnalysisJob.cxx:1038 TQNTupleDumperAnalysisJob.cxx:1039 TQNTupleDumperAnalysisJob.cxx:1040 TQNTupleDumperAnalysisJob.cxx:1041 TQNTupleDumperAnalysisJob.cxx:1042 TQNTupleDumperAnalysisJob.cxx:1043 TQNTupleDumperAnalysisJob.cxx:1044 TQNTupleDumperAnalysisJob.cxx:1045 TQNTupleDumperAnalysisJob.cxx:1046 TQNTupleDumperAnalysisJob.cxx:1047 TQNTupleDumperAnalysisJob.cxx:1048 TQNTupleDumperAnalysisJob.cxx:1049 TQNTupleDumperAnalysisJob.cxx:1050 TQNTupleDumperAnalysisJob.cxx:1051 TQNTupleDumperAnalysisJob.cxx:1052 TQNTupleDumperAnalysisJob.cxx:1053 TQNTupleDumperAnalysisJob.cxx:1054 TQNTupleDumperAnalysisJob.cxx:1055 TQNTupleDumperAnalysisJob.cxx:1056 TQNTupleDumperAnalysisJob.cxx:1057 TQNTupleDumperAnalysisJob.cxx:1058 TQNTupleDumperAnalysisJob.cxx:1059 TQNTupleDumperAnalysisJob.cxx:1060 TQNTupleDumperAnalysisJob.cxx:1061 TQNTupleDumperAnalysisJob.cxx:1062 TQNTupleDumperAnalysisJob.cxx:1063 TQNTupleDumperAnalysisJob.cxx:1064 TQNTupleDumperAnalysisJob.cxx:1065 TQNTupleDumperAnalysisJob.cxx:1066 TQNTupleDumperAnalysisJob.cxx:1067 TQNTupleDumperAnalysisJob.cxx:1068 TQNTupleDumperAnalysisJob.cxx:1069 TQNTupleDumperAnalysisJob.cxx:1070 TQNTupleDumperAnalysisJob.cxx:1071 TQNTupleDumperAnalysisJob.cxx:1072 TQNTupleDumperAnalysisJob.cxx:1073 TQNTupleDumperAnalysisJob.cxx:1074 TQNTupleDumperAnalysisJob.cxx:1075 TQNTupleDumperAnalysisJob.cxx:1076 TQNTupleDumperAnalysisJob.cxx:1077 TQNTupleDumperAnalysisJob.cxx:1078 TQNTupleDumperAnalysisJob.cxx:1079 TQNTupleDumperAnalysisJob.cxx:1080 TQNTupleDumperAnalysisJob.cxx:1081 TQNTupleDumperAnalysisJob.cxx:1082 TQNTupleDumperAnalysisJob.cxx:1083 TQNTupleDumperAnalysisJob.cxx:1084 TQNTupleDumperAnalysisJob.cxx:1085 TQNTupleDumperAnalysisJob.cxx:1086 TQNTupleDumperAnalysisJob.cxx:1087 TQNTupleDumperAnalysisJob.cxx:1088 TQNTupleDumperAnalysisJob.cxx:1089 TQNTupleDumperAnalysisJob.cxx:1090 TQNTupleDumperAnalysisJob.cxx:1091 TQNTupleDumperAnalysisJob.cxx:1092 TQNTupleDumperAnalysisJob.cxx:1093 TQNTupleDumperAnalysisJob.cxx:1094 TQNTupleDumperAnalysisJob.cxx:1095