CMS 3D CMS Logo

Public Member Functions | Static Public Member Functions

UpdateTProfile Class Reference

#include <UpdateTProfile.h>

List of all members.

Public Member Functions

 UpdateTProfile ()
 ~UpdateTProfile ()

Static Public Member Functions

static void setBinContent (TProfile *const profile, const uint32_t &bin, const double &entries, const double &mean, const double &spread)
static void setBinContents (TProfile *const profile, const uint32_t &bin, const double &num_of_entries, const double &sum_of_contents, const double &sum_of_squares)

Detailed Description

Definition at line 9 of file UpdateTProfile.h.


Constructor & Destructor Documentation

UpdateTProfile::UpdateTProfile ( )

Definition at line 9 of file UpdateTProfile.cc.

{;}
UpdateTProfile::~UpdateTProfile ( )

Definition at line 13 of file UpdateTProfile.cc.

{;}

Member Function Documentation

void UpdateTProfile::setBinContent ( TProfile *const  prof,
const uint32_t &  bin,
const double &  num_of_entries,
const double &  mean,
const double &  spread 
) [static]

Error option "s" means that the error returned using the GetBinError() method is the spread for that bin. (If the default error option is used, the error returned is spread / sqrt(N), where N is the number of entries for that bin). The commissioning procedures use option "s" throughout.

In order that the profile histo correctly displays the "bin_mean" and "bin_spread" (an example being: peds +/- strip noise), we have to manipulate the "contents" and "error" data as follows:

TProfile::SetBinEntries( bin_number, bin_entries ) TProfile::SetBinContents( bin_number, bin_mean * bin_entries ) TProfile::SetBinError( bin_number, weight )

"weight" is calculated based on the GetBinError() method, which returns an error ("err" below) based on the following equation:

1) if error option is set to "s": err = sqrt( wei^2 / num - ( sum / num )^2 ) => err = sqrt( wei^2 / num - sum^2 / num^2 ) => wei = sqrt( err^2 * num + sum^2 / num ) => wei = sqrt( err^2 * num + mean^2 * num )

2) else if error option is set to "" (ie, default): err = ( 1 / sqrt( num ) ) * sqrt( wei^2 / num - ( sum / num )^2 ) => err = sqrt( wei^2 / num^2 - sum^2 / num^3 ) => wei = sqrt( err^2 * num^2 + cont^2 / num ) => wei = sqrt( err^2 * num^2 + mean^2 * num )

where: "num" is the bin entries, as set by the method SetBinEntries() "sum" is the bin content, as set by the method SetBinContent() "wei" is the bin error, as set by the method SetBinError() and "mean" = sum / num

Definition at line 82 of file UpdateTProfile.cc.

References benchmark_cfg::cerr, python::tagInventory::entries, mathSSE::sqrt(), and CommonMethods::weight().

Referenced by setBinContents(), PedestalsTask::update(), PedsOnlyTask::update(), NoiseTask::update(), and PedsFullNoiseTask::update().

                                                           {
  //   std::cout << "[UpdateTProfile::setBinContents]" << std::endl;

  // Check histo exists
  if ( !prof ) {
    std::cerr << "[UpdateTProfile::setBinContents]"
         << " NULL pointer to TProfile object!" << std::endl;
    return;
  }

  // Check bin number is valid
  if ( bin == 0 || bin > static_cast<uint32_t>(prof->GetNbinsX()) ) {
    std::cerr << "[UpdateTProfile::setBinContents]"
         << " Unexpected bin number!" << std::endl;
    return;
  }

  // Check entries are present
  if ( num_of_entries <= 0. ) { return; } //@@ what about negative weights???
  double entries = num_of_entries;
  
  // Check error option
  const char* spread_option = "s";
  const char* default_option = "";
  //   const char* option = prof->GetErrorOption();
  //   if ( option[0] != spread_option[0] ) {
  //     std::cout << "[UpdateTProfile::setBinContents]"
  //     << " Setting error option for TProfile to 's'!" << std::endl;
  //     prof->SetErrorOption( "s" );
  //   }
  const char* error_option = prof->GetErrorOption();

  // Calculate "weight" used for SetBinError() method
  double weight;
  if ( error_option[0] == spread_option[0] ) {
    weight = sqrt( mean*mean*entries + spread*spread*entries  );
  } else if (error_option[0] == default_option[0] ) {
    weight = sqrt( mean*mean*entries + spread*spread*entries*entries );
  } else { 
    std::cerr << "[UpdateTProfile::setBinContents]"
         << " Unexpected error option for TProfile!" << std::endl;
    weight = 0.; 
  }
  
  // Set bin entries, contents and error
  prof->SetBinEntries( bin, entries );
  prof->SetBinContent( bin, mean * entries );
  prof->SetBinError( bin, weight );
 
//   LogTrace("TEST")
//     << "[UpdateTProfile::" << __func__ << "]"
//     << " bin/entries/mean/content/error: " 
//     << bin << "/"
//     << entries << "/"
//     << mean << "/"
//     << mean*entries << "/"
//     << weight;

  // Set total number of entries 
  if ( bin == 1 ) { prof->SetEntries( entries ); }
  else { prof->SetEntries( prof->GetEntries() + entries ); }
  
}
void UpdateTProfile::setBinContents ( TProfile *const  prof,
const uint32_t &  bin,
const double &  num_of_entries,
const double &  sum_of_contents,
const double &  sum_of_squares 
) [static]

Definition at line 17 of file UpdateTProfile.cc.

References timingPdfMaker::mean, setBinContent(), and mathSSE::sqrt().

                                                                    {
  //   std::cout << "[UpdateTProfile::setBinContents]" << std::endl;
  
  double mean = 0.;
  double spread = 0.;
  if ( num_of_entries ) { 
    mean = sum_of_contents / num_of_entries;
    spread = sqrt( sum_of_squares/ num_of_entries - mean * mean ); 
  }
   
//   LogTrace("TEST")
//     << "[UpdateTProfile::setBinContents]"
//     << " bin: " << bin
//     << " entries: " << num_of_entries
//     << " contents: " << sum_of_contents
//     << " squared: " << sum_of_squares
//     << " mean: " << mean
//     << " spread: " << spread;
  
  UpdateTProfile::setBinContent( prof, bin, num_of_entries, mean, spread );
  
}