BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcTrackListCsmc.cxx
Go to the documentation of this file.
1//
2// $Id: MdcTrackListCsmc.cxx,v 1.7 2008/04/01 03:14:36 zhangy Exp $
3//
4#include "MdcTrkRecon/MdcTrackListCsmc.h"
5#include "MdcData/MdcHitOnTrack.h"
6#include "MdcRawEvent/MdcDigi.h"
7#include "MdcTrkRecon/MdcSegGrouperCsmc.h"
8#include "MdcTrkRecon/MdcSegGrouperSt.h"
9#include "MdcTrkRecon/MdcSegList.h"
10#include "MdcTrkRecon/MdcTrack.h"
11#include "TrkBase/TrkErrCode.h"
12#include "TrkBase/TrkExchangePar.h"
13#include "TrkBase/TrkFit.h"
14#include "TrkBase/TrkHitList.h"
15#include "TrkBase/TrkRecoTrk.h"
16#include "TrkFitter/TrkLineMaker.h"
17#include <iostream>
18#include <math.h>
19
20// yzhang hist cut
21#include "AIDA/IHistogram1D.h"
22// extern AIDA::IHistogram1D* g_tkChi2;
23// zhangy hist cut
24
25// IOS_USING_DECLARATION_MARKER - BaBar iostreams migration, do not touch this line!
26using std::cout;
27using std::endl;
28
29// End Implementation Dependencies -------------------------------------
30
31// *************************************************************************
33 // *************************************************************************
34 return;
35}
36
37// *************************************************************************
39// *************************************************************************
40
41// *************************************************************************
43 const MdcDetector* gm, TrkContext& context, double t0 ) {
44 // *************************************************************************
45 // Forms tracks out of list of superlayer segments
46 int nTracks = 0;
47 // Create empty list of stereo segs (to save time)
48 MdcSegGrouperSt stereoSegs( gm, tkParam.lPrint );
49 // *** Create r-phi track
50
51 // Create list of axial segments, treated as on straight tracks
52 MdcSegGrouperCsmc straightSegs( gm, tkParam.lPrint );
53 straightSegs.fillWithSegs( segs );
54 // std::cout<< "after straight fill " << std::endl;
55 // segs->plot();//yzhang debug
56 MdcSeg* seed;
57 int goodOnly = 1;
58 MdcTrack* trialTrack = 0;
59 while ( 1 )
60 {
61 seed = segs->getSeed( 0, goodOnly );
62 if ( seed == 0 && goodOnly == 1 )
63 {
64 segs->resetSeed( gm );
65 goodOnly = 0;
66 continue;
67 }
68 else if ( seed == 0 && goodOnly == 0 ) { break; }
69 delete trialTrack;
70 trialTrack = 0;
71 int success =
72 straightSegs.combineSegs( trialTrack, seed, context, t0, tkParam.maxSegChisqO );
73 if ( !success )
74 {
75 // std::cout<< " MdcTrackListCsmc::combineSegs not successed!" << std::endl;
76 continue;
77 }
78
79 if ( tkParam.lPrint > 1 ) { trialTrack->track().printAll( cout ); }
80 // *** End r-phi track-finding
81
82 // *** Add stereo to taste
83 stereoSegs.fillWithSegs( segs, trialTrack );
84
85 success = stereoSegs.combineSegs( trialTrack, 0, context, t0, tkParam.maxSegChisqO );
86 if ( success )
87 {
88 // Finish 3-d track;
89 success = finish3d( trialTrack->track() );
90 // success = finish3d(trialTrack->track()); // GSciolla: try to repeat
91 }
92 if ( !success )
93 {
94 // std::cout<< " MdcTrackListCsmc::finish3d not successed!" << std::endl;
95 continue;
96 }
97
98 if ( tkParam.lPrint > 1 ) { trialTrack->track().printAll( cout ); }
99
100 nTracks++;
101 append( trialTrack ); // Add to list of Tracks
102 trialTrack = 0;
103
104 } // end while(1)
105 delete trialTrack;
106
107 // cout << " Number of Tracks found= " << nTracks ;
108 // cout << " " << endl;
109 return nTracks;
110}
111
112// ************************************************************************
114 // ************************************************************************
115 int success = 0;
116 int nParamFit = 0;
117
118 TrkErrCode fitResult;
119
120 // ------------------------
121 // 4 param fit (line)
122 // ------------------------
123 nParamFit = 4;
124 TrkLineMaker makeFit;
125 makeFit.changeFit( trk );
126 makeFit.setFlipAndDrop( trk, true, true );
127 // setCosmic(&trk); // set hot to cosmics OBSOLETE! REMOVE!
128 fitResult = trk.hits()->fit();
129 makeFit.setFlipAndDrop( trk, false, false );
130
131 // ---------------------------------------------------------------
132 // Are there some TDC that can be replaced with later measurements? ( beginning)
133 // ---------------------------------------------------------------
134 // Note to Sciolla: multiple hits commented out for now OK! I will put it back later...
135 /* if( _flags.useMultipleHits ) {
136 int NHITS = trk.nHit();
137
138 if (fitResult.success()) {
139 int ifirst = 0;
140 for (int ihot = 0; ihot < NHITS ; ihot++) {
141
142 MdcHitOnTrack* ahot = (MdcHitOnTrack*)trk.hitAList()[ihot];
143 double firstTime = ahot->mdcHit()->rawTime(0);
144
145 // Get the list of times for this Digi
146 const MdcDigi* tmpDigi = ahot->mdcHit()->digi() ;
147// int nTDChits = tmpDigi->getTdcTimeAList()->length() ;
148 int nTDChits = tmpDigi->tmdcits() ;
149
150 double newTime=0. ;
151
152 for( int il = 1; il<nTDChits ; il++){
153
154 // get the time corresponding to this doca ---> distance to time
155 newTime = tmpDigi->TdcTime(il);
156 double newDrift = ahot->layer()->timeToDistance(newTime);
157
158 double tmp_doca = ahot->dcaToWire();
159 double new_diff = fabs(fabs(tmp_doca)-fabs(newDrift));
160 double tmp_drift = ahot->drift();
161 double tmp_drift2 =
162 ahot->layer()->timeToDistance(tmpDigi->TdcTime(0));
163 double old_diff = fabs(fabs(tmp_doca)-fabs(tmp_drift2));
164
165 if( ((old_diff-new_diff)>0.1) // new time better then old of at least 1 mm
166 && (new_diff<=0.8) ) { // and newresid < 2 mm
167 // if(_flags.debug) {
168 if(1) {
169
170 if(ifirst==0) {
171 ifirst = 1 ;
172 cout <<" nHits | time1 |fittim | time2 | doca(mm) | drift1 "
173 <<" drift1(rec) | drift2 | layer | wire | isActive"
174 << " | chi2 | nactive" << endl;
175 }
176
177 int isAct = 1 ;
178 if (!ahot->isActive()) {
179 isAct = 0 ;
180 // cout<< " >> " ;
181 // cout << "This hit is not active " << endl ;
182 }
183
184 cout << " " << nTDChits
185 << " " << tmpDigi->TdcTime(0)
186 << " " << ahot->fitTime()
187 << " " << newTime
188 << " " << tmp_doca*10
189 << " " << tmp_drift*10
190 << " " << tmp_drift2*10
191 << " " << newDrift*10
192 << " " << ahot->layer()->layNum()
193 << " " << ahot->wire()
194 << " " << isAct
195 << " " << trk.chisq()
196 << " " << trk.nActive()
197 << endl;
198
199 cout << " old/new diff (mm) = " << old_diff*10
200 << " | " << new_diff*10
201 << endl ;
202 }
203
204 ahot->setTimeIndex(il) ;
205 // cout << "new rawtime ="
206 // << ahot->mdcHit()->rawTime(0)<< endl ; // check the new value
207
208
209 // store results in ntuple to see improvements ... before ...
210 HepTuple* tupleMultHits = _manager->ntuple("multiHits");
211
212 tupleMultHits->column("ch2Dof1", trk.chisq()/(trk.nActive() - 4));
213 tupleMultHits->column("nActiv1", trk.nActive());
214 tupleMultHits->column("resid1",ahot->resid());
215 tupleMultHits->column("doca1",ahot->resid()+ahot->drift());
216 tupleMultHits->column("time1", ahot->fitTime() );
217 tupleMultHits->column("rawtime1", ahot->mdcHit()->rawTime(il) );
218
219 // - make the hit active and usable
220 ahot->setActivity(true);
221
222 // now refit the track ...
223 fitResult = trk.fit();
224
225 // store results in ntuple to see improvements ... after ...
226 tupleMultHits->column("ch2Dof2", trk.chisq()/(trk.nActive() - 4));
227 tupleMultHits->column("nActiv2", trk.nActive());
228 tupleMultHits->column("resid2",ahot->resid());
229 tupleMultHits->column("doca2",ahot->resid()+ahot->drift());
230 tupleMultHits->column("time2", ahot->fitTime() );
231 tupleMultHits->column("rawtime2", ahot->mdcHit()->rawTime(il) );
232 tupleMultHits->dumpData();
233 }
234 }
235 }
236 }
237 } // Are there some TDC that can be replaced with later measurements? (end)
238 */
239
240 const TrkFit* tkFit = trk.fitResult();
241 double chisqperDOF = 0.;
242 if ( fitResult.success() )
243 {
244 int nDOF = tkFit->nActive() - nParamFit;
245 if ( nDOF > nParamFit ) chisqperDOF = tkFit->chisq() / nDOF;
246 else chisqperDOF = tkFit->chisq();
247 int goodMatch = 1;
248 if ( chisqperDOF > tkParam.maxChisq ) goodMatch = 0;
249 if ( tkFit->nActive() < tkParam.minHits ) goodMatch = 0;
250
251 if ( goodMatch ) success = 1;
252 }
253
254 return success;
255}
256
257////--------------------------------------------------------------------
258// void MdcTrackListCsmc::setCosmic(TrkRecoTrk *recoTrk ) {
259////--------------------------------------------------------------------
260//
261//// get list of hot and set them to cosmics
262////----------------------------------------
263//// int ihot ;
264// TrkHitList* hitList = recoTrk->hits();
265// assert (hitList != 0);
266// for (int layer = 1; layer <= 16; layer++) {
267//// Look for hits in this layer
268// TrkHitList::hot_iterator end(hitList->end());
269// for ( TrkHitList::hot_iterator ihot(hitList->begin()) ; ihot != end; ++ihot) {
270// const MdcHitOnTrack* ahot = ihot->mdcHitOnTrack();
271//
272//// GS: setCosmic and setPM are not useful anymore since this info
273//// are now in MdcEnv and MdcHitOnTrack takes them from the MdcEnv
274//// ahot->setCosmic(true); // set cosmic flag
275//// ahot->setzPM(_flags.zPM); // set z Photo Multip. ProtoII
276//
277//} // loop over hits
278//}
279//}
void fillWithSegs(const MdcSegList *inSegs)
void fillWithSegs(const MdcSegList *inSegs, const MdcTrack *axialTrack)
int combineSegs(MdcTrack *&, MdcSeg *seed, TrkContext &, double trackT0, double maxSegChisqO, int combineByFitHits=0)
MdcSeg * getSeed(int iview, int goodOnly)
void resetSeed(const MdcDetector *gm)
MdcTrackListBase(const MdcTrackParams &tkPar)
MdcTrackListCsmc(const MdcTrackParams &tkPar)
int createFromSegs(MdcSegList *segs, const MdcHitMap *, const MdcDetector *, TrkContext &, double trackT0)
int finish3d(TrkRecoTrk &trk)
virtual double chisq() const =0
virtual int nActive() const =0
TrkErrCode fit()
const TrkFit * fitResult() const
virtual void printAll(std::ostream &) const
bool setFlipAndDrop(TrkRecoTrk &, bool allowFlips, bool allowDrops) const
virtual void changeFit(TrkRecoTrk &theTrack) const