Sophie

Sophie

distrib > Fedora > 18 > x86_64 > by-pkgid > 8c86774a3e53d77cc119f53a2b94a57a > files > 1226

root-tutorial-5.34.14-2.fc18.noarch.rpm

//////////////////////////////////////////////////////////////////////////
//
// '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) ;


}