33import java .util .ArrayList ;
44import java .util .Collections ;
55import java .util .List ;
6+ import java .util .Map ;
67import java .util .logging .Level ;
78import org .jlab .clas .swimtools .Swim ;
89import org .jlab .clas .swimtools .Swimmer ;
2021import org .jlab .rec .dc .segment .Segment ;
2122import org .jlab .rec .dc .track .Track ;
2223import org .jlab .rec .dc .track .TrackCandListFinder ;
24+ import org .jlab .rec .dc .cluster .ClusterFinder ;
25+ import org .jlab .rec .dc .cluster .ClusterFitter ;
26+ import org .jlab .rec .dc .segment .SegmentFinder ;
27+ import org .jlab .rec .dc .cross .CrossMaker ;
28+ import org .jlab .rec .dc .trajectory .Road ;
29+ import org .jlab .rec .dc .trajectory .RoadFinder ;
2330
2431/**
2532 *
@@ -52,18 +59,15 @@ public boolean processDataEvent(DataEvent event) {
5259 return true ;
5360 }
5461
62+ ////// AI-assisted tracking
5563 /* IO */
5664 HitReader reader = new HitReader (this .getBanks (), Constants .getInstance ().dcDetector );
5765 reader .initialize (event );
5866 RecoBankWriter writer = new RecoBankWriter (this .getBanks ());
5967 // get Field
6068 Swim dcSwim = new Swim ();
61- /* 2 */
62-
63- /* 5 */
6469 LOGGER .log (Level .FINE , "HB AI process event" );
65- /* 7 */
66- /* 8 */
70+
6771 //AI
6872 List <Track > trkcands = null ;
6973 List <Cross > crosses = null ;
@@ -77,7 +81,7 @@ public boolean processDataEvent(DataEvent event) {
7781 List <Hit > hits = reader .get_DCHits ();
7882 fhits = new ArrayList <>();
7983 //II) process the hits
80- //1) exit if hit list is empty
84+ // Exit if hit list is empty
8185 if (hits .isEmpty ()) {
8286 return true ;
8387 }
@@ -128,35 +132,182 @@ public boolean processDataEvent(DataEvent event) {
128132 // remove overlaps
129133 trkcandFinder .removeOverlappingTracks (trkcands );
130134 for (Track trk : trkcands ) {
135+ trk .setIsAITrack (true );
136+
131137 // reset the id
132138 trk .set_Id (trkId );
133139 trkcandFinder .matchHits (trk .getStateVecs (),
134140 trk ,
135141 Constants .getInstance ().dcDetector ,
136142 dcSwim );
137- for (Cross c : trk ) {
138- c .set_CrossDirIntersSegWires ();
139- clusters .add (c .get_Segment1 ().get_fittedCluster ());
140- clusters .add (c .get_Segment2 ().get_fittedCluster ());
141- trkcandFinder .setHitDoubletsInfo (c .get_Segment1 ());
142- trkcandFinder .setHitDoubletsInfo (c .get_Segment2 ());
143- for (FittedHit h1 : c .get_Segment1 ()) {
144- h1 .set_AssociatedHBTrackID (trkId );
145- //if(h1.get_AssociatedHBTrackID()>0)
146- fhits .add (h1 );
143+ trkId ++;
144+ }
145+ }
146+
147+ ////// Find tracks by rest of clusters using conventional tracking
148+ List <FittedCluster > clustersConv = null ;
149+ List <Segment > segmentsConv = null ;
150+ List <Cross > crossesConv = null ;
151+ List <Track > trkcandsConv = null ;
152+
153+ //1) read hits from the banks
154+ Map <Integer , ArrayList <FittedHit >> hitsConv = reader .read_Hits (event );
155+
156+ //2) find clusters from these hits
157+ ClusterFinder clusFinder = new ClusterFinder ();
158+ ClusterFitter cf = new ClusterFitter ();
159+ clustersConv = clusFinder .RecomposeClusters (hitsConv , Constants .getInstance ().dcDetector , cf );
160+
161+ //3) remove clusters which are on tracks
162+ List <FittedCluster > removedClustersConv = new ArrayList ();
163+ for (FittedCluster cls : clustersConv ){
164+ boolean flag = false ;
165+ for (Track trk : trkcands ){
166+ if (flag ) break ;
167+ for (Cross crs : trk ){
168+ if (cls .get_Id () == crs .get_Segment1 ().get_Id () || cls .get_Id () == crs .get_Segment2 ().get_Id ()) {
169+ removedClustersConv .add (cls );
170+ flag = true ;
171+ break ;
172+ }
173+ }
174+ }
175+ }
176+ clustersConv .removeAll (removedClustersConv );
177+ clusters .addAll (clustersConv );
178+
179+ //4) find segments from clusters
180+ SegmentFinder segFinder = new SegmentFinder ();
181+ segmentsConv = segFinder .get_Segments (clustersConv ,
182+ event ,
183+ Constants .getInstance ().dcDetector , false );
184+ List <Segment > rmSegsConv = new ArrayList <>();
185+ // clean up hit-based segments
186+ double trkDocOverCellSize ;
187+ for (Segment se : segmentsConv ) {
188+ trkDocOverCellSize = 0 ;
189+ for (FittedHit fh : se .get_fittedCluster ()) {
190+ trkDocOverCellSize += fh .get_ClusFitDoca () / fh .get_CellSize ();
191+ }
192+ if (trkDocOverCellSize / se .size () > 1.1 ) {
193+ rmSegsConv .add (se );
194+ }
195+ }
196+ segmentsConv .removeAll (rmSegsConv );
197+ segments .addAll (segmentsConv );
198+
199+ //5) find crosses from segments
200+ CrossMaker crossMake = new CrossMaker ();
201+ crossesConv = crossMake .find_Crosses (segmentsConv , Constants .getInstance ().dcDetector );
202+ crosses .addAll (crossesConv );
203+
204+ //6) find cross lists from crosses
205+ CrossList crosslistConv = crossLister .candCrossLists (event , crossesConv ,
206+ false ,
207+ null ,
208+ Constants .getInstance ().dcDetector ,
209+ null ,
210+ dcSwim , false );
211+
212+ //7) find track candidates with 5 or 6 clusters
213+ // track candidates with 6 clusters
214+ trkcandsConv = trkcandFinder .getTrackCands (crosslistConv ,
215+ Constants .getInstance ().dcDetector ,
216+ Swimmer .getTorScale (),
217+ dcSwim , false );
218+
219+ // track candidates with 5 clusters
220+ RoadFinder rf = new RoadFinder ();
221+ List <Road > allRoadsConv = rf .findRoads (segmentsConv , Constants .getInstance ().dcDetector );
222+ List <Segment > Segs2RoadConv = new ArrayList <>();
223+ List <Segment > psegmentsConv = new ArrayList <>();
224+ for (Road r : allRoadsConv ) {
225+ Segs2RoadConv .clear ();
226+ int missingSL = -1 ;
227+ for (int ri = 0 ; ri < 3 ; ri ++) {
228+ if (r .get (ri ).associatedCrossId == -1 ) {
229+ if (r .get (ri ).get_Superlayer () % 2 == 1 ) {
230+ missingSL = r .get (ri ).get_Superlayer () + 1 ;
231+ } else {
232+ missingSL = r .get (ri ).get_Superlayer () - 1 ;
147233 }
148- for (FittedHit h2 : c .get_Segment2 ()) {
149- h2 .set_AssociatedHBTrackID (trkId );
150- //if(h2.get_AssociatedHBTrackID()>0)
151- fhits .add (h2 );
234+ }
235+ }
236+ if (missingSL ==-1 )
237+ continue ;
238+ for (int ri = 0 ; ri < 3 ; ri ++) {
239+ for (Segment s : segmentsConv ) {
240+ if (s .get_Sector () == r .get (ri ).get_Sector () &&
241+ s .get_Region () == r .get (ri ).get_Region () &&
242+ s .associatedCrossId == r .get (ri ).associatedCrossId &&
243+ r .get (ri ).associatedCrossId != -1 ) {
244+ if (s .get_Superlayer () % 2 == missingSL % 2 )
245+ Segs2RoadConv .add (s );
152246 }
153247 }
154- trk .calcTrajectory (trk .getId (), dcSwim , trk .get_Vtx0 (), trk .get_pAtOrig (), trk .get_Q ());
155- trkId ++;
248+ }
249+ if (Segs2RoadConv .size () == 2 ) {
250+ Segment pSegmentConv = rf .findRoadMissingSegment (Segs2RoadConv ,
251+ Constants .getInstance ().dcDetector ,
252+ r .a );
253+ if (pSegmentConv != null )
254+ psegmentsConv .add (pSegmentConv );
156255 }
157256 }
257+
258+ segmentsConv .addAll (psegmentsConv );
259+ List <Cross > pcrossesConv = crossMake .find_Crosses (segmentsConv , Constants .getInstance ().dcDetector );
260+ CrossList pcrosslistConv = crossLister .candCrossLists (event , pcrossesConv ,
261+ false ,
262+ null ,
263+ Constants .getInstance ().dcDetector ,
264+ null ,
265+ dcSwim , true );
266+ List <Track > mistrkcandsConv = trkcandFinder .getTrackCands (pcrosslistConv ,
267+ Constants .getInstance ().dcDetector ,
268+ Swimmer .getTorScale (),
269+ dcSwim , false );
158270
159- // no candidate found, stop here and save the hits,
271+ //8) Select overlapping tracks from all track candidates with 5 or 6 clusters, and update hits in tracks
272+ trkcandsConv .addAll (mistrkcandsConv );
273+ if (!trkcandsConv .isEmpty ()) {
274+ // remove overlaps
275+ trkcandFinder .removeOverlappingTracks (trkcandsConv );
276+ for (Track trk : trkcandsConv ) {
277+ // reset the id
278+ trk .set_Id (trkId );
279+ trkcandFinder .matchHits (trk .getStateVecs (),
280+ trk ,
281+ Constants .getInstance ().dcDetector ,
282+ dcSwim );
283+ trkId ++;
284+ }
285+ }
286+
287+ //////gather all the hits for pointer bank creation
288+ trkcands .addAll (trkcandsConv );
289+ trkId =1 ;
290+ for (Track trk : trkcands ) {
291+ trk .calcTrajectory (trk .getId (), dcSwim , trk .get_Vtx0 (), trk .get_pAtOrig (), trk .get_Q ());
292+ for (Cross c : trk ) {
293+ c .set_CrossDirIntersSegWires ();
294+ trkcandFinder .setHitDoubletsInfo (c .get_Segment1 ());
295+ trkcandFinder .setHitDoubletsInfo (c .get_Segment2 ());
296+ for (FittedHit h1 : c .get_Segment1 ()) {
297+ h1 .set_AssociatedHBTrackID (trkId );
298+ //if(h1.get_AssociatedHBTrackID()>0)
299+ fhits .add (h1 );
300+ }
301+ for (FittedHit h2 : c .get_Segment2 ()) {
302+ h2 .set_AssociatedHBTrackID (trkId );
303+ //if(h2.get_AssociatedHBTrackID()>0)
304+ fhits .add (h2 );
305+ }
306+ }
307+ trkId ++;
308+ }
309+
310+ // no candidate found, stop here and save the hits,
160311 // the clusters, the segments, the crosses
161312 if (trkcands .isEmpty ()) {
162313 event .appendBanks (
0 commit comments