FEDRA emulsion software from the OPERA Collaboration
EdbDecaySearch Class Reference

Decay Search class. More...

#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
 Basetrack search. More...
 
double eBTIP
 IP cut for Basetrack. More...
 
double eBTPH
 PH cut for Basetrack. More...
 
int eBTPlateDown
 nplates downstream for Basetrack Search More...
 
int eBTPlateUp
 nplates upstream or Basetrack search More...
 
TObjArray * eDecayVertices
 
int eDSVer
 
TObjArray * eKinks
 
int eKinkSearch
 
double eKinkSigma
 
int eMT2seg
 Microtrack search for 2 segment. More...
 
int eMTAll
 Microtrack search to fill holes and upstream, downstream. More...
 
EdbPVRecePVR
 
TObjArray * eSegments
 
int eShortDecay
 
int eSmallKink
 Small-Kink search. More...
 
int eSmallKinkNpl
 
float eSmallKinkRmin
 
TObjArray * eTracks
 
int eTSDau
 Daughter track search. More...
 
int eTSDau2
 Daughter track search. 2nd (after microtrack search) More...
 
TH1F * eTSDauIPHist1
 Histgram for IP function along dz. More...
 
TH1F * eTSDauIPHist2
 Histgram for IP function along dz. More...
 
int eTSDauNseg
 Nseg cut for Daughter tracks. More...
 
int eTSDauNseg2
 Nseg cut for Daughter tracks. 2nd. More...
 
double eTSDauPH
 PH cut for Daughter tracks. More...
 
int eTSPar
 Parent track search. More...
 
double eTSParIP
 IP cut for Parent tracks. More...
 
int eTSParNseg
 Nseg cut for Parent tracks. More...
 
double eTSParPH
 PH cut for Parent tracks. More...
 
int eTSParPlate
 nPlate to be searched for Parent tracks. eTSParPlate==1:vertex-plate only. eTSParPlate==2:vertex-plate+1plate... More...
 
EdbVertexeVertex
 
int eVertexPlatePID
 vertex plate. 1st stream plate from vertex More...
 
TObjArray * eVertices
 
int eVtxUp
 Search Upstream vertex if the ntrk of selected vertex <=3. More...
 
int eVtxUpDZ
 dz from selected vertex and upstream vertex to be searched. More...
 
int eVtxUpIP
 Ip cut from the tracks belong to the selected vertex. More...
 

Detailed Description

Decay Search class.

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
IP cut for Parent tracks.
Definition: EdbDecaySearch.h:247
TH1F * eTSDauIPHist2
Histgram for IP function along dz.
Definition: EdbDecaySearch.h:237
int eBTPlateDown
nplates downstream for Basetrack Search
Definition: EdbDecaySearch.h:253
int eMT2seg
Microtrack search for 2 segment.
Definition: EdbDecaySearch.h:232
int eSmallKink
Small-Kink search.
Definition: EdbDecaySearch.h:239
int eTSParPlate
nPlate to be searched for Parent tracks. eTSParPlate==1:vertex-plate only. eTSParPlate==2:vertex-plat...
Definition: EdbDecaySearch.h:245
int eBTPlateUp
nplates upstream or Basetrack search
Definition: EdbDecaySearch.h:252
int eVtxUpIP
Ip cut from the tracks belong to the selected vertex.
Definition: EdbDecaySearch.h:259
int eTSDau
Daughter track search.
Definition: EdbDecaySearch.h:227
double eKinkSigma
Definition: EdbDecaySearch.h:264
int eVtxUpDZ
dz from selected vertex and upstream vertex to be searched.
Definition: EdbDecaySearch.h:258
int eTSPar
Parent track search.
Definition: EdbDecaySearch.h:244
TObjArray * eVertices
Definition: EdbDecaySearch.h:223
int eTSDauNseg
Nseg cut for Daughter tracks.
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
Search Upstream vertex if the ntrk of selected vertex <=3.
Definition: EdbDecaySearch.h:257
int eKinkSearch
Definition: EdbDecaySearch.h:263
double eTSDauPH
PH cut for Daughter tracks.
Definition: EdbDecaySearch.h:229
int eTSDau2
Daughter track search. 2nd (after microtrack search)
Definition: EdbDecaySearch.h:235
int eMTAll
Microtrack search to fill holes and upstream, downstream.
Definition: EdbDecaySearch.h:233
double eBTPH
PH cut for Basetrack.
Definition: EdbDecaySearch.h:255
double eTSParPH
PH cut for Parent tracks.
Definition: EdbDecaySearch.h:248
int eDSVer
Definition: EdbDecaySearch.h:215
int eTSParNseg
Nseg cut for Parent tracks.
Definition: EdbDecaySearch.h:246
int eShortDecay
Definition: EdbDecaySearch.h:269
double eBTIP
IP cut for Basetrack.
Definition: EdbDecaySearch.h:254
EdbVertex * eVertex
Definition: EdbDecaySearch.h:217
TH1F * eTSDauIPHist1
Histgram for IP function along dz.
Definition: EdbDecaySearch.h:230
float eSmallKinkRmin
Definition: EdbDecaySearch.h:241
int eBT
Basetrack search.
Definition: EdbDecaySearch.h:251
TObjArray * eDecayVertices
Definition: EdbDecaySearch.h:266
int eTSDauNseg2
Nseg cut for Daughter tracks. 2nd.
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)

Search kink. return TObjArray of EdbSmallKink

153 {
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
EdbPVRec * ePVR
Definition: EdbDecaySearch.h:224
General decay vertex.
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:273
Int_t Plate() const
Definition: EdbPattern.h:327
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
Definition: EdbSegP.h:21
Int_t ID() const
Definition: EdbSegP.h:147
Int_t Plate() const
Definition: EdbSegP.h:159
Int_t PID() const
Definition: EdbSegP.h:148
Float_t Z() const
Definition: EdbPattern.h:84
test
Definition: EdbDecaySearch.h:155
Tracks with DecaySearch information.
Definition: EdbDecaySearch.h:8
Definition: EdbPattern.h:113
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:214
Int_t N() const
Definition: EdbPattern.h:177
void Clear()
Definition: EdbPattern.h:264
void SetCounters()
Definition: EdbPattern.h:159
Definition: EdbVertex.h:69
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
TTree * t
Definition: check_shower.C:4
void td()
Definition: check_vertex.C:168
EdbSegP * s1
Definition: tlg2couples.C:29
EdbSegP * s2
Definition: tlg2couples.C:30
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

◆ CheckInTrackKinks()

TObjArray * EdbDecaySearch::CheckInTrackKinks ( TObjArray *  tracks = NULL)
inline
395 {
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 ( )

Do track search

313 {
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;
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
vertex plate. 1st stream plate from vertex
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 ( )

Find Best Vertex.
select best one from pvr->eVertex

675 {
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
Int_t Nvtx() const
Definition: EdbPVRec.h:255
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Float_t Z() const
Definition: EdbSegP.h:153
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
Int_t N() const
Definition: EdbVertex.h:121
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:189
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
s
Definition: check_shower.C:55

◆ GetDecayVertex()

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

◆ GetIPCut()

float EdbDecaySearch::GetIPCut ( EdbVertex v,
EdbSegP s 
)

calculate IP cut for given 1ry vertex and segment.
if segment is BT, Z of segment is assumed Z=s->Z()-150;
otherwise, use s->Z();

794 {
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}
Double_t Z
Definition: tlg2couples.C:104

◆ 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);
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);
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
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:190
EdbVertex * CalcVertex(TObjArray *segments)
calc vertex from the segments array (EdbSegP*)
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}
Definition: EdbVertex.h:26
void SetImp(float imp)
Definition: EdbVertex.h:57
void SetZpos(int zpos)
Definition: EdbVertex.h:55
void SetFlag(int flag)
Definition: EdbVertex.h:56
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:355
void SetID(int ID=0)
Definition: EdbVertex.h:156

◆ MTSearch2seg()

void EdbDecaySearch::MTSearch2seg ( TObjArray *  tracks)

Microtrack search for 2 segment track.
if eSet is not set, do nothing.

if eSet==NULL or Preparation is failed, do nothing.

276 {
279
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)

Microtrack search for all tracks.
if eSet is not set, do nothing.

if eSet==NULL or Preparation is failed, do nothing.

293 {
296
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:319

◆ 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}
EdbDecayVertex * GetDecayVertex(int i)
Definition: EdbDecaySearch.h:385
int NDecayVertices()
Definition: EdbDecaySearch.h:384
float GetIPCut(EdbVertex *v, EdbSegP *s)
Definition: EdbDecaySearch.C:794
EdbVertex * GetPrimaryVertex()
Definition: EdbDecaySearch.h:143
@ kShort
Definition: EdbDecaySearch.h:126
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)

Search Tracks and set eTracks. return TObjArray filled with selected segments.

598 {
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}
Int_t N() const
Definition: EdbPattern.h:86
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)

Search Tracks and set eTracks. return TObjArray filled with selected tracks.

460 {
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}
double GetTSDauIP1(double dz)
Definition: EdbDecaySearch.C:116
EdbTrackDS * FindTrack(EdbTrackP *t)
Definition: EdbDecaySearch.h:375

◆ TSDaughterTracks2()

void EdbDecaySearch::TSDaughterTracks2 ( )

Filter 2segment tracks after microtrack search. sevior dz cut will be applied.

515 {
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)

Search Tracks and set eTracks. return TObjArray filled with selected tracks.

545 {
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

Basetrack search.

◆ eBTIP

double EdbDecaySearch::eBTIP

IP cut for Basetrack.

◆ eBTPH

double EdbDecaySearch::eBTPH

PH cut for Basetrack.

◆ eBTPlateDown

int EdbDecaySearch::eBTPlateDown

nplates downstream for Basetrack Search

◆ eBTPlateUp

int EdbDecaySearch::eBTPlateUp

nplates upstream or Basetrack search

◆ eDecayVertices

TObjArray* EdbDecaySearch::eDecayVertices

◆ eDSVer

int EdbDecaySearch::eDSVer

◆ eKinks

TObjArray* EdbDecaySearch::eKinks

◆ eKinkSearch

int EdbDecaySearch::eKinkSearch

◆ eKinkSigma

double EdbDecaySearch::eKinkSigma

◆ eMT2seg

int EdbDecaySearch::eMT2seg

Microtrack search for 2 segment.

◆ eMTAll

int EdbDecaySearch::eMTAll

Microtrack search to fill holes and upstream, downstream.

◆ ePVR

EdbPVRec* EdbDecaySearch::ePVR

◆ eSegments

TObjArray* EdbDecaySearch::eSegments

◆ eShortDecay

int EdbDecaySearch::eShortDecay

◆ eSmallKink

int EdbDecaySearch::eSmallKink

Small-Kink search.

◆ eSmallKinkNpl

int EdbDecaySearch::eSmallKinkNpl

◆ eSmallKinkRmin

float EdbDecaySearch::eSmallKinkRmin

◆ eTracks

TObjArray* EdbDecaySearch::eTracks

◆ eTSDau

int EdbDecaySearch::eTSDau

Daughter track search.

◆ eTSDau2

int EdbDecaySearch::eTSDau2

Daughter track search. 2nd (after microtrack search)

◆ eTSDauIPHist1

TH1F* EdbDecaySearch::eTSDauIPHist1

Histgram for IP function along dz.

◆ eTSDauIPHist2

TH1F* EdbDecaySearch::eTSDauIPHist2

Histgram for IP function along dz.

◆ eTSDauNseg

int EdbDecaySearch::eTSDauNseg

Nseg cut for Daughter tracks.

◆ eTSDauNseg2

int EdbDecaySearch::eTSDauNseg2

Nseg cut for Daughter tracks. 2nd.

◆ eTSDauPH

double EdbDecaySearch::eTSDauPH

PH cut for Daughter tracks.

◆ eTSPar

int EdbDecaySearch::eTSPar

Parent track search.

◆ eTSParIP

double EdbDecaySearch::eTSParIP

IP cut for Parent tracks.

◆ eTSParNseg

int EdbDecaySearch::eTSParNseg

Nseg cut for Parent tracks.

◆ eTSParPH

double EdbDecaySearch::eTSParPH

PH cut for Parent tracks.

◆ eTSParPlate

int EdbDecaySearch::eTSParPlate

nPlate to be searched for Parent tracks. eTSParPlate==1:vertex-plate only. eTSParPlate==2:vertex-plate+1plate...

◆ eVertex

EdbVertex* EdbDecaySearch::eVertex

◆ eVertexPlatePID

int EdbDecaySearch::eVertexPlatePID

vertex plate. 1st stream plate from vertex

◆ eVertices

TObjArray* EdbDecaySearch::eVertices

◆ eVtxUp

int EdbDecaySearch::eVtxUp

Search Upstream vertex if the ntrk of selected vertex <=3.

◆ eVtxUpDZ

int EdbDecaySearch::eVtxUpDZ

dz from selected vertex and upstream vertex to be searched.

◆ eVtxUpIP

int EdbDecaySearch::eVtxUpIP

Ip cut from the tracks belong to the selected vertex.


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