FEDRA emulsion software from the OPERA Collaboration
EdbEDATrackSelection Class Reference

#include <EdbEDATrackSet.h>

Inheritance diagram for EdbEDATrackSelection:
Collaboration diagram for EdbEDATrackSelection:

Public Member Functions

void DoSelection (TObjArray *tracksbase, TObjArray *tracks)
 
 EdbEDATrackSelection ()
 
bool GetImpactSearch ()
 
int GetNsegCut ()
 
double GetPHCut ()
 
double GetPHDTRMS ()
 
EdbRunTrackingGetRunTracking ()
 
int GetSideOutPlate ()
 
int GetUpstreamPlate ()
 
int ImpactSearch (EdbTrackP *t)
 
int Neighborhood (EdbSegP *s, double *dmin=NULL)
 
void Reset ()
 
void SetAngle (double tx, double ty)
 
void SetAngularCut (bool b=kTRUE)
 
void SetClearPrevious (bool b=kTRUE)
 
void SetCondBTDefault (EdbScanCond &cond)
 
void SetCondMTDefault (EdbScanCond &cond)
 
void SetCondTrackingDefault ()
 
void SetDT (double dtx, double dty=-1)
 
void SetDX (double dx)
 
void SetImpactSearch (bool b=kTRUE, EdbVertex *v=NULL)
 
void SetNeighborSearch (bool b=kTRUE, TObjArray *selected=NULL, double dzup=-1, double dzdown=-1)
 
void SetNsegCut (int nseg)
 
void SetPHCut (double phcut=0.0)
 
void SetPHDTRMS (double slope)
 
void SetRunTracking (EdbRunTracking &rt)
 
void SetSideOut (bool b=kTRUE)
 
void SetSideOutPlate (int npl)
 
void SetUpstreamPlate (int ipl)
 
int SideOut (EdbTrackP *t)
 
virtual ~EdbEDATrackSelection ()
 

Public Attributes

EdbRunTracking eRunTracking
 
EdbVertexeVertex
 

Private Attributes

int eAngularCut
 
int eClearPrevious
 
int eImpactSearch
 
double eNeighborDzDown
 
double eNeighborDzUp
 
int eNeighborSearch
 
int eNsegCut
 
double ePHCut
 
double ePHDTRMS
 
int ePlateDown
 
int ePlateUp
 
TObjArray * eSelected
 
int eSideOut
 
int eSideOutPlate
 
double eTolDTX
 
double eTolDTY
 
double eTolDX
 
double eTX
 
double eTY
 

Constructor & Destructor Documentation

◆ EdbEDATrackSelection()

EdbEDATrackSelection::EdbEDATrackSelection ( )
inline
64 { Reset(); }
void Reset()
Definition: EdbEDATrackSet.h:67

◆ ~EdbEDATrackSelection()

virtual EdbEDATrackSelection::~EdbEDATrackSelection ( )
inlinevirtual
65 {}

Member Function Documentation

◆ DoSelection()

void EdbEDATrackSelection::DoSelection ( TObjArray *  tracksbase,
TObjArray *  tracks 
)
126  {
127  if(tracksbase==NULL||tracks==NULL) return;
128  if(eClearPrevious) tracks->Clear();
129 
130  if(eImpactSearch&&eVertex==NULL){
132  if(eVertex==NULL) {
133  eImpactSearch=0;
134  printf("please select a vertex.\n");
135  }
136  }
137 
138  printf("applying cuts, Nseg %d, PlateUp = %d \n",eNsegCut, ePlateUp);
139  if( eSelected==NULL ) eNeighborSearch = 0;
140  if( eNeighborSearch ){
141  printf( "Neighbor search On. tolerance : dTX = %.3lf rad, dTY = %.3lf rad, dmin = %.0lf micron\n",eTolDTX,eTolDTY, eTolDX);
142  }
143  if( eAngularCut ){
144  printf( "Angular cut On. tolerance : dTX = %.3lf rad, dTY = %.3lf rad\n", eTolDTX, eTolDTY);
145  }
146  if( eImpactSearch ){
147  printf( "Impact cut On. tolerance : IP < %.0lf micron\n", eTolDX);
148  }
149 
150  if( eSideOut ){
151  printf( "Penetration and Side-Out rejection : require %d scanning area upstream\n", eSideOutPlate);
152  }
153  int nentr = tracksbase->GetEntriesFast();
154  for(int i=0;i<nentr;i++){
155  if(i%1000==0) printf("%d / %d. %d tracks\r", i, tracksbase->GetEntriesFast(), tracks->GetEntriesFast());
156  EdbTrackP *t = (EdbTrackP *) tracksbase->At(i);
157  if(NULL==t) continue;
158  // Selections
159 
160  // Nseg cut
161  if( t->N() < eNsegCut) continue;
162 
163  // Max plate cut
164  int ipl_first = t->GetSegmentFirst()->Plate();
165 
166  if( ipl_first < ePlateUp) continue;
167 
168  // Reject Side-out tracks
169  if( eSideOut ){
170  if( SideOut(t) ) continue;
171  }
172 
173  // Neighbor Search. use eTolDX, eTolDT
174  if( eNeighborSearch) {
175  if( Neighborhood(t) == 0 ) continue;
176  }
177 
178  // Impact Search. use eTolDX
179  if( eImpactSearch ){
180  if( ImpactSearch (t) == 0 ) continue;
181  }
182 
183  // Angular Cut
184  if( eAngularCut ){
185  if( fabs(t->TX() - eTX) > eTolDTX) continue;
186  if( fabs(t->TY() - eTY) > eTolDTY) continue;
187  }
188 
189  // PH Cut
190  double ph = t->Wgrains()/t->N();
191  if(ePHCut > ph ) continue;
192 
193  // PH - Angle deviation cut
194  double dtrms = DTRMS(t);
195  if(dtrms> ePHDTRMS*(ph-ePHCut)) continue;
196 
197  if(tracks->FindObject(t)==NULL) tracks->AddLast(t);
198  }
199  printf("%d tracks out of %d tracks\n", tracks->GetEntriesFast(), tracksbase->GetEntriesFast());
200 }
EdbEDA * gEDA
Definition: EdbEDA.C:3
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
TTree * t
Definition: check_shower.C:4
EdbVertex * GetSelectedVertex(void)
Definition: EdbEDA.h:439
double eTY
Definition: EdbEDATrackSet.h:50
int SideOut(EdbTrackP *t)
Definition: EdbEDATrackSet.C:48
int eNeighborSearch
Definition: EdbEDATrackSet.h:41
TObjArray * eSelected
Definition: EdbEDATrackSet.h:57
double ePHCut
Definition: EdbEDATrackSet.h:53
int ImpactSearch(EdbTrackP *t)
double eTolDX
Definition: EdbEDATrackSet.h:46
int eImpactSearch
Definition: EdbEDATrackSet.h:42
int ePlateUp
Definition: EdbEDATrackSet.h:39
double eTolDTY
Definition: EdbEDATrackSet.h:48
int eAngularCut
Definition: EdbEDATrackSet.h:43
int eClearPrevious
Definition: EdbEDATrackSet.h:52
int eNsegCut
Definition: EdbEDATrackSet.h:38
int eSideOut
Definition: EdbEDATrackSet.h:44
double ePHDTRMS
Definition: EdbEDATrackSet.h:54
EdbVertex * eVertex
Definition: EdbEDATrackSet.h:61
double eTolDTX
Definition: EdbEDATrackSet.h:47
int eSideOutPlate
Definition: EdbEDATrackSet.h:45
int Neighborhood(EdbSegP *s, double *dmin=NULL)
Definition: EdbEDATrackSet.C:20
double eTX
Definition: EdbEDATrackSet.h:49
Definition: EdbPattern.h:118
TTree * tracks
Definition: check_tr.C:19
double DTRMS(EdbTrackP *t)
Definition: EdbEDAUtil.C:431
#define NULL
Definition: nidaqmx.h:84

◆ GetImpactSearch()

bool EdbEDATrackSelection::GetImpactSearch ( )
inline
109 { return eImpactSearch;}

◆ GetNsegCut()

int EdbEDATrackSelection::GetNsegCut ( )
inline
114 { return eNsegCut;}

◆ GetPHCut()

double EdbEDATrackSelection::GetPHCut ( )
inline
115 { return ePHCut;}

◆ GetPHDTRMS()

double EdbEDATrackSelection::GetPHDTRMS ( )
inline
116 { return ePHDTRMS;}

◆ GetRunTracking()

EdbRunTracking& EdbEDATrackSelection::GetRunTracking ( )
inline
122 { return eRunTracking;}
EdbRunTracking eRunTracking
Definition: EdbEDATrackSet.h:62

◆ GetSideOutPlate()

int EdbEDATrackSelection::GetSideOutPlate ( )
inline
117 { return eSideOutPlate;}

◆ GetUpstreamPlate()

int EdbEDATrackSelection::GetUpstreamPlate ( )
inline
113 { return ePlateUp;}

◆ ImpactSearch()

int EdbEDATrackSelection::ImpactSearch ( EdbTrackP t)

◆ Neighborhood()

int EdbEDATrackSelection::Neighborhood ( EdbSegP s,
double *  dmin = NULL 
)
20  {
21  int flag=0;
22  double dminz;
23  if(dmin) *dmin=1e5;
24  for(int i=0;i<eSelected->GetEntriesFast();i++){
25  EdbSegP *ss = (EdbSegP *)eSelected->At(i);
26  if(ss==s) return 1;
27 
28  if( fabs(s->TX()-ss->TX()) > eTolDTX) continue; // angular cut
29  if( fabs(s->TY()-ss->TY()) > eTolDTY) continue;
30 
31  double d = CalcDmin( ss, s, &dminz);
32  if(dmin) if(*dmin>d) *dmin=d;
33 // if(d<10) printf("%lf %lf %lf %lf\n", d, dminz, eNeighborDzDown, eNeighborDzUp);
34 
35  if( d > eTolDX) continue;
36 
37  if( -eNeighborDzDown<dminz&&dminz<eNeighborDzUp) flag++;
38  else if(dminz<-eNeighborDzDown){
39  if( CalcDistance(ss, s, ss->Z()+eNeighborDzDown)<eTolDX) flag++;
40  }
41  else if(eNeighborDzUp<dminz){
42  if( CalcDistance(ss, s, ss->Z()-eNeighborDzUp)<eTolDX) flag++;
43  }
44  }
45  return flag;
46 }
void d()
Definition: RecDispEX.C:381
double eNeighborDzDown
Definition: EdbEDATrackSet.h:56
double eNeighborDzUp
Definition: EdbEDATrackSet.h:55
Definition: EdbSegP.h:18
Float_t TX() const
Definition: EdbSegP.h:172
Float_t TY() const
Definition: EdbSegP.h:173
ss
Definition: energy.C:62
double CalcDistance(EdbSegP *s1, EdbSegP *s2, double z)
Definition: EdbEDAUtil.C:422
double CalcDmin(EdbSegP *seg1, EdbSegP *seg2, double *dminz=NULL)
Definition: EdbEDAUtil.C:239
EdbSegP * s
Definition: tlg2pattern.C:32

◆ Reset()

void EdbEDATrackSelection::Reset ( )
inline
67  {
68  eNsegCut = 3;
69  ePlateUp = 0;
70  ePlateDown = 0;
71  eNeighborSearch = 0;
72  eImpactSearch = 0;
73  eAngularCut = 0;
74  eSideOut = 0;
75  eSideOutPlate = 3;
76  eTolDX = 200.;
77  eTolDTX = 2.0;
78  eTolDTY = 2.0;
79  eTX = 0.0;
80  eTY = 0.0;
81  eClearPrevious = 1;
82  ePHCut = 0.0;
83  ePHDTRMS = 0.05;
84  eNeighborDzUp = 5000.;
85  eNeighborDzDown = 5000.;
86  eVertex = NULL;
87  eSelected = NULL;
90  }
int ePlateDown
Definition: EdbEDATrackSet.h:40
void SetCondTrackingDefault()
Definition: EdbEDATrackSet.h:124
bool ePredictionScan
Definition: EdbRunTracking.h:61

◆ SetAngle()

void EdbEDATrackSelection::SetAngle ( double  tx,
double  ty 
)
inline
105 { eTX=tx; eTY=ty;}

◆ SetAngularCut()

void EdbEDATrackSelection::SetAngularCut ( bool  b = kTRUE)
inline
102 { eAngularCut = b;}

◆ SetClearPrevious()

void EdbEDATrackSelection::SetClearPrevious ( bool  b = kTRUE)
inline
106 { eClearPrevious = b;}

◆ SetCondBTDefault()

void EdbEDATrackSelection::SetCondBTDefault ( EdbScanCond cond)
inline
159  {
160  cond.SetSigma0( 10., 10., 0.007, 0.007 ); // sigma0 "x, y, tx, ty" at zero angle
161  cond.SetDegrad( 2. ); // sigma(tx) = sigma0*(1+degrad*tx)
162  cond.SetBins(0, 0, 0, 0); // bins in [sigma] for checks
163  cond.SetPulsRamp0( 5., 5. ); // in range (Pmin:Pmax) Signal/All is nearly linear
164  cond.SetPulsRamp04( 5., 5. );
165  cond.SetChi2Max( 6.5 );
166  cond.SetChi2PMax( 6.5 );
167  cond.SetRadX0( 5810. );
168  cond.SetName("OPERA_basetrack");
169  }
void SetPulsRamp0(float p1, float p2)
Definition: EdbScanCond.h:74
void SetChi2Max(float chi2)
Definition: EdbScanCond.h:83
void SetDegrad(float d)
Definition: EdbScanCond.h:71
void SetSigma0(float x, float y, float tx, float ty)
Definition: EdbScanCond.h:62
void SetBins(float bx, float by, float btx, float bty)
Definition: EdbScanCond.h:65
void SetPulsRamp04(float p1, float p2)
Definition: EdbScanCond.h:75
void SetRadX0(float x0)
Definition: EdbScanCond.h:57
void SetChi2PMax(float chi2)
Definition: EdbScanCond.h:84

◆ SetCondMTDefault()

void EdbEDATrackSelection::SetCondMTDefault ( EdbScanCond cond)
inline
147  {
148  cond.SetSigma0( 1., 1., 0.010, 0.010 ); // sigma0 "x, y, tx, ty" at zero angle
149  cond.SetDegrad( 5. ); // sigma(tx) = sigma0*(1+degrad*tx)
150  cond.SetBins(0, 0, 0, 0); //??? // bins in [sigma] for checks
151  cond.SetPulsRamp0( 5., 5. ); // in range (Pmin:Pmax) Signal/All is nearly linear
152  cond.SetPulsRamp04( 5., 5. );
153  cond.SetChi2Max( 6.5 );
154  cond.SetChi2PMax( 6.5 );
155  cond.SetRadX0( 5810. );
156  cond.SetName("OPERA_microtrack");
157  }

◆ SetCondTrackingDefault()

void EdbEDATrackSelection::SetCondTrackingDefault ( )
inline
124  {
125  eRunTracking.eDeltaRview = 400.;
127  eRunTracking.eDeltaR = 20.;
128 
131 
134  eRunTracking.eChi2MaxMT = 1.6;
135 
138  eRunTracking.eChi2MaxBT = 1.8;
139 
141  eRunTracking.eDegradSlope = 0.003;
142 
145  }
void SetCondBTDefault(EdbScanCond &cond)
Definition: EdbEDATrackSet.h:159
void SetCondMTDefault(EdbScanCond &cond)
Definition: EdbEDATrackSet.h:147
Float_t ePulsMinDegradBT
Definition: EdbRunTracking.h:44
Float_t ePulsMinBT
Definition: EdbRunTracking.h:37
Float_t eDeltaR
Definition: EdbRunTracking.h:33
EdbScanCond eCondMT
Definition: EdbRunTracking.h:22
Float_t ePreliminaryPulsMinMT
Definition: EdbRunTracking.h:27
Float_t eChi2MaxMT
Definition: EdbRunTracking.h:45
Float_t eDeltaRview
Definition: EdbRunTracking.h:25
Float_t ePreliminaryChi2MaxMT
Definition: EdbRunTracking.h:28
Float_t ePulsMinMT
Definition: EdbRunTracking.h:43
Float_t eDegradSlope
Definition: EdbRunTracking.h:56
EdbScanCond eCondBT
Definition: EdbRunTracking.h:23
Float_t eChi2MaxBT
Definition: EdbRunTracking.h:39
Float_t eDegradPos
Definition: EdbRunTracking.h:55
Float_t ePulsMinDegradMT
Definition: EdbRunTracking.h:38
Float_t eDeltaTheta
Definition: EdbRunTracking.h:26

◆ SetDT()

void EdbEDATrackSelection::SetDT ( double  dtx,
double  dty = -1 
)
inline
104 { eTolDTX=dtx; eTolDTY=dty; if(eTolDTY<0) eTolDTY=eTolDTX;}

◆ SetDX()

void EdbEDATrackSelection::SetDX ( double  dx)
inline
103 { eTolDX=dx;}

◆ SetImpactSearch()

void EdbEDATrackSelection::SetImpactSearch ( bool  b = kTRUE,
EdbVertex v = NULL 
)
inline
94 { eImpactSearch = b; eVertex = v;}

◆ SetNeighborSearch()

void EdbEDATrackSelection::SetNeighborSearch ( bool  b = kTRUE,
TObjArray *  selected = NULL,
double  dzup = -1,
double  dzdown = -1 
)
inline
95  {
96  eNeighborSearch = b; eSelected=selected;
97  if(dzup>=0) eNeighborDzUp = dzup;
98  if(dzdown>=0) eNeighborDzDown = dzdown;
99  }

◆ SetNsegCut()

void EdbEDATrackSelection::SetNsegCut ( int  nseg)
inline
91 { eNsegCut = nseg;}

◆ SetPHCut()

void EdbEDATrackSelection::SetPHCut ( double  phcut = 0.0)
inline
107 { ePHCut=phcut;}

◆ SetPHDTRMS()

void EdbEDATrackSelection::SetPHDTRMS ( double  slope)
inline
108 {ePHDTRMS=slope;}

◆ SetRunTracking()

void EdbEDATrackSelection::SetRunTracking ( EdbRunTracking rt)
inline
121 {eRunTracking=rt;}

◆ SetSideOut()

void EdbEDATrackSelection::SetSideOut ( bool  b = kTRUE)
inline
100 { eSideOut = b;}

◆ SetSideOutPlate()

void EdbEDATrackSelection::SetSideOutPlate ( int  npl)
inline
101 { eSideOutPlate = npl;}

◆ SetUpstreamPlate()

void EdbEDATrackSelection::SetUpstreamPlate ( int  ipl)
inline
92 { ePlateUp = ipl;}

◆ SideOut()

int EdbEDATrackSelection::SideOut ( EdbTrackP t)
48  {
49  // Return 1, if the track goes side-out.
50  // - if require 3 scanning area upstream from the 1st segment.
51  //EdbPVRec *pvr = gEDA->GetPVR();
52  //if(pvr==NULL) return 0;
53 
54  int sideout=0;
55 
56  // Upstream Side-out check.
57  int npl = 0;
58  EdbSegP *s1 = t->GetSegmentFirst();
59  EdbSegP s=*s1;
60 
61  // original. but very slow. EdbPointsBox2D::Xmax().....
62  /*
63  for(int pid=s1->PID()-1; pid>=0; pid--){
64  EdbPattern *p = pvr->GetPattern(pid);
65  if(p->N()==0) continue;
66  s.PropagateTo(p->Z());
67  if(s.X()<p->Xmin()) continue;
68  if(s.X()>p->Xmax()) continue;
69  if(s.Y()<p->Ymin()) continue;
70  if(s.Y()>p->Ymax()) continue;
71 
72  npl++;
73  }
74  */
75  /*
76  for(int pid=s1->PID()-1; pid>=0; pid--){
77  EdbEDAArea *a = gEDA->GetAreaSet()->GetArea(pid);
78  s.PropagateTo(a->Z());
79  if(s.X()<a->Xmin()) continue;
80  if(s.X()>a->Xmax()) continue;
81  if(s.Y()<a->Ymin()) continue;
82  if(s.Y()>a->Ymax()) continue;
83 
84  npl++;
85  }
86  */
87  for(int ipl=s1->Plate()-1; ipl>0; ipl--){
88  EdbEDAArea *a = gEDA->GetTrackSet("TS")->GetAreaSet()->GetAreaIPL(ipl);
89  if(a==NULL) continue;
90  s.PropagateTo(a->Z());
91  if(s.X()<a->Xmin()) continue;
92  if(s.X()>a->Xmax()) continue;
93  if(s.Y()<a->Ymin()) continue;
94  if(s.Y()>a->Ymax()) continue;
95 
96  npl++;
97  }
98 
99 
100  if(npl<eSideOutPlate) sideout++;
101  /*
102  // Downstream Side-out check.
103  // - if 0 or only 1 scanning area downstream from the last segment. if the propagated position is in the scanning area of the last plate, eceptionally doesn't cut the track.
104 
105  npl = 0;
106  s1 = t->GetSegmentLast();
107  s=*s1;
108  if(s1->PID()==pvr->Npatterns()-1) npl=2;
109  for(int pid=s1->PID()+1; pid<pvr->Npatterns(); pid++){
110  EdbPattern *p = pvr->GetPattern(pid);
111  if(p->N()==0) continue;
112  s.PropagateTo(p->Z());
113  if(s.X()<p->Xmin()) continue;
114  if(s.X()>p->Xmax()) continue;
115  if(s.Y()<p->Ymin()) continue;
116  if(s.Y()>p->Ymax()) continue;
117 
118  npl++;
119  if(pid==pvr->Npatterns()-1) npl++; // if the propagated position is in the scanning area of last plate, eceptionally doesn't cut the track.
120  }
121  if(npl<=1) sideout++;
122  */
123  return sideout;
124 }
void a()
Definition: check_aligned.C:59
EdbEDAArea * GetAreaIPL(int ipl)
Definition: EdbEDASets.h:135
Definition: EdbEDASets.h:7
EdbEDAAreaSet * GetAreaSet()
Definition: EdbEDATrackSet.h:602
EdbEDATrackSet * GetTrackSet(int i)
Definition: EdbEDA.h:617
void PropagateTo(float z)
Definition: EdbSegP.cxx:292
Float_t X() const
Definition: EdbSegP.h:170
Int_t Plate() const
Definition: EdbSegP.h:156
Float_t Y() const
Definition: EdbSegP.h:171
EdbSegP * s1
Definition: tlg2pattern.C:30

Member Data Documentation

◆ eAngularCut

int EdbEDATrackSelection::eAngularCut
private

◆ eClearPrevious

int EdbEDATrackSelection::eClearPrevious
private

◆ eImpactSearch

int EdbEDATrackSelection::eImpactSearch
private

◆ eNeighborDzDown

double EdbEDATrackSelection::eNeighborDzDown
private

◆ eNeighborDzUp

double EdbEDATrackSelection::eNeighborDzUp
private

◆ eNeighborSearch

int EdbEDATrackSelection::eNeighborSearch
private

◆ eNsegCut

int EdbEDATrackSelection::eNsegCut
private

◆ ePHCut

double EdbEDATrackSelection::ePHCut
private

◆ ePHDTRMS

double EdbEDATrackSelection::ePHDTRMS
private

◆ ePlateDown

int EdbEDATrackSelection::ePlateDown
private

◆ ePlateUp

int EdbEDATrackSelection::ePlateUp
private

◆ eRunTracking

EdbRunTracking EdbEDATrackSelection::eRunTracking

◆ eSelected

TObjArray* EdbEDATrackSelection::eSelected
private

◆ eSideOut

int EdbEDATrackSelection::eSideOut
private

◆ eSideOutPlate

int EdbEDATrackSelection::eSideOutPlate
private

◆ eTolDTX

double EdbEDATrackSelection::eTolDTX
private

◆ eTolDTY

double EdbEDATrackSelection::eTolDTY
private

◆ eTolDX

double EdbEDATrackSelection::eTolDX
private

◆ eTX

double EdbEDATrackSelection::eTX
private

◆ eTY

double EdbEDATrackSelection::eTY
private

◆ eVertex

EdbVertex* EdbEDATrackSelection::eVertex

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