Simulated events can be fully reconstructed by a ReconCheater that uses Monte Carlo truth to reconstruct individual particles. Charged tracks found by the TrackingCheater and calorimeter clusters found by the ClusterCheater are used to provide the basis for full event reconstruction. Various options and parameter settings in a Cheating properties file or Cheating Table for each detector are used to mix reconstructed tracks and clusters with Monte Carlo particles. Options for obtaining various measures of the neutral energy deposition, for controlling decays and nuclear interactions, and simulating loses of neutral hadrons are included.

To add the ReconCheater to a process, use

    add(new org.lcsim.recon.cheater.ReconCheater());

The TrackingCheater and ClusterCheater drivers will be added by the ReconCheater.
An AIDA histogram package is included for optional use, see below.

To access reconstructed particles, use

    event.get(ReconstructedParticle.class);


Fully simulated GEANT4 events are reconstructed by the ReconCheater in the following way:


The total Z pole energy reconstructed for the CDC, GLD and SiD detectors is shown below. Only uds decays of the Z where simulated for the GLD detector. Here a parameterized HCal response of 60%/sqrt(E) was used to obtain resolutions of 2.1 GeV for all 3 detectors.


High energy W mass reconstruction for the CDC and SiD detectors is shown below. A parameterized HCal response of 60%/sqrt(E) and perfect energy flow were used to obtain resolutions of 2.2 GeV for both detectors.


The ReconCheater code is contained in the following classes:

Packages:

Classes:

org.lcsim.recon.cheater

CheatingTable

 

CheatParticleID

 

CheatReconstructedParticle

 

ReconCheater

To use the ReconCheater histogram package, use

    cheater = new org.lcsim.recon.cheater.ReconCheater();

    cheater.setHist(true);


Example of analysis code:

public void process(EventHeader event)
{
    // Get reconstructed particle 3Vector's.
    List<Hep3Vector> particles = new ArrayList();
    List<List<ReconstructedParticle>> rpLists = event.get(ReconstructedParticle.class);
    for (List<ReconstructedParticle> collection : rpLists) {
	String name = event.getMetaData(collection).getName();
        if (!name.equals("ReconCheater")) continue;
        for (ReconstructedParticle rp : collection) {
            particles.add(rp.getMomentum());
        }
    }
    // Set up Jet finder.
    double ycut = 0.0005, dycut = 0.0005;
    finder.setYCut(ycut);
    finder.setEvent(particles);
    NJets = finder.njets();

    while (NMJets>MaxNumberJetsExpected) {
        ycut += dycut;
        finder.setYCut(ycut);
        NMJets = finder.njets();
    }
    aida.cloud1D("# jets").fill(NJets);
}


Example of JAS3 driver:

/* EventRecoDriver.java
 */

import java.util.List;

import org.lcsim.event.EventHeader;
import org.lcsim.event.MCParticle;
import org.lcsim.event.ReconstructedParticle;
import org.lcsim.recon.cheater.ReconCheater;
import org.lcsim.util.Driver;
import org.lcsim.util.aida.AIDA;

public class EventRecoDriver extends Driver
{
    private AIDA aida = AIDA.defaultInstance();

    /** Creates a new instance of EventRecoDriver */
    public EventRecoDriver()
    {
	add(new ReconCheater());
    }

    public void process(EventHeader event) 
    {
	super.process(event); // this takes care that the child Drivers are loaded and processed.

	List<List<ReconstructedParticle>> rpLists = event.get(ReconstructedParticle.class);
	for (List<ReconstructedParticle> list : rpLists) {
	    if (!event.getMetaData(list).getName().equals("ReconCheater")) continue;
	    aida.cloud1D("RP list size").fill(list.size());
	}
    }
}