////////////////////////////////////////////////////////////////////////// // // 'ORGANIZATION AND SIMULTANEOUS FITS' RooFit tutorial macro #508 // // RooArgSet and RooArgList tools and tricks // // // // 07/2008 - Wouter Verkerke // ///////////////////////////////////////////////////////////////////////// #ifndef __CINT__ #include "RooGlobalFunc.h" #endif #include "RooRealVar.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooConstVar.h" #include "TCanvas.h" #include "TAxis.h" #include "RooPlot.h" #include "RooArgSet.h" #include "RooArgList.h" #include "RooCategory.h" using namespace RooFit ; void rf508_listsetmanip() { // C r e a t e d u m m y o b j e c t s // --------------------------------------- // Create some variables RooRealVar a("a","a",1,-10,10) ; RooRealVar b("b","b",2,-10,10) ; RooRealVar c("c","c",3,-10,10) ; RooRealVar d("d","d",4,-10,10) ; RooRealVar x("x","x",0,-10,10) ; c.setError(0.5) ; a.setConstant() ; b.setConstant() ; // Create a category RooCategory e("e","e") ; e.defineType("sig") ; e.defineType("bkg") ; // Create a pdf RooGaussian g("g","g",x,a,b) ; // C r e a t i n g , f i l l i n g R o o A r g S e t s // ------------------------------------------------------- // A RooArgSet is a set of RooAbsArg objects. Each object in the set must have // a unique name // Set constructors exists with up to 9 initial arguments RooArgSet s(a,b) ; // At any time objects can be added with add() s.add(e) ; // Add up to 9 additional arguments in one call s.add(RooArgSet(c,d)) ; // Sets can contain any type of RooAbsArg, also pdf and functions s.add(g) ; // Remove element d s.remove(d) ; // A c c e s s i n g R o o A r g S e t c o n t e n t s // ------------------------------------------------------- // You can look up objects by name RooAbsArg* aptr = s.find("a") ; // Construct a subset by name RooArgSet* subset1 = (RooArgSet*) s.selectByName("a,b,c") ; // Construct asubset by attribute RooArgSet* subset2 = (RooArgSet*) s.selectByAttrib("Constant",kTRUE) ; // Construct the subset of overlapping contents with another set RooArgSet s1(a,b,c) ; RooArgSet s2(c,d,e) ; RooArgSet* subset3 = (RooArgSet*) s1.selectCommon(s2) ; // O w n i n g R o o A r g S e t s // --------------------------------- // Create a RooArgSet that owns its components // A set either owns all of its components or none, // so once addOwned() is used, add() can no longer be // used and will result in an error message RooRealVar* ac = (RooRealVar*) a.clone("a") ; RooRealVar* bc = (RooRealVar*) b.clone("b") ; RooRealVar* cc = (RooRealVar*) c.clone("c") ; RooArgSet s3 ; s3.addOwned(RooArgSet(*ac,*bc,*cc)) ; // Another possibility is to add an owned clone // of an object instead of the original s3.addClone(RooArgSet(d,e,g)) ; // A clone of a owning set is non-owning and its // contents is owned by the originating owning set RooArgSet* sclone = (RooArgSet*) s3.Clone("sclone") ; // To make a clone of a set and its contents use // the snapshot method RooArgSet* sclone2 = (RooArgSet*) s3.snapshot() ; // If a set contains function objects, only the head node // is cloned in a snapshot. To make a snapshot of all // servers of a function object do as follows. The result // of a RooArgSet snapshot with deepCloning option is a set // of cloned objects, and all their clone (recursive) server // dependencies, that together form a self-consistent // set that is free of external dependencies RooArgSet* sclone3 = (RooArgSet*) s3.snapshot(kTRUE) ; // S e t p r i n t i n g // ------------------------ // Inline printing only show list of names of contained objects cout << "sclone = " << (*sclone) << endl ; // Plain print shows the same, prefixed by name of the set sclone->Print() ; // Standard printing shows one line for each item with the items name, class name and value sclone->Print("s") ; // Verbose printing adds each items arguments, address and 'extras' as defined by the object sclone->Print("v") ; // U s i n g R o o A r g L i s t s // --------------------------------- // List constructors exists with up to 9 initial arguments RooArgList l(a,b,c,d) ; // Lists have an explicit order and allow multiple arguments with the same name l.add(RooArgList(a,b,c,d)) ; // Access by index is provided RooAbsArg* arg4 = l.at(4) ; }