ATLAS Offline Software
Loading...
Searching...
No Matches
Analysis::CalibrationDataEigenVariations Class Reference

#include <CalibrationDataEigenVariations.h>

Inheritance diagram for Analysis::CalibrationDataEigenVariations:
Collaboration diagram for Analysis::CalibrationDataEigenVariations:

Public Types

typedef std::set< size_t > IndexSet
typedef std::set< IndexSetIndexSuperSet

Public Member Functions

 CalibrationDataEigenVariations (const std::string &cdipath, const std::string &tagger, const std::string &wp, const std::string &jetcollection, CalibrationDataHistogramContainer *cnt, bool excludeRecommendedUncertaintySet=false, bool base=true)
 normal constructor.
virtual ~CalibrationDataEigenVariations ()
void excludeNamedUncertainty (const std::string &name, CalibrationDataContainer *cnt)
 exclude the source of uncertainty indicated by name from eigenvector calculations
virtual void initialize (double min_variance=1.0E-20)
 carry out the eigenvector computations.
void removeVariations (const IndexSet &set)
 remove all variations in the given set
void removeVariations (const IndexSuperSet &set)
 remove all variations in any of the given sets
void mergeVariationsFrom (const size_t &index)
 merge all variations starting from the given index
void mergeVariations (const IndexSet &set)
 merge all variations in the given set
void mergeVariations (const IndexSuperSet &set)
 merge all variations in any of the given sets
unsigned int getNumberOfNamedVariations () const
 retrieve the number of named variations
std::vector< std::string > listNamedVariations () const
 list the named variations
unsigned int getNamedVariationIndex (const std::string &name) const
 retrieve the integer index corresponding to the named variation.
unsigned int getNumberOfEigenVariations ()
 retrieve the number of eigenvector variations
bool getEigenvectorVariation (unsigned int variation, TH1 *&up, TH1 *&down)
 obtain the "up" and "down" variations for the given eigenvector number.
bool getNamedVariation (const std::string &name, TH1 *&up, TH1 *&down)
 obtain the "up" and "down" variations for the named uncertainty.
bool getNamedVariation (unsigned int nameIndex, TH1 *&up, TH1 *&down)
 obtain the "up" and "down" variations for the source uncertainty pointed to by the given index (which is assumed to correspond to the value retrieved using getNamedVariationIndex()).
bool isExtrapolationVariation (unsigned int nameIndex) const
 flag whether the given index corresponds to an extrapolation variation
virtual TMatrixDSym getEigenCovarianceMatrix ()
 also provide (some) access to the underlying information: covariance matrix corresponding to eigenvector variations
TMatrixDSym getEigenCovarianceMatrixFromVariations ()
 covariance matrix corresponding to eigenvector variations constructed from the eigen-variation
TMatrixD getJacobianReductionMatrix ()
 matrix to remove unecessary rows and columns from covariance
bool EigenVectorRecomposition (const std::string &label, std::map< std::string, std::map< std::string, float > > &coefficientMap)
 Eigenvector recomposition method.
void setVerbose (bool)

Protected Attributes

bool m_initialized
 flag whether the initialization has been carried out
bool m_validate
std::map< std::string, unsigned int > m_namedIndices
 named variations
std::vector< std::pair< TH1 *, TH1 * > > m_named
int m_namedExtrapolation
 named variation index for the special case of extrapolation uncertainties
std::vector< std::pair< TH1 *, TH1 * > > m_eigen
 eigenvector variations
bool m_statVariations
 indicate whether statistical uncertainties are stored as variations
std::string m_cdipath
 @ data members needed for eigenvector method
std::string m_taggername
std::string m_wp
std::string m_jetauthor
double m_totalvariance
double m_capturedvariance
bool m_verbose

Private Attributes

CalibrationDataHistogramContainerm_cnt
 container object containing the basic information

Detailed Description

Definition at line 27 of file CalibrationDataEigenVariations.h.

Member Typedef Documentation

◆ IndexSet

Definition at line 29 of file CalibrationDataEigenVariations.h.

◆ IndexSuperSet

Constructor & Destructor Documentation

◆ CalibrationDataEigenVariations()

Analysis::CalibrationDataEigenVariations::CalibrationDataEigenVariations ( const std::string & cdipath,
const std::string & tagger,
const std::string & wp,
const std::string & jetcollection,
CalibrationDataHistogramContainer * cnt,
bool excludeRecommendedUncertaintySet = false,
bool base = true )

normal constructor.

The second argument, if true, will attempt to retrieve a 'recommended' set of uncertainties to be excluded from EV decomposition

◆ ~CalibrationDataEigenVariations()

CalibrationDataEigenVariations::~CalibrationDataEigenVariations ( )
virtual

Definition at line 355 of file CalibrationDataEigenVariations.cxx.

356{
357 // delete all variation histograms owned by us
358 for (vector<pair<TH1*, TH1*> >::iterator it = m_eigen.begin(); it != m_eigen.end(); ++it) {
359 delete it->first;
360 delete it->second;
361 }
362
363 for (vector<pair<TH1*, TH1*> >::iterator it = m_named.begin(); it != m_named.end(); ++it) {
364 delete it->first;
365 delete it->second;
366 }
367}
std::vector< std::pair< TH1 *, TH1 * > > m_eigen
eigenvector variations
std::vector< std::pair< TH1 *, TH1 * > > m_named

Member Function Documentation

◆ EigenVectorRecomposition()

bool CalibrationDataEigenVariations::EigenVectorRecomposition ( const std::string & label,
std::map< std::string, std::map< std::string, float > > & coefficientMap )

Eigenvector recomposition method.

Definition at line 1113 of file CalibrationDataEigenVariations.cxx.

1115{
1116 // Calculating eigen vector recomposition coefficient map and pass to
1117 // user by reference. Return true if method success. Return false and
1118 // will not modify coefficientMap if function failed.
1119 //
1120 // label: flavour label
1121 // coefficientMap: (reference to) coefficentMap which will be used as return value.
1122
1123 if (! m_initialized) initialize();
1124
1125 std::vector<TH1*> originSF_hvec;
1126 std::vector<TH1*> eigenSF_hvec;
1127
1128 // Retrieving information for calculation
1129 std::vector<string>fullUncList = m_cnt->listUncertainties();
1130 std::vector<string> uncList;
1131 for (unsigned int t = 0; t < fullUncList.size(); ++t) {
1132 // entries that should never be included
1133 if (fullUncList[t] == "comment" || fullUncList[t] == "result" || fullUncList[t] == "combined" ||
1134 fullUncList[t] == "statistics" || fullUncList[t] == "systematics" || fullUncList[t] == "MCreference" ||
1135 fullUncList[t] == "MChadronisation" || fullUncList[t] == "extrapolation" || fullUncList[t] == "ReducedSets" ||
1136 fullUncList[t] == "excluded_set") continue;
1137
1138 // entries that can be excluded if desired
1139 if (m_namedIndices.find(fullUncList[t]) != m_namedIndices.end()) continue;
1140
1141 TH1* hunc = dynamic_cast<TH1*>(m_cnt->GetValue(fullUncList[t].c_str()));
1142 if (not hunc){
1143 std::cerr<<"CalibrationDataEigenVariations::EigenVectorRecomposition: dynamic cast failed\n";
1144 continue;
1145 }
1146
1147 Int_t nx = hunc->GetNbinsX();
1148 Int_t ny = hunc->GetNbinsY();
1149 Int_t nz = hunc->GetNbinsZ();
1150 Int_t bin = 0;
1151 bool retain = false; // Retain the histogram?
1152
1153 // discard empty histograms
1154 // Read all bins without underflow&overflow
1155 for(Int_t binx = 1; binx <= nx; binx++)
1156 for(Int_t biny = 1; biny <= ny; biny++)
1157 for(Int_t binz = 1; binz <= nz; binz++){
1158 bin = hunc->GetBin(binx, biny, binz);
1159 if (fabs(hunc->GetBinContent(bin)) > 1E-20){
1160 retain = true;
1161 break;
1162 }
1163 }// end hist bin for-loop
1164 if (!retain){
1165 if (m_verbose) std::cout<<"Eigenvector Recomposition: Empty uncertainty "<<fullUncList.at(t)<<" is discarded."<<std::endl;
1166 continue; // discard the vector
1167 }
1168
1169 uncList.push_back(fullUncList.at(t));
1170 originSF_hvec.push_back(hunc);
1171 }
1172
1173 TH1* nom = dynamic_cast<TH1*>(m_cnt->GetValue("result")); // Nominal SF hist
1174 if (not nom){
1175 if (m_verbose) std::cout<<"Eigenvector Recomposition: dynamic cast failed\n";
1176 return false;
1177 }
1178 int dim = nom->GetDimension();
1179 Int_t nx = nom->GetNbinsX();
1180 Int_t ny = nom->GetNbinsY();
1181 Int_t nz = nom->GetNbinsZ();
1182 Int_t nbins = nx;
1183 if(dim > 1) nbins *= ny;
1184 if(dim > 2) nbins *= nz;
1185 TMatrixD matSF(uncList.size(), nbins);
1186 Int_t col = 0; // mark the column number
1187 // Fill the Delta SF Matrix
1188 for(unsigned int i = 0; i < uncList.size(); i++){
1189 col = 0;
1190 // Loop all bins except underflow&overflow bin
1191 for(int binz = 1; binz <= nz; binz++)
1192 for(int biny = 1; biny <= ny; biny++)
1193 for(int binx = 1; binx <= nx; binx++){
1194 Int_t bin = originSF_hvec.at(i)->GetBin(binx, biny, binz);
1195 TMatrixDRow(matSF,i)[col] = originSF_hvec[i]->GetBinContent(bin);
1196 col++;
1197 }
1198 }
1199
1200 // get eigen vectors of scale factors. Note that this is not the original eigen-vector.
1201 int nEigen = getNumberOfEigenVariations();
1202 TH1* up = nullptr;
1203 TH1* down = nullptr;
1204 for (int i = 0; i < nEigen; i++){
1205 if (!getEigenvectorVariation(i, up, down)){
1206 std::cerr<<"EigenVectorRecomposition: Error on retrieving eigenvector "<<i<<std::endl;
1207 return false;
1208 }
1209 //Need uncertainty value so subtract central calibration here.
1210 up->Add(nom, -1);
1211 eigenSF_hvec.push_back(up);
1212 }
1213 TMatrixD matEigen(nEigen, nbins);
1214
1215 // Fill the Eigen Matrix
1216 for(int i = 0; i < nEigen; i++){
1217 col = 0;
1218 // Read 300 bins without underflow&overflow
1219 for(int binz = 1; binz <= nz; binz++)
1220 for(int biny = 1; biny <= ny; biny++)
1221 for(int binx = 1; binx <= nx; binx++){
1222 Int_t bin = eigenSF_hvec.at(i)->GetBin(binx, biny, binz);
1223 TMatrixDRow(matEigen,i)[col] = eigenSF_hvec[i]->GetBinContent(bin);
1224 col++;
1225 }
1226 }
1227
1228 // Sanity check:
1229 TMatrixD matEigenOriginal = matEigen;
1230 TMatrixD matEigenTranspose = matEigen;
1231 matEigenTranspose = matEigenTranspose.T();
1232 TMatrixD matOriginalTimesTranspose = matEigenOriginal*matEigenTranspose;
1233 TMatrixD matEigenInvert = matEigenTranspose*matOriginalTimesTranspose.Invert();
1234 //(matEigenOriginal*matEigenInvert).DrawClone("colz"); // This should give us an identity matrix
1235
1236 TMatrixD matCoeff = matSF*matEigenInvert;
1237 int nRows = matCoeff.GetNrows();
1238 int nCols = matCoeff.GetNcols();
1239 std::map<std::string, float> temp_map;
1240 for (int col = 0; col < nCols; col++){
1241 temp_map.clear();
1242 for(int row = 0; row < nRows; row++){
1243 temp_map[uncList[row]] = TMatrixDRow(matCoeff, row)[col];
1244 }
1245 coefficientMap["Eigen_"+label+"_"+std::to_string(col)] = temp_map;
1246 }
1247
1248 return true;
1249}
CalibrationDataHistogramContainer * m_cnt
container object containing the basic information
bool m_initialized
flag whether the initialization has been carried out
std::map< std::string, unsigned int > m_namedIndices
named variations
bool getEigenvectorVariation(unsigned int variation, TH1 *&up, TH1 *&down)
obtain the "up" and "down" variations for the given eigenvector number.
unsigned int getNumberOfEigenVariations()
retrieve the number of eigenvector variations
std::string label(const std::string &format, int i)
Definition label.h:19
row
Appending html table to final .html summary file.
unsigned int constexpr nRows
Definition RPDUtils.h:24
unsigned int constexpr nCols
Definition RPDUtils.h:25
void initialize()

◆ excludeNamedUncertainty()

void CalibrationDataEigenVariations::excludeNamedUncertainty ( const std::string & name,
CalibrationDataContainer * cnt )

exclude the source of uncertainty indicated by name from eigenvector calculations

Definition at line 371 of file CalibrationDataEigenVariations.cxx.

372{
373 // Exclude the source of uncertainty identified by the given name from being used
374 // in the construction of the covariance matrix to be diagonalised.
375 // Notes:
376 // - Some names returned by CalibrationDataContainer::listUncertainties() are not
377 // meaningful in this context, and specifying them is not allowed.
378 // - Once the eigenvector diagonalisation has been carried out, this method may
379 // not be used anymore.
380
381 if (m_initialized) {
382 std::cerr << "CalibrationDataEigenVariations::excludeNamedUncertainty error:" << " initialization already done" << std::endl;
383 } else if (name == "comment" || name == "result" || name == "systematics" ||
384 name == "statistics" || name == "combined" || name == "extrapolation" ||
385 name == "MCreference" || name == "MChadronisation" || name == "ReducedSets" ||
386 name == "excluded_set" || name == "" || name == " ") // <--- these last two handle some cases that may turn up
387 {
388 std::cerr << "CalibrationDataEigenVariations::excludeNamedUncertainty error:" << " name " << name << " not allowed" << std::endl;
389 }
390 // in case multiple uncertainties should be discarded
391 else if (name.back() == '*'){
392 std::string temp_name = name.substr(0, name.size()-1); //remove "*"
393 std::vector<std::string> uncs = m_cnt->listUncertainties();
394 std::vector<std::string> unc_subgroup;
395 std::copy_if(uncs.begin(), uncs.end(), back_inserter(unc_subgroup),
396 [&temp_name](const std::string& el) {
397 return el.compare(0, temp_name.size(), temp_name) == 0;
398 });
399 if (m_verbose) std::cout <<"Found a group of uncertainties to exclude: " <<name <<" found " <<unc_subgroup.size() <<" uncertainties corresponding to the query" <<std::endl;
400 for (const auto& single_name : unc_subgroup){
401 // only really add if the entry is not yet in the list
402 if (m_namedIndices.find(single_name) == m_namedIndices.end()) {
403 if (m_verbose) std::cout << "Name : " << single_name << std::endl;
404 m_named.push_back(std::pair<TH1*, TH1*>(0, 0));
405 m_namedIndices[single_name] = m_named.size()-1;
406 }
407 }
408 }
409 else if (! cnt->GetValue(name.c_str())){
410 std::cerr << "CalibrationDataEigenVariations::excludeNamedUncertainty error:" << " uncertainty named " << name << " not found" << std::endl;
411 }
412}

◆ getEigenCovarianceMatrix()

TMatrixDSym CalibrationDataEigenVariations::getEigenCovarianceMatrix ( )
virtual

also provide (some) access to the underlying information: covariance matrix corresponding to eigenvector variations

Reimplemented in Analysis::CalibrationDataGlobalEigenVariations, and CalibrationDataGlobalEigenVariations.

Definition at line 416 of file CalibrationDataEigenVariations.cxx.

417{
418 // Construct the covariance matrix that is to be diagonalised.
419 // Note that extrapolation uncertainties (identified by the keyword "extrapolation,
420 // this will pertain mostly to the extrapolation to high jet pt) are always excluded
421 // since by definition they will not apply to the normal calibration bins. Instead
422 // this uncertainty has to be dealt with as a named variation. In addition there are
423 // other items ("combined", "systematics") that will not be dealt with correctly
424 // either and hence are excluded as well).
425 //
426 // Note that if an explicit covariance matrix is supplied (at present this may be
427 // the case only for statistical uncertainties: in the case of "continuous tagging",
428 // multinomial statistics applies so bin-to-bin correlations exist) this will be
429 // used instead of constructing the statistical uncertainties' covariance matrix on
430 // the fly.
431
432 // retrieve the central calibration
433 TH1* result = dynamic_cast<TH1*>(m_cnt->GetValue("result"));
434 if (not result){
435 std::cerr<<"CalibrationDataEigenVariations::getEigenCovarianceMatrix(): failed dynamic cast to TH1*\n";
436 return TMatrixDSym();
437 }
438
439 // loop over the uncertainties to construct the covariance matrix for all uncertainties
440 // to be addressed using the eigenvector method.
441
442 // First, treat the statistics separately.
443 // Account for the possibility that this is handled as a (non-trivial) covariance matrix
444 TMatrixDSym* sCov = dynamic_cast<TMatrixDSym*>(m_cnt->GetValue("statistics"));
445
446 // Alternatively, statistical uncertainties may be accounted for as variations (i.e., much like systematic uncertainties).
447 // In that case, we create a null matrix here and add the statistical contributions along with the systematic ones.
448 TMatrixDSym cov = (sCov) ? *sCov : getStatCovarianceMatrix(result, m_statVariations);
449
450 // Then loop through the list of (other) uncertainties
451 std::vector<string> uncs = m_cnt->listUncertainties();
452 for (unsigned int t = 0; t < uncs.size(); ++t) {
453 // entries that should never be included
454 if (uncs[t] == "comment" || uncs[t] == "result" || uncs[t] == "combined" ||
455 uncs[t] == "statistics" || uncs[t] == "systematics" || uncs[t] == "MCreference" ||
456 uncs[t] == "MChadronisation" || uncs[t] == "extrapolation" || uncs[t] == "ReducedSets" ||
457 uncs[t] == "excluded_set") continue;
458 // entries that can be excluded if desired
459 if (m_namedIndices.find(uncs[t]) != m_namedIndices.end()) continue;
460 TH1* hunc = dynamic_cast<TH1*>(m_cnt->GetValue(uncs[t].c_str()));
461 if (not hunc){
462 std::cerr<< "CalibrationDataEigenVariations::getEigenCovarianceMatrix(): dynamic cast failed\n";
463 continue;
464 }
465 cov += getSystCovarianceMatrix(result, hunc, m_cnt->isBinCorrelated(uncs[t]), m_cnt->getTagWeightAxis()); // <-------- This is where we add the covariance matrices together to form the "total covariance"
466 }
467
468 return cov;
469}
bool m_statVariations
indicate whether statistical uncertainties are stored as variations

◆ getEigenCovarianceMatrixFromVariations()

TMatrixDSym CalibrationDataEigenVariations::getEigenCovarianceMatrixFromVariations ( )

covariance matrix corresponding to eigenvector variations constructed from the eigen-variation

Definition at line 473 of file CalibrationDataEigenVariations.cxx.

474{
475 // Construct the (Eigen-variation part of the) covariance matrix from the individual variations.
476 // This must be called _after_ initialize()!
477
478 // retrieve the central calibration
479 TH1 *result = dynamic_cast<TH1*>(m_cnt->GetValue("result"));
480 if (!result){
481 std::cerr<<"CalibrationDataEigenVariations::getEigenCovarianceMatrixFromVariations(): dynamic cast failed\n";
482 return TMatrixDSym();
483 }
484 TMatrixD jac = getJacobianReductionMatrix();
485 int nbins = jac.GetNcols();
486 TMatrixDSym cov(nbins);
487 auto variation = std::make_unique<double[]>(nbins);
488
489 for (const std::pair<TH1*, TH1*>& it : m_eigen){ // m_eigen is vector of pairs of TH1* which point to TH1's representing the upVariation and downVariation respectively
490 TH1* resultVariedUp = it.first; // <--------------- This is the "result" but "varied" upwards - i.e. how the result would look like if the systematic "it" was imposed
491 for (unsigned int u = 0; u < (unsigned int) nbins; ++u) variation[u] = resultVariedUp->GetBinContent(u) - result->GetBinContent(u);
492 for (int u = 0; u < nbins; ++u){
493 for (int v = 0; v < nbins; ++v){
494 cov(u, v) += variation[u]*variation[v];
495 }
496 }
497 }
498
499 return cov;
500}
TMatrixD getJacobianReductionMatrix()
matrix to remove unecessary rows and columns from covariance
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ getEigenvectorVariation()

bool CalibrationDataEigenVariations::getEigenvectorVariation ( unsigned int variation,
TH1 *& up,
TH1 *& down )

obtain the "up" and "down" variations for the given eigenvector number.

The return value will be false if the eigenvector number is invalid.

Definition at line 1022 of file CalibrationDataEigenVariations.cxx.

1024{
1025 // Return the pointers to the up- and downward variation histogram for the specified
1026 // eigenvector variation. In case of an invalid variation number, null pointers will
1027 // be returned and the return value will be false.
1028 //
1029 // variation: eigenvector variation number
1030 // up: (reference to) pointer to upward variation histogram
1031 // down: (reference to) pointer to downward variation histogram
1032
1033 if (! m_initialized) initialize();
1034
1035 if (variation < m_eigen.size()) {
1036 up = m_eigen[variation].first;
1037 down = m_eigen[variation].second;
1038 return true;
1039 }
1040
1041 up = down = 0;
1042 return false;
1043}

◆ getJacobianReductionMatrix()

TMatrixD CalibrationDataEigenVariations::getJacobianReductionMatrix ( )

matrix to remove unecessary rows and columns from covariance

Definition at line 504 of file CalibrationDataEigenVariations.cxx.

505{
506 // Construct the matrix that removes the rows and columns that fail to influence
507 // the eigen-variations. To reduce the covariance matrix, do the following:
508 //
509 // TMatrixDSym cov = getEigenCovarianceMatrix();
510 // TMatrixDSym jac = getJacobianReductionMatrix(); // <------------ This is an upper triangular matrix of 1's. Similarity transformation will do...
511 // TMatrixDSym redSystematicCovMatrix = cov.Similarity(jac);
512
513 // retrieve the central calibration
514 TH1* result = dynamic_cast<TH1*>(m_cnt->GetValue("result"));
515 if (not result){
516 std::cerr<<"CalibrationDataEigenVariations::getJacobianReductionMatrix(): dynamic cast failed\n";
517 return TMatrixD();
518 }
519
520 // loop over the uncertainties to construct the covariance matrix for all uncertainties
521 // to be addressed using the eigenvector method.
522
523 // Retrieve the un-compressed Eigenvector variation covariance matrix
524 // (only needed to check for unexpected singularities)
525 TMatrixDSym cov = getEigenCovarianceMatrix();
526
527 // Compute the original number of bins
528 int nbins = result->GetNbinsX()+2;
529 int ndim = result->GetDimension();
530 if (ndim > 1) nbins*= (result->GetNbinsY()+2);
531 if (ndim > 2) nbins*= (result->GetNbinsZ()+2);
532
533 // Start by "compressing" the covariance matrix (removing columns/rows containing zeros only)
534 int nZeros=0;
535 std::vector<int> zeroComponents;
536 if (cov.GetNrows() != nbins) {
537 std::cerr << " error: covariance matrix size (" << cov.GetNrows() << ") doesn't match histogram size (" << nbins << ")" << std::endl;
538 return TMatrixDSym();
539 }
540
541 // First flag all the zeros
542 for (int i = 0; i < nbins; ++i) {
543 // Directly identify the under- and overflow bins
544 Int_t binx, biny, binz;
545 result->GetBinXYZ(i, binx, biny, binz);
546 if ((binx == 0 || binx == result->GetNbinsX()+1) ||
547 (ndim > 1 && (biny == 0 || biny == result->GetNbinsY()+1)) ||
548 (ndim > 2 && (binz == 0 || binz == result->GetNbinsZ()+1)))
549 {
550 ++nZeros;
551 zeroComponents.push_back(i);
552 }
553 // Try a first (quick) identification of rows/columns of zeros by the first element in each row
554 // If "successful", check the whole row in more detail
555 else if (fabs(cov(i,0)) < 1e-10) {
556 bool isThereANonZero(false);
557 for (int j = 0; j < nbins; ++j) {
558 if (fabs(cov(i,j)) > 1e-10) {
559 isThereANonZero=true; break;
560 }
561 }
562 if (! isThereANonZero) {
563 ++nZeros;
564 zeroComponents.push_back(i);
565 }
566 }
567 }
568
569 // **** COMMENTED OUT FOR NOW.
570 // Leave it here in case the calibration method will change again in the future.
571 // No need to reweight the SF by the efficiency of that bin (MCreference always = 0)
572
573 // Determine whether the container is for "continuous" calibration.
574 // This is important since the number of independent scale factors (for each pt or eta bin)
575 // is reduced by 1 compared to the number of tag weight bins (related to the fact that the fractions
576 // of events in tag weight bins have to sum up to unity).
577 // int axis = m_cnt->getTagWeightAxis();
578 // bool doContinuous = false; unsigned int weightAxis = 0;
579
580 // if (axis >= 0) {
581 // doContinuous = true;
582 // // weightAxis = (unsigned int) axis;
583 // // In this case, verify that the special "uncertainty" entry that is in fact the reference MC tag
584 // // weight fractions is present. These tag weight fractions are needed in order to carry out the
585 // // diagonalisation successfully.
586 // if (! dynamic_cast<TH1*>(m_cnt->GetValue("MCreference"))) {
587 // std::cerr << " Problem: continuous calibration object found without MC reference tag weight histogram " << std::endl;
588 // return TMatrixDSym();
589 // }
590 // }
591
592 // Only relevant for continuous calibration containers, but in order to void re-computation we
593 // retrieve them here
594 // Int_t nbinx = result->GetNbinsX()+2, nbiny = result->GetNbinsY()+2, nbinz = result->GetNbinsZ()+2;
595
596 // // If we are indeed dealing with a "continuous" calibration container, ignore one tag weight row
597 // const int skipTagWeightBin = 1; // NB this follows the histogram's bin numbering
598 // if (doContinuous) {
599 // for (Int_t binx = 1; binx < nbinx-1; ++binx)
600 // for (Int_t biny = 1; biny < nbiny-1; ++biny)
601 // for (Int_t binz = 1; binz < nbinz-1; ++binz) {
602 // if ((weightAxis == 0 && binx == skipTagWeightBin) ||
603 // (weightAxis == 1 && biny == skipTagWeightBin) ||
604 // (weightAxis == 2 && binz == skipTagWeightBin)) {
605 // // At this point we simply add these to the 'null' elements
606 // ++nZeros;
607 // zeroComponents.push_back(result->GetBin(binx, biny, binz));
608 // }
609 // }
610 // }
611
612 if (nZeros >= nbins) {
613 std::cerr << " Problem. Found n. " << nZeros << " while size of matrix is " << nbins << std::endl;
614 return TMatrixDSym();
615 }
616
617 int size = nbins - nZeros; // <--- Tis the size of the matrix removing zeros from the covariance matrix
618
619 TMatrixT<double> matrixVariationJacobian(size,nbins);
620 int nMissed=0;
621 for (int i = 0; i < nbins; ++i) { //full size
622 bool missed=false;
623 for (unsigned int s = 0; s < zeroComponents.size(); ++s) { // <-------- Basically what this does is it flags "missed" for a given "i" of the full bin size
624 if (zeroComponents.at(s) == i) { // <-------- if "i" is in "zeroComponents". Breaks (because it found that it's to be missed)
625 missed = true;
626 break;
627 }
628 }
629 if (missed) { // <-------- Finally, if "i" is to be missed, increase "nMissed" by one, and....
630 ++nMissed;
631 continue;
632 }
633 matrixVariationJacobian(i-nMissed,i)=1; // <-------- ... this ALWAYS adds a one. If zero "nMissed", add to diagonal. otherwise off-diagonal
634 } // <-------- This matrix only add 1's on/off diagonal, upper triangular matrix
635
636 return matrixVariationJacobian;
637}
virtual TMatrixDSym getEigenCovarianceMatrix()
also provide (some) access to the underlying information: covariance matrix corresponding to eigenvec...
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ getNamedVariation() [1/2]

bool CalibrationDataEigenVariations::getNamedVariation ( const std::string & name,
TH1 *& up,
TH1 *& down )

obtain the "up" and "down" variations for the named uncertainty.

The return value will be false if the given name is not listed as being excluded from the eigenvector calculations.

Definition at line 1047 of file CalibrationDataEigenVariations.cxx.

1049{
1050 // Return the pointers to the up- and downward variation histogram for the specified
1051 // named variation. In case of an invalid named variation, null pointers will
1052 // be returned and the return value will be false.
1053 //
1054 // name: named variation
1055 // up: (reference to) pointer to upward variation histogram
1056 // down: (reference to) pointer to downward variation histogram
1057
1058 map<string, unsigned int>::const_iterator it = m_namedIndices.find(name);
1059 if (it != m_namedIndices.end()) return getNamedVariation(it->second, up, down);
1060
1061 up = down = 0;
1062 return false;
1063}
bool getNamedVariation(const std::string &name, TH1 *&up, TH1 *&down)
obtain the "up" and "down" variations for the named uncertainty.

◆ getNamedVariation() [2/2]

bool CalibrationDataEigenVariations::getNamedVariation ( unsigned int nameIndex,
TH1 *& up,
TH1 *& down )

obtain the "up" and "down" variations for the source uncertainty pointed to by the given index (which is assumed to correspond to the value retrieved using getNamedVariationIndex()).

The return value will be false if the index is out of bounds.

Definition at line 1067 of file CalibrationDataEigenVariations.cxx.

1069{
1070 // Return the pointers to the up- and downward variation histogram for the specified
1071 // named variation. In case of an invalid named variation number, null pointers will
1072 // be returned and the return value will be false.
1073 //
1074 // nameIndex: named variation number
1075 // up: (reference to) pointer to upward variation histogram
1076 // down: (reference to) pointer to downward variation histogram
1077
1078 if (! m_initialized) initialize();
1079
1080 if (nameIndex < m_named.size()) {
1081 up = m_named[nameIndex].first;
1082 down = m_named[nameIndex].second;
1083 return true;
1084 }
1085
1086 up = down = 0;
1087 return false;
1088}

◆ getNamedVariationIndex()

unsigned int CalibrationDataEigenVariations::getNamedVariationIndex ( const std::string & name) const

retrieve the integer index corresponding to the named variation.

This can be used to speed up computations by avoiding string comparisons. Note that this function is not protected against passing an invalid name.

Definition at line 1092 of file CalibrationDataEigenVariations.cxx.

1093{
1094 // Return the integer index corresponding to the named variation.
1095 // Note that no checks are made on the validity of the name provided.
1096
1097 map<string, unsigned int>::const_iterator it = m_namedIndices.find(name);
1098 return it->second;
1099}

◆ getNumberOfEigenVariations()

unsigned int CalibrationDataEigenVariations::getNumberOfEigenVariations ( )

retrieve the number of eigenvector variations

Definition at line 1014 of file CalibrationDataEigenVariations.cxx.

1015{
1016 if (! m_initialized) initialize();
1017 return m_eigen.size();
1018}

◆ getNumberOfNamedVariations()

unsigned int CalibrationDataEigenVariations::getNumberOfNamedVariations ( ) const

retrieve the number of named variations

Definition at line 992 of file CalibrationDataEigenVariations.cxx.

993{
994 // Returns the number of named variations
995
996 return m_namedIndices.size();
997}

◆ initialize()

void CalibrationDataEigenVariations::initialize ( double min_variance = 1.0E-20)
virtual

carry out the eigenvector computations.

Exclusion of any source of uncertainty has to be done before calling this method

Reimplemented in Analysis::CalibrationDataGlobalEigenVariations, and CalibrationDataGlobalEigenVariations.

Definition at line 641 of file CalibrationDataEigenVariations.cxx.

642{
643 // This is this class's most important method, in the sense that it does all the
644 // math and constructs all "variation" histograms (for both eigenvector and named
645 // named variations). This constitutes the full initialisation of the class.
646 // This method is meant to be called only after all calls (if any) to the
647 // CalibrationDataEigenVariations::excludeNamedUncertainty() method.
648
649 // retrieve the central calibration
650 TH1* result = dynamic_cast<TH1*>(m_cnt->GetValue("result"));
651 if (not result){
652 std::cerr<<"CalibrationDataEigenVariations::initialize: dynamic cast failed\n";
653 return;
654 }
655 // First step: construct the original covariance matrix
656 TMatrixDSym cov = getEigenCovarianceMatrix();
657 TMatrixDSym corr(result->GetNbinsX()*result->GetNbinsY()*result->GetNbinsZ()); // We want to construct the correlation matrix in order to compare the final eigenvariations correlation matrix to it
658
659 int rowc = 0;
660 for (int row = 0 ; row < cov.GetNrows() ; row++){
661 int colc = 0;
662 bool colb = false;
663 for (int col = 0 ; col < cov.GetNcols() ; col++){
664 if(!cov(row,col) || !cov(row,row) || !cov(col,col) || cov(row,row)<1.0e-6 || cov(col,col)<1.0e-6 ) continue; // really don't want to divide by zero...
665 colb=true;
666 long double rowvar = sqrt(cov(row,row));
667 long double colvar = sqrt(cov(col,col));
668 corr(rowc,colc) = cov(row,col)/(rowvar * colvar); // divide each element by the variance
669 colc++;
670 }
671 if (colb){
672 rowc++;
673 }
674 }
675
676 // Second step: create the variations for the named sources of uncertainty (easy...)
677 for (map<string, unsigned int>::iterator it = m_namedIndices.begin(); it != m_namedIndices.end(); ++it) {
678 pair<TH1*, TH1*>& p = m_named[it->second];
679 TH1* hunc = (TH1*) m_cnt->GetValue(it->first.c_str());
680 TString namedvar("namedVar");
681 namedvar += it->first.c_str();
682 TString namedvarUp(namedvar); namedvarUp += "_up";
683 TString namedvarDown(namedvar); namedvarDown += "_down";
684 TH1* resultVariedUp = (TH1*)result->Clone(namedvarUp); resultVariedUp->Add(hunc, 1.0); resultVariedUp->SetDirectory(0);
685 TH1* resultVariedDown = (TH1*)result->Clone(namedvarDown); resultVariedDown->Add(hunc, -1.0); resultVariedDown->SetDirectory(0);
686 p.first = resultVariedUp;
687 p.second = resultVariedDown;
688 }
689 // Refinement: add the "extrapolation" uncertainty as a named uncertainty, if the histogram is provided
690 // This is a bit special, since the extrapolation uncertainty histogram has a different size than other histograms
691 if (TH1* hunc = (TH1*) m_cnt->GetValue("extrapolation")) { // this is just saying "if it exists"...
692 TH1* resultVariedUp = (TH1*) hunc->Clone("extrapolation_up"); resultVariedUp->SetDirectory(0);
693 TH1* resultVariedDown = (TH1*) hunc->Clone("extrapolation_down"); resultVariedDown->SetDirectory(0);
694 Int_t nbinx = hunc->GetNbinsX()+2, nbiny = hunc->GetNbinsY()+2, nbinz = hunc->GetNbinsZ()+2;
695 Int_t firstbinx = hunc->GetXaxis()->FindFixBin(result->GetXaxis()->GetBinCenter(1));
696 Int_t firstbiny = result->GetDimension() > 1 ? hunc->GetYaxis()->FindFixBin(result->GetYaxis()->GetBinCenter(1)) : 1;
697 Int_t firstbinz = result->GetDimension() > 2 ? hunc->GetZaxis()->FindFixBin(result->GetZaxis()->GetBinCenter(1)) : 1;
698 for (Int_t binx = 1; binx < nbinx-1; ++binx) {
699 Int_t binxResult = binx - firstbinx + 1;
700 if (binxResult < 1) binxResult = 1;
701 if (binxResult > result->GetNbinsX()) binxResult = result->GetNbinsX();
702 for (Int_t biny = 1; biny < nbiny-1; ++biny) {
703 Int_t binyResult = biny - firstbiny + 1;
704 if (binyResult > result->GetNbinsY()) binyResult = result->GetNbinsY();
705 for (Int_t binz = 1; binz < nbinz-1; ++binz) {
706 Int_t binzResult = binz - firstbinz + 1;
707 if (binzResult > result->GetNbinsZ()) binzResult = result->GetNbinsZ();
708 Int_t bin = hunc->GetBin(binx, biny, binz);
709 double contResult = result->GetBinContent(binxResult, binyResult, binzResult);
710 resultVariedUp->SetBinContent(bin, contResult + hunc->GetBinContent(bin));
711 resultVariedDown->SetBinContent(bin, contResult - hunc->GetBinError(bin));
712 }
713 }
714 }
715 m_named.push_back(std::make_pair(resultVariedUp, resultVariedDown));
716 m_namedExtrapolation = m_namedIndices["extrapolation"] = m_named.size()-1;
717 }
718
719 // Third step: compute the eigenvector variations corresponding to the remaining sources of uncertainty
720 int nbins = result->GetNbinsX()+2;
721 int ndim = result->GetDimension();
722 if (ndim > 1) nbins*= (result->GetNbinsY()+2);
723 if (ndim > 2) nbins*= (result->GetNbinsZ()+2);
724
725
726 // // Determine whether the container is for "continuous" calibration.
727 // // This is important since the number of independent scale factors (for each pt or eta bin)
728 // // is reduced by 1 compared to the number of tag weight bins (related to the fact that the fractions
729 // // of events in tag weight bins have to sum up to unity).
730 // int axis = m_cnt->getTagWeightAxis();
731 // bool doContinuous = false; unsigned int weightAxis = 0;
732
733 //if (axis >= 0) {
734 // doContinuous = true;
735 // weightAxis = (unsigned int) axis;
736 // // In this case, verify that the special "uncertainty" entry that is in fact the reference MC tag
737 // // weight fractions is present. These tag weight fractions are needed in order to carry out the
738 // // diagonalisation successfully.
739 // NOTE: MCreference is not used at the moment (always 0 in the CDI). Comment it out.
740 // if (! dynamic_cast<TH1*>(m_cnt->GetValue("MCreference"))) {
741 // std::cerr << " Problem: continuous calibration object found without MC reference tag weight histogram " << std::endl;
742 // return;
743 // }
744 //}
745
746 // Only relevant for continuous calibration containers, but in order to void re-computation we
747 // retrieve them here
748 // Int_t nbinx = result->GetNbinsX()+2, nbiny = result->GetNbinsY()+2, nbinz = result->GetNbinsZ()+2;
749
750 TMatrixT<double> matrixVariationJacobian = getJacobianReductionMatrix();
751 int size = matrixVariationJacobian.GetNrows();
752
753 // Reduce the matrix to one without the zeros, using a "similarity" transformation
754
755 const TMatrixDSym matrixCovariance = cov.Similarity(matrixVariationJacobian);
756
757 // Carry out the Eigenvector decomposition on this matrix
758 TMatrixDSymEigen eigenValueMaker (matrixCovariance);
759 TVectorT<double> eigenValues = eigenValueMaker.GetEigenValues();
760 TMatrixT<double> eigenVectors = eigenValueMaker.GetEigenVectors();
761 TMatrixT<double> matrixVariations (size,size);
762
763 //compute the total variance by summing the eigenvalues
764 m_totalvariance = eigenValues.Sum(); //
765
766 for (int i = 0; i < size; ++i) {
767 //now go back
768 for (int r = 0; r < size; ++r)
769 //first index is the variation number, second corresponds to the pT bin //<--------- The "eigenvariations" matrix is the "C" matrix which has CKC^T = I with "K" being the o.g. covariance matrix, and "I" is the identity
770 matrixVariations(i,r) = -1.0*eigenVectors[r][i]*sqrt(fabs(eigenValues[i])); // <--------- So the result is a matrix (eigenvariation) which is the eigenvector scaled by the sqrt(eigenvalue)
771 } // <------- matrixVariations: each row is one variation, each column is the pT bin.
772
773 TMatrixT<double> matrixVariationsWithZeros = matrixVariations * matrixVariationJacobian;
774
775 // Construct the initial set of variations from this
776 for (int i = 0; i < matrixVariationsWithZeros.GetNrows(); ++i) {
777 // TString superstring(result->GetName());
778 // superstring += "_eigenVar";
779 TString superstring("eigenVar");
780 superstring+=i;
781
782 TString nameUp(superstring); nameUp += "_up";
783 TString nameDown(superstring); nameDown += "_down";
784 // TString nameUnc(superstring); nameUnc+= "_unc";
785
786 TH1* resultVariedUp = (TH1*)result->Clone(nameUp); resultVariedUp->SetDirectory(0); // <------- clone "result" hist, call it "up", and SetDirectory(0) means histogram doesn't belong to any directory.
787 TH1* resultVariedDown = (TH1*)result->Clone(nameDown); resultVariedDown->SetDirectory(0);
788
789 for (int u = 0; u < nbins; ++u) {
790 resultVariedUp->SetBinContent(u,result->GetBinContent(u) + matrixVariationsWithZeros(i,u)); // <----- This actually constructs the up-variation histogram!
791 resultVariedDown->SetBinContent(u,result->GetBinContent(u) - matrixVariationsWithZeros(i,u)); // <--- This likewise constructs the down-var., bin-by-bin.
792 }
793
794 m_eigen.push_back(std::make_pair(resultVariedUp, resultVariedDown));
795
796 } //end eigenvector size
797
798 // Remove variations that are below the given tolerance (effectively meaning that they don't have any effect) // <--------- Here we prune systematics
799 IndexSet final_set; // <-------- What's IndexSet? It's a typedef of std::set<size_t>, where size_t = int
800 size_t current_set = 0;
801 for (size_t index = 0; index < m_eigen.size(); ++index) {
802 bool keep_variation = false;
803 TH1 *up = static_cast<TH1*>(m_eigen[index].first->Clone()); up->SetDirectory(0);
804
805 up->Add(result, -1.0);
806
807 for (int bin = 1; bin <= nbins; ++bin) {
808 if (fabs(up->GetBinContent(bin)) > min_variance) { // <----- If you find even ONE bin with big enough variance, we keep the whole systematic.
809 keep_variation = true;
810 break;
811 }
812 }
813 delete up;
814 if (!keep_variation){ // <------ At this stage, if we find no bins in the systematic with large enough variation, we insert it to "final_set" for removal/pruning
815 final_set.insert(current_set);
816 } else {
817 m_capturedvariance += eigenValues[index]; // let's add up the variance that the eigenvariation contributes to the total
818 }
819 ++current_set;
820 }
821 if (final_set.size() > 0)
822 if (m_verbose) std::cout << "CalibrationDataEigenVariations: Removing " << final_set.size() << " eigenvector variations leading to sub-tolerance effects, retaining " << m_eigen.size()-final_set.size() << " variations" << std::endl;
823
824 removeVariations(final_set); // <----------------- This method actually performs the reduction. The above logic simply flags which variations to GET RID OF, inserting them into "final_set"
825
826 if (m_verbose) std::cout << " The total variance is " << m_totalvariance << " and the reduction captured " << 100*(m_capturedvariance/m_totalvariance) << "% of this." << std::endl;
830 if (m_validate){ // <---- this flag can be set manually in a local checkout of this package (temporary fix)
831 validate_reduction(cov.GetNrows(), corr, m_eigen, result, "SFEigen", m_taggername, m_wp, m_jetauthor); // <------ This method is simply here to report the matrix comparison, for reduction scheme validation
832 }
833
834 m_initialized = true;
835}
void removeVariations(const IndexSet &set)
remove all variations in the given set
int m_namedExtrapolation
named variation index for the special case of extrapolation uncertainties
int r
Definition globals.cxx:22
str index
Definition DeMoScan.py:362

◆ isExtrapolationVariation()

bool CalibrationDataEigenVariations::isExtrapolationVariation ( unsigned int nameIndex) const

flag whether the given index corresponds to an extrapolation variation

Definition at line 1103 of file CalibrationDataEigenVariations.cxx.

1104{
1105 // Verifies whether the given named variation index corresponds to the extrapolation
1106 // uncertainty.
1107
1108 return (m_namedExtrapolation == int(nameIndex));
1109}

◆ listNamedVariations()

vector< string > CalibrationDataEigenVariations::listNamedVariations ( ) const

list the named variations

Definition at line 1001 of file CalibrationDataEigenVariations.cxx.

1002{
1003 // Provides the list of named variations
1004
1005 vector<string> names;
1006 for (map<string, unsigned int>::const_iterator it = m_namedIndices.begin(); it != m_namedIndices.end(); ++it){
1007 names.push_back(it->first);
1008 }
1009 return names;
1010}

◆ mergeVariations() [1/2]

void CalibrationDataEigenVariations::mergeVariations ( const IndexSet & set)

merge all variations in the given set

Definition at line 881 of file CalibrationDataEigenVariations.cxx.

882{
883 IndexSuperSet sset;
884 sset.insert(set);
885 mergeVariations(sset);
886}
void mergeVariations(const IndexSet &set)
merge all variations in the given set

◆ mergeVariations() [2/2]

void CalibrationDataEigenVariations::mergeVariations ( const IndexSuperSet & set)

merge all variations in any of the given sets

Definition at line 890 of file CalibrationDataEigenVariations.cxx.

891{
892 // check for overlap
894 for (IndexSuperSet::iterator set_it = set.begin(); set_it != set.end(); ++set_it) {
895 for (IndexSet::iterator subset_it = set_it->begin(); subset_it != set_it->end(); ++subset_it){
896 if (checker.count(*subset_it) == 0 && *subset_it <= m_eigen.size())
897 checker.insert(*subset_it);
898 else {
899 std::cerr << "Error in CalibrationDataEigenVariations::mergeVariations: \
900 IndexSets must not overlap and must lie between 1 and " << m_eigen.size() << ". Aborting!" << std::endl;
901 return;
902 }
903 }
904 }
905
906 // retrieve the central calibration
907 TH1 *result = static_cast<TH1*>(m_cnt->GetValue("result"));
908 IndexSet toDelete;
909 int nbins = result->GetNbinsX()+2;
910 int ndim = result->GetDimension();
911 if (ndim > 1) nbins *= (result->GetNbinsY()+2);
912 if (ndim > 2) nbins *= (result->GetNbinsZ()+2);
913
914 // TH1 *var_up_final = static_cast<TH1*>(result->Clone()),
915 // *var_down_final = static_cast<TH1*>(result->Clone());
916
917 // var_up_final->Reset();
918 // var_down_final->Reset();
919
920 // complex sum
921 for (IndexSuperSet::iterator set_it = set.begin(); set_it != set.end(); ++set_it) {
922 if (set_it->empty()) continue;
923
924 double sum_H_up = 0.0, sum_H_down = 0.0;
925 size_t lowest_index = *set_it->lower_bound(0);
926 TH1 *total_var_up = static_cast<TH1*>(m_eigen[lowest_index].first->Clone()),
927 *total_var_down = static_cast<TH1*>(m_eigen[lowest_index].second->Clone());
928 total_var_up->SetDirectory(0);
929 total_var_down->SetDirectory(0);
930
931 total_var_up->Reset();
932 total_var_down->Reset();
933
934 // sum all other variations
935 for (IndexSet::iterator subset_it = set_it->begin();
936 subset_it != set_it->end(); ++subset_it) {
937 size_t actual_index = *subset_it;
938
939 if (actual_index != lowest_index) toDelete.insert(*subset_it);
940
941 TH1 *partial_var_up = static_cast<TH1*>(m_eigen[actual_index].first->Clone()),
942 *partial_var_down = static_cast<TH1*>(m_eigen[actual_index].second->Clone());
943 partial_var_up->SetDirectory(0);
944 partial_var_down->SetDirectory(0);
945
946 partial_var_up->Add(result, -1.0); // <----- Is this correct? Should it be +1?
947 partial_var_down->Add(result, -1.0);
948 for (int i = 0; i < nbins; ++i) {
949 partial_var_down->SetBinContent(i, -1.0*partial_var_down->GetBinContent(i));
950 }
951
952 for (int u = 0; u < nbins; ++u) {
953 double sum_up = total_var_up->GetBinContent(u),
954 sum_down = total_var_down->GetBinContent(u);
955 for (int v = 0; v < nbins; ++v) {
956 sum_up += partial_var_up->GetBinContent(u)*partial_var_up->GetBinContent(v);
957 sum_H_up += partial_var_up->GetBinContent(u)*partial_var_up->GetBinContent(v);
958 sum_down += partial_var_down->GetBinContent(u)*partial_var_down->GetBinContent(v);
959 sum_H_down += partial_var_down->GetBinContent(u)*partial_var_down->GetBinContent(v);
960 }
961 total_var_up->SetBinContent(u, sum_up);
962 total_var_down->SetBinContent(u, sum_down);
963 }
964 delete partial_var_up;
965 delete partial_var_down;
966 }
967
968 // final part of complex summing
969 for (int i = 0; i < nbins; ++i) {
970 if (sum_H_up != 0.0)
971 total_var_up->SetBinContent(i, total_var_up->GetBinContent(i)/sqrt(sum_H_up));
972 else
973 total_var_up->SetBinContent(i, 0.0);
974 if (sum_H_down != 0.0)
975 total_var_down->SetBinContent(i, -1.0*total_var_down->GetBinContent(i)/sqrt(sum_H_down));
976 else
977 total_var_down->SetBinContent(i, 0.0);
978 }
979
980 total_var_up->Add(result);
981 total_var_down->Add(result);
982
983 m_eigen[lowest_index].first = total_var_up;
984 m_eigen[lowest_index].second = total_var_down;
985 }
986
987 removeVariations(toDelete);
988}
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition bitmask.h:232

◆ mergeVariationsFrom()

void CalibrationDataEigenVariations::mergeVariationsFrom ( const size_t & index)

merge all variations starting from the given index

Definition at line 867 of file CalibrationDataEigenVariations.cxx.

868{
869 // Merge all systematic variation starting from the given index.
870 // The resulting merged variation replaces the first entry in the list
871 // (i.e., the entry specified by the index).
872 IndexSet simple_set;
873
874 for (size_t it = index; it < m_eigen.size(); ++it)
875 simple_set.insert(it);
876 mergeVariations(simple_set);
877}

◆ removeVariations() [1/2]

void CalibrationDataEigenVariations::removeVariations ( const IndexSet & set)

remove all variations in the given set

Definition at line 839 of file CalibrationDataEigenVariations.cxx.

840{
841 if (set.size() == 0) return;
842
843 std::vector<std::pair<TH1*, TH1*> > new_eigen;
844 for (size_t index = 0; index < m_eigen.size(); ++index){
845 if (set.count(index) == 0) new_eigen.push_back(m_eigen[index]);
846 else { delete m_eigen[index].first; delete m_eigen[index].second; }
847 }
848 m_eigen = std::move(new_eigen);
849}

◆ removeVariations() [2/2]

void CalibrationDataEigenVariations::removeVariations ( const IndexSuperSet & set)

remove all variations in any of the given sets

Definition at line 853 of file CalibrationDataEigenVariations.cxx.

854{
855 IndexSet simple_set;
856
857 for (IndexSuperSet::iterator set_it = set.begin(); set_it != set.end(); ++set_it) {
858 for (IndexSet::iterator subset_it = set_it->begin(); subset_it != set_it->end(); ++subset_it)
859 simple_set.insert(*subset_it);
860 }
861
862 removeVariations(simple_set);
863}

◆ setVerbose()

void CalibrationDataEigenVariations::setVerbose ( bool verbose)

Definition at line 1251 of file CalibrationDataEigenVariations.cxx.

1251 {
1253}
bool verbose
Definition hcg.cxx:73

Member Data Documentation

◆ m_capturedvariance

double Analysis::CalibrationDataEigenVariations::m_capturedvariance
protected

Definition at line 137 of file CalibrationDataEigenVariations.h.

◆ m_cdipath

std::string Analysis::CalibrationDataEigenVariations::m_cdipath
protected

@ data members needed for eigenvector method

the map stores the int which is needed to access the other vector<> objects

Definition at line 129 of file CalibrationDataEigenVariations.h.

◆ m_cnt

CalibrationDataHistogramContainer* Analysis::CalibrationDataEigenVariations::m_cnt
private

container object containing the basic information

Definition at line 100 of file CalibrationDataEigenVariations.h.

◆ m_eigen

std::vector<std::pair<TH1*, TH1*> > Analysis::CalibrationDataEigenVariations::m_eigen
protected

eigenvector variations

Definition at line 116 of file CalibrationDataEigenVariations.h.

◆ m_initialized

bool Analysis::CalibrationDataEigenVariations::m_initialized
protected

flag whether the initialization has been carried out

Definition at line 105 of file CalibrationDataEigenVariations.h.

◆ m_jetauthor

std::string Analysis::CalibrationDataEigenVariations::m_jetauthor
protected

Definition at line 132 of file CalibrationDataEigenVariations.h.

◆ m_named

std::vector<std::pair<TH1*, TH1*> > Analysis::CalibrationDataEigenVariations::m_named
protected

Definition at line 110 of file CalibrationDataEigenVariations.h.

◆ m_namedExtrapolation

int Analysis::CalibrationDataEigenVariations::m_namedExtrapolation
protected

named variation index for the special case of extrapolation uncertainties

Definition at line 113 of file CalibrationDataEigenVariations.h.

◆ m_namedIndices

std::map<std::string, unsigned int> Analysis::CalibrationDataEigenVariations::m_namedIndices
protected

named variations

Definition at line 109 of file CalibrationDataEigenVariations.h.

◆ m_statVariations

bool Analysis::CalibrationDataEigenVariations::m_statVariations
protected

indicate whether statistical uncertainties are stored as variations

Definition at line 119 of file CalibrationDataEigenVariations.h.

◆ m_taggername

std::string Analysis::CalibrationDataEigenVariations::m_taggername
protected

Definition at line 130 of file CalibrationDataEigenVariations.h.

◆ m_totalvariance

double Analysis::CalibrationDataEigenVariations::m_totalvariance
protected

Definition at line 136 of file CalibrationDataEigenVariations.h.

◆ m_validate

bool Analysis::CalibrationDataEigenVariations::m_validate
protected

Definition at line 106 of file CalibrationDataEigenVariations.h.

◆ m_verbose

bool Analysis::CalibrationDataEigenVariations::m_verbose
protected

Definition at line 139 of file CalibrationDataEigenVariations.h.

◆ m_wp

std::string Analysis::CalibrationDataEigenVariations::m_wp
protected

Definition at line 131 of file CalibrationDataEigenVariations.h.


The documentation for this class was generated from the following files: