00001
00002 #include "TVector3.h"
00003 #include <TH2.h>
00004 #include <TLine.h>
00005 #include <TLatex.h>
00006 #include <TPaveText.h>
00007 #include <TCanvas.h>
00008 #include <TEveWindow.h>
00009
00010 #include "DataFormats/TrackReco/interface/Track.h"
00011 #include "DataFormats/TrackReco/interface/HitPattern.h"
00012 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00013
00014 #include "Fireworks/Core/interface/FWDetailView.h"
00015 #include "Fireworks/Core/interface/FWGeometry.h"
00016 #include "Fireworks/Core/interface/FWEventItem.h"
00017 #include "Fireworks/Core/interface/FWModelId.h"
00018 #include "Fireworks/Core/interface/fwLog.h"
00019 #include "Fireworks/Tracks/plugins/FWTrackResidualDetailView.h"
00020
00021 using reco::Track;
00022 using reco::TrackBase;
00023 using reco::HitPattern;
00024 using reco::TrackResiduals;
00025
00026 const char* FWTrackResidualDetailView::m_det_tracker_str[6]={"PXB","PXF","TIB","TID","TOB","TEC"};
00027
00028 FWTrackResidualDetailView::FWTrackResidualDetailView ():
00029 m_ndet(0),
00030 m_nhits(0),
00031 m_resXFill(3007),
00032 m_resXCol(kGreen-9),
00033 m_resYFill(3006),
00034 m_resYCol(kWhite),
00035 m_stereoFill(3004),
00036 m_stereoCol(kCyan-9),
00037 m_invalidFill(3001),
00038 m_invalidCol(kRed)
00039 {
00040 memset(m_det, 0, sizeof(m_det));
00041 memset(res, 0, sizeof(res));
00042 memset(hittype, 0, sizeof(hittype));
00043 memset(stereo, 0, sizeof(stereo));
00044 memset(substruct, 0, sizeof(substruct));
00045 memset(subsubstruct, 0, sizeof(subsubstruct));
00046 memset(m_detector, 0, sizeof(m_detector));
00047 }
00048
00049 FWTrackResidualDetailView::~FWTrackResidualDetailView ()
00050 {
00051 }
00052
00053 void
00054 FWTrackResidualDetailView::prepareData(const FWModelId &id, const reco::Track* track)
00055 {
00056 HitPattern hitpat = track->hitPattern();
00057 TrackResiduals residuals = track->residuals();
00058
00059 const FWGeometry *geom = id.item()->getGeom();
00060 assert(geom != 0);
00061 m_nhits=hitpat.numberOfHits();
00062 for (int i = 0; i < m_nhits; ++i) {
00063
00064
00065 hittype[i] = 0x3 & hitpat.getHitPattern(i);
00066 stereo[i] = 0x1 & hitpat.getHitPattern(i) >> 2;
00067 subsubstruct[i] = 0xf & hitpat.getHitPattern(i) >> 3;
00068 substruct[i] = 0x7 & hitpat.getHitPattern(i) >> 7;
00069 m_detector[i] = 0x01 & hitpat.getHitPattern(i) >> 10;
00070 if ((*(track->recHitsBegin() + i))->isValid()) {
00071 res[0][i] = getSignedResidual(geom,
00072 (*(track->recHitsBegin() + i))->geographicalId().rawId(),
00073 residuals.residualX(i, hitpat));
00074 } else {
00075 res[0][i] = 0;
00076 }
00077 res[1][i] = residuals.residualY(i, hitpat);
00078
00079 }
00080
00081 m_det[0]=0;
00082 for(int j=0; j < m_nhits-1;) {
00083 int k=j+1;
00084 for(; k<m_nhits ; k++) {
00085 if(substruct[j]==substruct[k] && subsubstruct[j]==subsubstruct[k]) {
00086 if(k==(m_nhits-1)) j=k;
00087 }
00088 else {
00089 m_ndet++;
00090 j=k;
00091 m_det[m_ndet]=j;
00092 break;
00093 }
00094 }
00095 }
00096 m_ndet++;
00097 m_det[m_ndet]=m_nhits;
00098
00099 }
00100
00101 void
00102 FWTrackResidualDetailView::build (const FWModelId &id, const reco::Track* track)
00103 {
00104 if (!track->extra().isAvailable()) {
00105 fwLog(fwlog::kError) << " no track extra information is available.\n";
00106 m_viewCanvas->cd();
00107 TLatex* latex = new TLatex();
00108 latex->SetTextSize(0.1);
00109 latex->DrawLatex(0.1, 0.5, "No track extra information");
00110 return;
00111 }
00112 prepareData(id, track);
00113
00114
00115 m_viewCanvas->cd();
00116 m_viewCanvas->SetHighLightColor(-1);
00117 TH2F* h_res = new TH2F("h_resx","h_resx",10,-5.5,5.5,m_ndet,0,m_ndet);
00118 TPad* padX = new TPad("pad1","pad1", 0.2, 0., 0.8, 0.99);
00119 padX->SetBorderMode(0);
00120 padX->SetLeftMargin(0.2);
00121 padX->Draw();
00122 padX->cd();
00123 padX->SetFrameLineWidth(0);
00124 padX->Modified();
00125 h_res->SetDirectory(0);
00126 h_res->SetStats(kFALSE);
00127 h_res->SetTitle("");
00128 h_res->SetXTitle("residual");
00129 h_res->GetXaxis()->SetTickLength(0);
00130 h_res->GetYaxis()->SetTickLength(0);
00131 h_res->GetXaxis()->SetNdivisions(20);
00132 h_res->GetYaxis()->SetLabelSize(0.06);
00133 h_res->Draw();
00134 padX->SetGridy();
00135
00136 float larray[9]={0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.5, 4.5, 5.5};
00137 float larray2[8];
00138 for(int l=0; l<8; l++) {
00139 float diff2=(larray[l+1]-larray[l])/2;
00140 larray2[l]=larray[l]+diff2;
00141
00142 }
00143
00144 int resi[2][64];
00145 for(int l=0; l<m_nhits; l++) {
00146 for(int k=0; k<8; k++) {
00147 if(fabs(res[0][l])==larray2[k])
00148 resi[0][l]=k;
00149 if(fabs(res[1][l])==larray2[k])
00150 resi[1][l]=k;
00151 }
00152 }
00153
00154 TLine* lines[17];
00155 for(int l=0; l<17; l++) {
00156 int ix=l%9;
00157 int sign=1;
00158 sign = (l>8) ? -1 : 1;
00159 lines[l] = new TLine(sign*larray[ix],0,sign*larray[ix],m_ndet);
00160 if(l!=9)
00161 lines[l]->SetLineStyle(3);
00162 padX->cd();
00163 lines[l]->Draw();
00164 }
00165
00166 float width=0.25;
00167 int filltype;
00168 Color_t color;
00169 Double_t box[4];
00170 padX->cd();
00171
00172 for(int h=0; h<2; h++) {
00173 float height1=0;
00174 for(int j=0; j<m_ndet; j++) {
00175
00176 if (strcmp(m_det_tracker_str[substruct[m_det[j]]-1], "PXB") && h)
00177 continue;
00178
00179 char det_str2[256];
00180 snprintf(det_str2, 255, "%s/%i",m_det_tracker_str[substruct[m_det[j]]-1],subsubstruct[m_det[j]]);
00181 h_res->GetYaxis()->SetBinLabel(j+1, det_str2);
00182
00183 int diff=m_det[j+1]-m_det[j];
00184 int k=0;
00185 width=1.0/diff;
00186
00187 for(int l=m_det[j]; l<(m_det[j]+diff); l++) {
00188
00189
00190 int sign = (res[h][l]<0) ? -1 : 1;
00191 box[0] = (hittype[l]==0) ? sign*larray[resi[h][l]] : -5.5;
00192 box[2] = (hittype[l]==0) ? sign*larray[resi[h][l]+1] : 5.5;
00193 box[1] = height1+width*k;
00194 box[3] = height1+width*(k+1);
00195
00196 if(stereo[l]==1) {
00197 color = m_stereoCol;
00198 filltype = m_stereoFill;
00199 }
00200 else if(hittype[l]!=0) {
00201 color = m_invalidCol;
00202 filltype = m_invalidFill;
00203 }
00204 else {
00205 filltype = h ? m_resYFill : m_resXFill;
00206 color = h ? m_resYCol : m_resXCol;
00207 }
00208
00209 drawCanvasBox(box, color, filltype, h<1);
00210 k++;
00211 }
00212 height1 +=1;
00213 }
00214 }
00215
00216
00217 const char* res_str= "residuals in Si detector local x-y coord.";
00218 TPaveText *pt = new TPaveText(0.0,0.91, 1,0.99,"blNDC");
00219 pt->SetBorderSize(0);
00220 pt->SetFillColor(kWhite);
00221 pt->AddText(res_str);
00222 pt->Draw();
00223
00224 m_viewCanvas->cd();
00225 m_viewCanvas->SetEditable(kFALSE);
00226
00227 setTextInfo(id, track);
00228 }
00229
00230 double
00231 FWTrackResidualDetailView::getSignedResidual (const FWGeometry *geom, unsigned int id, double resX)
00232 {
00233 double local1[3] = { 0, 0, 0 };
00234 double local2[3] = { resX, 0, 0 };
00235 double global1[3], global2[3];
00236 const TGeoMatrix *m = geom->getMatrix(id);
00237 assert(m != 0);
00238 m->LocalToMaster(local1, global1);
00239 m->LocalToMaster(local2, global2);
00240 TVector3 g1 = global1;
00241 TVector3 g2 = global2;
00242 if (g2.DeltaPhi(g1) > 0)
00243 return resX;
00244 else return -resX;
00245 }
00246
00247 void
00248 FWTrackResidualDetailView::printDebug()
00249 {
00250 for(int i=0; i<m_ndet; i++)
00251 {
00252 std::cout <<"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
00253 std::cout << "idx " << i << " det[idx] " << m_det[i] << std::endl;
00254 std::cout << "m_det idx " << m_det[i] << std::endl;
00255 std::cout << "m_det_tracker_str idx " << substruct[m_det[i]]-1 << std::endl;
00256 printf("m_det[idx] %i m_det_tracker_str %s substruct %i\n",m_det[i], m_det_tracker_str[substruct[m_det[i]]-1], subsubstruct[m_det[i]]);
00257 }
00258 }
00259
00260 void
00261 FWTrackResidualDetailView::setTextInfo(const FWModelId &, const reco::Track* )
00262 {
00263 m_infoCanvas->cd();
00264
00265 char mytext[256];
00266 Double_t fontsize = 0.07;
00267 TLatex* latex = new TLatex();
00268 latex->SetTextSize(fontsize);
00269 latex->Draw();
00270 Double_t x0 = 0.02;
00271 Double_t y = 0.95;
00272
00273
00274 int nvalid=0;
00275 int npix=0;
00276 int nstrip=0;
00277 for(int i=0; i<m_nhits; i++)
00278 {
00279 if(hittype[i]==0) nvalid++;
00280 if(substruct[i]<3) npix++;
00281 else nstrip++;
00282 }
00283
00284 latex->SetTextSize(fontsize);
00285 Double_t boxH = 0.25*fontsize;
00286
00287 double yStep = 0.04;
00288
00289 latex->DrawLatex(x0, y, "Residual:");
00290 y-= yStep;
00291 latex->DrawLatex(x0, y, "sgn(#hat{X}#bullet#hat{#phi}) #times #frac{X_{hit} - X_{traj}}{#sqrt{#sigma^{2}_{hit} + #sigma^{2}_{traj}}}" );
00292 y-= 2.5*yStep;
00293 snprintf(mytext, 255, "layers hit: %i", m_ndet);
00294 latex->DrawLatex(x0, y, mytext);
00295 y -= yStep;
00296 snprintf(mytext, 255,"valid Si hits: %i", nvalid);
00297 latex->DrawLatex(x0, y, mytext);
00298 y -= yStep;
00299 snprintf(mytext, 255,"total Si hits: %i", m_nhits);
00300 latex->DrawLatex(x0, y, mytext);
00301 y -= yStep;
00302 snprintf(mytext, 255,"valid Si pixel hits: %i", npix);
00303 latex->DrawLatex(x0, y, mytext);
00304 y -= yStep;
00305 snprintf(mytext, 255, "valid Si strip hits: %i", nstrip);
00306 latex->DrawLatex(x0, y, mytext);
00307
00308
00309 Double_t pos[4];
00310 pos[0] = 0.4;
00311 pos[2] = 0.55;
00312
00313 y -= yStep*2;
00314 latex->DrawLatex(x0, y, "X hit");
00315 pos[1] = y; pos[3] = pos[1] + boxH;
00316 drawCanvasBox(pos, m_resXCol, m_resXFill);
00317
00318 y -= yStep;
00319 latex->DrawLatex(x0, y, "Y hit");
00320 pos[1] = y; pos[3] = pos[1] + boxH;
00321 drawCanvasBox(pos, m_resYCol, m_resYFill, 0);
00322
00323 y -= yStep;
00324 latex->DrawLatex(x0, y, "stereo hit");
00325 pos[1] = y; pos[3] = pos[1] + boxH;
00326 drawCanvasBox(pos, m_stereoCol, m_stereoFill);
00327
00328 y -= yStep;
00329 latex->DrawLatex(x0, y, "invalid hit");
00330 pos[1] = y; pos[3] = pos[1] + boxH;
00331 drawCanvasBox(pos, m_invalidCol, m_invalidFill);
00332 }
00333
00334 REGISTER_FWDETAILVIEW(FWTrackResidualDetailView, Residuals);