CMS 3D CMS Logo

TrackerGeometryIntoNtuples.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: TrackerGeometryIntoNtuples
4 // Class: TrackerGeometryIntoNtuples
5 //
13 //
14 // Original class TrackerGeometryIntoNtuples.cc
15 // Original Author: Nhan Tran
16 // Created: Mon Jul 16m 16:56:34 CDT 2007
17 // $Id: TrackerGeometryIntoNtuples.cc,v 1.14 2012/12/02 22:13:12 devdatta Exp $
18 //
19 // 26 May 2012
20 // ***********
21 // *********** Modified to add tracker module surface deformations ***********
22 //
23 //
24 
25 // system include files
29 
31 
32 #include <algorithm>
33 #include "TTree.h"
34 #include "TFile.h"
35 
39 
43 
48 
51 
54 
57 
59 
61 
63 
64 // To access kinks and bows
67 
68 #include "CLHEP/Matrix/SymMatrix.h"
69 
70 //
71 // class decleration
72 //
73 
75 public:
77  ~TrackerGeometryIntoNtuples() override;
78 
79 
80 private:
81  void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override;
82 
83  void addBranches();
84 
85  // ----------member data ---------------------------
86  //std::vector<AlignTransform> m_align;
88 
89  uint32_t m_rawid;
90  double m_x, m_y, m_z;
93  double m_xx, m_xy, m_yy, m_xz, m_yz, m_zz;
94  int m_dNpar ;
95  double m_d1,m_d2, m_d3;
96  int m_dtype ;
97  //std::vector<double>m_dpar;
98  std::vector<double>* mp_dpar;
99 
100  // Deformation parameters: stored in same tree as the alignment parameters
102  enum {kMaxNumPar = 20}; // slighly above 'two bowed surfaces' limit
104 
105  TTree *m_tree;
107  TTree *m_treeErrors;
110  TFile *m_file;
111 };
112 
113 //
114 // constants, enums and typedefs
115 //
116 
117 //
118 // static data member definitions
119 //
120 
121 //
122 // constructors and destructor
123 //
126  m_rawid(0),
127  m_x(0.), m_y(0.), m_z(0.),
128  m_alpha(0.), m_beta(0.), m_gamma(0.),
129  m_subdetid(0),
130  m_xx(0.), m_xy(0.), m_yy(0.), m_xz(0.), m_yz(0.), m_zz(0.),
131  m_dNpar(0),
132  m_d1(0.), m_d2(0.), m_d3(0.),
133  m_dtype(0),
134  mp_dpar(nullptr)
135 {
136  m_outputFile = iConfig.getUntrackedParameter< std::string > ("outputFile");
137  m_outputTreename = iConfig.getUntrackedParameter< std::string > ("outputTreename");
138  m_file = new TFile(m_outputFile.c_str(),"RECREATE");
139  m_tree = new TTree(m_outputTreename.c_str(),m_outputTreename.c_str());
140  m_treeDeformations = new TTree("alignTreeDeformations","alignTreeDeformations");
141  //char errorTreeName[256];
142  //snprintf(errorTreeName, sizeof(errorTreeName), "%sErrors", m_outputTreename);
143  //m_treeErrors = new TTree(errorTreeName,errorTreeName);
144  m_treeErrors = new TTree("alignTreeErrors","alignTreeErrors");
145 
146 }
147 
148 
150 {
151  delete theCurrentTracker;
152 }
153 
154 
155 //
156 // member functions
157 //
158 
159 // ------------ method called to for each event ------------
161 {
162  // retrieve tracker topology from geometry
163  edm::ESHandle<TrackerTopology> tTopoHandle;
164  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
165  const TrackerTopology* const tTopo = tTopoHandle.product();
166 
167 
168  edm::LogInfo("beginJob") << "Begin Job";
169 
170  //accessing the initial geometry
171  edm::ESHandle<GeometricDet> theGeometricDet;
172  iSetup.get<IdealGeometryRecord>().get(theGeometricDet);
174  iSetup.get<PTrackerParametersRcd>().get( ptp );
175  TrackerGeomBuilderFromGeometricDet trackerBuilder;
176  //currernt tracker
177  TrackerGeometry* theCurTracker = trackerBuilder.build(&*theGeometricDet, *ptp, tTopo );
178 
179  //build the tracker
180  edm::ESHandle<Alignments> alignments;
183 
184  iSetup.get<TrackerAlignmentRcd>().get(alignments);
185  iSetup.get<TrackerAlignmentErrorExtendedRcd>().get(alignmentErrors);
186  iSetup.get<TrackerSurfaceDeformationRcd>().get(surfaceDeformations);
187 
188  //apply the latest alignments
189  edm::ESHandle<Alignments> globalPositionRcd;
190  iSetup.get<TrackerDigiGeometryRecord>().getRecord<GlobalPositionRcd>().get(globalPositionRcd);
191  GeometryAligner aligner;
192  aligner.applyAlignments<TrackerGeometry>( &(*theCurTracker), &(*alignments), &(*alignmentErrors),
193  align::DetectorGlobalPosition(*globalPositionRcd, DetId(DetId::Tracker)));
194  aligner.attachSurfaceDeformations<TrackerGeometry>( &(*theCurTracker), &(*surfaceDeformations)) ;
195 
196 
197  theCurrentTracker = new AlignableTracker(&(*theCurTracker), tTopo);
198 
199  Alignments* theAlignments = theCurrentTracker->alignments();
200  //AlignmentErrorsExtended* theAlignmentErrorsExtended = theCurrentTracker->alignmentErrors();
201 
202  //alignments
203  addBranches();
204  for (std::vector<AlignTransform>::const_iterator i = theAlignments->m_align.begin(); i != theAlignments->m_align.end(); ++i){
205 
206  m_rawid = i->rawId();
207  CLHEP::Hep3Vector translation = i->translation();
208  m_x = translation.x();
209  m_y = translation.y();
210  m_z = translation.z();
211 
212 
213  CLHEP::HepRotation rotation = i->rotation();
214  m_alpha = rotation.getPhi();
215  m_beta = rotation.getTheta();
216  m_gamma = rotation.getPsi();
217  m_tree->Fill();
218 
219  //DetId detid(m_rawid);
220  //if (detid.subdetId() > 2){
221  //
222  //std::cout << " panel: " << tTopo->pxfPanel( m_rawid ) << ", module: " << tTopo->pxfModule( m_rawid ) << std::endl;
223  //if ((tTopo->pxfPanel( m_rawid ) == 1) && (tTopo->pxfModule( m_rawid ) == 4)) std::cout << m_rawid << ", ";
224  //std::cout << m_rawid << std::setprecision(9) << " " << m_x << " " << m_y << " " << m_z;
225  //std::cout << std::setprecision(9) << " " << m_alpha << " " << m_beta << " " << m_gamma << std::endl;
226  //}
227 
228  }
229 
230  delete theAlignments;
231 
232  std::vector<AlignTransformErrorExtended> alignErrors = alignmentErrors->m_alignError;
233  for (std::vector<AlignTransformErrorExtended>::const_iterator i = alignErrors.begin(); i != alignErrors.end(); ++i){
234 
235  m_rawid = i->rawId();
236  CLHEP::HepSymMatrix errMatrix = i->matrix();
237  DetId detid(m_rawid);
238  m_subdetid = detid.subdetId();
239  m_xx = errMatrix[0][0];
240  m_xy = errMatrix[0][1];
241  m_xz = errMatrix[0][2];
242  m_yy = errMatrix[1][1];
243  m_yz = errMatrix[1][2];
244  m_zz = errMatrix[2][2];
245  m_treeErrors->Fill();
246  }
247 
248  // Get GeomDetUnits for the current tracker
249  auto const & detUnits = theCurTracker->detUnits() ;
250  int detUnit(0) ;
251  //\\for (unsigned int iDet = 0; iDet < detUnits.size(); ++iDet) {
252  for (auto iunit = detUnits.begin(); iunit != detUnits.end(); ++iunit) {
253 
254  DetId detid = (*iunit)->geographicalId();
255  m_rawid = detid.rawId() ;
256  m_subdetid = detid.subdetId();
257 
258  ++detUnit ;
259  //\\GeomDetUnit* geomDetUnit = detUnits.at(iDet) ;
260  auto geomDetUnit = *iunit ;
261 
262  // Get SurfaceDeformation for this GeomDetUnit
263  if ( geomDetUnit->surfaceDeformation() ) {
264  std::vector<double> surfaceDeformParams = (geomDetUnit->surfaceDeformation())->parameters() ;
265  //edm::LogInfo("surfaceDeformParamsSize") << " surfaceDeformParams size = " << surfaceDeformParams.size() << std::endl ;
266  m_dNpar = surfaceDeformParams.size() ;
267  m_dtype = (geomDetUnit->surfaceDeformation())->type() ;
268  m_d1 = surfaceDeformParams.at(0) ;
269  m_d2 = surfaceDeformParams.at(1) ;
270  m_d3 = surfaceDeformParams.at(2) ;
271  mp_dpar->clear() ;
272  for (std::vector<double>::const_iterator it = surfaceDeformParams.begin(); it != surfaceDeformParams.end(); ++it) {
273  mp_dpar->push_back((*it)) ;
274  //edm::LogInfo("surfaceDeformParamsContent") << " surfaceDeformParam = " << (*it) << std::endl ;
275  }
276  m_treeDeformations->Fill() ;
277  }
278  }
279 
280  //write out
281  m_file->cd();
282  m_tree->Write();
283  m_treeDeformations->Write();
284  m_treeErrors->Write();
285  m_file->Close();
286 }
287 
288 
290 
291  m_tree->Branch("rawid", &m_rawid, "rawid/I");
292  m_tree->Branch("x", &m_x, "x/D");
293  m_tree->Branch("y", &m_y, "y/D");
294  m_tree->Branch("z", &m_z, "z/D");
295  m_tree->Branch("alpha", &m_alpha, "alpha/D");
296  m_tree->Branch("beta", &m_beta, "beta/D");
297  m_tree->Branch("gamma", &m_gamma, "gamma/D");
298 
299  m_treeDeformations->Branch("irawid", &m_rawid, "irawid/I");
300  m_treeDeformations->Branch("subdetid", &m_subdetid, "subdetid/I");
301  m_treeDeformations->Branch("dNpar", &m_dNpar, "dNpar/I");
302  //m_treeDeformations->Branch("d1", &m_d1, "d1/D");
303  //m_treeDeformations->Branch("d2", &m_d2, "d2/D");
304  //m_treeDeformations->Branch("d3", &m_d3, "d3/D");
305  m_treeDeformations->Branch("dtype", &m_dtype);
306  m_treeDeformations->Branch("dpar", "std::vector<double>", &mp_dpar);
307 
308  m_treeErrors->Branch("rawid", &m_rawid, "rawid/I");
309  m_treeErrors->Branch("subdetid", &m_subdetid, "subdetid/I");
310  m_treeErrors->Branch("xx", &m_xx, "xx/D");
311  m_treeErrors->Branch("yy", &m_yy, "yy/D");
312  m_treeErrors->Branch("zz", &m_zz, "zz/D");
313  m_treeErrors->Branch("xy", &m_xy, "xy/D");
314  m_treeErrors->Branch("xz", &m_xz, "xz/D");
315  m_treeErrors->Branch("yz", &m_yz, "yz/D");
316 
317 
318  //m_tree->Branch("NumDeform", &numDeformationValues_, "NumDeform/i");
319  //m_tree->Branch("DeformValues", deformationValues_, "DeformValues[NumDeform]/F");
320 
321 }
322 
323 
324 //define this as a plug-in
type
Definition: HCALResponse.h:21
T getUntrackedParameter(std::string const &, T const &) const
const DetContainer & detUnits() const override
Returm a vector of all GeomDet.
Class to update a given geometry with a set of alignments.
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:47
TrackerGeometry * build(const GeometricDet *gd, const PTrackerParameters &ptp, const TrackerTopology *tTopo)
#define nullptr
std::vector< AlignTransform > m_align
Definition: Alignments.h:19
int iEvent
Definition: GenABIO.cc:230
void attachSurfaceDeformations(C *geometry, const AlignmentSurfaceDeformations *surfaceDeformations)
void get(HolderT &iHolder) const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:41
Definition: DetId.h:18
void applyAlignments(C *geometry, const Alignments *alignments, const AlignmentErrorsExtended *alignmentErrors, const AlignTransform &globalCoordinates)
T get() const
Definition: EventSetup.h:63
const AlignTransform & DetectorGlobalPosition(const Alignments &allGlobals, const DetId &id)
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override
TrackerGeometryIntoNtuples(const edm::ParameterSet &)
T const * product() const
Definition: ESHandle.h:86