CMS 3D CMS Logo

MuonScenarioBuilder Class Reference

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

#include <Alignment/MuonAlignment/interface/MuonScenarioBuilder.h>

Inheritance diagram for MuonScenarioBuilder:

MisalignmentScenarioBuilder

List of all members.

Public Member Functions

void applyScenario (const edm::ParameterSet &scenario)
 Apply misalignment scenario to the Muon.
std::vector< float > extractParameters (const edm::ParameterSet &, char *)
void moveChamberInSector (Alignable *, std::vector< float >, std::vector< float >, std::vector< float >, std::vector< float >)
void moveCSCSectors (const edm::ParameterSet &scenario)
 this special method allows to move a CSCsector by a same amount
void moveDTSectors (const edm::ParameterSet &scenario)
 This special method allows to move a DTsector by a same amount.
void moveMuon (const edm::ParameterSet &scenario)
 this special method allows to move the complete muon system by a same amount
 MuonScenarioBuilder (Alignable *alignable)
 Constructor.
 ~MuonScenarioBuilder ()
 Destructor.

Private Attributes

AlignableMuontheAlignableMuon
 Pointer to alignable Muon object.
AlignableModifier theMuonModifier


Detailed Description

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

The misalignment scenario builder.

Date
2008/04/15 16:05:53
Revision
1.4
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.

00026 {
00027 
00028   theAlignableMuon = dynamic_cast<AlignableMuon*>( alignable );
00029 
00030   if ( !theAlignableMuon )
00031     throw cms::Exception("TypeMismatch") << "Argument is not an AlignableMuon";
00032 
00033 }

MuonScenarioBuilder::~MuonScenarioBuilder (  )  [inline]

Destructor.

Definition at line 30 of file MuonScenarioBuilder.h.

00030 {};


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(), moveCSCSectors(), moveDTSectors(), moveMuon(), AlignableModifier::setSeed(), theAlignableMuon, MisalignmentScenarioBuilder::theModifier, MisalignmentScenarioBuilder::theModifierCounter, and MisalignmentScenarioBuilder::theScenario.

Referenced by MuonGeometryIntoNtuples::beginJob(), AlignmentProducer::beginOfJob(), and MisalignedMuonESProducer::produce().

00038 {
00039 
00040   // Apply the scenario to all main components of Muon.
00041   theScenario = scenario;
00042   theModifierCounter = 0;
00043 
00044   // Seed is set at top-level, and is mandatory
00045   if ( this->hasParameter_( "seed", theScenario ) )
00046         theModifier.setSeed( static_cast<long>(theScenario.getParameter<int>("seed")) );
00047   else
00048         throw cms::Exception("BadConfig") << "No generator seed defined!";  
00049 
00050 
00051 
00052   // DT Barrel
00053   std::vector<Alignable*> dtBarrel = theAlignableMuon->DTBarrel();
00054   this->decodeMovements_( theScenario, dtBarrel, "DTBarrel" );
00055   // CSC Endcap
00056   std::vector<Alignable*> cscEndcaps = theAlignableMuon->CSCEndcaps();
00057   this->decodeMovements_( theScenario, cscEndcaps, "CSCEndcap" );
00058 
00059   this->moveDTSectors(theScenario);
00060   this->moveCSCSectors(theScenario);
00061   this->moveMuon(theScenario);
00062   
00063   edm::LogInfo("TrackerScenarioBuilder") 
00064         << "Applied modifications to " << theModifierCounter << " alignables";
00065 
00066 }

std::vector< float > MuonScenarioBuilder::extractParameters ( const edm::ParameterSet pSet,
char *  blockId 
)

Definition at line 70 of file MuonScenarioBuilder.cc.

References error, edm::ParameterSet::getParameter(), edm::ParameterSet::getParameterNames(), MisalignmentScenarioBuilder::getParameterSet_(), and edm::ParameterSet::retrieve().

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

00070                                                                                                   {
00071   
00072   double scale_ = 0, scaleError_ = 0, phiX_ = 0, phiY_ = 0, phiZ_ = 0;
00073   double dX_ = 0, dY_ = 0, dZ_ = 0;
00074   
00075   std::ostringstream error;
00076   edm::ParameterSet Parameters = this->getParameterSet_((std::string)blockId, pSet);
00077   std::vector<std::string> parameterNames = Parameters.getParameterNames();
00078   for ( std::vector<std::string>::iterator iParam = parameterNames.begin(); iParam != parameterNames.end(); iParam++ ) {
00079     if ( (*iParam) == "scale" )    scale_ = Parameters.getParameter<double>( *iParam );
00080     else if ( (*iParam) == "scaleError" ) scaleError_ = Parameters.getParameter<double>( *iParam );
00081     else if ( (*iParam) == "phiX" )     phiX_     = Parameters.getParameter<double>( *iParam );
00082     else if ( (*iParam) == "phiY" )     phiY_     = Parameters.getParameter<double>( *iParam );
00083     else if ( (*iParam) == "phiZ" )     phiZ_     = Parameters.getParameter<double>( *iParam );
00084     else if ( (*iParam) == "dX" )       dX_       = Parameters.getParameter<double>( *iParam );
00085     else if ( (*iParam) == "dY" )       dY_       = Parameters.getParameter<double>( *iParam );
00086     else if ( (*iParam) == "dZ" )       dZ_       = Parameters.getParameter<double>( *iParam );
00087     else if ( Parameters.retrieve( *iParam ).typeCode() != 'P' )
00088       { // Add unknown parameter to list
00089         if ( !error.str().length() ) error << "Unknown parameter name(s): ";
00090         error << " " << *iParam;
00091       }
00092   }
00093   std::vector<float> param;
00094   param.push_back(scale_); param.push_back(scaleError_);
00095   param.push_back(phiX_); param.push_back(phiY_);
00096   param.push_back(phiZ_); param.push_back(dX_);
00097   param.push_back(dY_); param.push_back(dZ_);
00098   return param;
00099 
00100 }

void MuonScenarioBuilder::moveChamberInSector ( Alignable chamber,
std::vector< float >  disp,
std::vector< float >  rotation,
std::vector< float >  dispError,
std::vector< float >  rotationError 
)

Definition at line 253 of file MuonScenarioBuilder.cc.

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

Referenced by moveCSCSectors(), and moveDTSectors().

00253                                                                                                                                                                              {
00254    
00255     align::RotationType rotx( Basic3DVector<float>(1.0, 0.0, 0.0), rotation[0] );
00256     align::RotationType roty( Basic3DVector<float>(0.0, 1.0, 0.0), rotation[1] );
00257     align::RotationType rotz( Basic3DVector<float>(0.0, 0.0, 1.0), rotation[2] );
00258     align::RotationType rot = rotz * roty * rotx;
00259     GlobalPoint pos = chamber->globalPosition();
00260     GlobalPoint dispRot(pos.basicVector()-rot*pos.basicVector());
00261     disp[0] += dispRot.x(); disp[1] += dispRot.y(); disp[2] += dispRot.z();
00262     theMuonModifier.moveAlignable( chamber, false, true, disp[0], disp[1], disp[2] );
00263     theMuonModifier.rotateAlignable( chamber, false, true, rotation[0],  rotation[1], rotation[2] );
00264     theMuonModifier.addAlignmentPositionError( chamber, dispError[0], dispError[1], dispError[2] );
00265     theMuonModifier.addAlignmentPositionErrorFromRotation( chamber,  rotationError[0], rotationError[1], rotationError[2] );
00266 
00267 }  

void MuonScenarioBuilder::moveCSCSectors ( const edm::ParameterSet scenario  ) 

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

Definition at line 151 of file MuonScenarioBuilder.cc.

References counter(), AlignableMuon::CSCChambers(), GeomDetEnumerators::endcap, extractParameters(), AlignableModifier::gaussianRandomVector(), index, iter, moveChamberInSector(), CSCTriggerNumbering::sectorFromTriggerLabels(), theAlignableMuon, theMuonModifier, CSCTriggerNumbering::triggerSectorFromLabels(), and CSCTriggerNumbering::triggerSubSectorFromLabels().

Referenced by applyScenario().

00151                                                                     {
00152   
00153   std::vector<Alignable *> CSCchambers = theAlignableMuon->CSCChambers();
00154   //Take Parameters
00155   std::vector<float> param = this->extractParameters(pSet, "CSCsectors");
00156   float scale_ = param[0]; float scaleError_ = param[1];
00157   float phiX_ = param[2]; float phiY_ = param[3]; float phiZ_ = param[4];
00158   float dX_ = param[5]; float dY_ = param[6]; float dZ_ = param[7];
00159   
00160   float dx = scale_*dX_; float dy = scale_*dY_; float dz = scale_*dZ_;
00161   float phix = scale_*phiX_; float phiy = scale_*phiY_; float phiz = scale_*phiZ_;
00162   float errorx = scaleError_*dX_; float errory = scaleError_*dY_; float errorz = scaleError_*dZ_;
00163   float errorphix = scaleError_*phiX_; float errorphiy = scaleError_*phiY_; float errorphiz = scaleError_*phiZ_;
00164   std::vector<float> errorDisp;
00165   errorDisp.push_back(errorx); errorDisp.push_back(errory); errorDisp.push_back(errorz);
00166   std::vector<float> errorRotation;
00167   errorRotation.push_back(errorphix); errorRotation.push_back(errorphiy); errorRotation.push_back(errorphiz);
00168   
00169   int index[2][4][4][36];
00170   int sector_index[2][4][4][36];
00171   int counter = 0;
00172   //Create an index for the chambers in the alignable vector
00173   for(std::vector<Alignable *>::iterator iter = CSCchambers.begin(); iter != CSCchambers.end(); ++iter) {
00174     CSCDetId myId((*iter)->geomDetId().rawId());
00175     index[myId.endcap()-1][myId.station()-1][myId.ring()-1][myId.chamber()-1] = counter;
00176     sector_index[myId.endcap()-1][myId.station()-1][myId.ring()-1][myId.chamber()-1] = CSCTriggerNumbering::sectorFromTriggerLabels(CSCTriggerNumbering::triggerSectorFromLabels(myId),CSCTriggerNumbering::triggerSubSectorFromLabels(myId) , myId.station());
00177     counter++;
00178   }
00179   for(int endcap = 0; endcap < 2; endcap++) {
00180     for(int ring = 0; ring < 2; ring++) {
00181       for(int sector = 1; sector < 7; sector++) {
00182         const std::vector<float> disp = theMuonModifier.gaussianRandomVector(dx, dy, dz);
00183         const std::vector<float> rotation = theMuonModifier.gaussianRandomVector(phix, phiy, phiz);
00184         //Different cases are considered in order to fit endcap geometry
00185         for(int station = 0; station < 4; station++) {
00186           if(station == 0) {
00187             int r_ring[2];
00188             if(ring == 0) {
00189               r_ring[0] = 0; r_ring[1] = 3;
00190             } else {
00191               r_ring[0] = 1; r_ring[1] = 2;
00192             }
00193             for(int r_counter = 0; r_counter < 2; r_counter++) {
00194               for(int chamber = 0; chamber < 36; chamber++) {
00195                 if(sector == (sector_index[endcap][station][r_ring[r_counter]][chamber]+1)/2) {
00196                   Alignable *myAlign = CSCchambers.at(index[endcap][station][r_ring[r_counter]][chamber]);
00197                   this->moveChamberInSector(myAlign, disp, rotation, errorDisp, errorRotation);
00198                 }
00199               }
00200             }
00201           } else if(station == 3 && ring == 1) {
00202             continue;
00203           } else {
00204             for(int chamber = 0; chamber < 36; chamber++) {
00205               if(ring == 0 && chamber > 17) continue;
00206               if(sector == sector_index[endcap][station][ring][chamber]) {
00207                 Alignable *myAlign = CSCchambers.at(index[endcap][station][ring][chamber]);
00208                 this->moveChamberInSector(myAlign, disp, rotation, errorDisp, errorRotation);
00209               }
00210             }
00211           }
00212         }
00213       }
00214     }
00215   }
00216 }

void MuonScenarioBuilder::moveDTSectors ( const edm::ParameterSet scenario  ) 

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

Definition at line 103 of file MuonScenarioBuilder.cc.

References counter(), AlignableMuon::DTChambers(), extractParameters(), AlignableModifier::gaussianRandomVector(), index, iter, moveChamberInSector(), theAlignableMuon, theMuonModifier, and muonGeometry::wheel.

Referenced by applyScenario().

00103                                                                    {
00104   
00105   std::vector<Alignable *> DTchambers = theAlignableMuon->DTChambers();
00106   //Take parameters
00107   std::vector<float> param = this->extractParameters(pSet, "DTsectors");
00108   float scale_ = param[0]; float scaleError_ = param[1];
00109   float phiX_ = param[2]; float phiY_ = param[3]; float phiZ_ = param[4];
00110   float dX_ = param[5]; float dY_ = param[6]; float dZ_ = param[7];
00111   
00112   float dx = scale_*dX_; float dy = scale_*dY_; float dz = scale_*dZ_;
00113   float phix = scale_*phiX_; float phiy = scale_*phiY_; float phiz = scale_*phiZ_;
00114   float errorx = scaleError_*dX_; float errory = scaleError_*dY_; float errorz = scaleError_*dZ_;
00115   float errorphix = scaleError_*phiX_; float errorphiy = scaleError_*phiY_; float errorphiz = scaleError_*phiZ_;
00116   std::vector<float> errorDisp;
00117   errorDisp.push_back(errorx); errorDisp.push_back(errory); errorDisp.push_back(errorz);
00118   std::vector<float> errorRotation;
00119   errorRotation.push_back(errorphix); errorRotation.push_back(errorphiy); errorRotation.push_back(errorphiz);
00120  
00121   int index[5][4][14];
00122   int counter = 0;
00123   //Create and index for the chambers in the Alignable vector
00124   for(std::vector<Alignable *>::iterator iter = DTchambers.begin(); iter != DTchambers.end(); ++iter) {
00125     DTChamberId myId((*iter)->geomDetId().rawId());
00126     index[myId.wheel()+2][myId.station()-1][myId.sector()-1] = counter;
00127     counter++;
00128   }
00129   for(int wheel = 0; wheel < 5; wheel++) {
00130     for(int sector = 0; sector < 12; sector++) {
00131       const std::vector<float> disp = theMuonModifier.gaussianRandomVector(dx, dy, dz);
00132       const std::vector<float> rotation = theMuonModifier.gaussianRandomVector(phix, phiy, phiz);
00133       for(int station = 0; station < 4; station++) {
00134         Alignable *myAlign = DTchambers.at(index[wheel][station][sector]);
00135         this->moveChamberInSector(myAlign, disp, rotation, errorDisp, errorRotation);
00136         if(sector == 3 && station == 3) {
00137           Alignable *myAlignD = DTchambers.at(index[wheel][station][12]);
00138           this->moveChamberInSector(myAlignD, disp, rotation, errorDisp, errorRotation);
00139         } else if(sector == 9 && station == 3) {
00140           Alignable *myAlignD = DTchambers.at(index[wheel][station][13]);
00141           this->moveChamberInSector(myAlignD, disp, rotation, errorDisp, errorRotation);
00142         }
00143       }
00144     }
00145   } 
00146 }

void MuonScenarioBuilder::moveMuon ( const edm::ParameterSet scenario  ) 

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

Definition at line 220 of file MuonScenarioBuilder.cc.

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

Referenced by applyScenario().

00220                                                               {
00221 
00222   std::vector<Alignable *> DTbarrel = theAlignableMuon->DTBarrel();     
00223   std::vector<Alignable *> CSCendcaps = theAlignableMuon->CSCEndcaps();  
00224   //Take Parameters
00225   std::vector<float> param = this->extractParameters(pSet, "Muons");
00226   float scale_ = param[0]; float scaleError_ = param[1];
00227   float phiX_ = param[2]; float phiY_ = param[3]; float phiZ_ = param[4];
00228   float dX_ = param[5]; float dY_ = param[6]; float dZ_ = param[7];
00229   float dx = scale_*dX_; float dy = scale_*dY_; float dz = scale_*dZ_;
00230   float phix = scale_*phiX_; float phiy = scale_*phiY_; float phiz = scale_*phiZ_;
00231   float errorx = scaleError_*dX_; float errory = scaleError_*dY_; float errorz = scaleError_*dZ_;
00232   float errorphix = scaleError_*phiX_; float errorphiy = scaleError_*phiY_; float errorphiz = scaleError_*phiZ_;
00233   //Create an index for the chambers in the alignable vector
00234   const std::vector<float> disp = theMuonModifier.gaussianRandomVector(dx, dy, dz);
00235   const std::vector<float> rotation = theMuonModifier.gaussianRandomVector(phix, phiy, phiz);
00236   for(std::vector<Alignable *>::iterator iter = DTbarrel.begin(); iter != DTbarrel.end(); ++iter) {
00237     theMuonModifier.moveAlignable( *iter, false, true, disp[0], disp[1], disp[2] );
00238     theMuonModifier.rotateAlignable( *iter, false, true, rotation[0],  rotation[1], rotation[2] );
00239     theMuonModifier.addAlignmentPositionError( *iter, errorx, errory, errorz );
00240     theMuonModifier.addAlignmentPositionErrorFromRotation( *iter,  errorphix, errorphiy, errorphiz ); 
00241   }
00242   for(std::vector<Alignable *>::iterator iter = CSCendcaps.begin(); iter != CSCendcaps.end(); ++iter) {
00243     theMuonModifier.moveAlignable( *iter, false, true, disp[0], disp[1], disp[2] );
00244     theMuonModifier.rotateAlignable( *iter, false, true, rotation[0],  rotation[1], rotation[2] );
00245     theMuonModifier.addAlignmentPositionError( *iter, errorx, errory, errorz );
00246     theMuonModifier.addAlignmentPositionErrorFromRotation( *iter,  errorphix, errorphiy, errorphiz ); 
00247   }
00248   
00249 }


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().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:28:47 2009 for CMSSW by  doxygen 1.5.4