Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use hash table for speed in HcalCalibrationsSet classes #15214

Merged
merged 1 commit into from Jul 21, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 3 additions & 4 deletions CalibFormats/HcalObjects/interface/HcalCalibrationWidthsSet.h
Expand Up @@ -5,7 +5,8 @@
#include "CondFormats/HcalObjects/interface/HcalDetIdRelationship.h"
#include "DataFormats/HcalDetId/interface/HcalDetId.h"
#include "DataFormats/HcalDetId/interface/HcalZDCDetId.h"
#include <vector>
#include <unordered_map>
#include <stdint.h>

/** \class HcalCalibrationWidthsSet
*
Expand All @@ -16,7 +17,6 @@ class HcalCalibrationWidthsSet {
HcalCalibrationWidthsSet();
const HcalCalibrationWidths& getCalibrationWidths(const DetId id) const;
void setCalibrationWidths(const DetId id, const HcalCalibrationWidths& ca);
void sort();
void clear();
private:
struct CalibWidthSetObject {
Expand All @@ -30,8 +30,7 @@ class HcalCalibrationWidthsSet {
};
typedef CalibWidthSetObject Item;
HcalCalibrationWidths dummy;
std::vector<CalibWidthSetObject> mItems;
bool sorted_;
std::unordered_map<uint32_t,CalibWidthSetObject> mItems;
};

#endif
7 changes: 3 additions & 4 deletions CalibFormats/HcalObjects/interface/HcalCalibrationsSet.h
Expand Up @@ -5,7 +5,8 @@
#include "CondFormats/HcalObjects/interface/HcalDetIdRelationship.h"
#include "DataFormats/HcalDetId/interface/HcalDetId.h"
#include "DataFormats/HcalDetId/interface/HcalZDCDetId.h"
#include <vector>
#include <unordered_map>
#include <stdint.h>

/** \class HcalCalibrationsSet
*
Expand All @@ -16,7 +17,6 @@ class HcalCalibrationsSet {
HcalCalibrationsSet();
const HcalCalibrations& getCalibrations(const DetId id) const;
void setCalibrations(const DetId id, const HcalCalibrations& ca);
void sort();
void clear();
private:
struct CalibSetObject {
Expand All @@ -30,8 +30,7 @@ class HcalCalibrationsSet {
};
typedef CalibSetObject Item;
HcalCalibrations dummy;
std::vector<CalibSetObject> mItems;
bool sorted_;
std::unordered_map<uint32_t,CalibSetObject> mItems;
};

#endif
34 changes: 11 additions & 23 deletions CalibFormats/HcalObjects/src/HcalCalibrationWidthsSet.cc
Expand Up @@ -3,40 +3,28 @@
#include "FWCore/Utilities/interface/Exception.h"
#include <algorithm>
#include <iostream>

#include <utility>

HcalCalibrationWidthsSet::HcalCalibrationWidthsSet()
: sorted_ (false) {}
{}

const HcalCalibrationWidths& HcalCalibrationWidthsSet::getCalibrationWidths(const DetId fId) const {
Item target(fId);
std::vector<Item>::const_iterator cell;
if (sorted_) {
cell = std::lower_bound (mItems.begin(), mItems.end(), target);
} else {
cell = std::find(mItems.begin(),mItems.end(), target);
}
if ((cell == mItems.end()) || (!hcalEqualDetId(cell->id.rawId(),fId)))
DetId fId2(hcalTransformedId(fId));
auto cell = mItems.find(fId2);
if ((cell == mItems.end()) || (!hcalEqualDetId(cell->first,fId2)))
throw cms::Exception ("Conditions not found") << "Unavailable HcalCalibrationWidths for cell " << HcalGenericDetId(fId);
return cell->calib;
return cell->second.calib;
}

void HcalCalibrationWidthsSet::setCalibrationWidths(DetId fId, const HcalCalibrationWidths& ca) {
sorted_=false;
std::vector<Item>::iterator cell=std::find(mItems.begin(),mItems.end(),Item(fId)); //slow, but guaranteed
DetId fId2(hcalTransformedId(fId));
auto cell = mItems.find(fId2);
if (cell==mItems.end()) {
mItems.push_back(Item(fId));
mItems.at(mItems.size()-1).calib=ca;
auto result = mItems.emplace(fId2,fId2);
result.first->second.calib=ca;
return;
}
cell->calib=ca;
}

void HcalCalibrationWidthsSet::sort () {
if (!sorted_) {
std::sort (mItems.begin(), mItems.end());
sorted_ = true;
}
cell->second.calib=ca;
}

void HcalCalibrationWidthsSet::clear() {
Expand Down
34 changes: 11 additions & 23 deletions CalibFormats/HcalObjects/src/HcalCalibrationsSet.cc
Expand Up @@ -3,40 +3,28 @@
#include "FWCore/Utilities/interface/Exception.h"
#include <algorithm>
#include <iostream>

#include <utility>

HcalCalibrationsSet::HcalCalibrationsSet()
: sorted_ (false) {}
{}

const HcalCalibrations& HcalCalibrationsSet::getCalibrations(const DetId fId) const {
Item target(fId);
std::vector<Item>::const_iterator cell;
if (sorted_) {
cell = std::lower_bound (mItems.begin(), mItems.end(), target);
} else {
cell = std::find(mItems.begin(),mItems.end(), target);
}
if ((cell == mItems.end()) || (!hcalEqualDetId(cell->id.rawId(),fId)))
DetId fId2(hcalTransformedId(fId));
auto cell = mItems.find(fId2);
if ((cell == mItems.end()) || (!hcalEqualDetId(cell->first,fId2)))
throw cms::Exception ("Conditions not found") << "Unavailable HcalCalibrations for cell " << HcalGenericDetId(fId);
return cell->calib;
return cell->second.calib;
}

void HcalCalibrationsSet::setCalibrations(DetId fId, const HcalCalibrations& ca) {
sorted_=false;
std::vector<Item>::iterator cell=std::find(mItems.begin(),mItems.end(),Item(fId)); //slow, but guaranteed
DetId fId2(hcalTransformedId(fId));
auto cell = mItems.find(fId2);
if (cell==mItems.end()) {
mItems.push_back(Item(fId));
mItems.at(mItems.size()-1).calib=ca;
auto result = mItems.emplace(fId2,fId2);
result.first->second.calib=ca;
return;
}
cell->calib=ca;
}

void HcalCalibrationsSet::sort () {
if (!sorted_) {
std::sort (mItems.begin(), mItems.end());
sorted_ = true;
}
cell->second.calib=ca;
}

void HcalCalibrationsSet::clear() {
Expand Down
3 changes: 0 additions & 3 deletions CalibFormats/HcalObjects/src/HcalDbService.cc
Expand Up @@ -72,7 +72,6 @@ void HcalDbService::buildCalibrations() const {
if (ok) ptr->setCalibrations(*id,tool);
// std::cout << "Hcal calibrations built... detid no. " << HcalGenericDetId(*id) << std::endl;
}
ptr->sort();
HcalCalibrationsSet const * cptr = ptr;
HcalCalibrationsSet const * expect = nullptr;
bool exchanged = mCalibSet.compare_exchange_strong(expect, cptr, std::memory_order_acq_rel);
Expand Down Expand Up @@ -103,8 +102,6 @@ void HcalDbService::buildCalibWidths() const {
if (ok) ptr->setCalibrationWidths(*id,tool);
// std::cout << "Hcal calibrations built... detid no. " << HcalGenericDetId(*id) << std::endl;
}
ptr->sort();

HcalCalibrationWidthsSet const * cptr = ptr;
HcalCalibrationWidthsSet const * expect = nullptr;
bool exchanged = mCalibWidthSet.compare_exchange_strong(expect, cptr, std::memory_order_acq_rel);
Expand Down