CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackerSystematicMisalignments.cc
Go to the documentation of this file.
4 
7 
12 
16 
20 #include "CLHEP/Random/RandGauss.h"
21 
23 
24 #include "DataFormats/SiStripDetId/interface/SiStripDetId.h" // for enums TID/TIB/etc.
25 
26 // Database
29 
30 // -----------------------------------------------------------------
31 // 2010-05-20 Frank Meier
32 // Changed sign of z-correction, i.e. z-expansion is now an expansion
33 // made some variables constant, removed obviously dead code and comments
34 
36  : theAlignableTracker(0)
37 {
38  // use existing geometry
39  m_fromDBGeom = cfg.getUntrackedParameter< bool > ("fromDBGeom");
40 
41  // constants
42  m_radialEpsilon = cfg.getUntrackedParameter< double > ("radialEpsilon");
43  m_telescopeEpsilon = cfg.getUntrackedParameter< double > ("telescopeEpsilon");
44  m_layerRotEpsilon = cfg.getUntrackedParameter< double > ("layerRotEpsilon");
45  m_bowingEpsilon = cfg.getUntrackedParameter< double > ("bowingEpsilon");
46  m_zExpEpsilon = cfg.getUntrackedParameter< double > ("zExpEpsilon");
47  m_twistEpsilon = cfg.getUntrackedParameter< double > ("twistEpsilon");
48  m_ellipticalEpsilon = cfg.getUntrackedParameter< double > ("ellipticalEpsilon");
49  m_skewEpsilon = cfg.getUntrackedParameter< double > ("skewEpsilon");
50  m_sagittaEpsilon = cfg.getUntrackedParameter< double > ("sagittaEpsilon");
51 
52  m_ellipticalDelta = cfg.getUntrackedParameter< double > ("ellipticalDelta");
53  m_skewDelta = cfg.getUntrackedParameter< double > ("skewDelta");
54  m_sagittaDelta = cfg.getUntrackedParameter< double > ("sagittaDelta");
55 
56  if (m_radialEpsilon > -990.0){
57  edm::LogWarning("MisalignedTracker") << "Applying radial ...";
58  }
59  if (m_telescopeEpsilon > -990.0){
60  edm::LogWarning("MisalignedTracker") << "Applying telescope ...";
61  }
62  if (m_layerRotEpsilon > -990.0){
63  edm::LogWarning("MisalignedTracker") << "Applying layer rotation ...";
64  }
65  if (m_bowingEpsilon > -990.0){
66  edm::LogWarning("MisalignedTracker") << "Applying bowing ...";
67  }
68  if (m_zExpEpsilon > -990.0){
69  edm::LogWarning("MisalignedTracker") << "Applying z-expansion ...";
70  }
71  if (m_twistEpsilon > -990.0){
72  edm::LogWarning("MisalignedTracker") << "Applying twist ...";
73  }
74  if (m_ellipticalEpsilon > -990.0){
75  edm::LogWarning("MisalignedTracker") << "Applying elliptical ...";
76  }
77  if (m_skewEpsilon > -990.0){
78  edm::LogWarning("MisalignedTracker") << "Applying skew ...";
79  }
80  if (m_sagittaEpsilon > -990.0){
81  edm::LogWarning("MisalignedTracker") << "Applying sagitta ...";
82  }
83 
84  // get flag for suppression of blind movements
85  suppressBlindMvmts = cfg.getUntrackedParameter< bool > ("suppressBlindMvmts");
87  {
88  edm::LogWarning("MisalignedTracker") << "Blind movements suppressed (TIB/TOB in z, TID/TEC in r)";
89  }
90 
91  // compatibility with old (weird) z convention
92  oldMinusZconvention = cfg.getUntrackedParameter< bool > ("oldMinusZconvention");
94  {
95  edm::LogWarning("MisalignedTracker") << "Old z convention: dz --> -dz";
96  }
97  else
98  {
99  edm::LogWarning("MisalignedTracker") << "New z convention: dz --> dz";
100  }
101 
102 }
103 
105 {
106 
107 }
108 
109 
111 
112 
114  setup.get<IdealGeometryRecord>().get(geom);
116 
117  //take geometry from DB or randomly generate geometry
118  if (m_fromDBGeom){
119  //build the tracker
120  edm::ESHandle<Alignments> alignments;
121  edm::ESHandle<AlignmentErrors> alignmentErrors;
122 
123  setup.get<TrackerAlignmentRcd>().get(alignments);
124  setup.get<TrackerAlignmentErrorRcd>().get(alignmentErrors);
125 
126  //apply the latest alignments
127  GeometryAligner aligner;
128  aligner.applyAlignments<TrackerGeometry>( &(*tracker), &(*alignments), &(*alignmentErrors), AlignTransform() );
129 
130  }
131 
132  theAlignableTracker = new AlignableTracker(&(*tracker));
133 
135 
136  // -------------- writing out to alignment record --------------
137  Alignments* myAlignments = theAlignableTracker->alignments() ;
138  AlignmentErrors* myAlignmentErrors = theAlignableTracker->alignmentErrors() ;
139 
140  // Store alignment[Error]s to DB
142  std::string theAlignRecordName = "TrackerAlignmentRcd";
143  std::string theErrorRecordName = "TrackerAlignmentErrorRcd";
144 
145  // Call service
146  if( !poolDbService.isAvailable() ) // Die if not available
147  throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
148 
149  poolDbService->writeOne<Alignments>(&(*myAlignments), poolDbService->beginOfTime(), theAlignRecordName);
150  poolDbService->writeOne<AlignmentErrors>(&(*myAlignmentErrors), poolDbService->beginOfTime(), theErrorRecordName);
151 }
152 
154 {
155 
156  const align::Alignables& comp = ali->components();
157  unsigned int nComp = comp.size();
158  //move then do for lower level object
159  //for issue of det vs detunit
160  bool usecomps = true;
161  if ((ali->alignableObjectId()==2)&&(nComp>=1)) usecomps = false;
162  for (unsigned int i = 0; i < nComp; ++i){
163  if (usecomps) applySystematicMisalignment(comp[i]);
164  }
165 
166  // if suppression of blind mvmts: check if subdet is blind to a certain mode
167  bool blindToZ(false), blindToR(false);
168  if (suppressBlindMvmts)
169  {
170  const int subdetid = ali->geomDetId().subdetId();
171  switch(subdetid)
172  {
173  // TIB/TON blind to z
174  case SiStripDetId::TIB:
175  case SiStripDetId::TOB:
176  blindToZ = true;
177  break;
178  // TID/TEC blind to R
179  case SiStripDetId::TID:
180  case SiStripDetId::TEC:
181  blindToR = true;
182  break;
183  default:
184  break;
185  }
186  }
187 
188  const int level = ali->alignableObjectId();
189  if ((level == 1)||(level == 2)){
190  const align::PositionType gP = ali->globalPosition();
191  const align::GlobalVector gVec = findSystematicMis( gP, blindToZ, blindToR);
192  ali->move( gVec );
193  }
194 }
195 
197 //align::GlobalVector TrackerSystematicMisalignments::findSystematicMis( align::PositionType globalPos ){
198  // calculates shift for the current alignable
199  // all corrections are calculated w.r.t. the original geometry
200  double deltaX = 0.0;
201  double deltaY = 0.0;
202  double deltaZ = 0.0;
203  const double oldX = globalPos.x();
204  const double oldY = globalPos.y();
205  const double oldZ = globalPos.z();
206  const double oldPhi = globalPos.phi();
207  const double oldR = sqrt(globalPos.x()*globalPos.x() + globalPos.y()*globalPos.y());
208 
209  if (m_radialEpsilon > -990.0 && !blindToR){
210  deltaX += m_radialEpsilon*oldX;
211  deltaY += m_radialEpsilon*oldY;
212  }
213  if (m_telescopeEpsilon > -990.0 && !blindToZ){
214  deltaZ += m_telescopeEpsilon*oldR;
215  }
216  if (m_layerRotEpsilon > -990.0){
217  // The following number was chosen such that the Layer Rotation systematic
218  // misalignment would not cause an overall rotation of the tracker.
219  const double Roffset = 57.0;
220  const double xP = oldR*cos(oldPhi+m_layerRotEpsilon*(oldR-Roffset));
221  const double yP = oldR*sin(oldPhi+m_layerRotEpsilon*(oldR-Roffset));
222  deltaX += (xP - oldX);
223  deltaY += (yP - oldY);
224  }
225  if (m_bowingEpsilon > -990.0 && !blindToR){
226  const double trackeredgePlusZ=271.846;
227  const double bowfactor=m_bowingEpsilon*(trackeredgePlusZ*trackeredgePlusZ-oldZ*oldZ);
228  deltaX += oldX*bowfactor;
229  deltaY += oldY*bowfactor;
230  }
231  if (m_zExpEpsilon > -990.0 && !blindToZ){
232  deltaZ += oldZ*m_zExpEpsilon;
233  }
234  if (m_twistEpsilon > -990.0){
235  const double xP = oldR*cos(oldPhi+m_twistEpsilon*oldZ);
236  const double yP = oldR*sin(oldPhi+m_twistEpsilon*oldZ);
237  deltaX += (xP - oldX);
238  deltaY += (yP - oldY);
239  }
240  if (m_ellipticalEpsilon > -990.0 && !blindToR){
241  deltaX += oldX*m_ellipticalEpsilon*cos(2.0*oldPhi + m_ellipticalDelta);
242  deltaY += oldY*m_ellipticalEpsilon*cos(2.0*oldPhi + m_ellipticalDelta);
243  }
244  if (m_skewEpsilon > -990.0 && !blindToZ){
245  deltaZ += m_skewEpsilon*cos(oldPhi + m_skewDelta);
246  }
247  if (m_sagittaEpsilon > -990.0){
248  // deltaX += oldX/fabs(oldX)*m_sagittaEpsilon; // old one...
249  deltaX += oldR*m_sagittaEpsilon*sin(m_sagittaDelta);
250  deltaY += oldR*m_sagittaEpsilon*cos(m_sagittaDelta); //Delta y is cos so that delta=0 reflects the old behavior
251  }
252 
253  // Compatibility with old version <= 1.5
254  if (oldMinusZconvention) deltaZ = -deltaZ;
255 
256  align::GlobalVector gV( deltaX, deltaY, deltaZ );
257  return gV;
258 }
259 
260 // Plug in to framework
261 
263 
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
Class to update a given geometry with a set of alignments.
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Phi< T > phi() const
Definition: PV3DBase.h:68
T y() const
Definition: PV3DBase.h:62
align::GlobalVector findSystematicMis(align::PositionType, const bool blindToZ, const bool blindToR)
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
virtual Alignables components() const =0
Return vector of all direct components.
T sqrt(T t)
Definition: SSEVec.h:46
T z() const
Definition: PV3DBase.h:63
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
TrackerSystematicMisalignments(const edm::ParameterSet &)
bool isAvailable() const
Definition: Service.h:47
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
AlignmentErrors * alignmentErrors() const
Return alignment errors, sorted by DetId.
void applyAlignments(C *geometry, const Alignments *alignments, const AlignmentErrors *alignmentErrors, const AlignTransform &globalCoordinates)
void writeOne(T *payload, Time_t time, const std::string &recordName, bool withlogging=false)
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 but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
virtual void beginJob()
Read ideal tracker geometry from DB.
const T & get() const
Definition: EventSetup.h:55
TrackerGeometry * build(const GeometricDet *gd)
std::vector< Alignable * > Alignables
Definition: Utilities.h:28
const PositionType & globalPosition() const
Return the global position of the object.
Definition: Alignable.h:129
tuple level
Definition: testEve_cfg.py:34
Alignments * alignments() const
Return alignments, sorted by DetId.
T x() const
Definition: PV3DBase.h:61
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
const DetId & geomDetId() const
Definition: Alignable.h:177
virtual void analyze(const edm::Event &, const edm::EventSetup &)