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
 
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
Definition: EdbEDAPlotTab.h:17
int eEffNbins
Definition: EdbEDAPlotTab.h:15
void MakeGUI()
Definition: EdbEDAPlotTab.C:1216
double eEffTmax
Definition: EdbEDAPlotTab.h:16

Member Function Documentation

◆ CheckAlignment()

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

◆ CheckEff()

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

◆ CheckKink()

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

◆ CheckOverview()

void EdbEDAPlotTab::CheckOverview ( EdbPVRec pvr = NULL)
514  {
515  if(NULL==pvr) {
517  pvr = set->GetPVRec();
518  }
519 
520  // Efficiency plate by plate
521 
522  int plmax=0, plmin=1000;
523 
524  for(int i=0;i<pvr->Npatterns();i++){
525  EdbPattern *pat = pvr->GetPattern(i);
526  if(pat==NULL) continue;
527  EdbSegP *s = pat->GetSegment(0);
528  if(s==NULL) continue;
529  if(s->Plate()<plmin) plmin=s->Plate();
530  if(s->Plate()>plmax) plmax=s->Plate();
531  }
532 
533  if(plmax<plmin) { int tmp=plmax; plmax=plmin; plmin=tmp;} // if order of pid and ipl were opposite.
534 
535  int npl = plmax-plmin+1;
536 
537  int nsegcut = gEDA->GetMainTab()->GetNsegCut();
538 
539  // definition of histgrams
540  TH2I *hangle = new TH2I("hangle",Form("Angular distribution nseg>=%d",nsegcut), 60,-0.6,0.6, 60,-0.6,0.6);
541  hangle->SetXTitle("#thetax [rad]");
542  hangle->SetYTitle("#thetay [rad]");
543 
544  TH1I *hnseg = new TH1I("hnseg","Nseg", npl, 0.5, npl+0.5);
545  hnseg->SetXTitle("N segments");
546 
547  TH1I *hph = new TH1I("hph",Form("PH, nseg>=%d",nsegcut), 20, 12.5,32.5);
548  hph->SetXTitle("PH");
549 
550  TH1I *hphgt4 = new TH1I("hphgt4","PH, nseg>=4", 20, 12.5,32.5);
551  hphgt4->SetXTitle("PH, nseg>=4");
552  hphgt4->SetLineColor(kBlue);
553 
554  TH1I *hphmeangt4 = new TH1I("hphmeangt4","PH, nseg>=4", 20, 12.5,32.5);
555  hphmeangt4->SetXTitle("PH mean, nseg>=4");
556  hphmeangt4->SetLineColor(kBlue);
557 
558  TH1I *h1stpl = new TH1I("h1stpl",Form("1st plate, nseg>=%d",nsegcut), npl, plmin-0.5, plmax+0.5);
559  h1stpl->SetLineColor(kBlue);
560  h1stpl->SetXTitle("First plate");
561 
562  TH1I *hlastpl = new TH1I("hlastpl",Form("last plate, nseg>=%d",nsegcut), npl, plmin-0.5, plmax+0.5);
563  hlastpl->SetXTitle("Last plate");
564 
565  for(int i=0;i<pvr->Ntracks();i++){
566  EdbTrackP *t = pvr->GetTrack(i);
567  if(t==NULL) continue;
568 
569  double ph = t->Wgrains()/t->N();
570 
571  int nseg = t->N();
572  hnseg->Fill(nseg);
573  if(nseg>=nsegcut){
574  hangle->Fill(t->TX(),t->TY());
575  h1stpl->Fill((t->GetSegmentFirst())->Plate());
576  hlastpl->Fill((t->GetSegmentLast())->Plate());
577  }
578  if(nseg>=4) hphmeangt4->Fill(ph);
579 
580  for(int j=0;j<t->N();j++){
581  if(nseg>=nsegcut)hph->Fill(t->GetSegment(j)->W());
582  if(t->N()>=4) hphgt4->Fill(t->GetSegment(j)->W());
583  }
584  }
585 
586  // drawing
587  TCanvas *c1=CreateCanvas("Overview");
588  c1->Divide(2,2);
589 
590  c1->cd(1);
591  hangle->Draw("colz");
592 
593  c1->cd(2);
594  hnseg->Draw();
595 
596  c1->cd(3);
597 
598  int max=(int)hph->GetMaximum();
599  if( max < hphgt4->GetMaximum()) max= (int)hphgt4->GetMaximum();
600  hph->SetMaximum(max*1.1);
601  hph->Draw();
602  hphgt4->Draw("same");
603  hphmeangt4->SetFillColor(kYellow);
604  hphmeangt4->Draw("same");
605  TLegend *leg = new TLegend(0.12,0.70, 0.40, 0.88);
606  leg->AddEntry(hph, Form("PH, nseg>=%d",nsegcut), "l");
607  leg->AddEntry(hphgt4, "PH, nseg#geq4", "l");
608  leg->AddEntry(hphmeangt4, "PH mean, nseg#geq4", "lf");
609 
610  leg->Draw();
611 
612  c1->cd(4);
613  hlastpl->SetTitle("Start and End plate");
614  hlastpl->Draw();
615  h1stpl->Draw("same");
616  leg = new TLegend(0.55,0.6, 0.75, 0.70);
617  leg->AddEntry(h1stpl, "First plate", "l");
618  leg->AddEntry(hlastpl, "Last plate", "l");
619  leg->Draw();
620 
621  c1->Update();
622 }
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)
260  {
261  int i,j;
262 
263  TCanvas *c1 = CreateCanvas("PH-dAngle");
264 
265  if(NULL==pvr) {
267  pvr = set->GetPVRec();
268  }
269 
270  // Efficiency plate by plate
271 
272  int plmax=0, plmin=1000;
273 
274  for(i=0;i<pvr->Npatterns();i++){
275  EdbPattern *pat = pvr->GetPattern(i);
276  if(pat==NULL) continue;
277  EdbSegP *s = pat->GetSegment(0);
278  if(s==NULL) continue;
279  if(s->Plate()<plmin) plmin=s->Plate();
280  if(s->Plate()>plmax) plmax=s->Plate();
281  }
282 
283  if(plmax<plmin) { int tmp=plmax; plmax=plmin; plmin=tmp;} // if order of pid and ipl were opposite.
284  int npl = plmax-plmin+1;
285 
286  int nsegcut = gEDA->GetMainTab()->GetNsegCut();
287 
288  double *dangle=new double[2*npl];
289 
290  TNtuple *nt = new TNtuple ("ntqualities","TNtuple for quality plots","nseg:ph:rms");
291  for(i=0; i<pvr->Ntracks(); i++){
292  EdbTrackP *t = pvr->GetTrack(i);
293  double ph = t->Wgrains()/t->N();
294  int nseg=t->N();
295 
296  for(j=0;j<nseg-1;j++){
297  EdbSegP *s1 = t->GetSegment(j);
298  EdbSegP *s2 = t->GetSegment(j+1);
299  dangle[2*j] = s1->TX() - s2->TX();
300  dangle[2*j+1] = s1->TY() - s2->TY();
301  }
302  double rms = DTRMS(t);
303 
304  nt->Fill(nseg,ph,rms);
305  }
306 
307  TH1D *hphall = new TH1D("hphall", "PH mean = #SigmaPH/nseg", 20, 12.5,32.5);
308  hphall->SetXTitle("PH mean");
309  nt->Draw("ph >>hphall");
310  TH1D *hphnseg2 = new TH1D("hphnseg2", "PH, Nseg=2", 20, 12.5,32.5);
311  hphnseg2->SetLineColor(2);
312  nt->Draw("ph >>hphnseg2","nseg==2");
313  TH1D *hphnsegcut = new TH1D("hphnsegcut", Form("PH, Nseg>=%d", nsegcut), 20, 12.5,32.5);
314  hphnsegcut->SetLineColor(kBlue);
315  nt->Draw("ph >>hphnsegcut",Form("nseg>=%d", nsegcut));
316 
317  TH1D *hdtrmsall = new TH1D("hdtrmsall", "Angular deviation", 50, 0, 0.1);
318  hdtrmsall->SetXTitle("deviation RMS (rad)");
319  nt->Draw("rms >>hdtrmsall");
320  TH1D *hdtrmsnseg2 = new TH1D("hdtrmsnseg2", "Angular deviation, Nseg==2", 50, 0, 0.1);
321  hdtrmsnseg2->SetLineColor(2);
322  nt->Draw("rms >>hdtrmsnseg2","nseg==2");
323  TH1D *hdtrmsnsegcut = new TH1D("hdtrmsnsegcut", Form("Angular deviation, Nseg>=%d", nsegcut), 50, 0, 0.1);
324  hdtrmsnsegcut->SetLineColor(kBlue);
325  nt->Draw("rms >>hdtrmsnsegcut",Form("nseg>=%d", nsegcut));
326 
327  TH2I *hphrmsall = new TH2I("hphrmsall","PH-#delta#theta^{RMS}", 20, 12.5,32.5, 50, 0, 0.1);
328  nt->Draw("rms:ph >>hphrmsall");
329  hphrmsall->SetXTitle("PH mean");
330  hphrmsall->SetYTitle("#delta#theta^{RMS} rad");
331 
332  TH2I *hphrmscut = new TH2I("hphrmscut",Form("PH-#delta#theta^{RMS}, nseg>=%d", nsegcut), 20, 12.5,32.5, 50, 0, 0.1);
333  nt->Draw("rms:ph >>hphrmscut",Form("nseg>=%d",nsegcut));
334  hphrmscut->SetXTitle("PH mean");
335  hphrmscut->SetYTitle("#delta#theta^{RMS} rad");
336 
337  c1->Clear();
338  c1->Divide(2,2);
339  c1->cd(1);
340  hphall->Draw();
341  hphnsegcut->Draw("same");
342  hphnseg2->Draw("same");
343 
344  TLegend *leg = new TLegend(0.5,0.85, 0.75, 0.99);
345  leg->AddEntry(hphall, "PH, all", "f");
346  leg->AddEntry(hphnseg2, "PH, nseg==2", "f");
347  leg->AddEntry(hphnsegcut, Form("PH, nseg>=%d", nsegcut), "f");
348  leg->Draw();
349 
350  c1->cd(2);
351  hdtrmsall->Draw();
352  hdtrmsnsegcut->Draw("same");
353  hdtrmsnseg2->Draw("same");
354  leg->Draw();
355 
356  c1->cd(3);
357 
358  double a = gEDA->GetMainTab()->GetPHDTRMS();
359  double b = gEDA->GetMainTab()->GetPHCut();
360  TF1 *func = new TF1("fphdtrms", Form("%lf*(x-%lf)", a,b), 12.5, 32.5);
361  hphrmsall->Draw("col");
362  func->Draw("same");
363  TPaveText *pave = new TPaveText(0.5,0.88, 0.75, 0.99,"brNDC");
364  int nselected=nt->GetEntries(Form("rms<%lf*(ph-%lf)", a, b));
365  int nrejected=nt->GetEntries(Form("rms>=%lf*(ph-%lf)", a, b));
366  pave->AddText(Form("%5d selected",nselected));
367  pave->AddText(Form("%5d rejected",nrejected));
368  pave->Draw();
369 
370 
371  c1->cd(4);
372  hphrmscut->Draw("col");
373  func->Draw("same");
374  pave = new TPaveText(0.5,0.88, 0.75, 0.99,"brNDC");
375  nselected=nt->GetEntries(Form("nseg>=%d&&rms<%lf*(ph-%lf)", nsegcut, a, b));
376  nrejected=nt->GetEntries(Form("nseg>=%d&&rms>=%lf*(ph-%lf)", nsegcut, a, b));
377  pave->AddText(Form("%5d selected",nselected));
378  pave->AddText(Form("%5d rejected",nrejected));
379  pave->Draw();
380 
381 
382 }
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)
635  {
636 
637  printf("CheckSingleTrack : Make a plot for a track.\n");
638  // copy of EdbTrackP
639  EdbTrackP *t2 = new EdbTrackP;
640  t2->Copy(*t);
641  // first and last segment
642  EdbSegP *s1st = t->GetSegmentFirst();
643  EdbSegP *slast= t->GetSegmentLast();
644 
645  // make a better fit by connecting the first and last segment. 2014/7/9 Aki.
646  t2->Set(t2->ID(),
647  (s1st->X()+slast->X())/2,
648  (s1st->Y()+slast->Y())/2,
649  (s1st->X()-slast->X())/(s1st->Z()-slast->Z()),
650  (s1st->Y()-slast->Y())/(s1st->Z()-slast->Z()),
651  t2->W(), t2->Flag());
652  t2->SetZ((s1st->Z()+slast->Z())/2);
653 
654  // momentum
655  double p,pmin,pmax;
656  CalcP(t,p,pmin,pmax);
657  // trajectries
658  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");
659  double W[60];
660  for(int i=0;i<t->N();i++){
661  EdbSegP *s = t->GetSegment(i);
662  W[i] = s->W();
663  t2->PropagateTo(s->Z());
664  double dx = s->X()-t2->X();
665  double dy = s->Y()-t2->Y();
666 
667  nt->Fill(t->ID(),s->ID(),s->W(),s->Plate(), s->X(),s->Y(),s->Z(),s->TX(),s->TY(),dx,dy, s->Side());
668 
669  }
670  double Wmean = TMath::Mean(t->N(),W);
671  double Wrms = TMath::RMS(t->N(),W);
672 
673  // cosmic eff and PH calculation.
674  double wcr=0.0, effcr=0.0;
675  int wcrcnt=0, effcrcnt=0;
676 
678  EdbPVRec *pvr = set->GetPVRec();
679 
680  if(pvr!=NULL){
681  printf("Calculate the reference efficiency from TS (cosmic rays).");
682 
683  int plmax=0, plmin=1000;
684  for(int i=0;i<pvr->Npatterns();i++){
685  EdbPattern *pat = pvr->GetPattern(i);
686  if(pat==NULL) continue;
687  EdbSegP *s = pat->GetSegment(0);
688  if(s==NULL) continue;
689  if(s->Plate()<plmin) plmin=s->Plate();
690  if(s->Plate()>plmax) plmax=s->Plate();
691  }
692 
693  int trklencut = abs(plmax-plmin);
694  trklencut/=2;
695  trklencut= (int) (trklencut*(1-sqrt(t->TX()*t->TX()+t->TY()*t->TY())));
696  if(trklencut<8) trklencut=8;
697  if(trklencut>20) trklencut=20;
698  printf(" Track length cut for cosmic ray = %d, dtheta<%.3lfrad\n", trklencut,eDTReference);
699  for(int i=0;i<set->NBase();i++){
700  EdbTrackP *tc = set->GetTrackBase(i);
701  if(tc==NULL) continue;
702  // track length cut
703  int iplF = tc->GetSegmentFirst()->Plate();
704  int iplL = tc->GetSegmentLast()->Plate();
705  int trklen = iplL-iplF+1;
706  if(trklen<trklencut) continue;
707 
708  // angular cut
709  if( fabs(t->TX()-tc->TX())>eDTReference) continue;
710  if( fabs(t->TY()-tc->TY())>eDTReference) continue;
711 
712  // efficiency
713  printf(" %2d->%2d, %2d/%2d = %.2lf\n", iplF, iplL, tc->N()-2, trklen-2, (double) (tc->N()-2)/(trklen-2));
714  effcr += (double) (tc->N()-2)/(trklen-2);
715  effcrcnt++;
716 
717  // W
718  for(int j=0;j<tc->N();j++){
719  EdbSegP *s = tc->GetSegment(j);
720  wcr+=s->W();
721  wcrcnt++;
722  }
723 
724  }
725  wcr = wcrcnt==0 ? 0.0 : wcr/wcrcnt;
726  effcr = effcrcnt==0 ? 0.0 : effcr/effcrcnt;
727  }
728 
729  EdbTrackP *tsb = gEDA->CheckScanback(t);
730  int sbid = tsb?tsb->ID():-1;
731  int muonid = gEDA->IdMuon();
732 
733  CreateCanvas(Form("%d", t->ID()));
734 
735  TPaveText *pt = new TPaveText(0.05,0.87,0.9,0.98,"br");
736  pt->SetTextSize(0.03);
737  pt->SetTextAlign(12);
738  int trklen = abs(slast->Plate() - s1st->Plate())+1;
739 
740  pt->AddText(Form("trk %4d pl %2d -> %2d %8.1lf %8.1lf %8.1lf %7.4lf %7.4lf",
741  t->ID(), t->GetSegmentFirst()->Plate(),
742  t->GetSegmentLast()->Plate(),
743  t->X(),t->Y(),t->Z(),t->TX(),t->TY()));
744 
745  int nMT = 0;
746  for(int i=0;i<t->N();i++) if(t->GetSegment(i)->Side()!=0) nMT++;
747  pt->AddText(Form("length = %d, nseg = %d (n_{MT}=%d), eff = %.3lf, PHmean = %.1lf #pm %.1lf (CR %.3lf, %.1lf)",
748  trklen, t->N(), nMT,
749  t->N()==2?0.0: (double)(t->N()-2)/(trklen-2), Wmean, t->N()>1 ? Wrms/sqrt((double)(t->N()-1)) : Wrms, effcr, wcr));
750 
751 
752  pt->AddText(Form("P = %.2lf - %.2lf +%.2lf GeV/c (90%%CL)", p, pmin, pmax));
753  pt->Draw();
754 
755 
756  if(sbid>0){
757  TPaveText *pt = new TPaveText(0.82,0.87,0.95,0.98,"br");
758  pt->SetTextSize(0.035);
759  pt->SetTextAlign(12);
760  pt->AddText(Form("SBid = %d", sbid));
761  if(sbid==muonid) pt->AddText(Form("Muon"));
762  pt->Draw();
763  }
764 
765  TPad *c1_x = new TPad("c1_x", "Trajectories", 0.01,0.01,0.99,0.85);
766  c1_x->Draw();
767 
768  c1_x->cd();
769  //c1_x->Divide(3,3);
770  c1_x->Divide(3,2);
771 
772  nt->SetMarkerStyle(20);
773  nt->SetMarkerSize(0.4);
774 
775  int ic=1;
776 
777  c1_x->cd(ic++);
778  nt->Draw("eX:ipl");
779  nt->GetHistogram()->SetYTitle("X #mum");
780  nt->SetMarkerColor(kRed);
781  nt->Draw("eX:ipl","eSide==1", "same");
782  nt->SetMarkerColor(kBlue);
783  nt->Draw("eX:ipl","eSide==2", "same");
784  nt->SetMarkerColor(kBlack);
785 
786  TLine *l = new TLine();
787  t2->PropagateTo(s1st->Z());
788  double x1 = s1st->Plate();
789  double y1 = t2->X();
790  t2->PropagateTo(slast->Z());
791  double x2 = slast->Plate();
792  double y2 = t2->X();
793  l->DrawLine(x1,y1,x2,y2);
794 
795  c1_x->cd(ic++);
796  nt->Draw("dX:ipl");
797  nt->GetHistogram()->SetYTitle("dX #mum");
798  nt->SetMarkerColor(kRed);
799  nt->Draw("dX:ipl","eSide==1", "same");
800  nt->SetMarkerColor(kBlue);
801  nt->Draw("dX:ipl","eSide==2", "same");
802  nt->SetMarkerColor(kBlack);
803 
804  c1_x->cd(ic++);
805  nt->Draw("eTX:ipl");
806  nt->GetHistogram()->SetYTitle("TX rad");
807  nt->SetMarkerColor(kRed);
808  nt->Draw("eTX:ipl","eSide==1", "same");
809  nt->SetMarkerColor(kBlue);
810  nt->Draw("eTX:ipl","eSide==2", "same");
811  nt->SetMarkerColor(kBlack);
812 
813  c1_x->cd(ic++);
814  nt->Draw("eY:ipl");
815  nt->GetHistogram()->SetYTitle("Y #mum");
816  nt->SetMarkerColor(kRed);
817  nt->Draw("eY:ipl","eSide==1", "same");
818  nt->SetMarkerColor(kBlue);
819  nt->Draw("eY:ipl","eSide==2", "same");
820  nt->SetMarkerColor(kBlack);
821 
822 
823  t2->PropagateTo(s1st->Z());
824  x1 = s1st->Plate();
825  y1 = t2->Y();
826  t2->PropagateTo(slast->Z());
827  x2 = slast->Plate();
828  y2 = t2->Y();
829  l->DrawLine(x1,y1,x2,y2);
830 
831  c1_x->cd(ic++);
832  nt->Draw("dY:ipl");
833  nt->GetHistogram()->SetYTitle("dY #mum");
834  nt->SetMarkerColor(kRed);
835  nt->Draw("dY:ipl","eSide==1", "same");
836  nt->SetMarkerColor(kBlue);
837  nt->Draw("dY:ipl","eSide==2", "same");
838  nt->SetMarkerColor(kBlack);
839 
840  c1_x->cd(ic++);
841  nt->Draw("eTY:ipl");
842  nt->GetHistogram()->SetYTitle("TY rad");
843  nt->SetMarkerColor(kRed);
844  nt->Draw("eTY:ipl","eSide==1", "same");
845  nt->SetMarkerColor(kBlue);
846  nt->Draw("eTY:ipl","eSide==2", "same");
847  nt->SetMarkerColor(kBlack);
848  /*
849  c1_x->cd(ic++);
850 
851  nt->Draw("eW:ipl");
852  nt->GetHistogram()->SetYTitle("Pulse Height");
853 // nt->GetHistogram()->Fit("pol1");
854  nt->GetHistogram()->SetMinimum(0);
855  nt->GetHistogram()->SetMaximum(0);
856  nt->SetMarkerColor(kRed);
857  nt->Draw("eW:ipl","eSide==1", "same");
858  nt->SetMarkerColor(kBlue);
859  nt->Draw("eW:ipl","eSide==2", "same");
860  nt->SetMarkerColor(kBlack);
861  l->DrawLine(s1st->Plate(), wcr, slast->Plate(), wcr);
862  */
863 }
TPaveText * pt
Definition: Canv_SYSTEMATICS_ALLCOMBINED__RMSEnergy__vs__Energy__ELECTRON.C:160
int IdMuon(const char *filename="../cs_info.txt")
Definition: EdbEDA.C:1045
EdbTrackP * CheckScanback(EdbTrackP *t)
Definition: EdbEDA.h:730
Definition: EdbPVRec.h:148
void SetZ(float z)
Definition: EdbSegP.h:122
Int_t Side() const
Definition: EdbSegP.h:167
Float_t W() const
Definition: EdbSegP.h:148
Int_t Flag() const
Definition: EdbSegP.h:146
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:86
EdbSegP * GetSegmentFirst() const
Definition: EdbPattern.h:194
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:195
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:516
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:200
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 ( )
624  {
625  TObjArray *selected_tracks = gEDA->GetSelectedTracks();
626  if(selected_tracks->GetEntriesFast()==0) return;
627 
628  for(int i=0;i<selected_tracks->GetEntriesFast();i++){
629  EdbTrackP *t = (EdbTrackP *) selected_tracks->At(i);
630  if(t==NULL) continue;
632  }
633 }
void CheckSingleTrack(EdbTrackP *t)
Definition: EdbEDAPlotTab.C:635

◆ CreateCanvas()

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

◆ MomPlot()

void EdbEDAPlotTab::MomPlot ( )
1144  {
1145  TObjArray *selected_tracks = gEDA->GetSelectedTracks();
1146  if(selected_tracks->GetEntriesFast()==0) return;
1147 
1148  double angular_resolution = eMomAngleRes->GetNumber();
1149 // eTF.eDT0 = angular_resolution; // commented out for reason of incompability
1150 // eTF.eDTx0 = angular_resolution; // commented out for reason of incompability
1151 // eTF.eDTy0 = angular_resolution; // commented out for reason of incompability
1152 
1153  // To fix incompability, introduced in revision 1376 me provide a workaround here:
1154  // Only first parameter in function is changed, others stay as defined in
1155  // EdbMomentumEstimator.cxx
1156  for (Int_t i=0; i<3; ++i) eTF.SetParPMS_Mag(i,0,angular_resolution);
1157 
1158  for(int i=0;i<selected_tracks->GetEntriesFast();i++){
1159  EdbTrackP *t0 = (EdbTrackP *) selected_tracks->At(i);
1160  if(t0==NULL) continue;
1161  EdbTrackP *t=CleanTrack(t0);
1162 
1163  if(t->Npl()<t->N()){
1164  // in this case P estimation doesn't work.
1165  // this can happen if a track is formed from 2 different data set.
1166  // (PID definitions are defferent amond 2 data set.)
1167  // put absolute plate number as PID. (temporary solution)
1168  for(int i=0;i<t->N();i++) t->GetSegment(i)->SetPID(t->GetSegment(i)->Plate());
1169  }
1170 
1171  for(int i=0;i<t->N();i++) t->GetSegment(i)->SetPID(t->GetSegment(i)->Plate());
1172  t->SetCounters();
1173 
1174  if(t->N()<=2) continue;
1175  eTF.eMinEntr=3;
1176 
1177  printf("Track ID: %i ; TX=%1.4f , TY=%1.4f , Nb of BT= %i\n",t->ID(),t->TX(),t->TY(),t->N());
1178 
1179  eTF.PMS(*t);
1180 
1181  float averagex = 0;
1182  float averagey = 0;
1183  for(int i=0; i<t->N(); i++){
1184  averagex += t->GetSegment(i)->TX();
1185  averagey += t->GetSegment(i)->TY();
1186  }
1187  averagex /= t->N();
1188  averagey /= t->N();
1189 
1190  float slope = sqrt(averagex*averagex+averagey*averagey);
1191  printf("slope %f\n", slope);
1192  float p, pmin, pmax;
1193 
1194  if (slope<=0.2) // use P3D
1195  {
1196  printf(" PT =%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.ePy, eTF.ePYmin, eTF.ePYmax);
1197  printf(" ->P3D=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.eP, eTF.ePmin, eTF.ePmax);
1198  p=eTF.eP;
1199  pmin=eTF.ePmin;
1200  pmax=eTF.ePmax;
1201  }
1202  if (slope>0.2) // use PT
1203  {
1204  printf(" ->PT =%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.ePy, eTF.ePYmin, eTF.ePYmax);
1205  printf(" P3D=%7.2f GeV ; 90%%C.L. range = [%6.2f : %6.2f] \n", eTF.eP, eTF.ePmin, eTF.ePmax);
1206  p=eTF.ePy;
1207  pmin=eTF.ePYmin;
1208  pmax=eTF.ePYmax;
1209  }
1210  TCanvas *c1 = CreateCanvas(Form("P%d", t->ID()));
1211 
1212  eTF.DrawPlots(c1);
1213  }
1214 }
EdbMomentumEstimator eTF
Definition: EdbEDAPlotTab.h:18
float ePmax
Definition: EdbMomentumEstimator.h:43
void DrawPlots(TCanvas *c1=NULL)
Definition: EdbMomentumEstimator.cxx:724
float eP
Definition: EdbMomentumEstimator.h:42
void SetParPMS_Mag()
Definition: EdbMomentumEstimator.cxx:73
int eMinEntr
Definition: EdbMomentumEstimator.h:27
float ePy
Definition: EdbMomentumEstimator.h:35
float ePmin
Definition: EdbMomentumEstimator.h:43
float ePYmax
Definition: EdbMomentumEstimator.h:39
float ePYmin
Definition: EdbMomentumEstimator.h:39
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 ( )
1134  {
1136  "Set Momentum methos.\n"
1137  "0 = Angular method (default)\n"
1138  "3 = Coordinate method\n"
1139  , eTF.eAlg);
1140 
1141  eTF.eAlg = alg;
1142 }
int eAlg
Definition: EdbMomentumEstimator.h:24
int InputNumberInteger(const 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

◆ 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: