FEDRA emulsion software from the OPERA Collaboration
EdbEDAPlotTab Class Reference

#include <EdbEDAPlotTab.h>

Collaboration diagram for EdbEDAPlotTab:

Public Member Functions

void CheckAlignment (EdbPVRec *pvr=NULL)
 
void CheckEff (EdbPVRec *pvr=NULL, TObjArray *tracks=NULL)
 
TObjArray * CheckKink (EdbTrackP *)
 
void CheckKinkTracks ()
 
void CheckOverview (EdbPVRec *pvr=NULL)
 
void CheckPHDAngle (EdbPVRec *pvr=NULL)
 
void CheckSingleTrack (EdbTrackP *t)
 
void CheckTracks ()
 
 EdbEDAPlotTab ()
 
void MakeGUI ()
 
void MomPlot ()
 
void SetEffMinSeg (int nseg)
 
void SetEffNbins (int nbins, double tmax=0.7)
 
void SetMomAlg ()
 
void SetMomAlgAngle ()
 
void SetMomAlgCoord ()
 

Static Public Member Functions

static TCanvasCreateCanvas (char *plot_name)
 

Public Attributes

double eDTReference
 

Private Attributes

int eEffMinSeg
 Minimum number of segment for efficiency calculation. (count except the target plate.) More...
 
int eEffNbins
 
double eEffTmax
 
TGNumberEntry * eMomAngleRes
 
EdbMomentumEstimator eTF
 

Constructor & Destructor Documentation

◆ EdbEDAPlotTab()

EdbEDAPlotTab::EdbEDAPlotTab ( )
inline
23:eEffNbins(7),eEffTmax(0.7), eEffMinSeg(4), eDTReference(0.07) {MakeGUI();}
double eDTReference
Definition: EdbEDAPlotTab.h:22
int eEffMinSeg
Minimum number of segment for efficiency calculation. (count except the target plate....
Definition: EdbEDAPlotTab.h:17
int eEffNbins
Definition: EdbEDAPlotTab.h:15
void MakeGUI()
Definition: EdbEDAPlotTab.C:1219
double eEffTmax
Definition: EdbEDAPlotTab.h:16

Member Function Documentation

◆ CheckAlignment()

void EdbEDAPlotTab::CheckAlignment ( EdbPVRec pvr = NULL)
387 {
388 int i,j;
389
390 TCanvas *c1 = CreateCanvas("Alignment");
391 c1->Divide(2,2);
392 c1->cd(1);
393
394 if(NULL==pvr) {
396 pvr = set->GetPVRec();
397 }
398
399 // Efficiency plate by plate
400 int pidmax = pvr->Npatterns()-1;
401 int pidmin = 0;
402
403 int plmax=0, plmin=1000;
404
405 for(i=0;i<pvr->Npatterns();i++){
406 EdbPattern *pat = pvr->GetPattern(i);
407 if(pat==NULL) continue;
408 EdbSegP *s = pat->GetSegment(0);
409 if(s==NULL) continue;
410 if(s->Plate()<plmin) plmin=s->Plate();
411 if(s->Plate()>plmax) plmax=s->Plate();
412 }
413
414 if(plmax<plmin) { int tmp=plmax; plmax=plmin; plmin=tmp;} // if order of pid and ipl were opposite.
415
416 int npl = plmax-plmin+1;
417
418 int pid;
419
420 int nsegcut = gEDA->GetMainTab()->GetNsegCut();
421
422
423 TNtuple *nt = new TNtuple("ntali", "alignment", "itrk:ipl1:ipl2:ax:ay:x:y:dx:dy:dax:day");
424
425 for(i=0;i<pvr->Ntracks();i++){
426 EdbTrackP *t = pvr->GetTrack(i);
427 if(t==NULL) continue;
428 if(npl>2&&t->N()<3) continue;
429 if(t->N()<nsegcut) continue;
430 //EdbSegP *s1st = t->GetSegmentFirst();
431 //EdbSegP *slst = t->GetSegmentLast();
432
433 for(pid=pidmin; pid<pidmax; pid++){
434 EdbSegP *s1=0,*s2=0;
435 for(j=0;j<t->N();j++){
436 EdbSegP *s = t->GetSegment(j);
437 if(pid==s->PID()) s1=s;
438 if(pid+1==s->PID()) s2=s;
439 }
440 if(s1&&s2) {
441 double dz = (s2->Z()-s1->Z())/2;
442 double dx = s1->X()+s1->TX()*dz - ( s2->X()-s2->TX()*dz );
443 double dy = s1->Y()+s1->TY()*dz - ( s2->Y()-s2->TY()*dz );
444 double dax = s1->TX() - s2->TX();
445 double day = s1->TY() - s2->TY();
446 nt->Fill(t->ID(), s1->Plate(), s2->Plate(), t->TX(), t->TY(), s1->X(), s1->Y(),dx,dy,dax,day);
447 }
448 }
449 }
450
451 TProfile *profx = new TProfile("profalix", "#deltax Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1,"s");
452 TProfile *profx2 = new TProfile("profalix2", "#deltax Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1);
453 TProfile *profy = new TProfile("profaliy", "#deltay Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1,"s");
454 TProfile *profy2 = new TProfile("profaliy2", "#deltax Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1);
455 TProfile *profax = new TProfile("profaliax", "#delta#thetax Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1,"s");
456 TProfile *profax2= new TProfile("profaliax2", "#deltax Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1);
457 TProfile *profay = new TProfile("profaliay", "#delta#thetay Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1,"s");
458 TProfile *profay2= new TProfile("profaliay2", "#deltax Profile, bar = Error(black) RMS(gray)", npl+1, plmin-1, plmax+1);
459
460 c1->cd(1);
461 nt->Draw("dx:(ipl1+ipl2)/2 >>profalix2");
462 nt->Draw("dx:(ipl1+ipl2)/2 >>profalix");
463 profx->SetMinimum(-15);
464 profx->SetMaximum(15);
465 profx->SetLineColor(kGray);
466 profx->SetXTitle("Plate number");
467 profx->SetYTitle("#mum");
468 profx2->Draw("same");
469
470 c1->cd(2);
471 nt->Draw("dy:(ipl1+ipl2)/2 >>profaliy2");
472 nt->Draw("dy:(ipl1+ipl2)/2 >>profaliy");
473 profy->SetMinimum(-15);
474 profy->SetMaximum(15);
475 profy->SetLineColor(kGray);
476 profy->SetXTitle("Plate number");
477 profy->SetYTitle("#mum");
478 profy2->Draw("same");
479
480 c1->cd(3);
481 nt->Draw("dax:(ipl1+ipl2)/2 >>profaliax2");
482 nt->Draw("dax:(ipl1+ipl2)/2 >>profaliax");
483 profax->SetMinimum(-0.020);
484 profax->SetMaximum(0.020);
485 profax->SetLineColor(kGray);
486 profax->SetXTitle("Plate number");
487 profax->SetYTitle("rad");
488 profax2->Draw("same");
489
490 c1->cd(4);
491 nt->Draw("day:(ipl1+ipl2)/2 >>profaliay2");
492 nt->Draw("day:(ipl1+ipl2)/2 >>profaliay");
493 profay->SetMinimum(-0.020);
494 profay->SetMaximum(0.020);
495 profay->SetLineColor(kGray);
496 profay->SetXTitle("Plate number");
497 profay->SetYTitle("rad");
498 profay2->Draw("same");
499
500
501 printf("Alignments. nseg>=%d\n", nsegcut);
502 printf("%5s %6s %6s ", "pl","dxcent","dxrms");
503 printf("%6s %6s ", "dycent","dyrms");
504 printf("%8s %8s ", "daxcent","daxrms");
505 printf("%8s %8s \n", "daycent","dayrms");
506 for(i=2;i<npl+1;i++){
507 printf("%5.1lf ", profx->GetBinCenter(i));
508 printf("%6.2lf %6.2lf ", profx->GetBinContent(i), profx->GetBinError(i));
509 printf("%6.2lf %6.2lf ", profy->GetBinContent(i), profy->GetBinError(i));
510 printf("%8.5lf %8.5lf ", profax->GetBinContent(i), profax->GetBinError(i));
511 printf("%8.5lf %8.5lf \n", profay->GetBinContent(i), profay->GetBinError(i));
512 }
513
514}
EdbEDA * gEDA
Definition: EdbEDA.C:3
brick dz
Definition: RecDispMC.C:107
int GetNsegCut()
Definition: EdbEDAMainTab.h:108
static TCanvas * CreateCanvas(char *plot_name)
Definition: EdbEDAPlotTab.h:28
Definition: EdbEDATrackSet.h:178
EdbEDAMainTab * GetMainTab()
Definition: EdbEDA.h:724
EdbEDATrackSet * GetTrackSet(int i)
Definition: EdbEDA.h:617
Int_t Ntracks() const
Definition: EdbPVRec.h:203
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Definition: EdbPattern.h:273
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
Definition: EdbSegP.h:21
Float_t TX() const
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t X() const
Definition: EdbSegP.h:173
Int_t Plate() const
Definition: EdbSegP.h:159
Float_t Z() const
Definition: EdbSegP.h:153
Float_t Y() const
Definition: EdbSegP.h:174
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
Definition: EdbPattern.h:113
EdbScanSet * set
Definition: emtraceback.cpp:14
int pid[1000]
Definition: m2track.cpp:13
TTree * t
Definition: check_shower.C:4
s
Definition: check_shower.C:55
TCanvas * c1
Definition: energy.C:13
EdbSegP * s1
Definition: tlg2couples.C:29
EdbSegP * s2
Definition: tlg2couples.C:30
#define NULL
Definition: nidaqmx.h:84
new TCanvas()

◆ CheckEff()

void EdbEDAPlotTab::CheckEff ( EdbPVRec pvr = NULL,
TObjArray *  tracks = NULL 
)

Plot efficiencies for each plate or each angle.
Using the tracks in the given PVRec object.
Use minimum number of segment bigger equal than eEffMinSeg(default=4).

7 {
11 printf("Efficiency plot\n");
12 int i,j,k;
13
14 TCanvas *c1 = CreateCanvas("Efficiency");
15 c1->Divide(2,2);
16 c1->cd(1);
17
18 if(NULL==pvr) {
20 pvr = set->GetPVRec();
21 }
22
23 if(NULL==tracks) tracks=pvr->eTracks;
24
25 // Efficiency plate by plate
26 int pidmax = pvr->Npatterns()-1;
27 int pidmin = 0;
28
29 int plmax=0, plmin=1000;
30
31 for(i=0;i<pvr->Npatterns();i++){
32 EdbPattern *pat = pvr->GetPattern(i);
33 if(pat==NULL) continue;
34
35 EdbSegP *s = pat->GetSegment(0);
36 if(s==NULL) continue;
37 if(s->Plate()<plmin) plmin=s->Plate();
38 if(s->Plate()>plmax) plmax=s->Plate();
39 }
40
41 if(plmax<plmin) { int tmp=plmax; plmax=plmin; plmin=tmp;} // if order of pid and ipl were opposite.
42
43 int npl = plmax-plmin+1;
44
45// EdbEDAAreaSet *areas = gEDA->GetAreaSet();
46
47 TH1D *hentry = new TH1D("hentry",Form("Efficiency (#theta < %.2f rad)", eEffTmax<0.5? eEffTmax : 0.5), npl, plmin-0.5, plmax+0.5);
48 TH1D *hfound = new TH1D("hfound","Found", npl, plmin-0.5, plmax+0.5);
49 TH1D *heff = new TH1D("heff", Form("Efficiency (#theta < %.2f rad)", eEffTmax<0.5? eEffTmax : 0.5), npl, plmin-0.5, plmax+0.5);
50
51 // Efficiency for each angle
52 TH1D *haentry = new TH1D("haentry","Entry and Found for each angle",eEffNbins, 0,eEffTmax);
53 TH1D *hafound = new TH1D("hafound","Found" ,eEffNbins, 0,eEffTmax);
54 TH1D *haeff = new TH1D("haeff","Efficiency for each angle" ,eEffNbins, 0,eEffTmax);
55
56
57
58 EdbEDAAreaSet AreaSet;
59 for(int pid=pidmin; pid<=pidmax; pid++){ // pid <= target pid
60 EdbPattern *pat = pvr->GetPattern(pid);
61 AreaSet.AddArea(pid, pat->Xmin(), pat->Xmax(), pat->Ymin(), pat->Ymax(), pat->Z()); // put PID instead IPL
62 }
63
64
65 int ntrk = tracks->GetEntries();
66 for(i=0;i<ntrk;i++){
67 EdbTrackP *t = (EdbTrackP *) tracks->At(i);
68 if(t==NULL) continue;
69 int nseg = t->N();
70 if(nseg<eEffMinSeg) continue;
71 double angle = sqrt(t->TX()*t->TX() + t->TY()*t->TY());
72 if(angle>eEffTmax) continue;
73
74 for(int pid=pidmin; pid<=pidmax; pid++){ // pid <= target pid
75 EdbPattern *pat = pvr->GetPattern(pid);
76 EdbEDAArea *a = AreaSet.GetAreaIPL(pid);
77 if(a==NULL) continue;
78
79 EdbSegP *s1, *s2, *s3, *s0,*s4;
80 s1=s2=s3=s0=s4=NULL;
81 for(j=0;j<nseg;j++){
82 EdbSegP *s = t->GetSegment(j);
83 if(pid-2==s->PID()) s0=s; // to calculate eff for the last plate
84 if(pid-1==s->PID()) s1=s;
85 if(pid ==s->PID()) s2=s;
86 if(pid+1==s->PID()) s3=s;
87 if(pid+2==s->PID()) s4=s; // to calculate eff for the 1st plate
88 }
89
90 if( nseg - (s2?1:0) < eEffMinSeg) continue; // more than 4 segments except the target pid.
92 if(pid==pidmin){
93 if(s3==NULL||s4==NULL) continue;
94 ss=s3;
95 }
96 else if(pid==pidmax){
97 if(s0==NULL||s1==NULL) continue;
98 ss=s1;
99 }
100 else {
101 if(s1==NULL||s3==NULL) continue; // request existence of nearest segments.
102 ss=s1;
103 }
104 // if the predicted point from ss is out of volume, skip.
105 double z = a->Z();
106 EdbSegP *s = new EdbSegP(*ss);
107 s->PropagateTo(z);
108 if( s->X()<a->Xmin()) continue;
109 if( s->X()>a->Xmax()) continue;
110 if( s->Y()<a->Ymin()) continue;
111 if( s->Y()>a->Ymax()) continue;
112 delete s;
113
114 /*
115 // if the predicted point from ss is out of volume, skip.
116 EdbEDAArea *a = areas->GetArea(pid);
117 if(a!=NULL){
118 if(a->Plate()==gEDA->GetIPL(pid)){
119 double z = gEDA->GetZPID(pid);
120 EdbSegP *s = new EdbSegP(*ss);
121 s->PropagateTo(z);
122 if( s->X()<a->Xmin()) continue;
123 if( s->X()>a->Xmax()) continue;
124 if( s->Y()<a->Ymin()) continue;
125 if( s->Y()>a->Ymax()) continue;
126 delete s;
127 }
128 }
129 */
130 // eff by angle
131 haentry->Fill(angle);
132 if(s2) hafound->Fill(angle);
133 if(s2) haeff->Fill(angle);
134
135 // eff by pid
136 if(angle > (eEffTmax<0.5? eEffTmax : 0.5) ) continue;
137 int ipl = pat->GetSegment(0)->Plate();
138 hentry->Fill (ipl);
139 if(s2) hfound->Fill(ipl);
140 if(s2) heff->Fill (ipl);
141
142 }
143 }
144
145
146 //hentry->SetStats(0);
147 hentry->SetMinimum(0);
148 hentry->Draw();
149 hentry->SetXTitle("Plate number");
150 hentry->GetXaxis()->SetNdivisions(10);
151 hfound->Draw("same");
152 hfound->SetFillColor(15);
153
154 c1->cd(2);
155
156 // Efficiency plot
157 // error
158 double *error_arr = new double [npl+2];
159 double *entry_arr = hentry->GetArray();
160 double *found_arr = hfound->GetArray();
161 //error_arr[1]=error_arr[npl]=0.0;
162 for(i=1;i<=npl;i++){
163 if(entry_arr[i]==0) {error_arr[i]=0.0; continue;}
164 error_arr[i] = sqrt( (double) found_arr[i] * (entry_arr[i]-found_arr[i]) / entry_arr[i]) / entry_arr[i];
165 }
166 // eff mean
167 double mean=0.0;
168 k=0;
169 for(i=1;i<=npl;i++){
170 if(entry_arr[i]==0) continue;
171 mean+=(double) found_arr[i]/entry_arr[i];
172 k++;
173 }
174 mean/=k;
175 // eff plot
176 heff->Divide(hentry);
177 heff->SetMaximum(1.02);
178 heff->SetMinimum(0.0);
179 heff->SetError(error_arr);
180 heff->SetStats(0);
181 heff->SetXTitle("Plate number");
182 heff->Draw();
183 TLine *l = new TLine;
184 l->SetLineColor(kRed);
185 l->DrawLine(plmin,mean,plmax,mean);
186 TText *tx = new TText;
187 tx->SetTextSize(0.045);
188 tx->DrawText(plmax-0.5,mean,Form("%.2lf",mean));
189 heff->Draw("same");
190
191 // print text
192 printf("Efficiencies for each plates\n");
193 for(i=1;i<=npl;i++){
194 printf("PL %2d : %5.3lf +- %5.3lf\n", plmin+i-1, (double) found_arr[i]/entry_arr[i], error_arr[i]);
195 }
196
197
198 c1->cd(3);
199
200 haentry->SetStats(0);
201 haentry->SetMinimum(0);
202 haentry->Draw();
203 haentry->SetXTitle("abs Angle (rad)");
204 haentry->GetXaxis()->SetNdivisions(10);
205 hafound->Draw("same");
206 hafound->SetFillColor(15);
207
208 c1->cd(4);
209
210
211 // Efficiency plot
212 // error
213 error_arr = new double [eEffNbins+2];
214 entry_arr = haentry->GetArray();
215 found_arr = hafound->GetArray();
216 for(i=0;i<eEffNbins+2;i++){
217 error_arr[i]=0.0;
218 }
219 for(i=1;i<eEffNbins+1;i++){
220 if(entry_arr[i]==0) {error_arr[i]=0.0; continue;}
221 error_arr[i] = sqrt( (double) found_arr[i] * (entry_arr[i]-found_arr[i]) / entry_arr[i]) / entry_arr[i];
222 }
223 // eff mean
224 mean=0.0;
225 k=0;
226 printf("Efficiencies for each angle\n");
227 for(i=1;i<eEffNbins+1;i++){
228 if(entry_arr[i]==0) continue;
229 mean+=(double) found_arr[i]/entry_arr[i];
230 k++;
231 printf("%.3lf < theta < %.3lf : %5.3lf +- %5.3lf\n", (i-1)*eEffTmax/eEffNbins, i*eEffTmax/eEffNbins, found_arr[i]/entry_arr[i], error_arr[i]);
232 }
233 mean/=k;
234 // eff plot
235 haeff->Divide(haentry);
236 haeff->SetStats(0);
237 haeff->SetMaximum(1.02);
238 haeff->SetMinimum(0);
239 haeff->SetError(error_arr);
240 haeff->SetXTitle("Angle (rad)");
241 haeff->Draw();
242 l->SetLineColor(kRed);
243 l->DrawLine(0,mean,eEffTmax,mean);
244 tx->SetTextSize(0.045);
245 tx->DrawText(eEffTmax-0.05,mean,Form("%.2lf",mean));
246 haeff->Draw("same");
247
248 c1->Update();
249}
void a()
Definition: check_aligned.C:59
Definition: EdbEDASets.h:55
void AddArea(int ipl, double xmin, double xmax, double ymin, double ymax, double z)
Definition: EdbEDASets.h:110
EdbEDAArea * GetAreaIPL(int ipl)
Definition: EdbEDASets.h:135
Definition: EdbEDASets.h:7
TObjArray * eTracks
Definition: EdbPVRec.h:161
virtual Float_t Xmax() const
Definition: EdbVirtual.cxx:196
virtual Float_t Ymin() const
Definition: EdbVirtual.cxx:206
virtual Float_t Xmin() const
Definition: EdbVirtual.cxx:186
virtual Float_t Ymax() const
Definition: EdbVirtual.cxx:216
Float_t Z() const
Definition: EdbPattern.h:84
TTree * tracks
Definition: check_tr.C:19
ss
Definition: energy.C:62

◆ CheckKink()

TObjArray * EdbEDAPlotTab::CheckKink ( EdbTrackP trk)

Search kink and make a plot.

882 {
884
885 float Rthreshold = 3;
886
887 if(trk->N()<2) {
888 printf("Track %d nseg=%d, too short for kink search\n", trk->ID(), trk->N());
889 return NULL;
890 }
891
892 char ntname[20];
893 sprintf(ntname,"ntKinkDT%d", trk->ID());
894 TNtuple *tree = (TNtuple *) gROOT->FindObject(ntname);
895 if(tree) tree->Delete();
896
897 tree = new TNtuple(ntname, "InTrack Decay Search","itrk:ipl1:ipl2:P:dtt:dtl:dt:Pt:rmst:rmsl:rms:dxt:dxl");
898
899 TObjArray *kinks = new TObjArray;
900
901 EdbTrackP *t = CleanTrack(trk); // Remove fake segment. this may be deleted later.
902
903 if(t->Npl()<t->N()){
904 // in this case P estimation doesn't work.
905 // this can happen if a track is formed from 2 different data set.
906 // (PID definitions are defferent amond 2 data set.)
907 // put absolute plate number as PID. (temporary solution)
908 for(int i=0;i<t->N();i++) t->GetSegment(i)->SetPID(t->GetSegment(i)->Plate());
909 }
910
911 // minimum value of rms (angular resolution).
912 double angle = sqrt(t->TX()*t->TX()+t->TY()*t->TY());
913 double resT = 0.0015*sqrt(2.0);
914 double resL = 0.0015*(1+angle*5)*sqrt(2.0);
915
916 // loop over delta-theta
917 int n=t->N();
918 for(int j=0;j<n-1;j++){
919 // kink angle calculation
920 EdbSegP *s1 = t->GetSegment(j);
921 EdbSegP *s2 = t->GetSegment(j+1);
922
923 int ipl1 = s1->Plate();
924 int ipl2 = s2->Plate();
925 if(ipl2>=57) continue;
926
927 // calculate RMS removing this kink angle
928 double rms,rmst,rmsl;
929 DTRMSTLGiven1Kink(t, j, &rms, &rmst, &rmsl); // DTRMS for each projection.
930
931 // set minimum value for RMS by angular resolution.
932 rmst = rmst>resT ? rmst : resT;
933 rmsl = rmsl>resL ? rmsl : resL;
934
935 // calculate kink angle in transverse and longitudinal projection.
936 double dtt, dtl;
937 CalcDTTransLongi(s1,s2, &dtt, &dtl);
938 double dt = sqrt(dtt*dtt+dtl*dtl);
939 double dxt, dxl;
940 CalcDXTransLongi(t->GetSegmentFirst(),s2, &dxt, &dxl);
941
942 // momentum calculation using downstream from s2.
943 double p,pmin,pmax;
944 CalcPPartial(t,s2,t->GetSegmentLast(), p, pmin, pmax, kFALSE);
945
946 // calculate Pt at the kink, using downstream momentum.
947 double Pt = p>0 ? p*dt : -1.;
948
949 // fill the tree.
950 tree->Fill( t->ID(), ipl1, ipl2, p, dtt, dtl, dt, Pt, rmst, rmsl, rms, dxt, dxl);
951
952 // if there is kink.
953 // if kink angle is bigger than Rthreshold(5) times delta-theta rms in one of the 2 projection.
954 if( fabs(dtt)>rmst*Rthreshold || fabs(dtl)>rmsl*Rthreshold ) {
955 // put the data in a struct.
956 // calculate vertex point with 2 segments.
957 TObjArray segs;
958 segs.Add(s1);
959 segs.Add(s2);
960 EdbVertex *v = CalcVertex(&segs);
961 gEDA->AddVertex(v);
962
963 int ndau = n-j-1;
964 // put the data in a struct.
965 EdbEDASmallKink *kink = new EdbEDASmallKink(v, t, s1, s2, dtt, dtl, dxt, dxl, ndau, p, pmin, pmax, Pt, rmst, rmsl);
966 kinks->Add(kink);
967
968 printf("Kink candidate. itrk %d plate %d - %d kink angle %.4lf P %.3lf Pt %.3lf\n",
969 t->ID(), ipl1, ipl2, dt, p, Pt);
970 printf(" (Transverse, Longitudinal) = ( %.4lf, %.4lf ) threshold ( %.4lf, %.4lf ), R = %.2f %.2f\n",
971 dtt, dtl, rmst*Rthreshold, rmsl*Rthreshold, dtt/rmst, dtl/rmsl);
972 printf(" rms=%.4lf rms_transvers=%.4lf rms_longitudinal=%.4lf\n", rms, rmst, rmsl);
973 printf(" kinkpoint %.1f %.1f %.1f\n", v->X(), v->Y(), v->Z());
974
975 //gEDA->AddDrawObject(kink);
976 }
977 }
978
979 printf("%d kink candidates are found.\n", kinks->GetEntries());
980
981
982 tree->SetMarkerStyle(20);
983 TText *text = new TText();
984 text->SetTextSize(0.035);
985 text->SetTextAngle(20);
986
987 double iplmin = tree->GetMinimum("ipl1");
988 double iplmax = tree->GetMaximum("ipl2")+1;
989
990 // calculate dtmax for the graph hight.
991 double dt6[6];
992 dt6[0] = fabs(tree->GetMaximum("dtt"));
993 dt6[1] = fabs(tree->GetMinimum("dtt"));
994 dt6[2] = fabs(tree->GetMaximum("dtl"));
995 dt6[3] = fabs(tree->GetMinimum("dtl"));
996 dt6[4] = tree->GetMaximum("rmst") * Rthreshold;
997 dt6[5] = tree->GetMaximum("rmsl") * Rthreshold;
998 double dtmax = TMath::MaxElement(6,dt6) * 1.15 * 1e3;
999
1000 double rmst = tree->GetMinimum("rmst");
1001 double rmsl = tree->GetMinimum("rmsl");
1002
1003 TText *textrms = new TText();
1004 textrms->SetTextSize(0.035);
1005
1006
1007 TCanvas *c1 = CreateCanvas(Form("K%d%s", trk->ID(), kinks->GetEntries()? "!":""));
1008 c1->Divide(2,2);
1009
1010 c1->cd(1);
1011
1012 TString hname = Form("hrmst%d",trk->ID());
1013 TH1F *h1 = (TH1F *) gROOT->FindObject(hname);
1014 if(h1) h1->Delete();
1015 h1 = new TH1F(hname,Form("#delta#theta^{RMS}Transverse itrk=%d",trk->ID()), (int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1016 h1->SetLineColor(kGray);
1017 h1->SetFillColor(kGray);
1018 tree->Draw("ipl2 >>"+hname,"rmst*1e3");
1019
1020 hname+="_5";
1021 TH1F *h15 = (TH1F *) gROOT->FindObject(hname);
1022 if(h15) h15->Delete();
1023 h15 = new TH1F(hname,Form("#delta#theta^{RMS}Transverse itrk=%d",trk->ID()), (int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1024 tree->Draw("ipl2 >>"+hname,Form("rmst*1e3*%f",Rthreshold));
1025 h15->SetLineColor(kCyan-10);
1026 h15->SetFillColor(kCyan-10);
1027 h15->SetXTitle("Plate number");
1028 h15->SetYTitle("Kink angle (mrad)");
1029 h15->SetMaximum(dtmax);
1030 h15->SetStats(0);
1031
1032 h15->Draw();
1033 h1->Draw("same");
1034 tree->Draw("abs(dtt)*1e3:ipl2","","same");
1035
1036 TLine *l = new TLine();
1037 double xmin = h1->GetXaxis()->GetXmin();
1038 double xmax = h1->GetXaxis()->GetXmax();
1039 l->DrawLine(xmin, rmst*1e3, xmax, rmst*1e3);
1040 l->SetLineColor(kCyan);
1041 l->DrawLine(xmin, rmst*Rthreshold*1e3, xmax, rmst*Rthreshold*1e3);
1042
1043 textrms->DrawText(xmin+0.8*(xmax-xmin), rmst*1e3, Form("%.1lfmrad",rmst*1e3));
1044 textrms->DrawText(xmin+0.8*(xmax-xmin), Rthreshold*rmst*1e3, Form("%.1lfmrad",Rthreshold*rmst*1e3));
1045
1046 if(kinks->GetEntries()){
1047 for(int i=0;i<kinks->GetEntries();i++){
1048 EdbEDASmallKink *kink = (EdbEDASmallKink *) kinks->At(i);
1049 text->DrawText(kink->IPL2()+0.5, fabs(kink->DTT())*1e3, Form("%.1lfmrad pl%d-%d pt%.3lf", fabs(kink->DTT()*1e3), kink->IPL1(), kink->IPL2(), kink->PT()));
1050 }
1051 }
1052
1053 c1->cd(2);
1054
1055 hname = Form("hrmsl%d",trk->ID());
1056 h1 = (TH1F *) gROOT->FindObject(hname);
1057 if(h1) h1->Delete();
1058 h1 = new TH1F(hname,Form("#delta#theta^{RMS}Transverse itrk=%d",trk->ID()), (int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1059 h1->SetLineColor(kGray);
1060 h1->SetFillColor(kGray);
1061 tree->Draw("ipl2 >>"+hname,"rmsl*1e3");
1062
1063 hname+="_5";
1064 h15 = (TH1F *) gROOT->FindObject(hname);
1065 if(h15) h15->Delete();
1066 h15 = new TH1F(hname,Form("#delta#theta^{RMS}Longitudinal itrk=%d",trk->ID()), (int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1067 tree->Draw("ipl2 >>"+hname,Form("rmsl*1e3*%f",Rthreshold));
1068 h15->SetLineColor(kCyan-10);
1069 h15->SetFillColor(kCyan-10);
1070 h15->SetXTitle("Plate number");
1071 h15->SetYTitle("Kink angle (mrad)");
1072 h15->SetMaximum(dtmax);
1073 h15->SetStats(0);
1074
1075 h15->Draw();
1076 h1->Draw("same");
1077 tree->Draw("abs(dtl)*1e3:ipl2","","same");
1078
1079 l = new TLine();
1080 l->DrawLine(xmin, rmsl*1e3, xmax, rmsl*1e3);
1081 l->SetLineColor(kCyan);
1082 l->DrawLine(xmin, rmsl*Rthreshold*1e3, xmax, rmsl*Rthreshold*1e3);
1083
1084 textrms->DrawText(xmin+0.8*(xmax-xmin), rmsl*1e3, Form("%.1lfmrad",rmsl*1e3));
1085 textrms->DrawText(xmin+0.8*(xmax-xmin), Rthreshold*rmsl*1e3, Form("%.1lfmrad",Rthreshold*rmsl*1e3));
1086
1087 if(kinks->GetEntries()){
1088 for(int i=0;i<kinks->GetEntries();i++){
1089 EdbEDASmallKink *kink = (EdbEDASmallKink *) kinks->At(i);
1090 text->DrawText(kink->IPL2()+0.5, fabs(kink->DTL())*1e3, Form("%.1lfmrad pl%d-%d pt%.3lf", fabs(kink->DTL()*1e3), kink->IPL1(), kink->IPL2(), kink->PT()));
1091
1092 }
1093 }
1094
1095
1096 c1->cd(3);
1097 TH2F *h = (TH2F *) gROOT->FindObject(Form("hdxt%d",trk->ID()));
1098 if(h) h->Delete();
1099 double dxmin = tree->GetMinimum("dxt");
1100 double dxmax = tree->GetMaximum("dxt");
1101 h = new TH2F(Form("hdxt%d",trk->ID()),Form("#deltax Transverse itrk=%d", trk->ID()), 10, iplmin, iplmax, 10, dxmin,dxmax);
1102 h->SetXTitle("Plate number");
1103 h->SetYTitle("#deltax (#mum)");
1104 h->SetStats(0);
1105 h->Draw();
1106 tree->Draw("dxt:ipl2","","same");
1107 if(kinks->GetEntries()){
1108 for(int i=0;i<kinks->GetEntries();i++){
1109 EdbEDASmallKink *kink = (EdbEDASmallKink *) kinks->At(i);
1110 text->DrawText(kink->IPL2()+0.5, kink->DXT(), Form("%.1lfmrad pl%d-%d pt%.3lf", fabs(kink->DTT()*1e3), kink->IPL1(), kink->IPL2(), kink->PT()));
1111 }
1112 }
1113
1114
1115 c1->cd(4);
1116 h = (TH2F *) gROOT->FindObject(Form("hdxl%d",trk->ID()));
1117 if(h) h->Delete();
1118 dxmin = tree->GetMinimum("dxl");
1119 dxmax = tree->GetMaximum("dxl");
1120 h = new TH2F(Form("hdxl%d",trk->ID()),Form("#deltax Longitudinal itrk=%d", trk->ID()), 10, iplmin, iplmax, 10, dxmin,dxmax);
1121 h->SetXTitle("Plate number");
1122 h->SetYTitle("#deltax (#mum)");
1123 h->SetStats(0);
1124 h->Draw();
1125 tree->Draw("dxl:ipl2","","same");
1126
1127 if(kinks->GetEntries()){
1128 for(int i=0;i<kinks->GetEntries();i++){
1129 EdbEDASmallKink *kink = (EdbEDASmallKink *) kinks->At(i);
1130 text->DrawText(kink->IPL2()+0.5, kink->DXL(), Form("%.1lfmrad pl%d-%d pt%.3lf", fabs(kink->DTL()*1e3), kink->IPL1(), kink->IPL2(), kink->PT()));
1131 }
1132 }
1133
1134 return kinks;
1135}
TText * text
Definition: Canv_SYSTEMATICS_ALLCOMBINED__RMSEnergy__vs__Energy__ELECTRON.C:164
float Pt[500]
Definition: RecDispNU.C:99
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
EdbVertex * CalcVertex(TObjArray *segments)
Definition: ShowRec.cpp:9043
Definition: EdbEDADecaySearch.h:161
double DXL()
Definition: EdbEDADecaySearch.h:185
double DTT()
Definition: EdbEDADecaySearch.h:182
int IPL2()
Definition: EdbEDADecaySearch.C:104
double PT()
Definition: EdbEDADecaySearch.h:190
double DXT()
Definition: EdbEDADecaySearch.h:184
double DTL()
Definition: EdbEDADecaySearch.h:183
void AddVertex(EdbVertex *v)
Definition: EdbEDA.h:661
Int_t ID() const
Definition: EdbSegP.h:147
Int_t N() const
Definition: EdbPattern.h:177
Definition: EdbVertex.h:69
Float_t X() const
Definition: EdbVertex.h:130
Float_t Z() const
Definition: EdbVertex.h:132
Float_t Y() const
Definition: EdbVertex.h:131
TH1F * h1
Definition: energy.C:16
void CalcDXTransLongi(EdbSegP *s1, EdbSegP *s2, double *dxt, double *dxl)
Definition: EdbEDAUtil.C:665
double DTRMSTLGiven1Kink(EdbTrackP *t, int iKink, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
Definition: EdbEDAUtil.C:790
void CalcDTTransLongi(EdbSegP *s1, EdbSegP *s2, double *dtTransverse, double *dtLongitudinal)
Definition: EdbEDAUtil.C:648
EdbTrackP * CleanTrack(EdbTrackP *t)
Definition: EdbEDAUtil.C:499
void CalcPPartial(EdbTrackP *t, EdbSegP *s1st, EdbSegP *slast, double &p, double &pmin, double &pmax, bool print=kTRUE)
Definition: EdbEDAUtil.C:344
p
Definition: testBGReduction_AllMethods.C:8

◆ CheckKinkTracks()

void EdbEDAPlotTab::CheckKinkTracks ( )
868 {
869 TObjArray *selected_tracks = gEDA->GetSelectedTracks();
870 if(selected_tracks->GetEntries()==0) return;
871
872 for(int i=0;i<selected_tracks->GetEntries();i++){
873 EdbTrackP *t = (EdbTrackP *) selected_tracks->At(i);
874 if(t==NULL) continue;
875 CheckKink(t);
876 }
877
878
879}
TObjArray * CheckKink(EdbTrackP *)
Definition: EdbEDAPlotTab.C:882
TObjArray * GetSelectedTracks(void)
Definition: EdbEDA.h:417

◆ CheckOverview()

void EdbEDAPlotTab::CheckOverview ( EdbPVRec pvr = NULL)
517 {
518 if(NULL==pvr) {
520 pvr = set->GetPVRec();
521 }
522
523 // Efficiency plate by plate
524
525 int plmax=0, plmin=1000;
526
527 for(int i=0;i<pvr->Npatterns();i++){
528 EdbPattern *pat = pvr->GetPattern(i);
529 if(pat==NULL) continue;
530 EdbSegP *s = pat->GetSegment(0);
531 if(s==NULL) continue;
532 if(s->Plate()<plmin) plmin=s->Plate();
533 if(s->Plate()>plmax) plmax=s->Plate();
534 }
535
536 if(plmax<plmin) { int tmp=plmax; plmax=plmin; plmin=tmp;} // if order of pid and ipl were opposite.
537
538 int npl = plmax-plmin+1;
539
540 int nsegcut = gEDA->GetMainTab()->GetNsegCut();
541
542 // definition of histgrams
543 TH2I *hangle = new TH2I("hangle",Form("Angular distribution nseg>=%d",nsegcut), 60,-0.6,0.6, 60,-0.6,0.6);
544 hangle->SetXTitle("#thetax [rad]");
545 hangle->SetYTitle("#thetay [rad]");
546
547 TH1I *hnseg = new TH1I("hnseg","Nseg", npl, 0.5, npl+0.5);
548 hnseg->SetXTitle("N segments");
549
550 TH1I *hph = new TH1I("hph",Form("PH, nseg>=%d",nsegcut), 20, 12.5,32.5);
551 hph->SetXTitle("PH");
552
553 TH1I *hphgt4 = new TH1I("hphgt4","PH, nseg>=4", 20, 12.5,32.5);
554 hphgt4->SetXTitle("PH, nseg>=4");
555 hphgt4->SetLineColor(kBlue);
556
557 TH1I *hphmeangt4 = new TH1I("hphmeangt4","PH, nseg>=4", 20, 12.5,32.5);
558 hphmeangt4->SetXTitle("PH mean, nseg>=4");
559 hphmeangt4->SetLineColor(kBlue);
560
561 TH1I *h1stpl = new TH1I("h1stpl",Form("1st plate, nseg>=%d",nsegcut), npl, plmin-0.5, plmax+0.5);
562 h1stpl->SetLineColor(kBlue);
563 h1stpl->SetXTitle("First plate");
564
565 TH1I *hlastpl = new TH1I("hlastpl",Form("last plate, nseg>=%d",nsegcut), npl, plmin-0.5, plmax+0.5);
566 hlastpl->SetXTitle("Last plate");
567
568 for(int i=0;i<pvr->Ntracks();i++){
569 EdbTrackP *t = pvr->GetTrack(i);
570 if(t==NULL) continue;
571
572 double ph = t->Wgrains()/t->N();
573
574 int nseg = t->N();
575 hnseg->Fill(nseg);
576 if(nseg>=nsegcut){
577 hangle->Fill(t->TX(),t->TY());
578 h1stpl->Fill((t->GetSegmentFirst())->Plate());
579 hlastpl->Fill((t->GetSegmentLast())->Plate());
580 }
581 if(nseg>=4) hphmeangt4->Fill(ph);
582
583 for(int j=0;j<t->N();j++){
584 if(nseg>=nsegcut)hph->Fill(t->GetSegment(j)->W());
585 if(t->N()>=4) hphgt4->Fill(t->GetSegment(j)->W());
586 }
587 }
588
589 // drawing
590 TCanvas *c1=CreateCanvas("Overview");
591 c1->Divide(2,2);
592
593 c1->cd(1);
594 hangle->Draw("colz");
595
596 c1->cd(2);
597 hnseg->Draw();
598
599 c1->cd(3);
600
601 int max=(int)hph->GetMaximum();
602 if( max < hphgt4->GetMaximum()) max= (int)hphgt4->GetMaximum();
603 hph->SetMaximum(max*1.1);
604 hph->Draw();
605 hphgt4->Draw("same");
606 hphmeangt4->SetFillColor(kYellow);
607 hphmeangt4->Draw("same");
608 TLegend *leg = new TLegend(0.12,0.70, 0.40, 0.88);
609 leg->AddEntry(hph, Form("PH, nseg>=%d",nsegcut), "l");
610 leg->AddEntry(hphgt4, "PH, nseg#geq4", "l");
611 leg->AddEntry(hphmeangt4, "PH mean, nseg#geq4", "lf");
612
613 leg->Draw();
614
615 c1->cd(4);
616 hlastpl->SetTitle("Start and End plate");
617 hlastpl->Draw();
618 h1stpl->Draw("same");
619 leg = new TLegend(0.55,0.6, 0.75, 0.70);
620 leg->AddEntry(h1stpl, "First plate", "l");
621 leg->AddEntry(hlastpl, "Last plate", "l");
622 leg->Draw();
623
624 c1->Update();
625}
TLegend * leg
Definition: Canv_SYSTEMATICS_ALLCOMBINED__RMSEnergy__vs__Energy__ELECTRON.C:122
int max
Definition: check_shower.C:41

◆ CheckPHDAngle()

void EdbEDAPlotTab::CheckPHDAngle ( EdbPVRec pvr = NULL)
261 {
262 int i,j;
263
264 TCanvas *c1 = CreateCanvas("PH-dAngle");
265
266 if(NULL==pvr) {
268 pvr = set->GetPVRec();
269 }
270
271 // Efficiency plate by plate
272
273 int plmax=0, plmin=1000;
274
275 for(i=0;i<pvr->Npatterns();i++){
276 EdbPattern *pat = pvr->GetPattern(i);
277 if(pat==NULL) continue;
278 EdbSegP *s = pat->GetSegment(0);
279 if(s==NULL) continue;
280 if(s->Plate()<plmin) plmin=s->Plate();
281 if(s->Plate()>plmax) plmax=s->Plate();
282 }
283
284 if(plmax<plmin) { int tmp=plmax; plmax=plmin; plmin=tmp;} // if order of pid and ipl were opposite.
285 int npl = plmax-plmin+1;
286
287 int nsegcut = gEDA->GetMainTab()->GetNsegCut();
288
289 double *dangle=new double[2*npl];
290
291 TNtuple *nt = new TNtuple ("ntqualities","TNtuple for quality plots","nseg:ph:rms");
292 for(i=0; i<pvr->Ntracks(); i++){
293 EdbTrackP *t = pvr->GetTrack(i);
294 double ph = t->Wgrains()/t->N();
295 int nseg=t->N();
296
297 for(j=0;j<nseg-1;j++){
298 EdbSegP *s1 = t->GetSegment(j);
299 EdbSegP *s2 = t->GetSegment(j+1);
300 dangle[2*j] = s1->TX() - s2->TX();
301 dangle[2*j+1] = s1->TY() - s2->TY();
302 }
303 double rms = DTRMS(t);
304
305 nt->Fill(nseg,ph,rms);
306 }
307
308 TH1D *hphall = new TH1D("hphall", "PH mean = #SigmaPH/nseg", 20, 12.5,32.5);
309 hphall->SetXTitle("PH mean");
310 nt->Draw("ph >>hphall");
311 TH1D *hphnseg2 = new TH1D("hphnseg2", "PH, Nseg=2", 20, 12.5,32.5);
312 hphnseg2->SetLineColor(2);
313 nt->Draw("ph >>hphnseg2","nseg==2");
314 TH1D *hphnsegcut = new TH1D("hphnsegcut", Form("PH, Nseg>=%d", nsegcut), 20, 12.5,32.5);
315 hphnsegcut->SetLineColor(kBlue);
316 nt->Draw("ph >>hphnsegcut",Form("nseg>=%d", nsegcut));
317
318 TH1D *hdtrmsall = new TH1D("hdtrmsall", "Angular deviation", 50, 0, 0.1);
319 hdtrmsall->SetXTitle("deviation RMS (rad)");
320 nt->Draw("rms >>hdtrmsall");
321 TH1D *hdtrmsnseg2 = new TH1D("hdtrmsnseg2", "Angular deviation, Nseg==2", 50, 0, 0.1);
322 hdtrmsnseg2->SetLineColor(2);
323 nt->Draw("rms >>hdtrmsnseg2","nseg==2");
324 TH1D *hdtrmsnsegcut = new TH1D("hdtrmsnsegcut", Form("Angular deviation, Nseg>=%d", nsegcut), 50, 0, 0.1);
325 hdtrmsnsegcut->SetLineColor(kBlue);
326 nt->Draw("rms >>hdtrmsnsegcut",Form("nseg>=%d", nsegcut));
327
328 TH2I *hphrmsall = new TH2I("hphrmsall","PH-#delta#theta^{RMS}", 20, 12.5,32.5, 50, 0, 0.1);
329 nt->Draw("rms:ph >>hphrmsall");
330 hphrmsall->SetXTitle("PH mean");
331 hphrmsall->SetYTitle("#delta#theta^{RMS} rad");
332
333 TH2I *hphrmscut = new TH2I("hphrmscut",Form("PH-#delta#theta^{RMS}, nseg>=%d", nsegcut), 20, 12.5,32.5, 50, 0, 0.1);
334 nt->Draw("rms:ph >>hphrmscut",Form("nseg>=%d",nsegcut));
335 hphrmscut->SetXTitle("PH mean");
336 hphrmscut->SetYTitle("#delta#theta^{RMS} rad");
337
338 c1->Clear();
339 c1->Divide(2,2);
340 c1->cd(1);
341 hphall->Draw();
342 hphnsegcut->Draw("same");
343 hphnseg2->Draw("same");
344
345 TLegend *leg = new TLegend(0.5,0.85, 0.75, 0.99);
346 leg->AddEntry(hphall, "PH, all", "f");
347 leg->AddEntry(hphnseg2, "PH, nseg==2", "f");
348 leg->AddEntry(hphnsegcut, Form("PH, nseg>=%d", nsegcut), "f");
349 leg->Draw();
350
351 c1->cd(2);
352 hdtrmsall->Draw();
353 hdtrmsnsegcut->Draw("same");
354 hdtrmsnseg2->Draw("same");
355 leg->Draw();
356
357
358
359 c1->cd(3);
360
361 double a = gEDA->GetMainTab()->GetPHDTRMS();
362 double b = gEDA->GetMainTab()->GetPHCut();
363 TF1 *func = new TF1("fphdtrms", Form("%lf*(x-%lf)", a,b), 12.5, 32.5);
364 hphrmsall->Draw("col");
365 func->Draw("same");
366 TPaveText *pave = new TPaveText(0.5,0.88, 0.75, 0.99,"brNDC");
367 int nselected=nt->GetEntries(Form("rms<%lf*(ph-%lf)", a, b));
368 int nrejected=nt->GetEntries(Form("rms>=%lf*(ph-%lf)", a, b));
369 pave->AddText(Form("%5d selected",nselected));
370 pave->AddText(Form("%5d rejected",nrejected));
371 pave->Draw();
372
373
374 c1->cd(4);
375 hphrmscut->Draw("col");
376 func->Draw("same");
377 pave = new TPaveText(0.5,0.88, 0.75, 0.99,"brNDC");
378 nselected=nt->GetEntries(Form("nseg>=%d&&rms<%lf*(ph-%lf)", nsegcut, a, b));
379 nrejected=nt->GetEntries(Form("nseg>=%d&&rms>=%lf*(ph-%lf)", nsegcut, a, b));
380 pave->AddText(Form("%5d selected",nselected));
381 pave->AddText(Form("%5d rejected",nrejected));
382 pave->Draw();
383
384
385}
double GetPHCut()
Definition: EdbEDAMainTab.h:109
double GetPHDTRMS()
Definition: EdbEDAMainTab.h:110
double DTRMS(EdbTrackP *t)
Definition: EdbEDAUtil.C:431

◆ CheckSingleTrack()

void EdbEDAPlotTab::CheckSingleTrack ( EdbTrackP t)
638 {
639
640 printf("CheckSingleTrack : Make a plot for a track.\n");
641 // copy of EdbTrackP
642 EdbTrackP *t2 = new EdbTrackP;
643 t2->Copy(*t);
644 // first and last segment
645 EdbSegP *s1st = t->GetSegmentFirst();
646 EdbSegP *slast= t->GetSegmentLast();
647
648 // make a better fit by connecting the first and last segment. 2014/7/9 Aki.
649 t2->Set(t2->ID(),
650 (s1st->X()+slast->X())/2,
651 (s1st->Y()+slast->Y())/2,
652 (s1st->X()-slast->X())/(s1st->Z()-slast->Z()),
653 (s1st->Y()-slast->Y())/(s1st->Z()-slast->Z()),
654 t2->W(), t2->Flag());
655 t2->SetZ((s1st->Z()+slast->Z())/2);
656
657 // momentum
658 double p,pmin,pmax;
659 CalcP(t,p,pmin,pmax);
660 // trajectries
661 TNtuple *nt = new TNtuple(Form("nt%d",t->ID()),Form("Track %d",t->ID()),"eTrack:eID:eW:ipl:eX:eY:eZ:eTX:eTY:dX:dY:eSide");
662 double W[60];
663 for(int i=0;i<t->N();i++){
664 EdbSegP *s = t->GetSegment(i);
665 W[i] = s->W();
666 t2->PropagateTo(s->Z());
667 double dx = s->X()-t2->X();
668 double dy = s->Y()-t2->Y();
669
670 nt->Fill(t->ID(),s->ID(),s->W(),s->Plate(), s->X(),s->Y(),s->Z(),s->TX(),s->TY(),dx,dy, s->Side());
671
672 }
673 double Wmean = TMath::Mean(t->N(),W);
674 double Wrms = TMath::RMS(t->N(),W);
675
676 // cosmic eff and PH calculation.
677 double wcr=0.0, effcr=0.0;
678 int wcrcnt=0, effcrcnt=0;
679
681 EdbPVRec *pvr = set->GetPVRec();
682
683 if(pvr!=NULL){
684 printf("Calculate the reference efficiency from TS (cosmic rays).");
685
686 int plmax=0, plmin=1000;
687 for(int i=0;i<pvr->Npatterns();i++){
688 EdbPattern *pat = pvr->GetPattern(i);
689 if(pat==NULL) continue;
690 EdbSegP *s = pat->GetSegment(0);
691 if(s==NULL) continue;
692 if(s->Plate()<plmin) plmin=s->Plate();
693 if(s->Plate()>plmax) plmax=s->Plate();
694 }
695
696 int trklencut = abs(plmax-plmin);
697 trklencut/=2;
698 trklencut= (int) (trklencut*(1-sqrt(t->TX()*t->TX()+t->TY()*t->TY())));
699 if(trklencut<8) trklencut=8;
700 if(trklencut>20) trklencut=20;
701 printf(" Track length cut for cosmic ray = %d, dtheta<%.3lfrad\n", trklencut,eDTReference);
702 for(int i=0;i<set->NBase();i++){
703 EdbTrackP *tc = set->GetTrackBase(i);
704 if(tc==NULL) continue;
705 // track length cut
706 int iplF = tc->GetSegmentFirst()->Plate();
707 int iplL = tc->GetSegmentLast()->Plate();
708 int trklen = iplL-iplF+1;
709 if(trklen<trklencut) continue;
710
711 // angular cut
712 if( fabs(t->TX()-tc->TX())>eDTReference) continue;
713 if( fabs(t->TY()-tc->TY())>eDTReference) continue;
714
715 // efficiency
716 printf(" %2d->%2d, %2d/%2d = %.2lf\n", iplF, iplL, tc->N()-2, trklen-2, (double) (tc->N()-2)/(trklen-2));
717 effcr += (double) (tc->N()-2)/(trklen-2);
718 effcrcnt++;
719
720 // W
721 for(int j=0;j<tc->N();j++){
722 EdbSegP *s = tc->GetSegment(j);
723 wcr+=s->W();
724 wcrcnt++;
725 }
726
727 }
728 wcr = wcrcnt==0 ? 0.0 : wcr/wcrcnt;
729 effcr = effcrcnt==0 ? 0.0 : effcr/effcrcnt;
730 }
731
732 EdbTrackP *tsb = gEDA->CheckScanback(t);
733 int sbid = tsb?tsb->ID():-1;
734 int muonid = gEDA->IdMuon();
735
736 CreateCanvas(Form("%d", t->ID()));
737
738 TPaveText *pt = new TPaveText(0.05,0.87,0.9,0.98,"br");
739 pt->SetTextSize(0.03);
740 pt->SetTextAlign(12);
741 int trklen = abs(slast->Plate() - s1st->Plate())+1;
742
743 pt->AddText(Form("trk %4d pl %2d -> %2d %8.1lf %8.1lf %8.1lf %7.4lf %7.4lf",
744 t->ID(), t->GetSegmentFirst()->Plate(),
745 t->GetSegmentLast()->Plate(),
746 t->X(),t->Y(),t->Z(),t->TX(),t->TY()));
747
748 int nMT = 0;
749 for(int i=0;i<t->N();i++) if(t->GetSegment(i)->Side()!=0) nMT++;
750 pt->AddText(Form("length = %d, nseg = %d (n_{MT}=%d), eff = %.3lf, PHmean = %.1lf #pm %.1lf (CR %.3lf, %.1lf)",
751 trklen, t->N(), nMT,
752 t->N()==2?0.0: (double)(t->N()-2)/(trklen-2), Wmean, t->N()>1 ? Wrms/sqrt((double)(t->N()-1)) : Wrms, effcr, wcr));
753
754
755 pt->AddText(Form("P = %.2lf - %.2lf +%.2lf GeV/c (90%%CL)", p, pmin, pmax));
756 pt->Draw();
757
758
759 if(sbid>0){
760 TPaveText *pt = new TPaveText(0.82,0.87,0.95,0.98,"br");
761 pt->SetTextSize(0.035);
762 pt->SetTextAlign(12);
763 pt->AddText(Form("SBid = %d", sbid));
764 if(sbid==muonid) pt->AddText(Form("Muon"));
765 pt->Draw();
766 }
767
768 TPad *c1_x = new TPad("c1_x", "Trajectories", 0.01,0.01,0.99,0.85);
769 c1_x->Draw();
770
771 c1_x->cd();
772 //c1_x->Divide(3,3);
773 c1_x->Divide(3,2);
774
775 nt->SetMarkerStyle(20);
776 nt->SetMarkerSize(0.4);
777
778 int ic=1;
779
780 c1_x->cd(ic++);
781 nt->Draw("eX:ipl");
782 nt->GetHistogram()->SetYTitle("X #mum");
783 nt->SetMarkerColor(kRed);
784 nt->Draw("eX:ipl","eSide==1", "same");
785 nt->SetMarkerColor(kBlue);
786 nt->Draw("eX:ipl","eSide==2", "same");
787 nt->SetMarkerColor(kBlack);
788
789 TLine *l = new TLine();
790 t2->PropagateTo(s1st->Z());
791 double x1 = s1st->Plate();
792 double y1 = t2->X();
793 t2->PropagateTo(slast->Z());
794 double x2 = slast->Plate();
795 double y2 = t2->X();
796 l->DrawLine(x1,y1,x2,y2);
797
798 c1_x->cd(ic++);
799 nt->Draw("dX:ipl");
800 nt->GetHistogram()->SetYTitle("dX #mum");
801 nt->SetMarkerColor(kRed);
802 nt->Draw("dX:ipl","eSide==1", "same");
803 nt->SetMarkerColor(kBlue);
804 nt->Draw("dX:ipl","eSide==2", "same");
805 nt->SetMarkerColor(kBlack);
806
807 c1_x->cd(ic++);
808 nt->Draw("eTX:ipl");
809 nt->GetHistogram()->SetYTitle("TX rad");
810 nt->SetMarkerColor(kRed);
811 nt->Draw("eTX:ipl","eSide==1", "same");
812 nt->SetMarkerColor(kBlue);
813 nt->Draw("eTX:ipl","eSide==2", "same");
814 nt->SetMarkerColor(kBlack);
815
816 c1_x->cd(ic++);
817 nt->Draw("eY:ipl");
818 nt->GetHistogram()->SetYTitle("Y #mum");
819 nt->SetMarkerColor(kRed);
820 nt->Draw("eY:ipl","eSide==1", "same");
821 nt->SetMarkerColor(kBlue);
822 nt->Draw("eY:ipl","eSide==2", "same");
823 nt->SetMarkerColor(kBlack);
824
825
826 t2->PropagateTo(s1st->Z());
827 x1 = s1st->Plate();
828 y1 = t2->Y();
829 t2->PropagateTo(slast->Z());
830 x2 = slast->Plate();
831 y2 = t2->Y();
832 l->DrawLine(x1,y1,x2,y2);
833
834 c1_x->cd(ic++);
835 nt->Draw("dY:ipl");
836 nt->GetHistogram()->SetYTitle("dY #mum");
837 nt->SetMarkerColor(kRed);
838 nt->Draw("dY:ipl","eSide==1", "same");
839 nt->SetMarkerColor(kBlue);
840 nt->Draw("dY:ipl","eSide==2", "same");
841 nt->SetMarkerColor(kBlack);
842
843 c1_x->cd(ic++);
844 nt->Draw("eTY:ipl");
845 nt->GetHistogram()->SetYTitle("TY rad");
846 nt->SetMarkerColor(kRed);
847 nt->Draw("eTY:ipl","eSide==1", "same");
848 nt->SetMarkerColor(kBlue);
849 nt->Draw("eTY:ipl","eSide==2", "same");
850 nt->SetMarkerColor(kBlack);
851 /*
852 c1_x->cd(ic++);
853
854 nt->Draw("eW:ipl");
855 nt->GetHistogram()->SetYTitle("Pulse Height");
856// nt->GetHistogram()->Fit("pol1");
857 nt->GetHistogram()->SetMinimum(0);
858 nt->GetHistogram()->SetMaximum(0);
859 nt->SetMarkerColor(kRed);
860 nt->Draw("eW:ipl","eSide==1", "same");
861 nt->SetMarkerColor(kBlue);
862 nt->Draw("eW:ipl","eSide==2", "same");
863 nt->SetMarkerColor(kBlack);
864 l->DrawLine(s1st->Plate(), wcr, slast->Plate(), wcr);
865 */
866}
TPaveText * pt
Definition: Canv_SYSTEMATICS_ALLCOMBINED__RMSEnergy__vs__Energy__ELECTRON.C:160
int IdMuon(char *filename="../cs_info.txt")
Definition: EdbEDA.C:1045
EdbTrackP * CheckScanback(EdbTrackP *t)
Definition: EdbEDA.h:730
Definition: EdbPVRec.h:148
void PropagateTo(float z)
Definition: EdbSegP.cxx:293
void SetZ(float z)
Definition: EdbSegP.h:125
Float_t W() const
Definition: EdbSegP.h:151
Int_t Flag() const
Definition: EdbSegP.h:149
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:87
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:195
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:473
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:190
EdbSegP * GetSegmentFirst() const
Definition: EdbPattern.h:189
EdbMomentumEstimator * CalcP(EdbTrackP *t, double &p, double &pmin, double &pmax, bool print=kTRUE)
Definition: EdbEDAUtil.C:369
Int_t W
Definition: testBGReduction_By_ANN.C:15

◆ CheckTracks()

void EdbEDAPlotTab::CheckTracks ( )
627 {
628 TObjArray *selected_tracks = gEDA->GetSelectedTracks();
629 if(selected_tracks->GetEntries()==0) return;
630
631 for(int i=0;i<selected_tracks->GetEntries();i++){
632 EdbTrackP *t = (EdbTrackP *) selected_tracks->At(i);
633 if(t==NULL) continue;
635 }
636}
void CheckSingleTrack(EdbTrackP *t)
Definition: EdbEDAPlotTab.C:638

◆ CreateCanvas()

static TCanvas * EdbEDAPlotTab::CreateCanvas ( char *  plot_name)
inlinestatic

— Create an embedded canvas

28 {
30
31 TCanvas *c1;
32
33 if(gEve==NULL) c1 = new TCanvas();
34
35 else {
36 gEve->GetBrowser()->StartEmbedding(1);
37 gROOT->ProcessLineFast("new TCanvas");
38 c1 = (TCanvas*) gPad;
39 gEve->GetBrowser()->StopEmbedding(plot_name);
40 }
41
42 return c1;
43 }

◆ MakeGUI()

void EdbEDAPlotTab::MakeGUI ( )
1219 {
1220 if(gEve==NULL) return;
1221 TEveBrowser* browser = gEve->GetBrowser();
1222 browser->StartEmbedding(TRootBrowser::kBottom);
1223
1224 TGHorizontalFrame* fMainFrame = new TGHorizontalFrame(gClient->GetRoot());
1225 fMainFrame->SetWindowName("XX GUI");
1226 fMainFrame->SetCleanup(kDeepCleanup);
1227
1228 //TGLabel *fLabel;
1229 TGTextButton *fb;
1230 int posy=10;
1231 int posx=10;
1232 int dx=50;
1233
1234 TGGroupFrame *fGroup;
1235
1237 fGroup = new TGGroupFrame(fMainFrame,"TS");
1238 fGroup->SetLayoutBroken(kTRUE);
1239 posy=18;
1240 posx=10;
1241 fb = new TGTextButton(fGroup,"Overview");
1242 fb->MoveResize(posx,posy,dx=80,20);
1243 fb->Connect("Clicked()","EdbEDAPlotTab",this,"CheckOverview()");
1244 fb->SetToolTipText("Basic plots, nsegcut on Main tab is valid.");
1245 posx+=dx+10;
1246 fb = new TGTextButton(fGroup,"Efficiency");
1247 fb->MoveResize(posx,posy,dx=80,20);
1248 fb->Connect("Clicked()","EdbEDAPlotTab",this,"CheckEff()");
1249 fb->SetToolTipText("Efficiency for TS. Use all tracks with more than 4 segments except the plate to be evaluated.");
1250
1251 posy+=23;
1252 posx=10;
1253 fb = new TGTextButton(fGroup,"PH - dAngle");
1254 fb->MoveResize(posx,posy,dx=80,20);
1255 fb->Connect("Clicked()","EdbEDAPlotTab",this,"CheckPHDAngle()");
1256
1257 posx+=dx+10;
1258 fb = new TGTextButton(fGroup,"Alignment");
1259 fb->MoveResize(posx,posy,dx=80,20);
1260 fb->Connect("Clicked()","EdbEDAPlotTab",this,"CheckAlignment()");
1261 fb->SetToolTipText("Position, Angle displacement as profile hist (RMS). Nsegcut on Main tab is valid.");
1262
1263 fMainFrame->AddFrame(fGroup, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
1264 fGroup->Resize(200,75);
1265
1267 fGroup = new TGGroupFrame(fMainFrame,"Track");
1268 fGroup->SetLayoutBroken(kTRUE);
1269
1270 posy=18;
1271 posx=10;
1272
1273 fb = new TGTextButton(fGroup,"Track");
1274 fb->MoveResize(posx,posy,dx=80,20);
1275 fb->Connect("Clicked()","EdbEDAPlotTab",this,"CheckTracks()");
1276
1277 posx+=dx+10;
1278 fb = new TGTextButton(fGroup,"Kink");
1279 fb->MoveResize(posx,posy,dx=80,20);
1280 fb->Connect("Clicked()","EdbEDAPlotTab",this,"CheckKinkTracks()");
1281 fb->SetToolTipText("Search Kink");
1282
1283 posy+=23;
1284 posx=10;
1285
1286 fb = new TGTextButton(fGroup,"Mom Plot");
1287 fb->MoveResize(posx,posy,dx=70,20);
1288 fb->Connect("Clicked()","EdbEDAPlotTab",this,"MomPlot()");
1289 fb->SetToolTipText("Make Momentum plots. \nAngular resolution indicated in the right number entry will be used. default=0.0021");
1290
1291 posx+=dx+5;
1292 fb = new TGTextButton(fGroup,"Alg");
1293 fb->MoveResize(posx,posy,dx=30,20);
1294 fb->Connect("Clicked()","EdbEDAPlotTab",this,"SetMomAlg()");
1295 fb->SetToolTipText("Select angular method or coordinate method\nfor momentum computation.");
1296
1297 posx+=dx+5;
1298// eMomAngleRes = new TGNumberEntry(fGroup, eTF.eDT0, 11,-1,TGNumberFormat::kNESRealFour);
1299 eMomAngleRes = new TGNumberEntry(fGroup, 0.0021, 11,-1,TGNumberFormat::kNESRealFour);
1300 eMomAngleRes->MoveResize(posx,posy,dx=60,20);
1301 eMomAngleRes->GetNumberEntry()->SetToolTipText("Angular resolution. default=0.0021\n"
1302 "This will be applied only for angular method.");
1303
1304 fMainFrame->AddFrame(fGroup, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
1305 fGroup->Resize(240,75);
1306
1307// posx+=dx+10;
1308
1309 fMainFrame->MapSubwindows();
1310 fMainFrame->Resize();
1311 fMainFrame->MapWindow();
1312
1313 browser->StopEmbedding();
1314 browser->SetTabTitle("Plots", 2);
1315}
TGNumberEntry * eMomAngleRes
Definition: EdbEDAPlotTab.h:19

◆ MomPlot()

void EdbEDAPlotTab::MomPlot ( )
1147 {
1148 TObjArray *selected_tracks = gEDA->GetSelectedTracks();
1149 if(selected_tracks->GetEntries()==0) return;
1150
1151 double angular_resolution = eMomAngleRes->GetNumber();
1152// eTF.eDT0 = angular_resolution; // commented out for reason of incompability
1153// eTF.eDTx0 = angular_resolution; // commented out for reason of incompability
1154// eTF.eDTy0 = angular_resolution; // commented out for reason of incompability
1155
1156 // To fix incompability, introduced in revision 1376 me provide a workaround here:
1157 // Only first parameter in function is changed, others stay as defined in
1158 // EdbMomentumEstimator.cxx
1159 for (Int_t i=0; i<3; ++i) eTF.SetParPMS_Mag(i,0,angular_resolution);
1160
1161 for(int i=0;i<selected_tracks->GetEntries();i++){
1162 EdbTrackP *t0 = (EdbTrackP *) selected_tracks->At(i);
1163 if(t0==NULL) continue;
1164 EdbTrackP *t=CleanTrack(t0);
1165
1166 if(t->Npl()<t->N()){
1167 // in this case P estimation doesn't work.
1168 // this can happen if a track is formed from 2 different data set.
1169 // (PID definitions are defferent amond 2 data set.)
1170 // put absolute plate number as PID. (temporary solution)
1171 for(int i=0;i<t->N();i++) t->GetSegment(i)->SetPID(t->GetSegment(i)->Plate());
1172 }
1173
1174 for(int i=0;i<t->N();i++) t->GetSegment(i)->SetPID(t->GetSegment(i)->Plate());
1175 t->SetCounters();
1176
1177 if(t->N()<=2) continue;
1178 eTF.eMinEntr=3;
1179
1180 printf("Track ID: %i ; TX=%1.4f , TY=%1.4f , Nb of BT= %i\n",t->ID(),t->TX(),t->TY(),t->N());
1181
1182 eTF.PMS(*t);
1183
1184 float averagex = 0;
1185 float averagey = 0;
1186 for(int i=0; i<t->N(); i++){
1187 averagex += t->GetSegment(i)->TX();
1188 averagey += t->GetSegment(i)->TY();
1189 }
1190 averagex /= t->N();
1191 averagey /= t->N();
1192
1193 float slope = sqrt(averagex*averagex+averagey*averagey);
1194 printf("slope %f\n", slope);
1195 float p, pmin, pmax;
1196
1197 if (slope<=0.2) // use P3D
1198 {
1199 printf(" PT =%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.ePy, eTF.ePYmin, eTF.ePYmax);
1200 printf(" ->P3D=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.eP, eTF.ePmin, eTF.ePmax);
1201 p=eTF.eP;
1202 pmin=eTF.ePmin;
1203 pmax=eTF.ePmax;
1204 }
1205 if (slope>0.2) // use PT
1206 {
1207 printf(" ->PT =%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.ePy, eTF.ePYmin, eTF.ePYmax);
1208 printf(" P3D=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.eP, eTF.ePmin, eTF.ePmax);
1209 p=eTF.ePy;
1210 pmin=eTF.ePYmin;
1211 pmax=eTF.ePYmax;
1212 }
1213 TCanvas *c1 = CreateCanvas(Form("P%d", t->ID()));
1214
1215 eTF.DrawPlots(c1);
1216 }
1217}
EdbMomentumEstimator eTF
Definition: EdbEDAPlotTab.h:18
float ePmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:44
void DrawPlots(TCanvas *c1=NULL)
Definition: EdbMomentumEstimator.cxx:724
float eP
the output of PMSang
Definition: EdbMomentumEstimator.h:43
void SetParPMS_Mag()
Definition: EdbMomentumEstimator.cxx:73
int eMinEntr
min number of entries in the cell to accept it for fitting (def=1)
Definition: EdbMomentumEstimator.h:28
float ePy
the estimated momentum
Definition: EdbMomentumEstimator.h:36
float ePmin
Definition: EdbMomentumEstimator.h:44
float ePYmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:40
float ePYmin
Definition: EdbMomentumEstimator.h:40
float PMS(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:121

◆ SetEffMinSeg()

void EdbEDAPlotTab::SetEffMinSeg ( int  nseg)
inline
26{ eEffMinSeg=nseg;}

◆ SetEffNbins()

void EdbEDAPlotTab::SetEffNbins ( int  nbins,
double  tmax = 0.7 
)
inline
25{ eEffNbins=nbins; eEffTmax = tmax;}

◆ SetMomAlg()

void EdbEDAPlotTab::SetMomAlg ( )
1137 {
1139 "Set Momentum methos.\n"
1140 "0 = Angular method (default)\n"
1141 "3 = Coordinate method\n"
1142 , eTF.eAlg);
1143
1144 eTF.eAlg = alg;
1145}
int eAlg
select the algorithm for PMS estimation
Definition: EdbMomentumEstimator.h:25
int InputNumberInteger(char *message, int idefault=0)
Definition: EdbEDAUtil.C:846

◆ SetMomAlgAngle()

void EdbEDAPlotTab::SetMomAlgAngle ( )
inline
57{ eTF.eAlg=0;}

◆ SetMomAlgCoord()

void EdbEDAPlotTab::SetMomAlgCoord ( )
inline
56{ eTF.eAlg=3;}

Member Data Documentation

◆ eDTReference

double EdbEDAPlotTab::eDTReference

◆ eEffMinSeg

int EdbEDAPlotTab::eEffMinSeg
private

Minimum number of segment for efficiency calculation. (count except the target plate.)

◆ eEffNbins

int EdbEDAPlotTab::eEffNbins
private

◆ eEffTmax

double EdbEDAPlotTab::eEffTmax
private

◆ eMomAngleRes

TGNumberEntry* EdbEDAPlotTab::eMomAngleRes
private

◆ eTF

EdbMomentumEstimator EdbEDAPlotTab::eTF
private

The documentation for this class was generated from the following files: