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
 EdbPattern* GetPatternByZ(float z) const;. More...
 
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
 array of vertex More...
 
- Public Attributes inherited from EdbPatternsVolume
Bool_t eDescendingZ
 if =0 - z increase in the pattrens array; if =1 - decrease More...
 
TObjArray * ePatterns
 collection of patterns More...
 
TIndexCellePatternsCell
 "pid:id1:chi2:id2" - all found couples More...
 
TIndexCelleTracksCell
 "vidt:vids" - connected segments cell More...
 

Private Attributes

float eChi2Max
 
TObjArray * ePatCouples
 patterns couples More...
 
EdbScanCondeScanCond
 scanning conditions (sigma, puls, etc) More...
 
TIndexCelleTracksCell
 
Long_t eVdiff [4]
 how many ajenced bins should be taken into account More...
 

Constructor & Destructor Documentation

◆ EdbPVRec()

EdbPVRec::EdbPVRec ( )

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

858{
859 ePatCouples = new TObjArray();
860 eTracks = 0;
861 eVTX = 0;
862 eScanCond = 0;
863 eChi2Max=999.;
864 eVdiff[0]=eVdiff[1]=eVdiff[2]=eVdiff[3]=0;
865 eTracksCell = new TIndexCell();
866 gROOT->GetListOfSpecials()->Add(this);
867}
Long_t eVdiff[4]
how many ajenced bins should be taken into account
Definition: EdbPVRec.h:155
float eChi2Max
Definition: EdbPVRec.h:154
TIndexCell * eTracksCell
Definition: EdbPVRec.h:158
TObjArray * eVTX
array of vertex
Definition: EdbPVRec.h:162
TObjArray * ePatCouples
patterns couples
Definition: EdbPVRec.h:152
TObjArray * eTracks
Definition: EdbPVRec.h:161
EdbScanCond * eScanCond
scanning conditions (sigma, puls, etc)
Definition: EdbPVRec.h:156
sort collection with attributes
Definition: TIndexCell.h:19

◆ ~EdbPVRec()

EdbPVRec::~EdbPVRec ( )

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

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 
)

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

◆ AddCouplesToTracks()

void EdbPVRec::AddCouplesToTracks ( EdbPatCouple pc,
TIndex2 itracks 
)
1404{
1405 EdbTrackP *track = 0;
1406
1407 EdbSegCouple *sc = 0;
1408 int ncpp = pc->Ncouples();
1409
1410 Double_t *w = new Double_t[ncpp];
1411
1412 int ind=-1;
1413 int nind=itracks.GetSize();
1414
1415 for(int ip=0; ip<ncpp; ip++) {
1416 sc = pc->GetSegCouple(ip);
1417 track=0;
1418
1419 if(nind) ind = itracks.FindIndex( sc->ID1() );
1420 else ind = -1;
1421
1422 if(ind>-1) track = (EdbTrackP*)(eTracks->At(ind));
1423 if(!track) {
1424 track = new EdbTrackP();
1425 track->AddSegment( GetPattern(pc->ID1())->GetSegment(sc->ID1()) );
1426 AddTrack(track);
1427 ind = eTracks->GetLast();
1428 }
1429 track->AddSegment( GetPattern(pc->ID2())->GetSegment(sc->ID2()) );
1430
1431 w[ip] = TIndex2::BuildValue( sc->ID2(), ind );
1432 }
1433 itracks.Set(0);
1434 itracks.BuildIndex(ncpp,w);
1435 delete[] w;
1436}
void AddTrack(EdbTrackP *track)
Definition: EdbPVRec.h:246
EdbSegCouple * GetSegCouple(int i) const
Definition: EdbPVRec.h:85
int ID2() const
Definition: EdbPVRec.h:132
int ID1() const
Definition: EdbPVRec.h:131
int Ncouples() const
Definition: EdbPVRec.h:80
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
Definition: EdbSegCouple.h:17
int ID2() const
Definition: EdbSegCouple.h:56
int ID1() const
Definition: EdbSegCouple.h:55
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
Definition: EdbPattern.h:113
static Double_t BuildValue(Int_t major, Int_t minor)
Definition: EdbMath.h:58
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 
)

merge segments into clusters

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

◆ AddSegment()

EdbSegP * EdbPVRec::AddSegment ( EdbSegP s)

add new segment to this create and insert new pattern if needed plate, side and Z for the segment should be correctly defined Note: slow function - use for additional segments only as "manual check" etc

2926{
2931
2932 EdbPattern *p = GetPatternByPlate( s.Plate(), s.Side() );
2933 if(!p) {
2934 Log(1,"EdbPVRec::AddSegment",
2935 "WARNING: The pattern for plate/side %d/%d does not found, add new one with z = %f ",
2936 s.Plate(), s.Side(), s.Z() );
2937 p = new EdbPattern( 0., 0., s.Z() );
2938 p->SetID(s.PID());
2939 p->SetScanID( s.ScanID() );
2940 p->SetSide( s.Side() );
2942 }
2943 return p->AddSegment(s);
2944}
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
Definition: EdbPattern.h:273
Bool_t eDescendingZ
if =0 - z increase in the pattrens array; if =1 - decrease
Definition: EdbPattern.h:347
EdbPattern * GetPatternByPlate(int plate, int side)
Definition: EdbPattern.cxx:1767
EdbPattern * InsertPattern(EdbPattern *pat, Bool_t descendingZ=0)
Definition: EdbPattern.cxx:1778
s
Definition: check_shower.C:55
p
Definition: testBGReduction_AllMethods.C:8

◆ AddSegments() [1/2]

int EdbPVRec::AddSegments ( EdbPVRec ali)

2948{
2949 // copy the segments from ali and add them to this
2950 int nseg=0;
2951 for(int i=0; i<ali.Npatterns(); i++) {
2952 EdbPattern *pa = GetPattern(i);
2953 for(int j=0; j<pa->N(); j++) {
2954 AddSegment( *(pa->GetSegment(j)) );
2955 nseg++;
2956 }
2957 }
2958 Log(2,"EdbPVRec::AddSegments","%d new segments are inserted",nseg);
2959 return nseg;
2960}
EdbSegP * AddSegment(EdbSegP &s)
Definition: EdbPVRec.cxx:2925
Int_t Npatterns() const
Definition: EdbPattern.h:366
Int_t N() const
Definition: EdbPattern.h:86
EdbPVRec * ali
Definition: test_oracle.C:9

◆ AddSegments() [2/2]

int EdbPVRec::AddSegments ( EdbTrackP track)

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

◆ 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)
1211{
1212 if(alignFlag<10) return AlignOld(alignFlag);
1213 else {
1214 EdbScanSet sci, sca;
1215 for(int i=0; i<Npatterns(); i++) {
1216 EdbPlateP *pl = new EdbPlateP();
1217 EdbPattern *p = GetPattern(i);
1218 pl->SetID( p->PID() );
1219 pl->SetZlayer( p->Z(), p->Z(), p->Z() );
1220 sci.eB.AddPlate(pl);
1221 }
1222 sci.MakePIDList();
1223 sca.Copy(sci);
1224 return AlignPlates( sci, sca );
1225 }
1226}
void AddPlate(EdbPlateP *pl)
Definition: EdbBrick.h:52
void SetZlayer(float z, float zmin, float zmax)
Definition: EdbLayer.h:101
void SetID(int id)
Definition: EdbLayer.h:94
int AlignOld(int alignFlag)
Definition: EdbPVRec.cxx:1280
int AlignPlates(EdbScanSet &sci, EdbScanSet &sca, const char *reportdir=0)
Definition: EdbPVRec.cxx:1229
Definition: EdbBrick.h:14
Definition: EdbScanSet.h:11
void MakePIDList()
Definition: EdbScanSet.cxx:178
void Copy(EdbScanSet &sc)
Definition: EdbScanSet.cxx:51
EdbBrickP eB
all layers of the brick defined here
Definition: EdbScanSet.h:13

◆ AlignOld()

int EdbPVRec::AlignOld ( int  alignFlag)

align patterns in volume

1281{
1283 int npat=Npatterns();
1284
1285 TObjArray aKeep(Npatterns());
1286 EdbAffine2D *a0;
1287
1288 int i;
1289 for(i=0; i<npat; i++ ) {
1290 a0 = new EdbAffine2D();
1291 GetPattern(i)->GetKeep(*a0);
1292 aKeep[i]=a0;
1293 }
1294
1295
1296 SetCouples();
1297 EdbPatCouple *pc = 0;
1298 int ncp = Ncouples();
1299 for(i=0; i<ncp; i++ ) {
1300 pc = GetCouple(i);
1301 pc->Align(alignFlag);
1302 }
1303
1304
1305 EdbAffine2D a;
1306 npat = Npatterns();
1307 for(i=npat-1; i>0; i-- ) {
1308 GetPattern(i)->GetKeep(a);
1309 a0=(EdbAffine2D *)(aKeep.At(i));
1310 a0->Invert();
1311 a0->Transform(&a);
1312 GetPattern(i-1)->Transform(a0);
1313 }
1314
1315 return npat;
1316}
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:934
EdbPatCouple * GetCouple(int i) const
Definition: EdbPVRec.h:190
Int_t Ncouples() const
Definition: EdbPVRec.h:188
int Align(int alignFlag)
Definition: EdbPVRec.cxx:534
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:155
virtual const EdbAffine2D * GetKeep() const
Definition: EdbVirtual.h:176

◆ AlignPlates()

int EdbPVRec::AlignPlates ( EdbScanSet sci,
EdbScanSet sca,
const char *  reportdir = 0 
)
1230{
1231 int npat = Npatterns();
1232 if(npat<2) return 0;
1233 for(int i=0; i<npat-1; i++) {
1234 EdbPattern *p1 = GetPattern(i);
1235 EdbPattern *p2 = GetPattern(i+1);
1236 EdbPlateP *plate1 = sc.GetPlate(p1->PID());
1237 EdbPlateP *plate2 = sc.GetPlate(p2->PID());
1238 Log(1,"AlignPlates","\n align %d -> %d", p1->PID(), p2->PID() );
1239 EdbPlateP *pc = new EdbPlateP(); // "couple" to be used for the alignment
1240 pc->GetLayer(1)->SetID(plate1->ID());
1241 pc->GetLayer(2)->SetID(plate2->ID());
1242 float DZ = plate2->Z()-plate1->Z();
1243
1244 gROOT->SetBatch();
1246
1247 if(reportdir)
1248 av.InitOutputFile( Form("%6d/%2.2d_%2.2d.al.root",sc.eB.ID(),p1->PID(),p2->PID()) );
1249
1250 av.Align( *p1, *p2 , DZ );
1251 p1->SetNAff( av.eNcoins );
1252
1253 if(reportdir)
1254 av.CloseOutputFile();
1255
1256 if( av.eStatus ) {
1257 pc->GetLayer(1)->CopyCorr( av.eCorrL[0] );
1258 pc->GetLayer(2)->CopyCorr( av.eCorrL[1] );
1259 pc->GetLayer(1)->SetZlayer( -(pc->GetLayer(1)->Zcorr()), 0, 0);
1260 } else pc->GetLayer(1)->SetZlayer( -DZ, 0, 0 );
1261
1262 sca.ePC.Add(pc);
1263 }
1264 sca.eB.SetID(sca.eB.ID());
1265 sca.AssembleBrickFromPC();
1266 sca.SetAsReferencePlate( sc.eB.GetPlate(npat-1)->ID() ); // last plate is the reference one
1267
1268 for(int i=0; i<npat; i++) {
1269 EdbPattern *p = GetPattern(i);
1270 p->Transform( sca.eB.GetPlate(i)->GetAffineXY() );
1271 p->SetZ( sca.eB.GetPlate(i)->Z() );
1272 p->SetSegmentsZ();
1273 p->SetSegmentsDZ(300);
1274 }
1275
1276 return npat;
1277}
EdbLayer eCorrL[2]
corrections in form of affine transformations - the final output
Definition: EdbAlignmentV.h:25
void InitOutputFile(const char *file="report_al.root", const char *option="RECREATE")
IO, initialization and finalization functions.
Definition: EdbAlignmentV.cxx:41
void CloseOutputFile()
Definition: EdbAlignmentV.cxx:48
EdbPlateP * GetPlate(int i)
Definition: EdbBrick.h:53
float Zcorr() const
Definition: EdbLayer.h:90
int ID() const
Definition: EdbLayer.h:73
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:119
void CopyCorr(const EdbLayer &l)
Definition: EdbLayer.cxx:53
float Z() const
Definition: EdbLayer.h:77
int PID() const
Definition: EdbPattern.h:320
void SetNAff(int n)
Definition: EdbPattern.h:311
plate-to-plate alignment
Definition: EdbPlateAlignment.h:8
void Align(EdbPattern &p1, EdbPattern &p2, float dz)
Definition: EdbPlateAlignment.cxx:61
Bool_t eStatus
overall alignment result (true - OK)
Definition: EdbPlateAlignment.h:24
Int_t eNcoins
final number of coinsidence used for affine calc
Definition: EdbPlateAlignment.h:25
EdbLayer * GetLayer(int i)
Definition: EdbBrick.h:29
Int_t AssembleBrickFromPC()
Definition: EdbScanSet.cxx:130
Bool_t SetAsReferencePlate(Int_t pid)
Definition: EdbScanSet.cxx:191
TObjArray ePC
Plate Couples. Each couple represented as EdbPlateP where 2 sides in reality corresponds to 2 plates.
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

Return value: Prob: is Chi2 probability (area of the tail of Chi2-distribution) If we accept couples with Prob >= ProbMinP then ProbMinP is the probability to reject the good couple

The mass and momentum of the tr are used for multiple scattering estimation

2756{
2762
2763 float ds; // distance in the media for MS estimation
2764 double teta0sq;
2765 double dz;
2766
2767 const EdbSegP *snear=0;
2768 if( TMath::Abs( s->Z() - tr.TrackZmin()->Z() ) <
2769 TMath::Abs( s->Z() - tr.TrackZmax()->Z() ) ) snear = tr.TrackZmin();
2770 else snear = tr.TrackZmax();
2771
2772 VtVector par( (double)(snear->X()),
2773 (double)(snear->Y()),
2774 (double)(snear->TX()),
2775 (double)(snear->TY()) );
2776
2777 VtSymMatrix cov(4); // covariance matrix for seg0 (measurements errors)
2778 for(int k=0; k<4; k++)
2779 for(int l=0; l<4; l++) cov(k,l) = (snear->COV())(k,l);
2780
2781 Double_t chi2=0.;
2782
2783
2784 VtSymMatrix dms(4); // multiple scattering matrix (depends on P,m)
2785 dms.clear();
2786
2787 dz = s->Z()-snear->Z();
2788 ds = dz*TMath::Sqrt(1.+par(2)*par(2)+par(3)*par(3)); // thickness of media in microns
2789 teta0sq = EdbPhysics::ThetaMS2( tr.P(), tr.M(), ds, X0 );
2790
2791 dms(0,0) = teta0sq*dz*dz/3.;
2792 dms(1,1) = dms(0,0);
2793 dms(2,2) = teta0sq;
2794 dms(3,3) = dms(2,2);
2795 dms(2,0) = teta0sq*dz/2.;
2796 dms(3,1) = dms(2,0);
2797 dms(0,2) = dms(2,0);
2798 dms(1,3) = dms(2,0);
2799
2800 VtSqMatrix pred(4); //propagation matrix for track parameters (x,y,tx,ty)
2801 pred.clear();
2802
2803 pred(0,0) = 1.;
2804 pred(1,1) = 1.;
2805 pred(2,2) = 1.;
2806 pred(3,3) = 1.;
2807 pred(0,2) = dz;
2808 pred(1,3) = dz;
2809
2810 VtVector parpred(4); // prediction from seg0 to seg
2811 parpred = pred*par;
2812
2813 VtSymMatrix covpred(4); // covariance matrix for prediction
2814 covpred = pred*(cov*pred.T())+dms;
2815
2816 VtSymMatrix dmeas(4); // original covariance matrix for seg2
2817 for(int k=0; k<4; k++)
2818 for(int l=0; l<4; l++) dmeas(k,l) = (s->COV())(k,l);
2819
2820 covpred = covpred.dsinv();
2821 dmeas = dmeas.dsinv();
2822 cov = covpred + dmeas;
2823 cov = cov.dsinv();
2824
2825 VtVector meas( (double)(s->X()),
2826 (double)(s->Y()),
2827 (double)(s->TX()),
2828 (double)(s->TY()) );
2829
2830 par = cov*(covpred*parpred + dmeas*meas); // new parameters for seg
2831
2832 chi2 = (par-parpred)*(covpred*(par-parpred)) + (par-meas)*(dmeas*(par-meas));
2833
2834 prob = (float)TMath::Prob(chi2,4);
2835
2836 if (prob >= ProbMinP)
2837 {
2838 EdbSegP *sfnew = new EdbSegP( tr.ID(),
2839 (float)par(0),(float)par(1),(float)par(2),(float)par(3),
2840 tr.W()+1.,tr.Flag() );
2841
2842 sfnew->SetCOV( cov.array(), 4 );
2843 sfnew->SetChi2((float)chi2);
2844 sfnew->SetProb(prob);
2845 sfnew->SetZ(s->Z());
2846
2847 tr.AddSegment(s);
2848 tr.AddSegmentF(sfnew);
2849
2850 return true;
2851 }
2852 return false;
2853}
T Prob(const T &rhs, int n)
Definition: Prob.hh:37
brick dz
Definition: RecDispMC.C:107
brick X0
Definition: RecDispMC.C:112
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
static double ThetaMS2(float p, float mass, float dx, float X0)
Definition: EdbPhys.cxx:51
Definition: EdbSegP.h:21
void SetProb(float prob)
Definition: EdbSegP.h:134
Float_t TX() const
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t X() const
Definition: EdbSegP.h:173
TMatrixD & COV() const
Definition: EdbSegP.h:123
Float_t Z() const
Definition: EdbSegP.h:153
void SetZ(float z)
Definition: EdbSegP.h:125
Float_t Y() const
Definition: EdbSegP.h:174
void SetCOV(TMatrixD &cov)
Definition: EdbSegP.h:99
void SetChi2(float chi2)
Definition: EdbSegP.h:135
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
Definition: VtSqMatrix.hh:50
Definition: VtSymMatrix.hh:49
Definition: VtVector.hh:45
EdbDisplay * ds
Definition: check_vertex.C:16
float ProbMinP
Definition: check_vertex.C:22
Float_t chi2
Definition: testBGReduction_By_ANN.C:14

◆ Chi2Fast()

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

◆ Chi2Max()

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

◆ CollectSegment()

int EdbPVRec::CollectSegment ( TIndexCell ct,
TIndexCell cross 
)
1642{
1643 TIndexCell *cc =0;
1644 int ncc =0;
1645 int nct = ct->N(1);
1646 int flag=0;
1647 for(int j=0; j<nct; j++) {
1648 cc = cross->Find( ct->At(j)->Value() );
1649 ncc = cc->N(1);
1650 if(!ncc) continue;
1651 flag++;
1652 for(int icc=0; icc<ncc; icc++) {
1653 ct->FindAdd(cc->At(icc)->Value());
1654 }
1655 cc->List()->Delete();
1656 if(!CollectSegment(ct,cross)) return 0;
1657 }
1658 return flag;
1659}
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:1641
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
TObjArray * List() const
Definition: TIndexCell.h:78
Int_t N() const
Definition: TIndexCell.cpp:344

◆ CollectSegment1()

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

◆ CombTracks()

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

eliminate crossing&overlapping tracks with multiple segments usage discard tracks with probability < probMin

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

◆ DeleteCouples()

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

◆ DummyCycle()

void EdbPVRec::DummyCycle ( )
1172{
1173 int npat=Npatterns();
1174 Log(3,"EdbPVRec::DummiCycle","npat=%d",npat);
1175 for(int ipat=0; ipat<npat; ipat++) {
1176 EdbPattern *p = GetPattern(ipat);
1177 int nseg=p->N();
1178 Log(3,"EdbPVRec::DummiCycle","pat %d, nseg= %d",ipat, nseg);
1179 for(int iseg=0; iseg<nseg; iseg++) {
1180 EdbSegP *s = p->GetSegment(iseg);
1181 if(s->Flag()==-999) Log(1,"EdbPVRec::DummiCycle","jo pa");
1182 }
1183 }
1184}

◆ ExtractDataVolumeSeg()

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

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

◆ ExtractDataVolumeSegAll()

int EdbPVRec::ExtractDataVolumeSegAll ( TObjArray &  arr)

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

◆ FillCell()

void EdbPVRec::FillCell ( float  stepx,
float  stepy,
float  steptx,
float  stepty 
)
1093{
1094 int npat=Npatterns();
1095 for(int i=0; i<npat; i++ ) GetPattern(i)->FillCell(stepx,stepy,steptx,stepty);
1096}
void FillCell(float stepx, float stepy, float steptx, float stepty)
Definition: EdbPattern.cxx:1323

◆ FillTracksCell()

void EdbPVRec::FillTracksCell ( )

TODO: speed-up this algorithm

fill tracks cell "vid1:vid2" second segment is considered as leading one

1320{
1322
1325
1326 Log(2,"\nEdbPVRec::FillTracksCell","...");
1327
1328 Long_t vid1,vid2;
1329
1330 if(!eTracksCell) eTracksCell = new TIndexCell();
1331 TIndexCell *tracksCell = eTracksCell; // "vid1:vid2"
1332 TIndexCell *cc=0;
1333
1334 if(tracksCell) tracksCell->Drop();
1335
1336 EdbPatCouple *pc = 0;
1337 EdbSegCouple *sc = 0;
1338
1339 int ncp = Ncouples();
1340 int ncpp;
1341 for(int iv=0; iv<ncp; iv++ ) {
1342 pc = GetCouple(iv);
1343 ncpp = pc->Ncouples();
1344 for(int ip=0; ip<ncpp; ip++) {
1345 sc = pc->GetSegCouple(ip);
1346
1347 vid1 = Vid( pc->ID1(),sc->ID1() );
1348 vid2 = Vid( pc->ID2(),sc->ID2() );
1349
1350 cc=tracksCell->FindAdd(vid1);
1351 if(!cc->N(1)) cc->Add(vid1);
1352 cc->Add(vid2);
1353 cc->SetValue(vid2);
1354 }
1355 }
1356 tracksCell->Sort();
1357 if(gEDBDEBUGLEVEL>1) tracksCell->PrintPopulation(1);
1358}
Long_t Vid(int pid, int sid) const
Definition: EdbPattern.h:393
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 ( )

TODO: speed-up this algorithm

fill tracks cell "vid1:vid2" second segment is considered as leading one

TIndexCell *cross = new TIndexCell();

1517{
1519
1522 Long_t vid1,vid2;
1523
1524 TIndexCell *tracks = eTracksCell; // "vid1:vid2"
1525 TIndexCell *cc=0;
1526 TIndexCell *cv1=0;
1527 TIndexCell *cv2=0;
1528
1529 THashList *cross = new THashList();
1531
1532 if(tracks) tracks->Drop();
1533
1534 EdbPatCouple *pc = 0;
1535 EdbSegCouple *sc = 0;
1536
1537 int ncp = Ncouples();
1538 int ncpp;
1539 for(int iv=0; iv<ncp; iv++ ) {
1540 pc = GetCouple(iv);
1541 ncpp = pc->Ncouples();
1542 Log(2,"EdbPVRec::FillTracksCell1","cross: %d %d\n",iv,ncpp);
1543 for(int ip=0; ip<ncpp; ip++) {
1544 sc = pc->GetSegCouple(ip);
1545
1546 vid1 = Vid( pc->ID1(),sc->ID1() );
1547 vid2 = Vid( pc->ID2(),sc->ID2() );
1548 cv1 = new TIndexCell(vid1);
1549 cv2 = new TIndexCell(vid2);
1550 if( !(cc=(TIndexCell*)cross->FindObject(cv1)) ) { cross->Add(cv1); cc=cv1; }
1551 cc->FindAdd(vid2);
1552 if( !(cc=(TIndexCell*)cross->FindObject(cv2)) ) { cross->Add(cv2); cc=cv2; }
1553 cc->FindAdd(vid1);
1554 }
1555 }
1556
1557 TIndexCell *ct=0;
1558 int ncross = cross->GetSize();
1559 Log(2,"EdbPVRec::FillTracksCell1","ncross = %d",ncross);
1560 int ncc=0;
1561
1562 for(int i=0; i<ncross; i++) {
1563 cc = (TIndexCell*)(cross->At(i));
1564 ncc = cc->N(1);
1565 if(!ncc) continue;
1566
1567 ct = tracks->FindAdd(cc->Value());
1568 ct->FindAdd(cc->Value());
1569
1571 }
1572
1573 tracks->Sort();
1574 tracks->PrintPopulation(1);
1575}
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 ( )

TODO: speed-up this algorithm

fill tracks cell "vid1:vid2" second segment is considered as leading one

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

◆ FillTracksCellFast()

void EdbPVRec::FillTracksCellFast ( )

fill tracks cell "vid1:vid2" second segment is considered as leading one

1362{
1365
1366 int ncp = Ncouples();
1367 Log(2,"EdbPVRec::FillTracksCellFast","build tracks from couples for ncp=%d ...", ncp);
1368 if(ncp<1) return;
1369
1370 SafeDelete(eTracks);
1371 eTracks = new TObjArray();
1372
1373 EdbPatCouple *pc = 0;
1374 TIndex2 itracks(0);
1375
1376 for( int iv=0; iv<ncp; iv++ ) {
1377 pc = GetCouple(iv);
1378 AddCouplesToTracksM( pc , itracks );
1379 }
1380
1381
1382 //TODO: split&analyse tracks
1383
1384 int nsegmax=100, nfound=0;
1385 TArrayI segtab(nsegmax);
1386 segtab.Reset();
1387 int nseg=0;
1388 int ntr = eTracks->GetEntries();
1389 for( int i=0; i<ntr; i++ ) {
1390 nseg=((EdbTrackP*)(eTracks->At(i)))->N();
1391 if(nseg>nsegmax-1) nseg=nsegmax;
1392 if(nseg>nfound) nfound=nseg;
1393 segtab[nseg] = segtab[nseg]+1;
1394 }
1395
1396 for(int i=0; i<nfound+1; i++)
1397 Log(2,"EdbPVRec::FillTracksCellFast","%d \t tracks with %d segments",segtab[i],i);
1398
1399 Log(2,"EdbPVRec::FillTracksCellFast","%d tracks are found", ntr);
1400}
void AddCouplesToTracksM(EdbPatCouple *pc, TIndex2 &itracks)
Definition: EdbPVRec.cxx:1439
simple index class for fast search in linear cases
Definition: EdbMath.h:50

◆ FindSegment()

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

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

◆ FindTrack()

EdbTrackP * EdbPVRec::FindTrack ( int  id) const

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

◆ FineCorrF()

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

◆ FineCorrShr()

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

◆ FineCorrTXTY()

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

◆ FineCorrXY()

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

◆ FineCorrZ()

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

◆ FineCorrZnew()

int EdbPVRec::FineCorrZnew ( )

calculate z-correction for all patterns based on linked tracks of any length gaps to be ignored...

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

◆ FitTracks()

void EdbPVRec::FitTracks ( float  p = 10.,
float  mass = 0.139,
TObjArray *  gener = 0,
int  design = 0 
)

measurement errors: TODO TODO: move gener logic out from EdbPVRec; i voobshe polnyi bardak v etoi funkzii

1894{
1897
1898 float X0 = GetScanCond()->RadX0();
1899 float pms = 0.;
1900 int nsegmatch = 0;
1901
1902 int ntr = eTracks->GetEntries();
1903
1904 if (p > 0. && mass > 0.)
1905 printf("fit %d tracks assuming p = %f, mass = %f and X0 = %f ...\n",
1906 ntr,p,mass,X0);
1907 else if ( p < 0. && mass > 0.)
1908 printf("fit %d tracks assuming MC momentum, mass = %f and X0 = %f ...\n",
1909 ntr,mass,X0);
1910 else if ( p == 0. && mass > 0.)
1911 printf("fit %d tracks with MS momentum, mass = %f and X0 = %f ...\n",
1912 ntr,mass,X0);
1913 else if ( p > 0. && mass < 0.)
1914 printf("fit %d tracks assuming p = %f, MC mass and X0 = %f ...\n",
1915 ntr,p,X0);
1916 else if ( p < 0. && mass < 0.)
1917 printf("fit %d tracks assuming MC momentum, MC mass and X0 = %f ...\n",
1918 ntr,X0);
1919 else if ( p == 0. && mass < 0.)
1920 printf("fit %d tracks with MS momentum, MC mass and X0 = %f ...\n",
1921 ntr,X0);
1922 else if ( p > 0. && mass == 0.)
1923 printf("fit %d tracks assuming p = %f, pre-defined mass and X0 = %f ...\n",
1924 ntr,p,X0);
1925 else if ( p < 0. && mass == 0.)
1926 printf("fit %d tracks assuming MC momentum, pre-defined mass and X0 = %f ...\n",
1927 ntr,X0);
1928 else if ( p == 0. && mass == 0.)
1929 printf("fit %d tracks with MS momentum, pre-defined mass and X0 = %f ...\n",
1930 ntr,X0);
1931
1932
1934 tf.eX0 = X0;
1935 tf.eM = mass;
1936 EdbTrackP *tr = 0, *trg = 0;
1937 int nseg, itrg;
1938
1939 for(int itr=0; itr<ntr; itr++) {
1940 tr = (EdbTrackP*)(eTracks->At(itr));
1941
1942 tr->ClearF();
1943
1944 nseg = tr->N();
1945
1946 if(p>0) tr->SetP(p);
1947 else if(p<0 && gener)
1948 {
1949 if ((itrg = tr->GetSegmentsMCTrack(nsegmatch)) >= 0)
1950 {
1951 trg = (EdbTrackP*)(gener->At(itrg));
1952 if (trg)
1953 {
1954 tr->SetP(trg->P());
1955 }
1956 }
1957 }
1958 else if (p == 0.)
1959 {
1960 if (tr->P() == 0.)
1961 {
1962 pms = tf.P_MS(*tr);
1963 if (pms < 0.05) pms = 0.05;
1964 else if (pms > 30.0) pms = 30.;
1965 tr->SetP(pms);
1966 }
1967 }
1968 else tr->SetP(4.);
1969
1970 if(mass>0) tr->SetM(mass);
1971 else if(mass<0 && gener)
1972 {
1973 if ((itrg = tr->GetSegmentsMCTrack(nsegmatch)) >= 0)
1974 {
1975 trg = (EdbTrackP*)(gener->At(itrg));
1976 if (trg)
1977 {
1978 tr->SetM(trg->M());
1979 }
1980 }
1981 }
1982 else if (tr->M() == 0.) tr->SetM(0.139);
1983 tr->FitTrackKFS(false,X0,design);
1984 }
1985
1986}
int design
Definition: RecDispMC.C:90
Definition: EdbMomentumEstimator.h:21
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
rad length of the media [microns]
Definition: EdbTrackFitter.h:23
float eM
mass of the particle (if negative - use the mass setted in the track)
Definition: EdbTrackFitter.h:24
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)

2903{
2904 EdbPattern *p=0;
2905 for(int i=0; i<Npatterns(); i++) {
2906 p = GetPattern(i);
2907 if(p) if(p->PID()==pid) return p;
2908 }
2909 return 0;
2910}
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:69

◆ GetVertices()

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

◆ InsertHole()

int EdbPVRec::InsertHole ( const EdbSegP s1,
const EdbSegP s2,
int  pid 
)
1731{
1732 EdbSegP s;
1734 s.SetFlag(-1);
1735 s.SetW( (s1->W()+s2->W())/2 );
1736 EdbPattern *pat = GetPattern(pid);
1737 //s.SetProbability( pat->Cond()->ProbSeg( s.TX(),s.TY(),s.W() );
1738 s.PropagateTo(pat->Z());
1739 s.SetDZ(s1->DZ());
1740 pat->AddSegment(s);
1741 return pat->N()-1;
1742}
Float_t DZ() const
Definition: EdbSegP.h:154
static void LinkMT(const EdbSegP *s1, const EdbSegP *s2, EdbSegP *s)
Definition: EdbSegP.cxx:130
Float_t W() const
Definition: EdbSegP.h:151
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:72

◆ InsertTrack()

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

◆ Link()

int EdbPVRec::Link ( )

link tracks in aligned volume

1188{
1190
1191 int npat=0;
1192 SetCouples();
1193
1194 EdbPatCouple *pc = 0;
1195
1196 int ncp=Ncouples();
1197 for(int i=0; i<ncp; i++ ) {
1198 DummyCycle();
1199 pc = GetCouple(i);
1200 pc->LinkFast();
1201 pc->CutCHI2P(eChi2Max);
1202 pc->SortByCHI2P();
1203 npat += pc->Ncouples();
1204 }
1205 Log(3,"EdbPVRec::Link","total number of linked segments = %d",npat);
1206 return npat;
1207}
void DummyCycle()
Definition: EdbPVRec.cxx:1171
int LinkFast()
Definition: EdbPVRec.cxx:666
int SortByCHI2P()
Definition: EdbPVRec.cxx:491
int CutCHI2P(float chimax)
Definition: EdbPVRec.cxx:452

◆ LinkSlow()

int EdbPVRec::LinkSlow ( )

link tracks in aligned volume

1153{
1155 int npat=0;
1156 SetCouples();
1157
1158 EdbPatCouple *pc = 0;
1159
1160 int ncp=Ncouples();
1161 for(int i=0; i<ncp; i++ ) {
1162 pc = GetCouple(i);
1163 pc->LinkSlow( Chi2Max() );
1164 npat = pc->SortByCHI2P();
1165 }
1166 Log(2,"EdbPVRec::LinkSlow"," npat= %d",npat);
1167 return npat;
1168}
float Chi2Max() const
Definition: EdbPVRec.h:185
int LinkSlow(float chi2max)
Definition: EdbPVRec.cxx:587

◆ MakeHoles()

int EdbPVRec::MakeHoles ( int  ort)

holes attached only from the one side corresponding to ort only tracks with nseg>= abs(ort) are extrapolated

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

◆ MakeSummaryTracks()

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

◆ MakeTracks()

int EdbPVRec::MakeTracks ( int  nsegments = 2,
int  flag = 0 
)

extract from index_table tracks longer then nsegments and form tracks array assign the flag to the newly created tracks return the number of created tracks

1990{
1995
1996 int ntr0 = 0;
1997 if( eTracks ) ntr0 = eTracks->GetEntries();
1998 else eTracks = new TObjArray();
1999
2000 Log(2,"\nEdbPVRec::MakeTracks","ntr0=%d...",ntr0);
2001
2002 int nseg, ntr=0;
2003 Long_t vid=0;
2004 EdbSegP *seg=0;
2005 EdbTrackP *track = 0;
2006 TIndexCell *ct=0;
2007
2008 int ntc=eTracksCell->GetEntries();
2009 for(int it=0; it<ntc; it++) {
2010
2011 ct = eTracksCell->At(it);
2012 nseg = ct->GetEntries();
2013 if( nseg < nsegments ) continue;
2014 track = new EdbTrackP(nseg);
2015
2016 track->SetNpl( Pid(ct->At(nseg-1)->Value()) - Pid(ct->At(0)->Value()) +1 );
2017
2018 for(int is=0; is<nseg; is++) {
2019 vid = ct->At(is)->Value();
2020 seg = GetSegment(vid);
2021 track->AddSegment(seg);
2022 }
2023 eTracks->Add(track);
2024 ntr++;
2025 }
2026
2027 for(int i=ntr0; i<ntr0+ntr; i++) {
2028 track = GetTrack(i);
2029 track->SetID(i);
2030 track->SetFlag(flag);
2031 track->SetCounters();
2032 }
2033
2034 Log(2,"EdbPVRec::MakeTracks","%d tracks with >= %d segments are selected",ntr, nsegments);
2035 return ntr;
2036}
EdbSegP * GetSegment(Long_t vid) const
Definition: EdbPattern.h:397

◆ MergeTracks()

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

◆ MergeTracks1()

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

◆ Ncouples()

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

◆ NSeg()

Int_t EdbPVRec::NSeg ( )

2914{
2915 EdbPattern *p=0;
2916 Int_t nseg=0;
2917 for(int i=0; i<Npatterns(); i++) {
2918 p = GetPattern(i);
2919 nseg+=p->N();
2920 }
2921 return nseg;
2922}

◆ 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 ( )

Print Summary Information of relevant data of this object. Useful for debugging purposes.

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

◆ ProbeSeg() [1/3]

double EdbPVRec::ProbeSeg ( const EdbSegP s1,
EdbSegP s2,
const float  X0 = 5810.,
const float  mass = 0.1396 
)
static

Return value: Prob: is Chi2 probability (area of the tail of Chi2-distribution) If we accept couples with Prob >= ProbMin then ProbMin is the probability to reject the good couple

The mass and momentum of the tr are used for multiple scattering estimation

2677{
2683
2684 float ds; // distance in the media for MS estimation
2685 double teta0sq;
2686 double dz;
2687
2688 VtVector par( (double)(tr->X()),
2689 (double)(tr->Y()),
2690 (double)(tr->TX()),
2691 (double)(tr->TY()) );
2692
2693 VtSymMatrix cov(4); // covariance matrix for seg0 (measurements errors)
2694 for(int k=0; k<4; k++)
2695 for(int l=0; l<4; l++) cov(k,l) = (tr->COV())(k,l);
2696
2697 Double_t chi2=0.;
2698
2699
2700 VtSymMatrix dms(4); // multiple scattering matrix (depends on P,m)
2701 dms.clear();
2702
2703 dz = s->Z()-tr->Z();
2704 ds = dz*TMath::Sqrt(1.+par(2)*par(2)+par(3)*par(3)); // thickness of media in microns
2705 teta0sq = EdbPhysics::ThetaMS2( tr->P(), ma, ds, X0 );
2706
2707 dms(0,0) = teta0sq*dz*dz/3.;
2708 dms(1,1) = dms(0,0);
2709 dms(2,2) = teta0sq;
2710 dms(3,3) = dms(2,2);
2711 dms(2,0) = teta0sq*dz/2.;
2712 dms(3,1) = dms(2,0);
2713 dms(0,2) = dms(2,0);
2714 dms(1,3) = dms(2,0);
2715
2716 VtSqMatrix pred(4); //propagation matrix for track parameters (x,y,tx,ty)
2717 pred.clear();
2718
2719 pred(0,0) = 1.;
2720 pred(1,1) = 1.;
2721 pred(2,2) = 1.;
2722 pred(3,3) = 1.;
2723 pred(0,2) = dz;
2724 pred(1,3) = dz;
2725
2726 VtVector parpred(4); // prediction from seg0 to seg
2727 parpred = pred*par;
2728
2729 VtSymMatrix covpred(4); // covariance matrix for prediction
2730 covpred = pred*(cov*pred.T())+dms;
2731
2732 VtSymMatrix dmeas(4); // original covariance matrix for seg2
2733 for(int k=0; k<4; k++)
2734 for(int l=0; l<4; l++) dmeas(k,l) = (s->COV())(k,l);
2735
2736 covpred = covpred.dsinv();
2737 dmeas = dmeas.dsinv();
2738 cov = covpred + dmeas;
2739 cov = cov.dsinv();
2740
2741 VtVector meas( (double)(s->X()),
2742 (double)(s->Y()),
2743 (double)(s->TX()),
2744 (double)(s->TY()) );
2745
2746 par = cov*(covpred*parpred + dmeas*meas); // new parameters for seg
2747
2748 chi2 = (par-parpred)*(covpred*(par-parpred)) + (par-meas)*(dmeas*(par-meas));
2749
2750 return TMath::Prob(chi2,4);
2751}

◆ ProbeSeg() [2/3]

double EdbPVRec::ProbeSeg ( const EdbTrackP s1,
EdbSegP s2,
const float  X0 = 5810. 
)
static
2666{
2667 return ProbeSeg( (EdbSegP*)tr, s, X0, tr->M() );
2668}
static double ProbeSeg(const EdbTrackP *s1, EdbTrackP *s2, const float X0=5810.)
Definition: EdbPVRec.cxx:2658

◆ ProbeSeg() [3/3]

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

◆ PropagateTrack()

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

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

◆ PropagateTracks()

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

extrapolate incomplete tracks and update them with new segments

input: nplmax - the maximal length of the track to be continued input: nplmin - the minimal length of the track to be continued

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

◆ ResetCouples()

void EdbPVRec::ResetCouples ( )
951{
952 EdbPatCouple *pc = 0;
953 int ncp=Ncouples();
954 for(int i=0; i<ncp; i++ ) {
955 pc = GetCouple(i);
956 pc->ClearSegCouples();
957 pc->SetPat1( GetPattern(pc->ID1()) );
958 pc->SetPat2( GetPattern(pc->ID2()) );
959 }
960}
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 ( )
964{
965 for(int i=0; i<Npatterns(); i++ ) {
966 EdbPattern *p = GetPattern(i);
967 if(!p) continue;
968 for(int j=0; j<p->N(); j++ ) p->GetSegment(j)->SetTrack(-1);
969 }
970 SafeDelete(eTracks);
971 SafeDelete(eTracksCell);
972}

◆ SelectLongTracks()

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

◆ 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; }

◆ SetChi2Max()

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

◆ SetCouples()

void EdbPVRec::SetCouples ( )

using already setted ID's of couples attach the patterns

935{
937
938 EdbPatCouple *pc = 0;
939 int ncp=Ncouples();
940 for(int i=0; i<ncp; i++ ) {
941 pc = GetCouple(i);
942 pc->SetPat1( GetPattern(pc->ID1()) );
943 pc->SetPat2( GetPattern(pc->ID2()) );
944
945 pc->SetCHI2mode(GetScanCond()->Chi2Mode());
946 }
947}
void SetCHI2mode(int m)
Definition: EdbPVRec.h:103

◆ SetCouplesAll()

void EdbPVRec::SetCouplesAll ( )

form couples array for all available patterns ID's

976{
979}
void SetCouplesPeriodic(int istart, int iperiod)
Definition: EdbPVRec.cxx:982

◆ SetCouplesExclude()

void EdbPVRec::SetCouplesExclude ( TArrayI &  exclude)

by Alessandra Pastore

TArray exclude[npat]={0,1,1,0,...,0} where

      0 = plate to be excluded from the volume pattern;

      1 = plate to be included into the volume pattern 
1011{
1019
1020 DeleteCouples();
1021 EdbPatCouple *pc = 0;
1022 int npat = Npatterns();
1023
1024 for(int i=0; i<npat; i++ ) GetPattern(i)->SetSegmentsPID();
1025 for(int i=0; i<npat-1; i++) {
1026 if(exclude[i]==0) continue;
1027 for(int j=i+1; j<npat; j++) {
1028 if(exclude[j]==0) continue;
1029
1030 pc = new EdbPatCouple();
1031 pc->SetID(i,j);
1032 pc->SetCond(eScanCond);
1033 pc->SetOffset(0,0,0,0);
1034 pc->SetSigma(1,1,.003,.003);
1035 AddCouple(pc);
1036 break;
1037 }
1038 }
1039
1040 SetCouples();
1041}
EdbPatCouple * AddCouple(int id1, int id2)
Definition: EdbPVRec.cxx:916
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:1455

◆ SetCouplesPeriodic()

void EdbPVRec::SetCouplesPeriodic ( int  istart,
int  iperiod 
)

istart: start from pattern iperiod: distance between patterns

983{
986
988 EdbPatCouple *pc = 0;
989 int npat=Npatterns();
990
991 if( istart<0 || istart>=npat-iperiod ) return;
992
993 int ifirst=0;
994 for(int i=0; i<npat; i++ ) {if(GetPattern(i)) ifirst=i; break;}
995 for(int i=ifirst; i<npat; i++ )
997 if(ifirst<istart) istart=ifirst;
998 for(int i=istart; i<npat-iperiod; i+=iperiod ) {
999 pc = new EdbPatCouple();
1000 pc->SetID(i,i+iperiod);
1001 pc->SetCond(eScanCond);
1002 pc->SetOffset(0,0,0,0);
1003 pc->SetSigma(1,1,.003,.003); //TODO: organise this sigmas
1004 AddCouple(pc);
1005 }
1006 SetCouples();
1007}

◆ SetOffsetsMax()

void EdbPVRec::SetOffsetsMax ( float  ox,
float  oy 
)
926{
927 int ncp=Ncouples();
928 for(int i=0; i<ncp; i++ ) {
929 GetCouple(i)->SetOffsetsMax(ox,oy);
930 }
931}
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)

set eBrick,eMajor and eMinor for all segments of all volume patterns leave ePlate as is

2977{
2980 for(int i=0; i<Npatterns(); i++) {
2981 EdbPattern *p = GetPattern(i);
2982 for(int j=0; j<p->N(); j++) {
2983 EdbSegP *s = p->GetSegment(j);
2984 id.ePlate = s->Plate();
2985 s->SetScanID(id);
2986 }
2987 }
2988}

◆ SetScanIDTrackSeg()

void EdbPVRec::SetScanIDTrackSeg ( EdbID  id)

set eBrick,eMajor and eMinor for all segments of all volume patterns leave ePlate as is

2992{
2995 for(int i=0; i<Ntracks(); i++) {
2996 EdbTrackP *t = GetTrack(i);
2997 for(int j=0; j<t->N(); j++) {
2998 EdbSegP *s = t->GetSegment(j);
2999 id.ePlate = s->Plate();
3000 s->SetScanID(id);
3001 }
3002 }
3003}

◆ SetSegmentErrors()

void EdbPVRec::SetSegmentErrors ( EdbSegP seg)

segment errors are depends on the scanning conditions and segment parameters (angles). Puls height is represents segments probability (not accuracy) and should be taken into account separately

1100{
1105
1106 float sx = GetScanCond()->SigmaX( seg.TX() );
1107 float sy = GetScanCond()->SigmaY( seg.TY() );
1108 float sz = GetScanCond()->SigmaZ( seg.TX(), seg.TY() );
1109 float stx = GetScanCond()->SigmaTX( seg.TX() );
1110 float sty = GetScanCond()->SigmaTY( seg.TY() );
1111
1112 seg.SetErrors(sx*sx,sy*sy,sz*sz,stx*stx,sty*sty);
1113}
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:90

◆ SetSegmentProbability()

void EdbPVRec::SetSegmentProbability ( EdbSegP seg)

segment probability is depends on: puls height signal puls distribution noise puls distribution angles

1117{
1123
1124 seg.SetProbability( GetScanCond()->ProbSeg(seg.TX(), seg.TY(), seg.W()) );
1125
1126}
void SetProbability(float p)
Definition: EdbSegP.h:140

◆ SetSegmentsErrors()

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

◆ SetSegmentsTracks()

void EdbPVRec::SetSegmentsTracks ( )

2475{
2476 EdbTrackP *tr=0;
2477 int ntr = Ntracks();
2478 for(int i=0; i<ntr; i++) {
2479 tr = GetTrack(i);
2480 tr->SetID(i);
2481 if(tr->Flag()<0) continue;
2482 tr->SetSegmentsTrack();
2483 }
2484}

◆ Xmax()

float EdbPVRec::Xmax ( )
1057{
1058 int npat=Npatterns(); if(npat<1) return 0;
1059 float xmax=GetPattern(0)->Xmax();
1060 for(int i=1; i<npat; i++ ) {
1061 float max = GetPattern(i)->Xmax();
1062 if(max>xmax) xmax=max;
1063 }
1064 return xmax;
1065}
virtual Float_t Xmax() const
Definition: EdbVirtual.cxx:196
int max
Definition: check_shower.C:41

◆ Xmin()

float EdbPVRec::Xmin ( )
1045{
1046 int npat=Npatterns(); if(npat<1) return 0;
1047 float xmin=GetPattern(0)->Xmin();
1048 for(int i=1; i<npat; i++ ) {
1049 float min = GetPattern(i)->Xmin();
1050 if(min<xmin) xmin=min;
1051 }
1052 return xmin;
1053}
float min(TClonesArray *t)
Definition: bitview.cxx:275
virtual Float_t Xmin() const
Definition: EdbVirtual.cxx:186

◆ Ymax()

float EdbPVRec::Ymax ( )
1081{
1082 int npat=Npatterns(); if(npat<1) return 0;
1083 float ymax=GetPattern(0)->Ymax();
1084 for(int i=1; i<npat; i++ ) {
1085 float max = GetPattern(i)->Ymax();
1086 if(max>ymax) ymax=max;
1087 }
1088 return ymax;
1089}
virtual Float_t Ymax() const
Definition: EdbVirtual.cxx:216

◆ Ymin()

float EdbPVRec::Ymin ( )
1069{
1070 int npat=Npatterns(); if(npat<1) return 0;
1071 float ymin=GetPattern(0)->Ymin();
1072 for(int i=1; i<npat; i++ ) {
1073 float min = GetPattern(i)->Ymin();
1074 if(min<ymin) ymin=min;
1075 }
1076 return ymin;
1077}
virtual Float_t Ymin() const
Definition: EdbVirtual.cxx:206

Member Data Documentation

◆ eChi2Max

float EdbPVRec::eChi2Max
private

◆ ePatCouples

TObjArray* EdbPVRec::ePatCouples
private

patterns couples

◆ eScanCond

EdbScanCond* EdbPVRec::eScanCond
private

scanning conditions (sigma, puls, etc)

◆ eTracks

TObjArray* EdbPVRec::eTracks

◆ eTracksCell

TIndexCell* EdbPVRec::eTracksCell
private

◆ eVdiff

Long_t EdbPVRec::eVdiff[4]
private

how many ajenced bins should be taken into account

◆ eVTX

TObjArray* EdbPVRec::eVTX

array of vertex


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