hps-java/src/main/java/org/lcsim/hps/users/phansson
diff -u -r1.15 -r1.16
--- TwoTrackAnlysis.java 16 Apr 2013 22:06:21 -0000 1.15
+++ TwoTrackAnlysis.java 20 Apr 2013 04:00:25 -0000 1.16
@@ -76,7 +76,9 @@
}
@Override
public int compareTo(CmpTrack t) {
- return _track.getTrackStates().get(0).getMomentum()[0]>t._track.getTrackStates().get(0).getMomentum()[0]?0:1;
+ int v = ((Double)(t._track.getTrackStates().get(0).getMomentum()[0]*100000 - _track.getTrackStates().get(0).getMomentum()[0]*100000)).intValue();
+ //System.out.printf("%s: _track = %f _t = %f => %d \n",this.getClass().getSimpleName(),_track.getTrackStates().get(0).getMomentum()[0],t._track.getTrackStates().get(0).getMomentum()[0],v);
+ return v;
}
}
@@ -156,16 +158,15 @@
// return;
//}
- TrackUtils trkutil = new TrackUtils();
ArrayList<CmpTrack> tracks = new ArrayList<CmpTrack>();
for(int i=0;i<tracklist.size();++i) {
Track trk = tracklist.get(i);
+ if(TrackUtils.passTrackSelection(trk, tracklist, EventQuality.Quality.MEDIUM)) {
if(_debug)
System.out.printf("%s: trk momentum (%.3f,%.3f,%.3f) chi2=%.3f\n",this.getClass().getSimpleName(),trk.getTrackStates().get(0).getMomentum()[0],trk.getTrackStates().get(0).getMomentum()[1],trk.getTrackStates().get(0).getMomentum()[2],trk.getChi2());
- if(trk.getTrackStates().get(0).getMomentum()[0]>0.) {
tracks.add(new CmpTrack(trk));
} else {
- if(_debug) System.out.println(this.getClass().getSimpleName() + ": trk failed momentum cut " + event.getEventNumber() + "\n" + trk.toString());
+ if(_debug) System.out.println(this.getClass().getSimpleName() + ": trk failed track selections " + event.getEventNumber() + "\n" + trk.toString());
}
}
@@ -176,7 +177,10 @@
for(CmpTrack trk:tracks) {
if(trk_prev!=null) {
if(trk_prev._track.getTrackStates().get(0).getMomentum()[0]<trk._track.getTrackStates().get(0).getMomentum()[0]) {
- throw new RuntimeException(String.format("%s: ERROR prev px=%f trk=%f",this.getClass().getSimpleName(),trk_prev._track.getTrackStates().get(0).getMomentum()[0],trk._track.getTrackStates().get(0).getMomentum()[0]));
+ //throw new RuntimeException(String.format("%s: ERROR prev px=%f trk=%f",this.getClass().getSimpleName(),trk_prev._track.getTrackStates().get(0).getMomentum()[0],trk._track.getTrackStates().get(0).getMomentum()[0]));
+ System.out.printf("%s\n",String.format("%s: ERROR prev px=%f trk=%f",this.getClass().getSimpleName(),trk_prev._track.getTrackStates().get(0).getMomentum()[0],trk._track.getTrackStates().get(0).getMomentum()[0]));
+ } else {
+ System.out.printf("%s\n",String.format("%s: OK prev px=%f trk=%f",this.getClass().getSimpleName(),trk_prev._track.getTrackStates().get(0).getMomentum()[0],trk._track.getTrackStates().get(0).getMomentum()[0]));
}
}
trk_prev = trk;
@@ -599,7 +603,7 @@
private TriggerData getTriggerInfo(EventHeader event) {
if(!event.hasCollection(TriggerData.class, triggerDecisionCollectionName)) {
if(_debug)
- System.out.printf( "%s: Event %d has NO trigger bank\n",this.getClass().getSimpleName());
+ System.out.printf( "%s: Event %d has NO trigger bank\n",this.getClass().getSimpleName(),event.getEventNumber());
return null;
} else {
List<TriggerData> triggerDataList = event.get(TriggerData.class, "TriggerBank");
@@ -621,7 +625,9 @@
for(TrackerHit hit : hits) {
HelicalTrackHit hth = (HelicalTrackHit) hit;
HelicalTrackCross htc = (HelicalTrackCross) hth;
- htc.setTrackDirection(helix);
+ //System.out.printf("%s: getHitMap: hth position before trkdir: (%.3f,%.3f,%.3f)\n",this.getClass().getSimpleName(),hth.x(),hth.y(),hth.z());
+ //htc.setTrackDirection(helix);
+ //System.out.printf("%s: getHitMap: hth position after trkdir: (%.3f,%.3f,%.3f)\n",this.getClass().getSimpleName(),hth.x(),hth.y(),hth.z());
map.put(hth.Layer(), hth);
}
return map;
hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.16 -r1.17
--- TrackUtils.java 13 Feb 2013 18:20:54 -0000 1.16
+++ TrackUtils.java 20 Apr 2013 04:00:25 -0000 1.17
@@ -19,6 +19,7 @@
//--- org.lcsim ---//
import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
import org.lcsim.fit.helicaltrack.*;
import org.lcsim.hps.users.phansson.WTrack;
import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
@@ -27,7 +28,7 @@
/**
*
* @author Omar Moreno <[log in to unmask]>
- * @version $Id: TrackUtils.java,v 1.16 2013/02/13 18:20:54 phansson Exp $
+ * @version $Id: TrackUtils.java,v 1.17 2013/04/20 04:00:25 phansson Exp $
* TODO: Switch to JLab coordinates
*/
@@ -37,7 +38,7 @@
private boolean isTrackSet = false;
private double[] trackParameters;
-
+
/**
*
*/
@@ -405,6 +406,8 @@
}
public static Map<String,Double> calculateTrackHitResidual(HelicalTrackHit hth,HelicalTrackFit track, boolean includeMS ) {
+
+ boolean debug = false;
Map<String,Double> residuals = new HashMap<String,Double>();
Map<HelicalTrackHit, MultipleScatter> msmap = track.ScatterMap();
@@ -464,9 +467,14 @@
residuals.put("dz_res",Math.sqrt(dz_res2));
residuals.put("msdz",msdz);
- //System.out.printf("calculateTrackHitResidual: for hit (%f,%f,%f) on helix at s=%f with chi2=%f \n",hth.x(),hth.y(),hth.z(),s,track.chisqtot(),track.chisqtot());
- //System.out.printf("calculateTrackHitResidual: resy=%f eresy=%f drphi=%f msdrphi=%f \n",resy,erry,drphi_res,msdrphi);
- //System.out.printf("calculateTrackHitResidual: resz=%f eresz=%f dz_res=%f msdz=%f \n",resz,dz_res,Math.sqrt(dz_res2),msdz);
+
+ if(debug) {
+ System.out.printf("calculateTrackHitResidual: HTH hit at (%f,%f,%f)\n",hth.x(),hth.y(),hth.z());
+ System.out.printf("calculateTrackHitResidual: helix params d0=%f phi0=%f R=%f z0=%f slope=%f chi2=%f/%f chi2tot=%f\n",track.dca(),track.phi0(),track.R(),track.z0(),track.slope(),track.chisq()[0],track.chisq()[1],track.chisqtot());
+ System.out.printf("calculateTrackHitResidual: => resz=%f resy=%f at s=%f\n",resz,resy,s);
+ //System.out.printf("calculateTrackHitResidual: resy=%f eresy=%f drphi=%f msdrphi=%f \n",resy,erry,drphi_res,msdrphi);
+ //System.out.printf("calculateTrackHitResidual: resz=%f eresz=%f dz_res=%f msdz=%f \n",resz,dz_res,Math.sqrt(dz_res2),msdz);
+ }
return residuals;
@@ -554,6 +562,114 @@
return res;
}
+
+
+ public static int[] getHitsInTopBottom(Track track) {
+ int n[] = {0,0};
+ List<TrackerHit> hitsOnTrack = track.getTrackerHits();
+ for(TrackerHit hit : hitsOnTrack) {
+ HelicalTrackHit hth = (HelicalTrackHit) hit;
+ if(SvtUtils.getInstance().isTopLayer((SiSensor)((RawTrackerHit)hth.getRawHits().get(0)).getDetectorElement())) {
+ n[0] = n[0] + 1;
+ } else {
+ n[1] = n[1] + 1;
+ }
+ }
+ return n;
+ }
+
+ public static boolean isTopTrack(Track track,int minhits) {
+ return isTopOrBottomTrack(track,minhits)==1?true:false;
+ }
+
+ public static boolean isBottomTrack(Track track,int minhits) {
+ return isTopOrBottomTrack(track,minhits)==0?true:false;
+ }
+
+ public static int isTopOrBottomTrack(Track track,int minhits) {
+ int nhits[] = getHitsInTopBottom(track);
+ if (nhits[0]>=minhits && nhits[1]==0) {
+ return 1;
+ } else if (nhits[1]>=minhits && nhits[0]==0) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+
+ public static boolean hasTopBotHit(Track track) {
+ int nhits[] = getHitsInTopBottom(track);
+ if (nhits[0]>0 && nhits[1]>0) return true;
+ else return false;
+ }
+
+ public static boolean isSharedHit(TrackerHit hit, List<Track> othertracks) {
+ HelicalTrackHit hth = (HelicalTrackHit) hit;
+ for(Track track : othertracks) {
+ List<TrackerHit> hitsOnTrack = track.getTrackerHits();
+ boolean shared = false;
+ for(TrackerHit loop_hit : hitsOnTrack) {
+ HelicalTrackHit loop_hth = (HelicalTrackHit) loop_hit;
+ if(hth.equals(loop_hth)) {
+ //System.out.printf("share hit at layer %d at %s (%s) with track w/ chi2=%f\n",hth.Layer(),hth.getCorrectedPosition().toString(),loop_hth.getCorrectedPosition().toString(),track.getChi2());
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static int numberOfSharedHits(Track track, List<Track> tracklist) {
+ List<Track> tracks = new ArrayList<>();
+ //System.out.printf("%d tracks in event\n",tracklist.size());
+ //System.out.printf("look for another track with chi2=%f and px=%f \n",track.getChi2(),track.getTrackStates().get(0).getMomentum()[0]);
+ for(Track t: tracklist) {
+ //System.out.printf("add track with chi2=%f and px=%f ?\n",t.getChi2(),t.getTrackStates().get(0).getMomentum()[0]);
+ if(t.equals(track)) {
+ //System.out.printf("NOPE\n");
+ continue;
+ }
+ //System.out.printf("YEPP\n");
+ tracks.add(t);
+ }
+ List<TrackerHit> hitsOnTrack = track.getTrackerHits();
+ int n_shared = 0;
+ for(TrackerHit hit : hitsOnTrack) {
+ if (isSharedHit(hit,tracks)) {
+ ++n_shared;
+ }
+ }
+ return n_shared;
+ }
+
+ public static boolean hasSharedHits(Track track,List<Track> tracklist) {
+ return numberOfSharedHits( track, tracklist)==0?false:true;
+ }
+
+ public static void cut(int cuts[],EventQuality.Cut bit) {
+ cuts[0] = cuts[0] | (1 << bit.getValue());
+ }
+
+
+ public static boolean passTrackSelection(Track track, List<Track> tracklist, EventQuality.Quality trk_quality) {
+ int cuts[] = {0};
+ if(track.getTrackStates().get(0).getMomentum()[0] < EventQuality.instance().getCutValue(EventQuality.Cut.PZ, trk_quality))
+ cut(cuts,EventQuality.Cut.PZ);
+ if(track.getTrackStates().get(0).getMomentum()[0]>= EventQuality.instance().getCutValue(EventQuality.Cut.CHI2, trk_quality))
+ cut(cuts,EventQuality.Cut.CHI2);
+ if(numberOfSharedHits(track,tracklist) > ((int)Math.round(EventQuality.instance().getCutValue(EventQuality.Cut.SHAREDHIT, trk_quality))))
+ cut(cuts,EventQuality.Cut.SHAREDHIT);
+ if(hasTopBotHit(track))
+ cut(cuts,EventQuality.Cut.TOPBOTHIT);
+ if(track.getTrackerHits().size()< ((int)Math.round(EventQuality.instance().getCutValue(EventQuality.Cut.NHITS, trk_quality))))
+ cut(cuts,EventQuality.Cut.NHITS);
+
+
+ //System.out.printf("pz=%f chi2=%f nsh=%d nhits=%d topbot=%d => %s\n%s",track.getTrackStates().get(0).getMomentum()[0],track.getChi2(),numberOfSharedHits(track,tracklist),track.getTrackerHits().size(),hasTopBotHit(track)?1:0,Integer.toBinaryString(cuts[0]),EventQuality.instance().print(cuts[0]));
+
+
+ return cuts[0]==0?true:false;
+ }
}