ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: Roo1DTable.cxx 25184 2008-08-20 13:59:55Z wouter $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
// 
// BEGIN_HTML
// Roo1DTable implements a one-dimensional table. A table is the category
// equivalent of a plot. To create a table use the RooDataSet::table method.
// END_HTML
//

#include "RooFit.h"

#include "Riostream.h"
#include <iomanip>
#include "TString.h"
#include "TMath.h"
#include "Roo1DTable.h"
#include "RooMsgService.h"
#include "TClass.h"

using namespace std ;

ClassImp(Roo1DTable)


//_____________________________________________________________________________
Roo1DTable::Roo1DTable(const char *name, const char *title, const RooAbsCategory& cat) : 
  RooTable(name,title), _total(0), _nOverflow(0)
{
  // Create an empty table from abstract category. The number of table entries and 
  // their names are taken from the category state labels at the time of construction,
  // but not reference to the category is retained after the construction phase.
  // Use fill() to fill the table.

  //Take types from reference category
  Int_t nbin=0 ;
  TIterator* tIter = cat.typeIterator() ;
  RooCatType* type ;
  while (((type = (RooCatType*)tIter->Next()))) {
    _types.Add(new RooCatType(*type)) ;
    nbin++ ;
  }
  delete tIter ;

  // Create counter array and initialize
  _count.resize(nbin) ;
  for (int i=0 ; i<nbin ; i++) _count[i] = 0 ;
}



//_____________________________________________________________________________
Roo1DTable::Roo1DTable(const Roo1DTable& other) : 
  RooTable(other), _count(other._count), _total(other._total), _nOverflow(other._nOverflow)
{  
  // Copy constructor

  // Take types from reference category

  int i;
  for (i=0 ; i<other._types.GetEntries() ; i++) {
    _types.Add(new RooCatType(*(RooCatType*)other._types.At(i))) ;
  }

}



//_____________________________________________________________________________
Roo1DTable::~Roo1DTable()
{
  // Destructor

  // We own the contents of the object array
  _types.Delete() ;
}



//_____________________________________________________________________________
void Roo1DTable::fill(RooAbsCategory& cat, Double_t weight) 
{
  // Increment the counter of the table slot with the name
  // corresponding to that of the current category state. If the
  // current category state matches no table slot name, the table
  // overflow counter is incremented.

  if (weight==0) return ;

  _total += weight ;

  //Bool_t found(kFALSE) ;
  for (int i=0 ; i<_types.GetEntries() ; i++) {
    RooCatType* entry = (RooCatType*) _types.At(i) ;
    if (cat.getIndex()==entry->getVal()) {
      _count[i] += weight ; ;
      //found=kTRUE ;
      return;
    }
  }  

  //if (!found) {
  _nOverflow += weight ;
  //}
}



//_____________________________________________________________________________
void Roo1DTable::printName(ostream& os) const 
{
  // Print the name of the table
  os << GetName() ;
}



//_____________________________________________________________________________
void Roo1DTable::printTitle(ostream& os) const 
{
  // Print the title of the table
  os << GetTitle() ;
}



//_____________________________________________________________________________
void Roo1DTable::printClassName(ostream& os) const 
{
  // Print the class name of the table
  os << IsA()->GetName() ;
}



//_____________________________________________________________________________
void Roo1DTable::printValue(ostream& os) const 
{
  // Print the table value, i.e. the contents, in 'inline' format
  os << "(" ;
  for (Int_t i=0 ; i<_types.GetEntries() ; i++) {
    RooCatType* entry = (RooCatType*) _types.At(i) ;
    if (_count[i]>0) {
      if (i>0) {
	os << "," ;
      }
      os << entry->GetName() << "=" << _count[i] ;
    }
  }
  os << ")" ;
}




//_____________________________________________________________________________
Int_t Roo1DTable::defaultPrintContents(Option_t* /*opt*/) const 
{
  // Define default contents to print
  return kName|kClassName|kValue|kArgs ;
}



//_____________________________________________________________________________
void Roo1DTable::printMultiline(ostream& os, Int_t /*contents*/, Bool_t verbose, TString indent) const 
{
  // Print the formatted table contents on the given stream
  
  os << indent << endl ;
  os << indent << "  Table " << GetName() << " : " << GetTitle() << endl ;

  // Determine maximum label and count width
  Int_t labelWidth(0) ;
  Double_t maxCount(1) ;

  int i;
  for (i=0 ; i<_types.GetEntries() ; i++) {
    RooCatType* entry = (RooCatType*) _types.At(i) ;

    // Disable warning about a signed/unsigned mismatch by MSCV 6.0 by
    // using the lwidth temporary.
    Int_t lwidth = strlen(entry->GetName());
    labelWidth = lwidth > labelWidth ? lwidth : labelWidth;
    maxCount=_count[i]>maxCount?_count[i]:maxCount ;
  }
  // Adjust formatting if overflow field will be present
  if (_nOverflow>0) {
    labelWidth=labelWidth>8?labelWidth:8 ;
    maxCount=maxCount>_nOverflow?maxCount:_nOverflow ;
  }

  // Header
  Int_t countWidth=((Int_t)log10(maxCount))+1 ;
  os << indent << "  +-" << setw(labelWidth) << setfill('-') << "-" << "-+-" << setw(countWidth) << "-" << "-+" << endl ;
  os << setfill(' ') ;

  // Contents
  for (i=0 ; i<_types.GetEntries() ; i++) {
    RooCatType* entry = (RooCatType*) _types.At(i) ;
    if (_count[i]>0 || verbose) {
      os << "  | " << setw(labelWidth) << entry->GetName() << " | " << setw(countWidth) << _count[i] << " |" << endl ;
    }
  }

  // Overflow field
  if (_nOverflow) {
    os << indent << "  +-" << setw(labelWidth) << setfill('-') << "-" << "-+-" << setw(countWidth) << "-" << "-+" << endl ;
    os << indent << "  | " << "Overflow" << " | " << setw(countWidth) << _nOverflow << " |" << endl ;    
  }

  // Footer
  os << indent << "  +-" << setw(labelWidth) << setfill('-') << "-" << "-+-" << setw(countWidth) << "-" << "-+" << endl ;
  os << setfill(' ') ;
  os << indent << endl ;
}



//_____________________________________________________________________________
Double_t Roo1DTable::get(const char* label, Bool_t silent) const 
{
  // Return the table entry named 'label'. Zero is returned if given
  // label doesn't occur in table.


  TObject* cat = _types.FindObject(label) ;
  if (!cat) {
    if (!silent) {
      coutE(InputArguments) << "Roo1DTable::get: ERROR: no such entry: " << label << endl ;
    }
    return 0 ;
  }
  return _count[_types.IndexOf(cat)] ;
}



//_____________________________________________________________________________
Double_t Roo1DTable::getOverflow() const 
{
  // Return the number of overflow entries in the table.

  return _nOverflow ;
}



//_____________________________________________________________________________
Double_t Roo1DTable::getFrac(const char* label, Bool_t silent) const 
{
  // Return the fraction of entries in the table contained in the slot named 'label'. 
  // The normalization includes the number of overflows.
  // Zero is returned if given label doesn't occur in table.   

  if (_total) {
    return get(label,silent) / _total ;
  } else {
    if (!silent) coutW(Contents) << "Roo1DTable::getFrac: WARNING table empty, returning 0" << endl ;
    return 0. ;
  }
}



//_____________________________________________________________________________
Bool_t Roo1DTable::isIdentical(const RooTable& other) 
{
  // Return true if table is identical in contents to given reference table

  const Roo1DTable* other1d = &dynamic_cast<const Roo1DTable&>(other) ;

  if (!other1d) {
    return kFALSE ;
  }

  int i;
  for (i=0 ; i<_types.GetEntries() ; i++) {
    // RooCatType* entry = (RooCatType*) _types.At(i) ;        
    if (_count[i] != other1d->_count[i]) {
      return kFALSE ;
    }
  }
  return kTRUE ;
}
 Roo1DTable.cxx:1
 Roo1DTable.cxx:2
 Roo1DTable.cxx:3
 Roo1DTable.cxx:4
 Roo1DTable.cxx:5
 Roo1DTable.cxx:6
 Roo1DTable.cxx:7
 Roo1DTable.cxx:8
 Roo1DTable.cxx:9
 Roo1DTable.cxx:10
 Roo1DTable.cxx:11
 Roo1DTable.cxx:12
 Roo1DTable.cxx:13
 Roo1DTable.cxx:14
 Roo1DTable.cxx:15
 Roo1DTable.cxx:16
 Roo1DTable.cxx:17
 Roo1DTable.cxx:18
 Roo1DTable.cxx:19
 Roo1DTable.cxx:20
 Roo1DTable.cxx:21
 Roo1DTable.cxx:22
 Roo1DTable.cxx:23
 Roo1DTable.cxx:24
 Roo1DTable.cxx:25
 Roo1DTable.cxx:26
 Roo1DTable.cxx:27
 Roo1DTable.cxx:28
 Roo1DTable.cxx:29
 Roo1DTable.cxx:30
 Roo1DTable.cxx:31
 Roo1DTable.cxx:32
 Roo1DTable.cxx:33
 Roo1DTable.cxx:34
 Roo1DTable.cxx:35
 Roo1DTable.cxx:36
 Roo1DTable.cxx:37
 Roo1DTable.cxx:38
 Roo1DTable.cxx:39
 Roo1DTable.cxx:40
 Roo1DTable.cxx:41
 Roo1DTable.cxx:42
 Roo1DTable.cxx:43
 Roo1DTable.cxx:44
 Roo1DTable.cxx:45
 Roo1DTable.cxx:46
 Roo1DTable.cxx:47
 Roo1DTable.cxx:48
 Roo1DTable.cxx:49
 Roo1DTable.cxx:50
 Roo1DTable.cxx:51
 Roo1DTable.cxx:52
 Roo1DTable.cxx:53
 Roo1DTable.cxx:54
 Roo1DTable.cxx:55
 Roo1DTable.cxx:56
 Roo1DTable.cxx:57
 Roo1DTable.cxx:58
 Roo1DTable.cxx:59
 Roo1DTable.cxx:60
 Roo1DTable.cxx:61
 Roo1DTable.cxx:62
 Roo1DTable.cxx:63
 Roo1DTable.cxx:64
 Roo1DTable.cxx:65
 Roo1DTable.cxx:66
 Roo1DTable.cxx:67
 Roo1DTable.cxx:68
 Roo1DTable.cxx:69
 Roo1DTable.cxx:70
 Roo1DTable.cxx:71
 Roo1DTable.cxx:72
 Roo1DTable.cxx:73
 Roo1DTable.cxx:74
 Roo1DTable.cxx:75
 Roo1DTable.cxx:76
 Roo1DTable.cxx:77
 Roo1DTable.cxx:78
 Roo1DTable.cxx:79
 Roo1DTable.cxx:80
 Roo1DTable.cxx:81
 Roo1DTable.cxx:82
 Roo1DTable.cxx:83
 Roo1DTable.cxx:84
 Roo1DTable.cxx:85
 Roo1DTable.cxx:86
 Roo1DTable.cxx:87
 Roo1DTable.cxx:88
 Roo1DTable.cxx:89
 Roo1DTable.cxx:90
 Roo1DTable.cxx:91
 Roo1DTable.cxx:92
 Roo1DTable.cxx:93
 Roo1DTable.cxx:94
 Roo1DTable.cxx:95
 Roo1DTable.cxx:96
 Roo1DTable.cxx:97
 Roo1DTable.cxx:98
 Roo1DTable.cxx:99
 Roo1DTable.cxx:100
 Roo1DTable.cxx:101
 Roo1DTable.cxx:102
 Roo1DTable.cxx:103
 Roo1DTable.cxx:104
 Roo1DTable.cxx:105
 Roo1DTable.cxx:106
 Roo1DTable.cxx:107
 Roo1DTable.cxx:108
 Roo1DTable.cxx:109
 Roo1DTable.cxx:110
 Roo1DTable.cxx:111
 Roo1DTable.cxx:112
 Roo1DTable.cxx:113
 Roo1DTable.cxx:114
 Roo1DTable.cxx:115
 Roo1DTable.cxx:116
 Roo1DTable.cxx:117
 Roo1DTable.cxx:118
 Roo1DTable.cxx:119
 Roo1DTable.cxx:120
 Roo1DTable.cxx:121
 Roo1DTable.cxx:122
 Roo1DTable.cxx:123
 Roo1DTable.cxx:124
 Roo1DTable.cxx:125
 Roo1DTable.cxx:126
 Roo1DTable.cxx:127
 Roo1DTable.cxx:128
 Roo1DTable.cxx:129
 Roo1DTable.cxx:130
 Roo1DTable.cxx:131
 Roo1DTable.cxx:132
 Roo1DTable.cxx:133
 Roo1DTable.cxx:134
 Roo1DTable.cxx:135
 Roo1DTable.cxx:136
 Roo1DTable.cxx:137
 Roo1DTable.cxx:138
 Roo1DTable.cxx:139
 Roo1DTable.cxx:140
 Roo1DTable.cxx:141
 Roo1DTable.cxx:142
 Roo1DTable.cxx:143
 Roo1DTable.cxx:144
 Roo1DTable.cxx:145
 Roo1DTable.cxx:146
 Roo1DTable.cxx:147
 Roo1DTable.cxx:148
 Roo1DTable.cxx:149
 Roo1DTable.cxx:150
 Roo1DTable.cxx:151
 Roo1DTable.cxx:152
 Roo1DTable.cxx:153
 Roo1DTable.cxx:154
 Roo1DTable.cxx:155
 Roo1DTable.cxx:156
 Roo1DTable.cxx:157
 Roo1DTable.cxx:158
 Roo1DTable.cxx:159
 Roo1DTable.cxx:160
 Roo1DTable.cxx:161
 Roo1DTable.cxx:162
 Roo1DTable.cxx:163
 Roo1DTable.cxx:164
 Roo1DTable.cxx:165
 Roo1DTable.cxx:166
 Roo1DTable.cxx:167
 Roo1DTable.cxx:168
 Roo1DTable.cxx:169
 Roo1DTable.cxx:170
 Roo1DTable.cxx:171
 Roo1DTable.cxx:172
 Roo1DTable.cxx:173
 Roo1DTable.cxx:174
 Roo1DTable.cxx:175
 Roo1DTable.cxx:176
 Roo1DTable.cxx:177
 Roo1DTable.cxx:178
 Roo1DTable.cxx:179
 Roo1DTable.cxx:180
 Roo1DTable.cxx:181
 Roo1DTable.cxx:182
 Roo1DTable.cxx:183
 Roo1DTable.cxx:184
 Roo1DTable.cxx:185
 Roo1DTable.cxx:186
 Roo1DTable.cxx:187
 Roo1DTable.cxx:188
 Roo1DTable.cxx:189
 Roo1DTable.cxx:190
 Roo1DTable.cxx:191
 Roo1DTable.cxx:192
 Roo1DTable.cxx:193
 Roo1DTable.cxx:194
 Roo1DTable.cxx:195
 Roo1DTable.cxx:196
 Roo1DTable.cxx:197
 Roo1DTable.cxx:198
 Roo1DTable.cxx:199
 Roo1DTable.cxx:200
 Roo1DTable.cxx:201
 Roo1DTable.cxx:202
 Roo1DTable.cxx:203
 Roo1DTable.cxx:204
 Roo1DTable.cxx:205
 Roo1DTable.cxx:206
 Roo1DTable.cxx:207
 Roo1DTable.cxx:208
 Roo1DTable.cxx:209
 Roo1DTable.cxx:210
 Roo1DTable.cxx:211
 Roo1DTable.cxx:212
 Roo1DTable.cxx:213
 Roo1DTable.cxx:214
 Roo1DTable.cxx:215
 Roo1DTable.cxx:216
 Roo1DTable.cxx:217
 Roo1DTable.cxx:218
 Roo1DTable.cxx:219
 Roo1DTable.cxx:220
 Roo1DTable.cxx:221
 Roo1DTable.cxx:222
 Roo1DTable.cxx:223
 Roo1DTable.cxx:224
 Roo1DTable.cxx:225
 Roo1DTable.cxx:226
 Roo1DTable.cxx:227
 Roo1DTable.cxx:228
 Roo1DTable.cxx:229
 Roo1DTable.cxx:230
 Roo1DTable.cxx:231
 Roo1DTable.cxx:232
 Roo1DTable.cxx:233
 Roo1DTable.cxx:234
 Roo1DTable.cxx:235
 Roo1DTable.cxx:236
 Roo1DTable.cxx:237
 Roo1DTable.cxx:238
 Roo1DTable.cxx:239
 Roo1DTable.cxx:240
 Roo1DTable.cxx:241
 Roo1DTable.cxx:242
 Roo1DTable.cxx:243
 Roo1DTable.cxx:244
 Roo1DTable.cxx:245
 Roo1DTable.cxx:246
 Roo1DTable.cxx:247
 Roo1DTable.cxx:248
 Roo1DTable.cxx:249
 Roo1DTable.cxx:250
 Roo1DTable.cxx:251
 Roo1DTable.cxx:252
 Roo1DTable.cxx:253
 Roo1DTable.cxx:254
 Roo1DTable.cxx:255
 Roo1DTable.cxx:256
 Roo1DTable.cxx:257
 Roo1DTable.cxx:258
 Roo1DTable.cxx:259
 Roo1DTable.cxx:260
 Roo1DTable.cxx:261
 Roo1DTable.cxx:262
 Roo1DTable.cxx:263
 Roo1DTable.cxx:264
 Roo1DTable.cxx:265
 Roo1DTable.cxx:266
 Roo1DTable.cxx:267
 Roo1DTable.cxx:268
 Roo1DTable.cxx:269
 Roo1DTable.cxx:270
 Roo1DTable.cxx:271
 Roo1DTable.cxx:272
 Roo1DTable.cxx:273
 Roo1DTable.cxx:274
 Roo1DTable.cxx:275
 Roo1DTable.cxx:276
 Roo1DTable.cxx:277
 Roo1DTable.cxx:278
 Roo1DTable.cxx:279
 Roo1DTable.cxx:280
 Roo1DTable.cxx:281
 Roo1DTable.cxx:282
 Roo1DTable.cxx:283
 Roo1DTable.cxx:284
 Roo1DTable.cxx:285
 Roo1DTable.cxx:286
 Roo1DTable.cxx:287
 Roo1DTable.cxx:288
 Roo1DTable.cxx:289
 Roo1DTable.cxx:290
 Roo1DTable.cxx:291
 Roo1DTable.cxx:292
 Roo1DTable.cxx:293
 Roo1DTable.cxx:294
 Roo1DTable.cxx:295
 Roo1DTable.cxx:296
 Roo1DTable.cxx:297
 Roo1DTable.cxx:298
 Roo1DTable.cxx:299