FEDRA emulsion software from the OPERA Collaboration
EdbPVRec Class Reference

#include <EdbPVRec.h>

Inheritance diagram for EdbPVRec:
Collaboration diagram for EdbPVRec:

Public Member Functions

void AddCouple (EdbPatCouple *c)
 
EdbPatCoupleAddCouple (int id1, int id2)
 
void AddCouplesToTracks (EdbPatCouple *pc, TIndex2 &itracks)
 
void AddCouplesToTracksM (EdbPatCouple *pc, TIndex2 &itracks)
 
EdbSegPAddSegment (EdbSegP &s)
 
int AddSegments (EdbPVRec &ali)
 
int AddSegments (EdbTrackP &track)
 
void AddTrack (EdbTrackP *track)
 
void AddVertex (EdbVertex *vtx)
 
int Align (int alignFlag)
 
int AlignOld (int alignFlag)
 
int AlignPlates (EdbScanSet &sci, EdbScanSet &sca, const char *reportdir=0)
 
float Chi2Fast (EdbSegP &s1, EdbSegP &s2)
 
float Chi2Max () const
 
int CollectSegment (TIndexCell *ct, TIndexCell *cross)
 
int CollectSegment1 (TIndexCell *ct, THashList *cross)
 
int CombTracks (int nplmin, int ngapMax, float probMin=0.01)
 
void DeleteCouples ()
 
void DummyCycle ()
 
 EdbPVRec ()
 ============================================================================= More...
 
int ExtractDataVolumeSeg (EdbTrackP &tr, TObjArray &arr, float binx, float bint)
 
int ExtractDataVolumeSegAll (TObjArray &arr)
 
void FillCell (float stepx, float stepy, float steptx, float stepty)
 
void FillTracksCell ()
 
void FillTracksCell1 ()
 
void FillTracksCell2 ()
 
void FillTracksCellFast ()
 
EdbSegPFindSegment (int PlateID, int SegmentID) const
 
EdbTrackPFindTrack (int id) const
 
int FineCorrF (int ipat, EdbAffine2D &aff, EdbAffine2D &afft)
 
int FineCorrShr (int ipat, float &shr)
 
int FineCorrTXTY (int ipat, EdbAffine2D &aff)
 
int FineCorrXY (int ipat, EdbAffine2D &aff, int flag)
 
int FineCorrZ (int ipat, float &dz)
 
int FineCorrZnew ()
 
void FitTracks (float p=10., float mass=0.139, TObjArray *gener=0, int design=0)
 
EdbPatCoupleGetCouple (int i) const
 
EdbPatternGetPatternByPID (int pid)
 
EdbScanCond const * GetScanCond ()
 
EdbTrackPGetTrack (int i) const
 
TObjArray * GetTracks ()
 
TIndexCellGetTracksCell () const
 
EdbVertexGetVertex (Int_t &i)
 
TObjArray * GetVertices ()
 
int InsertHole (const EdbSegP *s1, const EdbSegP *s2, int pid)
 
void InsertTrack (const EdbTrackP &t)
 
int Link ()
 
int LinkSlow ()
 
int MakeHoles (int ort)
 
int MakeSummaryTracks ()
 
int MakeTracks (int nsegments=2, int flag=0)
 
int MergeTracks (int maxgap=2)
 
int MergeTracks1 (int maxgap)
 
Int_t Ncouples () const
 
Int_t NSeg ()
 
Int_t Ntracks () const
 
Int_t Nvtx () const
 
void PrintSummary ()
 
int PropagateTrack (EdbTrackP &tr, bool followZ, float probMin=0.05, int ngapMax=3, int design=0)
 
int PropagateTracks (int nplmax, int nplmin, float probMin=0.05, int ngapMax=3, int design=0)
 
void ResetCouples ()
 
void ResetTracks ()
 
int SelectLongTracks (int nsegments)
 
void SetBinsCheck (int nx, int ny, int ntx, int nty)
 
void SetChi2Max (float chi)
 
void SetCouples ()
 
void SetCouplesAll ()
 
void SetCouplesExclude (TArrayI &exclude)
 
void SetCouplesPeriodic (int istart, int iperiod)
 
void SetOffsetsMax (float ox, float oy)
 
void SetScanCond (EdbScanCond *scan)
 
void SetScanIDPatSeg (EdbID id)
 
void SetScanIDTrackSeg (EdbID id)
 
void SetSegmentErrors (EdbSegP &seg)
 
void SetSegmentProbability (EdbSegP &seg)
 
void SetSegmentsErrors ()
 
void SetSegmentsTracks ()
 
float Xmax ()
 
float Xmin ()
 
float Ymax ()
 
float Ymin ()
 
 ~EdbPVRec ()
 
- Public Member Functions inherited from EdbPatternsVolume
void AddPattern (EdbPattern *pat)
 
void AddPatternAt (EdbPattern *pat, int id)
 
void Centralize ()
 
void Centralize (float xc, float yc)
 
void DropCell ()
 
int DropCouples ()
 
 EdbPatternsVolume ()
 
 EdbPatternsVolume (EdbPatternsVolume &pvol)
 
int FindComplimentsVol (EdbSegP &s, TObjArray &arr, float nsig, float nsigt, int dpat)
 
EdbPatternGetPattern (int id) const
 
EdbPatternGetPatternByPID (int pid) const
 
EdbPatternGetPatternByPlate (int plate, int side)
 
EdbPatternGetPatternByZ (float z, float tolerance=5) const
 
EdbPatternGetPatternNext (float z, int dir) const
 
EdbPatternGetPatternPreceding (EdbPattern *pat) const
 
EdbPatternGetPatternSucceding (EdbPattern *pat) const
 
EdbPatternGetPatternZLowestHighest (Bool_t lowestZ=kTRUE) const
 
EdbSegPGetSegment (Long_t vid) const
 
EdbPatternInsertPattern (EdbPattern *pat, Bool_t descendingZ=0)
 
EdbPatternNextPattern (float z, int dir) const
 
Int_t Npatterns () const
 
void PassProperties (EdbPatternsVolume &pvol)
 
Int_t Pid (Long_t vid) const
 
void Print () const
 
void PrintAff () const
 
void PrintStat (EdbPattern &pat) const
 
void PrintStat (Option_t *opt="") const
 
void Set0 ()
 
void SetPatternsID ()
 
void SetXYZ (float x, float y, float z)
 
void Shift (float x, float y)
 
Int_t Sid (Long_t vid) const
 
void SortPatternsByZ (Bool_t descendingZ=0)
 
void Transform (const EdbAffine2D *aff)
 
Long_t Vid (int pid, int sid) const
 
Float_t X () const
 
Float_t Xmean ()
 
Float_t Y () const
 
Float_t Ymean ()
 
Float_t Z () const
 
virtual ~EdbPatternsVolume ()
 

Static Public Member Functions

static bool AttachSeg (EdbTrackP &tr, EdbSegP *s, const float X0, const float ProbMin, float &prob)
 
static double ProbeSeg (const EdbSegP *s1, EdbSegP *s2, const float X0=5810., const float mass=0.1396)
 
static double ProbeSeg (const EdbTrackP *s1, EdbSegP *s2, const float X0=5810.)
 
static double ProbeSeg (const EdbTrackP *s1, EdbTrackP *s2, const float X0=5810.)
 

Public Attributes

TObjArray * eTracks
 
TObjArray * eVTX
 
- Public Attributes inherited from EdbPatternsVolume
Bool_t eDescendingZ
 "pid:id1:chi2:id2" - all found couples More...
 
TObjArray * ePatterns
 
TIndexCellePatternsCell
 "vidt:vids" - connected segments cell More...
 
TIndexCelleTracksCell
 

Private Attributes

float eChi2Max
 
TObjArray * ePatCouples
 
EdbScanCondeScanCond
 
TIndexCelleTracksCell
 
Long_t eVdiff [4]
 

Constructor & Destructor Documentation

◆ EdbPVRec()

EdbPVRec::EdbPVRec ( )

=============================================================================

857 {
858  ePatCouples = new TObjArray();
859  eTracks = 0;
860  eVTX = 0;
861  eScanCond = 0;
862  eChi2Max=999.;
863  eVdiff[0]=eVdiff[1]=eVdiff[2]=eVdiff[3]=0;
864  eTracksCell = new TIndexCell();
865  gROOT->GetListOfSpecials()->Add(this);
866 }
Long_t eVdiff[4]
Definition: EdbPVRec.h:155
float eChi2Max
Definition: EdbPVRec.h:154
TIndexCell * eTracksCell
Definition: EdbPVRec.h:158
TObjArray * eVTX
Definition: EdbPVRec.h:162
TObjArray * ePatCouples
Definition: EdbPVRec.h:152
TObjArray * eTracks
Definition: EdbPVRec.h:161
EdbScanCond * eScanCond
Definition: EdbPVRec.h:156
Definition: TIndexCell.h:19

◆ ~EdbPVRec()

EdbPVRec::~EdbPVRec ( )

870 {
871 
872  if(ePatCouples) {
873  ePatCouples->Delete();
874  SafeDelete(ePatCouples);
875  }
876  if(eTracks) {
877  eTracks->Delete();
878  SafeDelete(eTracks);
879  }
880 // if(eVTX) {
881 // eVTX->Delete();
882 // SafeDelete(eVTX);
883 // }
884  SafeDelete(eTracksCell);
885  if (gROOT->GetListOfSpecials()->FindObject(this))
886  {
887  gROOT->GetListOfSpecials()->Remove(this);
888  }
889 }

Member Function Documentation

◆ AddCouple() [1/2]

void EdbPVRec::AddCouple ( EdbPatCouple c)
inline
177 { ePatCouples->Add(c); }

◆ AddCouple() [2/2]

EdbPatCouple * EdbPVRec::AddCouple ( int  id1,
int  id2 
)

916 {
917  EdbPatCouple *c = new EdbPatCouple();
918  c->SetID(id1,id2);
919  ePatCouples->Add(c);
920  return c;
921 }
Definition: EdbPVRec.h:27
void SetID(int id1, int id2)
Definition: EdbPVRec.h:62

◆ AddCouplesToTracks()

void EdbPVRec::AddCouplesToTracks ( EdbPatCouple pc,
TIndex2 itracks 
)
1400 {
1401  EdbTrackP *track = 0;
1402 
1403  EdbSegCouple *sc = 0;
1404  int ncpp = pc->Ncouples();
1405 
1406  Double_t *w = new Double_t[ncpp];
1407 
1408  int ind=-1;
1409  int nind=itracks.GetSize();
1410 
1411  for(int ip=0; ip<ncpp; ip++) {
1412  sc = pc->GetSegCouple(ip);
1413  track=0;
1414 
1415  if(nind) ind = itracks.FindIndex( sc->ID1() );
1416  else ind = -1;
1417 
1418  if(ind>-1) track = (EdbTrackP*)(eTracks->At(ind));
1419  if(!track) {
1420  track = new EdbTrackP();
1421  track->AddSegment( GetPattern(pc->ID1())->GetSegment(sc->ID1()) );
1422  AddTrack(track);
1423  ind = eTracks->GetLast();
1424  }
1425  track->AddSegment( GetPattern(pc->ID2())->GetSegment(sc->ID2()) );
1426 
1427  w[ip] = TIndex2::BuildValue( sc->ID2(), ind );
1428  }
1429  itracks.Set(0);
1430  itracks.BuildIndex(ncpp,w);
1431  delete[] w;
1432 }
void AddTrack(EdbTrackP *track)
Definition: EdbPVRec.h:246
int ID2() const
Definition: EdbPVRec.h:132
int ID1() const
Definition: EdbPVRec.h:131
EdbSegCouple * GetSegCouple(int i) const
Definition: EdbPVRec.h:85
int Ncouples() const
Definition: EdbPVRec.h:80
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
Definition: EdbSegCouple.h:14
int ID2() const
Definition: EdbSegCouple.h:53
int ID1() const
Definition: EdbSegCouple.h:52
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
Definition: EdbPattern.h:118
static Double_t BuildValue(Int_t major, Int_t minor)
Definition: EdbMath.h:57
Int_t FindIndex(Int_t major)
Definition: EdbMath.cxx:381
void BuildIndex(int n, double *w)
Definition: EdbMath.cxx:359
Definition: bitview.h:14
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ AddCouplesToTracksM()

void EdbPVRec::AddCouplesToTracksM ( EdbPatCouple pc,
TIndex2 itracks 
)
1436 {
1437  // merge segments into clusters
1438 
1439  EdbTrackP *track = 0;
1440 
1441  EdbSegCouple *sc = 0;
1442  int ncpp = pc->Ncouples();
1443 
1444  Double_t *w = new Double_t[ncpp];
1445 
1446  int ind=-1;
1447  int nind=itracks.GetSize();
1448 
1449  //make starting tracks: I10
1450  if(nind==0) {
1451  for(int ip=0; ip<ncpp; ip++) {
1452  sc = pc->GetSegCouple(ip);
1453  w[ip] = TIndex2::BuildValue( sc->ID1(), ip );
1454  }
1455  itracks.Set(0);
1456  itracks.BuildIndex(ncpp,w);
1457 
1458  int maj0=-10, maj=0;
1459  for(int i=0; i<ncpp; i++) {
1460  maj = itracks.Major(i);
1461  if( maj0<maj ) {
1462  track = new EdbTrackP();
1463  AddTrack( track );
1464  track->SetID(eTracks->GetLast());
1465  maj0=maj;
1466  }
1467  itracks.SetMinor( i, eTracks->GetLast() );
1468  }
1469  }
1470 
1471  // make I12
1472 
1473  for(int ip=0; ip<ncpp; ip++) {
1474  sc = pc->GetSegCouple(ip);
1475  track=0;
1476 
1477  ind = itracks.FindIndex( sc->ID1() );
1478 
1479  if(ind>-1) track = (EdbTrackP*)(eTracks->At(ind));
1480  if(!track) {
1481  track = new EdbTrackP();
1482  track->AddSegment( GetPattern(pc->ID1())->GetSegment(sc->ID1()) );
1483  AddTrack(track);
1484  ind = eTracks->GetLast();
1485  track->SetID(ind);
1486  }
1487  track->AddSegment( GetPattern(pc->ID2())->GetSegment(sc->ID2()) );
1488 
1489  w[ip] = TIndex2::BuildValue( sc->ID2(), ind );
1490  }
1491  itracks.Set(0);
1492  itracks.BuildIndex(ncpp,w);
1493  delete[] w;
1494 
1495  //merge tracks
1496 
1497  int maj0=-10, maj=0, id0=-1, id=-1;
1498  for(int i=0; i<ncpp; i++) {
1499  maj = itracks.Major(i);
1500  id = itracks.Minor(i);
1501  track = (EdbTrackP*)(eTracks->At(id));
1502  if( maj0!=maj ) id0=id;
1503  else {
1504  track->SetID(id0);
1505  itracks.SetMinor(i, id0 );
1506  }
1507  maj0=maj;
1508  }
1509 }
void SetMinor(int i, Int_t minor)
Definition: EdbMath.h:58
Int_t Minor(int i)
Definition: EdbMath.h:61
Int_t Major(int i)
Definition: EdbMath.h:60
UInt_t id
Definition: tlg2pattern.C:118

◆ AddSegment()

EdbSegP * EdbPVRec::AddSegment ( EdbSegP s)

2922 {
2923  // add new segment to this
2924  // create and insert new pattern if needed
2925  // plate, side and Z for the segment should be correctly defined
2926  // Note: slow function - use for additional segments only as "manual check" etc
2927 
2928  EdbPattern *p = GetPatternByPlate( s.Plate(), s.Side() );
2929  if(!p) {
2930  Log(1,"EdbPVRec::AddSegment",
2931  "WARNING: The pattern for plate/side %d/%d does not found, add new one with z = %f ",
2932  s.Plate(), s.Side(), s.Z() );
2933  p = new EdbPattern( 0., 0., s.Z() );
2934  p->SetID(s.PID());
2935  p->SetScanID( s.ScanID() );
2936  p->SetSide( s.Side() );
2938  }
2939  return p->AddSegment(s);
2940 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
Definition: EdbPattern.h:280
Bool_t eDescendingZ
"pid:id1:chi2:id2" - all found couples
Definition: EdbPattern.h:361
EdbPattern * GetPatternByPlate(int plate, int side)
Definition: EdbPattern.cxx:1933
EdbPattern * InsertPattern(EdbPattern *pat, Bool_t descendingZ=0)
Definition: EdbPattern.cxx:1944
Int_t Plate() const
Definition: EdbSegP.h:156
Float_t Z() const
Definition: EdbSegP.h:150
Int_t Side() const
Definition: EdbSegP.h:167
Int_t PID() const
Definition: EdbSegP.h:145
EdbID ScanID() const
Definition: EdbSegP.h:157
p
Definition: testBGReduction_AllMethods.C:8
EdbSegP * s
Definition: tlg2pattern.C:32

◆ AddSegments() [1/2]

int EdbPVRec::AddSegments ( EdbPVRec ali)

2944 {
2945  // copy the segments from ali and add them to this
2946  int nseg=0;
2947  for(int i=0; i<ali.Npatterns(); i++) {
2948  EdbPattern *pa = GetPattern(i);
2949  for(int j=0; j<pa->N(); j++) {
2950  AddSegment( *(pa->GetSegment(j)) );
2951  nseg++;
2952  }
2953  }
2954  Log(2,"EdbPVRec::AddSegments","%d new segments are inserted",nseg);
2955  return nseg;
2956 }
EdbPVRec * ali
Definition: align.C:1
EdbSegP * AddSegment(EdbSegP &s)
Definition: EdbPVRec.cxx:2921
Int_t Npatterns() const
Definition: EdbPattern.h:380
Int_t N() const
Definition: EdbPattern.h:89

◆ AddSegments() [2/2]

int EdbPVRec::AddSegments ( EdbTrackP track)

2960 {
2961  // copy the segments from track and add them to this
2962  int nseg=0;
2963  for(int i=0; i<track.N(); i++) {
2964  AddSegment( *(track.GetSegment(i)) );
2965  nseg++;
2966  }
2967  Log(2,"EdbPVRec::AddSegments","%d new segments are inserted for using track %d",nseg, track.ID() );
2968  return nseg;
2969 }

◆ AddTrack()

void EdbPVRec::AddTrack ( EdbTrackP track)
inline
246  {
247  if (!eTracks) eTracks = new TObjArray();
248  eTracks->Add(track);
249  }

◆ AddVertex()

void EdbPVRec::AddVertex ( EdbVertex vtx)
inline
251  {
252  if(!eVTX) eVTX = new TObjArray();
253  eVTX->Add((TObject*)vtx);
254  }

◆ Align()

int EdbPVRec::Align ( int  alignFlag)
1207 {
1208  if(alignFlag<10) return AlignOld(alignFlag);
1209  else {
1210  EdbScanSet sci, sca;
1211  for(int i=0; i<Npatterns(); i++) {
1212  EdbPlateP *pl = new EdbPlateP();
1213  EdbPattern *p = GetPattern(i);
1214  pl->SetID( p->PID() );
1215  pl->SetZlayer( p->Z(), p->Z(), p->Z() );
1216  sci.eB.AddPlate(pl);
1217  }
1218  sci.MakePIDList();
1219  sca.Copy(sci);
1220  return AlignPlates( sci, sca );
1221  }
1222 }
void AddPlate(EdbPlateP *pl)
Definition: EdbBrick.h:51
void SetZlayer(float z, float zmin, float zmax)
Definition: EdbLayer.h:102
void SetID(int id)
Definition: EdbLayer.h:95
int AlignOld(int alignFlag)
Definition: EdbPVRec.cxx:1276
int AlignPlates(EdbScanSet &sci, EdbScanSet &sca, const char *reportdir=0)
Definition: EdbPVRec.cxx:1225
Definition: EdbBrick.h:13
Definition: EdbScanSet.h:11
void MakePIDList()
Definition: EdbScanSet.cxx:178
void Copy(EdbScanSet &sc)
Definition: EdbScanSet.cxx:51
EdbBrickP eB
Definition: EdbScanSet.h:13

◆ AlignOld()

int EdbPVRec::AlignOld ( int  alignFlag)
1277 {
1278  // align patterns in volume
1279  int npat=Npatterns();
1280 
1281  TObjArray aKeep(Npatterns());
1282  EdbAffine2D *a0;
1283 
1284  int i;
1285  for(i=0; i<npat; i++ ) {
1286  a0 = new EdbAffine2D();
1287  GetPattern(i)->GetKeep(*a0);
1288  aKeep[i]=a0;
1289  }
1290 
1291 
1292  SetCouples();
1293  EdbPatCouple *pc = 0;
1294  int ncp = Ncouples();
1295  for(i=0; i<ncp; i++ ) {
1296  pc = GetCouple(i);
1297  pc->Align(alignFlag);
1298  }
1299 
1300 
1301  EdbAffine2D a;
1302  npat = Npatterns();
1303  for(i=npat-1; i>0; i-- ) {
1304  GetPattern(i)->GetKeep(a);
1305  a0=(EdbAffine2D *)(aKeep.At(i));
1306  a0->Invert();
1307  a0->Transform(&a);
1308  GetPattern(i-1)->Transform(a0);
1309  }
1310 
1311  return npat;
1312 }
Int_t npat
Definition: Xi2HatStartScript.C:33
void a()
Definition: check_aligned.C:59
Definition: EdbAffine.h:17
void Invert()
Definition: EdbAffine.cxx:103
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
void SetCouples()
Definition: EdbPVRec.cxx:933
EdbPatCouple * GetCouple(int i) const
Definition: EdbPVRec.h:190
Int_t Ncouples() const
Definition: EdbPVRec.h:188
int Align(int alignFlag)
Definition: EdbPVRec.cxx:533
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154
virtual const EdbAffine2D * GetKeep() const
Definition: EdbVirtual.h:175

◆ AlignPlates()

int EdbPVRec::AlignPlates ( EdbScanSet sci,
EdbScanSet sca,
const char *  reportdir = 0 
)
1226 {
1227  int npat = Npatterns();
1228  if(npat<2) return 0;
1229  for(int i=0; i<npat-1; i++) {
1230  EdbPattern *p1 = GetPattern(i);
1231  EdbPattern *p2 = GetPattern(i+1);
1232  EdbPlateP *plate1 = sc.GetPlate(p1->PID());
1233  EdbPlateP *plate2 = sc.GetPlate(p2->PID());
1234  Log(1,"AlignPlates","\n align %d -> %d", p1->PID(), p2->PID() );
1235  EdbPlateP *pc = new EdbPlateP(); // "couple" to be used for the alignment
1236  pc->GetLayer(1)->SetID(plate1->ID());
1237  pc->GetLayer(2)->SetID(plate2->ID());
1238  float DZ = plate2->Z()-plate1->Z();
1239 
1240  gROOT->SetBatch();
1241  EdbPlateAlignment av;
1242 
1243  if(reportdir)
1244  av.InitOutputFile( Form("%6d/%2.2d_%2.2d.al.root",sc.eB.ID(),p1->PID(),p2->PID()) );
1245 
1246  av.Align( *p1, *p2 , DZ );
1247  p1->SetNAff( av.eNcoins );
1248 
1249  if(reportdir)
1250  av.CloseOutputFile();
1251 
1252  if( av.eStatus ) {
1253  pc->GetLayer(1)->CopyCorr( av.eCorrL[0] );
1254  pc->GetLayer(2)->CopyCorr( av.eCorrL[1] );
1255  pc->GetLayer(1)->SetZlayer( -(pc->GetLayer(1)->Zcorr()), 0, 0);
1256  } else pc->GetLayer(1)->SetZlayer( -DZ, 0, 0 );
1257 
1258  sca.ePC.Add(pc);
1259  }
1260  sca.eB.SetID(sca.eB.ID());
1261  sca.AssembleBrickFromPC();
1262  sca.SetAsReferencePlate( sc.eB.GetPlate(npat-1)->ID() ); // last plate is the reference one
1263 
1264  for(int i=0; i<npat; i++) {
1265  EdbPattern *p = GetPattern(i);
1266  p->Transform( sca.eB.GetPlate(i)->GetAffineXY() );
1267  p->SetZ( sca.eB.GetPlate(i)->Z() );
1268  p->SetSegmentsZ();
1269  p->SetSegmentsDZ(300);
1270  }
1271 
1272  return npat;
1273 }
EdbLayer eCorrL[2]
Definition: EdbAlignmentV.h:25
void InitOutputFile(const char *file="report_al.root", const char *option="RECREATE")
Definition: EdbAlignmentV.cxx:55
void CloseOutputFile()
Definition: EdbAlignmentV.cxx:64
EdbPlateP * GetPlate(int i)
Definition: EdbBrick.h:52
float Zcorr() const
Definition: EdbLayer.h:91
int ID() const
Definition: EdbLayer.h:74
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
void CopyCorr(const EdbLayer &l)
Definition: EdbLayer.cxx:54
float Z() const
Definition: EdbLayer.h:78
int PID() const
Definition: EdbPattern.h:329
void SetNAff(int n)
Definition: EdbPattern.h:320
Definition: EdbPlateAlignment.h:8
Bool_t eStatus
Definition: EdbPlateAlignment.h:25
Int_t eNcoins
Definition: EdbPlateAlignment.h:26
void Align(EdbPattern &p1, EdbPattern &p2, float dz, int flag=0)
Definition: EdbPlateAlignment.cxx:62
EdbLayer * GetLayer(int i)
Definition: EdbBrick.h:28
Int_t AssembleBrickFromPC()
Definition: EdbScanSet.cxx:130
Bool_t SetAsReferencePlate(Int_t pid)
Definition: EdbScanSet.cxx:191
TObjArray ePC
Definition: EdbScanSet.h:15
float DZ
Definition: hwinit.C:66

◆ AttachSeg()

bool EdbPVRec::AttachSeg ( EdbTrackP tr,
EdbSegP s,
const float  X0,
const float  ProbMin,
float &  prob 
)
static
2752 {
2753  // Return value: Prob: is Chi2 probability (area of the tail of Chi2-distribution)
2754  // If we accept couples with Prob >= ProbMinP then ProbMinP is the
2755  // probability to reject the good couple
2756  //
2757  // The mass and momentum of the tr are used for multiple scattering estimation
2758 
2759  float ds; // distance in the media for MS estimation
2760  double teta0sq;
2761  double dz;
2762 
2763  const EdbSegP *snear=0;
2764  if( TMath::Abs( s->Z() - tr.TrackZmin()->Z() ) <
2765  TMath::Abs( s->Z() - tr.TrackZmax()->Z() ) ) snear = tr.TrackZmin();
2766  else snear = tr.TrackZmax();
2767 
2768  VtVector par( (double)(snear->X()),
2769  (double)(snear->Y()),
2770  (double)(snear->TX()),
2771  (double)(snear->TY()) );
2772 
2773  VtSymMatrix cov(4); // covariance matrix for seg0 (measurements errors)
2774  for(int k=0; k<4; k++)
2775  for(int l=0; l<4; l++) cov(k,l) = (snear->COV())(k,l);
2776 
2777  Double_t chi2=0.;
2778 
2779 
2780  VtSymMatrix dms(4); // multiple scattering matrix (depends on P,m)
2781  dms.clear();
2782 
2783  dz = s->Z()-snear->Z();
2784  ds = dz*TMath::Sqrt(1.+par(2)*par(2)+par(3)*par(3)); // thickness of media in microns
2785  teta0sq = EdbPhysics::ThetaMS2( tr.P(), tr.M(), ds, X0 );
2786 
2787  dms(0,0) = teta0sq*dz*dz/3.;
2788  dms(1,1) = dms(0,0);
2789  dms(2,2) = teta0sq;
2790  dms(3,3) = dms(2,2);
2791  dms(2,0) = teta0sq*dz/2.;
2792  dms(3,1) = dms(2,0);
2793  dms(0,2) = dms(2,0);
2794  dms(1,3) = dms(2,0);
2795 
2796  VtSqMatrix pred(4); //propagation matrix for track parameters (x,y,tx,ty)
2797  pred.clear();
2798 
2799  pred(0,0) = 1.;
2800  pred(1,1) = 1.;
2801  pred(2,2) = 1.;
2802  pred(3,3) = 1.;
2803  pred(0,2) = dz;
2804  pred(1,3) = dz;
2805 
2806  VtVector parpred(4); // prediction from seg0 to seg
2807  parpred = pred*par;
2808 
2809  VtSymMatrix covpred(4); // covariance matrix for prediction
2810  covpred = pred*(cov*pred.T())+dms;
2811 
2812  VtSymMatrix dmeas(4); // original covariance matrix for seg2
2813  for(int k=0; k<4; k++)
2814  for(int l=0; l<4; l++) dmeas(k,l) = (s->COV())(k,l);
2815 
2816  covpred = covpred.dsinv();
2817  dmeas = dmeas.dsinv();
2818  cov = covpred + dmeas;
2819  cov = cov.dsinv();
2820 
2821  VtVector meas( (double)(s->X()),
2822  (double)(s->Y()),
2823  (double)(s->TX()),
2824  (double)(s->TY()) );
2825 
2826  par = cov*(covpred*parpred + dmeas*meas); // new parameters for seg
2827 
2828  chi2 = (par-parpred)*(covpred*(par-parpred)) + (par-meas)*(dmeas*(par-meas));
2829 
2830  prob = (float)TMath::Prob(chi2,4);
2831 
2832  if (prob >= ProbMinP)
2833  {
2834  EdbSegP *sfnew = new EdbSegP( tr.ID(),
2835  (float)par(0),(float)par(1),(float)par(2),(float)par(3),
2836  tr.W()+1.,tr.Flag() );
2837 
2838  sfnew->SetCOV( cov.array(), 4 );
2839  sfnew->SetChi2((float)chi2);
2840  sfnew->SetProb(prob);
2841  sfnew->SetZ(s->Z());
2842 
2843  tr.AddSegment(s);
2844  tr.AddSegmentF(sfnew);
2845 
2846  return true;
2847  }
2848  return false;
2849 }
T Prob(const T &rhs, int n)
Definition: Prob.hh:37
brick dz
Definition: RecDispMC.C:107
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
EdbDisplay * ds
Definition: check_vertex.C:16
static double ThetaMS2(float p, float mass, float dx, float X0)
Definition: EdbPhys.cxx:50
Definition: EdbSegP.h:18
void SetProb(float prob)
Definition: EdbSegP.h:131
TMatrixD & COV() const
Definition: EdbSegP.h:120
Float_t TX() const
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
void SetZ(float z)
Definition: EdbSegP.h:122
Float_t Y() const
Definition: EdbSegP.h:171
void SetCOV(TMatrixD &cov)
Definition: EdbSegP.h:98
void SetChi2(float chi2)
Definition: EdbSegP.h:132
Float_t TY() const
Definition: EdbSegP.h:173
Definition: VtSqMatrix.hh:50
Definition: VtSymMatrix.hh:49
Definition: VtVector.hh:45
float X0
Definition: emthickness.cpp:69
float ProbMinP
Definition: check_vertex.C:22
Float_t chi2
Definition: testBGReduction_By_ANN.C:14

◆ Chi2Fast()

float EdbPVRec::Chi2Fast ( EdbSegP s1,
EdbSegP s2 
)
1842 {
1843  float kSZ = 1., kSX=.5, kSY=.5; // pattern to pattern errors: TODO
1844 
1845  float tx0,ty0, stx2,sty2; //mean angle
1846  float w1,w2;
1847  float tx, ty;
1848  float dz = s2.Z()-s1.Z();
1849  float chi2=0;
1850 
1851  w1 = 1./s1.SX(); w2 = 1./s2.SX();
1852  tx0 = (w1*s1.TX() + w2*s2.TX())/(w1+w2);
1853  w1 += w2;
1854  if( TMath::Abs(dz)>kSZ ) {
1855  tx = (s2.X()-s1.X())/dz;
1856  w2 = 1./((s1.SX() + s2.SX() + kSX*kSX)/dz/dz);
1857  tx0 = (tx0*w1 + tx*w2)/(w1+w2);
1858  w1 += w2;
1859  }
1860  stx2 = 1./w1;
1861 
1862  w1 = 1./s1.SY(); w2 = 1./s2.SY();
1863  ty0 = (w1*s1.TY() + w2*s2.TY())/(w1+w2);
1864  w1 += w2;
1865  if( TMath::Abs(dz)>kSZ ) {
1866  ty = (s2.Y()-s1.Y())/dz;
1867  w2 = 1./((s1.SY() + s2.SY() + kSY*kSY)/dz/dz);
1868  ty0 = (ty0*w1 + ty*w2)/(w1+w2);
1869  w1 += w2;
1870  }
1871  sty2 = 1./w1;
1872 
1873  float dx = (s2.X() - tx0*dz/2.) - (s1.X() + tx0*dz/2.);
1874  float dy = (s2.Y() - ty0*dz/2.) - (s1.Y() + ty0*dz/2.);
1875  float sx2 = s1.SX()+s2.SX() + stx2*dz*dz;
1876  float sy2 = s1.SY()+s2.SY() + sty2*dz*dz;
1877 
1878  chi2 = (s2.TX()-s1.TX())*(s2.TX()-s1.TX())/(s1.SX()+s2.SX());
1879  chi2 += (s2.TY()-s1.TY())*(s2.TY()-s1.TY())/(s1.SY()+s2.SY());
1880  chi2 += dx*dx/sx2 + dy*dy/sy2;
1881 
1882  chi2 /=4.;
1883  if(chi2<100) printf("%f \t%f %f \t%f %f \tchi2=%f\n",
1884  dz , dx,dy, s2.TX()-s1.TX(), s2.TY()-s1.TY(),chi2 );
1885  return chi2;
1886 }
Float_t SY() const
Definition: EdbSegP.h:160
Float_t SX() const
Definition: EdbSegP.h:159
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ Chi2Max()

float EdbPVRec::Chi2Max ( ) const
inline
185 { return eChi2Max; }

◆ CollectSegment()

int EdbPVRec::CollectSegment ( TIndexCell ct,
TIndexCell cross 
)
1638 {
1639  TIndexCell *cc =0;
1640  int ncc =0;
1641  int nct = ct->N(1);
1642  int flag=0;
1643  for(int j=0; j<nct; j++) {
1644  cc = cross->Find( ct->At(j)->Value() );
1645  ncc = cc->N(1);
1646  if(!ncc) continue;
1647  flag++;
1648  for(int icc=0; icc<ncc; icc++) {
1649  ct->FindAdd(cc->At(icc)->Value());
1650  }
1651  cc->List()->Delete();
1652  if(!CollectSegment(ct,cross)) return 0;
1653  }
1654  return flag;
1655 }
SVector< T, 3 > cross(const SVector< T, 3 > &lhs, const SVector< T, 3 > &rhs)
Definition: Functions.hh:283
int CollectSegment(TIndexCell *ct, TIndexCell *cross)
Definition: EdbPVRec.cxx:1637
TObjArray * List() const
Definition: TIndexCell.h:78
Long_t Value() const
Definition: TIndexCell.h:79
TIndexCell const * At(Int_t narg, Int_t vind[]) const
Definition: TIndexCell.cpp:519
TIndexCell * FindAdd(Long_t p1)
Definition: TIndexCell.cpp:575
Int_t N() const
Definition: TIndexCell.cpp:344

◆ CollectSegment1()

int EdbPVRec::CollectSegment1 ( TIndexCell ct,
THashList *  cross 
)
1659 {
1660  TIndexCell *cc =0;
1661  int ncc =0;
1662  int nct = ct->N(1);
1663  int flag=0;
1664  for(int j=0; j<nct; j++) {
1665  cc = (TIndexCell*)(cross->FindObject( ct->At(j) ));
1666  ncc = cc->N(1);
1667  if(!ncc) continue;
1668  flag++;
1669  for(int icc=0; icc<ncc; icc++) {
1670  ct->FindAdd(cc->At(icc)->Value());
1671  }
1672  cc->List()->Delete();
1673  if(!CollectSegment1(ct,cross)) return 0;
1674  }
1675  return flag;
1676 }
int CollectSegment1(TIndexCell *ct, THashList *cross)
Definition: EdbPVRec.cxx:1658

◆ CombTracks()

int EdbPVRec::CombTracks ( int  nplmin,
int  ngapMax,
float  probMin = 0.01 
)

2342 {
2343  // eliminate crossing&overlapping tracks with multiple segments usage
2344  // discard tracks with probability < probMin
2345 
2346  int ntr = eTracks->GetEntriesFast();
2347  Log(3,"EdbPVRec::CombTracks","Comb %d tracks, longer then %d; ngaps <= %d ..."
2348  ,ntr,nplmin, ngapMax );
2349 
2350  int nseg=0, nsegtot=0;
2351 
2352  // *** sort tracks by quality
2353 
2354  TIndexCell cn; //"npl:prob:entry"
2355  Long_t v[3];
2356 
2357  EdbTrackP *tr=0;
2358  for(int i=0; i<ntr; i++) {
2359  tr = (EdbTrackP*)(eTracks->At(i));
2360  tr->SetID(i);
2361  tr->SetCounters();
2362  nsegtot += tr->SetSegmentsTrack(-1);
2363  v[0]= -(tr->Npl());
2364  v[1]= (Long_t)((1.-tr->Prob())*100);
2365  v[2]= i;
2366  cn.Add(3,v);
2367  }
2368  cn.Sort();
2369 
2370  Log(3,"EdbPVRec::CombTracks","%d tracks with %d segments for processing...",ntr,nsegtot);
2371 
2372  // *** set track ID for segments attached to
2373 
2374  TIndexCell *cp=0, *c=0;
2375  int nn=cn.GetEntriesFast();
2376  for(int i=nn-1; i>=0; i--) {
2377  cp = cn.At(i); // tracks with fixed npl
2378  int np = cp->GetEntriesFast();
2379  for(int ip=np-1; ip>=0; ip--) {
2380  c = cp->At(ip); // tracks with fixed Npl & Prob
2381  int nt = c->GetEntriesFast();
2382  for(int it=0; it<nt; it++) {
2383  tr = (EdbTrackP*)(eTracks->At( c->At(it)->Value() ) );
2384  tr->SetSegmentsTrack();
2385  }
2386  }
2387  }
2388 
2389  // discard bad tracks with flag -10
2390 
2391  cp=0;
2392  c=0;
2393  nn=cn.GetEntriesFast();
2394  Log(3,"EdbPVRec::CombTracks","1 nn = %d",nn);
2395  for(int i=0; i<nn; i++) {
2396  cp = cn.At(i); // tracks with fixed npl
2397 
2398  int np = cp->GetEntriesFast();
2399  Log(3,"EdbPVRec::CombTracks","1 np = %d",np);
2400  for(int ip=0; ip<np; ip++) {
2401  c = cp->At(ip); // tracks with fixed Npl & Prob
2402 
2403  int nt = c->GetEntriesFast();
2404  Log(3,"EdbPVRec::CombTracks","1 nt = %d",nt);
2405  for(int it=0; it<nt; it++) {
2406 
2407  tr = (EdbTrackP*)(eTracks->At( c->At(it)->Value() ) );
2408 
2409  if(!tr) Log(1,"EdbPVRec::CombTracks","ERROR: nn:np:nt:it = %d:%d:%d value = %d",nn,np,nt,it, c->At(it)->Value() );
2410 
2411 
2412  if(tr->RemoveAliasSegments()>0){
2413  if(tr->N()<nplmin) tr->SetFlag(-10);
2414  if(tr->CheckMaxGap()>ngapMax) tr->SetFlag(-10);
2415  }
2416 
2417  }
2418  }
2419  }
2420  Log(3,"EdbPVRec::CombTracks","2");
2421 
2422 
2423  // discard tracks with low probability
2424 // for(int i=0; i<ntr; i++) {
2425 // tr = GetTrack(i);
2426 // if(tr->Prob() < probMin) tr->SetFlag(-10);
2427 // }
2428 
2429  // release the segments and eliminate bad tracks from the tracks array
2430 
2431  int trind;
2432  EdbSegP *seg=0;
2433  for(int i=0; i<ntr; i++) {
2434  tr = GetTrack(i);
2435  if(tr->Flag() != -10) continue;
2436  nseg = tr->N();
2437  for (int iseg=0; iseg<nseg; iseg++) {
2438  seg = tr->GetSegment(iseg);
2439  trind = seg->Track();
2440  if ( trind < 0 ) continue; // segment is already free
2441  if ( GetTrack(trind)->Flag() == -10 ) seg->SetTrack(-1); // release segment
2442  }
2443  }
2444  Log(3,"EdbPVRec::CombTracks","3");
2445 
2446  for(int i=ntr-1; i>-1; i--) {
2447  tr = GetTrack(i);
2448  if(tr->Flag() != -10) continue;
2449  eTracks->RemoveAt(i);
2450  SafeDelete(tr);
2451  }
2452  eTracks->Compress();
2453  Log(3,"EdbPVRec::CombTracks","4");
2454 
2455 
2456  nsegtot = 0;
2457 
2458  ntr = eTracks->GetEntriesFast();
2459  for(int i=0; i<ntr; i++) {
2460  tr = GetTrack(i);
2461  tr->SetID(i);
2462  nsegtot += tr->SetSegmentsTrack();
2463  }
2464 
2465  Log(3,"EdbPVRec::CombTracks","%d tracks with %d segments remaining",ntr,nsegtot);
2466  return ntr;
2467 }
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Int_t Track() const
Definition: EdbSegP.h:147
void SetTrack(int trid)
Definition: EdbSegP.h:128
Int_t GetEntriesFast() const
Definition: TIndexCell.h:82
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

◆ DeleteCouples()

void EdbPVRec::DeleteCouples ( )
inline
180 { if(ePatCouples) ePatCouples->Delete(); }

◆ DummyCycle()

void EdbPVRec::DummyCycle ( )
1168 {
1169  int npat=Npatterns();
1170  Log(3,"EdbPVRec::DummiCycle","npat=%d",npat);
1171  for(int ipat=0; ipat<npat; ipat++) {
1172  EdbPattern *p = GetPattern(ipat);
1173  int nseg=p->N();
1174  Log(3,"EdbPVRec::DummiCycle","pat %d, nseg= %d",ipat, nseg);
1175  for(int iseg=0; iseg<nseg; iseg++) {
1176  EdbSegP *s = p->GetSegment(iseg);
1177  if(s->Flag()==-999) Log(1,"EdbPVRec::DummiCycle","jo pa");
1178  }
1179  }
1180 }
Int_t Flag() const
Definition: EdbSegP.h:146

◆ ExtractDataVolumeSeg()

int EdbPVRec::ExtractDataVolumeSeg ( EdbTrackP tr,
TObjArray &  arr,
float  binx,
float  bint 
)

2854 {
2855  int npat = Npatterns();
2856 
2857  EdbSegP ss; // the "selector" segment
2858 
2859  tr.MakeSelector(ss);
2860 
2861  EdbPattern *pat = 0;
2862  int nseg =0;
2863 
2864  for(int i=0; i<npat; i++) {
2865  pat = GetPattern(i);
2866  if(!pat) continue;
2867 
2868  ss.PropagateTo(pat->Z());
2869 
2870  nseg += pat->FindCompliments(ss,arr,binx,bint);
2871  }
2872  Log(2,"EdbPVRec::ExtractDataVolumeSeg","%d segments are selected\n",nseg);
2873  return nseg;
2874 }
int FindCompliments(EdbSegP &s, TObjArray &arr, float nsig, float nsigt)
Definition: EdbPattern.cxx:1447
Float_t Z() const
Definition: EdbPattern.h:87
ss
Definition: energy.C:62

◆ ExtractDataVolumeSegAll()

int EdbPVRec::ExtractDataVolumeSegAll ( TObjArray &  arr)

2878 {
2879  int npat = Npatterns();
2880 
2881  EdbPattern *pat = 0;
2882  int nseg =0;
2883 
2884  for(int i=0; i<npat; i++) {
2885  pat = GetPattern(i);
2886  if(!pat) continue;
2887 
2888  for(int j=0; j<pat->N(); j++) {
2889  arr.Add(pat->GetSegment(j));
2890  nseg++;
2891  }
2892  }
2893  Log(2,"EdbPVRec::ExtractDataVolumeSegAll","%d segments are selected\n",nseg);
2894  return nseg;
2895 }

◆ FillCell()

void EdbPVRec::FillCell ( float  stepx,
float  stepy,
float  steptx,
float  stepty 
)
1089 {
1090  int npat=Npatterns();
1091  for(int i=0; i<npat; i++ ) GetPattern(i)->FillCell(stepx,stepy,steptx,stepty);
1092 }
void FillCell(float stepx, float stepy, float steptx, float stepty)
Definition: EdbPattern.cxx:1416

◆ FillTracksCell()

void EdbPVRec::FillTracksCell ( )
1316 {
1317  // TODO: speed-up this algorithm
1318 
1319  // fill tracks cell "vid1:vid2"
1320  // second segment is considered as leading one
1321 
1322  Log(2,"\nEdbPVRec::FillTracksCell","...");
1323 
1324  Long_t vid1,vid2;
1325 
1326  if(!eTracksCell) eTracksCell = new TIndexCell();
1327  TIndexCell *tracksCell = eTracksCell; // "vid1:vid2"
1328  TIndexCell *cc=0;
1329 
1330  if(tracksCell) tracksCell->Drop();
1331 
1332  EdbPatCouple *pc = 0;
1333  EdbSegCouple *sc = 0;
1334 
1335  int ncp = Ncouples();
1336  int ncpp;
1337  for(int iv=0; iv<ncp; iv++ ) {
1338  pc = GetCouple(iv);
1339  ncpp = pc->Ncouples();
1340  for(int ip=0; ip<ncpp; ip++) {
1341  sc = pc->GetSegCouple(ip);
1342 
1343  vid1 = Vid( pc->ID1(),sc->ID1() );
1344  vid2 = Vid( pc->ID2(),sc->ID2() );
1345 
1346  cc=tracksCell->FindAdd(vid1);
1347  if(!cc->N(1)) cc->Add(vid1);
1348  cc->Add(vid2);
1349  cc->SetValue(vid2);
1350  }
1351  }
1352  tracksCell->Sort();
1353  if(gEDBDEBUGLEVEL>1) tracksCell->PrintPopulation(1);
1354 }
Long_t Vid(int pid, int sid) const
Definition: EdbPattern.h:407
void Drop()
Definition: TIndexCell.cpp:237
void SetValue(Long_t p1)
Definition: TIndexCell.h:87
void PrintPopulation(int level) const
Definition: TIndexCell.cpp:244
gEDBDEBUGLEVEL
Definition: energy.C:7

◆ FillTracksCell1()

void EdbPVRec::FillTracksCell1 ( )
1513 {
1514  // TODO: speed-up this algorithm
1515 
1516  // fill tracks cell "vid1:vid2"
1517  // second segment is considered as leading one
1518  Long_t vid1,vid2;
1519 
1520  TIndexCell *tracks = eTracksCell; // "vid1:vid2"
1521  TIndexCell *cc=0;
1522  TIndexCell *cv1=0;
1523  TIndexCell *cv2=0;
1524 
1525  THashList *cross = new THashList();
1526  // TIndexCell *cross = new TIndexCell();
1527 
1528  if(tracks) tracks->Drop();
1529 
1530  EdbPatCouple *pc = 0;
1531  EdbSegCouple *sc = 0;
1532 
1533  int ncp = Ncouples();
1534  int ncpp;
1535  for(int iv=0; iv<ncp; iv++ ) {
1536  pc = GetCouple(iv);
1537  ncpp = pc->Ncouples();
1538  Log(2,"EdbPVRec::FillTracksCell1","cross: %d %d\n",iv,ncpp);
1539  for(int ip=0; ip<ncpp; ip++) {
1540  sc = pc->GetSegCouple(ip);
1541 
1542  vid1 = Vid( pc->ID1(),sc->ID1() );
1543  vid2 = Vid( pc->ID2(),sc->ID2() );
1544  cv1 = new TIndexCell(vid1);
1545  cv2 = new TIndexCell(vid2);
1546  if( !(cc=(TIndexCell*)cross->FindObject(cv1)) ) { cross->Add(cv1); cc=cv1; }
1547  cc->FindAdd(vid2);
1548  if( !(cc=(TIndexCell*)cross->FindObject(cv2)) ) { cross->Add(cv2); cc=cv2; }
1549  cc->FindAdd(vid1);
1550  }
1551  }
1552 
1553  TIndexCell *ct=0;
1554  int ncross = cross->GetSize();
1555  Log(2,"EdbPVRec::FillTracksCell1","ncross = %d",ncross);
1556  int ncc=0;
1557 
1558  for(int i=0; i<ncross; i++) {
1559  cc = (TIndexCell*)(cross->At(i));
1560  ncc = cc->N(1);
1561  if(!ncc) continue;
1562 
1563  ct = tracks->FindAdd(cc->Value());
1564  ct->FindAdd(cc->Value());
1565 
1566  CollectSegment1(ct,cross);
1567  }
1568 
1569  tracks->Sort();
1570  tracks->PrintPopulation(1);
1571 }
TCanvas * cv1
Definition: RecDispMC_Profiles.C:63
TCanvas * cv2
Definition: RecDispMC_Profiles.C:63
TTree * tracks
Definition: check_tr.C:19

◆ FillTracksCell2()

void EdbPVRec::FillTracksCell2 ( )
1575 {
1576  // TODO: speed-up this algorithm
1577 
1578  // fill tracks cell "vid1:vid2"
1579  // second segment is considered as leading one
1580  Long_t vid1,vid2;
1581 
1582  TIndexCell *tracks = eTracksCell; // "vid1:vid2"
1583  TIndexCell *cc=0;
1584  TIndexCell *cross = new TIndexCell();
1585 
1586  if(tracks) tracks->Drop();
1587 
1588  EdbPatCouple *pc = 0;
1589  EdbSegCouple *sc = 0;
1590 
1591  int ncp = Ncouples();
1592  int ncpp;
1593  for(int iv=0; iv<ncp; iv++ ) {
1594  pc = GetCouple(iv);
1595  ncpp = pc->Ncouples();
1596  Log(2,"EdbPVRec::FillTracksCell2","cross: %d %d\n",iv,ncpp);
1597  for(int ip=0; ip<ncpp; ip++) {
1598  sc = pc->GetSegCouple(ip);
1599 
1600  vid1 = Vid( pc->ID1(),sc->ID1() );
1601  vid2 = Vid( pc->ID2(),sc->ID2() );
1602 
1603  cc=cross->FindAdd(vid1);
1604  // cc->FindAdd(vid1);
1605  cc->FindAdd(vid2);
1606 
1607  cc=cross->FindAdd(vid2);
1608  cc->FindAdd(vid1);
1609  // cc->FindAdd(vid2);
1610 
1611  }
1612  }
1613  cross->Sort();
1614  if(gEDBDEBUGLEVEL>1) cross->PrintPopulation(1);
1615 
1616  TIndexCell *ct=0;
1617  int ncross = cross->N(1);
1618  Log(2,"EdbPVRec::FillTracksCell2","ncross = %d",ncross);
1619  int ncc=0;
1620 
1621  for(int i=0; i<ncross; i++) {
1622  cc = cross->At(i);
1623  ncc = cc->N(1);
1624  if(!ncc) continue;
1625 
1626  ct = tracks->FindAdd(cc->Value());
1627  ct->FindAdd(cc->Value());
1628 
1629  CollectSegment(ct,cross);
1630  }
1631 
1632  tracks->Sort();
1633  if(gEDBDEBUGLEVEL>1) tracks->PrintPopulation(1);
1634 }

◆ FillTracksCellFast()

void EdbPVRec::FillTracksCellFast ( )
1358 {
1359  // fill tracks cell "vid1:vid2"
1360  // second segment is considered as leading one
1361 
1362  int ncp = Ncouples();
1363  Log(2,"EdbPVRec::FillTracksCellFast","build tracks from couples for ncp=%d ...", ncp);
1364  if(ncp<1) return;
1365 
1366  SafeDelete(eTracks);
1367  eTracks = new TObjArray();
1368 
1369  EdbPatCouple *pc = 0;
1370  TIndex2 itracks(0);
1371 
1372  for( int iv=0; iv<ncp; iv++ ) {
1373  pc = GetCouple(iv);
1374  AddCouplesToTracksM( pc , itracks );
1375  }
1376 
1377 
1378  //TODO: split&analyse tracks
1379 
1380  int nsegmax=100, nfound=0;
1381  TArrayI segtab(nsegmax);
1382  segtab.Reset();
1383  int nseg=0;
1384  int ntr = eTracks->GetEntriesFast();
1385  for( int i=0; i<ntr; i++ ) {
1386  nseg=((EdbTrackP*)(eTracks->At(i)))->N();
1387  if(nseg>nsegmax-1) nseg=nsegmax;
1388  if(nseg>nfound) nfound=nseg;
1389  segtab[nseg] = segtab[nseg]+1;
1390  }
1391 
1392  for(int i=0; i<nfound+1; i++)
1393  Log(2,"EdbPVRec::FillTracksCellFast","%d \t tracks with %d segments",segtab[i],i);
1394 
1395  Log(2,"EdbPVRec::FillTracksCellFast","%d tracks are found", ntr);
1396 }
void AddCouplesToTracksM(EdbPatCouple *pc, TIndex2 &itracks)
Definition: EdbPVRec.cxx:1435
Definition: EdbMath.h:49

◆ FindSegment()

EdbSegP * EdbPVRec::FindSegment ( int  PlateID,
int  SegmentID 
) const

901 {
902 
903  for(int i=0; i<Npatterns(); ++i) {
904  EdbPattern* pat = GetPattern(i);
905  if (pat->PID() != PlateID) continue;
906  for(int j=0; j<pat->N(); ++j) {
907  EdbSegP* seg = pat->GetSegment(j);
908  if (seg->ID() == SegmentID) return seg;
909  }
910  }
911  return 0;
912 }
Int_t ID() const
Definition: EdbSegP.h:144

◆ FindTrack()

EdbTrackP * EdbPVRec::FindTrack ( int  id) const

893 {
894  for(int i=0; i<Ntracks(); i++)
895  if(GetTrack(i)->ID()==id) return GetTrack(i);
896  return 0;
897 }
Int_t Ntracks() const
Definition: EdbPVRec.h:203

◆ FineCorrF()

int EdbPVRec::FineCorrF ( int  ipat,
EdbAffine2D aff,
EdbAffine2D afft 
)
2036 {
2037  if(!eTracks) return 0;
2038 
2039  float probMax=.01; // TODO
2040 
2041  int ntr = eTracks->GetEntriesFast();
2042  TArrayF x(ntr) , y(ntr), x1(ntr), y1(ntr);
2043  TArrayF tx(ntr),ty(ntr),tx1(ntr),ty1(ntr);
2044 
2045  int itr=0;
2046  int nseg=0;
2047  EdbTrackP *track=0;
2048  EdbSegP *s=0, *sf=0;
2049 
2050  for(int i=0; i<ntr; i++) {
2051 
2052  track = (EdbTrackP*)eTracks->At(i);
2053 
2054  Log(2,"EdbPVRec::FineCorrF","track->CHI2() = %f %f prob = %f",
2055  track->CHI2(),track->CHI2F(),track->Prob() );
2056  if(track->Prob()<probMax) continue;
2057 
2058  sf=0;
2059  nseg = track->N();
2060  for(int j=0; j<nseg; j++) {
2061  s = track->GetSegment(j);
2062  if( s->PID()==ipat ) {
2063  sf = track->GetSegmentF(j);
2064  break;
2065  }
2066  }
2067 
2068  if(!sf) continue;
2069 
2070  x1[itr] = s->X();
2071  y1[itr] = s->Y();
2072  tx1[itr] = s->TX();
2073  ty1[itr] = s->TY();
2074  x[itr] = sf->X();
2075  y[itr] = sf->Y();
2076  tx[itr] = sf->TX();
2077  ty[itr] = sf->TY();
2078  itr++;
2079  }
2080 
2081  aff.CalculateTurn( itr, x1.GetArray(),y1.GetArray(),x.GetArray(),y.GetArray() );
2082  GetPattern(ipat)->Transform(&aff);
2083 
2084  afft.CalculateTurn( itr,tx1.GetArray(),ty1.GetArray(),tx.GetArray(),ty.GetArray() );
2085  GetPattern(ipat)->TransformA(&afft);
2086  return itr;
2087 }
Int_t CalculateTurn(int n, float *x0, float *y0, float *x1, float *y1)
Definition: EdbAffine.cxx:449
void TransformA(const EdbAffine2D *affA)
Definition: EdbPattern.cxx:367

◆ FineCorrShr()

int EdbPVRec::FineCorrShr ( int  ipat,
float &  shr 
)
2248 {
2249  if(!eTracks) return 0;
2250  int ntr = eTracks->GetEntriesFast();
2251  double t1;
2252  double t;
2253  double dzz=0;
2254  int itr=0;
2255  EdbTrackP *track=0;
2256  EdbSegP *seg=0;
2257  for(int i=0; i<ntr; i++) {
2258  track = (EdbTrackP*)eTracks->At(i);
2259  if(track->CHI2()>1.2) continue;
2260  t = TMath::Sqrt( track->TX()*track->TX() + track->TY()*track->TY() );
2261  if(t<.1) continue;
2262  if(t>.45) continue;
2263  seg = track->GetSegment(ipat);
2264  t1 = TMath::Sqrt( seg->TX()* seg->TX() + seg->TY()* seg->TY() );
2265  dzz += t1/t;
2266  itr++;
2267  }
2268  dzz /= itr; // dzz is the ratio of "segment angle"/"track angle"
2269  shr = dzz;
2270 
2271  return itr;
2272 }
TTree * t
Definition: check_shower.C:4

◆ FineCorrTXTY()

int EdbPVRec::FineCorrTXTY ( int  ipat,
EdbAffine2D aff 
)
2122 {
2123  if(!eTracks) return 0;
2124  int ntr = eTracks->GetEntriesFast();
2125  float *tx = new float[ntr];
2126  float *ty = new float[ntr];
2127  float *tx1 = new float[ntr];
2128  float *ty1 = new float[ntr];
2129  int itr=0;
2130  EdbTrackP *track=0;
2131  EdbSegP *seg=0;
2132  for(int i=0; i<ntr; i++) {
2133  track = (EdbTrackP*)eTracks->At(i);
2134  if(track->CHI2()>1.) continue;
2135  seg = track->GetSegment(ipat);
2136  tx1[itr] = seg->TX();
2137  ty1[itr] = seg->TY();
2138  tx[itr] = track->TX();
2139  ty[itr] = track->TY();
2140  itr++;
2141  }
2142  aff.CalculateTurn( itr,tx1,ty1,tx,ty );
2143  GetPattern(ipat)->TransformA(&aff);
2144  delete[] tx;
2145  delete[] ty;
2146  delete[] tx1;
2147  delete[] ty1;
2148  return itr;
2149 }

◆ FineCorrXY()

int EdbPVRec::FineCorrXY ( int  ipat,
EdbAffine2D aff,
int  flag 
)
2091 {
2092  if(!eTracks) return 0;
2093  int ntr = eTracks->GetEntriesFast();
2094  float *x = new float[ntr];
2095  float *y = new float[ntr];
2096  float *x1 = new float[ntr];
2097  float *y1 = new float[ntr];
2098  int itr=0;
2099  EdbTrackP *track=0;
2100  EdbSegP *seg=0;
2101  for(int i=0; i<ntr; i++) {
2102  track = (EdbTrackP*)eTracks->At(i);
2103  if(track->CHI2()>1.) continue;
2104  seg = track->GetSegment(ipat);
2105  x1[itr] = seg->X();
2106  y1[itr] = seg->Y();
2107  x[itr] = track->X() + track->TX()*(seg->Z() - track->Z());
2108  y[itr] = track->Y() + track->TY()*(seg->Z() - track->Z());
2109  itr++;
2110  }
2111  aff.Calculate( itr,x1,y1,x,y,flag );
2112  GetPattern(ipat)->Transform(&aff);
2113  delete[] x;
2114  delete[] y;
2115  delete[] x1;
2116  delete[] y1;
2117  return itr;
2118 }
Int_t Calculate(EdbPointsBox2D *b1, EdbPointsBox2D *b2)
Definition: EdbAffine.cxx:260

◆ FineCorrZ()

int EdbPVRec::FineCorrZ ( int  ipat,
float &  dz 
)
2153 {
2154  if(!eTracks) return 0;
2155  int ntr = eTracks->GetEntriesFast();
2156  float tx1,ty1;
2157  double t1;
2158  double t;
2159  double dzz=0;
2160  int itr=0;
2161  EdbTrackP *track=0;
2162  EdbSegP *seg1=0;
2163  EdbSegP *seg2=0;
2164  for(int i=0; i<ntr; i++) {
2165  track = (EdbTrackP*)eTracks->At(i);
2166  if(track->CHI2()>1.2) continue;
2167  t = TMath::Sqrt( track->TX()*track->TX() + track->TY()*track->TY() );
2168  if(t<.1) continue;
2169  if(t>.5) continue;
2170  seg1 = track->GetSegment(ipat);
2171  seg2 = track->GetSegment(ipat+1);
2172  tx1 = (seg2->X()-seg1->X())/(seg2->Z()-seg1->Z());
2173  ty1 = (seg2->Y()-seg1->Y())/(seg2->Z()-seg1->Z());
2174  t1 = TMath::Sqrt(tx1*tx1+ty1*ty1);
2175  dzz += t1/t;
2176  itr++;
2177  }
2178  dzz /= itr; // dzz is the ratio of "position angle"/"track angle"
2179  dz = (GetPattern(ipat+1)->Z()-GetPattern(ipat)->Z())*dzz;
2180 
2181  return itr;
2182 }

◆ FineCorrZnew()

int EdbPVRec::FineCorrZnew ( )
2186 {
2187  // calculate z-correction for all patterns based on linked tracks of any length
2188  // gaps to be ignored...
2189 
2190  int nMin = 5; // minimal statistics for doing correction
2191  if(!eTracks) return 0;
2192  int ntr = eTracks->GetEntriesFast();
2193 
2194  if(ntr < nMin) { Log(1,"EdbPVRec::FineCorrZnew"," ntr<%d : nothing to do!", nMin ); return 0; }
2195 
2196  int npat = Npatterns();
2197  float tx1,ty1;
2198  double t1;
2199  double t;
2200  TArrayD dzz(npat);
2201  TArrayI itr(npat);
2202  TArrayF znew(npat);
2203 
2204  EdbTrackP *track=0;
2205  EdbSegP *seg1=0;
2206  EdbSegP *seg2=0;
2207  for(int i=0; i<ntr; i++) {
2208  track = (EdbTrackP*)eTracks->At(i);
2209  if(track->CHI2()>1.2) continue;
2210  t = TMath::Sqrt( track->TX()*track->TX() + track->TY()*track->TY() );
2211  if(t<.1) continue;
2212  if(t>.5) continue;
2213 
2214  int nseg = track->N();
2215  for(int j=0; j<nseg-1; j++ ) {
2216  seg1 = track->GetSegment(j);
2217  seg2 = track->GetSegment(j+1);
2218  if(TMath::Abs(seg1->PID()-seg2->PID()) != 1) continue; // gap skipped
2219  int ipat = TMath::Min( seg1->PID(), seg2->PID() );
2220  tx1 = (seg2->X()-seg1->X())/(seg2->Z()-seg1->Z());
2221  ty1 = (seg2->Y()-seg1->Y())/(seg2->Z()-seg1->Z());
2222  t1 = TMath::Sqrt(tx1*tx1+ty1*ty1);
2223  dzz[ipat] = dzz[ipat] + t1/t;
2224  itr[ipat] = itr[ipat]+1;
2225  }
2226  }
2227 
2228  znew[npat-1] = GetPattern(npat-1)->Z();
2229  for(int i=npat-2; i>=0; i-- ) {
2230  if(itr[i]<nMin) dzz[i] = 1; //
2231  else dzz[i] = dzz[i]/itr[i]; // dzz is the ratio of "position angle"/"track angle"
2232  float dz = (GetPattern(i)->Z()-GetPattern(i+1)->Z())*dzz[i];
2233  znew[i] = znew[i+1] + dz;
2234  Log(2,"EdbPVRec::FineCorrZnew","Ajust Z of pat: %3d by %4d tracks: dz =%7.3f Zold, Znew: %12.3f %12.3f diff = %7.3f",
2235  i, itr[i], dz, GetPattern(i)->Z(), znew[i], znew[i]-GetPattern(i)->Z() );
2236  }
2237 
2238  for(int i=0; i<npat-1; i++ ) {
2239  GetPattern(i)->SetZ(znew[i]);
2240  GetPattern(i)->SetSegmentsZ();
2241  }
2242 
2243  return 0;
2244 }
Float_t Z() const
Definition: EdbPattern.h:379
void SetZ(float z)
Definition: EdbPattern.h:41
void SetSegmentsZ()
Definition: EdbPattern.cxx:275

◆ FitTracks()

void EdbPVRec::FitTracks ( float  p = 10.,
float  mass = 0.139,
TObjArray *  gener = 0,
int  design = 0 
)
1890 {
1891  // measurement errors: TODO
1892  // TODO: move gener logic out from EdbPVRec; i voobshe polnyi bardak v etoi funkzii
1893 
1894  float X0 = GetScanCond()->RadX0();
1895  float pms = 0.;
1896  int nsegmatch = 0;
1897 
1898  int ntr = eTracks->GetEntriesFast();
1899 
1900  if (p > 0. && mass > 0.)
1901  printf("fit %d tracks assuming p = %f, mass = %f and X0 = %f ...\n",
1902  ntr,p,mass,X0);
1903  else if ( p < 0. && mass > 0.)
1904  printf("fit %d tracks assuming MC momentum, mass = %f and X0 = %f ...\n",
1905  ntr,mass,X0);
1906  else if ( p == 0. && mass > 0.)
1907  printf("fit %d tracks with MS momentum, mass = %f and X0 = %f ...\n",
1908  ntr,mass,X0);
1909  else if ( p > 0. && mass < 0.)
1910  printf("fit %d tracks assuming p = %f, MC mass and X0 = %f ...\n",
1911  ntr,p,X0);
1912  else if ( p < 0. && mass < 0.)
1913  printf("fit %d tracks assuming MC momentum, MC mass and X0 = %f ...\n",
1914  ntr,X0);
1915  else if ( p == 0. && mass < 0.)
1916  printf("fit %d tracks with MS momentum, MC mass and X0 = %f ...\n",
1917  ntr,X0);
1918  else if ( p > 0. && mass == 0.)
1919  printf("fit %d tracks assuming p = %f, pre-defined mass and X0 = %f ...\n",
1920  ntr,p,X0);
1921  else if ( p < 0. && mass == 0.)
1922  printf("fit %d tracks assuming MC momentum, pre-defined mass and X0 = %f ...\n",
1923  ntr,X0);
1924  else if ( p == 0. && mass == 0.)
1925  printf("fit %d tracks with MS momentum, pre-defined mass and X0 = %f ...\n",
1926  ntr,X0);
1927 
1928 
1930  tf.eX0 = X0;
1931  tf.eM = mass;
1932  EdbTrackP *tr = 0, *trg = 0;
1933  int nseg, itrg;
1934 
1935  for(int itr=0; itr<ntr; itr++) {
1936  tr = (EdbTrackP*)(eTracks->At(itr));
1937 
1938  tr->ClearF();
1939 
1940  nseg = tr->N();
1941 
1942  if(p>0) tr->SetP(p);
1943  else if(p<0 && gener)
1944  {
1945  if ((itrg = tr->GetSegmentsMCTrack(nsegmatch)) >= 0)
1946  {
1947  trg = (EdbTrackP*)(gener->At(itrg));
1948  if (trg)
1949  {
1950  tr->SetP(trg->P());
1951  }
1952  }
1953  }
1954  else if (p == 0.)
1955  {
1956  if (tr->P() == 0.)
1957  {
1958  pms = tf.P_MS(*tr);
1959  if (pms < 0.05) pms = 0.05;
1960  else if (pms > 30.0) pms = 30.;
1961  tr->SetP(pms);
1962  }
1963  }
1964  else tr->SetP(4.);
1965 
1966  if(mass>0) tr->SetM(mass);
1967  else if(mass<0 && gener)
1968  {
1969  if ((itrg = tr->GetSegmentsMCTrack(nsegmatch)) >= 0)
1970  {
1971  trg = (EdbTrackP*)(gener->At(itrg));
1972  if (trg)
1973  {
1974  tr->SetM(trg->M());
1975  }
1976  }
1977  }
1978  else if (tr->M() == 0.) tr->SetM(0.139);
1979  tr->FitTrackKFS(false,X0,design);
1980  }
1981 
1982 }
int design
Definition: RecDispMC.C:90
Definition: EdbMomentumEstimator.h:20
float P_MS(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:1072
EdbScanCond const * GetScanCond()
Definition: EdbPVRec.h:172
float RadX0() const
Definition: EdbScanCond.h:58
float eX0
Definition: EdbTrackFitter.h:22
float eM
Definition: EdbTrackFitter.h:23
EdbPVGen * gener
Definition: gen.C:2
float mass
Definition: check_vertex.C:21

◆ GetCouple()

EdbPatCouple* EdbPVRec::GetCouple ( int  i) const
inline
190  { if(ePatCouples)
191  return (EdbPatCouple *)(ePatCouples->At(i));
192  else return 0; }

◆ GetPatternByPID()

EdbPattern * EdbPVRec::GetPatternByPID ( int  pid)

2899 {
2900  EdbPattern *p=0;
2901  for(int i=0; i<Npatterns(); i++) {
2902  p = GetPattern(i);
2903  if(p) if(p->PID()==pid) return p;
2904  }
2905  return 0;
2906 }
int pid[1000]
Definition: m2track.cpp:13

◆ GetScanCond()

EdbScanCond const* EdbPVRec::GetScanCond ( )
inline
172 { return eScanCond; }

◆ GetTrack()

EdbTrackP* EdbPVRec::GetTrack ( int  i) const
inline
241 {return eTracks ? (EdbTrackP*)(eTracks->At(i)) : 0;}

◆ GetTracks()

TObjArray* EdbPVRec::GetTracks ( )
inline
258 {return eTracks;}

◆ GetTracksCell()

TIndexCell* EdbPVRec::GetTracksCell ( ) const
inline
194 { return eTracksCell; }

◆ GetVertex()

EdbVertex* EdbPVRec::GetVertex ( Int_t &  i)
inline
256 {return eVTX ? (EdbVertex*)eVTX->At(i) : 0;}
Definition: EdbVertex.h:68

◆ GetVertices()

TObjArray* EdbPVRec::GetVertices ( )
inline
259 {return eVTX;}

◆ InsertHole()

int EdbPVRec::InsertHole ( const EdbSegP s1,
const EdbSegP s2,
int  pid 
)
1727 {
1728  EdbSegP s;
1729  EdbSegP::LinkMT(s1,s2,&s);
1730  s.SetFlag(-1);
1731  s.SetW( (s1->W()+s2->W())/2 );
1732  EdbPattern *pat = GetPattern(pid);
1733  //s.SetProbability( pat->Cond()->ProbSeg( s.TX(),s.TY(),s.W() );
1734  s.PropagateTo(pat->Z());
1735  s.SetDZ(s1->DZ());
1736  pat->AddSegment(s);
1737  return pat->N()-1;
1738 }
Float_t DZ() const
Definition: EdbSegP.h:151
void PropagateTo(float z)
Definition: EdbSegP.cxx:292
static void LinkMT(const EdbSegP *s1, const EdbSegP *s2, EdbSegP *s)
Definition: EdbSegP.cxx:129
void SetW(float w)
Definition: EdbSegP.h:129
void SetDZ(float dz)
Definition: EdbSegP.h:123
Float_t W() const
Definition: EdbSegP.h:148
void SetFlag(int flag)
Definition: EdbSegP.h:127
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:71

◆ InsertTrack()

void EdbPVRec::InsertTrack ( const EdbTrackP t)
3004 {
3005  EdbTrackP *tr = new EdbTrackP( (EdbSegP*)(&t), t.M() );
3006  tr->SetTrack(t.Track());
3007 
3008  int nseg = t.N();
3009  for(int i=0; i<nseg; i++)
3010  {
3011  EdbSegP *s = t.GetSegment(i);
3012  EdbSegP *sf = t.GetSegmentF(i);
3013  if(s)
3014  {
3015  EdbPattern *pat = GetPattern( s->PID() );
3016  if(!pat) {
3017  Log(1,"EdbPVRec::InsertTrack","no pattern with pid %d: creating new one!",s->PID());
3018  pat = new EdbPattern( 0., 0., s->Z() );
3019  pat->SetID(s->PID());
3020  pat->SetScanID(s->ScanID());
3021  AddPatternAt(pat,s->PID());
3022  }
3023  tr->AddSegment( pat->AddSegment(*s ) );
3024  tr->AddSegmentF( new EdbSegP(*sf) );
3025  }
3026  }
3027  tr->SetSegmentsTrack(tr->ID());
3028  tr->SetCounters();
3029  //tr1->FitTrackKFS(true);
3030  AddTrack(tr);
3031 }
void SetID(int id)
Definition: EdbPattern.h:318
void SetScanID(EdbID id)
Definition: EdbPattern.h:303
void AddPatternAt(EdbPattern *pat, int id)
Definition: EdbPattern.cxx:1873

◆ Link()

int EdbPVRec::Link ( )
1184 {
1185  // link tracks in aligned volume
1186 
1187  int npat=0;
1188  SetCouples();
1189 
1190  EdbPatCouple *pc = 0;
1191 
1192  int ncp=Ncouples();
1193  for(int i=0; i<ncp; i++ ) {
1194  DummyCycle();
1195  pc = GetCouple(i);
1196  pc->LinkFast();
1197  pc->CutCHI2P(eChi2Max);
1198  pc->SortByCHI2P();
1199  npat += pc->Ncouples();
1200  }
1201  Log(3,"EdbPVRec::Link","total number of linked segments = %d",npat);
1202  return npat;
1203 }
void DummyCycle()
Definition: EdbPVRec.cxx:1167
int LinkFast()
Definition: EdbPVRec.cxx:665
int SortByCHI2P()
Definition: EdbPVRec.cxx:490
int CutCHI2P(float chimax)
Definition: EdbPVRec.cxx:451

◆ LinkSlow()

int EdbPVRec::LinkSlow ( )
1149 {
1150  // link tracks in aligned volume
1151  int npat=0;
1152  SetCouples();
1153 
1154  EdbPatCouple *pc = 0;
1155 
1156  int ncp=Ncouples();
1157  for(int i=0; i<ncp; i++ ) {
1158  pc = GetCouple(i);
1159  pc->LinkSlow( Chi2Max() );
1160  npat = pc->SortByCHI2P();
1161  }
1162  Log(2,"EdbPVRec::LinkSlow"," npat= %d",npat);
1163  return npat;
1164 }
float Chi2Max() const
Definition: EdbPVRec.h:185
int LinkSlow(float chi2max)
Definition: EdbPVRec.cxx:586

◆ MakeHoles()

int EdbPVRec::MakeHoles ( int  ort)
1680 {
1681  // holes attached only from the one side corresponding to ort
1682  // only tracks with nseg>= abs(ort) are extrapolated
1683 
1684  TIndexCell *ct;
1685  Long_t vn=0,v0=0,v1=0,v2=0;
1686  int nholes=0;
1687 
1688  int id=0,pid=0;
1689  EdbSegP *s1=0, *s2=0;
1690  int n=0;
1691 
1692  int ntc=eTracksCell->N(1);
1693  for(int it=0; it<ntc; it++) {
1694 
1695  ct = eTracksCell->At(it);
1696  n = ct->N(1);
1697  if( n >= Npatterns() ) continue; // too many segments
1698  if( n < TMath::Abs(ort) ) continue; // not enough segments
1699  vn = ct->At(n-1)->Value();
1700  v0 = ct->At(0)->Value();
1701  if( Pid(vn)-Pid(v0) < n-1 ) continue; // track is not isolated
1702 
1703  if(ort<0) { // attach at the beginnning of the track
1704  if( Pid(v0) < 1 ) continue;
1705  v2=v0;
1706  v1 = ct->At(1)->Value();
1707  pid = Pid(v0)-1;
1708  } else if(ort>0) { // attach at the end of the track
1709  if( Pid(vn) > Npatterns()-2 ) continue;
1710  v2=vn;
1711  v1 = ct->At(n-2)->Value();
1712  pid = Pid(vn)+1;
1713  }
1714 
1715  s1 = GetPattern( Pid(v1) )->GetSegment( Sid(v1) );
1716  s2 = GetPattern( Pid(v2) )->GetSegment( Sid(v2) );
1717 
1718  id = InsertHole( s1,s2, pid);
1719  ct->Add( Vid( pid, id) );
1720  nholes++;
1721  }
1722  return nholes;
1723 }
int InsertHole(const EdbSegP *s1, const EdbSegP *s2, int pid)
Definition: EdbPVRec.cxx:1726
Int_t Sid(Long_t vid) const
Definition: EdbPattern.h:409
Int_t Pid(Long_t vid) const
Definition: EdbPattern.h:408

◆ MakeSummaryTracks()

int EdbPVRec::MakeSummaryTracks ( )
2277 {
2278  if(!eTracks) return 0;
2279  int ntr = eTracks->GetEntriesFast();
2280  EdbTrackP *track=0;
2281  for(int i=0; i<ntr; i++) {
2282  track = (EdbTrackP*)eTracks->At(i);
2283  track->FitTrack();
2284  }
2285  return ntr;
2286 }

◆ MakeTracks()

int EdbPVRec::MakeTracks ( int  nsegments = 2,
int  flag = 0 
)
1986 {
1987  // extract from index_table tracks longer then nsegments
1988  // and form tracks array
1989  // assign the flag to the newly created tracks
1990  // return the number of created tracks
1991 
1992  int ntr0 = 0;
1993  if( eTracks ) ntr0 = eTracks->GetEntriesFast();
1994  else eTracks = new TObjArray();
1995 
1996  Log(2,"\nEdbPVRec::MakeTracks","ntr0=%d...",ntr0);
1997 
1998  int nseg, ntr=0;
1999  Long_t vid=0;
2000  EdbSegP *seg=0;
2001  EdbTrackP *track = 0;
2002  TIndexCell *ct=0;
2003 
2004  int ntc=eTracksCell->GetEntriesFast();
2005  for(int it=0; it<ntc; it++) {
2006 
2007  ct = eTracksCell->At(it);
2008  nseg = ct->GetEntriesFast();
2009  if( nseg < nsegments ) continue;
2010  track = new EdbTrackP(nseg);
2011 
2012  track->SetNpl( Pid(ct->At(nseg-1)->Value()) - Pid(ct->At(0)->Value()) +1 );
2013 
2014  for(int is=0; is<nseg; is++) {
2015  vid = ct->At(is)->Value();
2016  seg = GetSegment(vid);
2017  track->AddSegment(seg);
2018  }
2019  eTracks->Add(track);
2020  ntr++;
2021  }
2022 
2023  for(int i=ntr0; i<ntr0+ntr; i++) {
2024  track = GetTrack(i);
2025  track->SetID(i);
2026  track->SetFlag(flag);
2027  track->SetCounters();
2028  }
2029 
2030  Log(2,"EdbPVRec::MakeTracks","%d tracks with >= %d segments are selected",ntr, nsegments);
2031  return ntr;
2032 }
EdbSegP * GetSegment(Long_t vid) const
Definition: EdbPattern.h:411

◆ MergeTracks()

int EdbPVRec::MergeTracks ( int  maxgap = 2)
1742 {
1743  int merged=0,m1=0;
1744 
1745  for(int i=0; i<10; i++) {
1746  m1 = MergeTracks1(maxgap);
1747  Log(2,"EdbPVRec::MergeTracks","%d tracks are merged!", m1);
1748  if(m1==0) break;
1749  merged += m1;
1750  }
1751 
1752  Log(2,"EdbPVRec::MergeTracks","Total: %d tracks are merged!", merged);
1753 
1754  return merged;
1755 }
int MergeTracks1(int maxgap)
Definition: EdbPVRec.cxx:1758

◆ MergeTracks1()

int EdbPVRec::MergeTracks1 ( int  maxgap)
1759 {
1760  int imerged=0;
1761 
1762  /*
1763  float X0 = GetScanCond()->RadX0();
1764 
1765  int npat = Npatterns();
1766 
1767  TIndexCell starts,ends; // "ist:entry" "iend:entry"
1768  FillTracksStartEnd( starts, ends, 1, npat-2 );
1769 
1770  TIndexCell *ce=0, *cs=0;
1771  int itre,itrs, iend;
1772  EdbTrackP *tre, *trs;
1773  EdbSegP *s1, *s2;
1774 
1775  float tx,ty,dz,dx,dy;
1776  float stx=0.015, sty=0.015, sx=6., sy=6.;
1777 
1778  for(int ie=0; ie<ends.GetEntriesFast(); ie++) {
1779  ce = ends.At(ie);
1780  iend = ce->Value();
1781 
1782  for(int igap=0; igap<maxgap+1; igap++) {
1783  cs = starts.Find(iend+igap);
1784  if(!cs) continue;
1785 
1786  for(int iee=0; iee<ce->GetEntriesFast(); iee++) {
1787  itre = ce->At(iee)->Value();
1788  tre = (EdbTrackP*)((*eTracks)[itre]);
1789  if(!tre) continue;
1790  if(tre->Flag()==-10) continue;
1791  s1 = tre->GetSegmentF(tre->N()-1);
1792 
1793  for(int iss=0; iss<cs->GetEntriesFast(); iss++) {
1794  itrs = cs->At(iss)->Value();
1795  trs = (EdbTrackP*)((*eTracks)[itrs]);
1796  if(!trs) continue;
1797  if(trs->Flag()==-10) continue;
1798  s2 = trs->GetSegmentF(0);
1799 
1800  if( TMath::Abs(s2->TX()-s1->TX()) > stx ) continue;
1801  if( TMath::Abs(s2->TY()-s1->TY()) > sty ) continue;
1802  dz = s2->Z()-s1->Z();
1803  tx = (s2->TX() + s1->TX())/2.;
1804  dx = (s2->X() - tx*dz/2.) - (s1->X() + tx*dz/2.);
1805  if(TMath::Abs(dx) > sx+stx*TMath::Abs(dz)/2. ) continue;
1806  ty = (s2->TY() + s1->TY())/2.;
1807  dy = (s2->Y() - ty*dz/2.) - (s1->Y() + ty*dz/2.);
1808  if( TMath::Abs(dy)> sy+sty*TMath::Abs(dz)/2. ) continue;
1809 
1810  //if(tre->N()+trs->N()>npat)
1811  printf("%f \t%f %f \t%f %f %d %d \n",
1812  dz , dx,dy,
1813  s2->TX()-s1->TX(), s2->TY()-s1->TY(),
1814  tre->N(),trs->N() );
1815 
1816  printf( "prob = %15.13f\n", EdbVertexRec::ProbeSeg(s1,s2, 5810., tre->M()) );
1817 
1818  tre->AddTrack(*trs);
1819  tre->FitTrackKFS(true,X0);
1820  tre->SetFlag(-10);
1821  tre->SetN0( tre->N0() + trs->N0() + igap-1 );
1822  tre->SetNpl( tre->Npl() + trs->Npl() + igap-1 );
1823 
1824  (*eTracks)[itrs]=0; delete trs; trs = 0;
1825 
1826  imerged++;
1827  break;
1828 
1829  }
1830  }
1831  }
1832  }
1833 
1834  eTracks->Compress();
1835 
1836  */
1837  return imerged;
1838 }

◆ Ncouples()

Int_t EdbPVRec::Ncouples ( ) const
inline
188 {return ePatCouples?ePatCouples->GetEntriesFast():0;}

◆ NSeg()

Int_t EdbPVRec::NSeg ( )

2910 {
2911  EdbPattern *p=0;
2912  Int_t nseg=0;
2913  for(int i=0; i<Npatterns(); i++) {
2914  p = GetPattern(i);
2915  nseg+=p->N();
2916  }
2917  return nseg;
2918 }

◆ Ntracks()

Int_t EdbPVRec::Ntracks ( ) const
inline
203 {return eTracks ? eTracks->GetEntriesFast() : 0;}

◆ Nvtx()

Int_t EdbPVRec::Nvtx ( ) const
inline
255 {return eVTX ? eVTX->GetEntriesFast() : 0;}

◆ PrintSummary()

void EdbPVRec::PrintSummary ( )

3035 {
3036  // Print Summary Information of relevant data of this object.
3037  // Useful for debugging purposes.
3038  cout <<"EdbPVRec::PrintSummary() Print Summary Information of relevant data of this object." << endl;
3039  cout <<"EdbPVRec::PrintSummary() Useful for debugging purposes:" << endl;
3040  printf("%d patterns\n",Npatterns());
3041  printf("%d tracks\n",Ntracks());
3042  printf("%d vertex\n",Nvtx());
3043  PrintStat();
3044  return;
3045 }
Int_t Nvtx() const
Definition: EdbPVRec.h:255
void PrintStat(Option_t *opt="") const
Definition: EdbPattern.cxx:1822

◆ ProbeSeg() [1/3]

double EdbPVRec::ProbeSeg ( const EdbSegP s1,
EdbSegP s2,
const float  X0 = 5810.,
const float  mass = 0.1396 
)
static
2673 {
2674  // Return value: Prob: is Chi2 probability (area of the tail of Chi2-distribution)
2675  // If we accept couples with Prob >= ProbMin then ProbMin is the
2676  // probability to reject the good couple
2677  //
2678  // The mass and momentum of the tr are used for multiple scattering estimation
2679 
2680  float ds; // distance in the media for MS estimation
2681  double teta0sq;
2682  double dz;
2683 
2684  VtVector par( (double)(tr->X()),
2685  (double)(tr->Y()),
2686  (double)(tr->TX()),
2687  (double)(tr->TY()) );
2688 
2689  VtSymMatrix cov(4); // covariance matrix for seg0 (measurements errors)
2690  for(int k=0; k<4; k++)
2691  for(int l=0; l<4; l++) cov(k,l) = (tr->COV())(k,l);
2692 
2693  Double_t chi2=0.;
2694 
2695 
2696  VtSymMatrix dms(4); // multiple scattering matrix (depends on P,m)
2697  dms.clear();
2698 
2699  dz = s->Z()-tr->Z();
2700  ds = dz*TMath::Sqrt(1.+par(2)*par(2)+par(3)*par(3)); // thickness of media in microns
2701  teta0sq = EdbPhysics::ThetaMS2( tr->P(), ma, ds, X0 );
2702 
2703  dms(0,0) = teta0sq*dz*dz/3.;
2704  dms(1,1) = dms(0,0);
2705  dms(2,2) = teta0sq;
2706  dms(3,3) = dms(2,2);
2707  dms(2,0) = teta0sq*dz/2.;
2708  dms(3,1) = dms(2,0);
2709  dms(0,2) = dms(2,0);
2710  dms(1,3) = dms(2,0);
2711 
2712  VtSqMatrix pred(4); //propagation matrix for track parameters (x,y,tx,ty)
2713  pred.clear();
2714 
2715  pred(0,0) = 1.;
2716  pred(1,1) = 1.;
2717  pred(2,2) = 1.;
2718  pred(3,3) = 1.;
2719  pred(0,2) = dz;
2720  pred(1,3) = dz;
2721 
2722  VtVector parpred(4); // prediction from seg0 to seg
2723  parpred = pred*par;
2724 
2725  VtSymMatrix covpred(4); // covariance matrix for prediction
2726  covpred = pred*(cov*pred.T())+dms;
2727 
2728  VtSymMatrix dmeas(4); // original covariance matrix for seg2
2729  for(int k=0; k<4; k++)
2730  for(int l=0; l<4; l++) dmeas(k,l) = (s->COV())(k,l);
2731 
2732  covpred = covpred.dsinv();
2733  dmeas = dmeas.dsinv();
2734  cov = covpred + dmeas;
2735  cov = cov.dsinv();
2736 
2737  VtVector meas( (double)(s->X()),
2738  (double)(s->Y()),
2739  (double)(s->TX()),
2740  (double)(s->TY()) );
2741 
2742  par = cov*(covpred*parpred + dmeas*meas); // new parameters for seg
2743 
2744  chi2 = (par-parpred)*(covpred*(par-parpred)) + (par-meas)*(dmeas*(par-meas));
2745 
2746  return TMath::Prob(chi2,4);
2747 }

◆ ProbeSeg() [2/3]

double EdbPVRec::ProbeSeg ( const EdbTrackP s1,
EdbSegP s2,
const float  X0 = 5810. 
)
static
2662 {
2663  return ProbeSeg( (EdbSegP*)tr, s, X0, tr->M() );
2664 }
static double ProbeSeg(const EdbTrackP *s1, EdbTrackP *s2, const float X0=5810.)
Definition: EdbPVRec.cxx:2654

◆ ProbeSeg() [3/3]

double EdbPVRec::ProbeSeg ( const EdbTrackP s1,
EdbTrackP s2,
const float  X0 = 5810. 
)
static
2655 {
2656  return ProbeSeg( (EdbSegP*)tr1, (EdbSegP*)tr2, X0, tr1->M() );
2657 }

◆ PropagateTrack()

int EdbPVRec::PropagateTrack ( EdbTrackP tr,
bool  followZ,
float  probMin = 0.05,
int  ngapMax = 3,
int  design = 0 
)

2567 {
2568  float binx=10, bint=10;
2569  float X0 = GetScanCond()->RadX0();
2570 
2571  EdbSegP ss; // the "selector" segment
2572  int step = tr.MakeSelector(ss,followZ); // step in pid
2573 
2574  int pstart = ss.PID(), pend=0;
2575  if (step>0) pend = Npatterns()-1;
2576  else if(step<0) pend = 0;
2577  else return 0;
2578 
2579  TObjArray arr;
2580  EdbSegP *seg=0;
2581  EdbSegP *segmax=0;
2582 
2583  EdbPattern *pat = 0;
2584  int nseg =0, nsegTot=0;
2585  int ntr = eTracks->GetEntriesFast();
2586  int ngap =0, trind=0;
2587  float probmax=0, prob=0;
2588  EdbTrackP *ttt = 0;
2589 
2590  for(int i=pstart+step; i!=pend+step; i+=step ) {
2591  pat = GetPattern(i);
2592  if(!pat) goto GAP;
2593  ss.PropagateTo(pat->Z());
2594 
2595  arr.Clear();
2596  nseg = pat->FindCompliments(ss,arr,binx,bint);
2597  if(!nseg) goto GAP;
2598 
2599  probmax=prob=0;
2600  segmax=0;
2601  for(int is=0; is<nseg; is++ ) {
2602  seg = (EdbSegP*)(arr.At(is));
2603  prob = ProbeSeg( &tr, seg, X0 );
2604  if( prob>probmax ) { probmax=prob; segmax=seg; }
2605  }
2606  if(!segmax) goto GAP;
2607  if(probmax<probMin) goto GAP;
2608 
2609  trind= segmax->Track();
2610  if(trind==tr.ID()) {
2611  Log(1,"EdbPVRec::PropagateTrack","TRACK LOOP: %d %d",trind, tr.ID());
2612  goto GAP;
2613  }
2614  ttt=0;
2615  if( trind >= 0 && trind<ntr ) {
2616  ttt = ((EdbTrackP*)eTracks->At(trind));
2617  if(!ttt) { Log(1,"EdbPVRec::PropagateTrack","BAD TRACK POINTER: %d\n", trind); goto GAP;};
2618 
2619  if(ttt->VertexS() || ttt->VertexE()) goto GAP;
2620 
2621  if(!(tr.VertexS()) && !(tr.VertexE()))
2622  {
2623  if(ttt->Flag()>=0) {
2624  if( ttt->N() > tr.N() ) goto GAP;
2625  else if( segmax->Z() > (ttt->TrackZmin()->Z()+300.) &&
2626  segmax->Z() < (ttt->TrackZmax()->Z()-300.) ) goto GAP; // do not attach in-middle segments
2627  }
2628  }
2629  }
2630 
2631  if( !AttachSeg( tr, segmax , X0, probMin, probmax )) goto GAP;
2632 
2633  if(ttt) ttt->SetFlag(-10);
2634 
2635  segmax->SetTrack(tr.ID());
2636  tr.MakeSelector(ss,followZ);
2637  nsegTot++;
2638  ngap =0;
2639  // tr.SetFlag(tr.Flag()+1); // to check side effects!
2640 
2641  GAP:
2642  if(++ngap>ngapMax) break;
2643  }
2644 
2645  tr.SetNpl();
2646  tr.SetN0();
2647  tr.FitTrackKFS(followZ,X0,design);
2648  tr.SetSegmentsTrack();
2649 
2650  return nsegTot;
2651 }
static bool AttachSeg(EdbTrackP &tr, EdbSegP *s, const float X0, const float ProbMin, float &prob)
Definition: EdbPVRec.cxx:2750
EdbVertex * VertexS()
Definition: EdbPattern.cxx:1284
EdbVertex * VertexE()
Definition: EdbPattern.cxx:1291
EdbSegP * TrackZmin(bool usesegpar=false) const
Definition: EdbPattern.h:203
Int_t N() const
Definition: EdbPattern.h:182
EdbSegP * TrackZmax(bool usesegpar=false) const
Definition: EdbPattern.h:204

◆ PropagateTracks()

int EdbPVRec::PropagateTracks ( int  nplmax,
int  nplmin,
float  probMin = 0.05,
int  ngapMax = 3,
int  design = 0 
)

2485 {
2486  // extrapolate incomplete tracks and update them with new segments
2487  //
2488  // input: nplmax - the maximal length of the track to be continued
2489  // input: nplmin - the minimal length of the track to be continued
2490 
2491 // if (eVTX)
2492 // {
2493 // eVTX->Delete();
2494 // eVTX->Clear();
2495 // }
2496 
2497  //ClearPropagation(design);
2498 
2499  int ntr = CombTracks(nplmin, ngapMax); // clean-up from all tracking defects TODO remove this call from here?
2500 
2501  Log(2,"EdbPVRec::PropagateTracks"," %d tracks, selecting in range [%d : %d] plates, ngaps <= %d ..."
2502  ,ntr,nplmin,nplmax, ngapMax );
2503 
2504  if(ntr<1) return 0;
2505 
2506  TIndexCell cn; //"npl:prob:entry"
2507  Long_t v[3];
2508  int nseg=0;
2509  EdbTrackP *tr=0;
2510  for(int i=0; i<ntr; i++) {
2511  tr = GetTrack(i);
2512  v[0]= -(tr->Npl());
2513  v[1]= (Long_t)((1.-tr->Prob())*100);
2514  v[2]= i;
2515  cn.Add(3,v);
2516  }
2517  cn.Sort();
2518 
2519  int nsegTot=0;
2520 
2521  TIndexCell *cp=0, *c=0;
2522  int nn=cn.GetEntriesFast();
2523 
2524  for(int i=0; i<nn; i++) {
2525  cp = cn.At(i); // tracks with fixed npl
2526  if( -(cp->Value()) > nplmax ) continue;
2527  if( -(cp->Value()) < nplmin ) continue;
2528 
2529  int np = cp->GetEntriesFast();
2530  for(int ip=0; ip<np; ip++) {
2531  c = cp->At(ip); // tracks with fixed Npl & Prob
2532 
2533  int nt = c->GetEntriesFast();
2534  for(int it=0; it<nt; it++) {
2535 
2536  tr = (EdbTrackP*)(eTracks->At( c->At(it)->Value() ) );
2537 
2538  if(!tr) {
2539  Log(1,"EdbPVRec::PropagateTracks","ERROR: bad track(%d) pointer!!",i);
2540  continue;
2541  }
2542 
2543  if(tr->Flag()==-10) continue;
2544 
2545  nseg = PropagateTrack(*tr, true, probMin, ngapMax, design);
2546  nsegTot += nseg;
2547 
2548  if(tr->Npl()>nplmax) continue;
2549  if(tr->Flag()==-10) continue;
2550 
2551  nseg = PropagateTrack(*tr, false, probMin, ngapMax, design);
2552  nsegTot += nseg;
2553 
2554  }
2555  }
2556  }
2557 
2558  ntr = CombTracks(nplmin, ngapMax); // clean-up all tracking defects
2559 
2560  Log(2,"EdbPVRec::PropagateTracks","%d segments are attached after propagation",nsegTot);
2561  return nsegTot;
2562 }
int CombTracks(int nplmin, int ngapMax, float probMin=0.01)
Definition: EdbPVRec.cxx:2341
int PropagateTrack(EdbTrackP &tr, bool followZ, float probMin=0.05, int ngapMax=3, int design=0)
Definition: EdbPVRec.cxx:2565

◆ ResetCouples()

void EdbPVRec::ResetCouples ( )
950 {
951  EdbPatCouple *pc = 0;
952  int ncp=Ncouples();
953  for(int i=0; i<ncp; i++ ) {
954  pc = GetCouple(i);
955  pc->ClearSegCouples();
956  pc->SetPat1( GetPattern(pc->ID1()) );
957  pc->SetPat2( GetPattern(pc->ID2()) );
958  }
959 }
void SetPat2(EdbPattern *pat2)
Definition: EdbPVRec.h:72
void ClearSegCouples()
Definition: EdbPVRec.h:82
void SetPat1(EdbPattern *pat1)
Definition: EdbPVRec.h:71

◆ ResetTracks()

void EdbPVRec::ResetTracks ( )
963 {
964  for(int i=0; i<Npatterns(); i++ ) {
965  EdbPattern *p = GetPattern(i);
966  if(!p) continue;
967  for(int j=0; j<p->N(); j++ ) p->GetSegment(j)->SetTrack(-1);
968  }
969  SafeDelete(eTracks);
970  SafeDelete(eTracksCell);
971 }

◆ SelectLongTracks()

int EdbPVRec::SelectLongTracks ( int  nsegments)
2291 {
2292  int ntr=0;
2293  if(!eTracksCell) return ntr;
2294  if(nsegments<2) return ntr;
2295  SafeDelete(eTracks);
2296  eTracks = new TObjArray();
2297 
2298  EdbTrackP *track=0;
2299  EdbSegP *seg=0;
2300 
2301  ResetCouples();
2302  EdbPatCouple *pc=0;
2303  TIndexCell *ct=0;
2304  Long_t vid1=0,vid2=0;
2305 
2306  int ntc, nct;
2307 
2308  ntc = eTracksCell->GetEntriesFast();
2309  for(int it=0; it<ntc; it++) {
2310 
2311  ct = eTracksCell->At(it);
2312  if( ct->N() < nsegments ) continue;
2313  track = new EdbTrackP();
2314  track->SetID( ct->Value() );
2315 
2316  nct = ct->GetEntriesFast();
2317  int is;
2318  for(is=0; is<nct-1; is++) {
2319  vid1 = ct->At(is)->Value();
2320  vid2 = ct->At(is+1)->Value();
2321  pc = GetCouple(Pid(vid1)); //TODO: depends on cp sequence
2322  pc->AddSegCouple( Sid(vid1), Sid(vid2) );
2323  }
2324 
2325  for(is=0; is<nct; is++) {
2326  vid1 = ct->At(is)->Value();
2327  seg = GetPattern(Pid(vid1))->GetSegment(Sid(vid1));
2328  //seg->SetPID(Pid(vid1));
2329  track->AddSegment(seg);
2330  }
2331 
2332  ntr++;
2333  eTracks->Add(track);
2334  }
2335 
2336  Log(2,"EdbPVRec::SelectLongTracks","%d tracks with >= %d segments are selected\n",ntr, nsegments);
2337  return ntr;
2338 }
void ResetCouples()
Definition: EdbPVRec.cxx:949
EdbSegCouple * AddSegCouple(int id1, int id2)
Definition: EdbPVRec.cxx:118

◆ SetBinsCheck()

void EdbPVRec::SetBinsCheck ( int  nx,
int  ny,
int  ntx,
int  nty 
)
inline
175  { eVdiff[0]=nx; eVdiff[1]=ny; eVdiff[2]=ntx; eVdiff[3]=nty; }
int nx
Definition: emthickness.cpp:60
int ny
Definition: emthickness.cpp:62

◆ SetChi2Max()

void EdbPVRec::SetChi2Max ( float  chi)
inline
186 { eChi2Max=chi; }

◆ SetCouples()

void EdbPVRec::SetCouples ( )
934 {
935  // using already setted ID's of couples attach the patterns
936 
937  EdbPatCouple *pc = 0;
938  int ncp=Ncouples();
939  for(int i=0; i<ncp; i++ ) {
940  pc = GetCouple(i);
941  pc->SetPat1( GetPattern(pc->ID1()) );
942  pc->SetPat2( GetPattern(pc->ID2()) );
943 
944  pc->SetCHI2mode(GetScanCond()->Chi2Mode());
945  }
946 }
void SetCHI2mode(int m)
Definition: EdbPVRec.h:103

◆ SetCouplesAll()

void EdbPVRec::SetCouplesAll ( )
975 {
976  // form couples array for all available patterns ID's
977  SetCouplesPeriodic(0,1);
978 }
void SetCouplesPeriodic(int istart, int iperiod)
Definition: EdbPVRec.cxx:981

◆ SetCouplesExclude()

void EdbPVRec::SetCouplesExclude ( TArrayI &  exclude)
1010 {
1011  // by Alessandra Pastore
1012  // TArray exclude[npat]={0,1,1,0,...,0} where
1013  // 0 = plate to be excluded from the volume pattern;
1014  // 1 = plate to be included into the volume pattern
1015 
1016  DeleteCouples();
1017  EdbPatCouple *pc = 0;
1018  int npat = Npatterns();
1019 
1020  for(int i=0; i<npat; i++ ) GetPattern(i)->SetSegmentsPID();
1021  for(int i=0; i<npat-1; i++) {
1022  if(exclude[i]==0) continue;
1023  for(int j=i+1; j<npat; j++) {
1024  if(exclude[j]==0) continue;
1025 
1026  pc = new EdbPatCouple();
1027  pc->SetID(i,j);
1028  pc->SetCond(eScanCond);
1029  pc->SetOffset(0,0,0,0);
1030  pc->SetSigma(1,1,.003,.003);
1031  AddCouple(pc);
1032  break;
1033  }
1034  }
1035 
1036  SetCouples();
1037 }
EdbPatCouple * AddCouple(int id1, int id2)
Definition: EdbPVRec.cxx:915
void DeleteCouples()
Definition: EdbPVRec.h:180
void SetOffset(float o1, float o2, float o3, float o4)
Definition: EdbPVRec.h:65
void SetCond(EdbScanCond *cond)
Definition: EdbPVRec.h:74
void SetSigma(float s1, float s2, float s3, float s4)
Definition: EdbPVRec.h:67
void SetSegmentsPID()
Definition: EdbPattern.cxx:1548

◆ SetCouplesPeriodic()

void EdbPVRec::SetCouplesPeriodic ( int  istart,
int  iperiod 
)
982 {
983  // istart: start from pattern
984  // iperiod: distance between patterns
985 
986  DeleteCouples();
987  EdbPatCouple *pc = 0;
988  int npat=Npatterns();
989 
990  if( istart<0 || istart>=npat-iperiod ) return;
991 
992  int ifirst=0;
993  for(int i=0; i<npat; i++ ) {if(GetPattern(i)) ifirst=i; break;}
994  for(int i=ifirst; i<npat; i++ )
995  if(GetPattern(i)) GetPattern(i)->SetSegmentsPID();
996  if(ifirst<istart) istart=ifirst;
997  for(int i=istart; i<npat-iperiod; i+=iperiod ) {
998  pc = new EdbPatCouple();
999  pc->SetID(i,i+iperiod);
1000  pc->SetCond(eScanCond);
1001  pc->SetOffset(0,0,0,0);
1002  pc->SetSigma(1,1,.003,.003); //TODO: organise this sigmas
1003  AddCouple(pc);
1004  }
1005  SetCouples();
1006 }

◆ SetOffsetsMax()

void EdbPVRec::SetOffsetsMax ( float  ox,
float  oy 
)
925 {
926  int ncp=Ncouples();
927  for(int i=0; i<ncp; i++ ) {
928  GetCouple(i)->SetOffsetsMax(ox,oy);
929  }
930 }
void SetOffsetsMax(float ox, float oy)
Definition: EdbPVRec.h:63

◆ SetScanCond()

void EdbPVRec::SetScanCond ( EdbScanCond scan)
inline
171 { eScanCond=scan; }
EdbScanCond * scan
Definition: RecDispNU.C:117

◆ SetScanIDPatSeg()

void EdbPVRec::SetScanIDPatSeg ( EdbID  id)

2973 {
2974  // set eBrick,eMajor and eMinor for all segments of all volume patterns
2975  // leave ePlate as is
2976  for(int i=0; i<Npatterns(); i++) {
2977  EdbPattern *p = GetPattern(i);
2978  for(int j=0; j<p->N(); j++) {
2979  EdbSegP *s = p->GetSegment(j);
2980  id.ePlate = s->Plate();
2981  s->SetScanID(id);
2982  }
2983  }
2984 }
void SetScanID(EdbID id)
Definition: EdbSegP.h:140

◆ SetScanIDTrackSeg()

void EdbPVRec::SetScanIDTrackSeg ( EdbID  id)

2988 {
2989  // set eBrick,eMajor and eMinor for all segments of all volume patterns
2990  // leave ePlate as is
2991  for(int i=0; i<Ntracks(); i++) {
2992  EdbTrackP *t = GetTrack(i);
2993  for(int j=0; j<t->N(); j++) {
2994  EdbSegP *s = t->GetSegment(j);
2995  id.ePlate = s->Plate();
2996  s->SetScanID(id);
2997  }
2998  }
2999 }

◆ SetSegmentErrors()

void EdbPVRec::SetSegmentErrors ( EdbSegP seg)
1096 {
1097  // segment errors are depends on the scanning conditions and segment
1098  // parameters (angles).
1099  // Puls height is represents segments probability (not accuracy) and should
1100  // be taken into account separately
1101 
1102  float sx = GetScanCond()->SigmaX( seg.TX() );
1103  float sy = GetScanCond()->SigmaY( seg.TY() );
1104  float sz = GetScanCond()->SigmaZ( seg.TX(), seg.TY() );
1105  float stx = GetScanCond()->SigmaTX( seg.TX() );
1106  float sty = GetScanCond()->SigmaTY( seg.TY() );
1107 
1108  seg.SetErrors(sx*sx,sy*sy,sz*sz,stx*stx,sty*sty);
1109 }
float SigmaTX(float ax) const
Definition: EdbScanCond.h:106
float SigmaZ(float ax, float ay) const
Definition: EdbScanCond.h:104
float SigmaTY(float ay) const
Definition: EdbScanCond.h:107
float SigmaX(float ax) const
Definition: EdbScanCond.h:102
float SigmaY(float ay) const
Definition: EdbScanCond.h:103
void SetErrors()
Definition: EdbSegP.h:89

◆ SetSegmentProbability()

void EdbPVRec::SetSegmentProbability ( EdbSegP seg)
1113 {
1114  // segment probability is depends on:
1115  // puls height
1116  // signal puls distribution
1117  // noise puls distribution
1118  // angles
1119 
1120  seg.SetProbability( GetScanCond()->ProbSeg(seg.TX(), seg.TY(), seg.W()) );
1121 
1122 }
void SetProbability(float p)
Definition: EdbSegP.h:137

◆ SetSegmentsErrors()

void EdbPVRec::SetSegmentsErrors ( )
1126 {
1127  if(!GetScanCond()) {
1128  Log(1,"EdbPVRec::SetSegmentsErrors","ERROR: ScanCond didn't set!!!");
1129  return;
1130  }
1131  EdbPattern *pat;
1132  EdbSegP *seg;
1133  int npat =Npatterns();
1134  int nseg=0;
1135  for(int i=0; i<npat; i++ ) {
1136  pat = GetPattern(i);
1137  if(!pat) continue;
1138  nseg = pat->N();
1139  for(int j=0; j<nseg; j++ ) {
1140  seg = pat->GetSegment(j);
1141  SetSegmentErrors( *seg );
1142  SetSegmentProbability( *seg );
1143  }
1144  }
1145 }
void SetSegmentErrors(EdbSegP &seg)
Definition: EdbPVRec.cxx:1095
void SetSegmentProbability(EdbSegP &seg)
Definition: EdbPVRec.cxx:1112

◆ SetSegmentsTracks()

void EdbPVRec::SetSegmentsTracks ( )

2471 {
2472  EdbTrackP *tr=0;
2473  int ntr = Ntracks();
2474  for(int i=0; i<ntr; i++) {
2475  tr = GetTrack(i);
2476  tr->SetID(i);
2477  if(tr->Flag()<0) continue;
2478  tr->SetSegmentsTrack();
2479  }
2480 }

◆ Xmax()

float EdbPVRec::Xmax ( )
1053 {
1054  int npat=Npatterns(); if(npat<1) return 0;
1055  float xmax=GetPattern(0)->Xmax();
1056  for(int i=1; i<npat; i++ ) {
1057  float max = GetPattern(i)->Xmax();
1058  if(max>xmax) xmax=max;
1059  }
1060  return xmax;
1061 }
int max
Definition: check_shower.C:41
virtual Float_t Xmax() const
Definition: EdbVirtual.cxx:195
float xmax
Definition: emthickness.cpp:61

◆ Xmin()

float EdbPVRec::Xmin ( )
1041 {
1042  int npat=Npatterns(); if(npat<1) return 0;
1043  float xmin=GetPattern(0)->Xmin();
1044  for(int i=1; i<npat; i++ ) {
1045  float min = GetPattern(i)->Xmin();
1046  if(min<xmin) xmin=min;
1047  }
1048  return xmin;
1049 }
float min(TClonesArray *t)
Definition: bitview.cxx:275
virtual Float_t Xmin() const
Definition: EdbVirtual.cxx:185
float xmin
Definition: emthickness.cpp:61

◆ Ymax()

float EdbPVRec::Ymax ( )
1077 {
1078  int npat=Npatterns(); if(npat<1) return 0;
1079  float ymax=GetPattern(0)->Ymax();
1080  for(int i=1; i<npat; i++ ) {
1081  float max = GetPattern(i)->Ymax();
1082  if(max>ymax) ymax=max;
1083  }
1084  return ymax;
1085 }
virtual Float_t Ymax() const
Definition: EdbVirtual.cxx:215
float ymax
Definition: emthickness.cpp:63

◆ Ymin()

float EdbPVRec::Ymin ( )
1065 {
1066  int npat=Npatterns(); if(npat<1) return 0;
1067  float ymin=GetPattern(0)->Ymin();
1068  for(int i=1; i<npat; i++ ) {
1069  float min = GetPattern(i)->Ymin();
1070  if(min<ymin) ymin=min;
1071  }
1072  return ymin;
1073 }
virtual Float_t Ymin() const
Definition: EdbVirtual.cxx:205
float ymin
Definition: emthickness.cpp:63

Member Data Documentation

◆ eChi2Max

float EdbPVRec::eChi2Max
private

◆ ePatCouples

TObjArray* EdbPVRec::ePatCouples
private

◆ eScanCond

EdbScanCond* EdbPVRec::eScanCond
private

◆ eTracks

TObjArray* EdbPVRec::eTracks

◆ eTracksCell

TIndexCell* EdbPVRec::eTracksCell
private

◆ eVdiff

Long_t EdbPVRec::eVdiff[4]
private

◆ eVTX

TObjArray* EdbPVRec::eVTX

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