FEDRA emulsion software from the OPERA Collaboration
EdbDecaySearch Class Reference

#include <EdbDecaySearch.h>

Inheritance diagram for EdbDecaySearch:
Collaboration diagram for EdbDecaySearch:

Public Types

enum  { kParentSearch =0x01 , kBaseTrackSearch =0x02 , kDaughterSearch =0x04 }
 

Public Member Functions

TObjArray * CheckInTrackKink (EdbTrackP *trk)
 
TObjArray * CheckInTrackKinks (TObjArray *tracks=NULL)
 
TObjArray * DoSearch ()
 
 EdbDecaySearch (int DSversion=2)
 
EdbVertexFindPrimaryVertex ()
 
EdbTrackDSFindTrack (EdbTrackP *t)
 
TObjArray * FindUpstreamVertices ()
 
EdbDecayVertexGetDecayVertex (int i)
 
float GetIPCut (EdbVertex *v, EdbSegP *s)
 
TObjArray * GetKinks (void)
 
EdbVertexGetPrimaryVertex ()
 
EdbPVRecGetPVR ()
 
EdbTrackDSGetTrack (int i)
 
double GetTSDauIP1 (double dz)
 
double GetTSDauIP2 (double dz)
 
void KinkSearch ()
 
EdbVertexMakeFakeVertex (EdbTrackP *t, double dz=1150)
 
void MTSearch2seg (TObjArray *tracks)
 
void MTSearchAll (TObjArray *tracks)
 
int NDecayVertices ()
 
int Ntracks ()
 
void PrintTracks ()
 
void SetBTSearch (int do_search=1, int npl_up=0, int npl_down=2, float ipcut=20, float phcut=17)
 
void SetIPHist1 (TH1F *h)
 
void SetIPHist2 (TH1F *h)
 
void SetKinkSearch (int do_search)
 
void SetParentSearch (int do_search=1, int npl=2, float ipcut=20, float phcut=17)
 
void SetPVR (EdbPVRec *pvr)
 
void SetShortDecaySearch (int do_search)
 
void SetSmallKinkSearch (int do_search=1, int npl_down=5, float Rmin=5.)
 
void SetTracks (TObjArray *array)
 
void SetVertex (EdbVertex *v)
 
void ShortDecaySearch ()
 
void SmallKinkSearch ()
 
TObjArray * TSBaseTracks (int ipl)
 
TObjArray * TSDaughterTracks (TObjArray *base)
 
void TSDaughterTracks2 ()
 
TObjArray * TSParentTracks (TObjArray *base)
 
virtual ~EdbDecaySearch ()
 

Public Attributes

int eBT
 
double eBTIP
 
double eBTPH
 
int eBTPlateDown
 
int eBTPlateUp
 
TObjArray * eDecayVertices
 
int eDSVer
 
TObjArray * eKinks
 
int eKinkSearch
 
double eKinkSigma
 
int eMT2seg
 
int eMTAll
 
EdbPVRecePVR
 
TObjArray * eSegments
 
int eShortDecay
 
int eSmallKink
 
int eSmallKinkNpl
 
float eSmallKinkRmin
 
TObjArray * eTracks
 
int eTSDau
 
int eTSDau2
 
TH1F * eTSDauIPHist1
 
TH1F * eTSDauIPHist2
 
int eTSDauNseg
 
int eTSDauNseg2
 
double eTSDauPH
 
int eTSPar
 
double eTSParIP
 
int eTSParNseg
 
double eTSParPH
 
int eTSParPlate
 
EdbVertexeVertex
 
int eVertexPlatePID
 
TObjArray * eVertices
 
int eVtxUp
 
int eVtxUpDZ
 
int eVtxUpIP
 

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
kParentSearch 
kBaseTrackSearch 
kDaughterSearch 
209  {
210  kParentSearch =0x01,
211  kBaseTrackSearch =0x02,
212  kDaughterSearch =0x04
213  };
@ kBaseTrackSearch
Definition: EdbDecaySearch.h:211
@ kDaughterSearch
Definition: EdbDecaySearch.h:212
@ kParentSearch
Definition: EdbDecaySearch.h:210

Constructor & Destructor Documentation

◆ EdbDecaySearch()

EdbDecaySearch::EdbDecaySearch ( int  DSversion = 2)
inline
272  :
273  eDSVer (DSversion),
274  eVertex (NULL),
275  eTracks (new TObjArray),
276  eSegments (new TObjArray),
277  eVertices (new TObjArray),
278  //eSet (NULL),
279 
280  eTSDau (1),
281  eTSDauNseg (2),
282  eTSDauPH (17),
283 
284  eMT2seg (0),
285  eMTAll (1),
286 
287  eTSDau2 (1),
288  eTSDauNseg2 (3),
289 
290  eSmallKink (1),
291  eSmallKinkNpl (5),
292  eSmallKinkRmin(5.),
293 
294  eTSPar (1),
295  eTSParPlate(2),
296  eTSParNseg (1),
297  eTSParIP (20),
298  eTSParPH (17),
299 
300  eBT (1),
301  eBTPlateUp (0),
302  eBTPlateDown (2),
303  eBTIP (20),
304  eBTPH (17),
305 
306  eVtxUp (0),
307  eVtxUpDZ (3000),
308  eVtxUpIP (500),
309 
310  eKinkSearch(1),
311  eKinkSigma(3.),
312  eKinks (new TObjArray),
313 
314  eShortDecay(1),
315 
316 
317  eDecayVertices(new TObjArray)
318 
319  {
320 
321  float ipcutdau_lt_1 = eDSVer==1 ? 500 : 300;
322  float ipcutdau_gt_1 = eDSVer==1 ? 800 : 500;
323 
324  if(gDirectory->Get("eTSDauIPHist1")) gDirectory->Delete("eTSDauIPHist1");
325  eTSDauIPHist1 = new TH1F ("eTSDauIPHist1","IP cut function along dZ, 1st.", 121, -100, 12000);
326  // Fill function
327  TH1F *h = eTSDauIPHist1;
328  h->SetFillColor(kBlue);
329  h->SetXTitle("dZ (#mum)");
330  h->SetYTitle("IP cut (#mum)");
331  for(int i=1;i<=100;i++){
332  if(0<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<1000) h->SetBinContent(i, ipcutdau_lt_1);
333  else if(1000<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<11700) h->SetBinContent(i, ipcutdau_gt_1);
334  else if(11700<=h->GetBinLowEdge(i)) h->SetBinContent(i,0);
335  }
336  if(gDirectory->Get("eTSDauIPHist1")) gDirectory->Delete("eTSDauIPHist2");
337  eTSDauIPHist2 = new TH1F ("eTSDauIPHist2","IP cut function along dZ, 2nd", 121, -100, 12000);
338  // Fill function
339  h = eTSDauIPHist2;
340  h->SetFillColor(kBlue);
341  h->SetXTitle("dZ (#mum)");
342  h->SetYTitle("IP cut (#mum)");
343  for(int i=1;i<=100;i++){
344  if(0<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<1000) h->SetBinContent(i, ipcutdau_lt_1);
345  else if(1000<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<6000) h->SetBinContent(i, ipcutdau_gt_1);
346  else if(6000<=h->GetBinLowEdge(i)) h->SetBinContent(i,0);
347  }
348  }
double eTSParIP
Definition: EdbDecaySearch.h:247
TH1F * eTSDauIPHist2
Definition: EdbDecaySearch.h:237
int eBTPlateDown
Definition: EdbDecaySearch.h:253
int eMT2seg
Definition: EdbDecaySearch.h:232
int eSmallKink
Definition: EdbDecaySearch.h:239
int eTSParPlate
Definition: EdbDecaySearch.h:245
int eBTPlateUp
Definition: EdbDecaySearch.h:252
int eVtxUpIP
Definition: EdbDecaySearch.h:259
int eTSDau
Definition: EdbDecaySearch.h:227
double eKinkSigma
Definition: EdbDecaySearch.h:264
int eVtxUpDZ
Definition: EdbDecaySearch.h:258
int eTSPar
Definition: EdbDecaySearch.h:244
TObjArray * eVertices
Definition: EdbDecaySearch.h:223
int eTSDauNseg
Definition: EdbDecaySearch.h:228
TObjArray * eSegments
Definition: EdbDecaySearch.h:222
TObjArray * eTracks
Definition: EdbDecaySearch.h:221
int eSmallKinkNpl
Definition: EdbDecaySearch.h:240
TObjArray * eKinks
Definition: EdbDecaySearch.h:265
int eVtxUp
Definition: EdbDecaySearch.h:257
int eKinkSearch
Definition: EdbDecaySearch.h:263
double eTSDauPH
Definition: EdbDecaySearch.h:229
int eTSDau2
Definition: EdbDecaySearch.h:235
int eMTAll
Definition: EdbDecaySearch.h:233
double eBTPH
Definition: EdbDecaySearch.h:255
double eTSParPH
Definition: EdbDecaySearch.h:248
int eDSVer
Definition: EdbDecaySearch.h:215
int eTSParNseg
Definition: EdbDecaySearch.h:246
int eShortDecay
Definition: EdbDecaySearch.h:269
double eBTIP
Definition: EdbDecaySearch.h:254
EdbVertex * eVertex
Definition: EdbDecaySearch.h:217
TH1F * eTSDauIPHist1
Definition: EdbDecaySearch.h:230
float eSmallKinkRmin
Definition: EdbDecaySearch.h:241
int eBT
Definition: EdbDecaySearch.h:251
TObjArray * eDecayVertices
Definition: EdbDecaySearch.h:266
int eTSDauNseg2
Definition: EdbDecaySearch.h:236
#define NULL
Definition: nidaqmx.h:84

◆ ~EdbDecaySearch()

virtual EdbDecaySearch::~EdbDecaySearch ( )
inlinevirtual
349 {}

Member Function Documentation

◆ CheckInTrackKink()

TObjArray * EdbDecaySearch::CheckInTrackKink ( EdbTrackP trk)
153  {
154  // Search kink. return TObjArray of EdbSmallKink
155 
156  if(trk->N()<2) {
157  printf("Track %d nseg=%d, too short for kink search\n", trk->ID(), trk->N());
158  return NULL;
159  }
160  EdbTrackP *t = CleanTrack(trk); // Remove fake segment/microtracks.
161 
162  double rms,rmst,rmsl;
163  DTRMSTL1Kink(t, &rms, &rmst, &rmsl); // DTRMS for each projection.
164 
165  if(t->N()<=2) {
166  printf("Track %d nseg=%d. too short to calculate delta-theta rms. use 2.0mrad.\n", t->ID(), t->N());
167  rms=rmst=rmsl=2.0;
168  }
169 
170  TObjArray *kinks = new TObjArray;
171 
172  int vtxpl;
173  //if(gEDA) vtxpl=gEDA->GetIPLZ(eVertex->Z());
174  //else {
175  vtxpl=0; // TODO
176  printf("VERTEX plate is not set!!!!! \n");
177  //}
178 
179  for(int i=0; i<ePVR->Npatterns(); i++){
180  EdbPattern *pat = ePVR->GetPattern(i);
181  if( eVertex->Z()<pat->Z()) {
182  vtxpl = pat->Plate();
183  break;
184  }
185  }
186 
187  int n=t->N();
188  for(int j=0;j<n-1;j++){
189  EdbSegP *s1 = t->GetSegment(j);
190  EdbSegP *s2 = t->GetSegment(j+1);
191 
192  // if s1 is more downstream than 5 plates from vertex, skip. search only kink between 1-x,2-x,3-x,4-x.
193  if(s1->Plate()>vtxpl+eSmallKinkNpl) continue;
194 
195  // calculate kink angle in transverse and longitudinal projection.
196  double dtt, dtl;
197  CalcDTTransLongi(s1,s2, &dtt, &dtl);
198  double dt = sqrt(dtt*dtt+dtl*dtl);
199 
200  // calculate position difference from 1st segment.
201  double dxt, dxl;
202  CalcDXTransLongi(t->GetSegmentFirst(),s2, &dxt, &dxl);
203 
204  if( fabs(dtt)>rmst*eSmallKinkRmin || fabs(dtl)>rmsl*eSmallKinkRmin ) {
205  // if there is kink.
206  // if kink angle is bigger than 5 times delta-theta rms in one of the 2 projection.
207 
208  // momentum calculation using downstream from s2.
209  double p,pmin,pmax;
210  CalcPPartial(t,s2,t->GetSegmentLast(), p, pmin, pmax);
211 
212  // calculate Pt at the kink, using downstream momentum.
213  double Pt = p>0 ? p*dt : -1.;
214 
215  // calculate vertex point with 2 segments.
216  TObjArray segs;
217  segs.Add(s1);
218  segs.Add(s2);
219  EdbVertex *v = CalcVertex(&segs);
220 
221  int ndau = n-j-1;
222  // put the data in a struct.
223  EdbSmallKink *kink = new EdbSmallKink(v, t, s1, s2, dtt, dtl, dxt, dxl, ndau, p, pmin, pmax, Pt, rmst, rmsl);
224 
225  // if(gEDA) gEDA->AddVertex(v);
226  kinks->Add(kink); // for this track
227  eKinks->Add(kink); // for all tracks.
228 
229  {
230  // Make Decay vertex
231  // this is a temporary solution.
232  EdbDecayVertex *vdecay = new EdbDecayVertex;
233  vdecay->SetXYZ( v->X(), v->Y(), v->Z());
234  vdecay->SetPrimaryVertex(eVertex);
235 
236  EdbTrackP *tp = new EdbTrackP(*t);
237  tp->Clear();
238  for(int i=0; i<=j; i++) tp->AddSegment( t->GetSegment(i));
239  tp->SetCounters();
240  vdecay->SetParent( new EdbTrackDS(tp, eVertex));
241 
242  EdbTrackP *td = new EdbTrackP(*t);
243  td->Clear();
244  for(int i=j+1; i<t->N(); i++) td->AddSegment( t->GetSegment(i));
245  td->SetCounters();
246  vdecay->SetDaughter( new EdbTrackDS(td, eVertex));
248  eDecayVertices->Add(vdecay);
249  }
250 
251 
252  printf("Kink candidate. itrk %d plate %d - %d kink angle %.4lf P %.3lf Pt %.3lf ",
253  t->ID(), s1->PID(), s2->PID(), dt, p, Pt);
254  printf("(Trans, Longi) = ( %.4lf, %.4lf ) thr ( %.4lf, %.4lf )\n",
255  dtt, dtl, rmst*3, rmsl*3);
256  // gEDA->AddDrawObject(kink);
257  }
258  }
259 
260  printf("%d kink candidates are found.\n", kinks->GetEntries());
261 
262  return kinks;
263 }
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
TTree * t
Definition: check_shower.C:4
void td()
Definition: check_vertex.C:168
EdbPVRec * ePVR
Definition: EdbDecaySearch.h:224
Definition: EdbDecaySearch.h:114
@ kLong
Definition: EdbDecaySearch.h:126
@ kSmallKink
Definition: EdbDecaySearch.h:126
void SetParent(EdbTrackDS *parent)
Definition: EdbDecaySearch.C:75
void SetDaughter(EdbTrackDS *daughter)
Definition: EdbDecaySearch.C:80
void SetPrimaryVertex(EdbVertex *v)
Definition: EdbDecaySearch.h:137
void SetType(int type)
Definition: EdbDecaySearch.h:145
Definition: EdbPattern.h:280
Int_t Plate() const
Definition: EdbPattern.h:340
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
Definition: EdbSegP.h:18
Int_t ID() const
Definition: EdbSegP.h:144
Int_t Plate() const
Definition: EdbSegP.h:156
Int_t PID() const
Definition: EdbSegP.h:145
Float_t Z() const
Definition: EdbPattern.h:87
Definition: EdbDecaySearch.h:155
Definition: EdbDecaySearch.h:8
Definition: EdbPattern.h:118
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:219
Int_t N() const
Definition: EdbPattern.h:182
void Clear()
Definition: EdbPattern.h:271
void SetCounters()
Definition: EdbPattern.h:164
Definition: EdbVertex.h:68
Float_t X() const
Definition: EdbVertex.h:130
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157
Float_t Z() const
Definition: EdbVertex.h:132
Float_t Y() const
Definition: EdbVertex.h:131
void CalcDXTransLongi(EdbSegP *s1, EdbSegP *s2, double *dxt, double *dxl)
Definition: EdbEDAUtil.C:665
void CalcDTTransLongi(EdbSegP *s1, EdbSegP *s2, double *dtTransverse, double *dtLongitudinal)
Definition: EdbEDAUtil.C:648
EdbTrackP * CleanTrack(EdbTrackP *t)
Definition: EdbEDAUtil.C:499
double DTRMSTL1Kink(EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
Definition: EdbEDAUtil.C:745
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
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ CheckInTrackKinks()

TObjArray* EdbDecaySearch::CheckInTrackKinks ( TObjArray *  tracks = NULL)
inline
395  {
396  if(NULL==tracks) tracks=eTracks;
397  for(int i=0;i<tracks->GetEntries();i++) {
398  CheckInTrackKink((EdbTrackP *) tracks->At(i));
399  }
400  return eKinks;
401  }
TObjArray * CheckInTrackKink(EdbTrackP *trk)
Definition: EdbDecaySearch.C:153
TTree * tracks
Definition: check_tr.C:19

◆ DoSearch()

TObjArray * EdbDecaySearch::DoSearch ( )
313  {
314  // Do track search
315 
316 
317  // clear previous results.
318  eTracks->Clear();
319  eSegments->Clear();
320 
321  int nAll=-1;
322  int nTSDau1=-1;
323  int nTSDau2=-1;
324  if(gEve) gEve->SetStatusLine("Start Track search");
325  printf("######### Track Search #########\n");
326  if(eVertex==NULL) {
327  printf("Vertex is not selected!! End.\n");
328  return eTracks;
329  }
330  if(ePVR==NULL){
331  printf("No PVRec set\n");
332  return eTracks;
333  }
334 
335  int hall[11],hdau1[11];
336  int hdau2[11],hmt[11];
337  for(int i=0;i<11;i++) hall[i]=hdau1[i]=hdau2[i]=hmt[i]=0;
338 
339  printf(" target vertex = ( %8.1f, %8.1f, %8.1f) on pid%d.\n", eVertex->X(), eVertex->Y(), eVertex->Z(), eVertexPlatePID);
340  printf(" with %d track\n", ePVR->Ntracks());
341 
342  TObjArray *base = ePVR->eTracks;
343 
344  for(int i=0;i<base->GetEntries();i++) hall[((EdbTrackP *) base->At(i))->N()>=10?10:((EdbTrackP *) base->At(i))->N()]++;
345  nAll=base->GetEntries();
346 
347  // Daughter search 1st
348  if(eTSDau) TSDaughterTracks(base);
349 
350  for(int i=0;i<eTracks->GetEntries();i++) {
351  EdbTrackP *t = ((EdbTrackDS *) eTracks->At(i))->GetOriginal();
352  int nseg= t->N();
353  if( nseg>10) nseg=10;
354  hdau1[nseg]++;
355  }
356  nTSDau1 = eTracks->GetEntries();
357  printf("%d\n", nTSDau1);
358 
359  // Microtrack search
361  if(eMTAll) {
363  }
364  for(int i=0;i<eTracks->GetEntries();i++) hmt[((EdbTrackDS *) eTracks->At(i))->GetOriginal()->N()>=10?10:((EdbTrackDS *) eTracks->At(i))->GetOriginal()->N()]++;
365 
366  // Daughter cut 2nd.
367  if(eTSDau2){
368  TObjArray tmp = *eTracks;
370  }
371  for(int i=0;i<eTracks->GetEntries();i++) hdau2[((EdbTrackDS *) eTracks->At(i))->N()>=10?10:((EdbTrackDS *) eTracks->At(i))->GetOriginal()->N()]++;
372 
373  nTSDau2 = eTracks->GetEntries();
374 
375  // small kin search
377 
378  if(eTSPar) TSParentTracks(base);
379 
380  if(eBT){
381  printf(" Base track search. ");
382  printf("Upstream %d plates, Downstream %d plates ip<%.1lf w>%.1lf\n",
384  for(int dPlate=-eBTPlateUp+1; dPlate<=eBTPlateDown; dPlate++){
385  int pid = eVertexPlatePID + dPlate -1;
386  if(pid<0||ePVR->Npatterns()-1<pid) continue;
387  TSBaseTracks(pid);
388  }
389  }
390 
391  PrintTracks();
392 
393  printf("------ SUMMARY --------------\n");
394  printf(" nseg ");
395  for(int i=1;i<11;i++) printf("%3d ", i);
396  printf("\n");
397  printf(" Total %4d tracks ", nAll);
398  for(int i=1;i<11;i++) printf("%3d ", hall[i]);
399  printf("\n");
400  printf(" Daughter search %4d tracks ", nTSDau1);
401  for(int i=1;i<11;i++) printf("%3d ", hdau1[i]);
402  printf("\n");
403  printf(" Microtrack search ");
404  for(int i=1;i<11;i++) printf("%3d ", hmt[i]);
405  printf("\n");
406  printf(" Nseg>=3 (inc.MT) %4d tracks ", nTSDau2);
407  for(int i=1;i<11;i++) printf("%3d ", hdau2[i]);
408  printf("\n");
409  printf("-------------------------------\n");
410 
411 
412  if( eKinkSearch) KinkSearch();
414 
415  return eTracks;
416 }
int eVertexPlatePID
Definition: EdbDecaySearch.h:218
void MTSearch2seg(TObjArray *tracks)
Definition: EdbDecaySearch.C:276
TObjArray * TSParentTracks(TObjArray *base)
Definition: EdbDecaySearch.C:545
void PrintTracks()
Definition: EdbDecaySearch.C:268
void ShortDecaySearch()
Definition: EdbDecaySearch.C:806
void SmallKinkSearch()
Definition: EdbDecaySearch.C:138
TObjArray * TSDaughterTracks(TObjArray *base)
Definition: EdbDecaySearch.C:460
void TSDaughterTracks2()
Definition: EdbDecaySearch.C:515
TObjArray * TSBaseTracks(int ipl)
Definition: EdbDecaySearch.C:598
void MTSearchAll(TObjArray *tracks)
Definition: EdbDecaySearch.C:293
void KinkSearch()
Definition: EdbDecaySearch.C:744
Int_t Ntracks() const
Definition: EdbPVRec.h:203
TObjArray * eTracks
Definition: EdbPVRec.h:161
int pid[1000]
Definition: m2track.cpp:13

◆ FindPrimaryVertex()

EdbVertex * EdbDecaySearch::FindPrimaryVertex ( )
675  {
676  // Find Best Vertex.
677  // select best one from pvr->eVertex
678 
679  printf("FindBestVertex(): \n");
680  if( ePVR->Nvtx()==0 ){
681  printf("No vertex is set. make a fake vertex.");
682 
683  EdbTrackP *tup=NULL;
684  for(int i=0; i<ePVR->Ntracks(); i++){
685  EdbTrackP *t = ePVR->GetTrack(i);
686  if(t->N()<3) continue;
687  if(EdbEDAUtil::DTRMS(t)>0.02) continue;
688  if(tup==NULL) tup=t;
689  if(t->Z()<tup->Z()) tup=t;
690  }
691  if(tup==NULL) return NULL;
692 
693  EdbVertex *v = MakeFakeVertex( tup, -650);
694 
695  return v;
696  }
697 
698  // select most upstream vertex
699  int zero=0;
700  EdbVertex *v_most_upstream = ePVR->GetVertex(zero);
701  for(int i=1; i<ePVR->Nvtx(); i++){
702  EdbVertex *v = ePVR->GetVertex(i);
703  if(v->Z()<v_most_upstream->Z()) v_most_upstream=v;
704  }
705 
706  // gather all vertex near the most upstream vertex
707  // vertices within 200 micron in Z.
708 
709  printf("TODO: FindPrimaryVertex... find real vertex, especially QE like kink event.\n");
710  printf("memo: currently mostly 2 track vertex is selected.");
711  printf("TODO: use SB info.\n");
712  printf("TODO: constraint for vertex Z < SB stop Z\n");
713  TObjArray *vertices = new TObjArray;
714  for(int i=0; i<ePVR->Nvtx(); i++){
715  EdbVertex *v = ePVR->GetVertex(i);
716  if(v->Z()<v_most_upstream->Z()+200) vertices->Add(v);
717  }
718 
719  // select most high probability vertex
720  EdbVertex *v_highest_prob= (EdbVertex *) vertices->At(0);
721  for(int i=1; i<vertices->GetEntries(); i++){
722  EdbVertex *v= (EdbVertex *) vertices->At(i);
723  if(v->V()->prob()>v_highest_prob->V()->prob()) v_highest_prob = v;
724  }
725 
726 
727  printf("select upstream and high probable vertex: %d vertex\n", ePVR->Nvtx());
728  for(int i=0; i<ePVR->Nvtx();i++){
729  EdbVertex *v = ePVR->GetVertex(i);
730  int flag = 0;
731  for(int j=0; j<vertices->GetEntries(); j++) { if(v==vertices->At(j)) flag=1;}
732  printf("vertex %2d, %2d tracks z=%8.1f prob=%7.5f %s %s, %s\n", i, v->N(), v->Z(), v->V()->prob(),
733  v==v_most_upstream?"most":" ",
734  flag?"upstream": " ",
735  v==v_highest_prob?"highest prob":"");
736  }
737 
738  delete vertices;
739  return v_highest_prob;
740  //return v_most_upstream;
741 
742 }
EdbVertex * MakeFakeVertex(EdbTrackP *t, double dz=1150)
Definition: EdbDecaySearch.C:657
EdbVertex * GetVertex(Int_t &i)
Definition: EdbPVRec.h:256
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Int_t Nvtx() const
Definition: EdbPVRec.h:255
Float_t Z() const
Definition: EdbSegP.h:150
Int_t N() const
Definition: EdbVertex.h:121
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
float prob() const
upper tail $\chi^2$ probability
Definition: VtVertex.C:237
double DTRMS(EdbTrackP *t)
Definition: EdbEDAUtil.C:431

◆ FindTrack()

EdbTrackDS* EdbDecaySearch::FindTrack ( EdbTrackP t)
inline
375  {
376  for(int i=0;i<Ntracks();i++){
377  if(GetTrack(i)->ID()==t->ID()) return GetTrack(i);
378  }
379  return NULL;
380  }
int Ntracks()
Definition: EdbDecaySearch.h:382
EdbTrackDS * GetTrack(int i)
Definition: EdbDecaySearch.h:383

◆ FindUpstreamVertices()

TObjArray * EdbDecaySearch::FindUpstreamVertices ( )
437  {
438 
439  printf("Find upstream vertices. Nvtx_base = %d\n", ePVR->Nvtx());
440  TObjArray *vertices= new TObjArray;
441 
442  for(int i=0;i<ePVR->Nvtx();i++){
443  EdbVertex *v = ePVR->GetVertex(i);
444  double dz = v->Z() - eVertex->Z();
445  if( dz < -eVtxUpDZ || 0 < dz ) continue;
446 
447  int flag=0;
448  for(int j=0;j<eVertex->N();j++){
450  if(CalcIP(s,v)<eVtxUpIP) flag++;
451  }
452  if(flag ==0) continue;
453  vertices->Add(v);
454  }
455 
456  return vertices;
457 }
brick dz
Definition: RecDispMC.C:107
Double_t CalcIP(EdbSegP *s, EdbVertex *v)
Definition: ShowRec.cpp:8872
EdbSegP * GetSegmentFirst() const
Definition: EdbPattern.h:194
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
EdbSegP * s
Definition: tlg2pattern.C:32

◆ GetDecayVertex()

EdbDecayVertex* EdbDecaySearch::GetDecayVertex ( int  i)
inline
385 { return (EdbDecayVertex *)eDecayVertices->At(i);}

◆ GetIPCut()

float EdbDecaySearch::GetIPCut ( EdbVertex v,
EdbSegP s 
)
794  {
795  // calculate IP cut for given 1ry vertex and segment.
796  // if segment is BT, Z of segment is assumed Z=s->Z()-150;
797  // otherwise, use s->Z();
798 
799  float Z = s->Side()==0? s->Z()-150 : s->Z();
800  float dZ = fabs( Z-v->Z());
801  return 5.0+0.01*dZ;
802 }
Int_t Side() const
Definition: EdbSegP.h:167
struct @8 Z

◆ GetKinks()

TObjArray* EdbDecaySearch::GetKinks ( void  )
inline
403 { return eKinks;}

◆ GetPrimaryVertex()

EdbVertex* EdbDecaySearch::GetPrimaryVertex ( )
inline
351 { return eVertex;}

◆ GetPVR()

EdbPVRec* EdbDecaySearch::GetPVR ( )
inline
388 { return ePVR;}

◆ GetTrack()

EdbTrackDS* EdbDecaySearch::GetTrack ( int  i)
inline
383 { return (EdbTrackDS *) eTracks->At(i);}

◆ GetTSDauIP1()

double EdbDecaySearch::GetTSDauIP1 ( double  dz)
116  {
117  TH1F *h = eTSDauIPHist1;
118 
119  if(dz<h->GetXaxis()->GetXmin()) return h->GetBinContent(1);
120  if(dz>h->GetXaxis()->GetXmax()) return h->GetBinContent(h->GetNbinsX());
121  for(int i=1;i<h->GetNbinsX();i++){
122  if(dz>=h->GetBinLowEdge(i)&&dz<h->GetBinLowEdge(i)+h->GetBinWidth(i)) return h->GetBinContent(i);
123  }
124  return 0.0;
125 }
h_chi2_v_ttheta GetXaxis() -> SetTitle("ttheta")

◆ GetTSDauIP2()

double EdbDecaySearch::GetTSDauIP2 ( double  dz)
127  {
128  TH1F *h = eTSDauIPHist2;
129 
130  if(dz<h->GetXaxis()->GetXmin()) return h->GetBinContent(1);
131  if(dz>h->GetXaxis()->GetXmax()) return h->GetBinContent(h->GetNbinsX());
132  for(int i=1;i<h->GetNbinsX();i++){
133  if(dz>=h->GetBinLowEdge(i)&&dz<h->GetBinLowEdge(i)+h->GetBinWidth(i)) return h->GetBinContent(i);
134  }
135  return 0.0;
136 }

◆ KinkSearch()

void EdbDecaySearch::KinkSearch ( )
744  {
745  printf("------------------------------\n");
746  printf("Kink search in selected tracks\n");
747  for(int i=0; i<Ntracks(); i++){
748  for(int j=0; j<Ntracks(); j++){
749 
750  if(i==j) continue;
751 
752  EdbTrackDS *t1 = GetTrack(i);
753  EdbTrackDS *t2 = GetTrack(j);
754 
755  EdbSegP *s1 = t1->GetSegmentLast();
756  EdbSegP *s2 = t2->GetSegmentFirst();
757 
758  if(s1->Plate() >= s2->Plate()) continue;
759  // if last segment of t1 is upstream of first segment of t2.
760 
761  // ignore kink angle < 20 mrad.
762  float kinkangle = sqrt((s1->TX()-s2->TX())*(s1->TX()-s2->TX())+(s1->TY()-s2->TY())*(s1->TY()-s2->TY()));
763  if( kinkangle<0.02) continue;
764 
765  // remove very low momentum
766  double rmss, rmst, rmsl;
767  DTRMSTL(t2, &rmss, &rmst, &rmsl);
768  if( rmst>0.015 && rmsl>0.015) continue;
769 
770  TObjArray segs;
771  segs.Add(s1);
772  segs.Add(s2);
773  EdbVertex *v = EdbEDAUtil::CalcVertex(&segs);
774  float ip1 = EdbEDAUtil::CalcIP(s1, v);
775  float ip2 = EdbEDAUtil::CalcIP(s2, v);
776 
777  // cut with IP and Z. (Z should between 2 segments.)
778  if(ip1<20 && ip2<20 && s1->Z()-500<v->Z() && v->Z()<s2->Z()+500){
779  printf("Decay vertex t1 %d t2 %d ip1 %f ip2 %f\n", t1->ID(), t2->ID(), ip1, ip2);
780  EdbDecayVertex *dv = new EdbDecayVertex;
781  dv->SetXYZ( v->X(), v->Y(), v->Z());
782  dv->SetParent(t1);
783  dv->SetDaughter(t2);
785  printf("kink found, %d %f %f %f\n", dv->N(), dv->X(), dv->Y(), dv->Z());
786  eDecayVertices->Add(dv);
787  }
788 
789  delete v;
790  }
791  }
792 }
Float_t TX() const
Definition: EdbSegP.h:172
Float_t TY() const
Definition: EdbSegP.h:173
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:195
EdbVertex * CalcVertex(TObjArray *segments)
Definition: EdbEDAUtil.C:282
double DTRMSTL(EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *ndata=NULL)
Definition: EdbEDAUtil.C:686
double CalcIP(EdbSegP *s, double x, double y, double z)
Definition: EdbEDAUtil.C:85

◆ MakeFakeVertex()

EdbVertex * EdbDecaySearch::MakeFakeVertex ( EdbTrackP t,
double  dz = 1150 
)
657  {
658  EdbSegP *s0 = t->GetSegmentFirst();
659 
660  EdbSegP s(*s0);
661  s.PropagateTo(s0->Z()+dz);
662 
663  EdbVertex *v = new EdbVertex;
664  v->SetID(t->ID());
665  v->SetXYZ(s.X(),s.Y(),s.Z());
666 
667  EdbVTA *vta = new EdbVTA(t, v);
668  vta->SetZpos(1);
669  vta->SetFlag(2);
670  vta->SetImp(EdbEDAUtil::CalcIP(&s,v));
671  v->AddVTA(vta);
672  return v;
673 }
void PropagateTo(float z)
Definition: EdbSegP.cxx:292
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
Definition: EdbVertex.h:25
void SetImp(float imp)
Definition: EdbVertex.h:56
void SetZpos(int zpos)
Definition: EdbVertex.h:54
void SetFlag(int flag)
Definition: EdbVertex.h:55
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:377
void SetID(int ID=0)
Definition: EdbVertex.h:156

◆ MTSearch2seg()

void EdbDecaySearch::MTSearch2seg ( TObjArray *  tracks)
276  {
277  // Microtrack search for 2 segment track.
278  // if eSet is not set, do nothing.
279 
280  // if eSet==NULL or Preparation is failed, do nothing.
281  //int ret = eSet ? eSet->PrepareScanSetForMT() : -1;
282  int ret = -1;
283  if(ret==-1) {
284  printf("ScanSet error. stop.\n");
285  return;
286  }
287 
288 // for(int i=0;i<tracks->GetEntries();i++){
289 // EdbTrackP *t = ((EdbTrackDS *) tracks->At(i))->GetOriginal();
290 // if(t->N()==2) eSet->MicroTrackSearch(t);
291 // }
292 }

◆ MTSearchAll()

void EdbDecaySearch::MTSearchAll ( TObjArray *  tracks)
293  {
294  // Microtrack search for all tracks.
295  // if eSet is not set, do nothing.
296 
297  // if eSet==NULL or Preparation is failed, do nothing.
298  //int ret = eSet ? eSet->PrepareScanSetForMT() : -1;
299  int ret = -1;
300  if(ret==-1) {
301  printf("ScanSet error. stop.\n");
302  return;
303  }
304 
305 // for(int i=0;i<tracks->GetEntries();i++){
306 // gEve->SetStatusLine(Form("MicroTrackSearch %d/%d", i+1, tracks->GetEntries()));
307 // EdbTrackP *t = ((EdbTrackDS *) tracks->At(i))->GetOriginal();
308 // eSet->MicroTrackSearch(t);
309 // }
310 
311 }

◆ NDecayVertices()

int EdbDecaySearch::NDecayVertices ( )
inline
384 { return eDecayVertices->GetEntries();}

◆ Ntracks()

int EdbDecaySearch::Ntracks ( )
inline
382 { return eTracks->GetEntries();}

◆ PrintTracks()

void EdbDecaySearch::PrintTracks ( )
268  {
269  printf("ibrick trkid flag pl ns x y z tx ty pl pa cs dk ip1ry class PBDLU comment\n");
270  for(int i=0;i<Ntracks();i++){
271  EdbTrackDS *t = GetTrack(i);
272  t->Print();
273  }
274 }

◆ SetBTSearch()

void EdbDecaySearch::SetBTSearch ( int  do_search = 1,
int  npl_up = 0,
int  npl_down = 2,
float  ipcut = 20,
float  phcut = 17 
)
inline
405  {
406  eBT = do_search; eBTPlateUp = npl_up; eBTPlateDown = npl_down; eBTIP = ipcut; eBTPH = phcut;}

◆ SetIPHist1()

void EdbDecaySearch::SetIPHist1 ( TH1F *  h)
inline
390 { eTSDauIPHist1=h;}

◆ SetIPHist2()

void EdbDecaySearch::SetIPHist2 ( TH1F *  h)
inline
391 { eTSDauIPHist2=h;}

◆ SetKinkSearch()

void EdbDecaySearch::SetKinkSearch ( int  do_search)
inline
412 { eKinkSearch = do_search;}

◆ SetParentSearch()

void EdbDecaySearch::SetParentSearch ( int  do_search = 1,
int  npl = 2,
float  ipcut = 20,
float  phcut = 17 
)
inline
407  {
408  eTSPar = do_search; eTSParPlate = npl; eTSParIP = ipcut; eTSParPH = phcut;}

◆ SetPVR()

void EdbDecaySearch::SetPVR ( EdbPVRec pvr)
inline
387 { ePVR = pvr;}

◆ SetShortDecaySearch()

void EdbDecaySearch::SetShortDecaySearch ( int  do_search)
inline
413 { eShortDecay = do_search;}

◆ SetSmallKinkSearch()

void EdbDecaySearch::SetSmallKinkSearch ( int  do_search = 1,
int  npl_down = 5,
float  Rmin = 5. 
)
inline
409  {
410  eSmallKink = do_search; eSmallKinkNpl = npl_down; eSmallKinkRmin = Rmin;}

◆ SetTracks()

void EdbDecaySearch::SetTracks ( TObjArray *  array)
inline
393 {eTracks=array;}

◆ SetVertex()

void EdbDecaySearch::SetVertex ( EdbVertex v)
419  {
420  eVertex = v;
421  if(NULL==v) return;
422  double vertexplz = 1e9;
423 
424  printf("vertex z = %f\n", v->Z());
425  for(int i=0;i<ePVR->Npatterns();i++){
426  EdbPattern *pat = ePVR->GetPattern(i);
427  if(pat==NULL) continue;
428  if(pat->Z()<v->Z()) continue;
429  if(pat->Z()<vertexplz) {
430  vertexplz = pat->Z();
431  eVertexPlatePID = pat->ID(); // Set eVertexPlatePID
432  }
433  }
434  printf("VertexPlatePID=%d\n", eVertexPlatePID);
435 }
int ID() const
Definition: EdbPattern.h:328

◆ ShortDecaySearch()

void EdbDecaySearch::ShortDecaySearch ( )
806  {
807  printf(" --------------------------\n");
808  printf("// Short decay search //\n");
809  printf("-------------------------- \n");
810  printf("Using tracks which start from vertex plate and Nseg>=3\n");
811  printf("TODO: Microtrack search!!\n");
812 
813  // select tracks in vertex plate
814  TObjArray tracks;
815  for(int i=0; i<Ntracks(); i++){
816  EdbTrackDS *t = GetTrack(i);
817  EdbSegP *s1 = t->GetSegmentFirst();
818 
819  // Nseg cut
820  if(t->N()<=2) continue;
821 
822  // use only tracks which start from vertex plate.
823  if(s1->PID()!=eVertexPlatePID) continue;
824 
825  tracks.Add(t);
826  }
827  printf("Tracks selection for short decay : %d -> %d\n", Ntracks(), tracks.GetEntries());
828 
829  if(tracks.GetEntries()==0) return;
830 
831  // Calculate vertex with all tracks. First time.
832  TObjArray segs;
833  for(int i=0; i<tracks.GetEntries(); i++) segs.Add( ((EdbTrackDS *)tracks.At(i))->GetSegmentFirst());
834  EdbVertex *v = CalcVertex(&segs);
835  float ipcut = GetIPCut(v, (EdbSegP *)segs.At(0));
836  printf("Vertex with all tracks: %.1f %.1f %.1f\n", v->X(), v->Y(), v->Z());
837  printf("dZ=%.1f microns -> IP cut %.1f\n", ((EdbSegP *)segs.At(0))->Z()-v->Z(), ipcut);
838 
839  int flag=0;
840  // check if short decay candidate exists or not.
841 
842  if(tracks.GetEntries()==2){ // 2 track case.
843  EdbTrackDS *t1 = (EdbTrackDS *) tracks.At(0);
844  EdbSegP *s1 = t1->GetSegmentFirst();
845  EdbTrackDS *t2 = (EdbTrackDS *) tracks.At(1);
846  EdbSegP *s2 = t2->GetSegmentFirst();
847  float ip = CalcDmin(s1,s2);
848  printf("track %5d x track %5d, dmin %4.1f %s\n", t1->ID(), t2->ID(), ip, ip>ipcut?">ipcut":"");
849  if(ip>ipcut) flag=2;
850  }
851  else { // more tracks case
852  float ipmean=0.0;
853  for(int i=0; i<tracks.GetEntries(); i++){
854  EdbTrackDS *t = (EdbTrackDS *) tracks.At(i);
855  EdbSegP *s = t->GetSegmentFirst();
856  float ip = CalcIP( s, v);
857 
858  printf("track %5d (%7.4f, %7.4f) ip %4.1f %s\n", t->ID(), t->TX(), t->TY(), ip, ip>ipcut?">ipcut":"");
859  ipmean +=ip;
860  if(ip>ipcut) flag++;
861  }
862  ipmean /= tracks.GetEntries();
863  printf("IP mean %.1lf microns with %d tracks\n", ipmean, tracks.GetEntries());
864  }
865  if(flag==0) {
866  printf("No short decay. stop.\n");
867  return;
868  }
869  printf("%d short decay candidates\n", flag);
870 
871  printf("Vertex refinement by removing one or more tracks.\n");
872 
873  while(flag&&tracks.GetEntries()!=2){
874  // loop to make vertex removing one track.
875  int imax=-1;
876  float ipmax = 0;
877  for(int i=0; i<tracks.GetEntries(); i++){
878  EdbTrackDS *t = (EdbTrackDS *) tracks.At(i);
879  EdbSegP *s = t->GetSegmentFirst();
880 
881  TObjArray segs2 = segs;
882  segs2.Remove( s);
883  segs2.Sort();
884 
885  EdbVertex *v2 = CalcVertex(&segs2);
886  float ip = CalcIP(s, v2);
887 
888  if(ip>ipmax) {
889  imax=i;
890  ipmax=ip;
891  }
892  }
893 
894  // if ipmax>ipcut.
895  if(ipmax>ipcut) {
896  EdbTrackDS *tsd = (EdbTrackDS *) tracks.At(imax);
897 
898  // Calculate new vertex position.
899  tracks.Remove(tsd);
900  tracks.Sort();
901  segs.Clear();
902  for(int i=0; i<tracks.GetEntries(); i++) segs.Add( ((EdbTrackDS *)tracks.At(i))->GetSegmentFirst());
903  EdbVertex *v2 = CalcVertex(&segs);
904 
905  // Set as Primary vertex.
906  eVertex = v2;
907 
908  // remove very low momentum
909  double rmss, rmst, rmsl;
910  DTRMSTL(tsd, &rmss, &rmst, &rmsl);
911  if( rmst>0.015 && rmsl>0.015) continue;
912 
913  // Make Short Decay vertex
914  EdbVertex *vsd = MakeFakeVertex( tsd, -150);
915  EdbDecayVertex *vdecay = new EdbDecayVertex;
916  vdecay->SetXYZ( vsd->X(), vsd->Y(), vsd->Z());
917  vdecay->SetPrimaryVertex(v2);
918  vdecay->SetDaughter( tsd);
920 
921  eDecayVertices->Add(vdecay);
922 
923 
924  printf("Short decay of track %d is found. ip = %5.1f. \n", tsd->ID(), ipmax);
925 
926  // Check if no other tracks has ip>ipcut
927  flag=0;
928  if(tracks.GetEntries()==2){
929  EdbTrackDS *t1 = (EdbTrackDS *) tracks.At(0);
930  EdbSegP *s1 = t1->GetSegmentFirst();
931  EdbTrackDS *t2 = (EdbTrackDS *) tracks.At(1);
932  EdbSegP *s2 = t2->GetSegmentFirst();
933  float ip = CalcDmin(s1,s2);
934  printf("track %5d x track %5d, dmin %4.1f %s\n", t1->ID(), t2->ID(), ip, ip>ipcut?">ipcut":"");
935  if(ip>ipcut) flag=2;
936  }
937  else {
938  float ipmean=0.0;
939  for(int i=0; i<segs.GetEntries(); i++){
940  EdbSegP *s = (EdbSegP *) segs.At(i);
941  float ip = CalcIP(s, v2);
942  if(ip>ipcut) flag++;
943  ipmean += ip;
944  }
945  ipmean /= segs.GetEntries();
946  printf("IP mean %.1lf microns with %d tracks, removing track %d\n", ipmean, tracks.GetEntries(), tsd->ID());
947  }
948  } else flag=0;
949 
950  }
951 
952 
953  if( flag && tracks.GetEntries()==2){
954  // Short decay with only 1 partner track. (without vertex)
955  for(int i=0; i<2; i++){
956  EdbTrackDS *t1 = (EdbTrackDS *) tracks.At(i);
957  EdbSegP *s1 = t1->GetSegmentFirst();
958  EdbTrackDS *t2 = (EdbTrackDS *) tracks.At(!i);
959  EdbSegP *s2 = t2->GetSegmentFirst();
960 
961  // remove very low momentum
962  double rmss, rmst, rmsl;
963  DTRMSTL(t1, &rmss, &rmst, &rmsl);
964  if( rmst>0.015 && rmsl>0.015) continue;
965 
966  EdbVertex *vsd = MakeFakeVertex( t1, -150);
967  EdbDecayVertex *vdecay = new EdbDecayVertex;
968  vdecay->SetXYZ( vsd->X(), vsd->Y(), vsd->Z());
969  vdecay->SetDaughter( t1);
970  vdecay->SetPartner( t2);
972  eDecayVertices->Add(vdecay);
973 
974  }
975  }
976 
977  for(int i=0; i<NDecayVertices(); i++){
980  }
981 }
int NDecayVertices()
Definition: EdbDecaySearch.h:384
float GetIPCut(EdbVertex *v, EdbSegP *s)
Definition: EdbDecaySearch.C:794
EdbDecayVertex * GetDecayVertex(int i)
Definition: EdbDecaySearch.h:385
@ kShort
Definition: EdbDecaySearch.h:126
EdbVertex * GetPrimaryVertex()
Definition: EdbDecaySearch.h:143
void SetPartner(EdbTrackDS *partner)
Definition: EdbDecaySearch.h:136
double CalcDmin(EdbSegP *seg1, EdbSegP *seg2, double *dminz=NULL)
Definition: EdbEDAUtil.C:239

◆ SmallKinkSearch()

void EdbDecaySearch::SmallKinkSearch ( )
138  {
139  for(int i=0;i<Ntracks();i++){
140  EdbTrackDS *t = GetTrack(i);
141  TObjArray *kinks=CheckInTrackKink(t);
142  /*
143  // Draw plots
144  if(kinks->GetEntries()!=0) {
145  if(gEDA==NULL) continue;
146  EdbEDAPlotTab *p = gEDA->GetPlotTab();
147  if(p!=NULL) p->CheckKink(t);
148  }
149  */
150  }
151 }

◆ TSBaseTracks()

TObjArray * EdbDecaySearch::TSBaseTracks ( int  ipl)
598  {
599  // Search Tracks and set eTracks. return TObjArray filled with selected segments.
600  TObjArray *filtered = new TObjArray();
601  printf(" pid=%2d ", pid);
602  EdbPattern *pat = ePVR->GetPattern(pid);
603 
604  if(pat==NULL) {
605  printf("No pattern is available for pid=%d\n", pid);
606  return filtered;
607  }
608 
609  int found=0;
610  int found_as_track=0;
611  for(int i=0;i<pat->N();i++){
612  EdbSegP *s = pat->GetSegment(i);
613  if(s==NULL) continue;
614 
615  // IP cut
616  double ip=CalcIP(s, eVertex);
617  if( ip > eBTIP ) continue;
618 
619  // PH cut
620  if( s->W() < eBTPH ) continue;
621 
622  found++;
623  // already found as tracks to be drawn?
624  int flag=0;
625  for(int j=0;j<eTracks->GetEntries();j++){
626  EdbTrackP *t = (EdbTrackP *)eTracks->At(j);
627  for(int k=0;k<t->N();k++){
628  EdbSegP *ss = t->GetSegment(k);
629  if(ss->PID()==s->PID()&&ss->ID()==s->ID()){
630  flag++;
631  found_as_track++;
632  }
633  }
634  }
635  if(flag) continue;
636 
637  // add to array
638  filtered->Add(s);
639  eSegments->Add(s);
640  // add to array
641  EdbTrackP *t = new EdbTrackP(s);
642  t->SetCounters();
643 
644  EdbTrackDS *t2 = new EdbTrackDS(t, eVertex);
646  eTracks->Add(t2);
647 
648  printf(" Track id=%6d ip=%5.1lf pid%02d->%02d %7.4lf %7.4lf\n", t->ID(), ip,
649  t->GetSegmentFirst()->PID(),
650  t->GetSegmentLast()->PID(),
651  t->TX(),t->TY());
652  }
653  printf("%5d segments from pid %2d. (%d found, %d already selected as track)\n", filtered->GetEntries(), pid, found, found_as_track);
654  return filtered;
655 }
Float_t W() const
Definition: EdbSegP.h:148
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
void SetTrackSearch(int v)
Definition: EdbDecaySearch.h:82
int TrackSearch()
Definition: EdbDecaySearch.h:83
ss
Definition: energy.C:62

◆ TSDaughterTracks()

TObjArray * EdbDecaySearch::TSDaughterTracks ( TObjArray *  base)
460  {
461  // Search Tracks and set eTracks. return TObjArray filled with selected tracks.
462  printf(" Daughter track search. ");
463  printf("nseg>=%d, ip=func of dz, w>%.1lf\n", eTSDauNseg,eTSDauPH);
464 // printf("nseg>=%d, start within %d plates, ip<%.1lf w>%.1lf\n",
465 // eTSDauNseg, eTSDauPlate, 0.0 /*eTSDauIP*/, eTSDauPH);
466 
467  TObjArray *filtered = new TObjArray;
468 
469  int inew=0;
470 
471  for(int i=0;i<base->GetEntries();i++){
472  EdbTrackP *t = (EdbTrackP *) base->At(i);
473  if(t==NULL) continue;
474  EdbSegP *s = t->GetSegmentFirst();
475 
476  // Nseg cut
477  if( t->N() < eTSDauNseg ) continue;
478 
479  // dPlate cut
480  //int dPlate = s->PID() - eVertexPlatePID + 1; //
481  //if( dPlate < 1 || eTSDauPlate < dPlate ) continue; // 0 <= dPlate <= eTSDauPlate
482 
483  // IP cut
484  double ip = CalcIP(s, eVertex);
485 
486  double dz = s->Z() - eVertex->Z();
487 
488  if( ip > GetTSDauIP1(dz) ) continue;
489 
490  // PH cut
491  double ph = t->Wgrains()/t->N();
492  if( ph < eTSDauPH ) continue;
493 
494 
495  // add to array
496  filtered->Add(t);
497  EdbTrackDS *t2 = FindTrack(t);
498  if(t2) t2->SetTrackSearch( t2->TrackSearch()|kDaughterSearch);
499  else {
500  inew++;
501  printf(" Track id=%6d ip=%5.1lf pid%02d->%02d %7.4lf %7.4lf\n", t->ID(), ip,
502  t->GetSegmentFirst()->PID(),
503  t->GetSegmentLast()->PID(),
504  t->TX(),t->TY());
505 
506  t2 = new EdbTrackDS(t,eVertex);
508  eTracks->Add(t2);
509  }
510  }
511  printf("%5d tracks are selected (new %2d tracks)\n", filtered->GetEntries(), inew);
512  return filtered;
513 }
EdbTrackDS * FindTrack(EdbTrackP *t)
Definition: EdbDecaySearch.h:375
double GetTSDauIP1(double dz)
Definition: EdbDecaySearch.C:116

◆ TSDaughterTracks2()

void EdbDecaySearch::TSDaughterTracks2 ( )
515  {
516  // Filter 2segment tracks after microtrack search.
517  // sevior dz cut will be applied.
518 
519  printf(" Daughter track search2. ");
520  printf("nseg>=%d, ip=func of dz\n", eTSDauNseg2);
521 
522  int ntrk=eTracks->GetEntries();
523  for(int i=0;i<ntrk;i++){
524  EdbTrackDS *tt = (EdbTrackDS *) eTracks->At(i);
525  EdbTrackP *t = tt->GetOriginal();
526  if(t==NULL) continue;
527 
528  EdbSegP *s = t->GetSegmentFirst();
529 
530  // Nseg cut
531  // IP cut
532  double ip = CalcIP(s, eVertex);
533  double dz = s->Z() - eVertex->Z();
534 
535  if( ip < GetTSDauIP2(dz) && t->N() >= eTSDauNseg2) continue;
536 
537  // remove this track
538  eTracks->Remove(tt);
539  }
540  eTracks->Sort();
541  printf("%5d tracks are remained. original %d tracks\n", eTracks->GetEntries(), ntrk);
542 }
double GetTSDauIP2(double dz)
Definition: EdbDecaySearch.C:127
EdbTrackP * GetOriginal()
Definition: EdbDecaySearch.h:107

◆ TSParentTracks()

TObjArray * EdbDecaySearch::TSParentTracks ( TObjArray *  base)
545  {
546  // Search Tracks and set eTracks. return TObjArray filled with selected tracks.
547 
548  printf(" Parent track search. ");
549  printf("nseg>=%d, start within %d plates, ip<%.1lf w>%.1lf\n",
551 
552  printf("eVertexPlatePID=%d\n", eVertexPlatePID);
553 
554  TObjArray *filtered = new TObjArray;
555  int inew=0;
556  for(int i=0;i<base->GetEntries();i++){
557  EdbTrackP *t = (EdbTrackP *) base->At(i);
558  if(t==NULL) continue;
559  EdbSegP *s = t->GetSegmentFirst();
560 
561  // Nseg cut
562  if( t->N() < eTSParNseg ) continue;
563 
564  // dPlate cut
565  int dPlate = s->PID() - eVertexPlatePID + 1;
566  if( dPlate <= -eTSParPlate || eTSParPlate < dPlate ) continue; // 0 <= dPlate <= eTSParPlate
567 
568  // IP cut
569  double ip = CalcIP(s, eVertex);
570  if( ip > eTSParIP ) continue;
571 
572  // PH cut
573  double ph = t->Wgrains()/t->N();
574  if( ph < eTSParPH ) continue;
575 
576 
577  // add to array
578  filtered->Add(t);
579  EdbTrackDS *t2 = FindTrack(t);
580  if(t2) t2->SetTrackSearch( t2->TrackSearch()|kParentSearch);
581  else {
582  inew++;
583  printf(" Track id=%6d ip=%5.1lf pid%02d->%02d %7.4lf %7.4lf\n", t->ID(), ip,
584  t->GetSegmentFirst()->PID(),
585  t->GetSegmentLast()->PID(),
586  t->TX(),t->TY());
587  EdbTrackDS *t2 = new EdbTrackDS( t, eVertex);
589  eTracks->Add(t2);
590  }
591  }
592 
593  printf("%5d tracks are selected (new %2d tracks)\n", filtered->GetEntries(), inew);
594  return filtered;
595 }

Member Data Documentation

◆ eBT

int EdbDecaySearch::eBT

◆ eBTIP

double EdbDecaySearch::eBTIP

◆ eBTPH

double EdbDecaySearch::eBTPH

◆ eBTPlateDown

int EdbDecaySearch::eBTPlateDown

◆ eBTPlateUp

int EdbDecaySearch::eBTPlateUp

◆ eDecayVertices

TObjArray* EdbDecaySearch::eDecayVertices

◆ eDSVer

int EdbDecaySearch::eDSVer

◆ eKinks

TObjArray* EdbDecaySearch::eKinks

◆ eKinkSearch

int EdbDecaySearch::eKinkSearch

◆ eKinkSigma

double EdbDecaySearch::eKinkSigma

◆ eMT2seg

int EdbDecaySearch::eMT2seg

◆ eMTAll

int EdbDecaySearch::eMTAll

◆ ePVR

EdbPVRec* EdbDecaySearch::ePVR

◆ eSegments

TObjArray* EdbDecaySearch::eSegments

◆ eShortDecay

int EdbDecaySearch::eShortDecay

◆ eSmallKink

int EdbDecaySearch::eSmallKink

◆ eSmallKinkNpl

int EdbDecaySearch::eSmallKinkNpl

◆ eSmallKinkRmin

float EdbDecaySearch::eSmallKinkRmin

◆ eTracks

TObjArray* EdbDecaySearch::eTracks

◆ eTSDau

int EdbDecaySearch::eTSDau

◆ eTSDau2

int EdbDecaySearch::eTSDau2

◆ eTSDauIPHist1

TH1F* EdbDecaySearch::eTSDauIPHist1

◆ eTSDauIPHist2

TH1F* EdbDecaySearch::eTSDauIPHist2

◆ eTSDauNseg

int EdbDecaySearch::eTSDauNseg

◆ eTSDauNseg2

int EdbDecaySearch::eTSDauNseg2

◆ eTSDauPH

double EdbDecaySearch::eTSDauPH

◆ eTSPar

int EdbDecaySearch::eTSPar

◆ eTSParIP

double EdbDecaySearch::eTSParIP

◆ eTSParNseg

int EdbDecaySearch::eTSParNseg

◆ eTSParPH

double EdbDecaySearch::eTSParPH

◆ eTSParPlate

int EdbDecaySearch::eTSParPlate

◆ eVertex

EdbVertex* EdbDecaySearch::eVertex

◆ eVertexPlatePID

int EdbDecaySearch::eVertexPlatePID

◆ eVertices

TObjArray* EdbDecaySearch::eVertices

◆ eVtxUp

int EdbDecaySearch::eVtxUp

◆ eVtxUpDZ

int EdbDecaySearch::eVtxUpDZ

◆ eVtxUpIP

int EdbDecaySearch::eVtxUpIP

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