CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
MuonScenarioBuilder Class Reference

Builds a scenario from configuration and applies it to the alignable Muon. More...

#include <MuonScenarioBuilder.h>

Inheritance diagram for MuonScenarioBuilder:
MisalignmentScenarioBuilder

Public Member Functions

void applyScenario (const edm::ParameterSet &scenario)
 Apply misalignment scenario to the Muon. More...
 
align::Scalars extractParameters (const edm::ParameterSet &, const char *)
 
void moveChamberInSector (Alignable *, const align::Scalars &, const align::Scalars &, const align::Scalars &, const align::Scalars &)
 
void moveCSCSectors (const edm::ParameterSet &scenario)
 this special method allows to move a CSCsector by a same amount More...
 
void moveDTSectors (const edm::ParameterSet &scenario)
 This special method allows to move a DTsector by a same amount. More...
 
void moveMuon (const edm::ParameterSet &scenario)
 this special method allows to move the complete muon system by a same amount More...
 
 MuonScenarioBuilder (Alignable *alignable)
 Constructor. More...
 
 ~MuonScenarioBuilder ()
 Destructor. More...
 
- Public Member Functions inherited from MisalignmentScenarioBuilder
 MisalignmentScenarioBuilder ()
 Default constructor. More...
 
virtual ~MisalignmentScenarioBuilder ()
 Destructor. More...
 

Private Attributes

AlignableMuontheAlignableMuon
 Pointer to alignable Muon object. More...
 
AlignableModifier theMuonModifier
 

Additional Inherited Members

- Protected Member Functions inherited from MisalignmentScenarioBuilder
void applyMovements_ (Alignable *alignable, const edm::ParameterSet &pSet)
 Apply movements given by parameter set to given alignable. More...
 
void decodeMovements_ (const edm::ParameterSet &pSet, const std::vector< Alignable * > &alignables)
 Decode movements defined in given parameter set for given set of alignables. More...
 
void decodeMovements_ (const edm::ParameterSet &pSet, const std::vector< Alignable * > &alignables, const std::string &levelName)
 Decode movements defined in given parameter set for given set of alignables tagged by given name. More...
 
edm::ParameterSet getParameterSet_ (const std::string &name, const edm::ParameterSet &pSet) const
 
edm::ParameterSet getParameterSet_ (const std::string &levelName, int iComponent, const edm::ParameterSet &pSet) const
 
bool hasParameter_ (const std::string &name, const edm::ParameterSet &pSet) const
 Check if given parameter exists in parameter set. More...
 
virtual bool isTopLevel_ (const std::string &parameterSetName) const
 Check if given parameter is for a top-level structure. More...
 
void mergeParameters_ (edm::ParameterSet &localSet, const edm::ParameterSet &globalSet) const
 Merge two sets of parameters into one (the first argument) More...
 
virtual bool possiblyPartOf (const std::string &subStruct, const std::string &largeStruct) const
 
void printParameters_ (const edm::ParameterSet &pSet, const bool showPsets=false) const
 Print all parameters and values for given set. More...
 
void propagateParameters_ (const edm::ParameterSet &pSet, const std::string &globalName, edm::ParameterSet &subSet) const
 Propagate global parameters to sub-parameters. More...
 
const std::string rootName_ (const std::string &parameterSetName) const
 Get root name of a parameter set (e.g. 'Rod' in 'Rods' or 'Rod1') More...
 
- Protected Attributes inherited from MisalignmentScenarioBuilder
std::string indent_
 Depth in hierarchy. More...
 
AlignableModifier theModifier
 Helper class for random movements. More...
 
int theModifierCounter
 Counter for applied modification. More...
 
edm::ParameterSet theScenario
 Misalignment scenario to apply (from config file) More...
 

Detailed Description

Builds a scenario from configuration and applies it to the alignable Muon.

The misalignment scenario builder.

Date:
2009/09/15 17:09:58
Revision:
1.5
Author
Andre Sznajder - UERJ(Brazil)

Definition at line 21 of file MuonScenarioBuilder.h.

Constructor & Destructor Documentation

MuonScenarioBuilder::MuonScenarioBuilder ( Alignable alignable)
explicit

Constructor.

Definition at line 25 of file MuonScenarioBuilder.cc.

References Exception, and theAlignableMuon.

26 {
27 
28  theAlignableMuon = dynamic_cast<AlignableMuon*>( alignable );
29 
30  if ( !theAlignableMuon )
31  throw cms::Exception("TypeMismatch") << "Argument is not an AlignableMuon";
32 
33 }
AlignableMuon * theAlignableMuon
Pointer to alignable Muon object.
Constructor of the full muon geometry.
Definition: AlignableMuon.h:36
MuonScenarioBuilder::~MuonScenarioBuilder ( )
inline

Destructor.

Definition at line 30 of file MuonScenarioBuilder.h.

30 {};

Member Function Documentation

void MuonScenarioBuilder::applyScenario ( const edm::ParameterSet scenario)
virtual

Apply misalignment scenario to the Muon.

Implements MisalignmentScenarioBuilder.

Definition at line 37 of file MuonScenarioBuilder.cc.

References AlignableMuon::CSCEndcaps(), MisalignmentScenarioBuilder::decodeMovements_(), AlignableMuon::DTBarrel(), Exception, edm::ParameterSet::getParameter(), MisalignmentScenarioBuilder::hasParameter_(), moveCSCSectors(), moveDTSectors(), moveMuon(), visualization-live-secondInstance_cfg::scenario, AlignableModifier::setSeed(), theAlignableMuon, MisalignmentScenarioBuilder::theModifier, MisalignmentScenarioBuilder::theModifierCounter, and MisalignmentScenarioBuilder::theScenario.

Referenced by MuonGeometryDBConverter::analyze(), PCLTrackerAlProducer::applyMisalignment(), AlignmentProducer::beginOfJob(), and MisalignedMuonESProducer::produce().

38 {
39  // Apply the scenario to all main components of Muon.
42 
43  // Seed is set at top-level, and is mandatory
44  if ( this->hasParameter_( "seed", theScenario ) )
45  theModifier.setSeed( static_cast<long>(theScenario.getParameter<int>("seed")) );
46  else
47  throw cms::Exception("BadConfig") << "No generator seed defined!";
48 
49 
50 
51  // DT Barrel
52  std::vector<Alignable*> dtBarrel = theAlignableMuon->DTBarrel();
53  this->decodeMovements_( theScenario, dtBarrel, "DTBarrel" );
54  // CSC Endcap
55  std::vector<Alignable*> cscEndcaps = theAlignableMuon->CSCEndcaps();
56  this->decodeMovements_( theScenario, cscEndcaps, "CSCEndcap" );
57 
60  this->moveMuon(theScenario);
61 
62  edm::LogInfo("TrackerScenarioBuilder")
63  << "Applied modifications to " << theModifierCounter << " alignables";
64 }
T getParameter(std::string const &) const
edm::ParameterSet theScenario
Misalignment scenario to apply (from config file)
void setSeed(long seed)
Resets the generator seed according to the argument.
void moveCSCSectors(const edm::ParameterSet &scenario)
this special method allows to move a CSCsector by a same amount
AlignableMuon * theAlignableMuon
Pointer to alignable Muon object.
align::Alignables DTBarrel()
void moveMuon(const edm::ParameterSet &scenario)
this special method allows to move the complete muon system by a same amount
align::Alignables CSCEndcaps()
void decodeMovements_(const edm::ParameterSet &pSet, const std::vector< Alignable * > &alignables)
Decode movements defined in given parameter set for given set of alignables.
void moveDTSectors(const edm::ParameterSet &scenario)
This special method allows to move a DTsector by a same amount.
AlignableModifier theModifier
Helper class for random movements.
int theModifierCounter
Counter for applied modification.
bool hasParameter_(const std::string &name, const edm::ParameterSet &pSet) const
Check if given parameter exists in parameter set.
align::Scalars MuonScenarioBuilder::extractParameters ( const edm::ParameterSet pSet,
const char *  blockId 
)

Definition at line 68 of file MuonScenarioBuilder.cc.

References relativeConstraints::error, edm::ParameterSet::getParameter(), edm::ParameterSet::getParameterNames(), MisalignmentScenarioBuilder::getParameterSet_(), edm::ParameterSet::retrieve(), AlCaHLTBitMon_QueryRunRegistry::string, and edm::Entry::typeCode().

Referenced by moveCSCSectors(), moveDTSectors(), and moveMuon().

69 {
70  double scale_ = 0, scaleError_ = 0, phiX_ = 0, phiY_ = 0, phiZ_ = 0;
71  double dX_ = 0, dY_ = 0, dZ_ = 0;
72  std::string distribution_;
73  std::ostringstream error;
75  std::vector<std::string> parameterNames = Parameters.getParameterNames();
76  for ( std::vector<std::string>::iterator iParam = parameterNames.begin(); iParam != parameterNames.end(); iParam++ ) {
77  if ( (*iParam) == "scale" ) scale_ = Parameters.getParameter<double>( *iParam );
78  else if ( (*iParam) == "distribution" ) distribution_ = Parameters.getParameter<std::string>( *iParam );
79  else if ( (*iParam) == "scaleError" ) scaleError_ = Parameters.getParameter<double>( *iParam );
80  else if ( (*iParam) == "phiX" ) phiX_ = Parameters.getParameter<double>( *iParam );
81  else if ( (*iParam) == "phiY" ) phiY_ = Parameters.getParameter<double>( *iParam );
82  else if ( (*iParam) == "phiZ" ) phiZ_ = Parameters.getParameter<double>( *iParam );
83  else if ( (*iParam) == "dX" ) dX_ = Parameters.getParameter<double>( *iParam );
84  else if ( (*iParam) == "dY" ) dY_ = Parameters.getParameter<double>( *iParam );
85  else if ( (*iParam) == "dZ" ) dZ_ = Parameters.getParameter<double>( *iParam );
86  else if ( Parameters.retrieve( *iParam ).typeCode() != 'P' )
87  { // Add unknown parameter to list
88  if ( !error.str().length() ) error << "Unknown parameter name(s): ";
89  error << " " << *iParam;
90  }
91  }
92  align::Scalars param;
93  param.push_back(scale_); param.push_back(scaleError_);
94  param.push_back(phiX_); param.push_back(phiY_);
95  param.push_back(phiZ_); param.push_back(dX_);
96  param.push_back(dY_); param.push_back(dZ_);
97  if( distribution_ == "gaussian" )
98  param.push_back(0);
99  else if ( distribution_ == "flat" )
100  param.push_back(1);
101  else if ( distribution_ == "fix" )
102  param.push_back(2);
103 
104  return param;
105 }
T getParameter(std::string const &) const
Entry const & retrieve(char const *) const
vector< ParameterSet > Parameters
std::vector< Scalar > Scalars
Definition: Utilities.h:22
std::vector< std::string > getParameterNames() const
char typeCode() const
Definition: Entry.h:175
edm::ParameterSet getParameterSet_(const std::string &name, const edm::ParameterSet &pSet) const
void MuonScenarioBuilder::moveChamberInSector ( Alignable chamber,
const align::Scalars _disp,
const align::Scalars rotation,
const align::Scalars dispError,
const align::Scalars rotationError 
)

Definition at line 301 of file MuonScenarioBuilder.cc.

References AlignableModifier::addAlignmentPositionError(), AlignableModifier::addAlignmentPositionErrorFromRotation(), PV3DBase< T, PVType, FrameType >::basicVector(), Alignable::globalPosition(), AlignableModifier::moveAlignable(), makeMuonMisalignmentScenario::rot, AlignableModifier::rotateAlignable(), theMuonModifier, and PV3DBase< T, PVType, FrameType >::x().

Referenced by moveCSCSectors(), and moveDTSectors().

302 {
303  align::Scalars disp = _disp;
304  align::RotationType rotx( Basic3DVector<double>(1.0, 0.0, 0.0), rotation[0] );
305  align::RotationType roty( Basic3DVector<double>(0.0, 1.0, 0.0), rotation[1] );
306  align::RotationType rotz( Basic3DVector<double>(0.0, 0.0, 1.0), rotation[2] );
307  align::RotationType rot = rotz * roty * rotx;
308  align::GlobalPoint pos = chamber->globalPosition();
309  align::GlobalPoint dispRot(pos.basicVector()-rot*pos.basicVector());
310  disp[0] += dispRot.x(); disp[1] += dispRot.y(); disp[2] += dispRot.z();
311  theMuonModifier.moveAlignable( chamber, false, true, disp[0], disp[1], disp[2] );
312  theMuonModifier.rotateAlignable( chamber, false, true, rotation[0], rotation[1], rotation[2] );
313  theMuonModifier.addAlignmentPositionError( chamber, dispError[0], dispError[1], dispError[2] );
314  theMuonModifier.addAlignmentPositionErrorFromRotation( chamber, rotationError[0], rotationError[1], rotationError[2] );
315 }
AlignableModifier theMuonModifier
void addAlignmentPositionError(Alignable *alignable, float dx, float dy, float dz)
Add the AlignmentPositionError (in global frame) to Alignable.
void moveAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaX, float sigmaY, float sigmaZ)
Move alignable in global space according to parameters.
std::vector< Scalar > Scalars
Definition: Utilities.h:22
void rotateAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaPhiX, float sigmaPhiY, float sigmaPhiZ)
Rotate alignable in global space according to parameters.
void addAlignmentPositionErrorFromRotation(Alignable *alignable, float phiX, float phiY, float phiZ)
Add alignment position error resulting from rotation in global frame.
const PositionType & globalPosition() const
Return the global position of the object.
Definition: Alignable.h:134
T x() const
Definition: PV3DBase.h:62
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56
void MuonScenarioBuilder::moveCSCSectors ( const edm::ParameterSet scenario)

this special method allows to move a CSCsector by a same amount

Definition at line 170 of file MuonScenarioBuilder.cc.

References counter, AlignableMuon::CSCChambers(), Reference_intrackfit_cff::endcap, extractParameters(), AlignableModifier::flatRandomVector(), AlignableModifier::gaussianRandomVector(), cmsHarvester::index, moveChamberInSector(), relativeConstraints::ring, idealTransformation::rotation, CSCTriggerNumbering::sectorFromTriggerLabels(), relativeConstraints::station, theAlignableMuon, theMuonModifier, CSCTriggerNumbering::triggerSectorFromLabels(), and CSCTriggerNumbering::triggerSubSectorFromLabels().

Referenced by applyScenario().

171 {
172  std::vector<Alignable *> CSCchambers = theAlignableMuon->CSCChambers();
173  //Take Parameters
174  align::Scalars param = this->extractParameters(pSet, "CSCSectors");
175  double scale_ = param[0]; double scaleError_ = param[1];
176  double phiX_ = param[2]; double phiY_ = param[3]; double phiZ_ = param[4];
177  double dX_ = param[5]; double dY_ = param[6]; double dZ_ = param[7];
178  double dist_ = param[8];
179 
180  double dx = scale_*dX_; double dy = scale_*dY_; double dz = scale_*dZ_;
181  double phix = scale_*phiX_; double phiy = scale_*phiY_; double phiz = scale_*phiZ_;
182  double errorx = scaleError_*dX_; double errory = scaleError_*dY_; double errorz = scaleError_*dZ_;
183  double errorphix = scaleError_*phiX_; double errorphiy = scaleError_*phiY_; double errorphiz = scaleError_*phiZ_;
184  align::Scalars errorDisp;
185  errorDisp.push_back(errorx); errorDisp.push_back(errory); errorDisp.push_back(errorz);
186  align::Scalars errorRotation;
187  errorRotation.push_back(errorphix); errorRotation.push_back(errorphiy); errorRotation.push_back(errorphiz);
188 
189  int index[2][4][4][36];
190  int sector_index[2][4][4][36];
191  int counter = 0;
192  //Create an index for the chambers in the alignable vector
193  for(std::vector<Alignable *>::iterator iter = CSCchambers.begin(); iter != CSCchambers.end(); ++iter) {
194  CSCDetId myId((*iter)->geomDetId().rawId());
195  index[myId.endcap()-1][myId.station()-1][myId.ring()-1][myId.chamber()-1] = counter;
196  sector_index[myId.endcap()-1][myId.station()-1][myId.ring()-1][myId.chamber()-1] = CSCTriggerNumbering::sectorFromTriggerLabels(CSCTriggerNumbering::triggerSectorFromLabels(myId),CSCTriggerNumbering::triggerSubSectorFromLabels(myId) , myId.station());
197  counter++;
198  }
199  for(int endcap = 0; endcap < 2; endcap++) {
200  for(int ring = 0; ring < 2; ring++) {
201  for(int sector = 1; sector < 7; sector++) {
202  align::Scalars disp;
204  if( dist_ == 0 ) {
205  const std::vector<float> disp_ = theMuonModifier.gaussianRandomVector(dx, dy, dz);
206  const std::vector<float> rotation_ = theMuonModifier.gaussianRandomVector(phix, phiy, phiz);
207  disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
208  rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
209  } else if (dist_ == 1) {
210  const std::vector<float> disp_ = theMuonModifier.flatRandomVector(dx, dy, dz);
211  const std::vector<float> rotation_ = theMuonModifier.flatRandomVector(phix, phiy, phiz);
212  disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
213  rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
214  } else {
215  disp.push_back(dx); disp.push_back(dy); disp.push_back(dz);
216  rotation.push_back(phix); rotation.push_back(phiy); rotation.push_back(phiz);
217  }
218  //Different cases are considered in order to fit endcap geometry
219  for(int station = 0; station < 4; station++) {
220  if(station == 0) {
221  int r_ring[2];
222  if(ring == 0) {
223  r_ring[0] = 0; r_ring[1] = 3;
224  } else {
225  r_ring[0] = 1; r_ring[1] = 2;
226  }
227  for(int r_counter = 0; r_counter < 2; r_counter++) {
228  for(int chamber = 0; chamber < 36; chamber++) {
229  if(sector == (sector_index[endcap][station][r_ring[r_counter]][chamber]+1)/2) {
230  Alignable *myAlign = CSCchambers.at(index[endcap][station][r_ring[r_counter]][chamber]);
231  this->moveChamberInSector(myAlign, disp, rotation, errorDisp, errorRotation);
232  }
233  }
234  }
235  } else if(station == 3 && ring == 1) {
236  continue;
237  } else {
238  for(int chamber = 0; chamber < 36; chamber++) {
239  if(ring == 0 && chamber > 17) continue;
240  if(sector == sector_index[endcap][station][ring][chamber]) {
241  Alignable *myAlign = CSCchambers.at(index[endcap][station][ring][chamber]);
242  this->moveChamberInSector(myAlign, disp, rotation, errorDisp, errorRotation);
243  }
244  }
245  }
246  }
247  }
248  }
249  }
250 }
AlignableModifier theMuonModifier
align::Alignables CSCChambers()
AlignableMuon * theAlignableMuon
Pointer to alignable Muon object.
const std::vector< float > gaussianRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (gaussian distribution)
void moveChamberInSector(Alignable *, const align::Scalars &, const align::Scalars &, const align::Scalars &, const align::Scalars &)
align::Scalars extractParameters(const edm::ParameterSet &, const char *)
static int sectorFromTriggerLabels(int TriggerSector, int TriggerSubSector, int station)
std::vector< Scalar > Scalars
Definition: Utilities.h:22
const std::vector< float > flatRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (flat distribution)
static int triggerSectorFromLabels(int station, int ring, int chamber)
static int triggerSubSectorFromLabels(int station, int chamber)
static std::atomic< unsigned int > counter
void MuonScenarioBuilder::moveDTSectors ( const edm::ParameterSet scenario)

This special method allows to move a DTsector by a same amount.

Definition at line 108 of file MuonScenarioBuilder.cc.

References counter, AlignableMuon::DTChambers(), extractParameters(), AlignableModifier::flatRandomVector(), AlignableModifier::gaussianRandomVector(), cmsHarvester::index, moveChamberInSector(), idealTransformation::rotation, relativeConstraints::station, theAlignableMuon, and theMuonModifier.

Referenced by applyScenario().

109 {
110  std::vector<Alignable *> DTchambers = theAlignableMuon->DTChambers();
111  //Take parameters
112  align::Scalars param = this->extractParameters(pSet, "DTSectors");
113  double scale_ = param[0]; double scaleError_ = param[1];
114  double phiX_ = param[2]; double phiY_ = param[3]; double phiZ_ = param[4];
115  double dX_ = param[5]; double dY_ = param[6]; double dZ_ = param[7];
116  double dist_ = param[8];
117 
118  double dx = scale_*dX_; double dy = scale_*dY_; double dz = scale_*dZ_;
119  double phix = scale_*phiX_; double phiy = scale_*phiY_; double phiz = scale_*phiZ_;
120  double errorx = scaleError_*dX_; double errory = scaleError_*dY_; double errorz = scaleError_*dZ_;
121  double errorphix = scaleError_*phiX_; double errorphiy = scaleError_*phiY_; double errorphiz = scaleError_*phiZ_;
122  align::Scalars errorDisp;
123  errorDisp.push_back(errorx); errorDisp.push_back(errory); errorDisp.push_back(errorz);
124  align::Scalars errorRotation;
125  errorRotation.push_back(errorphix); errorRotation.push_back(errorphiy); errorRotation.push_back(errorphiz);
126 
127  int index[5][4][14];
128  int counter = 0;
129  //Create and index for the chambers in the Alignable vector
130  for(std::vector<Alignable *>::iterator iter = DTchambers.begin(); iter != DTchambers.end(); ++iter) {
131  DTChamberId myId((*iter)->geomDetId().rawId());
132  index[myId.wheel()+2][myId.station()-1][myId.sector()-1] = counter;
133  counter++;
134  }
135  for(int wheel = 0; wheel < 5; wheel++) {
136  for(int sector = 0; sector < 12; sector++) {
137  align::Scalars disp;
139  if( dist_ == 0 ) {
140  const std::vector<float> disp_ = theMuonModifier.gaussianRandomVector(dx, dy, dz);
141  const std::vector<float> rotation_ = theMuonModifier.gaussianRandomVector(phix, phiy, phiz);
142  disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
143  rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
144  } else if (dist_ == 1) {
145  const std::vector<float> disp_ = theMuonModifier.flatRandomVector(dx, dy, dz);
146  const std::vector<float> rotation_ = theMuonModifier.flatRandomVector(phix, phiy, phiz);
147  disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
148  rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
149  } else {
150  disp.push_back(dx); disp.push_back(dy); disp.push_back(dz);
151  rotation.push_back(phix); rotation.push_back(phiy); rotation.push_back(phiz);
152  }
153  for(int station = 0; station < 4; station++) {
154  Alignable *myAlign = DTchambers.at(index[wheel][station][sector]);
155  this->moveChamberInSector(myAlign, disp, rotation, errorDisp, errorRotation);
156  if(sector == 3 && station == 3) {
157  Alignable *myAlignD = DTchambers.at(index[wheel][station][12]);
158  this->moveChamberInSector(myAlignD, disp, rotation, errorDisp, errorRotation);
159  } else if(sector == 9 && station == 3) {
160  Alignable *myAlignD = DTchambers.at(index[wheel][station][13]);
161  this->moveChamberInSector(myAlignD, disp, rotation, errorDisp, errorRotation);
162  }
163  }
164  }
165  }
166 }
AlignableModifier theMuonModifier
AlignableMuon * theAlignableMuon
Pointer to alignable Muon object.
const std::vector< float > gaussianRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (gaussian distribution)
void moveChamberInSector(Alignable *, const align::Scalars &, const align::Scalars &, const align::Scalars &, const align::Scalars &)
align::Scalars extractParameters(const edm::ParameterSet &, const char *)
align::Alignables DTChambers()
std::vector< Scalar > Scalars
Definition: Utilities.h:22
const std::vector< float > flatRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (flat distribution)
static std::atomic< unsigned int > counter
void MuonScenarioBuilder::moveMuon ( const edm::ParameterSet scenario)

this special method allows to move the complete muon system by a same amount

Definition at line 254 of file MuonScenarioBuilder.cc.

References AlignableModifier::addAlignmentPositionError(), AlignableModifier::addAlignmentPositionErrorFromRotation(), AlignableMuon::CSCEndcaps(), AlignableMuon::DTBarrel(), extractParameters(), AlignableModifier::flatRandomVector(), AlignableModifier::gaussianRandomVector(), AlignableModifier::moveAlignable(), AlignableModifier::rotateAlignable(), idealTransformation::rotation, theAlignableMuon, and theMuonModifier.

Referenced by applyScenario().

255 {
256  std::vector<Alignable *> DTbarrel = theAlignableMuon->DTBarrel();
257  std::vector<Alignable *> CSCendcaps = theAlignableMuon->CSCEndcaps();
258  //Take Parameters
259  align::Scalars param = this->extractParameters(pSet, "Muon");
260  double scale_ = param[0]; double scaleError_ = param[1];
261  double phiX_ = param[2]; double phiY_ = param[3]; double phiZ_ = param[4];
262  double dX_ = param[5]; double dY_ = param[6]; double dZ_ = param[7];
263  double dist_ = param[8];
264  double dx = scale_*dX_; double dy = scale_*dY_; double dz = scale_*dZ_;
265  double phix = scale_*phiX_; double phiy = scale_*phiY_; double phiz = scale_*phiZ_;
266  double errorx = scaleError_*dX_; double errory = scaleError_*dY_; double errorz = scaleError_*dZ_;
267  double errorphix = scaleError_*phiX_; double errorphiy = scaleError_*phiY_; double errorphiz = scaleError_*phiZ_;
268  //Create an index for the chambers in the alignable vector
269  align::Scalars disp;
271  if( dist_ == 0 ) {
272  const std::vector<float> disp_ = theMuonModifier.gaussianRandomVector(dx, dy, dz);
273  const std::vector<float> rotation_ = theMuonModifier.gaussianRandomVector(phix, phiy, phiz);
274  disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
275  rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
276  } else if (dist_ == 1) {
277  const std::vector<float> disp_ = theMuonModifier.flatRandomVector(dx, dy, dz);
278  const std::vector<float> rotation_ = theMuonModifier.flatRandomVector(phix, phiy, phiz);
279  disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
280  rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
281  } else {
282  disp.push_back(dx); disp.push_back(dy); disp.push_back(dz);
283  rotation.push_back(phix); rotation.push_back(phiy); rotation.push_back(phiz);
284  }
285  for(std::vector<Alignable *>::iterator iter = DTbarrel.begin(); iter != DTbarrel.end(); ++iter) {
286  theMuonModifier.moveAlignable( *iter, false, true, disp[0], disp[1], disp[2] );
287  theMuonModifier.rotateAlignable( *iter, false, true, rotation[0], rotation[1], rotation[2] );
288  theMuonModifier.addAlignmentPositionError( *iter, errorx, errory, errorz );
289  theMuonModifier.addAlignmentPositionErrorFromRotation( *iter, errorphix, errorphiy, errorphiz );
290  }
291  for(std::vector<Alignable *>::iterator iter = CSCendcaps.begin(); iter != CSCendcaps.end(); ++iter) {
292  theMuonModifier.moveAlignable( *iter, false, true, disp[0], disp[1], disp[2] );
293  theMuonModifier.rotateAlignable( *iter, false, true, rotation[0], rotation[1], rotation[2] );
294  theMuonModifier.addAlignmentPositionError( *iter, errorx, errory, errorz );
295  theMuonModifier.addAlignmentPositionErrorFromRotation( *iter, errorphix, errorphiy, errorphiz );
296  }
297 }
AlignableModifier theMuonModifier
void addAlignmentPositionError(Alignable *alignable, float dx, float dy, float dz)
Add the AlignmentPositionError (in global frame) to Alignable.
AlignableMuon * theAlignableMuon
Pointer to alignable Muon object.
align::Alignables DTBarrel()
const std::vector< float > gaussianRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (gaussian distribution)
void moveAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaX, float sigmaY, float sigmaZ)
Move alignable in global space according to parameters.
align::Scalars extractParameters(const edm::ParameterSet &, const char *)
align::Alignables CSCEndcaps()
std::vector< Scalar > Scalars
Definition: Utilities.h:22
const std::vector< float > flatRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (flat distribution)
void rotateAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaPhiX, float sigmaPhiY, float sigmaPhiZ)
Rotate alignable in global space according to parameters.
void addAlignmentPositionErrorFromRotation(Alignable *alignable, float phiX, float phiY, float phiZ)
Add alignment position error resulting from rotation in global frame.

Member Data Documentation

AlignableMuon* MuonScenarioBuilder::theAlignableMuon
private

Pointer to alignable Muon object.

Definition at line 49 of file MuonScenarioBuilder.h.

Referenced by applyScenario(), moveCSCSectors(), moveDTSectors(), moveMuon(), and MuonScenarioBuilder().

AlignableModifier MuonScenarioBuilder::theMuonModifier
private

Definition at line 51 of file MuonScenarioBuilder.h.

Referenced by moveChamberInSector(), moveCSCSectors(), moveDTSectors(), and moveMuon().