16 #include <boost/cstdint.hpp>
59 const std::vector<std::pair<Alignable*,std::string> >& alisFile,
61 const std::vector<Alignable*>& ex,
63 const bool downToLowestLevel
67 levelsFilenames_(alisFile),
68 excludedAlignables_(ex),
71 downToLowestLevel_(downToLowestLevel)
78 const std::vector<edm::ParameterSet> &
config,
85 unsigned int psetnr = 0;
86 std::set<std::string> steerFilePrefixContainer;
91 const auto coefficients =
pset.getParameter<std::vector<double> > (
"coefficients");
92 const auto dm =
pset.exists(
"deadmodules") ?
93 pset.getParameter<std::vector<unsigned int> >(
"deadmodules") : std::vector<unsigned int>();
96 const auto ignoredInstances =
pset.exists(
"ignoredInstances") ?
97 pset.getUntrackedParameter<std::vector<unsigned int> >(
"ignoredInstances"):
98 std::vector<unsigned int>();
100 const auto downToLowestLevel =
pset.exists(
"downToLowestLevel") ?
101 pset.getUntrackedParameter<
bool>(
"downToLowestLevel"):
false;
107 const auto& alis = selector.selectedAlignables();
110 selector_excludedalignables.
clear();
111 if(
pset.exists(
"excludedAlignables")) {
121 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteererWeakModeConstraints"
122 <<
"Load list of dead modules (size = " << dm.size()<<
").";
132 != ignoredInstances.end()) {
135 std::stringstream defaultsteerfileprefix;
136 defaultsteerfileprefix <<
"autosteerFilePrefix_" << name <<
"_" << psetnr
139 const auto steerFilePrefix =
pset.exists(
"steerFilePrefix") ?
140 pset.getParameter<
std::string> (
"steerFilePrefix") +
"_" + std::to_string(instance) :
141 defaultsteerfileprefix.str();
162 std::pair<align::GlobalPoint, align::GlobalPoint>
168 const auto ySplit = aliPar->
ySplit();
170 const auto yM1 = 0.5 * (ySplit - halfLength);
171 const auto yM2 = yM1 + halfLength;
174 return std::make_pair(pos_sensor0, pos_sensor1);
177 <<
"[PedeSteererWeakModeConstraints::getDoubleSensorPosition]"
178 <<
" Dynamic cast to double sensor parameters failed.";
187 unsigned int nConstraints = 0;
190 for(
const auto& iHLS: iC.levelsFilenames_) {
192 std::vector<Alignable*> aliDaughts;
193 if (iC.downToLowestLevel_) {
194 if (!iHLS.first->lastCompsWithParams(aliDaughts)) {
196 <<
"@SUB=PedeSteererWeakModeConstraints::createAlignablesDataStructure"
197 <<
"Some but not all component branches "
202 if (!iHLS.first->firstCompsWithParams(aliDaughts)) {
204 <<
"@SUB=PedeSteererWeakModeConstraints::createAlignablesDataStructure"
205 <<
"Some but not all daughters of "
212 std::list<Alignable*> usedinconstraint;
213 for (
const auto& iD: aliDaughts) {
214 bool isNOTdead =
true;
218 && iD->geomDetId().rawId() == iDeadmodules) {
224 for(
const auto& iEx: iC.excludedAlignables_) {
225 if(iD->id() == iEx->id() && iD->alignableObjectId() == iEx->alignableObjectId() ) {
231 const bool issubcomponent = this->
checkMother(iD,iHLS.first);
234 usedinconstraint.push_back(iD);
239 <<
"[PedeSteererWeakModeConstraints::createAlignablesDataStructure]"
240 <<
" Sanity check failed. Alignable defined as active sub-component, "
245 if( usedinconstraint.size() > 0){
246 iC.HLSsubdets_.push_back(std::make_pair(iHLS.first, usedinconstraint));
248 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteererWeakModeConstraints"
249 <<
"No sub-components for "
251 <<
"at (" << iHLS.first->globalPosition().x() <<
","<< iHLS.first->globalPosition().y() <<
"," << iHLS.first->globalPosition().z() <<
") "
252 <<
"selected. Skip constraint";
254 if(aliDaughts.size() == 0) {
255 edm::LogWarning(
"Alignment") <<
"@SUB=PedeSteererWeakModeConstraints::createAlignablesDataStructure"
256 <<
"No active sub-alignables found for "
258 <<
" at (" << iHLS.first->globalPosition().x() <<
","<< iHLS.first->globalPosition().y() <<
"," << iHLS.first->globalPosition().z() <<
").";
271 const double phase)
const
275 const double r = TMath::Sqrt(pos.
x() * pos.
x() + pos.
y() * pos.
y());
277 switch(sysdeformation) {
278 case SystematicDeformations::kTwist:
279 case SystematicDeformations::kZexpansion:
282 case SystematicDeformations::kSagitta:
283 case SystematicDeformations::kRadial:
284 case SystematicDeformations::kTelescope:
285 case SystematicDeformations::kLayerRotation:
288 case SystematicDeformations::kBowing:
289 x = pos.
z() * pos.
z();
291 case SystematicDeformations::kElliptical:
292 x = r * TMath::Cos(2.0 * pos.
phi() + phase);
294 case SystematicDeformations::kSkew:
295 x = TMath::Cos(pos.
phi() + phase);
309 const int iParameter,
const double &x0,
310 const std::vector<double> &constraintparameters)
const
314 if(iParameter < 0 || iParameter > 2) {
316 <<
"[PedeSteererWeakModeConstraints::getCoefficient]" <<
" iParameter has to be in the range [0,2] but"
317 <<
" it is equal to " << iParameter <<
".";
322 const std::vector<double> vec_u = {pos.
x() - gUDirection.
x(), pos.
y() - gUDirection.
y(), pos.
z() - gUDirection.
z()};
323 const std::vector<double> vec_v = {pos.
x() - gVDirection.
x(), pos.
y() - gVDirection.
y(), pos.
z() - gVDirection.
z()};
324 const std::vector<double> vec_w = {pos.
x() - gWDirection.
x(), pos.
y() - gWDirection.
y(), pos.
z() - gWDirection.
z()};
327 const std::vector<std::vector<double> > global_vecs = {vec_u, vec_v, vec_w};
329 const double n = TMath::Sqrt( global_vecs.at(iParameter).at(0) * global_vecs.at(iParameter).at(0)
330 + global_vecs.at(iParameter).at(1) * global_vecs.at(iParameter).at(1)
331 + global_vecs.at(iParameter).at(2) * global_vecs.at(iParameter).at(2) );
332 const double r = TMath::Sqrt( pos.
x() * pos.
x() + pos.
y() * pos.
y() );
334 const double phase = this->
getPhase(constraintparameters);
336 const std::vector<double> radial_direction = {TMath::Sin(phase), TMath::Cos(phase), 0.0};
338 const double norm_radial_direction = TMath::Sqrt(radial_direction.at(0) * radial_direction.at(0)
339 + radial_direction.at(1) * radial_direction.at(1)
340 + radial_direction.at(2) * radial_direction.at(2));
343 const std::vector<double> phi_direction = {-1.0 * pos.
y(), pos.
x(), 0.0};
344 const double norm_phi_direction = TMath::Sqrt(phi_direction.at(0) * phi_direction.at(0)
345 + phi_direction.at(1) * phi_direction.at(1)
346 + phi_direction.at(2) * phi_direction.at(2));
349 static const std::vector<double> z_direction = {0.0, 0.0, 1.0};
350 const double norm_z_direction = TMath::Sqrt(z_direction.at(0)*z_direction.at(0)
351 + z_direction.at(1)*z_direction.at(1)
352 + z_direction.at(2)*z_direction.at(2));
355 const std::vector<double> rDirection = {pos.
x(), pos.
y(), 0.0};
356 const double norm_rDirection = TMath::Sqrt(rDirection.at(0) * rDirection.at(0)
357 + rDirection.at(1) * rDirection.at(1)
358 + rDirection.at(2) * rDirection.at(2));
361 double dot_product = 0.0;
362 double normalisation_factor = 1.0;
365 switch(sysdeformation) {
366 case SystematicDeformations::kTwist:
367 case SystematicDeformations::kLayerRotation:
368 dot_product = phi_direction.at(0) * global_vecs.at(iParameter).at(0)
369 + phi_direction.at(1) * global_vecs.at(iParameter).at(1)
370 + phi_direction.at(2) * global_vecs.at(iParameter).at(2);
371 normalisation_factor = r * n * norm_phi_direction;
373 case SystematicDeformations::kZexpansion :
374 case SystematicDeformations::kTelescope:
375 case SystematicDeformations::kSkew:
376 dot_product = global_vecs.at(iParameter).at(0) * z_direction.at(0)
377 + global_vecs.at(iParameter).at(1) * z_direction.at(1)
378 + global_vecs.at(iParameter).at(2) * z_direction.at(2);
379 normalisation_factor = ( n * norm_z_direction);
381 case SystematicDeformations::kRadial:
382 case SystematicDeformations::kBowing:
383 case SystematicDeformations::kElliptical:
384 dot_product = global_vecs.at(iParameter).at(0) * rDirection.at(0)
385 + global_vecs.at(iParameter).at(1) * rDirection.at(1)
386 + global_vecs.at(iParameter).at(2) * rDirection.at(2);
387 normalisation_factor = ( n * norm_rDirection);
389 case SystematicDeformations::kSagitta:
390 dot_product = global_vecs.at(iParameter).at(0) * radial_direction.at(0)
391 + global_vecs.at(iParameter).at(1) * radial_direction.at(1)
392 + global_vecs.at(iParameter).at(2) * radial_direction.at(2);
393 normalisation_factor = ( n * norm_radial_direction);
399 coeff = dot_product * ( this->
getX(sysdeformation,pos,phase) - x0 ) / normalisation_factor;
402 <<
"[PedeSteererWeakModeConstraints::getCoefficient]" <<
" Normalisation factor"
403 <<
"for coefficient calculation equal to zero! Misconfiguration?";
411 unsigned int iParameter)
const
413 bool isselected =
false;
417 || (iParameter >= 9 && iParameter <=11)) {
418 if(!aliSel.at(iParameter)) {
424 if(selVar->fullSelection().size() <= (iParameter+1)) {
426 <<
"[PedeSteererWeakModeConstraints::checkSelectionShiftParameter]"
427 <<
" Can not access selected alignment variables of alignable "
430 <<
"for parameter number " << (iParameter+1) <<
".";
433 const char selChar = (selVar ? selVar->fullSelection().at(iParameter) :
'1');
435 if(selChar ==
'1' || selChar ==
'r') {
451 for(
auto& iFile:it.mapFileName_) {
454 iFile.second =
nullptr;
457 <<
"[PedeSteererWeakModeConstraints]" <<
" can not close file " << iFile.first <<
".";
472 if(ofile ==
nullptr) {
474 <<
"[PedeSteererWeakModeConstraints] Cannot find output file.";
478 (*ofile) <<
"Constraint " << std::scientific << constr << std::endl;
479 for(
const auto& ioutput:
output) {
480 (*ofile) << std::fixed << ioutput.first <<
" " << std::scientific << ioutput.second << std::endl;
491 std::ofstream*
file =
nullptr;
494 if(ilevelsFilename.first->id() == iHLS->
id() &&
497 const auto iFile = it.
mapFileName_.find(ilevelsFilename.second);
499 file = iFile->second;
512 double nmodules = 0.0;
515 for(
const auto& ali: iHLS.second) {
517 bool alignableIsFloating =
false;
520 for(
unsigned int iParameter = 0;
521 static_cast<int>(iParameter) < ali->alignmentParameters()->size(); iParameter++) {
523 alignableIsFloating =
true;
539 if(alignableIsFloating) {
556 <<
"@SUB=PedeSteererWeakModeConstraints::ConstructConstraints"
557 <<
" Number of selected modules equal to zero. Check configuration!";
574 std::vector<std::list<std::pair<unsigned int,double> > > createdConstraints;
581 for(
const auto& iHLS : it.HLSsubdets_) {
582 double sum_xi_x0 = 0.0;
583 std::list<std::pair<unsigned int,double> >
output;
585 const double x0 = this->
getX0(iHLS, it);
587 for(std::list<Alignable*>::const_iterator iAlignables = iHLS.second.begin();
588 iAlignables != iHLS.second.end(); iAlignables++) {
594 lVDirection(0.,1.,0.),
595 lWDirection(0.,0.,1.);
598 gVDirection = surface.
toGlobal(lVDirection),
599 gWDirection = surface.
toGlobal(lWDirection);
603 const auto sensorpositions =
606 const auto& pos_sensor0 = sensorpositions.first;
607 const auto& pos_sensor1 = sensorpositions.second;
608 const auto phase = this->
getPhase(it.coefficients_);
609 const auto x_sensor0 = this->
getX(it.sysdeformation_,pos_sensor0,phase);
610 const auto x_sensor1 = isDoubleSensor ? this->
getX(it.sysdeformation_,pos_sensor1,phase) : 0.0;
612 sum_xi_x0 += ( x_sensor0 - x0 ) * ( x_sensor0 - x0 );
614 sum_xi_x0 += ( x_sensor1 - x0 ) * ( x_sensor1 - x0 );
618 for(
int iParameter = 0; iParameter < numparameterlimit; iParameter++) {
620 if(iParameter == 0 || iParameter == 9)
622 if(iParameter == 1 || iParameter == 10)
624 if(iParameter == 2 || iParameter == 11)
627 if((iParameter >= 0 && iParameter <= 2)
628 || (iParameter >= 9 && iParameter <=11)) {
638 const auto& pos = (iParameter <= 2) ? pos_sensor0 : pos_sensor1;
640 if(iParameter == 0 || iParameter == 1 || iParameter == 2
641 || iParameter == 9 || iParameter == 10 || iParameter == 11) {
654 <<
"@SUB=PedeSteererWeakModeConstraints::getCoefficient"
655 <<
"Coefficient of alignable "
659 <<
" for parameter " << localindex <<
" equal to zero. This alignable is used in the constraint"
660 <<
" '" << it.constraintName_ <<
"'. The id is: alignable->geomDetId().rawId() = "
663 output.push_back(std::make_pair (paramLabel, coeff));
670 if (
std::find(createdConstraints.begin(), createdConstraints.end(),
output)
671 != createdConstraints.end()) {
676 <<
"[PedeSteererWeakModeConstraints] Cannot find output file.";
678 *
outFile <<
"! The constraint for this IOV/momentum range" << std::endl
679 <<
"! has been removed because the used parameters" << std::endl
680 <<
"! are not IOV or momentum-range dependent." << std::endl;
684 this->
writeOutput(output, it, iHLS.first, sum_xi_x0);
685 createdConstraints.push_back(output);
701 if(lowleveldet->
mother() ==
nullptr)
711 unsigned int psetnr)
const
714 for (
const auto&
name: parameterNames) {
715 if(
name !=
"coefficients"
716 &&
name !=
"deadmodules" &&
name !=
"constraint"
717 &&
name !=
"steerFilePrefix" &&
name !=
"levels"
718 &&
name !=
"excludedAlignables" &&
name !=
"ignoredInstances"
719 &&
name !=
"downToLowestLevel"
722 <<
"@SUB=PedeSteererWeakModeConstraints::verifyParameterNames:"
723 <<
" Unknown parameter name '" <<
name <<
"' in PSet number " << psetnr <<
". Maybe a typo?";
729 const std::vector<std::pair<Alignable*, std::string> >
731 const std::vector<Alignable*> &alis,
735 if(steerFilePrefixContainer.find(steerFilePrefix) != steerFilePrefixContainer.end()) {
736 throw cms::Exception(
"BadConfig") <<
"[PedeSteererWeakModeConstraints] Steering file"
737 <<
" prefix '" << steerFilePrefix <<
"' already exists. Specify unique names!";
739 steerFilePrefixContainer.insert(steerFilePrefix);
742 std::vector<std::pair<Alignable*, std::string> > levelsFilenames;
743 for(
const auto& ali: alis) {
747 <<
"_" << ali->id() <<
"_" << ali->alignableObjectId() <<
".txt";
749 levelsFilenames.push_back(std::make_pair(ali, n.str()));
751 return levelsFilenames;
757 const std::vector<double> &coefficients)
const
761 if(name ==
"twist") {
762 sysdeformation = SystematicDeformations::kTwist;
763 }
else if(name ==
"zexpansion") {
764 sysdeformation = SystematicDeformations::kZexpansion;
765 }
else if(name ==
"sagitta") {
766 sysdeformation = SystematicDeformations::kSagitta;
767 }
else if(name ==
"radial") {
768 sysdeformation = SystematicDeformations::kRadial;
769 }
else if(name ==
"telescope") {
770 sysdeformation = SystematicDeformations::kTelescope;
771 }
else if(name ==
"layerrotation") {
772 sysdeformation = SystematicDeformations::kLayerRotation;
773 }
else if(name ==
"bowing") {
774 sysdeformation = SystematicDeformations::kBowing;
775 }
else if(name ==
"skew") {
776 sysdeformation = SystematicDeformations::kSkew;
777 }
else if(name ==
"elliptical") {
778 sysdeformation = SystematicDeformations::kElliptical;
783 <<
"[PedeSteererWeakModeConstraints]" <<
" specified configuration option '"
784 << name <<
"' not known.";
786 if((sysdeformation == SystematicDeformations::kSagitta
787 || sysdeformation == SystematicDeformations::kElliptical
788 || sysdeformation == SystematicDeformations::kSkew) && coefficients.size() != 2) {
790 <<
"[PedeSteererWeakModeConstraints]" <<
" Excactly two parameters using the coefficient"
791 <<
" variable have to be provided for the " << name <<
" constraint.";
793 if((sysdeformation == SystematicDeformations::kTwist
794 || sysdeformation == SystematicDeformations::kZexpansion
795 || sysdeformation == SystematicDeformations::kTelescope
796 || sysdeformation == SystematicDeformations::kLayerRotation
797 || sysdeformation == SystematicDeformations::kRadial
798 || sysdeformation == SystematicDeformations::kBowing) && coefficients.size() != 1) {
800 <<
"[PedeSteererWeakModeConstraints]" <<
" Excactly ONE parameter using the coefficient"
801 <<
" variable have to be provided for the " << name <<
" constraint.";
804 if(coefficients.size() == 0) {
806 <<
"[PedeSteererWeakModeConstraints]" <<
" At least one coefficient has to be specified.";
808 return sysdeformation;
816 return coefficients.size() == 2 ? coefficients.at(1) : 0.0;
align::ID id() const
Return the ID of Alignable, i.e. DetId of 'first' component GeomDet(Unit).
bool checkSelectionShiftParameter(const Alignable *ali, unsigned int iParameter) const
void verifyParameterNames(const edm::ParameterSet &pset, unsigned int psetnr) const
static PFTauRenderPlugin instance
std::list< align::ID > deadmodules_
Geom::Phi< T > phi() const
std::pair< align::GlobalPoint, align::GlobalPoint > getDoubleSensorPosition(const Alignable *ali) const
double getX(const int sysdeformation, const align::GlobalPoint &pos, const double phase) const
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
std::map< std::string, std::ofstream * > mapFileName_
void writeOutput(const std::list< std::pair< unsigned int, double > > &output, const GeometryConstraintConfigData &it, const Alignable *iHLS, double sum_xi_x0)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
unsigned int constructConstraints(const std::vector< Alignable * > &alis)
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
virtual unsigned int parameterLabel(unsigned int aliLabel, unsigned int parNum) const =0
returns the label for a given alignable parameter number combination
uint32_t rawId() const
get the raw id
Point3DBase< Scalar, GlobalTag > PositionType
const std::string steerFile_
void clear()
remove all selected Alignables and geometrical restrictions
~PedeSteererWeakModeConstraints()
const std::vector< std::pair< Alignable *, std::string > > levelsFilenames_
const std::vector< std::pair< Alignable *, std::string > > makeLevelsFilenames(std::set< std::string > &steerFilePrefixContainer, const std::vector< Alignable * > &alis, const std::string &steerFilePrefix) const
std::ofstream * getFile(const GeometryConstraintConfigData &it, const Alignable *iHLS) const
double getX0(const std::pair< Alignable *, std::list< Alignable * > > &iHLS, const GeometryConstraintConfigData &it) const
int verifyDeformationName(const std::string &name, const std::vector< double > &coefficients) const
GeometryConstraintConfigData(const std::vector< double > &co, const std::string &c, const std::vector< std::pair< Alignable *, std::string > > &alisFile, const int sd, const std::vector< Alignable * > &ex, const int instance, const bool downToLowestLevel)
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
const std::vector< double > coefficients_
std::vector< std::string > getParameterNames() const
PedeSteererWeakModeConstraints(AlignableTracker *aliTracker, const PedeLabelerBase *labels, const std::vector< edm::ParameterSet > &config, std::string sf)
const std::vector< edm::ParameterSet > myConfig_
virtual unsigned int alignableLabelFromParamAndInstance(Alignable *alignable, unsigned int param, unsigned int instance) const =0
const int sysdeformation_
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
const align::Alignables & selectedAlignables() const
vector of alignables selected so far
virtual int type() const =0
tell type (AlignmentParametersFactory::ParametersType - but no circular dependency) ...
align::Scalar length() const
int size(void) const
Get number of parameters.
double getPhase(const std::vector< double > &coefficients) const
unsigned int createAlignablesDataStructure()
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
unsigned int addSelections(const edm::ParameterSet &pSet)
double getCoefficient(const int sysdeformation, const align::GlobalPoint &pos, const GlobalPoint gUDirection, const GlobalPoint gVDirection, const GlobalPoint gWDirection, const int iParameter, const double &x0, const std::vector< double > &constraintparameters) const
const PositionType & globalPosition() const
Return the global position of the object.
bool checkMother(const Alignable *const lowleveldet, const Alignable *const HLS) const
static const char * idToString(align::StructureType type)
const PedeLabelerBase * myLabels_
Alignable * mother() const
Return pointer to container alignable (if any)
const DetId & geomDetId() const
virtual unsigned int maxNumberOfParameterInstances() const =0
returns the maximum number of instances for any parameter of an Alignable*
std::list< GeometryConstraintConfigData > ConstraintsConfigContainer_
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run