BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcxMergeDups.cxx
Go to the documentation of this file.
1//-------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcxMergeDups.cxx,v 1.11 2022/07/04 21:28:34 zhangy Exp $
4//
5// Description:
6// Class Implementation for K0s finding
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Author List:
12// S. Wagner
13//
14// Copyright Information:
15// Copyright (C) 1997 BEPCII
16//
17// History:
18// Migration for BESIII MDC
19//
20//------------------------------------------------------------------------
21#include "MdcxReco/MdcxMergeDups.h"
22#include "CLHEP/Alist/AIterator.h"
23#include "MdcxReco/MdcxHel.h"
24#include "MdcxReco/MdcxHit.h"
25#include "MdcxReco/MdcxParameters.h"
26#include <math.h>
27using std::cout;
28using std::endl;
29
30// DECLARE_COMPONENT(MdcxMergeDups)
32 m_debug = ( debug == 10 );
33 int iprt = 0;
34 int ntracks = trkl.length();
35 if ( iprt ) cout << "MdcxMergeDups called with " << ntracks << " tracks" << endl;
36 double m_2pi = 2.0 * M_PI;
37 int k = 0;
38 while ( trkl[k] ) trkl[k++]->SetUsedOnHel( 0 );
39
40 if ( ntracks > 1 )
41 {
42 for ( int i = 0; i < ntracks - 1; i++ )
43 {
44 MdcxFittedHel* iptr = trkl[i];
45 int already_merged = 0;
46 if ( iptr->GetUsedOnHel() )
47 {
48 already_merged = trkl[i]->GetUsedOnHel();
49 iptr = NewTrklist[already_merged - 1];
50 }
51 for ( int j = i + 1; j < ntracks; j++ )
52 {
53 if ( trkl[j]->GetUsedOnHel() ) continue;
54 double omega1 = iptr->Omega();
55 double omega2 = trkl[j]->Omega();
56 double phi01 = iptr->Phi0();
57 double phi02 = trkl[j]->Phi0();
58 double d01 = iptr->D0();
59 double d02 = trkl[j]->D0();
60 double prodo = omega1 * omega2;
61 if ( m_debug )
62 cout << "Try track [" << i << "] and [" << j << "], prodo = " << prodo << endl;
63 // Try to merge pair that looks like duplicates (same charge)
64 if ( prodo > 0.0 )
65 {
66 if ( m_debug ) std::cout << " fabs(d01 - d02) " << fabs( d01 - d02 ) << std::endl;
67 if ( fabs( d01 - d02 ) < MdcxParameters::maxDd0InMerge )
68 {
69 if ( m_debug )
70 std::cout << " fabs(phi01-phi02) " << fabs( phi01 - phi02 ) << std::endl;
71 if ( fabs( phi01 - phi02 ) < MdcxParameters::maxDphi0InMerge )
72 {
73 double r1 = 100000.;
74 if ( fabs( omega1 ) > 0.00001 ) r1 = 1.0 / fabs( omega1 );
75 double r2 = 100000.;
76 if ( fabs( omega2 ) > 0.00001 ) r2 = 1.0 / fabs( omega2 ); // FIXME
77 double pdrad = fabs( ( r1 - r2 ) / ( r1 + r2 ) );
78 if ( m_debug )
79 {
80 std::cout << "omega1,r1 " << omega1 << " " << r1 << " omega2,r2 " << omega2
81 << " " << r2 << " pdrad " << pdrad << std::endl;
82 }
84 {
85 if ( iprt )
86 cout << "MdcxMD i j dif " << i << " " << j << " " << d01 - d02 << " "
87 << phi01 - phi02 << " " << r1 << " " << r2 << " " << pdrad << endl;
88 HepAList<MdcxHit> dcxhlist = iptr->XHitList();
89 if ( iprt ) cout << "MdcxMD " << dcxhlist.length() << " " << iptr->Chisq();
90 const HepAList<MdcxHit>& dcxh2 = trkl[j]->XHitList();
91 if ( iprt ) cout << " " << dcxh2.length() << " " << trkl[j]->Chisq();
92 dcxhlist.append( dcxh2 );
93 dcxhlist.purge();
94 if ( iprt ) cout << " " << dcxhlist.length() << endl;
95 MdcxFittedHel fit1( dcxhlist, *iptr ); // fit1.FitPrint(); fit1.print();
96 MdcxFittedHel fit2( dcxhlist, *trkl[j] ); // fit2.FitPrint(); fit2.print();
97 int uf = 0;
98 if ( !fit1.Fail() && ( fit1.Rcs() < MdcxParameters::maxRcsInMerge ) ) uf = 1;
99 if ( !fit2.Fail() && ( fit2.Rcs() < fit1.Rcs() ) ) uf = 2;
100 if ( m_debug )
101 {
102 std::cout << "fit1.Fail() " << fit1.Fail() << " fit1.Rcs " << fit1.Rcs()
103 << " fit2.Fail() " << fit2.Fail() << " fit2.Rcs " << fit2.Rcs()
104 << std::endl;
105 }
106 if ( uf )
107 {
108 MdcxHel fitme = ( uf == 1 ) ? fit1 : fit2;
109 MdcxFittedHel* finehel = new MdcxFittedHel( dcxhlist, fitme );
110 if ( !finehel->Fail() )
111 {
112 if ( already_merged )
113 {
114 NewTrklist.replace( iptr, finehel );
115 delete iptr;
116 iptr = finehel;
117 trkl[j]->SetUsedOnHel( already_merged );
118 }
119 else
120 {
121 NewTrklist.append( finehel );
122 already_merged = NewTrklist.length();
123 iptr->SetUsedOnHel( already_merged );
124 iptr = finehel;
125 trkl[j]->SetUsedOnHel( already_merged );
126 }
127 }
128 else { delete finehel; }
129 }
130 }
131 }
132 }
133 }
134
135 // Try to merge pair that looks like albedo (opp charge, large d0)
136 if ( prodo < 0.0 )
137 {
138 if ( ( fabs( d01 + d02 ) < 4.0 ) && ( fabs( d01 - d02 ) > 47.0 ) )
139 { /// FIXME
140 double deltap = fabs( fabs( phi01 - phi02 ) - M_PI );
141 if ( deltap < MdcxParameters::maxDphi0InMerge )
142 {
143 double r1 = 100000.;
144 if ( fabs( omega1 ) > 0.00001 ) r1 = 1.0 / fabs( omega1 );
145 double r2 = 100000.;
146 if ( fabs( omega2 ) > 0.00001 ) r2 = 1.0 / fabs( omega2 );
147 double pdrad = fabs( ( r1 - r2 ) / ( r1 + r2 ) );
149 {
150 if ( iprt )
151 cout << "MdcxMD i j sum " << i << " " << j << " " << d01 + d02 << " "
152 << deltap << " " << r1 << " " << r2 << " " << pdrad << endl;
153 MdcxHel temp1 = *iptr;
154 // zoujh?: temp1.SetTurnFlag(1);
155 MdcxHel temp2 = *trkl[j];
156 temp2.SetTurnFlag( 1 );
157 HepAList<MdcxHit> dcxhlist = iptr->XHitList();
158 if ( iprt ) cout << "MdcxMD " << dcxhlist.length() << " " << iptr->Chisq();
159 const HepAList<MdcxHit>& dcxh2 = trkl[j]->XHitList();
160 if ( iprt ) cout << " " << dcxh2.length() << " " << trkl[j]->Chisq();
161 dcxhlist.append( dcxh2 );
162 dcxhlist.purge();
163 if ( iprt ) cout << " " << dcxhlist.length() << endl;
164 MdcxFittedHel fit1( dcxhlist, temp1 ); // fit1.FitPrint(); fit1.print();
165 MdcxFittedHel fit2( dcxhlist, temp2 ); // fit2.FitPrint(); fit2.print();
166 int uf = 0;
167 if ( !fit1.Fail() && ( fit1.Rcs() < MdcxParameters::maxRcsInMerge ) ) uf = 1;
168 if ( !fit2.Fail() && ( fit2.Rcs() < fit1.Rcs() ) ) uf = 2;
169 if ( uf )
170 {
171 MdcxHel fitme = ( 1 == uf ) ? fit1 : fit2;
172 MdcxFittedHel* finehel = new MdcxFittedHel( dcxhlist, fitme );
173 if ( !finehel->Fail() )
174 {
175 if ( already_merged )
176 {
177 NewTrklist.replace( iptr, finehel );
178 delete iptr;
179 iptr = finehel;
180 trkl[j]->SetUsedOnHel( already_merged );
181 }
182 else
183 {
184 NewTrklist.append( finehel );
185 already_merged = NewTrklist.length();
186 iptr->SetUsedOnHel( already_merged );
187 iptr = finehel;
188 trkl[j]->SetUsedOnHel( already_merged );
189 }
190 }
191 else { delete finehel; }
192 }
193 }
194 }
195 }
196 }
197 } // end j loop
198 } // end i loop
199 }
200
201 k = 0;
202 while ( trkl[k] )
203 {
204 if ( iprt )
205 cout << "In MdcxMD, trk is used on " << k << " " << trkl[k]->GetUsedOnHel() << endl;
206 if ( !trkl[k]->GetUsedOnHel() ) CleanTrklist.append( trkl[k] );
207 k++;
208 }
209
210 k = 0;
211 while ( NewTrklist[k] )
212 {
213 if ( iprt && m_debug )
214 {
215 NewTrklist[k]->FitPrint();
216 NewTrklist[k]->print();
217 }
218
219 CleanTrklist.append( NewTrklist[k++] );
220 }
221
222 if ( iprt ) cout << "MdcxMD leaves with " << CleanTrklist.length() << " tracks" << endl;
223}
224
#define M_PI
Definition TConstant.h:4
int Fail(float Probmin=0.0) const
virtual ~MdcxMergeDups()
MdcxMergeDups(HepAList< MdcxFittedHel > &f, int debug)