CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiPixelTrackResidualSource.cc
Go to the documentation of this file.
1 // Package: SiPixelMonitorTrack
2 // Class: SiPixelTrackResidualSource
3 //
4 // class SiPixelTrackResidualSource SiPixelTrackResidualSource.cc
5 // DQM/SiPixelMonitorTrack/src/SiPixelTrackResidualSource.cc
6 //
7 // Description: SiPixel hit-to-track residual data quality monitoring modules
8 // Implementation: prototype -> improved -> never final - end of the 1st step
9 //
10 // Original Author: Shan-Huei Chuang
11 // Created: Fri Mar 23 18:41:42 CET 2007
12 // Updated by Lukas Wehrli (plots for clusters on/off track added)
13 
14 
15 #include <iostream>
16 #include <map>
17 #include <string>
18 #include <vector>
19 #include <utility>
20 
23 
26 
30 
32 
35 
37 
43 
47 
48 //Claudia new libraries
58 
59 using namespace std;
60 using namespace edm;
61 
62 
64  pSet_(pSet),
65  modOn( pSet.getUntrackedParameter<bool>("modOn",true) ),
66  reducedSet( pSet.getUntrackedParameter<bool>("reducedSet",true) ),
67  ladOn( pSet.getUntrackedParameter<bool>("ladOn",false) ),
68  layOn( pSet.getUntrackedParameter<bool>("layOn",false) ),
69  phiOn( pSet.getUntrackedParameter<bool>("phiOn",false) ),
70  ringOn( pSet.getUntrackedParameter<bool>("ringOn",false) ),
71  bladeOn( pSet.getUntrackedParameter<bool>("bladeOn",false) ),
72  diskOn( pSet.getUntrackedParameter<bool>("diskOn",false) ),
73  isUpgrade( pSet.getUntrackedParameter<bool>("isUpgrade",false) )
74 {
75  pSet_ = pSet;
76  debug_ = pSet_.getUntrackedParameter<bool>("debug", false);
79  tracksrc_ = pSet_.getParameter<edm::InputTag>("trajectoryInput");
81  ttrhbuilder_ = pSet_.getParameter<std::string>("TTRHBuilder");
82  ptminres_= pSet.getUntrackedParameter<double>("PtMinRes",4.0) ;
83  beamSpotToken_ = consumes<reco::BeamSpot>(std::string("offlineBeamSpot"));
84  offlinePrimaryVerticesToken_ = consumes<reco::VertexCollection>(std::string("offlinePrimaryVertices"));
85  generalTracksToken_ = consumes<reco::TrackCollection>(std::string("generalTracks"));
86  tracksrcToken_ = consumes<std::vector<Trajectory> >(pSet_.getParameter<edm::InputTag>("trajectoryInput"));
87  trackToken_ = consumes<std::vector<reco::Track> >(pSet_.getParameter<edm::InputTag>("trajectoryInput"));
88  trackAssociationToken_ = consumes<TrajTrackAssociationCollection>(pSet_.getParameter<edm::InputTag>("trajectoryInput"));
89  clustersrcToken_ = consumes<edmNew::DetSetVector<SiPixelCluster> >(pSet_.getParameter<edm::InputTag>("clustersrc"));
90 
91  LogInfo("PixelDQM") << "SiPixelTrackResidualSource constructor" << endl;
92  LogInfo ("PixelDQM") << "Mod/Lad/Lay/Phi " << modOn << "/" << ladOn << "/"
93  << layOn << "/" << phiOn << std::endl;
94  LogInfo ("PixelDQM") << "Blade/Disk/Ring" << bladeOn << "/" << diskOn << "/"
95  << ringOn << std::endl;
96 }
97 
98 
100  LogInfo("PixelDQM") << "SiPixelTrackResidualSource destructor" << endl;
101 
102  std::map<uint32_t,SiPixelTrackResidualModule*>::iterator struct_iter;
103  for (struct_iter = theSiPixelStructure.begin() ; struct_iter != theSiPixelStructure.end() ; struct_iter++){
104  delete struct_iter->second;
105  struct_iter->second = 0;
106  }
107 }
108 
110  LogInfo("PixelDQM") << "SiPixelTrackResidualSource beginJob()" << endl;
111  firstRun = true;
112  NTotal=0;
113  NLowProb=0;
114 }
115 
116 
118  LogInfo("PixelDQM") << "SiPixelTrackResidualSource beginRun()" << endl;
119 
120  if(firstRun){
121  // retrieve TrackerGeometry for pixel dets
123  iSetup.get<TrackerDigiGeometryRecord>().get(TG);
124  if (debug_) LogVerbatim("PixelDQM") << "TrackerGeometry "<< &(*TG) <<" size is "<< TG->dets().size() << endl;
125 
126  // build theSiPixelStructure with the pixel barrel and endcap dets from TrackerGeometry
127  for (TrackerGeometry::DetContainer::const_iterator pxb = TG->detsPXB().begin();
128  pxb!=TG->detsPXB().end(); pxb++) {
129  if (dynamic_cast<PixelGeomDetUnit const *>((*pxb))!=0) {
130  SiPixelTrackResidualModule* module = new SiPixelTrackResidualModule((*pxb)->geographicalId().rawId());
131  theSiPixelStructure.insert(pair<uint32_t, SiPixelTrackResidualModule*>((*pxb)->geographicalId().rawId(), module));
132  }
133  }
134  for (TrackerGeometry::DetContainer::const_iterator pxf = TG->detsPXF().begin();
135  pxf!=TG->detsPXF().end(); pxf++) {
136  if (dynamic_cast<PixelGeomDetUnit const *>((*pxf))!=0) {
137  SiPixelTrackResidualModule* module = new SiPixelTrackResidualModule((*pxf)->geographicalId().rawId());
138  theSiPixelStructure.insert(pair<uint32_t, SiPixelTrackResidualModule*>((*pxf)->geographicalId().rawId(), module));
139  }
140  }
141  LogInfo("PixelDQM") << "SiPixelStructure size is " << theSiPixelStructure.size() << endl;
142 
143  // book residual histograms in theSiPixelFolder - one (x,y) pair of histograms per det
144  SiPixelFolderOrganizer theSiPixelFolder;
145  for (std::map<uint32_t, SiPixelTrackResidualModule*>::iterator pxd = theSiPixelStructure.begin();
146  pxd!=theSiPixelStructure.end(); pxd++) {
147 
148  if(modOn){
149  if (theSiPixelFolder.setModuleFolder((*pxd).first,0,isUpgrade)) (*pxd).second->book(pSet_,reducedSet,0,isUpgrade);
150  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource Folder Creation Failed! ";
151  }
152  if(ladOn){
153  if (theSiPixelFolder.setModuleFolder((*pxd).first,1,isUpgrade)) {
154 
155  (*pxd).second->book(pSet_,reducedSet,1,isUpgrade);
156  }
157  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource ladder Folder Creation Failed! ";
158  }
159  if(layOn){
160  if (theSiPixelFolder.setModuleFolder((*pxd).first,2,isUpgrade)) (*pxd).second->book(pSet_,reducedSet,2,isUpgrade);
161  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource layer Folder Creation Failed! ";
162  }
163  if(phiOn){
164  if (theSiPixelFolder.setModuleFolder((*pxd).first,3,isUpgrade)) (*pxd).second->book(pSet_,reducedSet,3,isUpgrade);
165  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource phi Folder Creation Failed! ";
166  }
167  if(bladeOn){
168  if (theSiPixelFolder.setModuleFolder((*pxd).first,4,isUpgrade)) (*pxd).second->book(pSet_,reducedSet,4,isUpgrade);
169  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource Blade Folder Creation Failed! ";
170  }
171  if(diskOn){
172  if (theSiPixelFolder.setModuleFolder((*pxd).first,5,isUpgrade)) (*pxd).second->book(pSet_,reducedSet,5,isUpgrade);
173  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource Disk Folder Creation Failed! ";
174  }
175  if(ringOn){
176  if (theSiPixelFolder.setModuleFolder((*pxd).first,6,isUpgrade)) (*pxd).second->book(pSet_,reducedSet,6,isUpgrade);
177  else throw cms::Exception("LogicError") << "SiPixelTrackResidualSource Ring Folder Creation Failed! ";
178  }
179  }
180 
181 
182 // edm::InputTag tracksrc = pSet_.getParameter<edm::InputTag>("trajectoryInput");
183 // edm::InputTag clustersrc = pSet_.getParameter<edm::InputTag>("clustersrc");
184 
185  //number of tracks
186  dbe_->setCurrentFolder("Pixel/Tracks");
187  meNofTracks_ = dbe_->book1D("ntracks_" + tracksrc_.label(),"Number of Tracks",4,0,4);
188  meNofTracks_->setAxisTitle("Number of Tracks",1);
189  meNofTracks_->setBinLabel(1,"All");
190  meNofTracks_->setBinLabel(2,"Pixel");
191  meNofTracks_->setBinLabel(3,"BPix");
192  meNofTracks_->setBinLabel(4,"FPix");
193 
194  //number of tracks in pixel fiducial volume
195  dbe_->setCurrentFolder("Pixel/Tracks");
196  meNofTracksInPixVol_ = dbe_->book1D("ntracksInPixVol_" + tracksrc_.label(),"Number of Tracks crossing Pixel fiducial Volume",2,0,2);
197  meNofTracksInPixVol_->setAxisTitle("Number of Tracks",1);
198  meNofTracksInPixVol_->setBinLabel(1,"With Hits");
199  meNofTracksInPixVol_->setBinLabel(2,"Without Hits");
200 
201  //number of clusters (associated to track / not associated)
202  dbe_->setCurrentFolder("Pixel/Clusters/OnTrack");
203  meNofClustersOnTrack_ = dbe_->book1D("nclusters_" + clustersrc_.label() + "_tot","Number of Clusters (on track)",3,0,3);
204  meNofClustersOnTrack_->setAxisTitle("Number of Clusters on Track",1);
208  dbe_->setCurrentFolder("Pixel/Clusters/OffTrack");
209  meNofClustersNotOnTrack_ = dbe_->book1D("nclusters_" + clustersrc_.label() + "_tot","Number of Clusters (off track)",3,0,3);
210  meNofClustersNotOnTrack_->setAxisTitle("Number of Clusters off Track",1);
214 
215  //cluster charge and size
216  //charge
217  //on track
218  dbe_->setCurrentFolder("Pixel/Clusters/OnTrack");
219  meClChargeOnTrack_all = dbe_->book1D("charge_" + clustersrc_.label(),"Charge (on track)",500,0.,500.);
220  meClChargeOnTrack_all->setAxisTitle("Charge size (in ke)",1);
221  meClChargeOnTrack_bpix = dbe_->book1D("charge_" + clustersrc_.label() + "_Barrel","Charge (on track, barrel)",500,0.,500.);
222  meClChargeOnTrack_bpix->setAxisTitle("Charge size (in ke)",1);
223  meClChargeOnTrack_fpix = dbe_->book1D("charge_" + clustersrc_.label() + "_Endcap","Charge (on track, endcap)",500,0.,500.);
224  meClChargeOnTrack_fpix->setAxisTitle("Charge size (in ke)",1);
225  meClChargeOnTrack_layer1 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_1","Charge (on track, layer1)",500,0.,500.);
226  meClChargeOnTrack_layer1->setAxisTitle("Charge size (in ke)",1);
227  meClChargeOnTrack_layer2 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_2","Charge (on track, layer2)",500,0.,500.);
228  meClChargeOnTrack_layer2->setAxisTitle("Charge size (in ke)",1);
229  meClChargeOnTrack_layer3 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_3","Charge (on track, layer3)",500,0.,500.);
230  meClChargeOnTrack_layer3->setAxisTitle("Charge size (in ke)",1);
231  if (isUpgrade) {
232  meClChargeOnTrack_layer4 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_4","Charge (on track, layer4)",500,0.,500.);
233  meClChargeOnTrack_layer4->setAxisTitle("Charge size (in ke)",1);
234  }
235  meClChargeOnTrack_diskp1 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_p1","Charge (on track, diskp1)",500,0.,500.);
236  meClChargeOnTrack_diskp1->setAxisTitle("Charge size (in ke)",1);
237  meClChargeOnTrack_diskp2 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_p2","Charge (on track, diskp2)",500,0.,500.);
238  meClChargeOnTrack_diskp2->setAxisTitle("Charge size (in ke)",1);
239  if (isUpgrade) {
240  meClChargeOnTrack_diskp3 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_p3","Charge (on track, diskp3)",500,0.,500.);
241  meClChargeOnTrack_diskp3->setAxisTitle("Charge size (in ke)",1);
242  }
243  meClChargeOnTrack_diskm1 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_m1","Charge (on track, diskm1)",500,0.,500.);
244  meClChargeOnTrack_diskm1->setAxisTitle("Charge size (in ke)",1);
245  meClChargeOnTrack_diskm2 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_m2","Charge (on track, diskm2)",500,0.,500.);
246  meClChargeOnTrack_diskm2->setAxisTitle("Charge size (in ke)",1);
247  if (isUpgrade) {
248  meClChargeOnTrack_diskm3 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_m3","Charge (on track, diskm3)",500,0.,500.);
249  meClChargeOnTrack_diskm3->setAxisTitle("Charge size (in ke)",1);
250  }
251  //off track
252  dbe_->setCurrentFolder("Pixel/Clusters/OffTrack");
253  meClChargeNotOnTrack_all = dbe_->book1D("charge_" + clustersrc_.label(),"Charge (off track)",500,0.,500.);
254  meClChargeNotOnTrack_all->setAxisTitle("Charge size (in ke)",1);
255  meClChargeNotOnTrack_bpix = dbe_->book1D("charge_" + clustersrc_.label() + "_Barrel","Charge (off track, barrel)",500,0.,500.);
256  meClChargeNotOnTrack_bpix->setAxisTitle("Charge size (in ke)",1);
257  meClChargeNotOnTrack_fpix = dbe_->book1D("charge_" + clustersrc_.label() + "_Endcap","Charge (off track, endcap)",500,0.,500.);
258  meClChargeNotOnTrack_fpix->setAxisTitle("Charge size (in ke)",1);
259  meClChargeNotOnTrack_layer1 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_1","Charge (off track, layer1)",500,0.,500.);
260  meClChargeNotOnTrack_layer1->setAxisTitle("Charge size (in ke)",1);
261  meClChargeNotOnTrack_layer2 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_2","Charge (off track, layer2)",500,0.,500.);
262  meClChargeNotOnTrack_layer2->setAxisTitle("Charge size (in ke)",1);
263  meClChargeNotOnTrack_layer3 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_3","Charge (off track, layer3)",500,0.,500.);
264  meClChargeNotOnTrack_layer3->setAxisTitle("Charge size (in ke)",1);
265  if (isUpgrade) {
266  meClChargeNotOnTrack_layer4 = dbe_->book1D("charge_" + clustersrc_.label() + "_Layer_4","Charge (off track, layer4)",500,0.,500.);
267  meClChargeNotOnTrack_layer4->setAxisTitle("Charge size (in ke)",1);
268  }
269  meClChargeNotOnTrack_diskp1 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_p1","Charge (off track, diskp1)",500,0.,500.);
270  meClChargeNotOnTrack_diskp1->setAxisTitle("Charge size (in ke)",1);
271  meClChargeNotOnTrack_diskp2 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_p2","Charge (off track, diskp2)",500,0.,500.);
272  meClChargeNotOnTrack_diskp2->setAxisTitle("Charge size (in ke)",1);
273  if (isUpgrade) {
274  meClChargeNotOnTrack_diskp3 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_p3","Charge (off track, diskp3)",500,0.,500.);
275  meClChargeNotOnTrack_diskp3->setAxisTitle("Charge size (in ke)",1);
276  }
277  meClChargeNotOnTrack_diskm1 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_m1","Charge (off track, diskm1)",500,0.,500.);
278  meClChargeNotOnTrack_diskm1->setAxisTitle("Charge size (in ke)",1);
279  meClChargeNotOnTrack_diskm2 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_m2","Charge (off track, diskm2)",500,0.,500.);
280  meClChargeNotOnTrack_diskm2->setAxisTitle("Charge size (in ke)",1);
281  if (isUpgrade) {
282  meClChargeNotOnTrack_diskm3 = dbe_->book1D("charge_" + clustersrc_.label() + "_Disk_m3","Charge (off track, diskm3)",500,0.,500.);
283  meClChargeNotOnTrack_diskm3->setAxisTitle("Charge size (in ke)",1);
284  }
285 
286  //size
287  //on track
288  dbe_->setCurrentFolder("Pixel/Clusters/OnTrack");
289  meClSizeOnTrack_all = dbe_->book1D("size_" + clustersrc_.label(),"Size (on track)",100,0.,100.);
290  meClSizeOnTrack_all->setAxisTitle("Cluster size (in pixels)",1);
291  meClSizeOnTrack_bpix = dbe_->book1D("size_" + clustersrc_.label() + "_Barrel","Size (on track, barrel)",100,0.,100.);
292  meClSizeOnTrack_bpix->setAxisTitle("Cluster size (in pixels)",1);
293  meClSizeOnTrack_fpix = dbe_->book1D("size_" + clustersrc_.label() + "_Endcap","Size (on track, endcap)",100,0.,100.);
294  meClSizeOnTrack_fpix->setAxisTitle("Cluster size (in pixels)",1);
295  meClSizeOnTrack_layer1 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_1","Size (on track, layer1)",100,0.,100.);
296  meClSizeOnTrack_layer1->setAxisTitle("Cluster size (in pixels)",1);
297  meClSizeOnTrack_layer2 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_2","Size (on track, layer2)",100,0.,100.);
298  meClSizeOnTrack_layer2->setAxisTitle("Cluster size (in pixels)",1);
299  meClSizeOnTrack_layer3 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_3","Size (on track, layer3)",100,0.,100.);
300  meClSizeOnTrack_layer3->setAxisTitle("Cluster size (in pixels)",1);
301  if (isUpgrade) {
302  meClSizeOnTrack_layer4 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_4","Size (on track, layer4)",100,0.,100.);
303  meClSizeOnTrack_layer4->setAxisTitle("Cluster size (in pixels)",1);
304  }
305  meClSizeOnTrack_diskp1 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_p1","Size (on track, diskp1)",100,0.,100.);
306  meClSizeOnTrack_diskp1->setAxisTitle("Cluster size (in pixels)",1);
307  meClSizeOnTrack_diskp2 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_p2","Size (on track, diskp2)",100,0.,100.);
308  meClSizeOnTrack_diskp2->setAxisTitle("Cluster size (in pixels)",1);
309  if (isUpgrade) {
310  meClSizeOnTrack_diskp3 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_p3","Size (on track, diskp3)",100,0.,100.);
311  meClSizeOnTrack_diskp3->setAxisTitle("Cluster size (in pixels)",1);
312  }
313  meClSizeOnTrack_diskm1 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_m1","Size (on track, diskm1)",100,0.,100.);
314  meClSizeOnTrack_diskm1->setAxisTitle("Cluster size (in pixels)",1);
315  meClSizeOnTrack_diskm2 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_m2","Size (on track, diskm2)",100,0.,100.);
316  meClSizeOnTrack_diskm2->setAxisTitle("Cluster size (in pixels)",1);
317  if (isUpgrade) {
318  meClSizeOnTrack_diskm3 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_m3","Size (on track, diskm3)",100,0.,100.);
319  meClSizeOnTrack_diskm3->setAxisTitle("Cluster size (in pixels)",1);
320  }
321  meClSizeXOnTrack_all = dbe_->book1D("sizeX_" + clustersrc_.label(),"SizeX (on track)",100,0.,100.);
322  meClSizeXOnTrack_all->setAxisTitle("Cluster sizeX (in pixels)",1);
323  meClSizeXOnTrack_bpix = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Barrel","SizeX (on track, barrel)",100,0.,100.);
324  meClSizeXOnTrack_bpix->setAxisTitle("Cluster sizeX (in pixels)",1);
325  meClSizeXOnTrack_fpix = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Endcap","SizeX (on track, endcap)",100,0.,100.);
326  meClSizeXOnTrack_fpix->setAxisTitle("Cluster sizeX (in pixels)",1);
327  meClSizeXOnTrack_layer1 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_1","SizeX (on track, layer1)",100,0.,100.);
328  meClSizeXOnTrack_layer1->setAxisTitle("Cluster size (in pixels)",1);
329  meClSizeXOnTrack_layer2 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_2","SizeX (on track, layer2)",100,0.,100.);
330  meClSizeXOnTrack_layer2->setAxisTitle("Cluster size (in pixels)",1);
331  meClSizeXOnTrack_layer3 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_3","SizeX (on track, layer3)",100,0.,100.);
332  meClSizeXOnTrack_layer3->setAxisTitle("Cluster size (in pixels)",1);
333  if (isUpgrade) {
334  meClSizeXOnTrack_layer4 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_4","SizeX (on track, layer4)",100,0.,100.);
335  meClSizeXOnTrack_layer4->setAxisTitle("Cluster size (in pixels)",1);
336  }
337  meClSizeXOnTrack_diskp1 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_p1","SizeX (on track, diskp1)",100,0.,100.);
338  meClSizeXOnTrack_diskp1->setAxisTitle("Cluster size (in pixels)",1);
339  meClSizeXOnTrack_diskp2 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_p2","SizeX (on track, diskp2)",100,0.,100.);
340  meClSizeXOnTrack_diskp2->setAxisTitle("Cluster size (in pixels)",1);
341  if (isUpgrade) {
342  meClSizeXOnTrack_diskp3 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_p3","SizeX (on track, diskp3)",100,0.,100.);
343  meClSizeXOnTrack_diskp3->setAxisTitle("Cluster size (in pixels)",1);
344  }
345  meClSizeXOnTrack_diskm1 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_m1","SizeX (on track, diskm1)",100,0.,100.);
346  meClSizeXOnTrack_diskm1->setAxisTitle("Cluster size (in pixels)",1);
347  meClSizeXOnTrack_diskm2 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_m2","SizeX (on track, diskm2)",100,0.,100.);
348  meClSizeXOnTrack_diskm2->setAxisTitle("Cluster size (in pixels)",1);
349  if (isUpgrade) {
350  meClSizeXOnTrack_diskm3 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_m3","SizeX (on track, diskm3)",100,0.,100.);
351  meClSizeXOnTrack_diskm3->setAxisTitle("Cluster size (in pixels)",1);
352  }
353  meClSizeYOnTrack_all = dbe_->book1D("sizeY_" + clustersrc_.label(),"SizeY (on track)",100,0.,100.);
354  meClSizeYOnTrack_all->setAxisTitle("Cluster sizeY (in pixels)",1);
355  meClSizeYOnTrack_bpix = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Barrel","SizeY (on track, barrel)",100,0.,100.);
356  meClSizeYOnTrack_bpix->setAxisTitle("Cluster sizeY (in pixels)",1);
357  meClSizeYOnTrack_fpix = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Endcap","SizeY (on track, endcap)",100,0.,100.);
358  meClSizeYOnTrack_fpix->setAxisTitle("Cluster sizeY (in pixels)",1);
359  meClSizeYOnTrack_layer1 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_1","SizeY (on track, layer1)",100,0.,100.);
360  meClSizeYOnTrack_layer1->setAxisTitle("Cluster size (in pixels)",1);
361  meClSizeYOnTrack_layer2 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_2","SizeY (on track, layer2)",100,0.,100.);
362  meClSizeYOnTrack_layer2->setAxisTitle("Cluster size (in pixels)",1);
363  meClSizeYOnTrack_layer3 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_3","SizeY (on track, layer3)",100,0.,100.);
364  meClSizeYOnTrack_layer3->setAxisTitle("Cluster size (in pixels)",1);
365  if (isUpgrade) {
366  meClSizeYOnTrack_layer4 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_4","SizeY (on track, layer4)",100,0.,100.);
367  meClSizeYOnTrack_layer4->setAxisTitle("Cluster size (in pixels)",1);
368  }
369  meClSizeYOnTrack_diskp1 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_p1","SizeY (on track, diskp1)",100,0.,100.);
370  meClSizeYOnTrack_diskp1->setAxisTitle("Cluster size (in pixels)",1);
371  meClSizeYOnTrack_diskp2 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_p2","SizeY (on track, diskp2)",100,0.,100.);
372  meClSizeYOnTrack_diskp2->setAxisTitle("Cluster size (in pixels)",1);
373  if (isUpgrade) {
374  meClSizeYOnTrack_diskp3 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_p3","SizeY (on track, diskp3)",100,0.,100.);
375  meClSizeYOnTrack_diskp3->setAxisTitle("Cluster size (in pixels)",1);
376  }
377  meClSizeYOnTrack_diskm1 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_m1","SizeY (on track, diskm1)",100,0.,100.);
378  meClSizeYOnTrack_diskm1->setAxisTitle("Cluster size (in pixels)",1);
379  meClSizeYOnTrack_diskm2 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_m2","SizeY (on track, diskm2)",100,0.,100.);
380  meClSizeYOnTrack_diskm2->setAxisTitle("Cluster size (in pixels)",1);
381  if (isUpgrade) {
382  meClSizeYOnTrack_diskm3 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_m3","SizeY (on track, diskm3)",100,0.,100.);
383  meClSizeYOnTrack_diskm3->setAxisTitle("Cluster size (in pixels)",1);
384  }
385  //off track
386  dbe_->setCurrentFolder("Pixel/Clusters/OffTrack");
387  meClSizeNotOnTrack_all = dbe_->book1D("size_" + clustersrc_.label(),"Size (off track)",100,0.,100.);
388  meClSizeNotOnTrack_all->setAxisTitle("Cluster size (in pixels)",1);
389  meClSizeNotOnTrack_bpix = dbe_->book1D("size_" + clustersrc_.label() + "_Barrel","Size (off track, barrel)",100,0.,100.);
390  meClSizeNotOnTrack_bpix->setAxisTitle("Cluster size (in pixels)",1);
391  meClSizeNotOnTrack_fpix = dbe_->book1D("size_" + clustersrc_.label() + "_Endcap","Size (off track, endcap)",100,0.,100.);
392  meClSizeNotOnTrack_fpix->setAxisTitle("Cluster size (in pixels)",1);
393  meClSizeNotOnTrack_layer1 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_1","Size (off track, layer1)",100,0.,100.);
394  meClSizeNotOnTrack_layer1->setAxisTitle("Cluster size (in pixels)",1);
395  meClSizeNotOnTrack_layer2 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_2","Size (off track, layer2)",100,0.,100.);
396  meClSizeNotOnTrack_layer2->setAxisTitle("Cluster size (in pixels)",1);
397  meClSizeNotOnTrack_layer3 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_3","Size (off track, layer3)",100,0.,100.);
398  meClSizeNotOnTrack_layer3->setAxisTitle("Cluster size (in pixels)",1);
399  if (isUpgrade) {
400  meClSizeNotOnTrack_layer4 = dbe_->book1D("size_" + clustersrc_.label() + "_Layer_4","Size (off track, layer4)",100,0.,100.);
401  meClSizeNotOnTrack_layer4->setAxisTitle("Cluster size (in pixels)",1);
402  }
403  meClSizeNotOnTrack_diskp1 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_p1","Size (off track, diskp1)",100,0.,100.);
404  meClSizeNotOnTrack_diskp1->setAxisTitle("Cluster size (in pixels)",1);
405  meClSizeNotOnTrack_diskp2 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_p2","Size (off track, diskp2)",100,0.,100.);
406  meClSizeNotOnTrack_diskp2->setAxisTitle("Cluster size (in pixels)",1);
407  if (isUpgrade) {
408  meClSizeNotOnTrack_diskp3 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_p3","Size (off track, diskp3)",100,0.,100.);
409  meClSizeNotOnTrack_diskp3->setAxisTitle("Cluster size (in pixels)",1);
410  }
411  meClSizeNotOnTrack_diskm1 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_m1","Size (off track, diskm1)",100,0.,100.);
412  meClSizeNotOnTrack_diskm1->setAxisTitle("Cluster size (in pixels)",1);
413  meClSizeNotOnTrack_diskm2 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_m2","Size (off track, diskm2)",100,0.,100.);
414  meClSizeNotOnTrack_diskm2->setAxisTitle("Cluster size (in pixels)",1);
415  if (isUpgrade) {
416  meClSizeNotOnTrack_diskm3 = dbe_->book1D("size_" + clustersrc_.label() + "_Disk_m3","Size (off track, diskm3)",100,0.,100.);
417  meClSizeNotOnTrack_diskm3->setAxisTitle("Cluster size (in pixels)",1);
418  }
419  meClSizeXNotOnTrack_all = dbe_->book1D("sizeX_" + clustersrc_.label(),"SizeX (off track)",100,0.,100.);
420  meClSizeXNotOnTrack_all->setAxisTitle("Cluster sizeX (in pixels)",1);
421  meClSizeXNotOnTrack_bpix = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Barrel","SizeX (off track, barrel)",100,0.,100.);
422  meClSizeXNotOnTrack_bpix->setAxisTitle("Cluster sizeX (in pixels)",1);
423  meClSizeXNotOnTrack_fpix = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Endcap","SizeX (off track, endcap)",100,0.,100.);
424  meClSizeXNotOnTrack_fpix->setAxisTitle("Cluster sizeX (in pixels)",1);
425  meClSizeXNotOnTrack_layer1 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_1","SizeX (off track, layer1)",100,0.,100.);
426  meClSizeXNotOnTrack_layer1->setAxisTitle("Cluster size (in pixels)",1);
427  meClSizeXNotOnTrack_layer2 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_2","SizeX (off track, layer2)",100,0.,100.);
428  meClSizeXNotOnTrack_layer2->setAxisTitle("Cluster size (in pixels)",1);
429  meClSizeXNotOnTrack_layer3 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_3","SizeX (off track, layer3)",100,0.,100.);
430  meClSizeXNotOnTrack_layer3->setAxisTitle("Cluster size (in pixels)",1);
431  if (isUpgrade) {
432  meClSizeXNotOnTrack_layer4 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Layer_4","SizeX (off track, layer4)",100,0.,100.);
433  meClSizeXNotOnTrack_layer4->setAxisTitle("Cluster size (in pixels)",1);
434  }
435  meClSizeXNotOnTrack_diskp1 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_p1","SizeX (off track, diskp1)",100,0.,100.);
436  meClSizeXNotOnTrack_diskp1->setAxisTitle("Cluster size (in pixels)",1);
437  meClSizeXNotOnTrack_diskp2 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_p2","SizeX (off track, diskp2)",100,0.,100.);
438  meClSizeXNotOnTrack_diskp2->setAxisTitle("Cluster size (in pixels)",1);
439  if (isUpgrade) {
440  meClSizeXNotOnTrack_diskp3 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_p3","SizeX (off track, diskp3)",100,0.,100.);
441  meClSizeXNotOnTrack_diskp3->setAxisTitle("Cluster size (in pixels)",1);
442  }
443  meClSizeXNotOnTrack_diskm1 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_m1","SizeX (off track, diskm1)",100,0.,100.);
444  meClSizeXNotOnTrack_diskm1->setAxisTitle("Cluster size (in pixels)",1);
445  meClSizeXNotOnTrack_diskm2 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_m2","SizeX (off track, diskm2)",100,0.,100.);
446  meClSizeXNotOnTrack_diskm2->setAxisTitle("Cluster size (in pixels)",1);
447  if (isUpgrade) {
448  meClSizeXNotOnTrack_diskm3 = dbe_->book1D("sizeX_" + clustersrc_.label() + "_Disk_m3","SizeX (off track, diskm3)",100,0.,100.);
449  meClSizeXNotOnTrack_diskm3->setAxisTitle("Cluster size (in pixels)",1);
450  }
451  meClSizeYNotOnTrack_all = dbe_->book1D("sizeY_" + clustersrc_.label(),"SizeY (off track)",100,0.,100.);
452  meClSizeYNotOnTrack_all->setAxisTitle("Cluster sizeY (in pixels)",1);
453  meClSizeYNotOnTrack_bpix = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Barrel","SizeY (off track, barrel)",100,0.,100.);
454  meClSizeYNotOnTrack_bpix->setAxisTitle("Cluster sizeY (in pixels)",1);
455  meClSizeYNotOnTrack_fpix = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Endcap","SizeY (off track, endcap)",100,0.,100.);
456  meClSizeYNotOnTrack_fpix->setAxisTitle("Cluster sizeY (in pixels)",1);
457  meClSizeYNotOnTrack_layer1 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_1","SizeY (off track, layer1)",100,0.,100.);
458  meClSizeYNotOnTrack_layer1->setAxisTitle("Cluster size (in pixels)",1);
459  meClSizeYNotOnTrack_layer2 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_2","SizeY (off track, layer2)",100,0.,100.);
460  meClSizeYNotOnTrack_layer2->setAxisTitle("Cluster size (in pixels)",1);
461  meClSizeYNotOnTrack_layer3 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_3","SizeY (off track, layer3)",100,0.,100.);
462  meClSizeYNotOnTrack_layer3->setAxisTitle("Cluster size (in pixels)",1);
463  if (isUpgrade) {
464  meClSizeYNotOnTrack_layer4 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Layer_4","SizeY (off track, layer4)",100,0.,100.);
465  meClSizeYNotOnTrack_layer4->setAxisTitle("Cluster size (in pixels)",1);
466  }
467  meClSizeYNotOnTrack_diskp1 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_p1","SizeY (off track, diskp1)",100,0.,100.);
468  meClSizeYNotOnTrack_diskp1->setAxisTitle("Cluster size (in pixels)",1);
469  meClSizeYNotOnTrack_diskp2 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_p2","SizeY (off track, diskp2)",100,0.,100.);
470  meClSizeYNotOnTrack_diskp2->setAxisTitle("Cluster size (in pixels)",1);
471  if (isUpgrade) {
472  meClSizeYNotOnTrack_diskp3 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_p3","SizeY (off track, diskp3)",100,0.,100.);
473  meClSizeYNotOnTrack_diskp3->setAxisTitle("Cluster size (in pixels)",1);
474  }
475  meClSizeYNotOnTrack_diskm1 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_m1","SizeY (off track, diskm1)",100,0.,100.);
476  meClSizeYNotOnTrack_diskm1->setAxisTitle("Cluster size (in pixels)",1);
477  meClSizeYNotOnTrack_diskm2 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_m2","SizeY (off track, diskm2)",100,0.,100.);
478  meClSizeYNotOnTrack_diskm2->setAxisTitle("Cluster size (in pixels)",1);
479  if (isUpgrade) {
480  meClSizeYNotOnTrack_diskm3 = dbe_->book1D("sizeY_" + clustersrc_.label() + "_Disk_m3","SizeY (off track, diskm3)",100,0.,100.);
481  meClSizeYNotOnTrack_diskm3->setAxisTitle("Cluster size (in pixels)",1);
482  }
483 
484  //cluster global position
485  //on track
486  dbe_->setCurrentFolder("Pixel/Clusters/OnTrack");
487  //bpix
488  meClPosLayer1OnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_1","Clusters Layer1 (on track)",200,-30.,30.,128,-3.2,3.2);
489  meClPosLayer1OnTrack->setAxisTitle("Global Z (cm)",1);
490  meClPosLayer1OnTrack->setAxisTitle("Global #phi",2);
491  meClPosLayer2OnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_2","Clusters Layer2 (on track)",200,-30.,30.,128,-3.2,3.2);
492  meClPosLayer2OnTrack->setAxisTitle("Global Z (cm)",1);
493  meClPosLayer2OnTrack->setAxisTitle("Global #phi",2);
494  meClPosLayer3OnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_3","Clusters Layer3 (on track)",200,-30.,30.,128,-3.2,3.2);
495  meClPosLayer3OnTrack->setAxisTitle("Global Z (cm)",1);
496  meClPosLayer3OnTrack->setAxisTitle("Global #phi",2);
497  if (isUpgrade) {
498  meClPosLayer4OnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_4","Clusters Layer4 (on track)",200,-30.,30.,128,-3.2,3.2);
499  meClPosLayer4OnTrack->setAxisTitle("Global Z (cm)",1);
500  meClPosLayer4OnTrack->setAxisTitle("Global #phi",2);
501  }
502  //fpix
503  meClPosDisk1pzOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_pz_Disk_1","Clusters +Z Disk1 (on track)",80,-20.,20.,80,-20.,20.);
504  meClPosDisk1pzOnTrack->setAxisTitle("Global X (cm)",1);
505  meClPosDisk1pzOnTrack->setAxisTitle("Global Y (cm)",2);
506  meClPosDisk2pzOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_pz_Disk_2","Clusters +Z Disk2 (on track)",80,-20.,20.,80,-20.,20.);
507  meClPosDisk2pzOnTrack->setAxisTitle("Global X (cm)",1);
508  meClPosDisk2pzOnTrack->setAxisTitle("Global Y (cm)",2);
509  if (isUpgrade) {
510  meClPosDisk3pzOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_pz_Disk_3","Clusters +Z Disk3 (on track)",80,-20.,20.,80,-20.,20.);
511  meClPosDisk3pzOnTrack->setAxisTitle("Global X (cm)",1);
512  meClPosDisk3pzOnTrack->setAxisTitle("Global Y (cm)",2);
513  }
514  meClPosDisk1mzOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_mz_Disk_1","Clusters -Z Disk1 (on track)",80,-20.,20.,80,-20.,20.);
515  meClPosDisk1mzOnTrack->setAxisTitle("Global X (cm)",1);
516  meClPosDisk1mzOnTrack->setAxisTitle("Global Y (cm)",2);
517  meClPosDisk2mzOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_mz_Disk_2","Clusters -Z Disk2 (on track)",80,-20.,20.,80,-20.,20.);
518  meClPosDisk2mzOnTrack->setAxisTitle("Global X (cm)",1);
519  meClPosDisk2mzOnTrack->setAxisTitle("Global Y (cm)",2);
520  if (isUpgrade) {
521  meClPosDisk3mzOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_mz_Disk_3","Clusters -Z Disk3 (on track)",80,-20.,20.,80,-20.,20.);
522  meClPosDisk3mzOnTrack->setAxisTitle("Global X (cm)",1);
523  meClPosDisk3mzOnTrack->setAxisTitle("Global Y (cm)",2);
524  }
525  meNClustersOnTrack_all = dbe_->book1D("nclusters_" + clustersrc_.label(),"Number of Clusters (on Track)",50,0.,50.);
526  meNClustersOnTrack_all->setAxisTitle("Number of Clusters",1);
527  meNClustersOnTrack_bpix = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Barrel","Number of Clusters (on track, barrel)",50,0.,50.);
528  meNClustersOnTrack_bpix->setAxisTitle("Number of Clusters",1);
529  meNClustersOnTrack_fpix = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Endcap","Number of Clusters (on track, endcap)",50,0.,50.);
530  meNClustersOnTrack_fpix->setAxisTitle("Number of Clusters",1);
531  meNClustersOnTrack_layer1 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_1","Number of Clusters (on track, layer1)",50,0.,50.);
532  meNClustersOnTrack_layer1->setAxisTitle("Number of Clusters",1);
533  meNClustersOnTrack_layer2 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_2","Number of Clusters (on track, layer2)",50,0.,50.);
534  meNClustersOnTrack_layer2->setAxisTitle("Number of Clusters",1);
535  meNClustersOnTrack_layer3 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_3","Number of Clusters (on track, layer3)",50,0.,50.);
536  meNClustersOnTrack_layer3->setAxisTitle("Number of Clusters",1);
537  if (isUpgrade) {
538  meNClustersOnTrack_layer4 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_4","Number of Clusters (on track, layer4)",50,0.,50.);
539  meNClustersOnTrack_layer4->setAxisTitle("Number of Clusters",1);
540  }
541  meNClustersOnTrack_diskp1 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_p1","Number of Clusters (on track, diskp1)",50,0.,50.);
542  meNClustersOnTrack_diskp1->setAxisTitle("Number of Clusters",1);
543  meNClustersOnTrack_diskp2 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_p2","Number of Clusters (on track, diskp2)",50,0.,50.);
544  meNClustersOnTrack_diskp2->setAxisTitle("Number of Clusters",1);
545  if (isUpgrade) {
546  meNClustersOnTrack_diskp3 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_p3","Number of Clusters (on track, diskp3)",50,0.,50.);
547  meNClustersOnTrack_diskp3->setAxisTitle("Number of Clusters",1);
548  }
549  meNClustersOnTrack_diskm1 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_m1","Number of Clusters (on track, diskm1)",50,0.,50.);
550  meNClustersOnTrack_diskm1->setAxisTitle("Number of Clusters",1);
551  meNClustersOnTrack_diskm2 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_m2","Number of Clusters (on track, diskm2)",50,0.,50.);
552  meNClustersOnTrack_diskm2->setAxisTitle("Number of Clusters",1);
553  if (isUpgrade) {
554  meNClustersOnTrack_diskm3 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_m3","Number of Clusters (on track, diskm3)",50,0.,50.);
555  meNClustersOnTrack_diskm3->setAxisTitle("Number of Clusters",1);
556  }
557 
558  //not on track
559  dbe_->setCurrentFolder("Pixel/Clusters/OffTrack");
560  //bpix
561  meClPosLayer1NotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_1","Clusters Layer1 (off track)",200,-30.,30.,128,-3.2,3.2);
562  meClPosLayer1NotOnTrack->setAxisTitle("Global Z (cm)",1);
563  meClPosLayer1NotOnTrack->setAxisTitle("Global #phi",2);
564  meClPosLayer2NotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_2","Clusters Layer2 (off track)",200,-30.,30.,128,-3.2,3.2);
565  meClPosLayer2NotOnTrack->setAxisTitle("Global Z (cm)",1);
566  meClPosLayer2NotOnTrack->setAxisTitle("Global #phi",2);
567  meClPosLayer3NotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_3","Clusters Layer3 (off track)",200,-30.,30.,128,-3.2,3.2);
568  meClPosLayer3NotOnTrack->setAxisTitle("Global Z (cm)",1);
569  meClPosLayer3NotOnTrack->setAxisTitle("Global #phi",2);
570  if (isUpgrade) {
571  meClPosLayer4NotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_Layer_4","Clusters Layer4 (off track)",200,-30.,30.,128,-3.2,3.2);
572  meClPosLayer4NotOnTrack->setAxisTitle("Global Z (cm)",1);
573  meClPosLayer4NotOnTrack->setAxisTitle("Global #phi",2);
574  }
575  //fpix
576  meClPosDisk1pzNotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_pz_Disk_1","Clusters +Z Disk1 (off track)",80,-20.,20.,80,-20.,20.);
577  meClPosDisk1pzNotOnTrack->setAxisTitle("Global X (cm)",1);
578  meClPosDisk1pzNotOnTrack->setAxisTitle("Global Y (cm)",2);
579  meClPosDisk2pzNotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_pz_Disk_2","Clusters +Z Disk2 (off track)",80,-20.,20.,80,-20.,20.);
580  meClPosDisk2pzNotOnTrack->setAxisTitle("Global X (cm)",1);
581  meClPosDisk2pzNotOnTrack->setAxisTitle("Global Y (cm)",2);
582  if (isUpgrade) {
583  meClPosDisk3pzNotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_pz_Disk_3","Clusters +Z Disk3 (off track)",80,-20.,20.,80,-20.,20.);
584  meClPosDisk3pzNotOnTrack->setAxisTitle("Global X (cm)",1);
585  meClPosDisk3pzNotOnTrack->setAxisTitle("Global Y (cm)",2);
586  }
587  meClPosDisk1mzNotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_mz_Disk_1","Clusters -Z Disk1 (off track)",80,-20.,20.,80,-20.,20.);
588  meClPosDisk1mzNotOnTrack->setAxisTitle("Global X (cm)",1);
589  meClPosDisk1mzNotOnTrack->setAxisTitle("Global Y (cm)",2);
590  meClPosDisk2mzNotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_mz_Disk_2","Clusters -Z Disk2 (off track)",80,-20.,20.,80,-20.,20.);
591  meClPosDisk2mzNotOnTrack->setAxisTitle("Global X (cm)",1);
592  meClPosDisk2mzNotOnTrack->setAxisTitle("Global Y (cm)",2);
593  if (isUpgrade) {
594  meClPosDisk3mzNotOnTrack = dbe_->book2D("position_" + clustersrc_.label() + "_mz_Disk_3","Clusters -Z Disk3 (off track)",80,-20.,20.,80,-20.,20.);
595  meClPosDisk3mzNotOnTrack->setAxisTitle("Global X (cm)",1);
596  meClPosDisk3mzNotOnTrack->setAxisTitle("Global Y (cm)",2);
597  }
598  meNClustersNotOnTrack_all = dbe_->book1D("nclusters_" + clustersrc_.label(),"Number of Clusters (off Track)",50,0.,50.);
599  meNClustersNotOnTrack_all->setAxisTitle("Number of Clusters",1);
600  meNClustersNotOnTrack_bpix = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Barrel","Number of Clusters (off track, barrel)",50,0.,50.);
601  meNClustersNotOnTrack_bpix->setAxisTitle("Number of Clusters",1);
602  meNClustersNotOnTrack_fpix = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Endcap","Number of Clusters (off track, endcap)",50,0.,50.);
603  meNClustersNotOnTrack_fpix->setAxisTitle("Number of Clusters",1);
604  meNClustersNotOnTrack_layer1 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_1","Number of Clusters (off track, layer1)",50,0.,50.);
605  meNClustersNotOnTrack_layer1->setAxisTitle("Number of Clusters",1);
606  meNClustersNotOnTrack_layer2 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_2","Number of Clusters (off track, layer2)",50,0.,50.);
607  meNClustersNotOnTrack_layer2->setAxisTitle("Number of Clusters",1);
608  meNClustersNotOnTrack_layer3 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_3","Number of Clusters (off track, layer3)",50,0.,50.);
609  meNClustersNotOnTrack_layer3->setAxisTitle("Number of Clusters",1);
610  if (isUpgrade) {
611  meNClustersNotOnTrack_layer4 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Layer_4","Number of Clusters (off track, layer4)",50,0.,50.);
612  meNClustersNotOnTrack_layer4->setAxisTitle("Number of Clusters",1);
613  }
614  meNClustersNotOnTrack_diskp1 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_p1","Number of Clusters (off track, diskp1)",50,0.,50.);
615  meNClustersNotOnTrack_diskp1->setAxisTitle("Number of Clusters",1);
616  meNClustersNotOnTrack_diskp2 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_p2","Number of Clusters (off track, diskp2)",50,0.,50.);
617  meNClustersNotOnTrack_diskp2->setAxisTitle("Number of Clusters",1);
618  if (isUpgrade) {
619  meNClustersNotOnTrack_diskp3 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_p3","Number of Clusters (off track, diskp3)",50,0.,50.);
620  meNClustersNotOnTrack_diskp3->setAxisTitle("Number of Clusters",1);
621  }
622  meNClustersNotOnTrack_diskm1 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_m1","Number of Clusters (off track, diskm1)",50,0.,50.);
623  meNClustersNotOnTrack_diskm1->setAxisTitle("Number of Clusters",1);
624  meNClustersNotOnTrack_diskm2 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_m2","Number of Clusters (off track, diskm2)",50,0.,50.);
625  meNClustersNotOnTrack_diskm2->setAxisTitle("Number of Clusters",1);
626  if (isUpgrade) {
627  meNClustersNotOnTrack_diskm3 = dbe_->book1D("nclusters_" + clustersrc_.label() + "_Disk_m3","Number of Clusters (off track, diskm3)",50,0.,50.);
628  meNClustersNotOnTrack_diskm3->setAxisTitle("Number of Clusters",1);
629  }
630 
631  //HitProbability
632  //on track
633  dbe_->setCurrentFolder("Pixel/Clusters/OnTrack");
634  meHitProbability = dbe_->book1D("FractionLowProb","Fraction of hits with low probability;FractionLowProb;#HitsOnTrack",100,0.,1.);
635 
636  if (debug_) {
637  // book summary residual histograms in a debugging folder - one (x,y) pair of histograms per subdetector
638  dbe_->setCurrentFolder("debugging");
639  char hisID[80];
640  for (int s=0; s<3; s++) {
641  sprintf(hisID,"residual_x_subdet_%i",s);
642  meSubdetResidualX[s] = dbe_->book1D(hisID,"Pixel Hit-to-Track Residual in X",500,-5.,5.);
643 
644  sprintf(hisID,"residual_y_subdet_%i",s);
645  meSubdetResidualY[s] = dbe_->book1D(hisID,"Pixel Hit-to-Track Residual in Y",500,-5.,5.);
646  }
647  }
648 
649  firstRun = false;
650  }
651 }
652 
653 
655  LogInfo("PixelDQM") << "SiPixelTrackResidualSource endJob()";
656 
657  // save the residual histograms to an output root file
658  bool saveFile = pSet_.getUntrackedParameter<bool>("saveFile", true);
659  if (saveFile) {
661  LogInfo("PixelDQM") << " - saving histograms to "<< outputFile.data();
662  dbe_->save(outputFile);
663  }
664  LogInfo("PixelDQM") << endl; // dbe_->showDirStructure();
665 }
666 
667 
669  //Retrieve tracker topology from geometry
670  edm::ESHandle<TrackerTopology> tTopoHandle;
671  iSetup.get<IdealGeometryRecord>().get(tTopoHandle);
672  const TrackerTopology* const tTopo = tTopoHandle.product();
673 
674 
675 
676  // retrieve TrackerGeometry again and MagneticField for use in transforming
677  // a TrackCandidate's P(ersistent)TrajectoryStateoOnDet (PTSoD) to a TrajectoryStateOnSurface (TSoS)
679  iSetup.get<TrackerDigiGeometryRecord>().get(TG);
680  const TrackerGeometry* theTrackerGeometry = TG.product();
681 
682  //analytic triplet method to calculate the track residuals in the pixe barrel detector
683 
684  //--------------------------------------------------------------------
685  // beam spot:
686  //
688  //iEvent.getByLabel( "offlineBeamSpot", rbs );
689  iEvent.getByToken( beamSpotToken_, rbs );
690  math::XYZPoint bsP = math::XYZPoint(0,0,0);
691  if( !rbs.failedToGet() && rbs.isValid() )
692  {
693  bsP = math::XYZPoint( rbs->x0(), rbs->y0(), rbs->z0() );
694  }
695 
696  //--------------------------------------------------------------------
697  // primary vertices:
698  //
700  //iEvent.getByLabel("offlinePrimaryVertices", vertices );
701  iEvent.getByToken( offlinePrimaryVerticesToken_, vertices );
702 
703  if( vertices.failedToGet() ) return;
704  if( !vertices.isValid() ) return;
705 
706  math::XYZPoint vtxN = math::XYZPoint(0,0,0);
707  math::XYZPoint vtxP = math::XYZPoint(0,0,0);
708 
709  double bestNdof = 0;
710  double maxSumPt = 0;
711  reco::Vertex bestPvx;
712  for(reco::VertexCollection::const_iterator iVertex = vertices->begin();
713  iVertex != vertices->end(); ++iVertex ) {
714  if( iVertex->ndof() > bestNdof ) {
715  bestNdof = iVertex->ndof();
716  vtxN = math::XYZPoint( iVertex->x(), iVertex->y(), iVertex->z() );
717  }//ndof
718  if( iVertex->p4().pt() > maxSumPt ) {
719  maxSumPt = iVertex->p4().pt();
720  vtxP = math::XYZPoint( iVertex->x(), iVertex->y(), iVertex->z() );
721  bestPvx = *iVertex;
722  }//sumpt
723 
724  }//vertex
725 
726  if( maxSumPt < 1 ) return;
727 
728  if( maxSumPt < 1 ) vtxP = vtxN;
729 
730  //---------------------------------------------
731  //get Tracks
732  //
734  //iEvent.getByLabel( "generalTracks", TracksForRes );
735  iEvent.getByToken( generalTracksToken_, TracksForRes );
736 
737  //
738  // transient track builder, needs B-field from data base (global tag in .py)
739  //
741  iSetup.get<TransientTrackRecord>().get( "TransientTrackBuilder", theB );
742 
743  //get the TransienTrackingRecHitBuilder needed for extracting the global position of the hits in the pixel
744  edm::ESHandle<TransientTrackingRecHitBuilder> theTrackerRecHitBuilder;
745  iSetup.get<TransientRecHitRecord>().get(ttrhbuilder_,theTrackerRecHitBuilder);
746 
747  //check that tracks are valid
748  if( TracksForRes.failedToGet() ) return;
749  if( !TracksForRes.isValid() ) return;
750 
751  //get tracker geometry
753  iSetup.get<TrackerDigiGeometryRecord>().get(pDD);
754 
755  if( !pDD.isValid() ) {
756  cout << "Unable to find TrackerDigiGeometry. Return\n";
757  return;
758  }
759 
760  int kk = -1;
761  //----------------------------------------------------------------------------
762  // Residuals:
763  //
764  for( reco::TrackCollection::const_iterator iTrack = TracksForRes->begin();
765  iTrack != TracksForRes->end(); ++iTrack ) {
766  //count
767  kk++;
768  //Calculate minimal track pt before curling
769  // cpt = cqRB = 0.3*R[m]*B[T] = 1.14*R[m] for B=3.8T
770  // D = 2R = 2*pt/1.14
771  // calo: D = 1.3 m => pt = 0.74 GeV/c
772  double pt = iTrack->pt();
773  if( pt < 0.75 ) continue;// curls up
774  if( abs( iTrack->dxy(vtxP) ) > 5*iTrack->dxyError() ) continue; // not prompt
775 
776  double charge = iTrack->charge();
777 
778  reco::TransientTrack tTrack = theB->build(*iTrack);
779  //get curvature of the track, needed for the residuals
780  double kap = tTrack.initialFreeState().transverseCurvature();
781  //needed for the TransienTrackingRecHitBuilder
783  if( iTrack->extra().isNonnull() &&iTrack->extra().isAvailable() ){
784 
785  double x1 = 0;
786  double y1 = 0;
787  double z1 = 0;
788  double x2 = 0;
789  double y2 = 0;
790  double z2 = 0;
791  double x3 = 0;
792  double y3 = 0;
793  double z3 = 0;
794  int n1 = 0;
795  int n2 = 0;
796  int n3 = 0;
797 
798  //for saving the pixel barrel hits
799  vector<TransientTrackingRecHit::RecHitPointer> GoodPixBarrelHits;
800  //looping through the RecHits of the track
801  for( trackingRecHit_iterator irecHit = iTrack->recHitsBegin();
802  irecHit != iTrack->recHitsEnd(); ++irecHit){
803 
804  if( (*irecHit)->isValid() ){
805  DetId detId = (*irecHit)->geographicalId();
806  // enum Detector { Tracker=1, Muon=2, Ecal=3, Hcal=4, Calo=5 };
807  if( detId.det() != 1 ){
808  if(debug_){
809  cout << "rec hit ID = " << detId.det() << " not in tracker!?!?\n";
810  }
811  continue;
812  }
813  uint32_t subDet = detId.subdetId();
814 
815  // enum SubDetector{ PixelBarrel=1, PixelEndcap=2 };
816  // enum SubDetector{ TIB=3, TID=4, TOB=5, TEC=6 };
817 
818  TransientTrackingRecHit::RecHitPointer trecHit = theTrackerRecHitBuilder->build( &*(*irecHit), initialTSOS);
819 
820 
821  double gX = trecHit->globalPosition().x();
822  double gY = trecHit->globalPosition().y();
823  double gZ = trecHit->globalPosition().z();
824 
825 
826  if( subDet == PixelSubdetector::PixelBarrel ) {
827 
828  int ilay = tTopo->pxbLayer(detId);
829 
830  if( ilay == 1 ){
831  n1++;
832  x1 = gX;
833  y1 = gY;
834  z1 = gZ;
835 
836  GoodPixBarrelHits.push_back((trecHit));
837  }//PXB1
838  if( ilay == 2 ){
839 
840  n2++;
841  x2 = gX;
842  y2 = gY;
843  z2 = gZ;
844 
845  GoodPixBarrelHits.push_back((trecHit));
846 
847  }//PXB2
848  if( ilay == 3 ){
849 
850  n3++;
851  x3 = gX;
852  y3 = gY;
853  z3 = gZ;
854  GoodPixBarrelHits.push_back((trecHit));
855  }
856  }//PXB
857 
858 
859  }//valid
860  }//loop rechits
861 
862  //CS extra plots
863 
864 
865  if( n1+n2+n3 == 3 && n1*n2*n3 > 0) {
866  for( unsigned int i = 0; i < GoodPixBarrelHits.size(); i++){
867 
868  if( GoodPixBarrelHits[i]->isValid() ){
869  DetId detId = GoodPixBarrelHits[i]->geographicalId().rawId();
870  int ilay = tTopo->pxbLayer(detId);
871  if(pt > ptminres_){
872 
873  double dca2 = 0.0, dz2=0.0;
874  double ptsig = pt;
875  if(charge<0.) ptsig = -pt;
876  //Filling the histograms in modules
877 
878  MeasurementPoint Test;
879  MeasurementPoint Test2;
880  Test=MeasurementPoint(0,0);
881  Test2=MeasurementPoint(0,0);
882  Measurement2DVector residual;
883 
884  if( ilay == 1 ){
885 
886  triplets(x2,y2,z2,x1,y1,z1,x3,y3,z3,ptsig,dca2,dz2, kap);
887 
888  Test=MeasurementPoint(dca2*1E4,dz2*1E4);
889  residual=Test-Test2;
890  }
891 
892  if( ilay == 2 ){
893 
894  triplets(x1,y1,z1,x2,y2,z2,x3,y3,z3,ptsig,dca2,dz2, kap);
895 
896  Test=MeasurementPoint(dca2*1E4,dz2*1E4);
897  residual=Test-Test2;
898 
899  }
900 
901  if( ilay == 3 ){
902 
903  triplets(x1,y1,z1,x3,y3,z3,x2,y2,z2,ptsig,dca2,dz2, kap);
904 
905  Test=MeasurementPoint(dca2*1E4,dz2*1E4);
906  residual=Test-Test2;
907  }
908  // fill the residual histograms
909 
910  std::map<uint32_t, SiPixelTrackResidualModule*>::iterator pxd = theSiPixelStructure.find(detId);
911  if (pxd!=theSiPixelStructure.end()) (*pxd).second->fill(residual, reducedSet, modOn, ladOn, layOn, phiOn, bladeOn, diskOn, ringOn);
912  }//three hits
913  }//is valid
914  }//rechits loop
915  }//pt 4
916  }
917 
918 
919  }//-----Tracks
921  //get trajectories
922  edm::Handle<std::vector<Trajectory> > trajCollectionHandle;
923  //iEvent.getByLabel(tracksrc_,trajCollectionHandle);
924  iEvent.getByToken ( tracksrcToken_, trajCollectionHandle );
925  const std::vector<Trajectory> trajColl = *(trajCollectionHandle.product());
926 
927  //get tracks
928  edm::Handle<std::vector<reco::Track> > trackCollectionHandle;
929  //iEvent.getByLabel(tracksrc_,trackCollectionHandle);
930  iEvent.getByToken( trackToken_, trackCollectionHandle );
931 
932  const std::vector<reco::Track> trackColl = *(trackCollectionHandle.product());
933 
934  //get the map
936  //iEvent.getByLabel(tracksrc_,match);
937  iEvent.getByToken( trackAssociationToken_, match);
938  const TrajTrackAssociationCollection ttac = *(match.product());
939 
940  // get clusters
942  //iEvent.getByLabel( clustersrc_, clusterColl );
943  iEvent.getByToken( clustersrcToken_, clusterColl );
944  const edmNew::DetSetVector<SiPixelCluster> clustColl = *(clusterColl.product());
945 
946  if(debug_){
947  std::cout << "Trajectories\t : " << trajColl.size() << std::endl;
948  std::cout << "recoTracks \t : " << trackColl.size() << std::endl;
949  std::cout << "Map entries \t : " << ttac.size() << std::endl;
950  }
951 
952  std::set<SiPixelCluster> clusterSet;
953  TrajectoryStateCombiner tsoscomb;
954  int tracks=0, pixeltracks=0, bpixtracks=0, fpixtracks=0;
955  int trackclusters=0, barreltrackclusters=0, endcaptrackclusters=0;
956  int otherclusters=0, barrelotherclusters=0, endcapotherclusters=0;
957 
958  //Loop over map entries
959  for(TrajTrackAssociationCollection::const_iterator it = ttac.begin();it != ttac.end(); ++it){
960  const edm::Ref<std::vector<Trajectory> > traj_iterator = it->key;
961  // Trajectory Map, extract Trajectory for this track
962  reco::TrackRef trackref = it->val;
963  tracks++;
964 
965  bool isBpixtrack = false, isFpixtrack = false, crossesPixVol=false;
966 
967  //find out whether track crosses pixel fiducial volume (for cosmic tracks)
968 
969  double d0 = (*trackref).d0(), dz = (*trackref).dz();
970 
971  if(abs(d0)<15 && abs(dz)<50) crossesPixVol = true;
972 
973  std::vector<TrajectoryMeasurement> tmeasColl =traj_iterator->measurements();
974  std::vector<TrajectoryMeasurement>::const_iterator tmeasIt;
975  //loop on measurements to find out whether there are bpix and/or fpix hits
976  for(tmeasIt = tmeasColl.begin();tmeasIt!=tmeasColl.end();tmeasIt++){
977  if(! tmeasIt->updatedState().isValid()) continue;
978  TransientTrackingRecHit::ConstRecHitPointer testhit = tmeasIt->recHit();
979  if(! testhit->isValid() || testhit->geographicalId().det() != DetId::Tracker) continue;
980  uint testSubDetID = (testhit->geographicalId().subdetId());
981  if(testSubDetID==PixelSubdetector::PixelBarrel) isBpixtrack = true;
982  if(testSubDetID==PixelSubdetector::PixelEndcap) isFpixtrack = true;
983  }//end loop on measurements
984  if(isBpixtrack) {
985  bpixtracks++;
986  if(debug_) std::cout << "bpixtrack\n";
987  }
988  if(isFpixtrack) {
989  fpixtracks++;
990  if(debug_) std::cout << "fpixtrack\n";
991  }
992  if(isBpixtrack || isFpixtrack){
993  pixeltracks++;
994 
995  if(crossesPixVol) meNofTracksInPixVol_->Fill(0,1);
996 
997  std::vector<TrajectoryMeasurement> tmeasColl = traj_iterator->measurements();
998  for(std::vector<TrajectoryMeasurement>::const_iterator tmeasIt = tmeasColl.begin(); tmeasIt!=tmeasColl.end(); tmeasIt++){
999  if(! tmeasIt->updatedState().isValid()) continue;
1000 
1001  TrajectoryStateOnSurface tsos = tsoscomb( tmeasIt->forwardPredictedState(), tmeasIt->backwardPredictedState() );
1003  if(! hit->isValid() || hit->geographicalId().det() != DetId::Tracker ) {
1004  continue;
1005  } else {
1006 
1007 // //residual
1008  const DetId & hit_detId = hit->geographicalId();
1009  //uint IntRawDetID = (hit_detId.rawId());
1010  uint IntSubDetID = (hit_detId.subdetId());
1011 
1012  if(IntSubDetID == 0 ) continue; // don't look at SiStrip hits!
1013 
1014  // get the enclosed persistent hit
1015  const TrackingRecHit *persistentHit = hit->hit();
1016  // check if it's not null, and if it's a valid pixel hit
1017  if ((persistentHit != 0) && (typeid(*persistentHit) == typeid(SiPixelRecHit))) {
1018  // tell the C++ compiler that the hit is a pixel hit
1019  const SiPixelRecHit* pixhit = static_cast<const SiPixelRecHit*>( hit->hit() );
1020  //Hit probability:
1021  float hit_prob = -1.;
1022  if(pixhit->hasFilledProb()){
1023  hit_prob = pixhit->clusterProbability(0);
1024  //std::cout<<"HITPROB= "<<hit_prob<<std::endl;
1025  if(hit_prob<pow(10.,-15.)) NLowProb++;
1026  NTotal++;
1027  if(NTotal>0) meHitProbability->Fill(float(NLowProb/NTotal));
1028  }
1029 
1030  // get the edm::Ref to the cluster
1031  edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> const& clust = (*pixhit).cluster();
1032  // check if the ref is not null
1033  if (clust.isNonnull()) {
1034 
1035  //define tracker and pixel geometry and topology
1036  const TrackerGeometry& theTracker(*theTrackerGeometry);
1037  const PixelGeomDetUnit* theGeomDet = static_cast<const PixelGeomDetUnit*> (theTracker.idToDet(hit_detId) );
1038  //test if PixelGeomDetUnit exists
1039  if(theGeomDet == 0) {
1040  if(debug_) std::cout << "NO THEGEOMDET\n";
1041  continue;
1042  }
1043 
1044  const PixelTopology * topol = &(theGeomDet->specificTopology());
1045  //fill histograms for clusters on tracks
1046  //correct SiPixelTrackResidualModule
1047  std::map<uint32_t, SiPixelTrackResidualModule*>::iterator pxd = theSiPixelStructure.find((*hit).geographicalId().rawId());
1048 
1049  //CHARGE CORRECTION (for track impact angle)
1050  // calculate alpha and beta from cluster position
1052  LocalVector localDir = ltp.momentum()/ltp.momentum().mag();
1053 
1054  float clust_alpha = atan2(localDir.z(), localDir.x());
1055  float clust_beta = atan2(localDir.z(), localDir.y());
1056  double corrCharge = clust->charge() * sqrt( 1.0 / ( 1.0/pow( tan(clust_alpha), 2 ) +
1057  1.0/pow( tan(clust_beta ), 2 ) +
1058  1.0 )
1059  )/1000.;
1060 
1061  if (pxd!=theSiPixelStructure.end()) (*pxd).second->fill((*clust), true, corrCharge, reducedSet, modOn, ladOn, layOn, phiOn, bladeOn, diskOn, ringOn);
1062 
1063 
1064  trackclusters++;
1065  //CORR CHARGE
1066  meClChargeOnTrack_all->Fill(corrCharge);
1067  meClSizeOnTrack_all->Fill((*clust).size());
1068  meClSizeXOnTrack_all->Fill((*clust).sizeX());
1069  meClSizeYOnTrack_all->Fill((*clust).sizeY());
1070  clusterSet.insert(*clust);
1071 
1072  //find cluster global position (rphi, z)
1073  // get cluster center of gravity (of charge)
1074  float xcenter = clust->x();
1075  float ycenter = clust->y();
1076  // get the cluster position in local coordinates (cm)
1077  LocalPoint clustlp = topol->localPosition( MeasurementPoint(xcenter, ycenter) );
1078  // get the cluster position in global coordinates (cm)
1079  GlobalPoint clustgp = theGeomDet->surface().toGlobal( clustlp );
1080 
1081  //find location of hit (barrel or endcap, same for cluster)
1082  bool barrel = DetId((*hit).geographicalId()).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
1083  bool endcap = DetId((*hit).geographicalId()).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap);
1084  if(barrel) {
1085  barreltrackclusters++;
1086  //CORR CHARGE
1087  meClChargeOnTrack_bpix->Fill(corrCharge);
1088  meClSizeOnTrack_bpix->Fill((*clust).size());
1089  meClSizeXOnTrack_bpix->Fill((*clust).sizeX());
1090  meClSizeYOnTrack_bpix->Fill((*clust).sizeY());
1091  uint32_t DBlayer;
1092  if (!isUpgrade) { DBlayer = PixelBarrelName(DetId((*hit).geographicalId())).layerName(); }
1093  else { DBlayer = PixelBarrelNameUpgrade(DetId((*hit).geographicalId())).layerName(); }
1094  float phi = clustgp.phi();
1095  float z = clustgp.z();
1096  switch(DBlayer){
1097  case 1: {
1098  meClPosLayer1OnTrack->Fill(z,phi);
1099  meClChargeOnTrack_layer1->Fill(corrCharge);
1100  meClSizeOnTrack_layer1->Fill((*clust).size());
1101  meClSizeXOnTrack_layer1->Fill((*clust).sizeX());
1102  meClSizeYOnTrack_layer1->Fill((*clust).sizeY());
1103  break;
1104  }
1105  case 2: {
1106  meClPosLayer2OnTrack->Fill(z,phi);
1107  meClChargeOnTrack_layer2->Fill(corrCharge);
1108  meClSizeOnTrack_layer2->Fill((*clust).size());
1109  meClSizeXOnTrack_layer2->Fill((*clust).sizeX());
1110  meClSizeYOnTrack_layer2->Fill((*clust).sizeY());
1111  break;
1112  }
1113  case 3: {
1114  meClPosLayer3OnTrack->Fill(z,phi);
1115  meClChargeOnTrack_layer3->Fill(corrCharge);
1116  meClSizeOnTrack_layer3->Fill((*clust).size());
1117  meClSizeXOnTrack_layer3->Fill((*clust).sizeX());
1118  meClSizeYOnTrack_layer3->Fill((*clust).sizeY());
1119  break;
1120  }
1121  case 4: {
1122  if (isUpgrade) {
1123  meClPosLayer4OnTrack->Fill(z,phi);
1124  meClChargeOnTrack_layer4->Fill(corrCharge);
1125  meClSizeOnTrack_layer4->Fill((*clust).size());
1126  meClSizeXOnTrack_layer4->Fill((*clust).sizeX());
1127  meClSizeYOnTrack_layer4->Fill((*clust).sizeY());
1128  }
1129  break;
1130  }
1131 
1132  }
1133 
1134  }
1135  if(endcap) {
1136  endcaptrackclusters++;
1137  //CORR CHARGE
1138  meClChargeOnTrack_fpix->Fill(corrCharge);
1139  meClSizeOnTrack_fpix->Fill((*clust).size());
1140  meClSizeXOnTrack_fpix->Fill((*clust).sizeX());
1141  meClSizeYOnTrack_fpix->Fill((*clust).sizeY());
1142  uint32_t DBdisk;
1143  if (!isUpgrade) { DBdisk = PixelEndcapName(DetId((*hit).geographicalId())).diskName(); }
1144  else if (isUpgrade) { DBdisk = PixelEndcapNameUpgrade(DetId((*hit).geographicalId())).diskName(); }
1145  float x = clustgp.x();
1146  float y = clustgp.y();
1147  float z = clustgp.z();
1148  if(z>0){
1149  if(DBdisk==1) {
1151  meClChargeOnTrack_diskp1->Fill(corrCharge);
1152  meClSizeOnTrack_diskp1->Fill((*clust).size());
1153  meClSizeXOnTrack_diskp1->Fill((*clust).sizeX());
1154  meClSizeYOnTrack_diskp1->Fill((*clust).sizeY());
1155  }
1156  if(DBdisk==2) {
1157  meClPosDisk2pzOnTrack->Fill(x,y);
1158  meClChargeOnTrack_diskp2->Fill(corrCharge);
1159  meClSizeOnTrack_diskp2->Fill((*clust).size());
1160  meClSizeXOnTrack_diskp2->Fill((*clust).sizeX());
1161  meClSizeYOnTrack_diskp2->Fill((*clust).sizeY());
1162  }
1163  if(DBdisk==3 && isUpgrade) {
1165  meClChargeOnTrack_diskp3->Fill(corrCharge);
1166  meClSizeOnTrack_diskp3->Fill((*clust).size());
1167  meClSizeXOnTrack_diskp3->Fill((*clust).sizeX());
1168  meClSizeYOnTrack_diskp3->Fill((*clust).sizeY());
1169  }
1170  }
1171  else{
1172  if(DBdisk==1) {
1174  meClChargeOnTrack_diskm1->Fill(corrCharge);
1175  meClSizeOnTrack_diskm1->Fill((*clust).size());
1176  meClSizeXOnTrack_diskm1->Fill((*clust).sizeX());
1177  meClSizeYOnTrack_diskm1->Fill((*clust).sizeY());
1178  }
1179  if(DBdisk==2) {
1180  meClPosDisk2mzOnTrack->Fill(x,y);
1181  meClChargeOnTrack_diskm2->Fill(corrCharge);
1182  meClSizeOnTrack_diskm2->Fill((*clust).size());
1183  meClSizeXOnTrack_diskm2->Fill((*clust).sizeX());
1184  meClSizeYOnTrack_diskm2->Fill((*clust).sizeY());
1185  }
1186  if(DBdisk==3 && isUpgrade) {
1188  meClChargeOnTrack_diskm3->Fill(corrCharge);
1189  meClSizeOnTrack_diskm3->Fill((*clust).size());
1190  meClSizeXOnTrack_diskm3->Fill((*clust).sizeX());
1191  meClSizeYOnTrack_diskm3->Fill((*clust).sizeY());
1192  }
1193  }
1194  }
1195 
1196  }//end if (cluster exists)
1197 
1198  }//end if (persistent hit exists and is pixel hit)
1199 
1200  }//end of else
1201 
1202 
1203  }//end for (all traj measurements of pixeltrack)
1204  }//end if (is pixeltrack)
1205  else {
1206  if(debug_) std::cout << "no pixeltrack:\n";
1207  if(crossesPixVol) meNofTracksInPixVol_->Fill(1,1);
1208  }
1209 
1210  }//end loop on map entries
1211 
1212  //find clusters that are NOT on track
1213  //edmNew::DetSet<SiPixelCluster>::const_iterator di;
1214  if(debug_) std::cout << "clusters not on track: (size " << clustColl.size() << ") ";
1215 
1216  for(TrackerGeometry::DetContainer::const_iterator it = TG->dets().begin(); it != TG->dets().end(); it++){
1217  //if(dynamic_cast<PixelGeomDetUnit const *>((*it))!=0){
1218  DetId detId = (*it)->geographicalId();
1219  if(detId>=302055684 && detId<=352477708){ // make sure it's a Pixel module WITHOUT using dynamic_cast!
1220  int nofclOnTrack = 0, nofclOffTrack=0;
1221  uint32_t DBlayer=10, DBdisk=10;
1222  float z=0.;
1223  //set layer/disk
1224  if(DetId(detId).subdetId() == 1) { // Barrel module
1225  if (!isUpgrade) {
1226  DBlayer = PixelBarrelName(DetId(detId)).layerName();
1227  } else if (isUpgrade) {
1228  DBlayer = PixelBarrelNameUpgrade(DetId(detId)).layerName();
1229  }
1230  }
1231  if(DetId(detId).subdetId() == 2){ // Endcap module
1232  if (!isUpgrade) { DBdisk = PixelEndcapName(DetId(detId )).diskName(); }
1233  else if (isUpgrade) { DBdisk = PixelEndcapNameUpgrade(DetId(detId )).diskName(); }
1234  }
1236  if( isearch != clustColl.end() ) { // Not an empty iterator
1238  for(di=isearch->begin(); di!=isearch->end(); di++){
1239  unsigned int temp = clusterSet.size();
1240  clusterSet.insert(*di);
1241  //check if cluster is off track
1242  if(clusterSet.size()>temp) {
1243  otherclusters++;
1244  nofclOffTrack++;
1245  //fill histograms for clusters off tracks
1246  //correct SiPixelTrackResidualModule
1247  std::map<uint32_t, SiPixelTrackResidualModule*>::iterator pxd = theSiPixelStructure.find((*it)->geographicalId().rawId());
1248 
1249  if (pxd!=theSiPixelStructure.end()) (*pxd).second->fill((*di), false, -1., reducedSet, modOn, ladOn, layOn, phiOn, bladeOn, diskOn, ringOn);
1250 
1251 
1252 
1253  meClSizeNotOnTrack_all->Fill((*di).size());
1254  meClSizeXNotOnTrack_all->Fill((*di).sizeX());
1255  meClSizeYNotOnTrack_all->Fill((*di).sizeY());
1256  meClChargeNotOnTrack_all->Fill((*di).charge()/1000);
1257 
1259  //find cluster global position (rphi, z) get cluster
1260  //define tracker and pixel geometry and topology
1261  const TrackerGeometry& theTracker(*theTrackerGeometry);
1262  const PixelGeomDetUnit* theGeomDet = static_cast<const PixelGeomDetUnit*> (theTracker.idToDet(detId) );
1263  //test if PixelGeomDetUnit exists
1264  if(theGeomDet == 0) {
1265  if(debug_) std::cout << "NO THEGEOMDET\n";
1266  continue;
1267  }
1268  const PixelTopology * topol = &(theGeomDet->specificTopology());
1269 
1270  //center of gravity (of charge)
1271  float xcenter = di->x();
1272  float ycenter = di->y();
1273  // get the cluster position in local coordinates (cm)
1274  LocalPoint clustlp = topol->localPosition( MeasurementPoint(xcenter, ycenter) );
1275  // get the cluster position in global coordinates (cm)
1276  GlobalPoint clustgp = theGeomDet->surface().toGlobal( clustlp );
1277 
1279 
1280  //barrel
1281  if(DetId(detId).subdetId() == 1) {
1282  meClSizeNotOnTrack_bpix->Fill((*di).size());
1283  meClSizeXNotOnTrack_bpix->Fill((*di).sizeX());
1284  meClSizeYNotOnTrack_bpix->Fill((*di).sizeY());
1285  meClChargeNotOnTrack_bpix->Fill((*di).charge()/1000);
1286  barrelotherclusters++;
1287  //DBlayer = PixelBarrelName(DetId(detId)).layerName();
1288  float phi = clustgp.phi();
1289  //float r = clustgp.perp();
1290  z = clustgp.z();
1291  switch(DBlayer){
1292  case 1: {
1293  meClPosLayer1NotOnTrack->Fill(z,phi);
1294  meClSizeNotOnTrack_layer1->Fill((*di).size());
1295  meClSizeXNotOnTrack_layer1->Fill((*di).sizeX());
1296  meClSizeYNotOnTrack_layer1->Fill((*di).sizeY());
1297  meClChargeNotOnTrack_layer1->Fill((*di).charge()/1000);
1298  break;
1299  }
1300  case 2: {
1301  meClPosLayer2NotOnTrack->Fill(z,phi);
1302  meClSizeNotOnTrack_layer2->Fill((*di).size());
1303  meClSizeXNotOnTrack_layer2->Fill((*di).sizeX());
1304  meClSizeYNotOnTrack_layer2->Fill((*di).sizeY());
1305  meClChargeNotOnTrack_layer2->Fill((*di).charge()/1000);
1306  break;
1307  }
1308  case 3: {
1309  meClPosLayer3NotOnTrack->Fill(z,phi);
1310  meClSizeNotOnTrack_layer3->Fill((*di).size());
1311  meClSizeXNotOnTrack_layer3->Fill((*di).sizeX());
1312  meClSizeYNotOnTrack_layer3->Fill((*di).sizeY());
1313  meClChargeNotOnTrack_layer3->Fill((*di).charge()/1000);
1314  break;
1315  }
1316  case 4: {
1317  if (isUpgrade) {
1318  meClPosLayer4NotOnTrack->Fill(z,phi);
1319  meClSizeNotOnTrack_layer4->Fill((*di).size());
1320  meClSizeXNotOnTrack_layer4->Fill((*di).sizeX());
1321  meClSizeYNotOnTrack_layer4->Fill((*di).sizeY());
1322  meClChargeNotOnTrack_layer4->Fill((*di).charge()/1000);
1323  }
1324  break;
1325  }
1326 
1327  }
1328  }
1329  //endcap
1330  if(DetId(detId).subdetId() == 2) {
1331  meClSizeNotOnTrack_fpix->Fill((*di).size());
1332  meClSizeXNotOnTrack_fpix->Fill((*di).sizeX());
1333  meClSizeYNotOnTrack_fpix->Fill((*di).sizeY());
1334  meClChargeNotOnTrack_fpix->Fill((*di).charge()/1000);
1335  endcapotherclusters++;
1336  //DBdisk = PixelEndcapName(DetId(detId )).diskName();
1337  float x = clustgp.x();
1338  float y = clustgp.y();
1339  z = clustgp.z();
1340  if(z>0){
1341  if(DBdisk==1) {
1343  meClSizeNotOnTrack_diskp1->Fill((*di).size());
1344  meClSizeXNotOnTrack_diskp1->Fill((*di).sizeX());
1345  meClSizeYNotOnTrack_diskp1->Fill((*di).sizeY());
1346  meClChargeNotOnTrack_diskp1->Fill((*di).charge()/1000);
1347  }
1348  if(DBdisk==2) {
1350  meClSizeNotOnTrack_diskp2->Fill((*di).size());
1351  meClSizeXNotOnTrack_diskp2->Fill((*di).sizeX());
1352  meClSizeYNotOnTrack_diskp2->Fill((*di).sizeY());
1353  meClChargeNotOnTrack_diskp2->Fill((*di).charge()/1000);
1354  }
1355  if(DBdisk==3 && isUpgrade) {
1357  meClSizeNotOnTrack_diskp3->Fill((*di).size());
1358  meClSizeXNotOnTrack_diskp3->Fill((*di).sizeX());
1359  meClSizeYNotOnTrack_diskp3->Fill((*di).sizeY());
1360  meClChargeNotOnTrack_diskp3->Fill((*di).charge()/1000);
1361  }
1362  }
1363  else{
1364  if(DBdisk==1) {
1366  meClSizeNotOnTrack_diskm1->Fill((*di).size());
1367  meClSizeXNotOnTrack_diskm1->Fill((*di).sizeX());
1368  meClSizeYNotOnTrack_diskm1->Fill((*di).sizeY());
1369  meClChargeNotOnTrack_diskm1->Fill((*di).charge()/1000);
1370  }
1371  if(DBdisk==2) {
1373  meClSizeNotOnTrack_diskm2->Fill((*di).size());
1374  meClSizeXNotOnTrack_diskm2->Fill((*di).sizeX());
1375  meClSizeYNotOnTrack_diskm2->Fill((*di).sizeY());
1376  meClChargeNotOnTrack_diskm2->Fill((*di).charge()/1000);
1377  }
1378  if(DBdisk==3 && isUpgrade) {
1380  meClSizeNotOnTrack_diskm3->Fill((*di).size());
1381  meClSizeXNotOnTrack_diskm3->Fill((*di).sizeX());
1382  meClSizeYNotOnTrack_diskm3->Fill((*di).sizeY());
1383  meClChargeNotOnTrack_diskm3->Fill((*di).charge()/1000);
1384  }
1385  }
1386 
1387  }
1388  }// end "if cluster off track"
1389  else {
1390  nofclOnTrack++;
1391  if(z == 0 && DBdisk != 10){
1392  //find cluster global position (rphi, z) get cluster
1393  //define tracker and pixel geometry and topology
1394  const TrackerGeometry& theTracker(*theTrackerGeometry);
1395  const PixelGeomDetUnit* theGeomDet = static_cast<const PixelGeomDetUnit*> (theTracker.idToDet(detId) );
1396  //test if PixelGeomDetUnit exists
1397  if(theGeomDet == 0) {
1398  if(debug_) std::cout << "NO THEGEOMDET\n";
1399  continue;
1400  }
1401  const PixelTopology * topol = &(theGeomDet->specificTopology());
1402  //center of gravity (of charge)
1403  float xcenter = di->x();
1404  float ycenter = di->y();
1405  // get the cluster position in local coordinates (cm)
1406  LocalPoint clustlp = topol->localPosition( MeasurementPoint(xcenter, ycenter) );
1407  // get the cluster position in global coordinates (cm)
1408  GlobalPoint clustgp = theGeomDet->surface().toGlobal( clustlp );
1409  z = clustgp.z();
1410  }
1411  }
1412  }
1413  }
1414  //++ fill the number of clusters on a module
1415  std::map<uint32_t, SiPixelTrackResidualModule*>::iterator pxd = theSiPixelStructure.find((*it)->geographicalId().rawId());
1416  if (pxd!=theSiPixelStructure.end()) (*pxd).second->nfill(nofclOnTrack, nofclOffTrack, reducedSet, modOn, ladOn, layOn, phiOn, bladeOn, diskOn, ringOn);
1417  if(nofclOnTrack!=0) meNClustersOnTrack_all->Fill(nofclOnTrack);
1418  if(nofclOffTrack!=0) meNClustersNotOnTrack_all->Fill(nofclOffTrack);
1419  //barrel
1420  if(DetId(detId).subdetId() == 1){
1421  if(nofclOnTrack!=0) meNClustersOnTrack_bpix->Fill(nofclOnTrack);
1422  if(nofclOffTrack!=0) meNClustersNotOnTrack_bpix->Fill(nofclOffTrack);
1423  //DBlayer = PixelBarrelName(DetId(detId)).layerName();
1424  switch(DBlayer){
1425  case 1: {
1426  if(nofclOnTrack!=0) meNClustersOnTrack_layer1->Fill(nofclOnTrack);
1427  if(nofclOffTrack!=0) meNClustersNotOnTrack_layer1->Fill(nofclOffTrack); break;
1428  }
1429  case 2: {
1430  if(nofclOnTrack!=0) meNClustersOnTrack_layer2->Fill(nofclOnTrack);
1431  if(nofclOffTrack!=0) meNClustersNotOnTrack_layer2->Fill(nofclOffTrack); break;
1432  }
1433  case 3: {
1434  if(nofclOnTrack!=0) meNClustersOnTrack_layer3->Fill(nofclOnTrack);
1435  if(nofclOffTrack!=0) meNClustersNotOnTrack_layer3->Fill(nofclOffTrack); break;
1436  }
1437  case 4: {
1438  if(nofclOnTrack!=0 && isUpgrade) meNClustersOnTrack_layer4->Fill(nofclOnTrack);
1439  if(nofclOffTrack!=0 && isUpgrade) meNClustersNotOnTrack_layer4->Fill(nofclOffTrack); break;
1440  }
1441  }
1442  }//end barrel
1443  //endcap
1444  if(DetId(detId).subdetId() == 2) {
1445  //DBdisk = PixelEndcapName(DetId(detId )).diskName();
1446  //z = clustgp.z();
1447  if(nofclOnTrack!=0) meNClustersOnTrack_fpix->Fill(nofclOnTrack);
1448  if(nofclOffTrack!=0) meNClustersNotOnTrack_fpix->Fill(nofclOffTrack);
1449  if(z>0){
1450  if(DBdisk==1) {
1451  if(nofclOnTrack!=0) meNClustersOnTrack_diskp1->Fill(nofclOnTrack);
1452  if(nofclOffTrack!=0) meNClustersNotOnTrack_diskp1->Fill(nofclOffTrack);
1453  }
1454  if(DBdisk==2) {
1455  if(nofclOnTrack!=0) meNClustersOnTrack_diskp2->Fill(nofclOnTrack);
1456  if(nofclOffTrack!=0) meNClustersNotOnTrack_diskp2->Fill(nofclOffTrack);
1457  }
1458  if(DBdisk==3) {
1459  if(nofclOnTrack!=0 && isUpgrade) meNClustersOnTrack_diskp3->Fill(nofclOnTrack);
1460  if(nofclOffTrack!=0) meNClustersNotOnTrack_diskp3->Fill(nofclOffTrack);
1461  }
1462  }
1463  if(z<0){
1464  if(DBdisk==1) {
1465  if(nofclOnTrack!=0) meNClustersOnTrack_diskm1->Fill(nofclOnTrack);
1466  if(nofclOffTrack!=0) meNClustersNotOnTrack_diskm1->Fill(nofclOffTrack);
1467  }
1468  if(DBdisk==2) {
1469  if(nofclOnTrack!=0) meNClustersOnTrack_diskm2->Fill(nofclOnTrack);
1470  if(nofclOffTrack!=0) meNClustersNotOnTrack_diskm2->Fill(nofclOffTrack);
1471  }
1472  if(DBdisk==3) {
1473  if(nofclOnTrack!=0 && isUpgrade) meNClustersOnTrack_diskm3->Fill(nofclOnTrack);
1474  if(nofclOffTrack!=0 && isUpgrade) meNClustersNotOnTrack_diskm3->Fill(nofclOffTrack);
1475  }
1476  }
1477  }
1478 
1479  }//end if it's a Pixel module
1480  }//end for loop over tracker detector geometry modules
1481 
1482 
1483  if(trackclusters>0) (meNofClustersOnTrack_)->Fill(0,trackclusters);
1484  if(barreltrackclusters>0)(meNofClustersOnTrack_)->Fill(1,barreltrackclusters);
1485  if(endcaptrackclusters>0)(meNofClustersOnTrack_)->Fill(2,endcaptrackclusters);
1486  if(otherclusters>0)(meNofClustersNotOnTrack_)->Fill(0,otherclusters);
1487  if(barrelotherclusters>0)(meNofClustersNotOnTrack_)->Fill(1,barrelotherclusters);
1488  if(endcapotherclusters>0)(meNofClustersNotOnTrack_)->Fill(2,endcapotherclusters);
1489  if(tracks>0)(meNofTracks_)->Fill(0,tracks);
1490  if(pixeltracks>0)(meNofTracks_)->Fill(1,pixeltracks);
1491  if(bpixtracks>0)(meNofTracks_)->Fill(2,bpixtracks);
1492  if(fpixtracks>0)(meNofTracks_)->Fill(3,fpixtracks);
1493 }
1494 void SiPixelTrackResidualSource::triplets(double x1,double y1,double z1,double x2,double y2,double z2,double x3,double y3,double z3,
1495  double ptsig, double & dca2,double & dz2, double kap) {
1496 
1497  //Define some constants
1498  using namespace std;
1499 
1500  //Curvature kap from global Track
1501 
1502  //inverse of the curvature is the radius in the transverse plane
1503  double rho = 1/kap;
1504  //Check that the hits are in the correct layers
1505  double r1 = sqrt( x1*x1 + y1*y1 );
1506  double r3 = sqrt( x3*x3 + y3*y3 );
1507 
1508  if( r3-r1 < 2.0 ) cout << "warn r1 = " << r1 << ", r3 = " << r3 << endl;
1509 
1510  // Calculate the centre of the helix in xy-projection with radius rho from the track.
1511  //start with a line (sekante) connecting the two points (x1,y1) and (x3,y3) vec_L = vec_x3-vec_x1
1512  //with L being the length of that vector.
1513  double L=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
1514  //lam is the line from the middel point of vec_q towards the center of the circle X0,Y0
1515  // we already have kap and rho = 1/kap
1516  double lam = sqrt(rho*rho - L*L/4);
1517 
1518  // There are two solutions, the sign of kap gives the information
1519  // which of them is correct.
1520  //
1521  if( kap > 0 ) lam = -lam;
1522 
1523  //
1524  // ( X0, Y0 ) is the centre of the circle that describes the helix in xy-projection.
1525  //
1526  double x0 = 0.5*( x1 + x3 ) + lam/L * ( -y1 + y3 );
1527  double y0 = 0.5*( y1 + y3 ) + lam/L * ( x1 - x3 );
1528 
1529  // Calculate the dipangle in z direction (needed later for z residual) :
1530  //Starting from the heliz equation whihc has to hold for both points z1,z3
1531  double num = ( y3 - y0 ) * ( x1 - x0 ) - ( x3 - x0 ) * ( y1 - y0 );
1532  double den = ( x1 - x0 ) * ( x3 - x0 ) + ( y1 - y0 ) * ( y3 - y0 );
1533  double tandip = kap * ( z3 - z1 ) / atan( num / den );
1534 
1535 
1536  // angle from first hit to dca point:
1537  //
1538  double dphi = atan( ( ( x1 - x0 ) * y0 - ( y1 - y0 ) * x0 )
1539  / ( ( x1 - x0 ) * x0 + ( y1 - y0 ) * y0 ) );
1540  //z position of the track based on the middle of the circle
1541  //track equation for the z component
1542  double uz0 = z1 + tandip * dphi * rho;
1543 
1545  //RESIDUAL IN R-PHI
1547  //Calculate distance dca2 from point (x2,y2) to the circle which is given by
1548  //the distance of the point to the middlepoint dcM = sqrt((x0-x2)^2+(y0-y2)) and rho
1549  //dca = rho +- dcM
1550  if(kap>0) dca2=rho-sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2));
1551  else dca2=rho+sqrt((-x0+x2)*(-x0+x2)+(-y0+y2)*(-y0+y2));
1552 
1554  //RESIDUAL IN Z
1556  double xx =0 ;
1557  double yy =0 ;
1558  //sign of kappa determines the calculation
1559  //xx and yy are the new coordinates starting from x2, y2 that are on the track itself
1560  //vec_X2+-dca2*vec(X0-X2)/|(X0-X2)|
1561  if(kap<0){
1562  xx = x2+(dca2*((x0-x2))/sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)));
1563  yy = y2+(dca2*((y0-y2))/sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)));
1564  }
1565  else if(kap>=0){
1566  xx = x2-(dca2*((x0-x2))/sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)));
1567  yy = y2-(dca2*((y0-y2))/sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)));
1568  }
1569 
1570  //to get residual in z start with calculating the new uz2 position if one has moved to xx, yy
1571  //on the track. First calculate the change in phi2 with respect to the center X0, Y0
1572  double dphi2 = atan( ( ( xx - x0 ) * y0 - ( yy - y0 ) * x0 )
1573  / ( ( xx - x0 ) * x0 + ( yy - y0 ) * y0 ) );
1574  //Solve track equation for this new z depending on the dip angle of the track (see above
1575  //calculated based on X1, X3 and X0, use uz0 as reference point again.
1576  double uz2= uz0 - dphi2*tandip*rho;
1577 
1578  //subtract new z position from the old one
1579  dz2=z2-uz2;
1580 
1581  //if we are interested in the arclength this is unsigned though
1582  // double cosphi2 = (x2*xx+y2*yy)/(sqrt(x2*x2+y2*y2)*sqrt(xx*xx+yy*yy));
1583  //double arcdca2=sqrt(x2*x2+y2*y2)*acos(cosphi2);
1584 
1585 }
1586 
1587 
1588 DEFINE_FWK_MODULE(SiPixelTrackResidualSource); // define this as a plug-in
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
T getParameter(std::string const &) const
edm::EDGetTokenT< reco::TrackCollection > generalTracksToken_
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator end(bool update=false) const
edm::EDGetTokenT< std::vector< Trajectory > > tracksrcToken_
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
Definition: DQMStore.cc:928
const LocalTrajectoryParameters & localParameters() const
const_iterator end() const
last iterator over the map (read only)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
Definition: DDAxes.h:10
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
T y() const
Definition: PV3DBase.h:63
void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
data_type const * const_iterator
Definition: DetSetNew.h:30
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:35
SiPixelTrackResidualSource(const edm::ParameterSet &)
double charge(const std::vector< uint8_t > &Ampls)
float float float z
tuple gX
Definition: corrVsCorr.py:109
TrajectoryStateOnSurface innermostMeasurementState() const
virtual void beginRun(const edm::Run &r, edm::EventSetup const &iSetup)
void Fill(long long x)
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
int iEvent
Definition: GenABIO.cc:230
T mag() const
Definition: PV3DBase.h:67
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
T sqrt(T t)
Definition: SSEVec.h:48
bool setModuleFolder(const uint32_t &rawdetid=0, int type=0, bool isUpgrade=false)
Set folder name for a module or plaquette.
T z() const
Definition: PV3DBase.h:64
void triplets(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double ptsig, double &dc, double &dz, double kap)
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void save(const std::string &filename, const std::string &path="", const std::string &pattern="", const std::string &rewrite="", const uint32_t run=0, SaveReferenceTag ref=SaveWithReference, int minStatus=dqm::qstatus::STATUS_OK, const std::string &fileupdate="RECREATE")
Definition: DQMStore.cc:2424
LocalVector momentum() const
Momentum vector in the local frame.
edm::EDGetTokenT< std::vector< reco::Track > > trackToken_
bool isValid() const
Definition: HandleBase.h:76
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > clustersrcToken_
virtual const GeomDet * idToDet(DetId) const
std::shared_ptr< TrackingRecHit const > RecHitPointer
double ndof() const
Definition: Vertex.h:102
int diskName() const
disk id
unsigned int pxbLayer(const DetId &id) const
FreeTrajectoryState initialFreeState() const
bool failedToGet() const
Definition: HandleBase.h:80
Definition: DetId.h:18
virtual TrackingRecHit const * hit() const
std::map< uint32_t, SiPixelTrackResidualModule * > theSiPixelStructure
size_type size() const
map size
tuple tracks
Definition: testEve_cfg.py:39
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
const T & get() const
Definition: EventSetup.h:55
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
key_type key() const
Accessor for product key.
Definition: Ref.h:266
int layerName() const
layer id
T const * product() const
Definition: ESHandle.h:62
edm::EDGetTokenT< reco::VertexCollection > offlinePrimaryVerticesToken_
T const * product() const
Definition: Handle.h:81
tuple gY
Definition: corrVsCorr.py:110
double transverseCurvature() const
std::string const & label() const
Definition: InputTag.h:42
const_iterator find(id_type i, bool update=false) const
size_type size() const
Pixel cluster – collection of neighboring pixels above threshold.
tuple cout
Definition: gather_cfg.py:121
int diskName() const
disk id
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:6
const_iterator begin() const
first iterator over the map (read only)
virtual void analyze(const edm::Event &, const edm::EventSetup &)
volatile std::atomic< bool > shutdown_flag false
Definition: DDAxes.h:10
bool isValid() const
Definition: ESHandle.h:37
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
Definition: DQMStore.cc:1056
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
T x() const
Definition: PV3DBase.h:62
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
Definition: vlib.h:208
edm::EDGetTokenT< TrajTrackAssociationCollection > trackAssociationToken_
int layerName() const
layer id
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:639
const_iterator begin(bool update=false) const
Definition: Run.h:41
Pixel Reconstructed Hit.
Definition: DDAxes.h:10