hps-java/src/main/java/org/lcsim/hps/users/phansson
diff -u -r1.1 -r1.2
--- TwoTrackAnlysis.java 22 Dec 2012 20:53:33 -0000 1.1
+++ TwoTrackAnlysis.java 8 Jan 2013 00:37:47 -0000 1.2
@@ -9,15 +9,20 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lcsim.event.EventHeader;
import org.lcsim.event.MCParticle;
import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
import org.lcsim.event.util.ParticleTypeClassifier;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
import org.lcsim.geometry.Detector;
import org.lcsim.hps.analysis.ecal.HPSMCParticlePlotsDriver;
+import org.lcsim.hps.recon.ecal.HPSEcalCluster;
import org.lcsim.hps.recon.tracking.SvtTrackExtrapolator;
import org.lcsim.hps.recon.vertexing.SimpleVertexer;
import org.lcsim.hps.recon.vertexing.TwoParticleVertexer;
@@ -42,11 +47,13 @@
private int totalTwoTrackMCEvents=0;
private boolean hideFrame = false;
private String outputPlotFileName;
+ private String ecalClusterCollectionName = "EcalClusters";
private boolean _debug;
private TwoTrackVertexer vertexer = new TwoTrackVertexer();
private TwoParticleVertexer particleVertexer = new TwoParticleVertexer();
private IPlotter _plotterParticleVertex;
private IPlotter _plotterTrackVertex;
+ private IPlotter _plotterNhits;
private IHistogram2D _vtxpos_xy;
private IHistogram1D _vtxpos_x;
private IHistogram1D _vtxpos_y;
@@ -55,6 +62,13 @@
private IHistogram1D _partvtxpos_x;
private IHistogram1D _partvtxpos_y;
private IHistogram1D _partvtxpos_z;
+ private IHistogram1D _nhits;
+ private IHistogram1D _nhits_vtxpospos;
+ private IHistogram1D _nhits_vtxposneg;
+ private IHistogram1D _layershit;
+ private IHistogram1D _layershit_vtxpospos;
+ private IHistogram1D _layershit_vtxposneg;
+
public void setDebug(boolean v) {
@@ -106,6 +120,33 @@
}
}
+
+ if(tracklist.size()!=2) {
+ return;
+ }
+
+
+ Track trk1 = tracklist.get(0);
+ Track trk2 = tracklist.get(1);
+ List<TrackerHit> hitsOnTrack1 = trk1.getTrackerHits();
+ List<TrackerHit> hitsOnTrack2 = trk2.getTrackerHits();
+
+ this.vertexer.setTracks(trk1, trk2);
+ Hep3Vector vtxPos = this.vertexer.getVertex();
+ if(this._debug) System.out.printf("%s: vtxPos=%s\n", this.getClass().getSimpleName(),vtxPos.toString());
+ if(vtxPos.x() != vtxPos.x()) {
+ System.out.printf("%s: vtxPos is NaN -> Skip\n",this.getClass().getSimpleName());
+ return;
+ }
+
+
+
+
+
+ List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, ecalClusterCollectionName);
+
+
+
Hep3Vector vtxPosMC = null;
MCParticle electron=null;
MCParticle positron=null;
@@ -148,23 +189,42 @@
}
- if(tracklist.size()!=2) {
- return;
- }
- Track trk1 = tracklist.get(0);
- Track trk2 = tracklist.get(1);
-
- this.vertexer.setTracks(trk1, trk2);
- Hep3Vector vtxPos = this.vertexer.getVertex();
- if(this._debug) System.out.printf("%s: vtxPos=%s\n", this.getClass().getSimpleName(),vtxPos.toString());
+
this._vtxpos_xy.fill(vtxPos.x(), vtxPos.y());
this._vtxpos_x.fill(vtxPos.x());
this._vtxpos_y.fill(vtxPos.y());
this._vtxpos_z.fill(vtxPos.z());
+ this._nhits.fill(hitsOnTrack1.size());
+ this._nhits.fill(hitsOnTrack2.size());
+ if(vtxPos.x()<-350.0) {
+ this._nhits_vtxposneg.fill(hitsOnTrack1.size());
+ this._nhits_vtxposneg.fill(hitsOnTrack2.size());
+ } else {
+ this._nhits_vtxpospos.fill(hitsOnTrack1.size());
+ this._nhits_vtxpospos.fill(hitsOnTrack2.size());
+ }
+ for(TrackerHit hit : hitsOnTrack1) {
+ HelicalTrackHit hth = (HelicalTrackHit) hit;
+ int l = (hth.Layer()+1)/2;
+ this._layershit.fill(l);
+ if(vtxPos.x()<-350.0) this._layershit_vtxposneg.fill(l);
+ else this._layershit_vtxpospos.fill(l);
+ }
+
+
+
+// for(HPSEcalCluster cl : clusters) {
+// int[] clusterPosIdx = new int[2];
+// clusterPosIdx[0] = cl.getSeedHit().getIdentifierFieldValue("ix");
+// clusterPosIdx[1] = cl.getSeedHit().getIdentifierFieldValue("iy");
+// }
+
+
+
totalTwoTrackEvents++;
- this.fillTextTuple(electron, positron, trk1, trk2, vtxPosMC, vtxPos, event);
+ this.fillTextTuple(electron, positron, trk1, trk2, vtxPosMC, vtxPos, clusters, event);
@@ -210,6 +270,14 @@
_partvtxpos_y = aida.histogram1D("Particle Vertex position Y", 100, -200, 200);
_partvtxpos_z = aida.histogram1D("Particle Vertex position Z", 100, -200, 200);
_partvtxpos_xy = aida.histogram2D("Particle Vertex position Y vs X", 50, -200, 200, 50, -200, 200);
+ _nhits = aida.histogram1D("# hits", 3, 4, 7);
+ _nhits_vtxpospos = aida.histogram1D("# hits for pos vtx", 3, 4, 7);
+ _nhits_vtxposneg = aida.histogram1D("# hits for neg vtx", 3, 4, 7);
+ _layershit = aida.histogram1D("Layers hit", 5, 1, 6);
+ _layershit_vtxpospos = aida.histogram1D("Layers hit pos vtx", 5, 1, 6);
+ _layershit_vtxposneg = aida.histogram1D("Layers hit neg vtx", 5, 1, 6);
+
+
_plotterTrackVertex = aida.analysisFactory().createPlotterFactory().create();
_plotterTrackVertex.createRegions(2,2);
_plotterTrackVertex.region(0).plot(_vtxpos_x);
@@ -226,10 +294,20 @@
_plotterParticleVertex.region(3).plot(_partvtxpos_xy);
_plotterParticleVertex.region(3).style().setParameter("hist2DStyle", "colorMap");
_plotterParticleVertex.region(3).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ _plotterNhits = aida.analysisFactory().createPlotterFactory().create();
+ _plotterNhits.createRegions(1,2);
+ _plotterNhits.region(0).plot(_nhits);
+ _plotterNhits.region(0).plot(this._nhits_vtxposneg,"mode=overlay");
+ _plotterNhits.region(0).plot(this._nhits_vtxpospos,"mode=overlay");
+ _plotterNhits.region(0).style().dataStyle().fillStyle().setVisible(false);
+ _plotterNhits.region(1).plot(this._layershit);
+ _plotterNhits.region(1).plot(this._layershit_vtxposneg,"mode=overlay");
+ _plotterNhits.region(1).plot(this._layershit_vtxpospos,"mode=overlay");
+ _plotterNhits.region(1).style().dataStyle().fillStyle().setVisible(false);
_plotterParticleVertex.setTitle("MC particle Vertex");
_plotterTrackVertex.setTitle("Two Track Vertex");
-
+ _plotterNhits.setTitle("Hits on track");
for(int i=0;i<3;++i) {
((PlotterRegion) _plotterParticleVertex.region(i)).getPlot().setAllowUserInteraction(true);
@@ -242,6 +320,7 @@
if(!this.hideFrame) {
this._plotterParticleVertex.show();
this._plotterTrackVertex.show();
+ this._plotterNhits.show();
}
}
@@ -251,17 +330,20 @@
return f.length() == 0; //return zero also in case file doesn't exist
}
- private void fillTextTuple(MCParticle e, MCParticle p, Track trk1, Track trk2, Hep3Vector vtxPosParticle, Hep3Vector vtxPos, EventHeader event) {
+ private void fillTextTuple(MCParticle e, MCParticle p, Track trk1, Track trk2, Hep3Vector vtxPosParticle, Hep3Vector vtxPos,List<HPSEcalCluster> clusters, EventHeader event) {
if(doPrintBranchInfoLine) {
String br_line = "";
br_line+="evtnr/I:";
br_line+="e_px/F:e_py/F:e_pz/F:p_px/F:p_py/F:p_pz/F:";
- br_line+="trk1_q/I:trk1_chi2/F:trk1_px/F:trk1_py/F:trk1_pz/F:";
- br_line+="trk2_q/I:trk2_chi2/F:trk2_px/F:trk2_py/F:trk2_pz/F:";
+ br_line+="trk1_q/I:trk1_chi2/F:trk1_px/F:trk1_py/F:trk1_pz/F:trk1_nhits/I:";
+ for(int iLayer=1;iLayer<=5;++iLayer) br_line+="trk1_hit"+iLayer+"_x/F:"+"trk1_hit"+iLayer+"_y/F:"+"trk1_hit"+iLayer+"_z/F:";
+ br_line+="trk2_q/I:trk2_chi2/F:trk2_px/F:trk2_py/F:trk2_pz/F:trk2_nhits/I:";
+ for(int iLayer=1;iLayer<=5;++iLayer) br_line+="trk2_hit"+iLayer+"_x/F:"+"trk2_hit"+iLayer+"_y/F:"+"trk2_hit"+iLayer+"_z/F:";
br_line+="vtx_truth_x/F:vtx_truth_y/F:vtx_truth_z/F:";
br_line+="vtx_x/F:vtx_y/F:vtx_z/F:";
br_line+="trk1_conv_x/F:trk1_conv_y/F:trk1_conv_z/F:";
- br_line+="trk2_conv_x/F:trk2_conv_y/F:trk2_conv_z/F";
+ br_line+="trk2_conv_x/F:trk2_conv_y/F:trk2_conv_z/F:";
+ br_line+="ncl_top/I:ncl_bot/I";
printWriter.println(br_line);
doPrintBranchInfoLine = false;
}
@@ -271,10 +353,29 @@
//Truth
if(e!=null && p!=null) printWriter.format("%5.5f %5.5f %5.5f %5.5f %5.5f %5.5f ", e.getPX(),e.getPY(),e.getPZ(), p.getPX(),p.getPY(),p.getPZ() );
else printWriter.format("%5.5f %5.5f %5.5f %5.5f %5.5f %5.5f ", -9999999., -9999999., -9999999., -9999999., -9999999., -9999999. );
- System.out.printf("%s: fill txt tuple 0.1\n",this.getClass().getName());
//Track properties
- printWriter.format("%5d %5.5f %5.5f %5.5f %5.5f ",trk1.getCharge(),trk1.getChi2(), trk1.getTrackStates().get(0).getMomentum()[0],trk1.getTrackStates().get(0).getMomentum()[1],trk1.getTrackStates().get(0).getMomentum()[2]);
- printWriter.format("%5d %5.5f %5.5f %5.5f %5.5f ",trk2.getCharge(),trk2.getChi2(), trk2.getTrackStates().get(0).getMomentum()[0],trk2.getTrackStates().get(0).getMomentum()[1],trk2.getTrackStates().get(0).getMomentum()[2]);
+ List<TrackerHit> hitsOnTrack1 = trk1.getTrackerHits();
+ printWriter.format("%5d %5.5f %5.5f %5.5f %5.5f %5d ",trk1.getCharge(),trk1.getChi2(), trk1.getTrackStates().get(0).getMomentum()[0],trk1.getTrackStates().get(0).getMomentum()[1],trk1.getTrackStates().get(0).getMomentum()[2],hitsOnTrack1.size());
+ HashMap<Integer,HelicalTrackHit> hits1 = this.getHitMap(hitsOnTrack1);
+ for(TrackerHit hit : hitsOnTrack1) {
+ HelicalTrackHit hth = (HelicalTrackHit) hit;
+ hits1.put(hth.Layer(), hth);
+ System.out.println("hit on layer " + hth.Layer());
+ }
+ // stupid but I want to keep one line per event so default in case there is not hits in all layers
+ for(int iLayer=0;iLayer<5;++iLayer) {
+ HelicalTrackHit hitOnLayer = hits1.get(iLayer*2+1);// = this.getHitOnLayer(iLayer, hitsOnTrack);
+ if (hitOnLayer != null) printWriter.format("%5.5f %5.5f %5.5f ", hitOnLayer.getPosition()[0],hitOnLayer.getPosition()[1],hitOnLayer.getPosition()[2]);
+ else printWriter.format("%5.5f %5.5f %5.5f ", -9999999.9, -9999999.9, -9999999.9);
+ }
+ List<TrackerHit> hitsOnTrack2 = trk2.getTrackerHits();
+ printWriter.format("%5d %5.5f %5.5f %5.5f %5.5f %5d ",trk2.getCharge(),trk2.getChi2(), trk2.getTrackStates().get(0).getMomentum()[0],trk2.getTrackStates().get(0).getMomentum()[1],trk2.getTrackStates().get(0).getMomentum()[2],hitsOnTrack2.size());
+ HashMap<Integer,HelicalTrackHit> hits2 = this.getHitMap(hitsOnTrack2);
+ for(int iLayer=0;iLayer<5;++iLayer) {
+ HelicalTrackHit hitOnLayer = hits2.get(iLayer*2+1);// = this.getHitOnLayer(iLayer, hitsOnTrack);
+ if (hitOnLayer != null) printWriter.format("%5.5f %5.5f %5.5f ", hitOnLayer.getPosition()[0],hitOnLayer.getPosition()[1],hitOnLayer.getPosition()[2]);
+ else printWriter.format("%5.5f %5.5f %5.5f ", -9999999.9, -9999999.9, -9999999.9);
+ }
//Particle vtx
if(vtxPosParticle!=null) printWriter.format("%5.5f %5.5f %5.5f ", vtxPosParticle.x(),vtxPosParticle.y(),vtxPosParticle.z() );
else printWriter.format("%5.5f %5.5f %5.5f ", -9999999., -9999999., -9999999. );
@@ -287,13 +388,36 @@
this.vertexer.extrapolator().setTrack(trk2);
posAtConverter = this.vertexer.extrapolator().extrapolateTrack(SvtTrackExtrapolator.HARP_POSITION);
printWriter.format("%5.5f %5.5f %5.5f ", posAtConverter.z(),posAtConverter.x(),posAtConverter.y()); //note rotation from JLab->tracking
+ int ncl_t=0; int ncl_b=0;
+ for(HPSEcalCluster cl : clusters) {
+ if(cl.getSeedHit().getIdentifierFieldValue("iy") > 0) ncl_t++;
+ else ncl_b++;
+ }
+ printWriter.format("%5d %5d",ncl_t,ncl_b);
printWriter.println();
}
+ private HashMap<Integer,HelicalTrackHit> getHitMap(List<TrackerHit> hits) {
+ HashMap<Integer,HelicalTrackHit> map = new HashMap<Integer,HelicalTrackHit>();
+ for(TrackerHit hit : hits) {
+ HelicalTrackHit hth = (HelicalTrackHit) hit;
+ map.put(hth.Layer(), hth);
+ }
+ return map;
+ }
-
+ private HelicalTrackHit getHitOnLayer(int layer, List<TrackerHit> hits) {
+ HelicalTrackHit hitOnLayer = null;
+ for(TrackerHit hit : hits) {
+ HelicalTrackHit htc = (HelicalTrackHit) hit;
+ if( htc.Layer() == layer) {
+ hitOnLayer = htc;
+ }
+ }
+ return hitOnLayer;
+ }