Public Member Functions | |
virtual unsigned int | derivatives (std::vector< ValuesIndexPair > &outDerivInds, const TransientTrackingRecHit &hit, const TrajectoryStateOnSurface &tsos, const edm::EventSetup &setup, const EventInfo &eventInfo) const |
virtual void | endOfJob () |
virtual double | getParameter (unsigned int index) const |
virtual double | getParameterError (unsigned int index) const |
virtual unsigned int | numParameters () const |
How many parameters does this calibration define? | |
virtual bool | setParameter (unsigned int index, double value) |
virtual bool | setParameterError (unsigned int index, double error) |
SiPixelLorentzAngleCalibration (const edm::ParameterSet &cfg) | |
Constructor. | |
virtual | ~SiPixelLorentzAngleCalibration () |
Destructor. | |
Private Member Functions | |
bool | checkLorentzAngleInput (const edm::EventSetup &setup, const EventInfo &eventInfo) |
SiPixelLorentzAngle * | createFromTree (const char *fileName, const char *treeName) const |
edm::RunNumber_t | firstRunOfIOV (unsigned int iovNum) const |
First run of iov (0 if iovNum not treated). | |
const SiPixelLorentzAngle * | getLorentzAnglesInput () |
double | getParameterForDetId (unsigned int detId, edm::RunNumber_t run) const |
int | getParameterIndexFromDetId (unsigned int detId, edm::RunNumber_t run) const |
unsigned int | numIovs () const |
Total number of IOVs. | |
void | writeTree (const SiPixelLorentzAngle *lorentzAngle, const char *treeName) const |
Private Attributes | |
const std::vector< std::string > | mergeFileNames_ |
const std::string | outFileName_ |
std::vector< double > | parameters_ |
std::vector< double > | paramUncertainties_ |
const std::string | recordNameDBwrite_ |
const bool | saveToDB_ |
SiPixelLorentzAngle * | siPixelLorentzAngleInput_ |
edm::ESWatcher < SiPixelLorentzAngleRcd > | watchLorentzAngleRcd_ |
Calibration of Lorentz angle for the pixel, integrated in the alignment algorithms.
Note that not all algorithms support this...
(last update by
)
Definition at line 41 of file SiPixelLorentzAngleCalibration.cc.
SiPixelLorentzAngleCalibration::SiPixelLorentzAngleCalibration | ( | const edm::ParameterSet & | cfg | ) | [explicit] |
Constructor.
Definition at line 134 of file SiPixelLorentzAngleCalibration.cc.
References mergeFileNames_, IntegratedCalibrationBase::name(), numParameters(), outFileName_, parameters_, paramUncertainties_, and saveToDB_.
: IntegratedCalibrationBase(cfg), saveToDB_(cfg.getParameter<bool>("saveToDB")), recordNameDBwrite_(cfg.getParameter<std::string>("recordNameDBwrite")), outFileName_(cfg.getParameter<std::string>("treeFile")), mergeFileNames_(cfg.getParameter<std::vector<std::string> >("mergeTreeFiles")), // alignableTracker_(0), siPixelLorentzAngleInput_(0) { // FIXME: Which granularity, leading to how many parameters? parameters_.resize(2, 0.); // currently two parameters (ring1-4, 5-8), start value 0. paramUncertainties_.resize(2, 0.); // dito for errors edm::LogInfo("Alignment") << "@SUB=SiPixelLorentzAngleCalibration" << "Created with name " << this->name() << "',\n" << this->numParameters() << " parameters to be determined," << "\nsaveToDB = " << saveToDB_ << "\n outFileName = " << outFileName_ << "\n N(merge files) = " << mergeFileNames_.size(); if (mergeFileNames_.size()) { edm::LogInfo("Alignment") << "@SUB=SiPixelLorentzAngleCalibration" << "First file to merge: " << mergeFileNames_[0]; } }
SiPixelLorentzAngleCalibration::~SiPixelLorentzAngleCalibration | ( | ) | [virtual] |
Destructor.
Definition at line 159 of file SiPixelLorentzAngleCalibration.cc.
References siPixelLorentzAngleInput_.
{ // std::cout << "Destroy SiPixelLorentzAngleCalibration named " << this->name() << std::endl; delete siPixelLorentzAngleInput_; }
bool SiPixelLorentzAngleCalibration::checkLorentzAngleInput | ( | const edm::EventSetup & | setup, |
const EventInfo & | eventInfo | ||
) | [private] |
If called the first time, fill 'siPixelLorentzAngleInput_', later check that LorentzAngle has not changed.
Definition at line 319 of file SiPixelLorentzAngleCalibration.cc.
References edm::ESWatcher< T >::check(), AlignmentAlgorithmBase::EventInfo::eventId_, Exception, edm::EventSetup::get(), SiPixelLorentzAngle::getLorentzAngles(), edm::EventID::run(), siPixelLorentzAngleInput_, and watchLorentzAngleRcd_.
Referenced by derivatives().
{ edm::ESHandle<SiPixelLorentzAngle> lorentzAngleHandle; if (!siPixelLorentzAngleInput_) { setup.get<SiPixelLorentzAngleRcd>().get(lorentzAngleHandle); siPixelLorentzAngleInput_ = new SiPixelLorentzAngle(*lorentzAngleHandle); } else { if (watchLorentzAngleRcd_.check(setup)) { // new IOV of input setup.get<SiPixelLorentzAngleRcd>().get(lorentzAngleHandle); if (lorentzAngleHandle->getLorentzAngles() // but only bad if non-identical values != siPixelLorentzAngleInput_->getLorentzAngles()) { // (comparing maps) // FIXME: Could different maps have same content, but different order? // Or 'floating point comparison' problem? throw cms::Exception("BadInput") << "SiPixelLorentzAngleCalibration::checkLorentzAngleInput:\n" << "Content of SiPixelLorentzAngle changed at run " << eventInfo.eventId_.run() << ", but algorithm expects constant input!\n"; return false; // not reached... } } } return true; }
SiPixelLorentzAngle * SiPixelLorentzAngleCalibration::createFromTree | ( | const char * | fileName, |
const char * | treeName | ||
) | const [private] |
Definition at line 465 of file SiPixelLorentzAngleCalibration.cc.
References mergeVDriftHistosByStation::file, SiPixelLorentzAngle::putLorentzAngle(), query::result, diffTreeTool::tree, and relativeConstraints::value.
Referenced by getLorentzAnglesInput().
{ // Check for file existence on your own to work around // https://hypernews.cern.ch/HyperNews/CMS/get/swDevelopment/2715.html: TFile* file = 0; FILE* testFile = fopen(fileName,"r"); if (testFile) { fclose(testFile); file = TFile::Open(fileName, "READ"); } // else not existing, see error below TTree *tree = 0; if (file) file->GetObject(treeName, tree); SiPixelLorentzAngle *result = 0; if (tree) { unsigned int id = 0; float value = 0.; tree->SetBranchAddress("detId", &id); tree->SetBranchAddress("value", &value); result = new SiPixelLorentzAngle; const Long64_t nEntries = tree->GetEntries(); for (Long64_t iEntry = 0; iEntry < nEntries; ++iEntry) { tree->GetEntry(iEntry); result->putLorentzAngle(id, value); } } else { // Warning only since could be parallel job on no events. edm::LogWarning("Alignment") << "@SUB=SiPixelLorentzAngleCalibration::createFromTree" << "Could not get TTree '" << treeName << "' from file '" << fileName << (file ? "'." : "' (file does not exist)."); } delete file; // tree will vanish with file return result; }
unsigned int SiPixelLorentzAngleCalibration::derivatives | ( | std::vector< ValuesIndexPair > & | outDerivInds, |
const TransientTrackingRecHit & | hit, | ||
const TrajectoryStateOnSurface & | tsos, | ||
const edm::EventSetup & | setup, | ||
const EventInfo & | eventInfo | ||
) | const [virtual] |
Return non-zero derivatives for x- and y-measurements with their indices by reference. Return value is their number.
Implements IntegratedCalibrationBase.
Definition at line 173 of file SiPixelLorentzAngleCalibration.cc.
References ecalTB2006H4_GenSimDigiReco_cfg::bField, BoundSurface::bounds(), checkLorentzAngleInput(), TransientTrackingRecHit::det(), AlignmentAlgorithmBase::EventInfo::eventId_, GeomDet::geographicalId(), edm::EventSetup::get(), getParameterIndexFromDetId(), getHLTprescales::index, GloballyPositioned< T >::position(), edm::EventID::run(), GeomDet::surface(), Bounds::thickness(), and GloballyPositioned< T >::toLocal().
{ // ugly const-cast: // But it is either only first initialisation or throwing an exception... const_cast<SiPixelLorentzAngleCalibration*>(this)->checkLorentzAngleInput(setup, eventInfo); outDerivInds.clear(); if (hit.det()) { // otherwise 'constraint hit' or whatever const int index = this->getParameterIndexFromDetId(hit.det()->geographicalId(), eventInfo.eventId_.run()); if (index >= 0) { // otherwise not treated edm::ESHandle<MagneticField> magneticField; setup.get<IdealMagneticFieldRecord>().get(magneticField); const GlobalVector bField(magneticField->inTesla(hit.det()->surface().position())); const LocalVector bFieldLocal(hit.det()->surface().toLocal(bField)); const double dZ = hit.det()->surface().bounds().thickness(); // it is a float only... // shift due to LA: dx = tan(LA) * dz/2 = mobility * B_y * dz/2, // '-' since we have derivative of the residual r = trk -hit const double xDerivative = bFieldLocal.y() * dZ * -0.5; // parameter is mobility! if (xDerivative) { // If field is zero, this is zero: do not return it const Values derivs(xDerivative, 0.); // yDerivative = 0. outDerivInds.push_back(ValuesIndexPair(derivs, index)); } } } else { edm::LogWarning("Alignment") << "@SUB=SiPixelLorentzAngleCalibration::derivatives2" << "Hit without GeomDet, skip!"; } return outDerivInds.size(); }
void SiPixelLorentzAngleCalibration::endOfJob | ( | ) | [virtual] |
Called at end of a the job of the AlignmentProducer. Write out determined parameters.
Implements IntegratedCalibrationBase.
Definition at line 265 of file SiPixelLorentzAngleCalibration.cc.
References firstRunOfIOV(), SiPixelLorentzAngle::getLorentzAngles(), getLorentzAnglesInput(), getParameterForDetId(), LaserDQM_cfg::input, edm::Service< T >::isAvailable(), IntegratedCalibrationBase::name(), numIovs(), dbtoconf::out, convertSQLitetoXML_cfg::output, parameters_, paramUncertainties_, SiPixelLorentzAngle::putLorentzAngle(), recordNameDBwrite_, saveToDB_, AlCaHLTBitMon_QueryRunRegistry::string, relativeConstraints::value, and writeTree().
{ // loginfo output std::ostringstream out; out << "Parameter results\n"; for (unsigned int iPar = 0; iPar < parameters_.size(); ++iPar) { out << iPar << ": " << parameters_[iPar] << " +- " << paramUncertainties_[iPar] << "\n"; } edm::LogInfo("Alignment") << "@SUB=SiPixelLorentzAngleCalibration::endOfJob" << out.str(); // now write 'input' tree const SiPixelLorentzAngle *input = this->getLorentzAnglesInput(); // never NULL const std::string treeName(this->name() + '_'); this->writeTree(input, (treeName + "input").c_str()); if (input->getLorentzAngles().empty()) { edm::LogError("Alignment") << "@SUB=SiPixelLorentzAngleCalibration::endOfJob" << "Input Lorentz angle map is empty, skip writing output!"; return; } for (unsigned int iIOV = 0; iIOV < this->numIovs(); ++iIOV) { cond::Time_t firstRunOfIOV = this->firstRunOfIOV(iIOV); SiPixelLorentzAngle *output = new SiPixelLorentzAngle; // Loop on map of values from input and add (possible) parameter results for (auto iterIdValue = input->getLorentzAngles().begin(); iterIdValue != input->getLorentzAngles().end(); ++iterIdValue) { // type of (*iterIdValue) is pair<unsigned int, float> const unsigned int detId = iterIdValue->first; // key of map is DetId // Nasty: putLorentzAngle(..) takes float by reference - not even const reference! float value = iterIdValue->second + this->getParameterForDetId(detId, firstRunOfIOV); output->putLorentzAngle(detId, value); // put result in output } // Write this even for mille jobs? this->writeTree(output, (treeName + Form("result_%lld", firstRunOfIOV)).c_str()); if (saveToDB_) { // If requested, write out to DB edm::Service<cond::service::PoolDBOutputService> dbService; if (dbService.isAvailable()) { dbService->writeOne(output, firstRunOfIOV, recordNameDBwrite_.c_str()); // no 'delete output;': writeOne(..) took over ownership } else { delete output; edm::LogError("BadConfig") << "@SUB=SiPixelLorentzAngleCalibration::endOfJob" << "No PoolDBOutputService available, but saveToDB true!"; } } else { delete output; } } // end loop on IOVs }
edm::RunNumber_t SiPixelLorentzAngleCalibration::firstRunOfIOV | ( | unsigned int | iovNum | ) | const [private] |
First run of iov (0 if iovNum not treated).
Definition at line 424 of file SiPixelLorentzAngleCalibration.cc.
References numIovs().
Referenced by endOfJob().
{ // FIXME: Needed to include treatment of run dependence! if (iovNum < this->numIovs()) return 1; else return 0; }
const SiPixelLorentzAngle * SiPixelLorentzAngleCalibration::getLorentzAnglesInput | ( | ) | [private] |
Input LorentzAngle values:
Definition at line 346 of file SiPixelLorentzAngleCalibration.cc.
References createFromTree(), SiPixelLorentzAngle::getLorentzAngles(), mergeFileNames_, IntegratedCalibrationBase::name(), siPixelLorentzAngleInput_, and AlCaHLTBitMon_QueryRunRegistry::string.
Referenced by endOfJob().
{ // For parallel processing in Millepede II, create SiPixelLorentzAngle // from info stored in files of parallel jobs and check that they are identical. // If this job has run on data, still check that LA is identical to the ones // from mergeFileNames_. const std::string treeName(this->name() + "_input"); for (auto iFile = mergeFileNames_.begin(); iFile != mergeFileNames_.end(); ++iFile) { SiPixelLorentzAngle* la = this->createFromTree(iFile->c_str(), treeName.c_str()); // siPixelLorentzAngleInput_ could be non-null from previous file of this loop // or from checkLorentzAngleInput(..) when running on data in this job as well if (!siPixelLorentzAngleInput_ || siPixelLorentzAngleInput_->getLorentzAngles().empty()) { delete siPixelLorentzAngleInput_; // NULL or empty siPixelLorentzAngleInput_ = la; } else { // FIXME: about comparison of maps see comments in checkLorentzAngleInput if (la && !la->getLorentzAngles().empty() && // single job might not have got events la->getLorentzAngles() != siPixelLorentzAngleInput_->getLorentzAngles()) { // Throw exception instead of error? edm::LogError("NoInput") << "@SUB=SiPixelLorentzAngleCalibration::getLorentzAnglesInput" << "Different input values from tree " << treeName << " in file " << *iFile << "."; } delete la; } } if (!siPixelLorentzAngleInput_) { // no files nor ran on events siPixelLorentzAngleInput_ = new SiPixelLorentzAngle; edm::LogError("NoInput") << "@SUB=SiPixelLorentzAngleCalibration::getLorentzAnglesInput" << "No input, create an empty one!"; } else if (siPixelLorentzAngleInput_->getLorentzAngles().empty()) { edm::LogError("NoInput") << "@SUB=SiPixelLorentzAngleCalibration::getLorentzAnglesInput" << "Empty result!"; } return siPixelLorentzAngleInput_; }
double SiPixelLorentzAngleCalibration::getParameter | ( | unsigned int | index | ) | const [virtual] |
Return current value of parameter identified by index. Should return 0. if index out-of-bounds.
Implements IntegratedCalibrationBase.
Definition at line 234 of file SiPixelLorentzAngleCalibration.cc.
References getHLTprescales::index, and parameters_.
{ // if (index >= parameters_.size()) { // return 0.; // } else { // return parameters_[index]; // } return (index >= parameters_.size() ? 0. : parameters_[index]); }
double SiPixelLorentzAngleCalibration::getParameterError | ( | unsigned int | index | ) | const [virtual] |
Return current value of parameter identified by index. Returns 0. if index out-of-bounds or if errors undetermined.
Implements IntegratedCalibrationBase.
Definition at line 245 of file SiPixelLorentzAngleCalibration.cc.
References getHLTprescales::index, and paramUncertainties_.
{ // if (index >= paramUncertainties_.size()) { // return 0.; // } else { // return paramUncertainties_[index]; // } return (index >= paramUncertainties_.size() ? 0. : paramUncertainties_[index]); }
double SiPixelLorentzAngleCalibration::getParameterForDetId | ( | unsigned int | detId, |
edm::RunNumber_t | run | ||
) | const [private] |
Determined parameter value for this detId (detId not treated => 0.) and the given run.
Definition at line 387 of file SiPixelLorentzAngleCalibration.cc.
References getParameterIndexFromDetId(), getHLTprescales::index, and parameters_.
Referenced by endOfJob().
{ const int index = this->getParameterIndexFromDetId(detId, run); return (index < 0 ? 0. : parameters_[index]); }
int SiPixelLorentzAngleCalibration::getParameterIndexFromDetId | ( | unsigned int | detId, |
edm::RunNumber_t | run | ||
) | const [private] |
Index of parameter for given detId (detId not treated => < 0) and the given run.
Definition at line 396 of file SiPixelLorentzAngleCalibration.cc.
References python::rootplot::argparse::module, PixelSubdetector::PixelBarrel, and DetId::Tracker.
Referenced by derivatives(), and getParameterForDetId().
{ // Return the index of the parameter that is used for this DetId. // If this DetId is not treated, return values < 0. // FIXME: Extend to configurable granularity? // Including treatment of run dependence? const PXBDetId id(detId); if (id.det() == DetId::Tracker && id.subdetId() == PixelSubdetector::PixelBarrel) { if (id.module() >= 1 && id.module() <= 4) return 0; if (id.module() >= 5 && id.module() <= 8) return 1; edm::LogWarning("Alignment") << "@SUB=SiPixelLorentzAngleCalibration::getParameterIndexFromDetId" << "Module should be 1-8, but is " << id.module() << " => skip!"; } return -1; }
unsigned int SiPixelLorentzAngleCalibration::numIovs | ( | ) | const [private] |
Total number of IOVs.
Definition at line 417 of file SiPixelLorentzAngleCalibration.cc.
Referenced by endOfJob(), and firstRunOfIOV().
{ // FIXME: Needed to include treatment of run dependence! return 1; }
unsigned int SiPixelLorentzAngleCalibration::numParameters | ( | ) | const [virtual] |
How many parameters does this calibration define?
Implements IntegratedCalibrationBase.
Definition at line 166 of file SiPixelLorentzAngleCalibration.cc.
References parameters_.
Referenced by SiPixelLorentzAngleCalibration().
{ return parameters_.size(); }
bool SiPixelLorentzAngleCalibration::setParameter | ( | unsigned int | index, |
double | value | ||
) | [virtual] |
Setting the determined parameter identified by index, should return false if out-of-bounds, true otherwise.
Implements IntegratedCalibrationBase.
Definition at line 212 of file SiPixelLorentzAngleCalibration.cc.
References getHLTprescales::index, parameters_, and relativeConstraints::value.
{ if (index >= parameters_.size()) { return false; } else { parameters_[index] = value; return true; } }
bool SiPixelLorentzAngleCalibration::setParameterError | ( | unsigned int | index, |
double | error | ||
) | [virtual] |
Setting the determined parameter uncertainty identified by index, returns false if out-of-bounds, true otherwise.
Implements IntegratedCalibrationBase.
Definition at line 223 of file SiPixelLorentzAngleCalibration.cc.
References error, getHLTprescales::index, and paramUncertainties_.
{ if (index >= paramUncertainties_.size()) { return false; } else { paramUncertainties_[index] = error; return true; } }
void SiPixelLorentzAngleCalibration::writeTree | ( | const SiPixelLorentzAngle * | lorentzAngle, |
const char * | treeName | ||
) | const [private] |
Definition at line 433 of file SiPixelLorentzAngleCalibration.cc.
References mergeVDriftHistosByStation::file, SiPixelLorentzAngle::getLorentzAngles(), outFileName_, diffTreeTool::tree, and relativeConstraints::value.
Referenced by endOfJob().
{ if (!lorentzAngle) return; TFile* file = TFile::Open(outFileName_.c_str(), "UPDATE"); if (!file) { edm::LogError("BadConfig") << "@SUB=SiPixelLorentzAngleCalibration::writeTree" << "Could not open file '" << outFileName_ << "'."; return; } TTree *tree = new TTree(treeName, treeName); unsigned int id = 0; float value = 0.; tree->Branch("detId", &id, "detId/i"); tree->Branch("value", &value, "value/F"); for (auto iterIdValue = lorentzAngle->getLorentzAngles().begin(); iterIdValue != lorentzAngle->getLorentzAngles().end(); ++iterIdValue) { // type of (*iterIdValue) is pair<unsigned int, float> id = iterIdValue->first; // key of map is DetId value = iterIdValue->second; tree->Fill(); } tree->Write(); delete file; // tree vanishes with the file... (?) }
const std::vector<std::string> SiPixelLorentzAngleCalibration::mergeFileNames_ [private] |
Definition at line 120 of file SiPixelLorentzAngleCalibration.cc.
Referenced by getLorentzAnglesInput(), and SiPixelLorentzAngleCalibration().
const std::string SiPixelLorentzAngleCalibration::outFileName_ [private] |
Definition at line 119 of file SiPixelLorentzAngleCalibration.cc.
Referenced by SiPixelLorentzAngleCalibration(), and writeTree().
std::vector<double> SiPixelLorentzAngleCalibration::parameters_ [private] |
Definition at line 126 of file SiPixelLorentzAngleCalibration.cc.
Referenced by endOfJob(), getParameter(), getParameterForDetId(), numParameters(), setParameter(), and SiPixelLorentzAngleCalibration().
std::vector<double> SiPixelLorentzAngleCalibration::paramUncertainties_ [private] |
Definition at line 127 of file SiPixelLorentzAngleCalibration.cc.
Referenced by endOfJob(), getParameterError(), setParameterError(), and SiPixelLorentzAngleCalibration().
const std::string SiPixelLorentzAngleCalibration::recordNameDBwrite_ [private] |
Definition at line 118 of file SiPixelLorentzAngleCalibration.cc.
Referenced by endOfJob().
const bool SiPixelLorentzAngleCalibration::saveToDB_ [private] |
Definition at line 117 of file SiPixelLorentzAngleCalibration.cc.
Referenced by endOfJob(), and SiPixelLorentzAngleCalibration().
Definition at line 125 of file SiPixelLorentzAngleCalibration.cc.
Referenced by checkLorentzAngleInput(), getLorentzAnglesInput(), and ~SiPixelLorentzAngleCalibration().
edm::ESWatcher<SiPixelLorentzAngleRcd> SiPixelLorentzAngleCalibration::watchLorentzAngleRcd_ [private] |
Definition at line 122 of file SiPixelLorentzAngleCalibration.cc.
Referenced by checkLorentzAngleInput().