Author: [log in to unmask]
Date: Fri Sep 25 06:56:20 2015
New Revision: 3712
Log:
do stuff
Modified:
java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java
java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java
=============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java (original)
+++ java/trunk/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java Fri Sep 25 06:56:20 2015
@@ -7,17 +7,13 @@
import hep.physics.vec.VecOp;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import org.lcsim.event.EventHeader;
import org.lcsim.event.ReconstructedParticle;
import org.lcsim.event.Track;
import org.lcsim.event.Vertex;
import org.lcsim.event.base.BaseReconstructedParticle;
-import org.lcsim.fit.helicaltrack.HelicalTrackFit;
-import org.lcsim.recon.tracking.seedtracker.SeedTrack;
import org.hps.recon.tracking.CoordinateTransformations;
import org.hps.recon.tracking.TrackType;
import org.hps.recon.vertexing.BilliorTrack;
@@ -25,23 +21,24 @@
import org.hps.recon.vertexing.BilliorVertexer;
/**
- * The main HPS implementation of ReconParticleDriver. Method generates
- * V0 candidates and does vertex fits.
- *
+ * The main HPS implementation of ReconParticleDriver. Method generates V0
+ * candidates and does vertex fits.
+ *
* @author Omar Moreno <[log in to unmask]>
*/
public class HpsReconParticleDriver extends ReconParticleDriver {
-
+
/**
* LCIO collection name for Moller candidate particles generated without
* constraints.
*/
protected String unconstrainedMollerCandidatesColName = "UnconstrainedMollerCandidates";
/**
- * LCIO collection name for Moller candidate particles generated with beam spot
- * constraints.
- */
- protected String beamConMollerCandidatesColName = "BeamspotConstrainedMollerCandidates"; ;
+ * LCIO collection name for Moller candidate particles generated with beam
+ * spot constraints.
+ */
+ protected String beamConMollerCandidatesColName = "BeamspotConstrainedMollerCandidates";
+ ;
/**
* LCIO collection name for Moller candidate particles generated with target
* constraints.
@@ -53,8 +50,8 @@
*/
protected String unconstrainedMollerVerticesColName = "UnconstrainedMollerVertices";
/**
- * LCIO collection name for Moller candidate vertices generated with beam spot
- * constraints.
+ * LCIO collection name for Moller candidate vertices generated with beam
+ * spot constraints.
*/
protected String beamConMollerVerticesColName = "BeamspotConstrainedMollerVertices";
/**
@@ -62,7 +59,7 @@
* constraints.
*/
protected String targetConMollerVerticesColName = "TargetConstrainedMollerVertices";
-
+
/**
* Stores reconstructed Moller candidate particles generated without
* constraints.
@@ -79,7 +76,8 @@
*/
protected List<ReconstructedParticle> targetConMollerCandidates;
/**
- * Stores reconstructed Moller candidate vertices generated without constraints.
+ * Stores reconstructed Moller candidate vertices generated without
+ * constraints.
*/
protected List<Vertex> unconstrainedMollerVertices;
/**
@@ -95,19 +93,25 @@
/**
* Represents a type of constraint for vertex fitting.
- *
+ *
* @author Omar Moreno <[log in to unmask]>
*/
- private enum Constraint {
- /** Represents a fit with no constraints. */
- UNCONSTRAINED,
- /** Represents a fit with beam spot constraints. */
- BS_CONSTRAINED,
- /** Represents a fit with target constraints. */
+ private enum Constraint {
+
+ /**
+ * Represents a fit with no constraints.
+ */
+ UNCONSTRAINED,
+ /**
+ * Represents a fit with beam spot constraints.
+ */
+ BS_CONSTRAINED,
+ /**
+ * Represents a fit with target constraints.
+ */
TARGET_CONSTRAINED
}
-
/**
* Processes the track and cluster collections in the event into
* reconstructed particles and V0 candidate particles and vertices. These
@@ -117,16 +121,16 @@
*/
@Override
protected void process(EventHeader event) {
-
+
unconstrainedMollerCandidates = new ArrayList<ReconstructedParticle>();
beamConMollerCandidates = new ArrayList<ReconstructedParticle>();
targetConMollerCandidates = new ArrayList<ReconstructedParticle>();
unconstrainedMollerVertices = new ArrayList<Vertex>();
beamConMollerVertices = new ArrayList<Vertex>();
targetConMollerVertices = new ArrayList<Vertex>();
-
+
super.process(event);
-
+
event.put(unconstrainedMollerCandidatesColName, unconstrainedMollerCandidates, ReconstructedParticle.class, 0);
event.put(beamConMollerCandidatesColName, beamConMollerCandidates, ReconstructedParticle.class, 0);
event.put(targetConMollerCandidatesColName, targetConMollerCandidates, ReconstructedParticle.class, 0);
@@ -134,23 +138,23 @@
event.put(beamConMollerVerticesColName, beamConMollerVertices, Vertex.class, 0);
event.put(targetConMollerVerticesColName, targetConMollerVertices, Vertex.class, 0);
}
-
- /**
- * Creates reconstructed V0 candidate particles and vertices for
- * electron positron pairs using no constraints, beam constraints,
- * and target constraints. These are saved to the appropriate lists
- * in the super class.
+
+ /**
+ * Creates reconstructed V0 candidate particles and vertices for electron
+ * positron pairs using no constraints, beam constraints, and target
+ * constraints. These are saved to the appropriate lists in the super class.
+ *
* @param electrons - The list of electrons.
* @param positrons - The list of positrons.
*/
@Override
protected void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) {
-
+
// Iterate over the positrons and electrons to perform vertexing
// on the pairs.
- for(ReconstructedParticle positron : positrons) {
- for(ReconstructedParticle electron : electrons) {
-
+ for (ReconstructedParticle positron : positrons) {
+ for (ReconstructedParticle electron : electrons) {
+
// Don't vertex a GBL track with a SeedTrack.
if (TrackType.isGBL(positron.getType()) != TrackType.isGBL(electron.getType())) {
continue;
@@ -159,243 +163,256 @@
if ((positron.getType() & electron.getType() & 0x1f) == 0) {
continue;
}
-
+
// Make V0 candidates
this.makeV0Candidates(electron, positron);
}
}
-
+
+ List<ReconstructedParticle> topElectrons = new ArrayList<ReconstructedParticle>();
+ List<ReconstructedParticle> botElectrons = new ArrayList<ReconstructedParticle>();
+ for (ReconstructedParticle electron : electrons) {
+ if (electron.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) {
+ topElectrons.add(electron);
+ } else {
+ botElectrons.add(electron);
+ }
+ }
+
// Iterate over the collection of electrons and create e-e- pairs
- for (int firstElectronN = 0; firstElectronN < electrons.size(); firstElectronN++) {
- ReconstructedParticle firstElectron = electrons.get(firstElectronN);
-
- for (int secondElectronN = firstElectronN + 1; secondElectronN < electrons.size(); secondElectronN++) {
-
- ReconstructedParticle secondElectron = electrons.get(secondElectronN);
-
- // Don't vertex the same particles. This is needed when making
- // Moller candidates.
- if (firstElectron == secondElectron) continue;
-
+ for (ReconstructedParticle topElectron : topElectrons) {
+
+ for (ReconstructedParticle botElectron : botElectrons) {
// Don't vertex a GBL track with a SeedTrack.
- if (TrackType.isGBL(firstElectron.getType()) != TrackType.isGBL(secondElectron.getType())) {
+ if (TrackType.isGBL(topElectron.getType()) != TrackType.isGBL(botElectron.getType())) {
continue;
}
// Only vertex two particles if at least one strategy found both tracks. Take out this check once we reduce the number of tracks.
- if ((firstElectron.getType() & secondElectron.getType() & 0x1f) == 0) {
+ if ((topElectron.getType() & botElectron.getType() & 0x1f) == 0) {
continue;
}
- // Require the the mollers are in opposite volumes
- if (firstElectron.getTracks().get(0).getTrackStates().get(0).getTanLambda()
- *secondElectron.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) continue;
-
// Make Moller candidates
- this.makeMollerCandidates(firstElectron, secondElectron);
+ this.makeMollerCandidates(topElectron, botElectron);
}
}
}
-
- /**
- * Sets the default LCIO collection names if they are not already
- * defined previously.
+
+ /**
+ * Sets the default LCIO collection names if they are not already defined
+ * previously.
*/
@Override
- protected void startOfData(){
+ protected void startOfData() {
// If the LCIO collection names have not been defined, assign
// them to the default names.
- if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; }
- if(beamConV0CandidatesColName == null) { beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; }
- if(targetConV0CandidatesColName == null) { targetConV0CandidatesColName = "TargetConstrainedV0Candidates"; }
- if(unconstrainedV0VerticesColName == null) { unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; }
- if(beamConV0VerticesColName == null) { beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; }
- if(targetConV0VerticesColName == null) { targetConV0VerticesColName = "TargetConstrainedV0Vertices"; }
- }
-
- /**
- * Fits a vertex from an electron/positron track pair using the
- * indicated constraint.
+ if (unconstrainedV0CandidatesColName == null) {
+ unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates";
+ }
+ if (beamConV0CandidatesColName == null) {
+ beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates";
+ }
+ if (targetConV0CandidatesColName == null) {
+ targetConV0CandidatesColName = "TargetConstrainedV0Candidates";
+ }
+ if (unconstrainedV0VerticesColName == null) {
+ unconstrainedV0VerticesColName = "UnconstrainedV0Vertices";
+ }
+ if (beamConV0VerticesColName == null) {
+ beamConV0VerticesColName = "BeamspotConstrainedV0Vertices";
+ }
+ if (targetConV0VerticesColName == null) {
+ targetConV0VerticesColName = "TargetConstrainedV0Vertices";
+ }
+ }
+
+ /**
+ * Fits a vertex from an electron/positron track pair using the indicated
+ * constraint.
+ *
* @param constraint - The constraint type to use.
* @param electron - The electron track.
* @param positron - The positron track.
* @return Returns the reconstructed vertex as a <code>BilliorVertex
* </code> object.
*/
- private BilliorVertex fitVertex(Constraint constraint, BilliorTrack electron, BilliorTrack positron){
+ private BilliorVertex fitVertex(Constraint constraint, BilliorTrack electron, BilliorTrack positron) {
// Create a vertex fitter from the magnetic field.
BilliorVertexer vtxFitter = new BilliorVertexer(bField);
// TODO: The beam size should come from the conditions database.
vtxFitter.setBeamSize(beamSize);
-
+
// Perform the vertexing based on the specified constraint.
- switch(constraint){
- case UNCONSTRAINED:
- vtxFitter.doBeamSpotConstraint(false);
+ switch (constraint) {
+ case UNCONSTRAINED:
+ vtxFitter.doBeamSpotConstraint(false);
break;
case BS_CONSTRAINED:
- vtxFitter.doBeamSpotConstraint(true);
+ vtxFitter.doBeamSpotConstraint(true);
break;
case TARGET_CONSTRAINED:
vtxFitter.doTargetConstraint(true);
break;
}
-
+
// Add the electron and positron tracks to a track list for
// the vertex fitter.
List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>();
billiorTracks.add(electron);
billiorTracks.add(positron);
-
+
// Find and return a vertex based on the tracks.
return vtxFitter.fitVertex(billiorTracks);
}
-
- /**
- *
- */
- private void makeV0Candidates(ReconstructedParticle electron, ReconstructedParticle positron) {
+
+ /**
+ *
+ */
+ private void makeV0Candidates(ReconstructedParticle electron, ReconstructedParticle positron) {
// Covert the tracks to BilliorTracks.
- BilliorTrack electronBTrack = toBilliorTrack(electron.getTracks().get(0));
+ BilliorTrack electronBTrack = toBilliorTrack(electron.getTracks().get(0));
BilliorTrack positronBTrack = toBilliorTrack(positron.getTracks().get(0));
// Create candidate particles for each constraint.
- for(Constraint constraint : Constraint.values()) {
-
+ for (Constraint constraint : Constraint.values()) {
+
// Generate a candidate vertex and particle.
BilliorVertex vtxFit = fitVertex(constraint, electronBTrack, positronBTrack);
- ReconstructedParticle candidate = this.makeReconstructedParticle(electron, positron, vtxFit);
-
+ ReconstructedParticle candidate = this.makeReconstructedParticle(electron, positron, vtxFit);
+
// Add the candidate vertex and particle to the
// appropriate LCIO collection.
- switch(constraint){
-
- case UNCONSTRAINED:
+ switch (constraint) {
+
+ case UNCONSTRAINED:
unconstrainedV0Vertices.add(vtxFit);
- unconstrainedV0Candidates.add(candidate);
- break;
-
+ unconstrainedV0Candidates.add(candidate);
+ break;
+
case BS_CONSTRAINED:
beamConV0Vertices.add(vtxFit);
beamConV0Candidates.add(candidate);
break;
-
+
case TARGET_CONSTRAINED:
targetConV0Vertices.add(vtxFit);
targetConV0Candidates.add(candidate);
break;
-
+
}
}
}
-
- /**
- *
- */
- private void makeMollerCandidates(ReconstructedParticle firstElectron, ReconstructedParticle secondElectron) {
+
+ /**
+ *
+ */
+ private void makeMollerCandidates(ReconstructedParticle topElectron, ReconstructedParticle botElectron) {
// Covert the tracks to BilliorTracks.
- BilliorTrack firstElectronBTrack = toBilliorTrack(firstElectron.getTracks().get(0));
- BilliorTrack secondElectronBTrack = toBilliorTrack(secondElectron.getTracks().get(0));
+ BilliorTrack firstElectronBTrack = toBilliorTrack(topElectron.getTracks().get(0));
+ BilliorTrack secondElectronBTrack = toBilliorTrack(botElectron.getTracks().get(0));
// Create candidate particles for each constraint.
- for(Constraint constraint : Constraint.values()) {
-
+ for (Constraint constraint : Constraint.values()) {
+
// Generate a candidate vertex and particle.
BilliorVertex vtxFit = fitVertex(constraint, firstElectronBTrack, secondElectronBTrack);
- ReconstructedParticle candidate = this.makeReconstructedParticle(firstElectron, secondElectron, vtxFit);
-
+ ReconstructedParticle candidate = this.makeReconstructedParticle(topElectron, botElectron, vtxFit);
+
// Add the candidate vertex and particle to the
// appropriate LCIO collection.
- switch(constraint){
-
- case UNCONSTRAINED:
+ switch (constraint) {
+
+ case UNCONSTRAINED:
unconstrainedMollerVertices.add(vtxFit);
- unconstrainedMollerCandidates.add(candidate);
- break;
-
+ unconstrainedMollerCandidates.add(candidate);
+ break;
+
case BS_CONSTRAINED:
beamConMollerVertices.add(vtxFit);
beamConMollerCandidates.add(candidate);
break;
-
+
case TARGET_CONSTRAINED:
targetConMollerVertices.add(vtxFit);
targetConMollerCandidates.add(candidate);
break;
-
+
}
}
}
-
- /**
- * Creates a reconstructed V0 candidate particle from an electron,
- * positron, and billior vertex.
+
+ /**
+ * Creates a reconstructed V0 candidate particle from an electron, positron,
+ * and billior vertex.
+ *
* @param electron - The electron.
* @param positron - The positron.
* @param vtxFit - The billior vertex.
- * @return Returns a reconstructed particle with properties generated
- * from the child particles and vertex given as an argument.
- */
- private ReconstructedParticle makeReconstructedParticle(ReconstructedParticle electron, ReconstructedParticle positron, BilliorVertex vtxFit){
-
+ * @return Returns a reconstructed particle with properties generated from
+ * the child particles and vertex given as an argument.
+ */
+ private ReconstructedParticle makeReconstructedParticle(ReconstructedParticle electron, ReconstructedParticle positron, BilliorVertex vtxFit) {
+
// Create a new reconstructed particle to represent the V0
// candidate and populate it with the electron and positron.
ReconstructedParticle candidate = new BaseReconstructedParticle();
((BaseReconstructedParticle) candidate).setStartVertex(vtxFit);
candidate.addParticle(electron);
candidate.addParticle(positron);
-
+
// Set the type of the V0 particle. This will only be needed for pass 2.
((BaseReconstructedParticle) candidate).setType(electron.getType());
-
+
// TODO: The calculation of the total fitted momentum should be
// done within BilloirVertex.
// Calculate the candidate particle momentum and associate it
// with the reconstructed candidate particle.
((BaseReconstructedParticle) candidate).setMass(vtxFit.getParameters().get("invMass"));
- Hep3Vector fittedMomentum = new BasicHep3Vector(vtxFit.getParameters().get("p1X"),
- vtxFit.getParameters().get("p1Y"),
- vtxFit.getParameters().get("p1Z"));
- fittedMomentum = VecOp.add(fittedMomentum, new BasicHep3Vector(vtxFit.getParameters().get("p2X"),
- vtxFit.getParameters().get("p2Y"),
- vtxFit.getParameters().get("p2Z")));
+ Hep3Vector fittedMomentum = new BasicHep3Vector(vtxFit.getParameters().get("p1X"),
+ vtxFit.getParameters().get("p1Y"),
+ vtxFit.getParameters().get("p1Z"));
+ fittedMomentum = VecOp.add(fittedMomentum, new BasicHep3Vector(vtxFit.getParameters().get("p2X"),
+ vtxFit.getParameters().get("p2Y"),
+ vtxFit.getParameters().get("p2Z")));
fittedMomentum = CoordinateTransformations.transformVectorToDetector(fittedMomentum);
-
+
// If both the electron and positron have an associated Ecal cluster,
// calculate the total energy and assign it to the V0 particle
double v0Energy = 0;
- if (!electron.getClusters().isEmpty() && !positron.getClusters().isEmpty()) {
+ if (!electron.getClusters().isEmpty() && !positron.getClusters().isEmpty()) {
v0Energy += electron.getClusters().get(0).getEnergy();
v0Energy += positron.getClusters().get(0).getEnergy();
}
-
- HepLorentzVector fourVector = new BasicHepLorentzVector(v0Energy, fittedMomentum);
+
+ HepLorentzVector fourVector = new BasicHepLorentzVector(v0Energy, fittedMomentum);
//((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), fittedMomentum);
((BaseReconstructedParticle) candidate).set4Vector(fourVector);
-
+
// Set the charge of the particle
double particleCharge = electron.getCharge() + positron.getCharge();
- ((BaseReconstructedParticle) candidate).setCharge(particleCharge);
-
+ ((BaseReconstructedParticle) candidate).setCharge(particleCharge);
+
// VERBOSE :: Output the fitted momentum data.
printDebug("Fitted momentum in tracking frame: " + fittedMomentum.toString());
printDebug("Fitted momentum in detector frame: " + fittedMomentum.toString());
-
+
// Add the ReconstructedParticle to the vertex.
vtxFit.setAssociatedParticle(candidate);
-
+
// Set the vertex position as the reference point of the V0 particle
((BaseReconstructedParticle) candidate).setReferencePoint(vtxFit.getPosition());
-
+
// Return the V0 candidate.
return candidate;
}
-
+
/**
* Converts a <code>Track</code> object to a <code>BilliorTrack
* </code> object.
+ *
* @param track - The original track.
* @return Returns the original track as a <code>BilliorTrack
* </code> object.
Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
=============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java (original)
+++ java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java Fri Sep 25 06:56:20 2015
@@ -33,11 +33,18 @@
*/
public abstract class ReconParticleDriver extends Driver {
- /** Utility used to determine if a track and cluster are matched */
- TrackClusterMatcher matcher = new TrackClusterMatcher();
-
+ /**
+ * Utility used to determine if a track and cluster are matched
+ */
+ TrackClusterMatcher matcher = new TrackClusterMatcher();
+
String[] trackCollectionNames = null;
-
+
+ public static final int ELECTRON = 0;
+ public static final int POSITRON = 1;
+ public static final int MOLLER_TOP = 0;
+ public static final int MOLLER_BOT = 1;
+
/**
* Sets the name of the LCIO collection for beam spot constrained V0
* candidate particles.
@@ -159,7 +166,8 @@
/**
* Set the names of the LCIO track collections used as input.
*
- * @param trackCollectionNames Array of collection names. If not set, use all Track collections in the event.
+ * @param trackCollectionNames Array of collection names. If not set, use
+ * all Track collections in the event.
*/
public void setTrackCollectionNames(String[] trackCollectionNames) {
this.trackCollectionNames = trackCollectionNames;
@@ -172,16 +180,16 @@
@Override
protected void detectorChanged(Detector detector) {
matcher.enablePlots(false);
-
+
// Set the magnetic field parameters to the appropriate values.
Hep3Vector ip = new BasicHep3Vector(0., 0., 1.);
bField = detector.getFieldMap().getField(ip).y();
if (bField < 0) {
flipSign = -1;
}
-
+
matcher.setBFieldMap(detector.getFieldMap());
-
+
}
/**
@@ -207,36 +215,36 @@
* data.
*/
protected List<ReconstructedParticle> makeReconstructedParticles(List<Cluster> clusters, List<List<Track>> trackCollections) {
-
+
// Create a list in which to store reconstructed particles.
List<ReconstructedParticle> particles = new ArrayList<ReconstructedParticle>();
// Create a list of unmatched clusters. A cluster should be
// removed from the list if a matching track is found.
Set<Cluster> unmatchedClusters = new HashSet<Cluster>(clusters);
-
+
// Loop through all of the track collections and try to match every
// track to a cluster. Allow a cluster to be matched to multiple
// tracks and use a probability (to be coded later) to determine what
// the best match is.
// TODO: At some point, pull this out to it's own method
- for (List<Track> tracks : trackCollections) {
- for (Track track : tracks) {
-
+ for (List<Track> tracks : trackCollections) {
+ for (Track track : tracks) {
+
// Create a reconstructed particle to represent the track.
ReconstructedParticle particle = new BaseReconstructedParticle();
-
+
// Store the track in the particle.
particle.addTrack(track);
-
+
// Set the type of the particle. This is used to identify
// the tracking strategy used in finding the track associated with
// this particle.
((BaseReconstructedParticle) particle).setType(track.getType());
-
+
// Derive the charge of the particle from the track.
((BaseReconstructedParticle) particle).setCharge(track.getCharge() * flipSign);
-
+
// Extrapolate the particle ID from the track. Positively
// charged particles are assumed to be positrons and those
// with negative charges are assumed to be electrons.
@@ -245,16 +253,16 @@
} else if (particle.getCharge() < 0) {
((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(11, 0, 0, 0));
}
-
+
Cluster matchedCluster = null;
-
+
// Track the best matching cluster for the track.
// TODO: This should find the best match not just the first match.
clusterLoop:
for (Cluster cluster : clusters) {
// Check if the cluster and track are a valid match.
if (matcher.isMatch(cluster, track)) {
-
+
// Store the matched cluster.
matchedCluster = cluster;
@@ -263,35 +271,39 @@
break clusterLoop;
}
}
-
+
// If a cluster was found that matches the track...
if (matchedCluster != null) {
particle.addCluster(matchedCluster);
-
+
int pid = particle.getParticleIDUsed().getPDG();
- if (Math.abs(pid) == 11) ((BaseCluster) matchedCluster).setParticleId(pid);
-
+ if (Math.abs(pid) == 11) {
+ ((BaseCluster) matchedCluster).setParticleId(pid);
+ }
+
unmatchedClusters.remove(matchedCluster);
}
-
+
// Add the particle to the list of reconstructed particles.
particles.add(particle);
}
}
-
+
// Iterate over the remaining unmatched clusters.
- if (!unmatchedClusters.isEmpty()) {
+ if (!unmatchedClusters.isEmpty()) {
for (Cluster unmatchedCluster : unmatchedClusters) {
-
+
// Create a reconstructed particle to represent the unmatched cluster.
ReconstructedParticle particle = new BaseReconstructedParticle();
-
+
// The particle is assumed to be a photon, since it did not leave a track.
((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(22, 0, 0, 0));
-
+
int pid = particle.getParticleIDUsed().getPDG();
- if (Math.abs(pid) != 11) ((BaseCluster) unmatchedCluster).setParticleId(pid);
-
+ if (Math.abs(pid) != 11) {
+ ((BaseCluster) unmatchedCluster).setParticleId(pid);
+ }
+
// Add the cluster to the particle.
particle.addCluster(unmatchedCluster);
@@ -302,33 +314,33 @@
particles.add(particle);
}
}
-
+
// Apply the corrections to the Ecal clusters
- for (Cluster cluster : clusters) {
- if (cluster.getParticleId() != 0) {
+ for (Cluster cluster : clusters) {
+ if (cluster.getParticleId() != 0) {
ClusterUtilities.applyCorrections(cluster);
}
}
-
- for (ReconstructedParticle particle : particles) {
+
+ for (ReconstructedParticle particle : particles) {
double clusterEnergy = 0;
- Hep3Vector momentum = null;
-
- if (!particle.getClusters().isEmpty()) {
+ Hep3Vector momentum = null;
+
+ if (!particle.getClusters().isEmpty()) {
clusterEnergy = particle.getClusters().get(0).getEnergy();
}
-
+
if (!particle.getTracks().isEmpty()) {
momentum = new BasicHep3Vector(particle.getTracks().get(0).getTrackStates().get(0).getMomentum());
momentum = CoordinateTransformations.transformVectorToDetector(momentum);
- } else if (!particle.getClusters().isEmpty()) {
+ } else if (!particle.getClusters().isEmpty()) {
momentum = new BasicHep3Vector(particle.getClusters().get(0).getPosition());
momentum = VecOp.mult(clusterEnergy, VecOp.unit(momentum));
}
HepLorentzVector fourVector = new BasicHepLorentzVector(clusterEnergy, momentum);
((BaseReconstructedParticle) particle).set4Vector(fourVector);
}
-
+
// Return the list of reconstructed particles.
return particles;
}
@@ -355,10 +367,12 @@
*/
@Override
protected void process(EventHeader event) {
-
+
// All events are required to contain Ecal clusters. If
// the event lacks these, then it should be skipped.
- if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) return;
+ if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) {
+ return;
+ }
// VERBOSE :: Note that a new event is being read.
printDebug("\nProcessing Event...");
@@ -368,7 +382,7 @@
// VERBOSE :: Output the number of clusters in the event.
printDebug("Clusters :: " + clusters.size());
-
+
// Get all collections of the type Track from the event. This is
// required in case an event contains different track collection
// for each of the different tracking strategies. If the event
@@ -406,7 +420,7 @@
// Loop through all of the track collections present in the event and
// create final state particles.
finalStateParticles.addAll(makeReconstructedParticles(clusters, trackCollections));
-
+
// VERBOSE :: Output the number of reconstructed particles.
printDebug("Final State Particles :: " + finalStateParticles.size());
@@ -500,7 +514,7 @@
}
@Override
- protected void endOfData() {
+ protected void endOfData() {
//matcher.saveHistograms();
}
@@ -508,12 +522,11 @@
// ==== Class Variables =========================================
// ==============================================================
// Local variables.
-
/**
* Indicates whether debug text should be output or not.
*/
private boolean debug = false;
-
+
/**
* The simple name of the class used for debug print statements.
*/
|