Skip to content

Commit 3a29148

Browse files
authored
Add conventional tracking into ai-assisted tracking as complementary (#543)
* As supplementary, take conventional tracking with remaining cluters after AI-assisted tracking * add one more bit into track status to tell if track is from AI-asssisted tracking
1 parent 20d8d3f commit 3a29148

File tree

3 files changed

+192
-23
lines changed

3 files changed

+192
-23
lines changed

reconstruction/dc/src/main/java/org/jlab/rec/dc/track/Track.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public void setFinalStateVec(StateVec finalStateVec) {
6666
private Segment _singleSuperlayer ;
6767
private int _fitConvergenceStatus;
6868
private StateVec finalStateVec ;
69+
70+
private boolean isAITrack = false;
6971

7072
public Track() {
7173
}
@@ -98,6 +100,14 @@ public Segment getSingleSuperlayer() {
98100
public void setSingleSuperlayer(Segment _singleSuperlayer) {
99101
this._singleSuperlayer = _singleSuperlayer;
100102
}
103+
104+
public void setIsAITrack(boolean isAITrack){
105+
this.isAITrack = isAITrack;
106+
}
107+
108+
public boolean getIsAITrack(){
109+
return isAITrack;
110+
}
101111

102112
public int getBitStatus() {
103113
int status = 0;
@@ -119,6 +129,9 @@ public int getBitStatus() {
119129
for(int isl = 0; isl <6; isl++) {
120130
status |= segmentStatus[isl] << isl*2;
121131
}
132+
133+
status |= (this.isAITrack ? 1 : 0) << 12; // The 13th bit tells if track is from AI-assisted trcking; 1: yes; 0: no
134+
122135
return status;
123136
}
124137

reconstruction/dc/src/main/java/org/jlab/service/dc/DCHBPostClusterAI.java

Lines changed: 174 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.Collections;
55
import java.util.List;
6+
import java.util.Map;
67
import java.util.logging.Level;
78
import org.jlab.clas.swimtools.Swim;
89
import org.jlab.clas.swimtools.Swimmer;
@@ -20,6 +21,12 @@
2021
import org.jlab.rec.dc.segment.Segment;
2122
import org.jlab.rec.dc.track.Track;
2223
import 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(

reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ public boolean processDataEvent(DataEvent event) {
189189
trkbank.getFloat("tx", i), trkbank.getFloat("ty", i));
190190
HBFinalSV.setZ(trkbank.getFloat("z", i));
191191
HBtrk.setFinalStateVec(HBFinalSV);
192+
193+
int status = trkbank.getShort("status", i);
194+
int isAITrack = (status >> 12) & 1;
195+
HBtrk.setIsAITrack((isAITrack == 1));
196+
192197
TrackArray[HBtrk.get_Id()-1] = HBtrk;
193198
// TrackArray[HBtrk.get_Id()-1].set_Status(0);
194199
}

0 commit comments

Comments
 (0)