FEDRA emulsion software from the OPERA Collaboration
EdbTrackAssembler Class Reference

#include <EdbScanTracking.h>

Inheritance diagram for EdbTrackAssembler:
Collaboration diagram for EdbTrackAssembler:

Public Member Functions

bool AcceptDZGap (EdbTrackP &t, float z)
 
void AddPattern (EdbPattern &p)
 
EdbTrackPAddSegment (EdbSegP &s)
 
EdbTrackPAddSegmentAsTrack (EdbSegP &s)
 
void CheckPatternAlignment (EdbPattern &p, EdbPlateP &plate, int nsegmin, EdbAffine2D &acorr)
 
void CombTracks (TObjArray &selected)
 
void DoubletsFilterOut (EdbPattern &p)
 
 EdbTrackAssembler ()
 
void ExtrapolateTracksToZ (float z, int nsegmin=0)
 
void ExtrapolateTracksToZ_mcs3 (float z, int nsegmin=0)
 
void FillTrZMap ()
 
void FillXYseg (EdbPattern &p)
 
void FitTracks ()
 
void InitTrZMap ()
 
void InitTrZMap (const char *str)
 
void InitTrZMap (int nx, float xmi, float xma, int ny, float ymi, float yma, int ncell)
 
float ProbSeg (EdbSegP &s1, EdbSegP &s2)
 
void RecalculateSegmentsProb (EdbTrackP &t)
 
bool SameSegment (EdbSegP &s1, EdbSegP &s2)
 
void SetMomentum (float p)
 
void SetRadLength (float x0)
 
void SetSegmentsErrors ()
 
TObjArray & Tracks ()
 
virtual ~EdbTrackAssembler ()
 

Public Attributes

int eCollisionsRate
 
EdbScanCond eCond
 
int eDoUseMCS
 
float eDRmax
 
float eDTmax
 
float eDZGapMax
 
TH1F * eHistNcnd
 
TH1F * eHistProbAll
 
TH1F * eHistProbBest
 
TH1F * eHistThetaAll
 
TH1F * eHistThetaBest
 
TH2F * eHistTXTYseg
 
TH3F * eHistXYPseg
 
TH3F * eHistXYPsegNB
 
TH2F * eHistXYseg
 
float eProbMin
 

Private Attributes

Int_t eCellN
 
EdbTrackFitter eFitter
 
Float_t eMapMarg
 
EdbPattern eSegments
 
TObjArray eTracks
 
TObjArray eTrZ
 
EdbCell2 eTrZMap
 
Float_t eZ
 

Constructor & Destructor Documentation

◆ EdbTrackAssembler()

EdbTrackAssembler::EdbTrackAssembler ( )
38 {
39  eMapMarg = 50.; // [microns]
40  eZ = 0;
41  eCellN=10; //mean n/cell
42  eDTmax=0.07;
43  eDRmax=45.;
44  eDZGapMax = 5000;
45  eProbMin = 0.001;
47 
48  eHistNcnd = new TH1F("Ncnd","number of candidates after preliminary selection", 20,0.5,20.5);
49  eHistProbBest = new TH1F("ProbBest","prob for best selected candidate", 250,0,1);
50  eHistProbAll = new TH1F("ProbAll","prob for all candidates", 250,0,1);
51  eHistThetaBest = new TH1F("ThetaBest","angle theta for best selected candidate", 180,0,TMath::PiOver2());
52  eHistThetaAll = new TH1F("ThetaAll","angle theta for all candidates", 180,0,TMath::PiOver2());
53  eHistXYseg=0;
54  eHistXYPseg=0; // all segments
55  eHistXYPsegNB=0; // no-beam (thetaMin=0.02, thetaMax=0.5)
56  eHistTXTYseg=0;
57 
58  // for basetracks:
59  eCond.SetDefault();
60  eCond.SetSigma0( 4, 4, 0.005, 0.005 );
61  eCond.SetPulsRamp0(14., 21.);
62  eCond.SetPulsRamp04(14., 21.);
63 }
void SetDefault()
Definition: EdbScanCond.cxx:16
void SetPulsRamp0(float p1, float p2)
Definition: EdbScanCond.h:74
void SetSigma0(float x, float y, float tx, float ty)
Definition: EdbScanCond.h:62
void SetPulsRamp04(float p1, float p2)
Definition: EdbScanCond.h:75
TH2F * eHistTXTYseg
Definition: EdbScanTracking.h:60
TH3F * eHistXYPsegNB
Definition: EdbScanTracking.h:59
TH2F * eHistXYseg
Definition: EdbScanTracking.h:57
TH1F * eHistNcnd
Definition: EdbScanTracking.h:56
EdbScanCond eCond
Definition: EdbScanTracking.h:50
TH1F * eHistProbBest
Definition: EdbScanTracking.h:52
Float_t eZ
Definition: EdbScanTracking.h:34
Int_t eCellN
Definition: EdbScanTracking.h:38
TH3F * eHistXYPseg
Definition: EdbScanTracking.h:58
Float_t eMapMarg
Definition: EdbScanTracking.h:37
TH1F * eHistThetaAll
Definition: EdbScanTracking.h:55
float eDZGapMax
Definition: EdbScanTracking.h:45
TH1F * eHistThetaBest
Definition: EdbScanTracking.h:54
TH1F * eHistProbAll
Definition: EdbScanTracking.h:53
float eProbMin
Definition: EdbScanTracking.h:46
float eDRmax
Definition: EdbScanTracking.h:44
float eDTmax
Definition: EdbScanTracking.h:43
int eCollisionsRate
Definition: EdbScanTracking.h:49

◆ ~EdbTrackAssembler()

virtual EdbTrackAssembler::~EdbTrackAssembler ( )
virtual

Member Function Documentation

◆ AcceptDZGap()

bool EdbTrackAssembler::AcceptDZGap ( EdbTrackP t,
float  z 
)
409 {
410  float z1 = t.GetSegmentFirst()->Z();
411  float z2 = t.GetSegmentLast()->Z();
412  if(Min( Abs(z1-z), Abs(z2-z)) > eDZGapMax ) return false;
413  return true;
414 }
TTree * t
Definition: check_shower.C:4

◆ AddPattern()

void EdbTrackAssembler::AddPattern ( EdbPattern p)
183 {
184  //int ntrBefore=eTracks.GetEntriesFast();
185  //if(ntrBefore>0) ExtrapolateTracksToZ(p.Z());
186 
187  //DoubletsFilterOut();
188  int nseg = p.N();
189  Log(3,"EdbTrackAssembler::AddPattern","try to add %d segments",p.N());
190  int attached=0;
191  for(int j=0; j<nseg; j++) {
192  EdbSegP *s = p.GetSegment(j);
193  if(s->Flag()==-10) continue;
194  s->SetErrors();
195  eCond.FillErrorsCov(s->TX(),s->TY(),s->COV());
196  if( !AddSegment( *s ) )
197  AddSegmentAsTrack( *s );
198  else {
199  attached++;
200  s->SetTrack(1);
201  }
202  }
203  // calculate lost segments
204  int losttrack=0;
205  int lostflag=0;
206  for(int j=0; j<nseg; j++) {
207  EdbSegP *s = p.GetSegment(j);
208  if(s->Flag()!=-10)
209  {
210  if(s->Track()==-1) losttrack++;
211  } else lostflag++;
212  //AddSegmentAsTrack( *(p.GetSegment(j)) );
213  }
214  int ntrAfter = eTracks.GetEntriesFast();
215  //int totSegTr=0;
216  //for(int i=0; i<ntrAfter; i++) totSegTr += ((EdbTrackP*)(eTracks.At(i)))->N();
217  Log(2,"EdbTrackAssembler::AddPattern","with z=%10.2f %d/%d attached/tried; collisions/lt/lf: %d/%d/%d; tracks: %d",
218  p.Z(), attached, nseg, eCollisionsRate,losttrack,lostflag, ntrAfter );
219  eCollisionsRate=0;
220 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
void FillErrorsCov(float tx, float ty, TMatrixD &cov)
Definition: EdbScanCond.cxx:161
Definition: EdbSegP.h:18
Int_t Track() const
Definition: EdbSegP.h:147
void SetErrors()
Definition: EdbSegP.h:89
TMatrixD & COV() const
Definition: EdbSegP.h:120
Float_t TX() const
Definition: EdbSegP.h:172
void SetTrack(int trid)
Definition: EdbSegP.h:128
Float_t TY() const
Definition: EdbSegP.h:173
Int_t Flag() const
Definition: EdbSegP.h:146
TObjArray eTracks
Definition: EdbScanTracking.h:31
EdbTrackP * AddSegmentAsTrack(EdbSegP &s)
Definition: EdbScanTracking.cxx:357
EdbTrackP * AddSegment(EdbSegP &s)
Definition: EdbScanTracking.cxx:223
p
Definition: testBGReduction_AllMethods.C:8
EdbSegP * s
Definition: tlg2pattern.C:32

◆ AddSegment()

EdbTrackP * EdbTrackAssembler::AddSegment ( EdbSegP s)
224 {
225  TObjArray trsel;
226  float v[2] = { s.X(), s.Y() };
227  int nsel = eTrZMap.SelectObjectsC( v, eDRmax, trsel );
228 // int nsel = eTrZMap.SelectObjectsC( v, eDRmax+50 , trsel );
229  Log(4,"EdbTrackAssembler::AddSegment", "nsel = %d",nsel);
230  if(!nsel) {
231  return 0; }
232  float prob, probmax = eProbMin;
233  EdbSegP *ssbest = 0;
234  int ncnd = 0;
235  for(int i=0; i<nsel; i++) {
236  EdbSegP *ss = (EdbSegP*)(trsel.At(i));
237  prob = ProbSeg( *ss, s );
238  Log(4,"EdbTrackAssembler::AddSegment", "prob(probmin) = %f (%f) ",prob, eProbMin);
239  if(prob<eProbMin) continue;
240  ncnd++;
241  if(eHistProbAll) eHistProbAll->Fill(prob);
242  if(eHistThetaAll) eHistThetaAll->Fill(ATan(ss->Theta()));
243  if( prob > probmax ) { ssbest = ss; probmax=prob; }
244  }
245  if(!ssbest) return 0;
246  s.SetProb(probmax);
247  if(eHistNcnd) eHistNcnd->Fill(ncnd);
248  if(eHistProbBest) eHistProbBest->Fill(probmax);
249  if(eHistThetaBest) eHistThetaBest->Fill(ATan(ssbest->Theta()));
250  EdbTrackP *t = (EdbTrackP*)(ssbest);
251  EdbSegP *sz = t->GetSegmentWithClosestZ( t->Z(), 45. );
252  if(!sz) t->AddSegment( eSegments.AddSegment(s) );
253  else {
254  if( !SameSegment(s,*sz) ) {
255  if( s.Prob() > sz->Prob() ) t->SubstituteSegment( sz , eSegments.AddSegment(s) );
256  sz->SetTrack(-1);
257  eCollisionsRate++;
258  }
259  }
260  return t;
261 }
int SelectObjectsC(int iv[2], int ir[2], TObjArray &arr)
Definition: EdbCell2.cpp:766
Float_t Prob() const
Definition: EdbSegP.h:153
void SetProb(float prob)
Definition: EdbSegP.h:131
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
Float_t Theta() const
Definition: EdbSegP.h:181
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:71
EdbCell2 eTrZMap
Definition: EdbScanTracking.h:36
EdbPattern eSegments
Definition: EdbScanTracking.h:30
bool SameSegment(EdbSegP &s1, EdbSegP &s2)
Definition: EdbScanTracking.cxx:264
float ProbSeg(EdbSegP &s1, EdbSegP &s2)
Definition: EdbScanTracking.cxx:284
Definition: EdbPattern.h:118
ss
Definition: energy.C:62

◆ AddSegmentAsTrack()

EdbTrackP * EdbTrackAssembler::AddSegmentAsTrack ( EdbSegP s)
358 {
359  EdbTrackP *t = new EdbTrackP( eSegments.AddSegment(s), 0.139); // EdbTrackAssembler is owner of segments
360  s.SetTrack(0);
361  eTracks.Add(t);
362  return t;
363 }

◆ CheckPatternAlignment()

void EdbTrackAssembler::CheckPatternAlignment ( EdbPattern p,
EdbPlateP plate,
int  nsegmin,
EdbAffine2D acorr 
)
78 {
79  Log(0,"EdbTrackAssembler::CheckPatternAlignment","%s with %d segments",p.ScanID().AsString(),p.N());
80 
82  else ExtrapolateTracksToZ( p.Z(), nsegmin);
83  int ntr = eTrZ.GetEntriesFast();
84  EdbPattern ptr( 0, 0, p.Z(), ntr );
85  for(int i=0; i<ntr; i++) ptr.AddSegment( *((EdbSegP*)(eTrZ.UncheckedAt(i))) );
86 
88  //al.InitOutputFile(Form("%s_real.root",p.ScanID().AsString()));
89  al.SetSigma( 1.5, 0.003 );
90  al.eOffsetMax = 100.;
91  al.eDZ = 0;
92  al.eDPHI = 0.00;
93  al.SetDoublets(0.3,0.3,0.001,0.001);
94  //al.eDoCoarse=1;
95 
96  p.Transform(&acorr);
97  plate.GetAffineXY()->Transform(&acorr);
98 
99  al.Align(ptr,p,0);
100 
101  EdbAffine2D *aff = al.eCorrL[0].GetAffineXY();
102  aff->Invert();
103  aff->Print();
104  acorr.Transform(aff);
105  p.Transform(aff);
106  plate.GetAffineXY()->Transform(aff);
107 
108  EdbAffine2D *afftxty = al.eCorrL[0].GetAffineTXTY();
109  afftxty->Invert();
110  afftxty->Print();
111  p.TransformA(afftxty);
112  plate.GetAffineTXTY()->Transform(afftxty);
113 }
Definition: EdbAffine.h:17
void Invert()
Definition: EdbAffine.cxx:103
void Print(Option_t *opt="") const
Definition: EdbAffine.cxx:52
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
EdbLayer eCorrL[2]
Definition: EdbAlignmentV.h:25
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121
Definition: EdbPattern.h:280
Definition: EdbPlateAlignment.h:8
Float_t eOffsetMax
Definition: EdbPlateAlignment.h:12
void SetSigma(float spos, float sang)
Definition: EdbPlateAlignment.h:56
void SetDoublets(float dx, float dy, float dtx, float dty)
Definition: EdbPlateAlignment.h:57
Float_t eDZ
Definition: EdbPlateAlignment.h:14
Float_t eDPHI
Definition: EdbPlateAlignment.h:15
void Align(EdbPattern &p1, EdbPattern &p2, float dz, int flag=0)
Definition: EdbPlateAlignment.cxx:62
void ExtrapolateTracksToZ(float z, int nsegmin=0)
Definition: EdbScanTracking.cxx:390
int eDoUseMCS
Definition: EdbScanTracking.h:47
void ExtrapolateTracksToZ_mcs3(float z, int nsegmin=0)
Definition: EdbScanTracking.cxx:366
TObjArray eTrZ
Definition: EdbScanTracking.h:32
Int_t plate
Definition: merge_Energy_SytematicSources_Electron.C:1
int nsegmin
Definition: check_vertex.C:23

◆ CombTracks()

void EdbTrackAssembler::CombTracks ( TObjArray &  selected)
501 {
502  // eliminate crossing&overlapping tracks with multiple segments usage
503 
504  int nsegMin=2;
505  int nGapMax=50;
506 
507  int ntr = eTracks.GetEntriesFast();
508  Log(3,"EdbTrackAssembler::CombTracks","Comb %d tracks");
509 
510  // *** sort tracks by quality
511 
512  TIndexCell cn; //"nseg:prob:entry"
513  Long_t v[3];
514 
515  int nsegtot=0;
516  EdbTrackP *tr=0;
517  for(int i=0; i<ntr; i++) {
518  tr = (EdbTrackP*)(eTracks.At(i));
519  if( tr->Flag() == -10 ) continue;
520  if( tr->N() < nsegMin ) continue;
521  tr->SetID(i);
522  tr->SetCounters();
523  nsegtot += tr->SetSegmentsTrack(-1);
524  v[0]= -(tr->N());
525  v[1]= (Long_t)((1.-tr->Prob())*100);
526  v[2]= i;
527  cn.Add(3,v);
528  }
529  cn.Sort();
530 
531  Log(3,"EdbTrackAssembler::CombTracks","%d tracks with %d segments for processing...",ntr,nsegtot);
532 
533  // *** set track ID for segments attached to
534 
535  TIndexCell *cp=0, *c=0;
536  int nn=cn.GetEntriesFast();
537  for(int i=nn-1; i>=0; i--) {
538  cp = cn.At(i); // tracks with fixed npl
539  int np = cp->GetEntriesFast();
540  for(int ip=np-1; ip>=0; ip--) {
541  c = cp->At(ip); // tracks with fixed Npl & Prob
542  int nt = c->GetEntriesFast();
543  for(int it=0; it<nt; it++) {
544  tr = (EdbTrackP*)(eTracks.At( c->At(it)->Value() ) );
545  tr->SetSegmentsTrack();
546  }
547  }
548  }
549 
550 
551  cp=0; c=0;
552  nn=cn.GetEntriesFast();
553  for(int i=0; i<nn; i++) {
554  cp = cn.At(i); // tracks with fixed npl
555 
556  int np = cp->GetEntriesFast();
557  for(int ip=0; ip<np; ip++) {
558  c = cp->At(ip); // tracks with fixed Npl & Prob
559 
560  int nt = c->GetEntriesFast();
561  for(int it=0; it<nt; it++) {
562 
563  tr = (EdbTrackP*)(eTracks.At( c->At(it)->Value() ) );
564 
565  if(tr->RemoveAliasSegments()>0){
566  if(tr->N()<nsegMin) tr->SetFlag(-10);
567  if(tr->CheckMaxGap()>nGapMax) tr->SetFlag(-10);
568  }
569 
570  if( tr->Flag() != -10 ) selected.Add(tr);
571  }
572  }
573  }
574 
575 }
int nsegMin
Definition: RecDispEX.C:19
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
Definition: TIndexCell.h:19
Int_t GetEntriesFast() const
Definition: TIndexCell.h:82
TIndexCell const * At(Int_t narg, Int_t vind[]) const
Definition: TIndexCell.cpp:519
void Sort(Int_t upto=kMaxInt)
Definition: TIndexCell.cpp:539
Int_t Add(Int_t narg, Long_t varg[])
Definition: TIndexCell.cpp:602
EdbSegCouple * cp
Definition: tlg2pattern.C:29

◆ DoubletsFilterOut()

void EdbTrackAssembler::DoubletsFilterOut ( EdbPattern p)
67 {
68  EdbAlignmentV adup;
69  adup.eDVsame[0]=adup.eDVsame[1]=10.;
70  adup.eDVsame[2]=adup.eDVsame[3]=0.08;
71  adup.FillGuessCell(p,p,1.);
72  adup.FillCombinations();
73  adup.DoubletsFilterOut(0); // assign flag -10 to the duplicated segments
74 }
Definition: EdbAlignmentV.h:13
Float_t eDVsame[4]
Definition: EdbAlignmentV.h:16
int DoubletsFilterOut(int checkview, TH2F *hxy=0, TH2F *htxty=0)
Definition: EdbAlignmentV.cxx:83
void FillGuessCell(EdbPattern &p1, EdbPattern &p2, float binOK=1., float offsetMax=2000.)
Definition: EdbAlignmentV.cxx:919
int FillCombinations()
Definition: EdbAlignmentV.cxx:234

◆ ExtrapolateTracksToZ()

void EdbTrackAssembler::ExtrapolateTracksToZ ( float  z,
int  nsegmin = 0 
)
391 {
392  eTrZ.Clear();
394 
395  eZ=z;
396  int n=eTracks.GetEntriesFast();
397  for(int i=0; i<n; i++) {
398  EdbTrackP *t = (EdbTrackP*)(eTracks.At(i));
399 
400  if( t->N() < nsegmin ) continue;
401  if( !AcceptDZGap(*t, z) ) continue;
402  t->MakePredictionTo(eZ,*t); // keep the same behaviour as before: propagation with angle
403  eTrZ.Add(t);
404  }
405 }
void CleanCells()
Definition: EdbCell2.cpp:115
bool AcceptDZGap(EdbTrackP &t, float z)
Definition: EdbScanTracking.cxx:408

◆ ExtrapolateTracksToZ_mcs3()

void EdbTrackAssembler::ExtrapolateTracksToZ_mcs3 ( float  z,
int  nsegmin = 0 
)
367 {
368  eTrZ.Clear();
370 
371  eZ=z;
372  int n=eTracks.GetEntriesFast();
373  for(int i=0; i<n; i++) {
374  EdbTrackP *t = (EdbTrackP*)(eTracks.At(i));
375  t->EstimatePositionAt(eZ,*t); //use angles if 1 seg, overwise use coordinates, t->DZ() - is gap
376  }
377 
378  for(int i=0; i<n; i++)
379  {
380  EdbTrackP *t = (EdbTrackP*)(eTracks.At(i));
381  if( Abs(t->DZ()) > eDZGapMax ) continue;
382  if( t->N()<nsegmin ) continue;
383  eTrZ.Add(t);
384  }
385  Log(2,"EdbTrackAssembler::ExtrapolateTracksToZ_mcs3","at z = %f nsegmin=%d %d => %d",
386  z,nsegmin, n, eTrZ.GetEntriesFast() );
387 }

◆ FillTrZMap()

void EdbTrackAssembler::FillTrZMap ( )
418 {
419  int n=eTrZ.GetEntriesFast();
420  Log(3,"EdbTrackAssembler::FillTrZMap", "with %d tracks",n);
421  for(int i=0; i<n; i++) {
422  EdbSegP *s = (EdbSegP*)(eTrZ.At(i));
423  eTrZMap.AddObject( s->X(), s->Y(), s );
424  }
425  int nfill = eTrZMap.Integral();
426  Log(3,"EdbTrackAssembler::FillTrZMap", "integral = %d", nfill );
427  if( nfill != n) Log(1,"EdbTrackAssembler::FillTrZMap", "Warning! cell overflow: n = %d nfill = %d", n, nfill);
428 }
bool AddObject(float v[2], TObject *obj)
Definition: EdbCell2.h:176
Long_t Integral()
Definition: EdbCell2.cpp:226

◆ FillXYseg()

void EdbTrackAssembler::FillXYseg ( EdbPattern p)
117 {
118  // test function probably to be moved out of this class
119  float xmi=p.Xmin();
120  float xma=p.Xmax();
121  float ymi=p.Ymin();
122  float yma=p.Ymax();
123  if(!eHistXYseg)
124  {
125  float dx= xma-xmi;
126  float dy= yma-ymi;
127  float nx= 3*dx/50; //TODO: bin size as a parameter?
128  float ny= 3*dy/50;
129  eHistXYseg = new TH2F("XYseg", "XY overlap all beam-like segments used for tracking",
130  nx,xmi-dx,xma+dx,ny,ymi-dy,yma+dy );
131  }
132  if(!eHistXYPseg)
133  {
134  float dx= xma-xmi;
135  float dy= yma-ymi;
136  float nx= 3*dx/50; //TODO: bin size as a parameter?
137  float ny= 3*dy/50;
138  eHistXYPseg = new TH3F("XYPseg", "XYP overlap all beam-like segments used for tracking",
139  nx,xmi-dx,xma+dx,ny,ymi-dy,yma+dy,60,0,60);
140  eHistXYPsegNB = new TH3F("XYPsegNB", "XYP out of beam",
141  nx,xmi-dx,xma+dx,ny,ymi-dy,yma+dy,60,0,60);
142  }
143  if(!eHistTXTYseg)
144  {
145  eHistTXTYseg = new TH2F("TXTYseg", "TXTY overlap all beam-like segments used for tracking",
146  200,-1,1,200,-1,1 );
147  }
148  int plate = p.ScanID().ePlate;
149  int n=p.N();
150  //TArrayF x(n),y(n);
151  //int cnt=0;
152  float thetaMin=0.02, thetaMax=0.5;
153  for(int i=0; i<n; i++)
154  {
155  EdbSegP *s = p.GetSegment(i);
156  eHistTXTYseg->Fill(s->TX(),s->TY());
157  if(Abs(s->TX())<0.1&&Abs(s->TY())<0.1)
158  {
159  eHistXYseg->Fill(s->X(),s->Y());
160  eHistXYPseg->Fill(s->X(),s->Y(),plate);
161  if(s->Theta()>=thetaMin&&s->Theta()<=thetaMax) eHistXYPsegNB->Fill(s->X(),s->Y(),plate);
162  //x[cnt++]=s->X();
163  //y[cnt] =s->Y();
164  }
165  }
166 
167  //gROOT->SetBatch(true);
168  //TCanvas *c = new TCanvas("a","a",4000,4000);
169  //TGraph *gr = new TGraph(cnt,x.GetArray(),y.GetArray());
170  //gr->SetMarkerStyle(1);
171  //TH2F *hh = (TH2F*)(eHistXYseg->Clone("hh"));
172  //hh->Reset();
173  //hh->Draw();
174  //gr->Draw("P");
175  //c->Print("tt.gif+10");
176  //delete gr;
177  //delete c;
178  //delete hh;
179 }
int nx
Definition: emthickness.cpp:60
int ny
Definition: emthickness.cpp:62

◆ FitTracks()

void EdbTrackAssembler::FitTracks ( )
485 {
486  EdbTrackFitter fit;
487 
488  int ntr = eTracks.GetEntriesFast();
489  for( int i=0; i<ntr; i++ ) {
490  EdbTrackP *t = (EdbTrackP*)(eTracks.At(i));
491  if(t->Flag()==-10) continue;
492  int nseg=t->N();
493  t->FitTrackKFS(0,10000);
494  //fit.FitTrackLine(*t);
495  if(nseg>1) RecalculateSegmentsProb(*t);
496  }
497 }
void RecalculateSegmentsProb(EdbTrackP &t)
Definition: EdbScanTracking.cxx:275
Definition: EdbTrackFitter.h:16

◆ InitTrZMap() [1/3]

void EdbTrackAssembler::InitTrZMap ( )
451 {
452  /* float mi[2] = { eTrZ.Xmin()-eMapMarg, eTrZ.Ymin()-eMapMarg };
453  float ma[2] = { eTrZ.Xmax()+eMapMarg, eTrZ.Ymax()+eMapMarg };
454  float dens = eTrZ.N()/( (ma[0]-mi[0])*(ma[1]-mi[1]));
455  float step=10000;
456  if(dens>0.00000001) step = Sqrt( eCellN/dens );
457  int n[2] = { int((ma[0]-mi[0])/step)+1, int((ma[1]-mi[1])/step)+1 };
458  float stepX = (ma[0]-mi[0])/n[0];
459  float stepY = (ma[1]-mi[1])/n[1];
460  n[0] = int((ma[0]-mi[0]+1.)/stepX);
461  n[1] = int((ma[1]-mi[1]+1.)/stepY);
462  eTrZMap.InitCell(3*eCellN, n, mi, ma);*/
463 }

◆ InitTrZMap() [2/3]

void EdbTrackAssembler::InitTrZMap ( const char *  str)
432 {
433  int nx=0, ny=0, ncell=0;
434  float xmi,xma, ymi, yma;
435  sscanf(str,"%d %f %f %d %f %f %d",&nx,&xmi,&xma,&ny,&ymi,&yma,&ncell);
436  InitTrZMap( nx,xmi,xma,ny,ymi,yma,ncell );
437 }
void InitTrZMap()
Definition: EdbScanTracking.cxx:450

◆ InitTrZMap() [3/3]

void EdbTrackAssembler::InitTrZMap ( int  nx,
float  xmi,
float  xma,
int  ny,
float  ymi,
float  yma,
int  ncell 
)
442 {
443  float mi[2] = { xmi, ymi };
444  float ma[2] = { xma, yma };
445  int n[2] = { nx, ny };
446  eTrZMap.InitCell(ncell, n, mi, ma);
447 }
int InitCell(EdbCell2 &c)
Definition: EdbCell2.h:170

◆ ProbSeg()

float EdbTrackAssembler::ProbSeg ( EdbSegP s1,
EdbSegP s2 
)

workaround to get previous(not propagated) segment

285 {
286  // return the probability that the second segment can belong to track defined by s1
287  float dtx = s1.TX() - s2.TX();
288  if( Abs( dtx ) > eDTmax ) return 0;
289  float dty = s1.TY() - s2.TY();
290  if( Abs( dty ) > eDTmax ) return 0;
291  double dt2 = dtx*dtx + dty*dty;
292  if(dt2>eDTmax*eDTmax) return 0;
293 
294  float dz = s2.Z()-s1.Z();
295  float dx = s2.X() - (s1.X() + dz*s1.TX());
296  if( Abs( dx ) > eDRmax ) return 0;
297  float dy = s2.Y() - (s1.Y() + dz*s1.TY());
298  if( Abs( dy ) > eDRmax ) return 0;
299  double dr2 = dx*dx + dy*dy;
300  if(dr2>eDRmax*eDRmax) return 0;
301 
302  float prob=0;
303  if(eDoUseMCS==1){
305  EdbTrackP* t = dynamic_cast<EdbTrackP*> (&s1);
306  EdbSegP* seg = t?(const_cast<EdbSegP*>(t->TrackEnd())):0;
307  prob = seg?(eFitter.ProbSegMCS(seg, &s2)):0;
308  }
309  else if(eDoUseMCS==20) // test: why the option 2 is not selective and with 100% collision rate?
310  {
311  EdbTrackP* t = dynamic_cast<EdbTrackP*> (&s1);
312  EdbSegP* seg = t?(const_cast<EdbSegP*>(t->TrackEnd())):0;
313  if(seg) {
314  float prob1 = eFitter.ProbSegMCS(seg, &s2);
315  float chi2 = eFitter.Chi2Seg( seg, &s2 );
316 
317  EdbSegP s;
318  float chi3 = eFitter.Chi2PSeg( s1, s2, s, eCond, eCond );
319  float chi0 = eFitter.Chi2SegM( s1, s2, s, eCond, eCond );
320 
321  float prob0 = (float)TMath::Prob( chi0*chi0, 4);
322  float prob2 = (float)TMath::Prob( chi2*chi2, 4);
323  float prob3 = (float)TMath::Prob( chi3*chi3, 4);
324 
325  printf("prob0,prob1, prob2, prob3: %f %f %f %f \n", prob0,prob1, prob2, prob3 );
326  prob=prob2;
327  }
328  }
329  else if(eDoUseMCS==2)
330  {
331  EdbTrackP* t = dynamic_cast<EdbTrackP*> (&s1);
332  EdbSegP* seg = t?(const_cast<EdbSegP*>(t->TrackEnd())):0;
333  if(seg) {
334  float chi = eFitter.Chi2Seg( seg, &s2 );
335  prob = (float)TMath::Prob( chi*chi, 4);
336  }
337  }
338  else if(eDoUseMCS==3) // use coordinate information only (as for alignment)
339  {
340  EdbSegP s;
341  float chi = eFitter.Chi2PSeg( s1, s2, s, eCond, eCond );
342  prob = (float)TMath::Prob( chi*chi, 4);
343  }
344  else
345  {
346  EdbSegP s;
347  float chi = eFitter.Chi2SegM( s1, s2, s, eCond, eCond );
348  prob = (float)TMath::Prob( chi*chi, 4);
349  }
350 
351  prob *= eCond.ProbSeg( s2.Theta(), s2.W() ); // the probability component depending on the grains number
352  prob *= (float)TMath::Prob( s2.Chi2()*s2.Chi2(), 4 ); // the probability component depending on the segment strength
353  return prob;
354 }
T Prob(const T &rhs, int n)
Definition: Prob.hh:37
brick dz
Definition: RecDispMC.C:107
float ProbSeg(float tx, float ty, float puls) const
Definition: EdbScanCond.cxx:119
Float_t Chi2() const
Definition: EdbSegP.h:154
Float_t Z() const
Definition: EdbSegP.h:150
Float_t W() const
Definition: EdbSegP.h:148
EdbTrackFitter eFitter
Definition: EdbScanTracking.h:40
double ProbSegMCS(EdbSegP *s1, EdbSegP *s2)
Definition: EdbTrackFitter.cxx:287
float Chi2SegM(EdbSegP s1, EdbSegP s2, EdbSegP &s, EdbScanCond &cond1, EdbScanCond &cond2)
Definition: EdbTrackFitter.cxx:314
static float Chi2PSeg(EdbSegP &s1, EdbSegP &s2, EdbSegP &seg, EdbScanCond &cond1, EdbScanCond &cond2)
Definition: EdbTrackFitter.cxx:262
static float Chi2Seg(EdbSegP *s1, EdbSegP *s2)
Definition: EdbTrackFitter.cxx:62
Float_t chi2
Definition: testBGReduction_By_ANN.C:14
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ RecalculateSegmentsProb()

void EdbTrackAssembler::RecalculateSegmentsProb ( EdbTrackP t)
276 {
277  // assumed that track is fitted: reset the segmets probabilities
278  int n=tr.N();
279  for(int i=0; i<n; i++)
280  tr.GetSegment(i)->SetProb( ProbSeg( *(tr.GetSegmentF(i)), *(tr.GetSegment(i)) ) );
281 }

◆ SameSegment()

bool EdbTrackAssembler::SameSegment ( EdbSegP s1,
EdbSegP s2 
)
265 {
266  if( Abs( s1.X() - s2.X() ) <0.000001 &&
267  Abs( s1.Y() - s2.Y() ) <0.000001 &&
268  Abs( s1.TX()- s2.TX() ) <0.000001 &&
269  Abs( s1.TY()- s2.TY() ) <0.000001 &&
270  Abs( s1.W() - s2.W() ) <0.000001 ) return true;
271  return false;
272 }

◆ SetMomentum()

void EdbTrackAssembler::SetMomentum ( float  p)
inline
66 {eFitter.ePdef=p;}
float ePdef
Definition: EdbTrackFitter.h:24

◆ SetRadLength()

void EdbTrackAssembler::SetRadLength ( float  x0)
inline
67 {eFitter.eX0=x0; eCond.SetRadX0(x0);}
void SetRadX0(float x0)
Definition: EdbScanCond.h:57
float eX0
Definition: EdbTrackFitter.h:22

◆ SetSegmentsErrors()

void EdbTrackAssembler::SetSegmentsErrors ( )
467 {
468  int ntr = eTracks.GetEntriesFast();
469  for( int i=0; i<ntr; i++ ) {
470  EdbTrackP *t = (EdbTrackP*)(eTracks.At(i));
471  if(t->Flag()==-10) continue;
472  int nseg=t->N();
473  if(nseg>0) {
474  for(int j=0; j<nseg; j++) {
475  EdbSegP *s = t->GetSegment(j);
476  s->SetErrors();
477  eCond.FillErrorsCov(s->TX(),s->TY(),s->COV());
478  }
479  }
480  }
481 }

◆ Tracks()

TObjArray& EdbTrackAssembler::Tracks ( )
inline
91 {return eTracks;}

Member Data Documentation

◆ eCellN

Int_t EdbTrackAssembler::eCellN
private

◆ eCollisionsRate

int EdbTrackAssembler::eCollisionsRate

◆ eCond

EdbScanCond EdbTrackAssembler::eCond

◆ eDoUseMCS

int EdbTrackAssembler::eDoUseMCS

◆ eDRmax

float EdbTrackAssembler::eDRmax

◆ eDTmax

float EdbTrackAssembler::eDTmax

◆ eDZGapMax

float EdbTrackAssembler::eDZGapMax

◆ eFitter

EdbTrackFitter EdbTrackAssembler::eFitter
private

◆ eHistNcnd

TH1F* EdbTrackAssembler::eHistNcnd

◆ eHistProbAll

TH1F* EdbTrackAssembler::eHistProbAll

◆ eHistProbBest

TH1F* EdbTrackAssembler::eHistProbBest

◆ eHistThetaAll

TH1F* EdbTrackAssembler::eHistThetaAll

◆ eHistThetaBest

TH1F* EdbTrackAssembler::eHistThetaBest

◆ eHistTXTYseg

TH2F* EdbTrackAssembler::eHistTXTYseg

◆ eHistXYPseg

TH3F* EdbTrackAssembler::eHistXYPseg

◆ eHistXYPsegNB

TH3F* EdbTrackAssembler::eHistXYPsegNB

◆ eHistXYseg

TH2F* EdbTrackAssembler::eHistXYseg

◆ eMapMarg

Float_t EdbTrackAssembler::eMapMarg
private

◆ eProbMin

float EdbTrackAssembler::eProbMin

◆ eSegments

EdbPattern EdbTrackAssembler::eSegments
private

◆ eTracks

TObjArray EdbTrackAssembler::eTracks
private

◆ eTrZ

TObjArray EdbTrackAssembler::eTrZ
private

◆ eTrZMap

EdbCell2 EdbTrackAssembler::eTrZMap
private

◆ eZ

Float_t EdbTrackAssembler::eZ
private

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