Multiple Imports when constructing RooDataSet

Hi All,

I’m having some problem with the following code snippet (which I thought would combine several RooDataSets into one with automatically defined categories for each import).

[code]std::map<std::string, RooDataSet*> fakeData;

for(unsigned i = 0; i < numDataSets; i++){
std::stringstream dataName;
dataName << “data” << i;
fakeData.insert(std::make_pair(dataName.str(), ws.pdf(“singleMod”)->generate(RooArgSet(*ws.var(“nOn”), *ws.var(“nOff”)), NumEvents(static_cast(nSim)), Verbose(kTRUE))));
}

RooDataSet jointData(“jointData”, “Joint Dataset”, RooArgSet(*ws.var(“nOn”), *ws.var(“nOff”)), Import(fakeData));[/code]

The code compiles, but fails at runtime with the following message:

[quote][#0] ERROR:InputArguments – RooDataSet::ctor(jointData) ERROR: missing arguments: IndexCat, IndexCat, IndexCat, IndexCat, IndexCat, IndexCat, IndexCat, IndexCat, IndexCat, IndexCat
Assertion failed: (0), function RooDataSet … [/quote]

What am I missing?

Thanks in advance,

Hugh

Problem solved! I simply needed to manually add the index category to my generated dataset and define the types. Only the association of the cloned pdfs with the predefined category types is done automatically it seems. The following code works as expected:

[code]std::map<std::string, RooDataSet*> fakeData;
RooCategory setLabel(“setLabel”, “Set Label”);

for(unsigned i = 0; i < numDataSets; i++){
std::stringstream dataName;
dataName << “data” << i;
setLabel.defineType(dataName.str().c_str());
fakeData.insert(std::make_pair(dataName.str(), ws.pdf(“singleMod”)->generate(RooArgSet(*ws.var(“nOn”), *ws.var(“nOff”)), NumEvents(static_cast(nSim)), Verbose(kTRUE))));
}

RooDataSet jointData(“jointData”, “Joint Dataset”, RooArgSet(*ws.var(“nOn”), *ws.var(“nOff”)), Index(setLabel), Import(fakeData));[/code]

I should probably also have mentioned that ws is a RooWorkspace.

Hugh

Hi dph3hjd,

I want to use std::map to store a serial RooDataSet pointer as following code:

  std::map<TString,RooDataSet*> *fMapBgo;
  RooRealVar* fDy2 = new RooRealVar("dy2","dy2",-100,1100);
  RooRealVar* fDy5 = new RooRealVar("dy5","dy5",-100,1100);
  RooRealVar* fDy8 = new RooRealVar("dy8","dy8",-100,1100);

  for (Short_t p=0;p<kPlaneNb;++p) {
    for (Short_t q=0;q<kSideNb*2;++q) {
      for (Short_t b=0;b<kBarNb+kRefBarNb;++b) {
        TString name = GetMapNameBgo(p,q,b);             // This function is Ok.
        RooDataSet  *dataSet =
                   new RooDataSet(name,name,RooArgSet(*fDy2,*fDy5,*fDy8));
        fMapBgo->insert(std::make_pair(name,dataSet));    // crash at here while running compiled file
      }
    }
  }

Error report as:

#5 0x0000000000403854 in std::_Rb_tree<TString, std::pair<TString const, RooDataSet*>, std::_Select1st<std::pair<TString const, RooDataSet*> >, std::less, std::allocator<std::pair<TString const, RooDataSet*> > >::_M_begin (this=0x0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.7/…/…/…/…/include/c++/4.4.7/bits/stl_tree.h:482
#6 0x00000000004035e5 in std::_Rb_tree<TString, std::pair<TString const, RooDataSet*>, std::_Select1st<std::pair<TString const, RooDataSet*> >, std::less, std::allocator<std::pair<TString const, RooDataSet*> > >::_M_insert_unique (this=0x0, __v=…) at /usr/lib/gcc/x86_64-redhat-linux/4.4.7/…/…/…/…/include/c++/4.4.7/bits/stl_tree.h:1164
#7 0x0000000000403507 in std::map<TString, RooDataSet*, std::less, std::allocator<std::pair<TString const, RooDataSet*> > >::insert (this=0x0, __x=…) at /usr/lib/gcc/x86_64-redhat-linux/4.4.7/…/…/…/…/include/c++/4.4.7/bits/stl_map.h:500
#8 0x0000000000402b82 in DmpCalL0Manager::BookMapBgo (this=0x20950b0) at Bgo/src/DmpCalL0Bgo.cc:79

Could you give me some helps?

Thanks.
Chi