#include "RooFit.h"
#include "RooWorkspace.h"
#include "RooAbsPdf.h"
#include "RooRealVar.h"
#include "RooCategory.h"
#include "RooAbsData.h"
#include "RooCmdConfig.h"
#include "RooMsgService.h"
#include <map>
#include <string>
#include <list>
using namespace std ;
#include "TClass.h"
#include "Riostream.h"
#include <string.h>
#include <assert.h>
ClassImp(RooWorkspace)
;
RooWorkspace::RooWorkspace(const char* name, const char* title) : TNamed(name,title?title:name)
{
}
RooWorkspace::RooWorkspace(const RooWorkspace& other) : TNamed(other)
{
other._allOwnedNodes.snapshot(_allOwnedNodes,kTRUE) ;
TIterator* iter = other._dataList.MakeIterator() ;
TObject* data ;
while((data=iter->Next())) {
_dataList.Add(data->Clone()) ;
}
delete iter ;
}
RooWorkspace::~RooWorkspace()
{
_dataList.Delete() ;
}
Bool_t RooWorkspace::import(const RooAbsArg& arg, const RooCmdArg& arg1, const RooCmdArg& arg2, const RooCmdArg& arg3)
{
RooLinkedList args ;
args.Add((TObject*)&arg1) ;
args.Add((TObject*)&arg2) ;
args.Add((TObject*)&arg3) ;
RooCmdConfig pc(Form("RooWorkspace::import(%s)",GetName())) ;
pc.defineString("conflictSuffix","RenameConflictNodes",0) ;
pc.defineString("allSuffix","RenameAllNodes",0) ;
pc.defineString("varChangeIn","RenameVar",0,"",kTRUE) ;
pc.defineString("varChangeOut","RenameVar",1,"",kTRUE) ;
pc.defineMutex("RenameConflictNodes","RenameAllNodes") ;
pc.process(args) ;
if (!pc.ok(kTRUE)) {
return kTRUE ;
}
const char* suffixC = pc.getString("conflictSuffix") ;
const char* suffixA = pc.getString("allSuffix") ;
const char* varChangeIn = pc.getString("varChangeIn") ;
const char* varChangeOut = pc.getString("varChangeOut") ;
if (suffixC && strlen(suffixC)==0) suffixC = 0 ;
if (suffixA && strlen(suffixA)==0) suffixA = 0 ;
Bool_t conflictOnly = suffixA ? kFALSE : kTRUE ;
const char* suffix = suffixA ? suffixA : suffixC ;
if (!suffix && _allOwnedNodes.find(arg.GetName())) {
coutE(ObjectHandling) << "RooWorkSpace::import(" << GetName() << ") ERROR importing object named " << arg.GetName()
<< ": already in the workspace and no conflict resolution protocol specified" << endl ;
return kTRUE ;
}
RooArgSet conflictNodes ;
RooArgSet branchSet ;
arg.branchNodeServerList(&branchSet) ;
TIterator* iter = branchSet.createIterator() ;
RooAbsArg* branch ;
while ((branch=(RooAbsArg*)iter->Next())) {
if (_allOwnedNodes.find(branch->GetName())) {
conflictNodes.add(*branch) ;
}
}
delete iter ;
if (conflictNodes.getSize()>0 && !suffix) {
coutE(ObjectHandling) << "RooWorkSpace::import(" << GetName() << ") ERROR object named " << arg.GetName() << ": component(s) "
<< conflictNodes << " already in the workspace and no conflict resolution protocol specified" << endl ;
return kTRUE ;
}
RooArgSet* cloneSet = (RooArgSet*) RooArgSet(arg).snapshot(kTRUE) ;
RooAbsArg* cloneTop = cloneSet->find(arg.GetName()) ;
if (!conflictOnly) {
conflictNodes.removeAll() ;
conflictNodes.add(branchSet) ;
}
TIterator* citer = conflictNodes.createIterator() ;
string topName2 = cloneTop->GetName() ;
RooAbsArg* cnode ;
while ((cnode=(RooAbsArg*)citer->Next())) {
RooAbsArg* cnode2 = cloneSet->find(cnode->GetName()) ;
string origName = cnode2->GetName() ;
cnode2->SetName(Form("%s_%s",cnode2->GetName(),suffix)) ;
cnode2->SetTitle(Form("%s (%s)",cnode2->GetTitle(),suffix)) ;
string tag = Form("ORIGNAME:%s",origName.c_str()) ;
cnode2->setAttribute(tag.c_str()) ;
if (cnode2==cloneTop) {
topName2 = cnode2->GetName() ;
}
coutI(ObjectHandling) << "RooWorkspace::import(" << GetName()
<< ") Resolving name conflict in workspace by changing name of imported node "
<< origName << " to " << cnode2->GetName() << endl ;
}
delete citer ;
if (strlen(varChangeIn)>0) {
char tmp[1024] ;
strcpy(tmp,varChangeIn) ;
list<string> tmpIn,tmpOut ;
char* ptr = strtok(tmp,",") ;
while (ptr) {
tmpIn.push_back(ptr) ;
ptr = strtok(0,",") ;
}
strcpy(tmp,varChangeOut) ;
ptr = strtok(tmp,",") ;
while (ptr) {
tmpOut.push_back(ptr) ;
ptr = strtok(0,",") ;
}
map<string,string> varMap ;
list<string>::iterator iin = tmpIn.begin() ;
list<string>::iterator iout = tmpOut.begin() ;
for (;iin!=tmpIn.end() ; ++iin,++iout) {
varMap[*iin]=*iout ;
}
TIterator* cliter = cloneSet->createIterator() ;
while ((cnode=(RooAbsArg*)cliter->Next())) {
if (varMap.find(cnode->GetName())!=varMap.end()) {
string origName = cnode->GetName() ;
cnode->SetName(varMap[cnode->GetName()].c_str()) ;
string tag = Form("ORIGNAME:%s",origName.c_str()) ;
cnode->setAttribute(tag.c_str()) ;
coutI(ObjectHandling) << "RooWorkspace::import(" << GetName() << ") Changing name of variable "
<< origName << " to " << cnode->GetName() << " on request" << endl ;
}
}
delete cliter ;
}
RooArgSet* cloneSet2 = (RooArgSet*) RooArgSet(*cloneTop).snapshot(kTRUE) ;
RooAbsArg* cloneTop2 = cloneSet2->find(topName2.c_str()) ;
RooArgSet conflictNodes2 ;
RooArgSet branchSet2 ;
arg.branchNodeServerList(&branchSet) ;
TIterator* iter2 = branchSet2.createIterator() ;
RooAbsArg* branch2 ;
while ((branch2=(RooAbsArg*)iter2->Next())) {
if (_allOwnedNodes.find(branch2->GetName())) {
conflictNodes2.add(*branch2) ;
}
}
delete iter2 ;
if (conflictNodes2.getSize()) {
coutE(ObjectHandling) << "RooWorkSpace::import(" << GetName() << ") ERROR object named " << arg.GetName() << ": component(s) "
<< conflictNodes2 << " cause naming conflict after conflict resolution protocol was executed" << endl ;
return kTRUE ;
}
iter = cloneSet2->createIterator() ;
RooAbsArg* node ;
RooArgSet recycledNodes ;
while((node=(RooAbsArg*)iter->Next())) {
if (_allOwnedNodes.find(node->GetName())) {
coutI(ObjectHandling) << "RooWorkspace::import(" << GetName() << ") using existing copy of variable " << node->IsA()->GetName()
<< "::" << node->GetName() << " for import of " << cloneTop2->IsA()->GetName() << "::"
<< cloneTop2->GetName() << endl ;
recycledNodes.add(*_allOwnedNodes.find(node->GetName())) ;
} else {
coutI(ObjectHandling) << "RooWorkspace::import(" << GetName() << ") importing " << node->IsA()->GetName() << "::"
<< node->GetName() << endl ;
_allOwnedNodes.addOwned(*node) ;
}
}
delete cloneSet ;
if (recycledNodes.getSize()>0) {
iter->Reset() ;
while((node=(RooAbsArg*)iter->Next())) {
node->redirectServers(recycledNodes) ;
}
}
delete iter ;
return kFALSE ;
}
Bool_t RooWorkspace::import(RooAbsData& data, const RooCmdArg& arg1, const RooCmdArg& arg2, const RooCmdArg& arg3)
{
coutI(ObjectHandling) << "RooWorkspace::import(" << GetName() << ") importing dataset " << data.GetName() << endl ;
RooLinkedList args ;
args.Add((TObject*)&arg1) ;
args.Add((TObject*)&arg2) ;
args.Add((TObject*)&arg3) ;
RooCmdConfig pc(Form("RooWorkspace::import(%s)",GetName())) ;
pc.defineString("dsetName","RenameDataset",0,"") ;
pc.defineString("varChangeIn","RenameVar",0,"",kTRUE) ;
pc.defineString("varChangeOut","RenameVar",1,"",kTRUE) ;
pc.process(args) ;
if (!pc.ok(kTRUE)) {
return kTRUE ;
}
const char* dsetName = pc.getString("dsetName") ;
const char* varChangeIn = pc.getString("varChangeIn") ;
const char* varChangeOut = pc.getString("varChangeOut") ;
if (dsetName && strlen(dsetName)==0) {
dsetName=0 ;
}
RooAbsData* clone ;
if (dsetName) {
coutI(ObjectHandling) << "RooWorkSpace::import(" << GetName() << ") changing name of dataset from " << data.GetName() << " to " << dsetName << endl ;
clone = (RooAbsData*) data.Clone(dsetName) ;
} else {
clone = (RooAbsData*) data.Clone(data.GetName()) ;
}
if (strlen(varChangeIn)>0) {
char tmp[1024] ;
strcpy(tmp,varChangeIn) ;
list<string> tmpIn,tmpOut ;
char* ptr = strtok(tmp,",") ;
while (ptr) {
tmpIn.push_back(ptr) ;
ptr = strtok(0,",") ;
}
strcpy(tmp,varChangeOut) ;
ptr = strtok(tmp,",") ;
while (ptr) {
tmpOut.push_back(ptr) ;
ptr = strtok(0,",") ;
}
list<string>::iterator iin = tmpIn.begin() ;
list<string>::iterator iout = tmpOut.begin() ;
for (; iin!=tmpIn.end() ; ++iin,++iout) {
coutI(ObjectHandling) << "RooWorkSpace::import(" << GetName() << ") changing name of dataset observable " << *iin << " to " << *iout << endl ;
clone->changeObservableName(iin->c_str(),iout->c_str()) ;
}
}
TIterator* iter = clone->get()->createIterator() ;
RooAbsArg* arg ;
while((arg=(RooAbsArg*)iter->Next())) {
if (!_allOwnedNodes.find(arg->GetName())) {
import(*arg) ;
}
}
delete iter ;
_dataList.Add(clone) ;
return kFALSE ;
}
Bool_t RooWorkspace::merge(const RooWorkspace& )
{
return kFALSE ;
}
Bool_t RooWorkspace::join(const RooWorkspace& )
{
return kFALSE ;
}
RooAbsPdf* RooWorkspace::pdf(const char* name)
{
return dynamic_cast<RooAbsPdf*>(_allOwnedNodes.find(name)) ;
}
RooAbsReal* RooWorkspace::function(const char* name)
{
return dynamic_cast<RooAbsReal*>(_allOwnedNodes.find(name)) ;
}
RooRealVar* RooWorkspace::var(const char* name)
{
return dynamic_cast<RooRealVar*>(_allOwnedNodes.find(name)) ;
}
RooCategory* RooWorkspace::cat(const char* name)
{
return dynamic_cast<RooCategory*>(_allOwnedNodes.find(name)) ;
}
RooAbsData* RooWorkspace::data(const char* name)
{
return (RooAbsData*)_dataList.FindObject(name) ;
}
void RooWorkspace::Print(Option_t* ) const
{
cout << endl << "RooWorkspace(" << GetName() << ") " << GetTitle() << " contents" << endl << endl ;
RooAbsArg* arg ;
RooArgSet pdfSet ;
RooArgSet funcSet ;
RooArgSet varSet ;
TIterator* iter = _allOwnedNodes.createIterator() ;
while((arg=(RooAbsArg*)iter->Next())) {
if (arg->IsA()->InheritsFrom(RooAbsPdf::Class())) {
pdfSet.add(*arg) ;
}
if (arg->IsA()->InheritsFrom(RooAbsReal::Class()) &&
!arg->IsA()->InheritsFrom(RooAbsPdf::Class()) &&
!arg->IsA()->InheritsFrom(RooRealVar::Class())) {
funcSet.add(*arg) ;
}
if (arg->IsA()->InheritsFrom(RooRealVar::Class())) {
varSet.add(*arg) ;
}
if (arg->IsA()->InheritsFrom(RooCategory::Class())) {
varSet.add(*arg) ;
}
}
delete iter ;
if (varSet.getSize()>0) {
cout << "variables" << endl ;
cout << "---------" << endl ;
cout << varSet << endl ;
cout << endl ;
}
if (pdfSet.getSize()>0) {
cout << "p.d.f.s" << endl ;
cout << "-------" << endl ;
iter = pdfSet.createIterator() ;
while((arg=(RooAbsArg*)iter->Next())) {
arg->Print() ;
}
delete iter ;
cout << endl ;
}
if (funcSet.getSize()>0) {
cout << "functions" << endl ;
cout << "--------" << endl ;
iter = funcSet.createIterator() ;
while((arg=(RooAbsArg*)iter->Next())) {
arg->Print() ;
}
delete iter ;
cout << endl ;
}
if (_dataList.GetSize()>0) {
cout << "datasets" << endl ;
cout << "--------" << endl ;
iter = _dataList.MakeIterator() ;
RooAbsData* data ;
while((data=(RooAbsData*)iter->Next())) {
cout << data->IsA()->GetName() << "::" << data->GetName() << *data->get() << endl ;
}
delete iter ;
cout << endl ;
}
return ;
}
Last update: Thu Jan 17 08:46:15 2008
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.