FEDRA emulsion software from the OPERA Collaboration
EdbDataProc Class Reference

emulsion data processing More...

#include <EdbDataSet.h>

Inheritance diagram for EdbDataProc:
Collaboration diagram for EdbDataProc:

Public Member Functions

void AjustZ (int doZ)
 
void Align (int alignFlag)
 
void AlignLinkTracks (int alg=0, int alignFlag=0)
 
int CheckCCD ()
 
int CheckShrinkage (EdbPVRec *ali, int couple, float &shr1, float &shr2)
 
void CloseCouplesTree (TTree *tree)
 
void CorrectAngles ()
 
 EdbDataProc ()
 ============================================================================== More...
 
 EdbDataProc (const char *file)
 ============================================================================== More...
 
 EdbDataProc (int npl, TArrayI &ids, TArrayF &zs)
 
EdbPVRecExtractDataVolume (EdbSegP &v, int plmin, int plmax, float accept[4], int datatype=0)
 
EdbPVRecExtractDataVolume (EdbTrackP &tr, float binx=20, float bint=10, int datatype=0)
 
EdbPVRecExtractDataVolumeF (EdbTrackP &tr, float binx=20, float bint=10, int datatype=0)
 
void FillCouplesTree (TTree *tree, EdbPVRec *al, int fillraw=0)
 
void FineAlignment (int doFine)
 
void FineAlignmentTracks ()
 
EdbDataSetGetDataSet ()
 
EdbPVRecGetPVR () const
 
EdbVertexGetVertexFromTree (EdbVertexRec &vertexrec, const char *fname, const int vertexID)
 
int InitVolume (EdbPVRec *ali, int datatype=0, TIndex2 *trseg=0)
 
int InitVolume (int datatype=0, const char *rcut="1")
 
int InitVolumeRaw (EdbPVRec *ali)
 
int InitVolumeTracks (EdbPVRec *ali, const char *rcut)
 
int Link ()
 
int Link (EdbDataPiece &piece)
 
void LinkRawTracks (int alg=0)
 
void LinkTracks (int alg=0, float p=-1.)
 
void LinkTracksC (int alg=0, float p=-1.)
 
TIndex2MakeTracksSegmentsList (EdbPVRec &ali)
 
int NoUpdate () const
 
int Process ()
 
EdbPVRecPVR () const
 
void SetNoUpdate (int nu)
 
void SetPVR (EdbPVRec *pvr)
 
int ShrinkCorr ()
 
virtual ~EdbDataProc ()
 

Static Public Member Functions

static int LinkTracksWithFlag (EdbPVRec *ali, float p, float probmin, int nsegmin, int maxgap, int flag, float mass=0.1396)
 
static int MakeTracksTree (EdbPVRec *ali=0, const char *file="linked_tracks.root")
 
static int MakeTracksTree (TObjArray &tracks, float xv=0, float yv=0, const char *file="linked_tracks.root")
 
static int MakeVertexTree (TObjArray &vtxarr, const char *file)
 
static int ReadTracksTree (EdbPVRec &ali, const char *fname="linked_tracks.root", const char *rcut="t.eFlag>-1&&nseg>2&&t.eProb>.01")
 
static int ReadVertexTree (EdbVertexRec &vertexrec, const char *fname, const char *rcut, map< int, EdbTrackP * > trackID_map)
 
static int ReadVertexTree (EdbVertexRec &vertexrec, const char *fname, const char *rcut, TObjArray *builttracks=0)
 

Private Attributes

EdbDataSeteDataSet
 
int eNoUpdate
 
EdbPVRecePVR
 

Detailed Description

emulsion data processing

Constructor & Destructor Documentation

◆ EdbDataProc() [1/3]

EdbDataProc::EdbDataProc ( )

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

1584{
1585 eDataSet=0;
1586 eNoUpdate=1;
1587 ePVR = new EdbPVRec();
1588}
EdbDataSet * eDataSet
Definition: EdbDataSet.h:185
int eNoUpdate
Definition: EdbDataSet.h:189
EdbPVRec * ePVR
Definition: EdbDataSet.h:187
Definition: EdbPVRec.h:148

◆ EdbDataProc() [2/3]

EdbDataProc::EdbDataProc ( int  npl,
TArrayI &  ids,
TArrayF &  zs 
)

Special constructor (requested by Nicolai) set everything as default as possible

1600{
1602
1603 eDataSet = new EdbDataSet();
1604 ePVR = 0;
1605 eNoUpdate = 0;
1606
1607 if( npl>ids.GetSize() ) return;
1608 if( npl>zs.GetSize() ) return;
1609
1610 ePVR = new EdbPVRec();
1611 EdbPattern *pat =0;
1612 for(int i=0; i<npl; i++) {
1613 pat = new EdbPattern( 0,0, zs.At(i) );
1614 pat->SetPID(ids.At(i));
1615 ePVR->AddPattern(pat);
1616 }
1618
1619 ePVR->SetScanCond( new EdbScanCond() );
1621}
OPERA emulsion data set.
Definition: EdbDataSet.h:144
void SetCouplesAll()
Definition: EdbPVRec.cxx:975
void SetScanCond(EdbScanCond *scan)
Definition: EdbPVRec.h:171
Definition: EdbPattern.h:273
void SetPID(int pid)
Definition: EdbPattern.h:310
void AddPattern(EdbPattern *pat)
Definition: EdbPattern.cxx:1707
void SetPatternsID()
Definition: EdbPattern.cxx:1603
Definition: EdbScanCond.h:10

◆ EdbDataProc() [3/3]

EdbDataProc::EdbDataProc ( const char *  file)

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

1592{
1593 eDataSet = new EdbDataSet(file);
1594 ePVR = 0;
1595 eNoUpdate=0;
1596}
TFile * file
Definition: write_pvr.C:3

◆ ~EdbDataProc()

EdbDataProc::~EdbDataProc ( )
virtual

1625{
1626 if(eDataSet) delete eDataSet;
1627 if(ePVR) delete ePVR;
1628}

Member Function Documentation

◆ AjustZ()

void EdbDataProc::AjustZ ( int  doZ)

2243{
2244 EdbPVRec *ali = new EdbPVRec();
2245 InitVolume(ali);
2246 ali->Link();
2248 ali->SelectLongTracks(doZ);
2250 ali->FineCorrZnew();
2251 for(int i=0; i<ali->Npatterns(); i++)
2252 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateZPar(0,ali->GetPattern(i)->Z());
2253}
int UpdateZPar(int layer, float z)
Definition: EdbDataSet.cxx:508
int NoUpdate() const
Definition: EdbDataSet.h:227
int InitVolume(int datatype=0, const char *rcut="1")
Definition: EdbDataSet.cxx:2066
EdbDataPiece * GetPiece(int id)
Definition: EdbDataSet.h:163
int FineCorrZnew()
Definition: EdbPVRec.cxx:2189
int SelectLongTracks(int nsegments)
Definition: EdbPVRec.cxx:2294
int MakeSummaryTracks()
Definition: EdbPVRec.cxx:2280
void FillTracksCell()
Definition: EdbPVRec.cxx:1319
int Link()
Definition: EdbPVRec.cxx:1187
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
Float_t Z() const
Definition: EdbPattern.h:84
EdbPVRec * ali
Definition: test_oracle.C:9

◆ Align()

void EdbDataProc::Align ( int  doAlign)

2227{
2228 EdbPVRec *ali = new EdbPVRec();
2229 InitVolume(ali);
2230
2231 ali->Align(doAlign);
2232
2233 if(gEDBDEBUGLEVEL>1) ali->PrintAff();
2234 EdbAffine2D aff;
2235 for(int i=0; i<ali->Npatterns(); i++) {
2236 ali->GetPattern(i)->GetKeep(aff);
2237 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateAffPar(0,aff);
2238 }
2239}
Definition: EdbAffine.h:17
int UpdateAffPar(int layer, EdbAffine2D &aff)
Definition: EdbDataSet.cxx:488
int Align(int alignFlag)
Definition: EdbPVRec.cxx:1210
void PrintAff() const
Definition: EdbPattern.cxx:1651
virtual const EdbAffine2D * GetKeep() const
Definition: EdbVirtual.h:176
gEDBDEBUGLEVEL
Definition: energy.C:7

◆ AlignLinkTracks()

void EdbDataProc::AlignLinkTracks ( int  alg = 0,
int  doAlign = 0 
)

2475{
2476 EdbPVRec *ali = new EdbPVRec();
2477 InitVolume(ali);
2478
2479 ali->Align(doAlign);
2480 if(gEDBDEBUGLEVEL>1) ali->PrintAff();
2481 EdbAffine2D aff;
2482 for(int i=0; i<ali->Npatterns(); i++) {
2483 ali->GetPattern(i)->GetKeep(aff);
2484 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateAffPar(0,aff);
2485 }
2486
2487 ali->Link();
2488 Log(2,"EdbDataProc::AlignLinkTracks","link ok");
2489
2490// if(alg==1) {
2491// ali->MakeHoles();
2492// ali->Link();
2493// printf("link ok\n");
2494// }
2495
2497
2498 TTree *cptree=EdbDataPiece::InitCouplesTree("linked_couples.root","RECREATE");
2499 FillCouplesTree(cptree, ali,0);
2500 CloseCouplesTree(cptree);
2501
2503}
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
int InitCouplesTree(const char *mode="READ")
Definition: EdbDataSet.cxx:1239
void FillCouplesTree(TTree *tree, EdbPVRec *al, int fillraw=0)
Definition: EdbDataSet.cxx:1740
void CloseCouplesTree(TTree *tree)
Definition: EdbDataSet.cxx:1809
static int MakeTracksTree(EdbPVRec *ali=0, const char *file="linked_tracks.root")
Definition: EdbDataSet.cxx:2506

◆ CheckCCD()

int EdbDataProc::CheckCCD ( )

1632{
1633 if(!eDataSet) return 0;
1634 EdbDataPiece *piece;
1635 int ndef=0;
1636 int np=eDataSet->N();
1637 for(int i=0; i<np; i++) {
1638 piece = eDataSet->GetPiece(i);
1639 ndef = piece->CheckCCD();
1640 if(ndef<0) { Log(2,"EdbDataProc::CheckCCD","skip piece"); continue; }
1641 Log(1,"EdbDataProc::CheckCCD","piece %s: eliminated defects: %d",piece->GetName(),ndef);
1642 piece->WriteCuts();
1643 piece->CloseRun();
1644 }
1645 return np;
1646}
Edb raw data unit (scanned plate) associated with run file.
Definition: EdbDataSet.h:26
void WriteCuts()
Definition: EdbDataSet.cxx:554
int CheckCCD(int maxentr=2000)
Definition: EdbDataSet.cxx:942
void CloseRun()
Definition: EdbDataSet.cxx:105
int N() const
Definition: EdbDataSet.h:162

◆ CheckShrinkage()

int EdbDataProc::CheckShrinkage ( EdbPVRec ali,
int  couple,
float &  shr1,
float &  shr2 
)

1820{
1821 EdbPatCouple *patc = ali->GetCouple(couple);
1822 if(!patc) return 0;
1823
1824 EdbSegCouple *sc=0;
1825 EdbSegP *s1=0, *s2=0;
1826 double dz,tx,ty,t,t1,t2,sumt1=0,sumt2=0;
1827 int nsum=0;
1828
1829 int nc=patc->Ncouples();
1830 for( int ic=0; ic<nc; ic++ ) {
1831 sc = patc->GetSegCouple(ic);
1832
1833 if(sc->CHI2()>1.5) continue;
1834
1835 s1 = patc->Pat1()->GetSegment(sc->ID1());
1836 s2 = patc->Pat2()->GetSegment(sc->ID2());
1837
1838 dz = s2->Z() - s1->Z();
1839 tx = (s2->X() - s1->X())/dz;
1840 ty = (s2->Y() - s1->Y())/dz;
1841
1842 t = TMath::Sqrt( tx*tx + ty*ty );
1843 if(t<.1) continue;
1844 if(t>.45) continue;
1845 t1 = TMath::Sqrt( s1->TX()*s1->TX() + s1->TY()*s1->TY() );
1846 t2 = TMath::Sqrt( s2->TX()*s2->TX() + s2->TY()*s2->TY() );
1847
1848 nsum++;
1849 sumt1 += t1/t;
1850 sumt2 += t2/t;
1851 }
1852
1853 if(nsum<1) return 0;
1854
1855 shr1 = sumt1/nsum;
1856 shr2 = sumt2/nsum;
1857
1858 return nsum;
1859}
brick dz
Definition: RecDispMC.C:107
EdbPatCouple * GetCouple(int i) const
Definition: EdbPVRec.h:190
Definition: EdbPVRec.h:27
EdbSegCouple * GetSegCouple(int i) const
Definition: EdbPVRec.h:85
EdbPattern * Pat1()
Definition: EdbPVRec.h:89
EdbPattern * Pat2()
Definition: EdbPVRec.h:90
int Ncouples() const
Definition: EdbPVRec.h:80
Definition: EdbSegCouple.h:17
int ID2() const
Definition: EdbSegCouple.h:56
int ID1() const
Definition: EdbSegCouple.h:55
float CHI2() const
Definition: EdbSegCouple.h:61
Definition: EdbSegP.h:21
Float_t TX() const
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t X() const
Definition: EdbSegP.h:173
Float_t Z() const
Definition: EdbSegP.h:153
Float_t Y() const
Definition: EdbSegP.h:174
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
TTree * t
Definition: check_shower.C:4
EdbSegP * s1
Definition: tlg2couples.C:29
EdbSegP * s2
Definition: tlg2couples.C:30

◆ CloseCouplesTree()

void EdbDataProc::CloseCouplesTree ( TTree *  tree)

1810{
1811 tree->AutoSave();
1812 TFile *f=0;
1813 f = tree->GetCurrentFile();
1814 if (f) SafeDelete(f);
1815 tree=0;
1816}
FILE * f
Definition: RecDispMC.C:150

◆ CorrectAngles()

void EdbDataProc::CorrectAngles ( )

1863{
1864 EdbDataPiece *piece;
1865 int npieces = eDataSet->N();
1866 Log(2,"EdbDataProc::CorrectAngles","npieces = %d",npieces);
1867 if(!npieces) return;
1868
1869 for(int i=0; i<npieces; i++ ) {
1870 piece = eDataSet->GetPiece(i);
1871 if(piece) piece->CorrectAngles();
1872 }
1873}
int CorrectAngles()
Definition: EdbDataSet.cxx:875

◆ ExtractDataVolume() [1/2]

EdbPVRec * EdbDataProc::ExtractDataVolume ( EdbSegP seg,
int  plmin,
int  plmax,
float  acc[4],
int  datatype = 0 
)

datatype: 0 - base track
1 - up
2 - down
100 - raw?

1917{
1922
1923 if(!ePVR) return 0;
1924 int npat = ePVR->Npatterns();
1925
1926 EdbPVRec *ali = new EdbPVRec();
1927
1928 Log(2,"EdbDataProc::ExtractDataVolume","Select Data %d in EdbPVRec with %d patterns:",
1929 datatype, npat);
1930
1931 float dz, min[5], max[5];
1932 EdbPattern *pat=0;
1933
1934 for(int i=0; i<npat; i++) {
1935
1936 pat = ePVR->GetPattern(i);
1937 if(!pat) continue;
1938
1939 dz = pat->Z() - seg.Z();
1940
1941 min[0] = seg.X() + dz*seg.TX() - acc[0];
1942 min[1] = seg.Y() + dz*seg.TY() - acc[1];
1943 max[0] = seg.X() + dz*seg.TX() + acc[0];
1944 max[1] = seg.Y() + dz*seg.TY() + acc[1];
1945
1946 min[2] = -.6; max[2] = .6;
1947 min[3] = -.6; max[3] = .6;
1948 min[4] = 0.; max[4] = 100.;
1949
1951 }
1952
1953 return ali;
1954}
Int_t npat
Definition: Xi2HatStartScript.C:33
float min(TClonesArray *t)
Definition: bitview.cxx:275
EdbPattern * ExtractSubPattern(float min[5], float max[5], int MCevt=-1)
Definition: EdbPattern.cxx:1470
int max
Definition: check_shower.C:41

◆ ExtractDataVolume() [2/2]

EdbPVRec * EdbDataProc::ExtractDataVolume ( EdbTrackP tr,
float  binx = 20,
float  bint = 10,
int  datatype = 0 
)

datatype: 0 - base track
1 - up
2 - down
100 - raw?

2007{
2012
2013 if(!ePVR) return 0;
2014 int npat = ePVR->Npatterns();
2015
2016 EdbPVRec *ali = new EdbPVRec();
2017
2018 Log(2,"EdbDataProc::ExtractDataVolume","Select Data %d in EdbPVRec with %d patterns",
2019 datatype, npat);
2020
2021 float min[5], max[5];
2022
2023 float dx = binx*TMath::Sqrt(tr.SX()*tr.N());
2024 float dy = binx*TMath::Sqrt(tr.SY()*tr.N());
2025 float dtx = bint*TMath::Sqrt(tr.STX()*tr.N());
2026 float dty = bint*TMath::Sqrt(tr.STY()*tr.N());
2027
2028 float dz = (tr.GetSegment(tr.N()-1)->Z() - tr.GetSegment(0)->Z());
2029 float tx = (tr.GetSegment(tr.N()-1)->X() - tr.GetSegment(0)->X())/dz;
2030 float ty = (tr.GetSegment(tr.N()-1)->Y() - tr.GetSegment(0)->Y())/dz;
2031
2032 Log(2,"EdbDataProc::ExtractDataVolume","select segments with acceptance: %f %f [microns] %f %f [mrad]",
2033 dx,dy,dtx*1000,dty*1000);
2034
2035 EdbPattern *pat = 0;
2036 EdbPattern *spat = 0;
2037 int nseg =0;
2038
2039 for(int i=0; i<npat; i++) {
2040
2041 pat = ePVR->GetPattern(i);
2042 if(!pat) continue;
2043
2044 dz = pat->Z() - tr.Z() + 107.; //TODO
2045
2046 min[0] = tr.X() + dz*tx - dx;
2047 max[0] = tr.X() + dz*tx + dx;
2048 min[1] = tr.Y() + dz*ty - dy;
2049 max[1] = tr.Y() + dz*ty + dy;
2050 min[2] = tx - dtx;
2051 max[2] = tx + dtx;
2052 min[3] = ty - dty;
2053 max[3] = ty + dty;
2054 min[4] = 0.;
2055 max[4] = 100.;
2056
2057 spat = pat->ExtractSubPattern(min,max);
2058 nseg += spat->N();
2059 ali->AddPattern( spat );
2060 }
2061 Log(2,"EdbDataProc::ExtractDataVolume","%d segments are selected",nseg);
2062 return ali;
2063}
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
Int_t N() const
Definition: EdbPattern.h:86
Double_t X
Definition: tlg2couples.C:76
Double_t Y
Definition: tlg2couples.C:76

◆ ExtractDataVolumeF()

EdbPVRec * EdbDataProc::ExtractDataVolumeF ( EdbTrackP tr,
float  binx = 20,
float  bint = 10,
int  datatype = 0 
)

1959{
1960 if(!ePVR) return 0;
1961 int npat = ePVR->Npatterns();
1962 EdbPVRec *ali = new EdbPVRec();
1963 Log(2,"EdbDataProc::ExtractDataVolumeF","Select Data %d in EdbPVRec with %d patterns:",
1964 datatype, npat);
1965
1966 EdbSegP ss; // the "selector" segment
1967 ss.SetCOV( tr.GetSegment(0)->COV() );
1968
1969 float dz = (tr.GetSegment(tr.N()-1)->Z() - tr.GetSegment(0)->Z());
1970 float tx = (tr.GetSegment(tr.N()-1)->X() - tr.GetSegment(0)->X())/dz;
1971 float ty = (tr.GetSegment(tr.N()-1)->Y() - tr.GetSegment(0)->Y())/dz;
1972
1973 ss.SetTX(tx);
1974 ss.SetTY(ty);
1975 ss.SetX(tr.X());
1976 ss.SetY(tr.Y());
1977 ss.SetZ(tr.Z());
1978
1979 if(gEDBDEBUGLEVEL>2) ss.Print();
1980
1981 EdbPattern *pat = 0;
1982 EdbPattern *spat = 0;
1983 int nseg =0;
1984
1985 TObjArray arr;
1986
1987 for(int i=0; i<npat; i++) {
1988 pat = ePVR->GetPattern(i);
1989 if(!pat) continue;
1990 ss.PropagateTo(pat->Z());
1991 nseg += pat->FindCompliments(ss,arr,binx,bint);
1992 }
1993
1994 spat = new EdbPattern(0,0,0);
1995 for(int i=0; i<arr.GetEntriesFast(); i++)
1996 spat->AddSegment( *((EdbSegP*)(arr.At(i))) );
1997
1998 ali->AddPattern( spat );
1999
2000 Log(2,"EdbDataProc::ExtractDataVolumeF","%d segments are selected",nseg);
2001 return ali;
2002}
int FindCompliments(EdbSegP &s, TObjArray &arr, float nsig, float nsigt)
Definition: EdbPattern.cxx:1354
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:72
ss
Definition: energy.C:62

◆ FillCouplesTree()

void EdbDataProc::FillCouplesTree ( TTree *  tree,
EdbPVRec al,
int  fillraw = 0 
)

1741{
1742 tree->GetDirectory()->cd();
1743
1744 Log(2,"EdbDataProc::FillCouplesTree","fill couples tree...");
1745
1746 EdbPatCouple *patc=0;
1747 float xv = al->X();
1748 float yv = al->Y();
1749
1750 int pid1,pid2;
1751 EdbSegCouple *cp=0;
1752 EdbSegP *s1=0;
1753 EdbSegP *s2=0;
1754 EdbSegP *s=0;
1755
1756 tree->SetBranchAddress("pid1",&pid1);
1757 tree->SetBranchAddress("pid2",&pid2);
1758 tree->SetBranchAddress("xv" ,&xv);
1759 tree->SetBranchAddress("yv" ,&yv);
1760 tree->SetBranchAddress("cp" ,&cp);
1761 tree->SetBranchAddress("s1." ,&s1);
1762 tree->SetBranchAddress("s2." ,&s2);
1763 tree->SetBranchAddress("s." ,&s );
1764
1765 if(fillraw) {
1766 // **** fill tree with raw segments ****
1767 EdbPattern *pat=0;
1768 int nic;
1769 int nip=al->Npatterns();
1770 for( int ip=0; ip<nip; ip++ ) {
1771 pat = al->GetPattern(ip);
1772 pid1 = pat->ID();
1773 pid2 = -1;
1774 nic=pat->N();
1775 for( int ic=0; ic<nic; ic++ ) {
1776 s1 = pat->GetSegment(ic);
1777 tree->Fill();
1778 }
1779 }
1780 }
1781
1782 // **** fill tree with found couples ****
1783
1784 s = new EdbSegP();
1785
1786 int nip=al->Ncouples();
1787 for( int ip=0; ip<nip; ip++ ) {
1788 patc = al->GetCouple(ip);
1789 pid1 = patc->Pat1()->ID();
1790 pid2 = patc->Pat2()->ID();
1791
1792 int nic=patc->Ncouples();
1793 for( int ic=0; ic<nic; ic++ ) {
1794 cp = patc->GetSegCouple(ic);
1795 s1 = patc->Pat1()->GetSegment(cp->ID1());
1796 s2 = patc->Pat2()->GetSegment(cp->ID2());
1797 s = cp->eS;
1798 tree->SetBranchAddress("s." ,&s );
1799
1800 s->SetID(tree->GetEntries()); // basetrack id will be the tree entry number
1801 EdbTraceBack::SetBaseTrackVid( *s, 0, 0, tree->GetEntries() ); //TODO: plate, piece if available
1802 tree->Fill();
1803 }
1804 }
1805
1806}
Int_t Ncouples() const
Definition: EdbPVRec.h:188
int ID() const
Definition: EdbPattern.h:319
Float_t Y() const
Definition: EdbPattern.h:364
Float_t X() const
Definition: EdbPattern.h:363
EdbSegP * eS
the result of the fit
Definition: EdbSegCouple.h:27
static void SetBaseTrackVid(EdbSegP &s, int plate, int piece, int entry)
s
Definition: check_shower.C:55
EdbSegCouple * cp
Definition: tlg2couples.C:28

◆ FineAlignment()

void EdbDataProc::FineAlignment ( int  doFine)

2396{
2397 EdbPVRec ali;
2398 InitVolume(&ali);
2399 ali.Link();
2400 Log(2,"EdbDataProc::FineAlignment","link ok");
2402
2403 EdbAffine2D aff;
2404
2405 int fctr=0;
2406 int fcMin = 49;
2407
2408 int i;
2411 for( i=0; i<ali.Npatterns(); i++ ) {
2412 fctr = ali.FineCorrXY(i,aff,doFine);
2413 }
2414
2417 for( i=0; i<ali.Npatterns(); i++ ) {
2418 fctr = ali.FineCorrXY(i,aff,doFine);
2419 }
2420
2421 if(fctr>fcMin) {
2422 for( i=0; i<ali.Npatterns(); i++) {
2423 ali.GetPattern(i)->GetKeep(aff);
2424 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateAffPar(0,aff);
2425 }
2426 }
2427
2430 float dz=0;
2431 float z = ali.GetPattern(ali.Npatterns()-1)->Z();
2432 for( i=ali.Npatterns()-2; i>=0; i-- ) {
2433 fctr = ali.FineCorrZ(i,dz);
2434 if(fctr<=fcMin) break;
2435 z -= dz;
2436 Log(2,"EdbDataProc::FineAlignment","dz = %f z = %f",dz,z);
2437 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateZPar(0,z);
2438 }
2439
2442 for( i=0; i<ali.Npatterns(); i++ ) {
2443 fctr = ali.FineCorrTXTY(i,aff);
2444 if(fctr<=fcMin) break;
2445 if(gEDBDEBUGLEVEL>2) aff.Print();
2446 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateAffTPar(0,aff);
2447 }
2448
2451 dz=0;
2452 z = ali.GetPattern(ali.Npatterns()-1)->Z();
2453 for( i=ali.Npatterns()-2; i>=0; i-- ) {
2454 fctr = ali.FineCorrZ(i,dz);
2455 if(fctr<=fcMin) break;
2456 z -= dz;
2457 Log(2,"EdbDataProc::FineAlignment","dz = %f z = %f",dz,z);
2458 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateZPar(0,z);
2459 }
2460
2463 float shr=0;
2464 for( i=0; i<ali.Npatterns(); i++ ) {
2465 fctr = ali.FineCorrShr(i,shr);
2466 if(fctr<=fcMin) break;
2468 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateShrPar(0);
2469 }
2470
2471}
void Print(Option_t *opt="") const
Definition: EdbAffine.cxx:52
int UpdateAffTPar(int layer, EdbAffine2D &aff)
Definition: EdbDataSet.cxx:529
int UpdateShrPar(int layer)
Definition: EdbDataSet.cxx:469
void CorrectShrinkage(int layer, float shr)
Definition: EdbDataSet.cxx:463
int FineCorrXY(int ipat, EdbAffine2D &aff, int flag)
Definition: EdbPVRec.cxx:2094
int FineCorrTXTY(int ipat, EdbAffine2D &aff)
Definition: EdbPVRec.cxx:2125
int FineCorrZ(int ipat, float &dz)
Definition: EdbPVRec.cxx:2156
int FineCorrShr(int ipat, float &shr)
Definition: EdbPVRec.cxx:2251

◆ FineAlignmentTracks()

void EdbDataProc::FineAlignmentTracks ( )

2134{
2135 InitVolume(100);
2136 EdbPVRec *ali = PVR();
2137
2138 EdbAffine2D aff,afft;
2139
2140 int fctr=0,fctr0=10000, fcMin=50;
2141
2142 for( int i=0; i<ali->Npatterns(); i++ ) {
2143 fctr = ali->FineCorrF(i,aff,afft);
2144 if(fctr<fctr0) fctr0=fctr;
2145 Log(2,"EdbDataProc::FineAlignmentTracks","fctr = %d",fctr);
2146 }
2147
2148 if(fctr0>fcMin) {
2149 for( int i=0; i<ali->Npatterns(); i++) {
2150 ali->GetPattern(i)->GetKeep(aff);
2151 if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateAffPar(0,aff);
2152
2153 //if(!NoUpdate()) eDataSet->GetPiece(i)->UpdateAffTPar(0,afft);
2154 }
2155 }
2156}
EdbPVRec * PVR() const
Definition: EdbDataSet.h:198
int FineCorrF(int ipat, EdbAffine2D &aff, EdbAffine2D &afft)
Definition: EdbPVRec.cxx:2039

◆ GetDataSet()

EdbDataSet * EdbDataProc::GetDataSet ( )
inline
197{return eDataSet;}

◆ GetPVR()

EdbPVRec * EdbDataProc::GetPVR ( ) const
inline
199{return ePVR;}

◆ GetVertexFromTree()

EdbVertex * EdbDataProc::GetVertexFromTree ( EdbVertexRec vertexrec,
const char *  fname,
const int  vertexID 
)
2840{
2841 //reading vertex tree, getting only the vertex I need
2842 map<int,EdbTrackP*>emptymap;
2843 ReadVertexTree(vertexrec, fname, Form("vID==%i",vertexID),emptymap); //vertex is added to EdbPVRec
2844
2845 EdbVertex *myvertex;
2846 EdbPVRec *ali = vertexrec.ePVR;
2847 //looking for myvertex (when called more than once, ali keeps adding vertices)
2848 for (int ivtx = 0; ivtx<ali->eVTX->GetEntries();ivtx++){
2849 EdbVertex *v1 = (EdbVertex*) ali->eVTX->At(ivtx);
2850 if (v1->ID()==vertexID) myvertex = v1;
2851 }
2852
2853 return myvertex;
2854
2855 }
static int ReadVertexTree(EdbVertexRec &vertexrec, const char *fname, const char *rcut, map< int, EdbTrackP * > trackID_map)
Definition: EdbDataSet.cxx:2658
TObjArray * eVTX
array of vertex
Definition: EdbPVRec.h:162
EdbPVRec * ePVR
patterns volume (optional)
Definition: EdbVertex.h:206
Definition: EdbVertex.h:69
Int_t ID() const
Definition: EdbVertex.h:126
const char * fname
Definition: mc2raw.cxx:41

◆ InitVolume() [1/2]

int EdbDataProc::InitVolume ( EdbPVRec ali,
int  datatype = 0,
TIndex2 trseg = 0 
)

TO CHECK!!!

2160{
2161 if (!eDataSet) Log(2,"EdbDataProc::InitVolume","Warning. eDataSet is NULL");
2162
2163 EdbScanCond *cond = eDataSet->GetPiece(0)->GetCond(0);
2164 ali->SetScanCond( cond );
2165
2166 EdbDataPiece *piece;
2167 int npieces = eDataSet->N();
2168 Log(2,"EdbDataProc::InitVolume","npieces = %d",npieces);
2169 if(!npieces) return 0;
2170
2171 //TTree *cptree=0;
2172 int i;
2173
2174 EdbPattern *pat=0;
2175 EdbPattern *p1=0;
2176 EdbPattern *p2=0;
2177
2178 for(i=0; i<npieces; i++ ) {
2179 piece = eDataSet->GetPiece(i);
2180 if(!piece->InitCouplesTree("READ")) Log(1," EdbDataProc::InitVolume","no tree %d",i);
2181
2182 pat = new EdbPattern( 0.,0., piece->GetLayer(0)->Z(),100 );
2183 pat->SetPID(i);
2184 //pat->SetSegmentsPID(); //TO CHECK!!
2185 if(datatype==10) {
2186 p1 = new EdbPattern( 0.,0., piece->GetLayer(0)->Z() + piece->GetLayer(1)->Z() );
2187 p2 = new EdbPattern( 0.,0., piece->GetLayer(0)->Z() + piece->GetLayer(2)->Z() );
2188 p1->SetPID(i);
2189 p2->SetPID(i);
2190 }
2191
2192 piece->GetCPData_new( pat,p1,p2,trseg );
2193
2194 ali->AddPattern( pat );
2195 if(datatype==10) {
2196 ali->AddPattern( p1 );
2197 ali->AddPattern( p2 );
2198 }
2199 piece->CloseCPData();
2200 }
2201
2202 float x0 = eDataSet->GetPiece(npieces-1)->GetLayer(0)->X();
2203 float y0 = eDataSet->GetPiece(npieces-1)->GetLayer(0)->Y();
2204 //ali->Centralize();
2205 ali->Centralize(x0,y0);
2206
2207 int npat = ali->Npatterns();
2208 for(i=0; i<npat; i++ ) {
2209 pat = ali->GetPattern(i);
2210 pat->SetSegmentsZ();
2211 pat->Transform( eDataSet->GetPiece(pat->PID())->GetLayer(0)->GetAffineXY() );
2212 pat->TransformA( eDataSet->GetPiece(pat->PID())->GetLayer(0)->GetAffineTXTY() );
2213 pat->TransformShr( eDataSet->GetPiece(pat->PID())->GetLayer(0)->Shr() );
2214 }
2215 ali->SetPatternsID();
2216
2218
2219 ali->SetCouplesAll();
2220 ali->SetChi2Max(cond->Chi2PMax());
2221 ali->SetOffsetsMax(cond->OffX(),cond->OffY());
2222 return npieces;
2223}
EdbLayer * GetLayer(int id)
Definition: EdbDataSet.h:87
int GetCPData_new(EdbPattern *pat, EdbPattern *p1=0, EdbPattern *p2=0, TIndex2 *trseg=0)
Definition: EdbDataSet.cxx:792
void CloseCPData()
Definition: EdbDataSet.cxx:91
EdbScanCond * GetCond(int id)
Definition: EdbDataSet.h:90
float Y() const
Definition: EdbLayer.h:76
float X() const
Definition: EdbLayer.h:75
float Shr() const
Definition: EdbLayer.h:89
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:119
float Z() const
Definition: EdbLayer.h:77
void SetSegmentsErrors()
Definition: EdbPVRec.cxx:1129
void SetChi2Max(float chi)
Definition: EdbPVRec.h:186
void SetOffsetsMax(float ox, float oy)
Definition: EdbPVRec.cxx:925
int PID() const
Definition: EdbPattern.h:320
void Centralize()
Definition: EdbPattern.cxx:1621
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:155
float OffY() const
Definition: EdbScanCond.h:70
float Chi2PMax() const
Definition: EdbScanCond.h:86
float OffX() const
Definition: EdbScanCond.h:69
void TransformA(const EdbAffine2D *affA)
Definition: EdbPattern.cxx:324
void TransformShr(const float shr)
Definition: EdbPattern.cxx:341
void SetSegmentsZ()
Definition: EdbPattern.cxx:250
void trseg(int event=40, const char *def)
Definition: check_vertex.C:44

◆ InitVolume() [2/2]

int EdbDataProc::InitVolume ( int  datatype = 0,
const char *  rcut = "1" 
)

datatype: 0 - couples basetrack data
10 - couples full data
100 - tracks only
1000 - tracks and basetracks

2067{
2072
2073 if(!ePVR) ePVR = new EdbPVRec();
2074 if(datatype==100) return InitVolumeTracks(ePVR, rcut);
2075
2076 if(datatype==1000) {
2077 InitVolumeTracks(ePVR, rcut);
2079 delete ePVR;
2080 ePVR = new EdbPVRec();
2081 int n = InitVolume(ePVR, datatype, trseg);
2082 n += InitVolumeTracks(ePVR, rcut);
2083 return n;
2084 }
2085
2086 return InitVolume(ePVR, datatype);
2087}
int InitVolumeTracks(EdbPVRec *ali, const char *rcut)
Definition: EdbDataSet.cxx:2091
TIndex2 * MakeTracksSegmentsList(EdbPVRec &ali)
Definition: EdbDataSet.cxx:3005
simple index class for fast search in linear cases
Definition: EdbMath.h:50

◆ InitVolumeRaw()

int EdbDataProc::InitVolumeRaw ( EdbPVRec ali)

1877{
1878 EdbScanCond *cond = eDataSet->GetPiece(0)->GetCond(1);
1879 ali->SetScanCond( cond );
1880
1881 EdbDataPiece *piece;
1882 int npieces = eDataSet->N();
1883 Log(2,"EdbDataProc::InitVolumeRaw","npieces = %d",npieces);
1884 if(!npieces) return 0;
1885
1886 for(int i=0; i<npieces; i++ ) {
1887 piece = eDataSet->GetPiece(i);
1888 piece->GetRawData(ali);
1889 }
1890
1891 float x0 = eDataSet->GetPiece(npieces-1)->GetLayer(0)->X();
1892 float y0 = eDataSet->GetPiece(npieces-1)->GetLayer(0)->Y();
1893 ali->Centralize(x0,y0);
1894
1895 for(int j=0; j<npieces; j++ ) {
1896 for(int ip=0; ip<2; ip++ ) {
1897 int i = 2*j+ip;
1902 }
1903 }
1904 ali->SetPatternsID();
1906
1907 ali->SetCouplesAll();
1908 ali->SetChi2Max(cond->Chi2PMax());
1909 ali->SetOffsetsMax(cond->OffX(),cond->OffY());
1910 return npieces;
1911}
int GetRawData(EdbPVRec *ali)
Definition: EdbDataSet.cxx:1083

◆ InitVolumeTracks()

int EdbDataProc::InitVolumeTracks ( EdbPVRec ali,
const char *  rcut 
)

2092{
2093 EdbScanCond *cond=0;
2094 if(eDataSet) {
2095 cond= eDataSet->GetPiece(0)->GetCond(0);
2096 ali->SetScanCond( cond );
2097
2098 EdbDataPiece *piece;
2099 int npieces = eDataSet->N();
2100 Log(2,"EdbDataProc::InitVolumeTracks","npieces = %d",npieces);
2101 if(!npieces) return 0;
2102
2103 if( ali->Npatterns() == 0) { // case of segments already readed
2104 EdbAffine2D *a=0;
2105 EdbPattern *pat=0;
2106 for(int i=0; i<npieces; i++ ) {
2107 piece = eDataSet->GetPiece(i);
2108 pat = new EdbPattern( 0.,0., piece->GetLayer(0)->Z(),100 );
2109 a = piece->GetLayer(0)->GetAffineXY();
2110 pat->SetKeep( a->A11(),a->A12(),a->A21(),a->A22(), a->B1(),a->B2() );
2111 pat->SetPID(i);
2112 ali->AddPattern( pat );
2113 }
2114 ali->SetPatternsID();
2115 }
2116 }
2117 else {
2118 cond = new EdbScanCond();
2119 ali->SetScanCond( cond );
2120 }
2121
2122 ReadTracksTree( *ali, "linked_tracks.root", rcut );
2123
2124 ali->SetSegmentsTracks(); // reset the id of tracks????? to check that it is really necessary!!
2126 ali->SetCouplesAll();
2127 ali->SetChi2Max(cond->Chi2PMax());
2128 ali->SetOffsetsMax(cond->OffX(),cond->OffY());
2129 return ali->Npatterns();
2130}
void a()
Definition: check_aligned.C:59
static int ReadTracksTree(EdbPVRec &ali, const char *fname="linked_tracks.root", const char *rcut="t.eFlag>-1&&nseg>2&&t.eProb>.01")
Definition: EdbDataSet.cxx:2922
void SetSegmentsTracks()
Definition: EdbPVRec.cxx:2474
virtual void SetKeep(float a11, float a12, float a21, float a22, float b1, float b2)
Definition: EdbVirtual.cxx:143

◆ Link() [1/2]

int EdbDataProc::Link ( )
1650{
1651 if (!eDataSet) return 0;
1652 EdbDataPiece *piece;
1653 Int_t np = eDataSet->N();
1654 for (Int_t i = 0; i < np; i++) {
1655 piece = eDataSet->GetPiece(i);
1656 if (piece->TakePiecePar() >= 0) {
1657 if (gEDBDEBUGLEVEL > 2) piece->Print();
1658 piece->WriteCuts();
1659 if (piece->Flag() == 1) Link(*piece);
1660 }
1661 piece->CloseRun();
1662 }
1663 return np;
1664}
int TakePiecePar()
Definition: EdbDataSet.cxx:276
int Flag() const
Definition: EdbDataSet.h:85
void Print()
Definition: EdbDataSet.cxx:161
int Link()
Definition: EdbDataSet.cxx:1649

◆ Link() [2/2]

int EdbDataProc::Link ( EdbDataPiece piece)

!! 0

1668{
1669 EdbPVRec *ali;
1670
1671 //const char *file_name=piece.GetNameCP();
1672 //TTree *cptree=EdbDataPiece::InitCouplesTree(file_name,"RECREATE");
1673 //if(!cptree) return 0;
1674
1675 if (!piece.InitCouplesTree("RECREATE")) return 0;
1676
1677 EdbScanCond *cond = piece.GetCond(1);
1678 int ntot=0, nareas=0;
1679 float shr1=1,shr2=1;
1680 double shrtot1=0., shrtot2=0.;
1681 int nshr=0,nshrtot=0;
1682
1683 for( int irun=0; irun<piece.Nruns(); irun++ ) {
1684 nareas = piece.MakeLinkListCoord(irun);
1685 //nareas = piece.MakeLinkListArea(irun);
1686 Log(2,"EdbDataProc::Link","%d areas mapped",nareas);
1687 if (nareas <= 0) continue;
1688
1689 for (Int_t i = 0; i < nareas; i++ ) {
1690
1691 ali = new EdbPVRec();
1692 ali->SetScanCond( cond );
1693
1694 piece.GetAreaData(ali,i,1);
1695 piece.GetAreaData(ali,i,2);
1696
1697 //ali->SetSegmentsErrors();
1698
1699 ali->SetCouplesAll();
1700 ali->SetChi2Max(cond->Chi2PMax());
1701
1702 for(int ic=0; ic<ali->Ncouples(); ic++)
1703 ali->GetCouple(ic)->SetCHI2mode(cond->Chi2Mode());
1704
1705 ali->Link();
1706
1707 if( ShrinkCorr() ) {
1708 shr1 = 1;
1709 shr2 = 1;
1710 nshr = CheckShrinkage( ali,0, shr1, shr2 );
1711 if(nshr) {
1712 nshrtot += nshr;
1713 shrtot1 += nshr*shr1;
1714 shrtot2 += nshr*shr2;
1715 }
1716 }
1717
1718 FillCouplesTree( piece.eCouplesTree, ali,piece.GetOUTPUT());
1719
1720 delete ali;
1721 }
1722 ntot+=nareas;
1723 if(nshrtot>3) {
1724 shrtot1 = shrtot1/nshrtot;
1725 shrtot2 = shrtot2/nshrtot;
1726 if(nshrtot<20) Log(1,"EdbDataProc::Link","WARNING: unreliable shrinkage correction - low statistics");
1727 Log(2,"EdbDataProc::Link","Shrinkage correction(%d): %f %f", nshrtot, (float)shrtot1,(float)shrtot2);
1728 piece.CorrectShrinkage( 1, (float)shrtot1 );
1729 piece.CorrectShrinkage( 2, (float)shrtot2 );
1730 if(!NoUpdate()) piece.UpdateShrPar(1);
1731 if(!NoUpdate()) piece.UpdateShrPar(2);
1732 }
1733 }
1734 int ncp = piece.eCouplesTree->GetEntries();
1735 piece.CloseCPData();
1736 return ncp;
1737}
int GetOUTPUT() const
Definition: EdbDataSet.h:107
int GetAreaData(EdbPVRec *ali, int const area, int const side)
Definition: EdbDataSet.cxx:1137
int Nruns() const
Definition: EdbDataSet.h:84
TTree * eCouplesTree
Definition: EdbDataSet.h:55
int MakeLinkListCoord(int irun)
Definition: EdbDataSet.cxx:1304
int CheckShrinkage(EdbPVRec *ali, int couple, float &shr1, float &shr2)
Definition: EdbDataSet.cxx:1819
int ShrinkCorr()
Definition: EdbDataSet.h:229
void SetCHI2mode(int m)
Definition: EdbPVRec.h:103
int Chi2Mode() const
Definition: EdbScanCond.h:89

◆ LinkRawTracks()

void EdbDataProc::LinkRawTracks ( int  alg = 0)

2373{
2374 EdbPVRec *ali = new EdbPVRec();
2376 ali->Link();
2377 Log(2,"EdbDataProc::LinkRawTracks","link ok");
2378
2379// if(alg==1) {
2380// ali->MakeHoles();
2381// ali->Link();
2382// printf("link ok\n");
2383// }
2384
2386
2387 TTree *cptree=EdbDataPiece::InitCouplesTree("linked_couples.root","RECREATE");
2388 FillCouplesTree(cptree, ali,0);
2389 CloseCouplesTree(cptree);
2390
2392}
int InitVolumeRaw(EdbPVRec *ali)
Definition: EdbDataSet.cxx:1876

◆ LinkTracks()

void EdbDataProc::LinkTracks ( int  alg = 0,
float  p = -1. 
)

2310{
2311 EdbPVRec *ali = new EdbPVRec();
2312 InitVolume(ali);
2313
2314 Log(2,"EdbDataProc::LinkTracks","tracking: alg = %d \t p= %f", alg, p);
2315
2316 ali->SetCouplesPeriodic(0,1);
2317 int ntr=0;
2318
2319 ntr = LinkTracksWithFlag( ali, p, 0.05, 2, 3, 0 );
2320 //ntr = LinkTracksWithFlag( ali, p/4., 0.01, 2, 3, 1 );
2321 //if(merge>0) ali->MergeTracks(merge);
2322
2323 if(alg==-1) { // this is a test option produce couples tree from the first 2 linked patterns
2324 TTree *cptree=EdbDataPiece::InitCouplesTree("linked_couples.root","RECREATE");
2325 FillCouplesTree(cptree, ali,0);
2326 CloseCouplesTree(cptree);
2327 }
2328
2329 float mass=0.139; //TODO!
2330 ali->FitTracks( p, mass ); // is important to call it before MakeTracksTree!
2331
2333
2334 // After the EdbPVRec is created and filled, set it also as the EdbDataProc own object.
2335 SetPVR(ali);
2336 if (gEDBDEBUGLEVEL>2) {
2337 ali->Print();
2338 }
2339 Log(2,"EdbDataProc::LinkTracks","EdbDataProc::LinkTracks...Done.");
2340 return;
2341}
static int LinkTracksWithFlag(EdbPVRec *ali, float p, float probmin, int nsegmin, int maxgap, int flag, float mass=0.1396)
Definition: EdbDataSet.cxx:2256
void SetPVR(EdbPVRec *pvr)
Definition: EdbDataSet.h:200
void SetCouplesPeriodic(int istart, int iperiod)
Definition: EdbPVRec.cxx:982
void FitTracks(float p=10., float mass=0.139, TObjArray *gener=0, int design=0)
Definition: EdbPVRec.cxx:1893
void Print() const
Definition: EdbPattern.cxx:1693
float mass
Definition: check_vertex.C:21
p
Definition: testBGReduction_AllMethods.C:8

◆ LinkTracksC()

void EdbDataProc::LinkTracksC ( int  alg = 0,
float  p = -1. 
)

special tracking procedure for carbonium dataset

2345{
2347
2348 EdbPVRec *ali = new EdbPVRec();
2349 InitVolume(ali);
2350
2351 Log(2,"EdbDataProc::LinkTracksC","carbonium tracking: alg = %d \t p= %f", alg, p);
2352
2353 ali->SetCouplesPeriodic(0,1);
2354 LinkTracksWithFlag( ali, p, 0.01, 2, 3, 0 );
2355
2356 ali->SetCouplesPeriodic(0,3);
2357 LinkTracksWithFlag( ali, p, 0.01, 2, 6, 1 );
2358
2359 ali->SetCouplesPeriodic(1,3);
2360 LinkTracksWithFlag( ali, p, 0.01, 2, 6, 2 );
2361
2362 ali->SetCouplesPeriodic(2,3);
2363 LinkTracksWithFlag( ali, p, 0.01, 2, 6, 3 );
2364
2365 float mass=0.139; //TODO!
2366 ali->FitTracks( p, mass ); // is important to call it before MakeTracksTree!
2367
2369}

◆ LinkTracksWithFlag()

int EdbDataProc::LinkTracksWithFlag ( EdbPVRec ali,
float  p,
float  probmin,
int  nsegmin,
int  maxgap,
int  flag,
float  mass = 0.1396 
)
static

p - momentum expected for tracks
probmin - minimum probability to accept tracks
nsegmin - min number of segments/track
maxgap - max gap permitted for propagation
flag - to be assigned for the tracks found in this pass

2257{
2263
2264 int ntr0 = ali->Ntracks();
2265 ali->Link();
2267 ali->MakeTracks(nsegmin,flag);
2268
2269 int noProp=0;
2270 if(p<0) noProp=1;
2271 //if(p<0.01) p=4.; //TODO: this protection should be out of this function?
2272
2273 int ntr = ali->Ntracks();
2274 float X0 = ali->GetScanCond()->RadX0();
2275 EdbTrackP *tr=0;
2276 for(int itr=ntr0; itr<ntr; itr++) {
2277 tr = ali->GetTrack(itr);
2278 tr->ClearF();
2279 if(p<0) tr->SetP(1.);
2280 else tr->SetP(p);
2281 tr->SetM(mass);
2282 tr->FitTrackKFS(false,X0);
2283 }
2284
2285 if(!noProp)
2286 if( ali->Npatterns()>2 ) {
2287 ali->FillCell(50,50,0.015,0.015);
2288 for(int i=0; i<10; i++)
2289 if( ali->PropagateTracks(ali->Npatterns()-1,2, probmin, maxgap ) <1) break;
2290 }
2291
2292 /*
2293 ntr = ali->Ntracks();
2294 for(int i=0; i<ntr; i++) {
2295 tr = ali->GetTrack(i);
2296 if(tr->Flag()<0) continue;
2297 if(tr->N()<5) tr->SetP(0.5);
2298 else tr->SetP(tr->P_MS());
2299 }
2300
2301 for(int i=0; i<10; i++)
2302 if( ali->PropagateTracks(ali->Npatterns()-1,2, probmin, maxgap ) <1) break;
2303 */
2304
2305 return ntr-ntr0;
2306}
brick X0
Definition: RecDispMC.C:112
int MakeTracks(int nsegments=2, int flag=0)
Definition: EdbPVRec.cxx:1989
EdbScanCond const * GetScanCond()
Definition: EdbPVRec.h:172
Int_t Ntracks() const
Definition: EdbPVRec.h:203
void FillCell(float stepx, float stepy, float steptx, float stepty)
Definition: EdbPVRec.cxx:1092
int PropagateTracks(int nplmax, int nplmin, float probMin=0.05, int ngapMax=3, int design=0)
Definition: EdbPVRec.cxx:2487
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
float RadX0() const
Definition: EdbScanCond.h:58
Definition: EdbPattern.h:113
int nsegmin
Definition: check_vertex.C:23

◆ MakeTracksSegmentsList()

TIndex2 * EdbDataProc::MakeTracksSegmentsList ( EdbPVRec ali)
3006{
3007 TIndex2 *itracks = 0;
3008 int nsegtot=0;
3009 EdbTrackP *tr=0;
3010 int ntr = ali.eTracks->GetEntries();
3011
3012 if(!ntr) return 0;
3013 Double_t *w = new Double_t[500000];
3014 itracks = new TIndex2();
3015
3016 for(int i=0; i<ntr; i++) {
3017 tr = (EdbTrackP*)(ali.eTracks->At(i));
3018 if(!tr) continue;
3019 EdbSegP *s=0;
3020 int nseg=tr->N();
3021 for(int j=0; j<nseg; j++) {
3022 s = tr->GetSegment(j);
3023 if(!s) continue;
3024 w[nsegtot] = TIndex2::BuildValue( s->Vid(0), s->Vid(1) );
3025 nsegtot++;
3026 }
3027 }
3028 itracks->Set(0);
3029 itracks->BuildIndex(nsegtot,w);
3030 delete[] w;
3031 return itracks;
3032}
TObjArray * eTracks
Definition: EdbPVRec.h:161
static Double_t BuildValue(Int_t major, Int_t minor)
Definition: EdbMath.h:58
void BuildIndex(int n, double *w)
Definition: EdbMath.cxx:359
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ MakeTracksTree() [1/2]

int EdbDataProc::MakeTracksTree ( EdbPVRec ali = 0,
const char *  file = "linked_tracks.root" 
)
static
2507{
2508 if(!ali) return 0;
2509 TObjArray *trarr = ali->eTracks;
2510 if(!trarr) return 0;
2511 float xv=ali->X();
2512 float yv=ali->Y();
2513
2514 return MakeTracksTree(*trarr,xv,yv, file);
2515}

◆ MakeTracksTree() [2/2]

int EdbDataProc::MakeTracksTree ( TObjArray &  tracks,
float  xv = 0,
float  yv = 0,
const char *  file = "linked_tracks.root" 
)
static
2859{
2860 Log(2,"EdbDataProc::MakeTracksTree","write tracks into %s ... ",file);
2861 TFile fil(file,"RECREATE");
2862 TTree *tracks= new TTree("tracks","tracks");
2863
2864 EdbTrackP *track = new EdbTrackP(8); // why is this track initialised with 8 segments by default ???
2865 EdbSegP *tr = new EdbSegP();
2866 TClonesArray *segments = new TClonesArray("EdbSegP");
2867 TClonesArray *segmentsf = new TClonesArray("EdbSegP");
2868
2869 int nseg,trid,npl,n0;
2870 float w=0.;
2871
2872 tracks->Branch("trid",&trid,"trid/I");
2873 tracks->Branch("nseg",&nseg,"nseg/I");
2874 tracks->Branch("npl",&npl,"npl/I");
2875 tracks->Branch("n0",&n0,"n0/I");
2876 tracks->Branch("xv",&xv,"xv/F");
2877 tracks->Branch("yv",&yv,"yv/F");
2878 tracks->Branch("w",&w,"w/F");
2879 tracks->Branch("t.","EdbSegP",&tr,32000,99); // track data is now filled after using Copy method
2880 //tracks->Branch("t.","EdbSegP",&track,32000,99);
2881 tracks->Branch("s", &segments);
2882 tracks->Branch("sf",&segmentsf);
2883
2884 int ntr = trarr.GetEntriesFast();
2885
2886 for(int itr=0; itr<ntr; itr++) {
2887
2888 track = (EdbTrackP*)(trarr.At(itr));
2889 tr->Copy(*track); //Using Copy method from EdbSegP avoids the cast
2890 tr->ForceCOV(track->COV());
2891 trid = track->ID();
2892 nseg = track->N();
2893 npl = track->Npl();
2894 n0 = track->N0();
2895
2896 segments->Clear("C");
2897 segmentsf->Clear("C");
2898 nseg = track->N();
2899 w = track->Wgrains();
2900 EdbSegP *s=0,*sf=0;
2901 for(int is=0; is<nseg; is++) {
2902 s = track->GetSegment(is);
2903 if(s) new((*segments)[is]) EdbSegP( *s );
2904 sf = track->GetSegmentF(is);
2905 if(sf) new((*segmentsf)[is]) EdbSegP( *sf );
2906 }
2907
2908 tr->SetVid( 0, tracks->GetEntries() ); // put track counter in t.eVid[1]
2909 tracks->Fill();
2910 // track->Clear(); // if this Clear() is written at this stage, the corresponding track in
2911 // the EdbPattern Volume (ali, eTracks) will also be cleared! This behavior is not
2912 // wanted, is it? So we do comment this out here ... (Frank, 09 26 2016)
2913 }
2914
2915 tracks->Write();
2916 fil.Close();
2917 Log(2,"EdbDataProc::MakeTracksTree","%d tracks are written",ntr);
2918 return ntr;
2919}
Definition: bitview.h:14
TTree * tracks
Definition: check_tr.C:19

◆ MakeVertexTree()

int EdbDataProc::MakeVertexTree ( TObjArray &  vtxarr,
const char *  file 
)
static
2518{
2519 Log(2,"EdbDataProc::MakeVertexTree","write vertices into %s ... ",file);
2520 TFile fil(file,"RECREATE");
2521 TTree *vtx= new TTree("vtx","Reconstructed vertices in emulion");
2522
2523 EdbSegP *tr = new EdbSegP();
2524 EdbTrackP *track = NULL;
2525
2526 TClonesArray *tracks = new TClonesArray("EdbSegP"); //tracks are saved as EdbSegP, like in MakeTracksTree
2527 TClonesArray *segments = new TClonesArray("EdbSegP");
2528 TClonesArray *segmentsf = new TClonesArray("EdbSegP");
2529
2530 //list of variables
2531
2532 Float_t vx, vy, vz; //true reconstructed vertex position
2533 Float_t meanvx, meanvy, meanvz; //track connection point
2534 Int_t vID = 0;
2535 Float_t maxaperture;
2536 Float_t probability;
2537 Int_t n;
2538 Int_t flag; //we need also the flag to check vertex type
2539 const Int_t maxdim = 1000; //maximum number of tracks associated to a vertex that can be saved in the tree
2540 //big arrays for containers of track variables
2541 Int_t TrackID[maxdim];
2542 Int_t nholes[maxdim];
2543 Int_t maxgap[maxdim];
2544 Int_t nseg[maxdim];
2545 Int_t npl[maxdim];
2546 Float_t TX[maxdim];
2547 Float_t TY[maxdim];
2548 Float_t impactparameter[maxdim];
2549 Int_t incoming[maxdim]; //coming from the vertex
2550 //MC information
2551 Int_t MCEventID[maxdim];
2552 Int_t MCTrackID[maxdim];
2553 Int_t MCTrackPdgCode[maxdim];
2554 Int_t MCMotherID[maxdim];
2555
2556 //list of branches
2557 vtx->Branch("vID",&vID,"vID/I");
2558 vtx->Branch("flag",&flag,"flag/I");
2559 vtx->Branch("vx",&vx,"vx/F");
2560 vtx->Branch("vy",&vy,"vy/F");
2561 vtx->Branch("vz",&vz,"vz/F");
2562 vtx->Branch("meanvx",&meanvx,"meanvx/F");
2563 vtx->Branch("meanvy",&meanvy,"meanvy/F");
2564 vtx->Branch("meanvz",&meanvz,"meanvz/F");
2565 vtx->Branch("maxaperture",&maxaperture,"maxaperture/F");
2566 //vtx->Branch("maxrmsthetaspace",&maxrmsthetaspace,"maxrmsthetaspace/F");
2567 vtx->Branch("probability",&probability,"probability/F");
2568 vtx->Branch("n",&n,"n/I");
2569 vtx->Branch("t.",&tracks); // track data is now filled after using Copy method
2570 //tracks->Branch("t.","EdbSegP",&track,32000,99);
2571 vtx->Branch("s", &segments);
2572 vtx->Branch("sf",&segmentsf);
2573 //track variables (they are array with the number of tracks as size)
2574 vtx->Branch("TrackID",&TrackID,"TrackID[n]/I");
2575 vtx->Branch("nseg",&nseg,"nseg[n]/I");
2576 vtx->Branch("npl",&npl,"npl[n]/I");
2577 vtx->Branch("nholes",&nholes,"nholes[n]/I"); //even more variables in this tree
2578 vtx->Branch("maxgap",&maxgap,"maxgap[n]/I");
2579 vtx->Branch("incoming",&incoming,"incoming[n]/I");
2580 vtx->Branch("impactparameter",&impactparameter,"impactparameter[n]/F");
2581 //inserting MCtrue information
2582 vtx->Branch("MCEventID", &MCEventID, "MCEventID[n]/I");
2583 vtx->Branch("MCTrackID",&MCTrackID,"MCTrackID[n]/I");
2584 vtx->Branch("MCTrackPdgCode",&MCTrackPdgCode,"MCTrackPdgCode[n]/I");
2585 vtx->Branch("MCMotherID",&MCMotherID,"MCMotherID[n]/I");
2586
2587 int nvtx = vtxarr.GetEntriesFast();
2588 //START TREE FILLING
2589 for(int ivtx=0; ivtx<nvtx; ivtx++) {
2590 int itotalseg = 0;
2591 tracks->Clear("C");
2592 segments->Clear("C");
2593 segmentsf->Clear("C");
2594
2595 EdbVertex* vertex = (EdbVertex*) (vtxarr.At(ivtx));
2596 if(vertex->Flag()<0) continue; //saving only 'true' vertices in the tree file and in the object
2597 vx=vertex->VX();
2598 vy=vertex->VY();
2599 vz=vertex->VZ();
2600 meanvx=vertex->X();
2601 meanvy=vertex->Y();
2602 meanvz=vertex->Z();
2603 n=vertex->N();
2604 maxaperture = vertex->MaxAperture();
2605 probability = vertex->V()->prob();
2606 flag = vertex->Flag();
2607 //adding vertex to list to be saved
2608 //loop on tracks //now it can be done offline (again)
2609 for (int itrk = 0; itrk < n; itrk++){
2610 //getting track and track variables to fill branches
2611 track = vertex->GetTrack(itrk);
2612 tr->Copy(*track);
2613// tr->ForceCOV(track->COV());
2614 if(tr) new((*tracks)[itrk]) EdbSegP( *tr ); //adding track to trackclonesarray
2615 ((EdbSegP*) tracks->At(itrk))->ForceCOV(track->COV()); //default copy does NOT save COV corrrectly
2616 TrackID[itrk] = track->Track(); //the eTrack attribute of EdbSegP now allows association to original root tree
2617 nseg[itrk] = track->N();
2618 npl[itrk] = track->Npl();
2619 Int_t zpos = vertex->GetVTa(itrk)->Zpos();
2620 incoming[itrk] = zpos;
2621 nholes[itrk] = track->N0();
2622 maxgap[itrk] = track->CheckMaxGap();
2623 impactparameter[itrk] = vertex->GetVTa(itrk)->Imp();
2624 //Storing MCTrue information (of course for real data these values have no sense)
2625 MCEventID[itrk] = track->MCEvt();
2626 MCTrackID[itrk] = track->MCTrack();
2627 if(MCEventID[itrk]>-1){ //vertices from MC simulation, used Vid[0] and Aid[0] to store these information
2628 MCTrackPdgCode[itrk] = track->Vid(0);
2629 MCMotherID[itrk] = track->Aid(0); //used to store MotherID information
2630 }
2631 else { //vertices from data, set default values
2632 MCTrackPdgCode[itrk] = -999;
2633 MCMotherID[itrk] = -999;
2634 }
2635 //w = track->Wgrains();
2636 EdbSegP *s=0,*sf=0;
2637 //loop on segments
2638 for(int is=0; is<nseg[itrk]; is++) {
2639 s = track->GetSegment(is);
2640 if(s) new((*segments)[itotalseg]) EdbSegP( *s );
2641 ((EdbSegP*) segments->At(itotalseg))->ForceCOV(s->COV()); //default copy does NOT save COV corrrectly
2642 sf = track->GetSegmentF(is);
2643 if(sf) new((*segmentsf)[itotalseg]) EdbSegP( *sf );
2644 ((EdbSegP*) segmentsf->At(itotalseg))->ForceCOV(sf->COV()); //default copy does NOT save COV corrrectly
2645 itotalseg++;
2646 }
2647
2648 // track->SetVid( 0, tracks->GetEntries() ); // put track counter in t.eVid[1]
2649 }
2650 vtx->Fill();
2651 vID++; //now the number of elements in the tree and vertices is the same. vID starts from 0
2652 }
2653 vtx->Write();
2654 fil.Close();
2655 Log(2,"EdbDataProc::MakeVertexTree","%d vertices are written",nvtx);
2656 return nvtx;
2657}
Float_t Imp() const
Definition: EdbVertex.h:49
Int_t Zpos() const
Definition: EdbVertex.h:47
Float_t VX() const
Definition: EdbVertex.h:133
Float_t X() const
Definition: EdbVertex.h:130
EdbVTA * GetVTa(int i)
Definition: EdbVertex.h:139
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
Int_t N() const
Definition: EdbVertex.h:121
Float_t VY() const
Definition: EdbVertex.h:134
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
Float_t VZ() const
Definition: EdbVertex.h:135
Float_t Z() const
Definition: EdbVertex.h:132
Int_t Flag() const
Definition: EdbVertex.h:124
Float_t MaxAperture()
Definition: EdbVertex.cxx:252
Float_t Y() const
Definition: EdbVertex.h:131
float prob() const
upper tail $\chi^2$ probability
Definition: VtVertex.C:237
Double_t TY
Definition: tlg2couples.C:78
Double_t TX
Definition: tlg2couples.C:78
#define NULL
Definition: nidaqmx.h:84

◆ NoUpdate()

int EdbDataProc::NoUpdate ( ) const
inline
227{ return eNoUpdate; }

◆ Process()

int EdbDataProc::Process ( )
inline
214{ return Link(); } // to be removed

◆ PVR()

EdbPVRec * EdbDataProc::PVR ( ) const
inline
198{return ePVR;}

◆ ReadTracksTree()

int EdbDataProc::ReadTracksTree ( EdbPVRec ali,
const char *  fname = "linked_tracks.root",
const char *  rcut = "t.eFlag>-1&&nseg>2&&t.eProb>.01" 
)
static
2927{
2928 TFile f(fname);
2929 if(f.IsZombie()) { Log(1,"EdbDataProc::ReadTracksTree","Error open file %s", fname); return 0; }
2930
2931 TTree *tracks = (TTree*)f.Get("tracks");
2932 Int_t trid=0;
2933 Int_t nseg=0;
2934 Int_t npl=0;
2935 Int_t n0=0;
2936 Float_t xv=0.;
2937 Float_t yv=0.;
2938
2939 int nentr = (int)(tracks->GetEntries());
2940 TCut cut = rcut;
2941 tracks->Draw(">>lst", cut );
2942 TEventList *lst = (TEventList*)gDirectory->GetList()->FindObject("lst");
2943 int nlst =lst->GetN();
2944 if(cut) Log(2,"EdbDataProc::ReadTracksTree","select %d of %d tracks by cut %s",nlst, nentr, cut.GetTitle() );
2945
2946 TClonesArray *seg = new TClonesArray("EdbSegP", 60);
2947 TClonesArray *segf = new TClonesArray("EdbSegP", 60);
2948 EdbSegP *trk=0;
2949 EdbSegP *s1=0;
2950 EdbSegP *s1f=0;
2951
2952 tracks->SetBranchAddress("trid", &trid);
2953 tracks->SetBranchAddress("nseg", &nseg);
2954 tracks->SetBranchAddress("npl", &npl);
2955 tracks->SetBranchAddress("n0", &n0);
2956 tracks->SetBranchAddress("xv", &xv);
2957 tracks->SetBranchAddress("yv", &yv);
2958 tracks->SetBranchAddress("sf", &segf);
2959 tracks->SetBranchAddress("s", &seg);
2960 tracks->SetBranchAddress("t.", &trk);
2961
2962 EdbPattern *pat=0;
2963 int entr=0;
2964 for (int j=0; j<nlst; j++){
2965 entr = lst->GetEntry(j);
2966 tracks->GetEntry(entr);
2967
2968 EdbTrackP *tr1 = new EdbTrackP();
2969 ((EdbSegP*)tr1)->Copy(*trk);
2970 tr1->ForceCOV(trk->COV());
2971 tr1->SetM(0.139); //TODO
2972
2973 for(int i=0; i<nseg; i++) {
2974 s1 = (EdbSegP*)(seg->At(i));
2975 s1f = (EdbSegP*)(segf->At(i));
2976 pat = ali.GetPattern( s1->PID() );
2977 if(!pat) {
2978 Log(1,"EdbDataProc::ReadTracksTree","WARNING: no pattern with pid %d: creating new one!",s1->PID());
2979 pat = new EdbPattern( 0., 0., s1->Z() );
2980 pat->SetID(s1->PID());
2981 pat->SetScanID(s1->ScanID());
2982 ali.AddPatternAt(pat,s1->PID());
2983 }
2984 //This way it should be more clear which segment instance is added to the track
2985 EdbSegP *segtobeadded = pat->AddSegment(*s1);
2986 EdbSegP *segftobeadded = new EdbSegP(*s1f);
2987 segtobeadded->ForceCOV(s1->COV());
2988 segftobeadded->ForceCOV(s1f->COV());
2989
2990 tr1->AddSegment( segtobeadded );
2991 tr1->AddSegmentF( segftobeadded );
2992 }
2993 tr1->SetSegmentsTrack(tr1->ID());
2994 tr1->SetCounters();
2995 //tr1->FitTrackKFS(true);
2996 tr1->SetTrack(trid); //providing trackid to eTrack so it will not be lost when trackID resets
2997 ali.AddTrack(tr1);
2998 }
2999
3000 Log(2,"EdbDataProc::ReadTracksTree","%d tracks are read",nlst);
3001 return nlst;
3002}
void AddTrack(EdbTrackP *track)
Definition: EdbPVRec.h:246
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
void SetTrack(int trid)
Definition: EdbSegP.h:131
Int_t ID() const
Definition: EdbSegP.h:147
void ForceCOV(TMatrixD &cov)
Definition: EdbSegP.h:110
TMatrixD & COV() const
Definition: EdbSegP.h:123
Int_t PID() const
Definition: EdbSegP.h:148
EdbID ScanID() const
Definition: EdbSegP.h:160
void AddSegmentF(EdbSegP *s)
Definition: EdbPattern.h:233
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:214
int SetSegmentsTrack(int id)
Definition: EdbPattern.h:246
void SetCounters()
Definition: EdbPattern.h:159
void SetM(float m)
Definition: EdbPattern.h:154
TCut cut
Definition: check_shower.C:6

◆ ReadVertexTree() [1/2]

int EdbDataProc::ReadVertexTree ( EdbVertexRec vertexrec,
const char *  fname,
const char *  rcut,
map< int, EdbTrackP * >  trackID_map 
)
static
2659{
2660 TFile f(fname);
2661 if(f.IsZombie()) { Log(1,"EdbDataProc::ReadVertexTree","Error open file %s", fname); return 0; }
2662
2663 TTree *vtx = (TTree*)f.Get("vtx");
2664
2665 //vertex variables
2666 Float_t vx, vy, vz;
2667 Int_t vID = 0;
2668 Int_t n = 0;
2669 Int_t flag = 0;
2670 //track variables
2671
2672 const Int_t maxdim = 1000; //maximum number of tracks associated to a vertex that can be saved in the tree
2673 //big arrays for containers of track variables
2674 Int_t TrackID[maxdim];
2675 Int_t nholes[maxdim];
2676 Int_t maxgap[maxdim];
2677 Int_t nseg[maxdim];
2678 Float_t TX[maxdim];
2679 Float_t TY[maxdim];
2680 Float_t impactparameter[maxdim];
2681 Int_t incoming[maxdim]; //coming from the vertex
2682 //MC information
2683 Int_t MCEventID[maxdim];
2684 Int_t MCTrackID[maxdim];
2685 Int_t MCMotherID[maxdim];
2686/*
2687 Int_t trid=0;
2688 Int_t nseg=0;
2689 Int_t npl=0;
2690 Int_t n0=0;
2691 Float_t xv=0.;
2692 Float_t yv=0.;*/
2693
2694 int nentr = (int)(vtx->GetEntries());
2695 TCut cut = rcut;
2696 vtx->Draw(">>lst", cut );
2697 TEventList *lst = (TEventList*)gDirectory->GetList()->FindObject("lst");
2698 int nlst =lst->GetN();
2699 if(cut) Log(2,"EdbDataProc::ReadVtxTree","select %d of %d vertices by cut %s",nlst, nentr, cut.GetTitle() );
2700
2701 TClonesArray *tracks = new TClonesArray("EdbSegP");
2702 TClonesArray *seg = new TClonesArray("EdbSegP", 60);
2703 TClonesArray *segf = new TClonesArray("EdbSegP", 60);
2704
2705 EdbSegP *trk=0;
2706 EdbSegP *s1=0;
2707 EdbSegP *s1f=0;
2708 //vertex variables
2709 vtx->SetBranchAddress("vID",&vID);
2710 vtx->SetBranchAddress("flag",&flag);
2711 vtx->SetBranchAddress("vx",&vx);
2712 vtx->SetBranchAddress("vy",&vy);
2713 vtx->SetBranchAddress("vz",&vz);
2714 vtx->SetBranchAddress("n",&n);
2715 //arrays
2716 vtx->SetBranchAddress("nseg",&nseg);
2717 vtx->SetBranchAddress("TrackID",&TrackID);
2718 vtx->SetBranchAddress("incoming",&incoming);
2719 //TClones arrays
2720 vtx->SetBranchAddress("sf", &segf);
2721 vtx->SetBranchAddress("s", &seg);
2722 vtx->SetBranchAddress("t.", &tracks);
2723
2724 EdbPattern *pat=0;
2725 int entr=0;
2726 //now each tree entry is a vertex
2727
2728 TObjArray * vertextracks = new TObjArray(maxdim);
2729 float expz = 0.;
2730
2731 EdbPVRec *ali = vertexrec.ePVR; //I get EdbPVR from EdbVertexRec from now on
2732 for (int j=0; j<nlst; j++){
2733 //RESET COUNTERS!
2734 int itotalseg = 0; //counter for all the segments
2735 vertextracks->Clear("C");
2736
2737 entr = lst->GetEntry(j);
2738 vtx->GetEntry(entr);
2739 EdbVertex *v1 = new EdbVertex();
2740 //loop on all tracks associated to the vertex
2741 for (int itrk = 0; itrk < n; itrk++){
2742 EdbTrackP *tr1;
2743 if(!trackID_map[TrackID[itrk]]){
2744 tr1= new EdbTrackP();
2745 trk = (EdbSegP*) tracks->At(itrk); //getting track itrk
2746 ((EdbSegP*)tr1)->Copy(*trk);
2747 tr1->ForceCOV(trk->COV());
2748 tr1->SetM(0.139); //TODO
2749
2750 for(int i=0; i<nseg[itrk]; i++) {
2751 s1 = (EdbSegP*)(seg->At(itotalseg));
2752 s1f = (EdbSegP*)(segf->At(itotalseg));
2753 pat = ali->GetPattern( s1->PID() );
2754 if(!pat) {
2755 Log(1,"EdbDataProc::ReadVertexTree","WARNING: no pattern with pid %d: creating new one!",s1->PID());
2756 pat = new EdbPattern( 0., 0., s1->Z() );
2757 pat->SetID(s1->PID());
2758 pat->SetScanID(s1->ScanID());
2759 ali->AddPatternAt(pat,s1->PID());
2760 }
2761
2762 //This way it should be more clear which segment instance is added to the track
2763 EdbSegP *segtobeadded = pat->AddSegment(*s1);
2764 EdbSegP *segftobeadded = new EdbSegP(*s1f);
2765 segtobeadded->ForceCOV(s1->COV());
2766 segftobeadded->ForceCOV(s1f->COV());
2767
2768 tr1->AddSegment(segtobeadded);
2769 tr1->AddSegmentF(segftobeadded);
2770 itotalseg++; //increasing counter of number of segments
2771 }
2772 tr1->SetSegmentsTrack(tr1->ID());
2773 tr1->SetCounters();
2774 //tr1->FitTrackKFS(true);
2775 tr1->SetTrack(TrackID[itrk]); //providing trackid to eTrack so it will not be lost when trackID resets
2776 ali->AddTrack(tr1);
2777 trackID_map[TrackID[itrk]] = tr1;
2778 }
2779 else{ //track already added to ali, add it only to vertex
2780 tr1 = trackID_map[TrackID[itrk]];
2781 itotalseg+= nseg[itrk];
2782 }
2783 vertextracks->Add(tr1);
2784 //v1 = vertexrec->AddTrackToVertex(v1, tr1, incoming[itrk]);
2785 }
2786 //setting vertex parameters and saving vertex
2787 //v1 = vertexrec.Make1Vertex(*vertextracks,vz) (copied here instead, by putting zpos directly as for in vertexing);
2788 v1->SetXYZ( 0,0, vz );
2789 int ntr = vertextracks->GetEntries();
2790 for(int i=0; i<ntr; i++) {
2791 EdbTrackP *t = (EdbTrackP*)vertextracks->At(i);
2792 EdbVTA *vta = new EdbVTA(t,v1);
2793 vta->SetFlag(2);
2794 v1->AddVTA(vta);
2795 vta->SetZpos(incoming[i]);
2796 t->AddVTA(vta);
2797 }
2798 if( vertexrec.MakeV(*v1) ) vertexrec.AddVertex(v1);
2799 //else { SafeDelete(v); return 0; } // vertex is not valid
2800 //return v;
2801 v1->SetID(vID);
2802 v1->SetFlag(flag);
2803 /* make vertex manually, old version
2804 int ntr = vertextracks->GetEntries();
2805 v1->SetXYZ(vx,vy,vz);
2806 for(int i=0; i<ntr; i++) {
2807 EdbTrackP *t = (EdbTrackP*)vertextracks->At(i);
2808 EdbVTA *vta = new EdbVTA(t,v1);
2809 vta->SetFlag(2);
2810 v1->AddVTA(vta);
2811 (t->Z() >= v1->Z())? vta->SetZpos(1) : vta->SetZpos(0);
2812 t->AddVTA(vta);
2813 } */
2814
2815 ali->AddVertex(v1);
2816 }
2817
2818 Log(2,"EdbDataProc::ReadVtxTree","%d vertices are read",nlst);
2819 return nlst;
2820}
void AddVertex(EdbVertex *vtx)
Definition: EdbPVRec.h:251
Definition: EdbVertex.h:26
void SetZpos(int zpos)
Definition: EdbVertex.h:55
void SetFlag(int flag)
Definition: EdbVertex.h:56
void AddVertex(EdbVertex *vtx)
Definition: EdbVertex.h:290
Int_t MakeV(EdbVertex &edbv, bool isRefit=false)
Definition: EdbVertex.cxx:791
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:355
void SetID(int ID=0)
Definition: EdbVertex.h:156
void SetFlag(int flag=0)
Definition: EdbVertex.h:158
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157

◆ ReadVertexTree() [2/2]

int EdbDataProc::ReadVertexTree ( EdbVertexRec vertexrec,
const char *  fname,
const char *  rcut,
TObjArray *  builttracks = 0 
)
static
2823 {
2824
2825 map<int,EdbTrackP*>emptymap;
2826 if (builttracks){
2827 int ntracks = builttracks->GetEntries();
2828
2829 for (int itrk = 0; itrk < ntracks; itrk++){
2830 EdbTrackP * track = (EdbTrackP*) builttracks->At(itrk);
2831 emptymap[track->Track()] = track; //adding this trackID to map
2832 }
2833 }
2834
2835 int nlst = ReadVertexTree( vertexrec, fname, rcut,emptymap);
2836 return nlst;
2837 }

◆ SetNoUpdate()

void EdbDataProc::SetNoUpdate ( int  nu)
inline
226{ eNoUpdate=nu; }

◆ SetPVR()

void EdbDataProc::SetPVR ( EdbPVRec pvr)
inline
200{ePVR=pvr;}

◆ ShrinkCorr()

int EdbDataProc::ShrinkCorr ( )
inline
229{return 1;}

Member Data Documentation

◆ eDataSet

EdbDataSet* EdbDataProc::eDataSet
private

◆ eNoUpdate

int EdbDataProc::eNoUpdate
private

◆ ePVR

EdbPVRec* EdbDataProc::ePVR
private

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