00001
00002
00003
00004
00005
00006
00007 #include <iostream>
00008 #include "CalibTracker/SiPixelErrorEstimation/interface/SiPixelErrorEstimation.h"
00009
00010 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00011 #include "DataFormats/GeometryVector/interface/LocalVector.h"
00012
00013 #include "DataFormats/TrackReco/interface/Track.h"
00014 #include "DataFormats/DetId/interface/DetId.h"
00015 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00016
00017 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
00018 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00019 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00020 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
00021 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00022
00023 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"
00024
00025 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
00026
00027 using namespace std;
00028 using namespace edm;
00029
00030 SiPixelErrorEstimation::SiPixelErrorEstimation(const edm::ParameterSet& ps):tfile_(0), ttree_all_hits_(0), ttree_track_hits_(0)
00031 {
00032
00033 outputFile_ = ps.getUntrackedParameter<string>( "outputFile", "SiPixelErrorEstimation_Ntuple.root" );
00034
00035
00036
00037 src_ = ps.getUntrackedParameter<std::string>( "src", "generalTracks" );
00038
00039 checkType_ = ps.getParameter<bool>( "checkType" );
00040 genType_ = ps.getParameter<int>( "genType" );
00041 include_trk_hits_ = ps.getParameter<bool>( "include_trk_hits" );
00042 }
00043
00044 SiPixelErrorEstimation::~SiPixelErrorEstimation()
00045 {}
00046
00047 void SiPixelErrorEstimation::beginJob()
00048 {
00049 int bufsize = 64000;
00050
00051 if ( include_trk_hits_ )
00052 {
00053
00054
00055 tfile_ = new TFile ( outputFile_.c_str() , "RECREATE");
00056
00057 ttree_track_hits_ = new TTree("TrackHitNtuple", "TrackHitNtuple");
00058
00059 ttree_track_hits_->Branch("evt", &evt, "evt/I", bufsize);
00060 ttree_track_hits_->Branch("run", &run, "run/I", bufsize);
00061
00062 ttree_track_hits_->Branch("subdetId", &subdetId, "subdetId/I", bufsize);
00063
00064 ttree_track_hits_->Branch("layer" , &layer , "layer/I" , bufsize);
00065 ttree_track_hits_->Branch("ladder", &ladder, "ladder/I", bufsize);
00066 ttree_track_hits_->Branch("mod" , &mod , "mod/I" , bufsize);
00067
00068 ttree_track_hits_->Branch("side" , &side , "side/I" , bufsize);
00069 ttree_track_hits_->Branch("disk" , &disk , "disk/I" , bufsize);
00070 ttree_track_hits_->Branch("blade" , &blade , "blade/I" , bufsize);
00071 ttree_track_hits_->Branch("panel" , &panel , "panel/I" , bufsize);
00072 ttree_track_hits_->Branch("plaq" , &plaq , "plaq/I" , bufsize);
00073
00074 ttree_track_hits_->Branch("half" , &half , "half/I" , bufsize);
00075 ttree_track_hits_->Branch("flipped", &flipped, "flipped/I", bufsize);
00076
00077 ttree_track_hits_->Branch("rechitx", &rechitx, "rechitx/F" , bufsize);
00078 ttree_track_hits_->Branch("rechity", &rechity, "rechity/F" , bufsize);
00079 ttree_track_hits_->Branch("rechitz", &rechitz, "rechitz/F" , bufsize);
00080
00081 ttree_track_hits_->Branch("rechiterrx", &rechiterrx, "rechiterrx/F" , bufsize);
00082 ttree_track_hits_->Branch("rechiterry", &rechiterry, "rechiterry/F" , bufsize);
00083
00084 ttree_track_hits_->Branch("rechitresx", &rechitresx, "rechitresx/F" , bufsize);
00085 ttree_track_hits_->Branch("rechitresy", &rechitresy, "rechitresy/F" , bufsize);
00086
00087 ttree_track_hits_->Branch("rechitpullx", &rechitpullx, "rechitpullx/F", bufsize);
00088 ttree_track_hits_->Branch("rechitpully", &rechitpully, "rechitpully/F", bufsize);
00089
00090 ttree_track_hits_->Branch("npix" , &npix , "npix/I" , bufsize);
00091 ttree_track_hits_->Branch("nxpix" , &nxpix , "nxpix/I" , bufsize);
00092 ttree_track_hits_->Branch("nypix" , &nypix , "nypix/I" , bufsize);
00093 ttree_track_hits_->Branch("charge", &charge, "charge/F", bufsize);
00094
00095 ttree_track_hits_->Branch("edgex", &edgex, "edgex/I", bufsize);
00096 ttree_track_hits_->Branch("edgey", &edgey, "edgey/I", bufsize);
00097
00098 ttree_track_hits_->Branch("bigx", &bigx, "bigx/I", bufsize);
00099 ttree_track_hits_->Branch("bigy", &bigy, "bigy/I", bufsize);
00100
00101 ttree_track_hits_->Branch("alpha", &alpha, "alpha/F", bufsize);
00102 ttree_track_hits_->Branch("beta" , &beta , "beta/F" , bufsize);
00103
00104 ttree_track_hits_->Branch("trk_alpha", &trk_alpha, "trk_alpha/F", bufsize);
00105 ttree_track_hits_->Branch("trk_beta" , &trk_beta , "trk_beta/F" , bufsize);
00106
00107 ttree_track_hits_->Branch("phi", &phi, "phi/F", bufsize);
00108 ttree_track_hits_->Branch("eta", &eta, "eta/F", bufsize);
00109
00110 ttree_track_hits_->Branch("simhitx", &simhitx, "simhitx/F", bufsize);
00111 ttree_track_hits_->Branch("simhity", &simhity, "simhity/F", bufsize);
00112
00113 ttree_track_hits_->Branch("nsimhit", &nsimhit, "nsimhit/I", bufsize);
00114 ttree_track_hits_->Branch("pidhit" , &pidhit , "pidhit/I" , bufsize);
00115 ttree_track_hits_->Branch("simproc", &simproc, "simproc/I", bufsize);
00116
00117 ttree_track_hits_->Branch("hit_probx" , &hit_probx , "hit_probx/F" , bufsize);
00118 ttree_track_hits_->Branch("hit_proby" , &hit_proby , "hit_proby/F" , bufsize);
00119 ttree_track_hits_->Branch("hit_cprob0", &hit_cprob0, "hit_cprob0/F", bufsize);
00120 ttree_track_hits_->Branch("hit_cprob1", &hit_cprob1, "hit_cprob1/F", bufsize);
00121 ttree_track_hits_->Branch("hit_cprob2", &hit_cprob2, "hit_cprob2/F", bufsize);
00122
00123 }
00124
00125
00126
00127 ttree_all_hits_ = new TTree("AllHitNtuple", "AllHitNtuple");
00128
00129 ttree_all_hits_->Branch("evt", &evt, "evt/I", bufsize);
00130 ttree_all_hits_->Branch("run", &run, "run/I", bufsize);
00131
00132 ttree_all_hits_->Branch("subdetid", &all_subdetid, "subdetid/I", bufsize);
00133
00134 ttree_all_hits_->Branch("layer" , &all_layer , "layer/I" , bufsize);
00135 ttree_all_hits_->Branch("ladder", &all_ladder, "ladder/I", bufsize);
00136 ttree_all_hits_->Branch("mod" , &all_mod , "mod/I" , bufsize);
00137
00138 ttree_all_hits_->Branch("side" , &all_side , "side/I" , bufsize);
00139 ttree_all_hits_->Branch("disk" , &all_disk , "disk/I" , bufsize);
00140 ttree_all_hits_->Branch("blade" , &all_blade , "blade/I" , bufsize);
00141 ttree_all_hits_->Branch("panel" , &all_panel , "panel/I" , bufsize);
00142 ttree_all_hits_->Branch("plaq" , &all_plaq , "plaq/I" , bufsize);
00143
00144 ttree_all_hits_->Branch("half" , &all_half , "half/I" , bufsize);
00145 ttree_all_hits_->Branch("flipped", &all_flipped, "flipped/I", bufsize);
00146
00147 ttree_all_hits_->Branch("cols", &all_cols, "cols/I", bufsize);
00148 ttree_all_hits_->Branch("rows", &all_rows, "rows/I", bufsize);
00149
00150 ttree_all_hits_->Branch("rechitx" , &all_rechitx , "rechitx/F" , bufsize);
00151 ttree_all_hits_->Branch("rechity" , &all_rechity , "rechity/F" , bufsize);
00152 ttree_all_hits_->Branch("rechitz" , &all_rechitz , "rechitz/F" , bufsize);
00153
00154 ttree_all_hits_->Branch("rechiterrx" , &all_rechiterrx , "rechiterrx/F" , bufsize);
00155 ttree_all_hits_->Branch("rechiterry" , &all_rechiterry , "rechiterry/F" , bufsize);
00156
00157 ttree_all_hits_->Branch("rechitresx" , &all_rechitresx , "rechitresx/F" , bufsize);
00158 ttree_all_hits_->Branch("rechitresy" , &all_rechitresy , "rechitresy/F" , bufsize);
00159
00160 ttree_all_hits_->Branch("rechitpullx", &all_rechitpullx, "rechitpullx/F", bufsize);
00161 ttree_all_hits_->Branch("rechitpully", &all_rechitpully, "rechitpully/F", bufsize);
00162
00163 ttree_all_hits_->Branch("npix" , &all_npix , "npix/I" , bufsize);
00164 ttree_all_hits_->Branch("nxpix" , &all_nxpix , "nxpix/I" , bufsize);
00165 ttree_all_hits_->Branch("nypix" , &all_nypix , "nypix/I" , bufsize);
00166
00167 ttree_all_hits_->Branch("edgex", &all_edgex, "edgex/I", bufsize);
00168 ttree_all_hits_->Branch("edgey", &all_edgey, "edgey/I", bufsize);
00169
00170 ttree_all_hits_->Branch("bigx", &all_bigx, "bigx/I", bufsize);
00171 ttree_all_hits_->Branch("bigy", &all_bigy, "bigy/I", bufsize);
00172
00173 ttree_all_hits_->Branch("alpha", &all_alpha, "alpha/F", bufsize);
00174 ttree_all_hits_->Branch("beta" , &all_beta , "beta/F" , bufsize);
00175
00176 ttree_all_hits_->Branch("simhitx", &all_simhitx, "simhitx/F", bufsize);
00177 ttree_all_hits_->Branch("simhity", &all_simhity, "simhity/F", bufsize);
00178
00179 ttree_all_hits_->Branch("nsimhit", &all_nsimhit, "nsimhit/I", bufsize);
00180 ttree_all_hits_->Branch("pidhit" , &all_pidhit , "pidhit/I" , bufsize);
00181 ttree_all_hits_->Branch("simproc", &all_simproc, "simproc/I", bufsize);
00182
00183 ttree_all_hits_->Branch("vtxr", &all_vtxr, "vtxr/F", bufsize);
00184 ttree_all_hits_->Branch("vtxz", &all_vtxz, "vtxz/F", bufsize);
00185
00186 ttree_all_hits_->Branch("simpx", &all_simpx, "simpx/F", bufsize);
00187 ttree_all_hits_->Branch("simpy", &all_simpy, "simpy/F", bufsize);
00188 ttree_all_hits_->Branch("simpz", &all_simpz, "simpz/F", bufsize);
00189
00190 ttree_all_hits_->Branch("eloss", &all_eloss, "eloss/F", bufsize);
00191
00192 ttree_all_hits_->Branch("simphi", &all_simphi, "simphi/F", bufsize);
00193 ttree_all_hits_->Branch("simtheta", &all_simtheta, "simtheta/F", bufsize);
00194
00195 ttree_all_hits_->Branch("trkid", &all_trkid, "trkid/I", bufsize);
00196
00197 ttree_all_hits_->Branch("x1", &all_x1, "x1/F", bufsize);
00198 ttree_all_hits_->Branch("x2", &all_x2, "x2/F", bufsize);
00199 ttree_all_hits_->Branch("y1", &all_x1, "y1/F", bufsize);
00200 ttree_all_hits_->Branch("y2", &all_x2, "y2/F", bufsize);
00201 ttree_all_hits_->Branch("z1", &all_x1, "z1/F", bufsize);
00202 ttree_all_hits_->Branch("z2", &all_x2, "z2/F", bufsize);
00203
00204 ttree_all_hits_->Branch("row1", &all_row1, "row1/F", bufsize);
00205 ttree_all_hits_->Branch("row2", &all_row2, "row2/F", bufsize);
00206 ttree_all_hits_->Branch("col1", &all_col1, "col1/F", bufsize);
00207 ttree_all_hits_->Branch("col2", &all_col2, "col2/F", bufsize);
00208
00209 ttree_all_hits_->Branch("gx1", &all_gx1, "gx1/F", bufsize);
00210 ttree_all_hits_->Branch("gx2", &all_gx2, "gx2/F", bufsize);
00211 ttree_all_hits_->Branch("gy1", &all_gx1, "gy1/F", bufsize);
00212 ttree_all_hits_->Branch("gy2", &all_gx2, "gy2/F", bufsize);
00213 ttree_all_hits_->Branch("gz1", &all_gx1, "gz1/F", bufsize);
00214 ttree_all_hits_->Branch("gz2", &all_gx2, "gz2/F", bufsize);
00215
00216 ttree_all_hits_->Branch("simtrketa", &all_simtrketa, "simtrketa/F", bufsize);
00217 ttree_all_hits_->Branch("simtrkphi", &all_simtrkphi, "simtrkphi/F", bufsize);
00218
00219 ttree_all_hits_->Branch("clust_row", &all_clust_row, "clust_row/F", bufsize);
00220 ttree_all_hits_->Branch("clust_col", &all_clust_col, "clust_col/F", bufsize);
00221
00222 ttree_all_hits_->Branch("clust_x", &all_clust_x, "clust_x/F", bufsize);
00223 ttree_all_hits_->Branch("clust_y", &all_clust_y, "clust_y/F", bufsize);
00224
00225 ttree_all_hits_->Branch("clust_q", &all_clust_q, "clust_q/F", bufsize);
00226
00227 ttree_all_hits_->Branch("clust_maxpixcol", &all_clust_maxpixcol, "clust_maxpixcol/I", bufsize);
00228 ttree_all_hits_->Branch("clust_maxpixrow", &all_clust_maxpixrow, "clust_maxpixrow/I", bufsize);
00229 ttree_all_hits_->Branch("clust_minpixcol", &all_clust_minpixcol, "clust_minpixcol/I", bufsize);
00230 ttree_all_hits_->Branch("clust_minpixrow", &all_clust_minpixrow, "clust_minpixrow/I", bufsize);
00231
00232 ttree_all_hits_->Branch("clust_geoid", &all_clust_geoid, "clust_geoid/I", bufsize);
00233
00234 ttree_all_hits_->Branch("clust_alpha", &all_clust_alpha, "clust_alpha/F", bufsize);
00235 ttree_all_hits_->Branch("clust_beta" , &all_clust_beta , "clust_beta/F" , bufsize);
00236
00237 ttree_all_hits_->Branch("rowpix", all_pixrow, "row[npix]/F", bufsize);
00238 ttree_all_hits_->Branch("colpix", all_pixcol, "col[npix]/F", bufsize);
00239 ttree_all_hits_->Branch("adc", all_pixadc, "adc[npix]/F", bufsize);
00240 ttree_all_hits_->Branch("xpix", all_pixx, "x[npix]/F", bufsize);
00241 ttree_all_hits_->Branch("ypix", all_pixy, "y[npix]/F", bufsize);
00242 ttree_all_hits_->Branch("gxpix", all_pixgx, "gx[npix]/F", bufsize);
00243 ttree_all_hits_->Branch("gypix", all_pixgy, "gy[npix]/F", bufsize);
00244 ttree_all_hits_->Branch("gzpix", all_pixgz, "gz[npix]/F", bufsize);
00245
00246 ttree_all_hits_->Branch("all_hit_probx", &all_hit_probx, "all_hit_probx/F" , bufsize);
00247 ttree_all_hits_->Branch("all_hit_proby", &all_hit_proby, "all_hit_proby/F" , bufsize);
00248 ttree_all_hits_->Branch("all_hit_cprob0", &all_hit_cprob0, "all_hit_cprob0/F", bufsize);
00249 ttree_all_hits_->Branch("all_hit_cprob1", &all_hit_cprob1, "all_hit_cprob1/F", bufsize);
00250 ttree_all_hits_->Branch("all_hit_cprob2", &all_hit_cprob2, "all_hit_cprob2/F", bufsize);
00251
00252 }
00253
00254 void SiPixelErrorEstimation::endJob()
00255 {
00256 tfile_->Write();
00257 tfile_->Close();
00258 }
00259
00260 void
00261 SiPixelErrorEstimation::analyze(const edm::Event& e, const edm::EventSetup& es)
00262 {
00263 using namespace edm;
00264
00265 run = e.id().run();
00266 evt = e.id().event();
00267
00268 if ( evt%1000 == 0 )
00269 cout << "evt = " << evt << endl;
00270
00271 float math_pi = 3.14159265;
00272 float radtodeg = 180.0 / math_pi;
00273
00274 DetId detId;
00275
00276 LocalPoint position;
00277 LocalError error;
00278 float mindist = 999999.9;
00279
00280 std::vector<PSimHit> matched;
00281 TrackerHitAssociator associate(e);
00282
00283 edm::ESHandle<TrackerGeometry> pDD;
00284 es.get<TrackerDigiGeometryRecord> ().get (pDD);
00285 const TrackerGeometry* tracker = &(* pDD);
00286
00287
00288 edm::Handle<SiPixelRecHitCollection> recHitColl;
00289 e.getByLabel( "siPixelRecHits", recHitColl);
00290
00291 Handle<edm::SimTrackContainer> simtracks;
00292 e.getByLabel("g4SimHits", simtracks);
00293
00294
00295 for (TrackerGeometry::DetContainer::const_iterator it = pDD->dets().begin(); it != pDD->dets().end(); it++)
00296 {
00297 DetId detId = ((*it)->geographicalId());
00298
00299 SiPixelRecHitCollection::const_iterator dsmatch = recHitColl->find(detId);
00300 if (dsmatch == recHitColl->end()) continue;
00301
00302 SiPixelRecHitCollection::DetSet pixelrechitRange = *dsmatch;
00303 SiPixelRecHitCollection::DetSet::const_iterator pixelrechitRangeIteratorBegin = pixelrechitRange.begin();
00304 SiPixelRecHitCollection::DetSet::const_iterator pixelrechitRangeIteratorEnd = pixelrechitRange.end();
00305 SiPixelRecHitCollection::DetSet::const_iterator pixeliter = pixelrechitRangeIteratorBegin;
00306 std::vector<PSimHit> matched;
00307
00308
00309 for ( ; pixeliter != pixelrechitRangeIteratorEnd; ++pixeliter)
00310 {
00311 matched.clear();
00312 matched = associate.associateHit(*pixeliter);
00313
00314
00315 if ( matched.empty() )
00316 {
00317 cout << "SiPixelErrorEstimation::analyze: rechits without associated simhit !!!!!!!"
00318 << endl;
00319 continue;
00320 }
00321
00322 all_subdetid = -9999;
00323
00324 all_layer = -9999;
00325 all_ladder = -9999;
00326 all_mod = -9999;
00327
00328 all_side = -9999;
00329 all_disk = -9999;
00330 all_blade = -9999;
00331 all_panel = -9999;
00332 all_plaq = -9999;
00333
00334 all_half = -9999;
00335 all_flipped = -9999;
00336
00337 all_cols = -9999;
00338 all_rows = -9999;
00339
00340 all_rechitx = -9999;
00341 all_rechity = -9999;
00342 all_rechitz = -9999;
00343
00344 all_simhitx = -9999;
00345 all_simhity = -9999;
00346
00347 all_rechiterrx = -9999;
00348 all_rechiterry = -9999;
00349
00350 all_rechitresx = -9999;
00351 all_rechitresy = -9999;
00352
00353 all_rechitpullx = -9999;
00354 all_rechitpully = -9999;
00355
00356 all_npix = -9999;
00357 all_nxpix = -9999;
00358 all_nypix = -9999;
00359
00360 all_edgex = -9999;
00361 all_edgey = -9999;
00362
00363 all_bigx = -9999;
00364 all_bigy = -9999;
00365
00366 all_alpha = -9999;
00367 all_beta = -9999;
00368
00369 all_simphi = -9999;
00370 all_simtheta = -9999;
00371
00372 all_simhitx = -9999;
00373 all_simhity = -9999;
00374
00375 all_nsimhit = -9999;
00376 all_pidhit = -9999;
00377 all_simproc = -9999;
00378
00379 all_vtxr = -9999;
00380 all_vtxz = -9999;
00381
00382 all_simpx = -9999;
00383 all_simpy = -9999;
00384 all_simpz = -9999;
00385
00386 all_eloss = -9999;
00387
00388 all_trkid = -9999;
00389
00390 all_x1 = -9999;
00391 all_x2 = -9999;
00392 all_y1 = -9999;
00393 all_y2 = -9999;
00394 all_z1 = -9999;
00395 all_z2 = -9999;
00396
00397 all_row1 = -9999;
00398 all_row2 = -9999;
00399 all_col1 = -9999;
00400 all_col2 = -9999;
00401
00402 all_gx1 = -9999;
00403 all_gx2 = -9999;
00404 all_gy1 = -9999;
00405 all_gy2 = -9999;
00406 all_gz1 = -9999;
00407 all_gz2 = -9999;
00408
00409 all_simtrketa = -9999;
00410 all_simtrkphi = -9999;
00411
00412 all_clust_row = -9999;
00413 all_clust_col = -9999;
00414
00415 all_clust_x = -9999;
00416 all_clust_y = -9999;
00417
00418 all_clust_q = -9999;
00419
00420 all_clust_maxpixcol = -9999;
00421 all_clust_maxpixrow = -9999;
00422 all_clust_minpixcol = -9999;
00423 all_clust_minpixrow = -9999;
00424
00425 all_clust_geoid = -9999;
00426
00427 all_clust_alpha = -9999;
00428 all_clust_beta = -9999;
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 all_hit_probx = -9999;
00445 all_hit_proby = -9999;
00446 all_hit_cprob0 = -9999;
00447 all_hit_cprob1 = -9999;
00448 all_hit_cprob2 = -9999;
00449
00450 all_nsimhit = (int)matched.size();
00451
00452 all_subdetid = (int)detId.subdetId();
00453
00454 if ( !(all_subdetid==1 || all_subdetid==2) )
00455 {
00456 cout << "SiPixelErrorEstimation::analyze: Not in a pixel detector !!!!!" << endl;
00457 continue;
00458 }
00459
00460 const PixelGeomDetUnit* theGeomDet
00461 = dynamic_cast<const PixelGeomDetUnit*> ( tracker->idToDet(detId) );
00462
00463 const PixelTopology* topol = &(theGeomDet->specificTopology());
00464
00465 const int maxPixelCol = pixeliter->cluster()->maxPixelCol();
00466 const int maxPixelRow = pixeliter->cluster()->maxPixelRow();
00467 const int minPixelCol = pixeliter->cluster()->minPixelCol();
00468 const int minPixelRow = pixeliter->cluster()->minPixelRow();
00469
00470
00471
00472 all_hit_cprob0 = (float)pixeliter->clusterProbability(0);
00473 all_hit_cprob1 = (float)pixeliter->clusterProbability(1);
00474 all_hit_cprob2 = (float)pixeliter->clusterProbability(2);
00475
00476
00477 if ( topol->isItEdgePixelInX( minPixelRow ) ||
00478 topol->isItEdgePixelInX( maxPixelRow ) )
00479 all_edgex = 1;
00480 else
00481 all_edgex = 0;
00482
00483 if ( topol->isItEdgePixelInY( minPixelCol ) ||
00484 topol->isItEdgePixelInY( maxPixelCol ) )
00485 all_edgey = 1;
00486 else
00487 all_edgey = 0;
00488
00489
00490 if ( topol->containsBigPixelInX(minPixelRow, maxPixelRow) )
00491 all_bigx = 1;
00492 else
00493 all_bigx = 0;
00494
00495 if ( topol->containsBigPixelInY(minPixelCol, maxPixelCol) )
00496 all_bigy = 1;
00497 else
00498 all_bigy = 0;
00499
00500 if ( (int)detId.subdetId() == (int)PixelSubdetector::PixelBarrel )
00501 {
00502 PXBDetId bdetid(detId);
00503 all_layer = bdetid.layer();
00504 all_ladder = bdetid.ladder();
00505 all_mod = bdetid.module();
00506
00507 int tmp_nrows = theGeomDet->specificTopology().nrows();
00508 if ( tmp_nrows == 80 )
00509 all_half = 1;
00510 else if ( tmp_nrows == 160 )
00511 all_half = 0;
00512 else
00513 cout << "-------------------------------------------------- Wrong module size !!!" << endl;
00514
00515 float tmp1 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,0.)).perp();
00516 float tmp2 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,1.)).perp();
00517
00518 if ( tmp2<tmp1 )
00519 all_flipped = 1;
00520 else
00521 all_flipped = 0;
00522 }
00523 else if ( (int)detId.subdetId() == (int)PixelSubdetector::PixelEndcap )
00524 {
00525 PXFDetId fdetid(detId);
00526 all_side = fdetid.side();
00527 all_disk = fdetid.disk();
00528 all_blade = fdetid.blade();
00529 all_panel = fdetid.panel();
00530 all_plaq = fdetid.module();
00531
00532 }
00533 else std::cout << "We are not in the pixel detector" << (int)detId.subdetId() << endl;
00534
00535 all_cols = theGeomDet->specificTopology().ncolumns();
00536 all_rows = theGeomDet->specificTopology().nrows();
00537
00538 LocalPoint lp = pixeliter->localPosition();
00539
00540 all_rechitx = lp.x();
00541 all_rechity = lp.y();
00542 all_rechitz = lp.z();
00543
00544 LocalError le = pixeliter->localPositionError();
00545 all_rechiterrx = sqrt( le.xx() );
00546 all_rechiterry = sqrt( le.yy() );
00547
00548 bool found_hit_from_generated_particle = false;
00549
00550
00551 float closest_dist = 99999.9;
00552 std::vector<PSimHit>::const_iterator closest_simhit = matched.begin();
00553
00554 for (std::vector<PSimHit>::const_iterator m = matched.begin(); m < matched.end(); m++)
00555 {
00556 if ( checkType_ )
00557 {
00558 int pid = (*m).particleType();
00559 if ( abs(pid) != genType_ )
00560 continue;
00561 }
00562
00563 float simhitx = 0.5 * ( (*m).entryPoint().x() + (*m).exitPoint().x() );
00564 float simhity = 0.5 * ( (*m).entryPoint().y() + (*m).exitPoint().y() );
00565
00566 float x_res = simhitx - rechitx;
00567 float y_res = simhity - rechity;
00568
00569 float dist = sqrt( x_res*x_res + y_res*y_res );
00570
00571 if ( dist < closest_dist )
00572 {
00573 closest_dist = dist;
00574 closest_simhit = m;
00575 found_hit_from_generated_particle = true;
00576 }
00577 }
00578
00579
00580
00581 if ( checkType_ && !found_hit_from_generated_particle )
00582 continue;
00583
00584 all_x1 = (*closest_simhit).entryPoint().x();
00585 all_y1 = (*closest_simhit).entryPoint().y();
00586 all_z1 = (*closest_simhit).entryPoint().z();
00587 all_x2 = (*closest_simhit).exitPoint().x();
00588 all_y2 = (*closest_simhit).exitPoint().y();
00589 all_z2 = (*closest_simhit).exitPoint().z();
00590 GlobalPoint GP1 =
00591 theGeomDet->surface().toGlobal( Local3DPoint( (*closest_simhit).entryPoint().x(),
00592 (*closest_simhit).entryPoint().y(),
00593 (*closest_simhit).entryPoint().z() ) );
00594 GlobalPoint GP2 =
00595 theGeomDet->surface().toGlobal (Local3DPoint( (*closest_simhit).exitPoint().x(),
00596 (*closest_simhit).exitPoint().y(),
00597 (*closest_simhit).exitPoint().z() ) );
00598 all_gx1 = GP1.x();
00599 all_gx2 = GP2.x();
00600 all_gy1 = GP1.y();
00601 all_gy2 = GP2.y();
00602 all_gz1 = GP1.z();
00603 all_gz2 = GP2.z();
00604
00605 MeasurementPoint mp1 =
00606 topol->measurementPosition( LocalPoint( (*closest_simhit).entryPoint().x(),
00607 (*closest_simhit).entryPoint().y(),
00608 (*closest_simhit).entryPoint().z() ) );
00609 MeasurementPoint mp2 =
00610 topol->measurementPosition( LocalPoint( (*closest_simhit).exitPoint().x(),
00611 (*closest_simhit).exitPoint().y(),
00612 (*closest_simhit).exitPoint().z() ) );
00613 all_row1 = mp1.x();
00614 all_col1 = mp1.y();
00615 all_row2 = mp2.x();
00616 all_col2 = mp2.y();
00617
00618 all_simhitx = 0.5*(all_x1+all_x2);
00619 all_simhity = 0.5*(all_y1+all_y2);
00620
00621 all_rechitresx = all_rechitx - all_simhitx;
00622 all_rechitresy = all_rechity - all_simhity;
00623
00624 all_rechitpullx = all_rechitresx / all_rechiterrx;
00625 all_rechitpully = all_rechitresy / all_rechiterry;
00626
00627 SiPixelRecHit::ClusterRef const& clust = pixeliter->cluster();
00628
00629 all_npix = clust->size();
00630 all_nxpix = clust->sizeX();
00631 all_nypix = clust->sizeY();
00632
00633 all_clust_row = clust->x();
00634 all_clust_col = clust->y();
00635
00636 LocalPoint lp2 = topol->localPosition( MeasurementPoint( all_clust_row, all_clust_col ) );
00637 all_clust_x = lp2.x();
00638 all_clust_y = lp2.y();
00639
00640 all_clust_q = clust->charge();
00641
00642 all_clust_maxpixcol = clust->maxPixelCol();
00643 all_clust_maxpixrow = clust->maxPixelRow();
00644 all_clust_minpixcol = clust->minPixelCol();
00645 all_clust_minpixrow = clust->minPixelRow();
00646
00647 all_clust_geoid = clust->geographicalId();
00648
00649 all_simpx = (*closest_simhit).momentumAtEntry().x();
00650 all_simpy = (*closest_simhit).momentumAtEntry().y();
00651 all_simpz = (*closest_simhit).momentumAtEntry().z();
00652 all_eloss = (*closest_simhit).energyLoss();
00653 all_simphi = (*closest_simhit).phiAtEntry();
00654 all_simtheta = (*closest_simhit).thetaAtEntry();
00655 all_pidhit = (*closest_simhit).particleType();
00656 all_trkid = (*closest_simhit).trackId();
00657
00658
00659 all_beta = atan2(all_simpz, all_simpy);
00660 all_alpha = atan2(all_simpz, all_simpx);
00661
00662 all_simproc = (int)closest_simhit->processType();
00663
00664 const edm::SimTrackContainer& trks = *(simtracks.product());
00665 SimTrackContainer::const_iterator trksiter;
00666 for (trksiter = trks.begin(); trksiter != trks.end(); trksiter++)
00667 if ( (int)trksiter->trackId() == all_trkid )
00668 {
00669 all_simtrketa = trksiter->momentum().eta();
00670 all_simtrkphi = trksiter->momentum().phi();
00671 }
00672
00673 all_vtxz = theGeomDet->surface().position().z();
00674 all_vtxr = theGeomDet->surface().position().perp();
00675
00676
00677
00678
00679
00680 const std::vector<SiPixelCluster::Pixel>& pixvector = clust->pixels();
00681 for ( int i=0; i<(int)pixvector.size(); ++i)
00682 {
00683 SiPixelCluster::Pixel holdpix = pixvector[i];
00684 all_pixrow[i] = holdpix.x;
00685 all_pixcol[i] = holdpix.y;
00686 all_pixadc[i] = holdpix.adc;
00687 LocalPoint lp = topol->localPosition(MeasurementPoint(holdpix.x, holdpix.y));
00688 all_pixx[i] = lp.x();
00689 all_pixy[i]= lp.y();
00690 GlobalPoint GP = theGeomDet->surface().toGlobal(Local3DPoint(lp.x(),lp.y(),lp.z()));
00691 all_pixgx[i] = GP.x();
00692 all_pixgy[i]= GP.y();
00693 all_pixgz[i]= GP.z();
00694 }
00695
00696 ttree_all_hits_->Fill();
00697
00698 }
00699
00700 }
00701
00702
00703
00704
00705
00706
00707
00708 if ( include_trk_hits_ )
00709 {
00710
00711 edm::Handle<reco::TrackCollection> trackCollection;
00712 e.getByLabel(src_, trackCollection);
00713 const reco::TrackCollection *tracks = trackCollection.product();
00714 reco::TrackCollection::const_iterator tciter;
00715
00716 if ( tracks->size() > 0 )
00717 {
00718
00719 for ( tciter=tracks->begin(); tciter!=tracks->end(); ++tciter)
00720 {
00721
00722 for ( trackingRecHit_iterator it = tciter->recHitsBegin(); it != tciter->recHitsEnd(); ++it)
00723 {
00724 const TrackingRecHit &thit = **it;
00725
00726 const SiPixelRecHit* matchedhit = dynamic_cast<const SiPixelRecHit*>(&thit);
00727
00728 if ( matchedhit )
00729 {
00730 rechitx = -9999.9;
00731 rechity = -9999.9;
00732 rechitz = -9999.9;
00733 rechiterrx = -9999.9;
00734 rechiterry = -9999.9;
00735 rechitresx = -9999.9;
00736 rechitresy = -9999.9;
00737 rechitpullx = -9999.9;
00738 rechitpully = -9999.9;
00739
00740 npix = -9999;
00741 nxpix = -9999;
00742 nypix = -9999;
00743 charge = -9999.9;
00744
00745 edgex = -9999;
00746 edgey = -9999;
00747
00748 bigx = -9999;
00749 bigy = -9999;
00750
00751 alpha = -9999.9;
00752 beta = -9999.9;
00753
00754 phi = -9999.9;
00755 eta = -9999.9;
00756
00757 subdetId = -9999;
00758
00759 layer = -9999;
00760 ladder = -9999;
00761 mod = -9999;
00762 side = -9999;
00763 disk = -9999;
00764 blade = -9999;
00765 panel = -9999;
00766 plaq = -9999;
00767
00768 half = -9999;
00769 flipped = -9999;
00770
00771 nsimhit = -9999;
00772 pidhit = -9999;
00773 simproc = -9999;
00774
00775 simhitx = -9999.9;
00776 simhity = -9999.9;
00777
00778 hit_probx = -9999.9;
00779 hit_proby = -9999.9;
00780 hit_cprob0 = -9999.9;
00781 hit_cprob1 = -9999.9;
00782 hit_cprob2 = -9999.9;
00783
00784 position = (*it)->localPosition();
00785 error = (*it)->localPositionError();
00786
00787 rechitx = position.x();
00788 rechity = position.y();
00789 rechitz = position.z();
00790 rechiterrx = sqrt(error.xx());
00791 rechiterry = sqrt(error.yy());
00792
00793 npix = matchedhit->cluster()->size();
00794 nxpix = matchedhit->cluster()->sizeX();
00795 nypix = matchedhit->cluster()->sizeY();
00796 charge = matchedhit->cluster()->charge();
00797
00798
00799
00800 hit_cprob0 = (float)matchedhit->clusterProbability(0);
00801 hit_cprob1 = (float)matchedhit->clusterProbability(1);
00802 hit_cprob2 = (float)matchedhit->clusterProbability(2);
00803
00804
00805
00806 matched.clear();
00807 matched = associate.associateHit(*matchedhit);
00808
00809 nsimhit = (int)matched.size();
00810
00811 if ( !matched.empty() )
00812 {
00813 mindist = 999999.9;
00814 float distx, disty, dist;
00815 bool found_hit_from_generated_particle = false;
00816
00817 int n_assoc_muon = 0;
00818
00819 vector<PSimHit>::const_iterator closestit = matched.begin();
00820 for (vector<PSimHit>::const_iterator m=matched.begin(); m<matched.end(); ++m)
00821 {
00822 if ( checkType_ )
00823 {
00824 int pid = (*m).particleType();
00825 if ( abs(pid) != genType_ )
00826 continue;
00827 }
00828
00829 float simhitx = 0.5 * ( (*m).entryPoint().x() + (*m).exitPoint().x() );
00830 float simhity = 0.5 * ( (*m).entryPoint().y() + (*m).exitPoint().y() );
00831
00832 distx = fabs(rechitx - simhitx);
00833 disty = fabs(rechity - simhity);
00834 dist = sqrt( distx*distx + disty*disty );
00835
00836 if ( dist < mindist )
00837 {
00838 n_assoc_muon++;
00839
00840 mindist = dist;
00841 closestit = m;
00842 found_hit_from_generated_particle = true;
00843 }
00844 }
00845
00846
00847
00848 if ( checkType_ && !found_hit_from_generated_particle )
00849 continue;
00850
00851
00852
00853
00854
00855
00856
00857 detId = (*it)->geographicalId();
00858
00859 const PixelGeomDetUnit* theGeomDet =
00860 dynamic_cast<const PixelGeomDetUnit*> ((*tracker).idToDet(detId) );
00861
00862 const PixelTopology* theTopol = &(theGeomDet->specificTopology());
00863
00864 pidhit = (*closestit).particleType();
00865 simproc = (int)(*closestit).processType();
00866
00867 simhitx = 0.5*( (*closestit).entryPoint().x() + (*closestit).exitPoint().x() );
00868 simhity = 0.5*( (*closestit).entryPoint().y() + (*closestit).exitPoint().y() );
00869
00870 rechitresx = rechitx - simhitx;
00871 rechitresy = rechity - simhity;
00872 rechitpullx = ( rechitx - simhitx ) / sqrt(error.xx());
00873 rechitpully = ( rechity - simhity ) / sqrt(error.yy());
00874
00875 float simhitpx = (*closestit).momentumAtEntry().x();
00876 float simhitpy = (*closestit).momentumAtEntry().y();
00877 float simhitpz = (*closestit).momentumAtEntry().z();
00878
00879 beta = atan2(simhitpz, simhitpy) * radtodeg;
00880 alpha = atan2(simhitpz, simhitpx) * radtodeg;
00881
00882
00883
00884
00885
00886 float locx = simhitpx;
00887 float locy = simhitpy;
00888 float locz = simhitpz;
00889
00890 bool isFlipped = false;
00891 float tmp1 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,0.)).perp();
00892 float tmp2 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,1.)).perp();
00893 if ( tmp2<tmp1 )
00894 isFlipped = true;
00895 else
00896 isFlipped = false;
00897
00898 trk_alpha = acos(locx/sqrt(locx*locx+locz*locz)) * radtodeg;
00899 if ( isFlipped )
00900 trk_alpha = 180.0 - trk_alpha ;
00901
00902 trk_beta = acos(locy/sqrt(locy*locy+locz*locz)) * radtodeg;
00903
00904
00905 phi = tciter->momentum().phi() / math_pi*180.0;
00906 eta = tciter->momentum().eta();
00907
00908 const int maxPixelCol = (*matchedhit).cluster()->maxPixelCol();
00909 const int maxPixelRow = (*matchedhit).cluster()->maxPixelRow();
00910 const int minPixelCol = (*matchedhit).cluster()->minPixelCol();
00911 const int minPixelRow = (*matchedhit).cluster()->minPixelRow();
00912
00913
00914 if ( theTopol->isItEdgePixelInX( minPixelRow ) ||
00915 theTopol->isItEdgePixelInX( maxPixelRow ) )
00916 edgex = 1;
00917 else
00918 edgex = 0;
00919
00920 if ( theTopol->isItEdgePixelInY( minPixelCol ) ||
00921 theTopol->isItEdgePixelInY( maxPixelCol ) )
00922 edgey = 1;
00923 else
00924 edgey = 0;
00925
00926
00927 if ( theTopol->containsBigPixelInX(minPixelRow, maxPixelRow) )
00928 bigx = 1;
00929 else
00930 bigx = 0;
00931
00932 if ( theTopol->containsBigPixelInY(minPixelCol, maxPixelCol) )
00933 bigy = 1;
00934 else
00935 bigy = 0;
00936
00937 subdetId = (int)detId.subdetId();
00938
00939 if ( (int)detId.subdetId() == (int)PixelSubdetector::PixelBarrel )
00940 {
00941
00942 int tmp_nrows = theGeomDet->specificTopology().nrows();
00943 if ( tmp_nrows == 80 )
00944 half = 1;
00945 else if ( tmp_nrows == 160 )
00946 half = 0;
00947 else
00948 cout << "-------------------------------------------------- Wrong module size !!!" << endl;
00949
00950 float tmp1 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,0.)).perp();
00951 float tmp2 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,1.)).perp();
00952
00953 if ( tmp2<tmp1 )
00954 flipped = 1;
00955 else
00956 flipped = 0;
00957
00958 PXBDetId bdetid(detId);
00959 layer = bdetid.layer();
00960 ladder = bdetid.ladder();
00961 mod = bdetid.module();
00962 }
00963 else if ( (int)detId.subdetId() == (int)PixelSubdetector::PixelEndcap )
00964 {
00965 PXFDetId fdetid(detId);
00966 side = fdetid.side();
00967 disk = fdetid.disk();
00968 blade = fdetid.blade();
00969 panel = fdetid.panel();
00970 plaq = fdetid.module();
00971
00972 float tmp1 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,0.)).perp();
00973 float tmp2 = theGeomDet->surface().toGlobal(Local3DPoint(0.,0.,1.)).perp();
00974
00975 if ( tmp2<tmp1 )
00976 flipped = 1;
00977 else
00978 flipped = 0;
00979
00980 }
00981
00982
00983 ttree_track_hits_->Fill();
00984
00985 }
00986 else
00987 cout << "---------------- RecHit with no associated SimHit !!! -------------------------- " << endl;
00988
00989 }
00990
00991 }
00992
00993 }
00994
00995 }
00996
00997 }
00998
00999
01000
01001 }
01002
01003 void SiPixelErrorEstimation::
01004 computeAnglesFromDetPosition(const SiPixelCluster & cl,
01005 const GeomDetUnit & det,
01006 float& alpha, float& beta )
01007 {
01008
01009 const PixelGeomDetUnit* theDet = dynamic_cast<const PixelGeomDetUnit*>( &det );
01010 if (! theDet)
01011 {
01012 cout << "---------------------------------------------- Not a pixel detector !!!!!!!!!!!!!!" << endl;
01013 assert(0);
01014 }
01015
01016 const PixelTopology* theTopol = &(theDet->specificTopology());
01017
01018
01019 float xcenter = cl.x();
01020 float ycenter = cl.y();
01021
01022
01023 LocalPoint lp = theTopol->localPosition( MeasurementPoint(xcenter, ycenter) );
01024
01025
01026
01027 GlobalPoint gp = theDet->surface().toGlobal( lp );
01028 float gp_mod = sqrt( gp.x()*gp.x() + gp.y()*gp.y() + gp.z()*gp.z() );
01029
01030
01031 float gpx = gp.x()/gp_mod;
01032 float gpy = gp.y()/gp_mod;
01033 float gpz = gp.z()/gp_mod;
01034
01035
01036
01037 GlobalVector gv(gpx, gpy, gpz);
01038
01039
01040 const Local3DVector lvx(1.0, 0.0, 0.0);
01041
01042
01043 GlobalVector gvx = theDet->surface().toGlobal( lvx );
01044
01045
01046 const Local3DVector lvy(0.0, 1.0, 0.0);
01047
01048
01049 GlobalVector gvy = theDet->surface().toGlobal( lvy );
01050
01051
01052 const Local3DVector lvz(0.0, 0.0, 1.0);
01053
01054
01055 GlobalVector gvz = theDet->surface().toGlobal( lvz );
01056
01057
01058
01059
01060 float gv_dot_gvx = gv.x()*gvx.x() + gv.y()*gvx.y() + gv.z()*gvx.z();
01061 float gv_dot_gvy = gv.x()*gvy.x() + gv.y()*gvy.y() + gv.z()*gvy.z();
01062 float gv_dot_gvz = gv.x()*gvz.x() + gv.y()*gvz.y() + gv.z()*gvz.z();
01063
01064
01065 alpha = atan2( gv_dot_gvz, gv_dot_gvx );
01066 beta = atan2( gv_dot_gvz, gv_dot_gvy );
01067
01068
01069
01070
01071
01072
01073
01074 }
01075
01076
01077 DEFINE_FWK_MODULE(SiPixelErrorEstimation);