RooArgList.cxx

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  * @(#)root/roofitcore:$Id: RooArgList.cxx 24261 2008-06-13 10:18:57Z wouter $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
00015  *****************************************************************************/
00016 
00017 //////////////////////////////////////////////////////////////////////////////
00018 // 
00019 // RooArgList is a container object that can hold multiple RooAbsArg objects.
00020 // The container has list semantics which means that:
00021 //
00022 //  - Contained objects are ordered, The iterator 
00023 //    follows the object insertion order.
00024 //
00025 //  - Objects can be retrieved by name and index
00026 //
00027 //  - Multiple objects with the same name are allowed
00028 //
00029 // Ownership of contents. 
00030 //
00031 // Unowned objects are inserted with the add() method. Owned objects
00032 // are added with addOwned() or addClone(). A RooArgSet either owns all 
00033 // of it contents, or none, which is determined by the first <add>
00034 // call. Once an ownership status is selected, inappropriate <add> calls
00035 // will return error status. Clearing the list via removeAll() resets the 
00036 // ownership status. Arguments supplied in the constructor are always added 
00037 // as unowned elements.
00038 //
00039 //
00040 
00041 #include "RooFit.h"
00042 
00043 #include "Riostream.h"
00044 #include "Riostream.h"
00045 #include <iomanip>
00046 #include <fstream>
00047 #include "TClass.h"
00048 #include "RooArgList.h"
00049 #include "RooStreamParser.h"
00050 #include "RooFormula.h"
00051 #include "RooAbsRealLValue.h"
00052 #include "RooAbsCategoryLValue.h"
00053 #include "RooStringVar.h"
00054 #include "RooTrace.h"
00055 #include "RooMsgService.h"
00056 
00057 ClassImp(RooArgList)
00058   ;
00059 
00060 
00061 //_____________________________________________________________________________
00062 RooArgList::RooArgList() :
00063   RooAbsCollection()
00064 {
00065   // Default constructor
00066 }
00067 
00068 
00069 
00070 //_____________________________________________________________________________
00071 RooArgList::RooArgList(const RooArgSet& set) :
00072   RooAbsCollection(set.GetName())
00073 {
00074   // Constructor from a RooArgSet. 
00075 
00076   add(set) ;
00077 }
00078 
00079 
00080 
00081 //_____________________________________________________________________________
00082 RooArgList::RooArgList(const char *name) :
00083   RooAbsCollection(name)
00084 {
00085   // Empty list constructor
00086 }
00087 
00088 
00089 
00090 //_____________________________________________________________________________
00091 RooArgList::RooArgList(const RooAbsArg& var1,
00092                      const char *name) :
00093   RooAbsCollection(name)
00094 {
00095   // Constructor for list containing 1 initial object
00096 
00097   add(var1);
00098 }
00099 
00100 
00101 
00102 //_____________________________________________________________________________
00103 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2,
00104                      const char *name) :
00105   RooAbsCollection(name)
00106 {
00107   // Constructor for set containing 2 initial objects
00108 
00109   add(var1); add(var2);
00110 }
00111 
00112 
00113 
00114 //_____________________________________________________________________________
00115 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2, 
00116                      const RooAbsArg& var3,
00117                      const char *name) :
00118   RooAbsCollection(name)
00119 {
00120   // Constructor for set containing 3 initial objects
00121 
00122   add(var1); add(var2); add(var3);
00123 }
00124 
00125 
00126 
00127 //_____________________________________________________________________________
00128 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2, 
00129                      const RooAbsArg& var3, const RooAbsArg& var4,
00130                      const char *name) :
00131   RooAbsCollection(name)
00132 {
00133   // Constructor for set containing 4 initial objects
00134 
00135   add(var1); add(var2); add(var3); add(var4);
00136 }
00137 
00138 
00139 
00140 //_____________________________________________________________________________
00141 RooArgList::RooArgList(const RooAbsArg& var1,
00142                      const RooAbsArg& var2, const RooAbsArg& var3,
00143                      const RooAbsArg& var4, const RooAbsArg& var5,
00144                      const char *name) :
00145   RooAbsCollection(name)
00146 {
00147   // Constructor for set containing 5 initial objects
00148 
00149   add(var1); add(var2); add(var3); add(var4); add(var5);
00150 }
00151 
00152 
00153 
00154 //_____________________________________________________________________________
00155 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2, 
00156                      const RooAbsArg& var3, const RooAbsArg& var4, 
00157                      const RooAbsArg& var5, const RooAbsArg& var6,
00158                      const char *name) :
00159   RooAbsCollection(name)
00160 {
00161   // Constructor for set containing 6 initial objects
00162 
00163   add(var1); add(var2); add(var3); add(var4); add(var5); add(var6);
00164 }
00165 
00166 
00167 
00168 //_____________________________________________________________________________
00169 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2, 
00170                      const RooAbsArg& var3, const RooAbsArg& var4, 
00171                      const RooAbsArg& var5, const RooAbsArg& var6, 
00172                      const RooAbsArg& var7,
00173                      const char *name) :
00174   RooAbsCollection(name)
00175 {
00176   // Constructor for set containing 7 initial objects
00177 
00178   add(var1); add(var2); add(var3); add(var4); add(var5); add(var6); add(var7) ;
00179 }
00180 
00181 
00182 
00183 //_____________________________________________________________________________
00184 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2, 
00185                      const RooAbsArg& var3, const RooAbsArg& var4, 
00186                      const RooAbsArg& var5, const RooAbsArg& var6, 
00187                      const RooAbsArg& var7, const RooAbsArg& var8,
00188                      const char *name) :
00189   RooAbsCollection(name)
00190 {
00191   // Constructor for set containing 8 initial objects
00192 
00193   add(var1); add(var2); add(var3); add(var4); add(var5); add(var6); add(var7) ;add(var8) ;
00194 }
00195 
00196 
00197 
00198 //_____________________________________________________________________________
00199 RooArgList::RooArgList(const RooAbsArg& var1, const RooAbsArg& var2, 
00200                      const RooAbsArg& var3, const RooAbsArg& var4, 
00201                      const RooAbsArg& var5, const RooAbsArg& var6, 
00202                      const RooAbsArg& var7, const RooAbsArg& var8,
00203                      const RooAbsArg& var9, const char *name) :
00204   RooAbsCollection(name)
00205 {
00206   // Constructor for set containing 9 initial objects
00207 
00208   add(var1); add(var2); add(var3); add(var4); add(var5); add(var6); add(var7); add(var8); add(var9);
00209 }
00210 
00211 
00212 
00213 //_____________________________________________________________________________
00214 RooArgList::RooArgList(const TCollection& tcoll, const char* name) :
00215   RooAbsCollection(name)
00216 {
00217   // Constructor from a root TCollection. Elements in the collection that
00218   // do not inherit from RooAbsArg will be skipped. A warning message
00219   // will be printed for every skipped item.
00220 
00221   TIterator* iter = tcoll.MakeIterator() ;
00222   TObject* obj ;
00223   while((obj=iter->Next())) {
00224     if (!dynamic_cast<RooAbsArg*>(obj)) {
00225       coutW(InputArguments) << "RooArgList::RooArgList(TCollection) element " << obj->GetName() 
00226                             << " is not a RooAbsArg, ignored" << endl ;
00227       continue ;
00228     }
00229     add(*(RooAbsArg*)obj) ;
00230   }
00231   delete iter ;
00232 }
00233 
00234 
00235 
00236 //_____________________________________________________________________________
00237 RooArgList::RooArgList(const RooArgList& other, const char *name) 
00238   : RooAbsCollection(other,name)
00239 {
00240   // Copy constructor. Note that a copy of a list is always non-owning,
00241   // even the source list is owning. To create an owning copy of
00242   // a list (owning or not), use the snaphot() method.
00243 }
00244 
00245 
00246 
00247 //_____________________________________________________________________________
00248 RooArgList::~RooArgList() 
00249 {
00250   // Destructor
00251 }
00252 
00253 
00254 
00255 //_____________________________________________________________________________
00256 RooAbsArg& RooArgList::operator[](Int_t idx) const 
00257 {     
00258   // Array operator. Element in slot 'idx' must already exist, otherwise
00259   // code will abort. 
00260   //
00261   // When used as lvalue in assignment operations, the element contained in
00262   // the list will not be changed, only the value of the existing element!
00263 
00264   RooAbsArg* arg = at(idx) ;
00265   if (!arg) {
00266     coutE(InputArguments) << "RooArgList::operator[](" << GetName() << ") ERROR: index " 
00267                           << idx << " out of range (0," << getSize() << ")" << endl ;
00268     RooErrorHandler::softAbort() ;
00269   }
00270   return *arg ; 
00271 }
00272 
00273 
00274 
00275 //_____________________________________________________________________________
00276 void RooArgList::writeToStream(ostream& os, Bool_t compact) 
00277 {
00278   // Write the contents of the argset in ASCII form to given stream.
00279   // 
00280   // All elements will be printed on a single line separated by a single 
00281   // white space. The contents of each element is written by the arguments' 
00282   // writeToStream() function
00283 
00284   if (!compact) {
00285     coutE(InputArguments) << "RooArgList::writeToStream(" << GetName() << ") non-compact mode not supported" << endl ;
00286     return ;
00287   }
00288 
00289   TIterator *iterator= createIterator();
00290   RooAbsArg *next = 0;
00291   while((0 != (next= (RooAbsArg*)iterator->Next()))) {
00292       next->writeToStream(os,kTRUE) ;
00293       os << " " ;
00294   }
00295   delete iterator;  
00296   os << endl ;
00297 }
00298 
00299 
00300 
00301 //_____________________________________________________________________________
00302 Bool_t RooArgList::readFromStream(istream& is, Bool_t compact, Bool_t verbose) 
00303 {
00304   // Read the contents of the argset in ASCII form from given stream.
00305   // 
00306   // A single line is read, and all elements are assumed to be separated 
00307   // by white space. The value of each argument is read by the arguments 
00308   // readFromStream function.
00309 
00310   if (!compact) {
00311     coutE(InputArguments) << "RooArgList::readFromStream(" << GetName() << ") non-compact mode not supported" << endl ;
00312     return kTRUE ;
00313   }    
00314 
00315   TIterator *iterator= createIterator();
00316   RooStreamParser parser(is) ;
00317   RooAbsArg *next = 0;
00318   while((0 != (next= (RooAbsArg*)iterator->Next()))) {
00319     if (!next->getAttribute("Dynamic")) {
00320       if (next->readFromStream(is,kTRUE,verbose)) {
00321         parser.zapToEnd() ;
00322         
00323         delete iterator ;
00324         return kTRUE ;
00325       } 
00326     } else {
00327     }
00328   }
00329   
00330   if (!parser.atEOL()) {
00331     TString rest = parser.readLine() ;
00332     if (verbose) {
00333       coutW(InputArguments) << "RooArgSet::readFromStream(" << GetName() 
00334                             << "): ignoring extra characters at end of line: '" << rest << "'" << endl ;
00335     }
00336   }
00337   
00338   delete iterator;    
00339   return kFALSE ;  
00340 }
00341 

Generated on Tue Jul 5 15:06:02 2011 for ROOT_528-00b_version by  doxygen 1.5.1