/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * 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 
// RooTruthModel is an implementation of RooResolution
// model that provides a delta-function resolution model
// <p>
// The truth model supports <i>all</i> basis functions because it evaluates each basis function as  
// as a RooFormulaVar.  The 6 basis functions used in B mixing and decay and 2 basis
// functions used in D mixing have been hand coded for increased execution speed.
// END_HTML
//

#include "RooFit.h"

#include "Riostream.h"
#include "RooTruthModel.h"
#include "RooGenContext.h"
#include "RooAbsAnaConvPdf.h"

#include "TError.h"

#include <algorithm>
using namespace std ;

ClassImp(RooTruthModel) 
;



//_____________________________________________________________________________
RooTruthModel::RooTruthModel(const char *name, const char *title, RooRealVar& xIn) : 
  RooResolutionModel(name,title,xIn)
{  
  // Constructor of a truth resolution model, i.e. a delta function in observable 'xIn'

}



//_____________________________________________________________________________
RooTruthModel::RooTruthModel(const RooTruthModel& other, const char* name) : 
  RooResolutionModel(other,name)
{
  // Copy constructor
}



//_____________________________________________________________________________
RooTruthModel::~RooTruthModel()
{
  // Destructor
}



//_____________________________________________________________________________
Int_t RooTruthModel::basisCode(const char* name) const 
{
  // Return basis code for given basis definition string. Return special
  // codes for 'known' bases for which compiled definition exists. Return
  // generic bases code if implementation relies on TFormula interpretation
  // of basis name

  // Check for optimized basis functions
  if (!TString("exp(-@0/@1)").CompareTo(name)) return expBasisPlus ;
  if (!TString("exp(@0/@1)").CompareTo(name)) return expBasisMinus ;
  if (!TString("exp(-abs(@0)/@1)").CompareTo(name)) return expBasisSum ;
  if (!TString("exp(-@0/@1)*sin(@0*@2)").CompareTo(name)) return sinBasisPlus ;
  if (!TString("exp(@0/@1)*sin(@0*@2)").CompareTo(name)) return sinBasisMinus ;
  if (!TString("exp(-abs(@0)/@1)*sin(@0*@2)").CompareTo(name)) return sinBasisSum ;
  if (!TString("exp(-@0/@1)*cos(@0*@2)").CompareTo(name)) return cosBasisPlus ;
  if (!TString("exp(@0/@1)*cos(@0*@2)").CompareTo(name)) return cosBasisMinus ;
  if (!TString("exp(-abs(@0)/@1)*cos(@0*@2)").CompareTo(name)) return cosBasisSum ;
  if (!TString("(@0/@1)*exp(-@0/@1)").CompareTo(name)) return linBasisPlus ;
  if (!TString("(@0/@1)*(@0/@1)*exp(-@0/@1)").CompareTo(name)) return quadBasisPlus ;
  if (!TString("exp(-@0/@1)*cosh(@0*@2/2)").CompareTo(name)) return coshBasisPlus;
  if (!TString("exp(@0/@1)*cosh(@0*@2/2)").CompareTo(name)) return coshBasisMinus;
  if (!TString("exp(-abs(@0)/@1)*cosh(@0*@2/2)").CompareTo(name)) return coshBasisSum;
  if (!TString("exp(-@0/@1)*sinh(@0*@2/2)").CompareTo(name)) return sinhBasisPlus;
  if (!TString("exp(@0/@1)*sinh(@0*@2/2)").CompareTo(name)) return sinhBasisMinus;
  if (!TString("exp(-abs(@0)/@1)*sinh(@0*@2/2)").CompareTo(name)) return sinhBasisSum;

  // Truth model is delta function, i.e. convolution integral
  // is basis function, therefore we can handle any basis function
  return genericBasis ;
}




//_____________________________________________________________________________
void RooTruthModel::changeBasis(RooFormulaVar* inBasis) 
{
  // Changes associated bases function to 'inBasis'

  // Process change basis function. Since we actually
  // evaluate the basis function object, we need to
  // adjust our client-server links to the basis function here

  // Remove client-server link to old basis
  if (_basis) {
    removeServer(*_basis) ;
  }

  // Change basis pointer and update client-server link
  _basis = inBasis ;
  if (_basis) {
    addServer(*_basis,kTRUE,kFALSE) ;
  }

  _basisCode = inBasis?basisCode(inBasis->GetTitle()):0 ;
}





//_____________________________________________________________________________
Double_t RooTruthModel::evaluate() const 
{
  // Evaluate the truth model: a delta function when used as PDF,
  // the basis function itself, when convoluted with a basis function.

  // No basis: delta function
  if (_basisCode == noBasis) {
    if (x==0) return 1 ;
    return 0 ;
  }

  // Generic basis: evaluate basis function object
  if (_basisCode == genericBasis) {
    return basis().getVal() ;
  }

  // Precompiled basis functions
  BasisType basisType = (BasisType)( (_basisCode == 0) ? 0 : (_basisCode/10) + 1 );
  BasisSign basisSign = (BasisSign)( _basisCode - 10*(basisType-1) - 2 ) ;

  // Enforce sign compatibility
  if ((basisSign==Minus && x>0) || 
      (basisSign==Plus  && x<0)) return 0 ;


  Double_t tau = ((RooAbsReal*)basis().getParameter(1))->getVal() ;
  // Return desired basis function
  switch(basisType) {    
  case expBasis: {
    //cout << " RooTruthModel::eval(" << GetName() << ") expBasis mode ret = " << exp(-fabs((Double_t)x)/tau) << " tau = " << tau << endl ;
    return exp(-fabs((Double_t)x)/tau) ;
  }
  case sinBasis: {
    Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ; 
    return exp(-fabs((Double_t)x)/tau)*sin(x*dm) ;
  }
  case cosBasis: {
    Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ; 
    return exp(-fabs((Double_t)x)/tau)*cos(x*dm) ;
  }
  case linBasis: {
    Double_t tscaled = fabs((Double_t)x)/tau;
    return exp(-tscaled)*tscaled ;
  }
  case quadBasis: {
    Double_t tscaled = fabs((Double_t)x)/tau;
    return exp(-tscaled)*tscaled*tscaled;
  }  
  case sinhBasis: {
    Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ; 
    return exp(-fabs((Double_t)x)/tau)*sinh(x*dg/2) ;
  }
  case coshBasis: {
    Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ; 
    return exp(-fabs((Double_t)x)/tau)*cosh(x*dg/2) ;
  }
  default:
    R__ASSERT(0) ;
  }

  return 0 ;
}



//_____________________________________________________________________________
Int_t RooTruthModel::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* /*rangeName*/) const 
{
  // Advertise analytical integrals for compiled basis functions and when used
  // as p.d.f without basis function.

  switch(_basisCode) {

  // Analytical integration capability of raw PDF
  case noBasis:
    if (matchArgs(allVars,analVars,convVar())) return 1 ;
    break ;

  // Analytical integration capability of convoluted PDF
  case expBasisPlus: 
  case expBasisMinus:
  case expBasisSum:
  case sinBasisPlus:
  case sinBasisMinus:
  case sinBasisSum:
  case cosBasisPlus:
  case cosBasisMinus:
  case cosBasisSum:
  case linBasisPlus:
  case quadBasisPlus:
  case sinhBasisPlus:
  case sinhBasisMinus:
  case sinhBasisSum:
  case coshBasisPlus:
  case coshBasisMinus:
  case coshBasisSum:
    if (matchArgs(allVars,analVars,convVar())) return 1 ;
    break ;
  }

  return 0 ;
}



//_____________________________________________________________________________
Double_t RooTruthModel::analyticalIntegral(Int_t code, const char* rangeName) const 
{
  // Implement analytical integrals when used as p.d.f and for compiled
  // basis functions.


  // Code must be 1
  R__ASSERT(code==1) ;

  // Unconvoluted PDF
  if (_basisCode==noBasis) return 1 ;

  // Precompiled basis functions
  BasisType basisType = (BasisType)( (_basisCode == 0) ? 0 : (_basisCode/10) + 1 );
  BasisSign basisSign = (BasisSign)( _basisCode - 10*(basisType-1) - 2 ) ;
  //cout << " calling RooTruthModel::analyticalIntegral with basisType " << basisType << endl; 

  Double_t tau = ((RooAbsReal*)basis().getParameter(1))->getVal() ;
  switch (basisType) {
  case expBasis:
    {
      // WVE fixed for ranges
      Double_t result(0) ;
      if (tau==0) return 1 ;
      if ((basisSign != Minus) && (x.max(rangeName)>0)) {
	result += tau*(-exp(-x.max(rangeName)/tau) -  -exp(-max(0.,x.min(rangeName))/tau) ) ; // plus and both
      }
      if ((basisSign != Plus) && (x.min(rangeName)<0)) {
	result -= tau*(-exp(-max(0.,x.min(rangeName))/tau)) - -tau*exp(-x.max(rangeName)/tau) ;   // minus and both
      }

      return result ;
    }
  case sinBasis:
    {
      Double_t result(0) ;
      if (tau==0) return 0 ;
      Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
      if (basisSign != Minus) result += exp(-x.max(rangeName)/tau)*(-1/tau*sin(dm*x.max(rangeName)) - dm*cos(dm*x.max(rangeName))) + dm;  // fixed FMV 08/29/03
      if (basisSign != Plus)  result -= exp( x.min(rangeName)/tau)*(-1/tau*sin(dm*(-x.min(rangeName))) - dm*cos(dm*(-x.min(rangeName)))) + dm ;  // fixed FMV 08/29/03
      return result / (1/(tau*tau) + dm*dm) ;
    }
  case cosBasis:
    {
      Double_t result(0) ;
      if (tau==0) return 1 ;
      Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
      if (basisSign != Minus) result += exp(-x.max(rangeName)/tau)*(-1/tau*cos(dm*x.max(rangeName)) + dm*sin(dm*x.max(rangeName))) + 1/tau ;
      if (basisSign != Plus)  result += exp( x.min(rangeName)/tau)*(-1/tau*cos(dm*(-x.min(rangeName))) + dm*sin(dm*(-x.min(rangeName)))) + 1/tau ; // fixed FMV 08/29/03
      return result / (1/(tau*tau) + dm*dm) ;
    }
  case linBasis:
    {
      if (tau==0) return 0 ;
      Double_t t_max = x.max(rangeName)/tau ;
      return tau*( 1 - (1 + t_max)*exp(-t_max) ) ;
    }
  case quadBasis:
    {
      if (tau==0) return 0 ;
      Double_t t_max = x.max(rangeName)/tau ;
      return tau*( 2 - (2 + (2 + t_max)*t_max)*exp(-t_max) ) ;
    }
  case sinhBasis:
    {
      Double_t result(0) ;
      if (tau==0) return 0 ;
      Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
      Double_t taup = 2*tau/(2-tau*dg);
      Double_t taum = 2*tau/(2+tau*dg);
      if (basisSign != Minus) result += 0.5*( taup*(1-exp(-x.max(rangeName)/taup)) - taum*(1-exp(-x.max(rangeName)/taum)) ) ;
      if (basisSign != Plus)  result -= 0.5*( taup*(1-exp( x.min(rangeName)/taup)) - taum*(1-exp( x.min(rangeName)/taum)) ) ;
      return result ;
    }
  case coshBasis:
    {
      Double_t result(0) ;
      if (tau==0) return 1 ;
      Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
      Double_t taup = 2*tau/(2-tau*dg);
      Double_t taum = 2*tau/(2+tau*dg);
      if (basisSign != Minus) result += 0.5*( taup*(1-exp(-x.max(rangeName)/taup)) + taum*(1-exp(-x.max(rangeName)/taum)) ) ;
      if (basisSign != Plus)  result += 0.5*( taup*(1-exp( x.min(rangeName)/taup)) + taum*(1-exp( x.min(rangeName)/taum)) ) ;
      return result ;
    }
  default:
    R__ASSERT(0) ;
  }

  R__ASSERT(0) ;
  return 0 ;
}


//_____________________________________________________________________________
RooAbsGenContext* RooTruthModel::modelGenContext
(const RooAbsAnaConvPdf& convPdf, const RooArgSet &vars, const RooDataSet *prototype,
 const RooArgSet* auxProto, Bool_t verbose) const
{
  RooArgSet forceDirect(convVar()) ;
  return new RooGenContext(dynamic_cast<const RooAbsPdf&>(convPdf), vars, prototype,
                           auxProto, verbose, &forceDirect) ;
} 



//_____________________________________________________________________________
Int_t RooTruthModel::getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t /*staticInitOK*/) const
{
  // Advertise internal generator for observable x
  if (matchArgs(directVars,generateVars,x)) return 1 ;  
  return 0 ;
}



//_____________________________________________________________________________
void RooTruthModel::generateEvent(Int_t code)
{
  // Implement internal generator for observable x,
  // x=0 for all events following definition
  // of delta function

  R__ASSERT(code==1) ;
  Double_t zero(0.) ;
  x = zero ;
  return;
}
 RooTruthModel.cxx:1
 RooTruthModel.cxx:2
 RooTruthModel.cxx:3
 RooTruthModel.cxx:4
 RooTruthModel.cxx:5
 RooTruthModel.cxx:6
 RooTruthModel.cxx:7
 RooTruthModel.cxx:8
 RooTruthModel.cxx:9
 RooTruthModel.cxx:10
 RooTruthModel.cxx:11
 RooTruthModel.cxx:12
 RooTruthModel.cxx:13
 RooTruthModel.cxx:14
 RooTruthModel.cxx:15
 RooTruthModel.cxx:16
 RooTruthModel.cxx:17
 RooTruthModel.cxx:18
 RooTruthModel.cxx:19
 RooTruthModel.cxx:20
 RooTruthModel.cxx:21
 RooTruthModel.cxx:22
 RooTruthModel.cxx:23
 RooTruthModel.cxx:24
 RooTruthModel.cxx:25
 RooTruthModel.cxx:26
 RooTruthModel.cxx:27
 RooTruthModel.cxx:28
 RooTruthModel.cxx:29
 RooTruthModel.cxx:30
 RooTruthModel.cxx:31
 RooTruthModel.cxx:32
 RooTruthModel.cxx:33
 RooTruthModel.cxx:34
 RooTruthModel.cxx:35
 RooTruthModel.cxx:36
 RooTruthModel.cxx:37
 RooTruthModel.cxx:38
 RooTruthModel.cxx:39
 RooTruthModel.cxx:40
 RooTruthModel.cxx:41
 RooTruthModel.cxx:42
 RooTruthModel.cxx:43
 RooTruthModel.cxx:44
 RooTruthModel.cxx:45
 RooTruthModel.cxx:46
 RooTruthModel.cxx:47
 RooTruthModel.cxx:48
 RooTruthModel.cxx:49
 RooTruthModel.cxx:50
 RooTruthModel.cxx:51
 RooTruthModel.cxx:52
 RooTruthModel.cxx:53
 RooTruthModel.cxx:54
 RooTruthModel.cxx:55
 RooTruthModel.cxx:56
 RooTruthModel.cxx:57
 RooTruthModel.cxx:58
 RooTruthModel.cxx:59
 RooTruthModel.cxx:60
 RooTruthModel.cxx:61
 RooTruthModel.cxx:62
 RooTruthModel.cxx:63
 RooTruthModel.cxx:64
 RooTruthModel.cxx:65
 RooTruthModel.cxx:66
 RooTruthModel.cxx:67
 RooTruthModel.cxx:68
 RooTruthModel.cxx:69
 RooTruthModel.cxx:70
 RooTruthModel.cxx:71
 RooTruthModel.cxx:72
 RooTruthModel.cxx:73
 RooTruthModel.cxx:74
 RooTruthModel.cxx:75
 RooTruthModel.cxx:76
 RooTruthModel.cxx:77
 RooTruthModel.cxx:78
 RooTruthModel.cxx:79
 RooTruthModel.cxx:80
 RooTruthModel.cxx:81
 RooTruthModel.cxx:82
 RooTruthModel.cxx:83
 RooTruthModel.cxx:84
 RooTruthModel.cxx:85
 RooTruthModel.cxx:86
 RooTruthModel.cxx:87
 RooTruthModel.cxx:88
 RooTruthModel.cxx:89
 RooTruthModel.cxx:90
 RooTruthModel.cxx:91
 RooTruthModel.cxx:92
 RooTruthModel.cxx:93
 RooTruthModel.cxx:94
 RooTruthModel.cxx:95
 RooTruthModel.cxx:96
 RooTruthModel.cxx:97
 RooTruthModel.cxx:98
 RooTruthModel.cxx:99
 RooTruthModel.cxx:100
 RooTruthModel.cxx:101
 RooTruthModel.cxx:102
 RooTruthModel.cxx:103
 RooTruthModel.cxx:104
 RooTruthModel.cxx:105
 RooTruthModel.cxx:106
 RooTruthModel.cxx:107
 RooTruthModel.cxx:108
 RooTruthModel.cxx:109
 RooTruthModel.cxx:110
 RooTruthModel.cxx:111
 RooTruthModel.cxx:112
 RooTruthModel.cxx:113
 RooTruthModel.cxx:114
 RooTruthModel.cxx:115
 RooTruthModel.cxx:116
 RooTruthModel.cxx:117
 RooTruthModel.cxx:118
 RooTruthModel.cxx:119
 RooTruthModel.cxx:120
 RooTruthModel.cxx:121
 RooTruthModel.cxx:122
 RooTruthModel.cxx:123
 RooTruthModel.cxx:124
 RooTruthModel.cxx:125
 RooTruthModel.cxx:126
 RooTruthModel.cxx:127
 RooTruthModel.cxx:128
 RooTruthModel.cxx:129
 RooTruthModel.cxx:130
 RooTruthModel.cxx:131
 RooTruthModel.cxx:132
 RooTruthModel.cxx:133
 RooTruthModel.cxx:134
 RooTruthModel.cxx:135
 RooTruthModel.cxx:136
 RooTruthModel.cxx:137
 RooTruthModel.cxx:138
 RooTruthModel.cxx:139
 RooTruthModel.cxx:140
 RooTruthModel.cxx:141
 RooTruthModel.cxx:142
 RooTruthModel.cxx:143
 RooTruthModel.cxx:144
 RooTruthModel.cxx:145
 RooTruthModel.cxx:146
 RooTruthModel.cxx:147
 RooTruthModel.cxx:148
 RooTruthModel.cxx:149
 RooTruthModel.cxx:150
 RooTruthModel.cxx:151
 RooTruthModel.cxx:152
 RooTruthModel.cxx:153
 RooTruthModel.cxx:154
 RooTruthModel.cxx:155
 RooTruthModel.cxx:156
 RooTruthModel.cxx:157
 RooTruthModel.cxx:158
 RooTruthModel.cxx:159
 RooTruthModel.cxx:160
 RooTruthModel.cxx:161
 RooTruthModel.cxx:162
 RooTruthModel.cxx:163
 RooTruthModel.cxx:164
 RooTruthModel.cxx:165
 RooTruthModel.cxx:166
 RooTruthModel.cxx:167
 RooTruthModel.cxx:168
 RooTruthModel.cxx:169
 RooTruthModel.cxx:170
 RooTruthModel.cxx:171
 RooTruthModel.cxx:172
 RooTruthModel.cxx:173
 RooTruthModel.cxx:174
 RooTruthModel.cxx:175
 RooTruthModel.cxx:176
 RooTruthModel.cxx:177
 RooTruthModel.cxx:178
 RooTruthModel.cxx:179
 RooTruthModel.cxx:180
 RooTruthModel.cxx:181
 RooTruthModel.cxx:182
 RooTruthModel.cxx:183
 RooTruthModel.cxx:184
 RooTruthModel.cxx:185
 RooTruthModel.cxx:186
 RooTruthModel.cxx:187
 RooTruthModel.cxx:188
 RooTruthModel.cxx:189
 RooTruthModel.cxx:190
 RooTruthModel.cxx:191
 RooTruthModel.cxx:192
 RooTruthModel.cxx:193
 RooTruthModel.cxx:194
 RooTruthModel.cxx:195
 RooTruthModel.cxx:196
 RooTruthModel.cxx:197
 RooTruthModel.cxx:198
 RooTruthModel.cxx:199
 RooTruthModel.cxx:200
 RooTruthModel.cxx:201
 RooTruthModel.cxx:202
 RooTruthModel.cxx:203
 RooTruthModel.cxx:204
 RooTruthModel.cxx:205
 RooTruthModel.cxx:206
 RooTruthModel.cxx:207
 RooTruthModel.cxx:208
 RooTruthModel.cxx:209
 RooTruthModel.cxx:210
 RooTruthModel.cxx:211
 RooTruthModel.cxx:212
 RooTruthModel.cxx:213
 RooTruthModel.cxx:214
 RooTruthModel.cxx:215
 RooTruthModel.cxx:216
 RooTruthModel.cxx:217
 RooTruthModel.cxx:218
 RooTruthModel.cxx:219
 RooTruthModel.cxx:220
 RooTruthModel.cxx:221
 RooTruthModel.cxx:222
 RooTruthModel.cxx:223
 RooTruthModel.cxx:224
 RooTruthModel.cxx:225
 RooTruthModel.cxx:226
 RooTruthModel.cxx:227
 RooTruthModel.cxx:228
 RooTruthModel.cxx:229
 RooTruthModel.cxx:230
 RooTruthModel.cxx:231
 RooTruthModel.cxx:232
 RooTruthModel.cxx:233
 RooTruthModel.cxx:234
 RooTruthModel.cxx:235
 RooTruthModel.cxx:236
 RooTruthModel.cxx:237
 RooTruthModel.cxx:238
 RooTruthModel.cxx:239
 RooTruthModel.cxx:240
 RooTruthModel.cxx:241
 RooTruthModel.cxx:242
 RooTruthModel.cxx:243
 RooTruthModel.cxx:244
 RooTruthModel.cxx:245
 RooTruthModel.cxx:246
 RooTruthModel.cxx:247
 RooTruthModel.cxx:248
 RooTruthModel.cxx:249
 RooTruthModel.cxx:250
 RooTruthModel.cxx:251
 RooTruthModel.cxx:252
 RooTruthModel.cxx:253
 RooTruthModel.cxx:254
 RooTruthModel.cxx:255
 RooTruthModel.cxx:256
 RooTruthModel.cxx:257
 RooTruthModel.cxx:258
 RooTruthModel.cxx:259
 RooTruthModel.cxx:260
 RooTruthModel.cxx:261
 RooTruthModel.cxx:262
 RooTruthModel.cxx:263
 RooTruthModel.cxx:264
 RooTruthModel.cxx:265
 RooTruthModel.cxx:266
 RooTruthModel.cxx:267
 RooTruthModel.cxx:268
 RooTruthModel.cxx:269
 RooTruthModel.cxx:270
 RooTruthModel.cxx:271
 RooTruthModel.cxx:272
 RooTruthModel.cxx:273
 RooTruthModel.cxx:274
 RooTruthModel.cxx:275
 RooTruthModel.cxx:276
 RooTruthModel.cxx:277
 RooTruthModel.cxx:278
 RooTruthModel.cxx:279
 RooTruthModel.cxx:280
 RooTruthModel.cxx:281
 RooTruthModel.cxx:282
 RooTruthModel.cxx:283
 RooTruthModel.cxx:284
 RooTruthModel.cxx:285
 RooTruthModel.cxx:286
 RooTruthModel.cxx:287
 RooTruthModel.cxx:288
 RooTruthModel.cxx:289
 RooTruthModel.cxx:290
 RooTruthModel.cxx:291
 RooTruthModel.cxx:292
 RooTruthModel.cxx:293
 RooTruthModel.cxx:294
 RooTruthModel.cxx:295
 RooTruthModel.cxx:296
 RooTruthModel.cxx:297
 RooTruthModel.cxx:298
 RooTruthModel.cxx:299
 RooTruthModel.cxx:300
 RooTruthModel.cxx:301
 RooTruthModel.cxx:302
 RooTruthModel.cxx:303
 RooTruthModel.cxx:304
 RooTruthModel.cxx:305
 RooTruthModel.cxx:306
 RooTruthModel.cxx:307
 RooTruthModel.cxx:308
 RooTruthModel.cxx:309
 RooTruthModel.cxx:310
 RooTruthModel.cxx:311
 RooTruthModel.cxx:312
 RooTruthModel.cxx:313
 RooTruthModel.cxx:314
 RooTruthModel.cxx:315
 RooTruthModel.cxx:316
 RooTruthModel.cxx:317
 RooTruthModel.cxx:318
 RooTruthModel.cxx:319
 RooTruthModel.cxx:320
 RooTruthModel.cxx:321
 RooTruthModel.cxx:322
 RooTruthModel.cxx:323
 RooTruthModel.cxx:324
 RooTruthModel.cxx:325
 RooTruthModel.cxx:326
 RooTruthModel.cxx:327
 RooTruthModel.cxx:328
 RooTruthModel.cxx:329
 RooTruthModel.cxx:330
 RooTruthModel.cxx:331
 RooTruthModel.cxx:332
 RooTruthModel.cxx:333
 RooTruthModel.cxx:334
 RooTruthModel.cxx:335
 RooTruthModel.cxx:336
 RooTruthModel.cxx:337
 RooTruthModel.cxx:338
 RooTruthModel.cxx:339
 RooTruthModel.cxx:340
 RooTruthModel.cxx:341
 RooTruthModel.cxx:342
 RooTruthModel.cxx:343
 RooTruthModel.cxx:344
 RooTruthModel.cxx:345
 RooTruthModel.cxx:346
 RooTruthModel.cxx:347
 RooTruthModel.cxx:348
 RooTruthModel.cxx:349
 RooTruthModel.cxx:350
 RooTruthModel.cxx:351
 RooTruthModel.cxx:352
 RooTruthModel.cxx:353
 RooTruthModel.cxx:354
 RooTruthModel.cxx:355
 RooTruthModel.cxx:356
 RooTruthModel.cxx:357
 RooTruthModel.cxx:358
 RooTruthModel.cxx:359
 RooTruthModel.cxx:360
 RooTruthModel.cxx:361
 RooTruthModel.cxx:362
 RooTruthModel.cxx:363
 RooTruthModel.cxx:364
 RooTruthModel.cxx:365
 RooTruthModel.cxx:366
 RooTruthModel.cxx:367
 RooTruthModel.cxx:368
 RooTruthModel.cxx:369