View Javadoc

1   package org.lcsim.recon.calorimetry;
2   
3   import java.util.ArrayList;
4   import java.util.Arrays;
5   import java.util.List;
6   
7   import org.lcsim.event.EventHeader;
8   import org.lcsim.event.SimCalorimeterHit;
9   import org.lcsim.event.EventHeader.LCMetaData;
10  import org.lcsim.event.base.BaseSimCalorimeterHit;
11  import org.lcsim.util.Driver;
12  import org.lcsim.lcio.LCIOConstants;
13  import org.lcsim.lcio.LCIOUtil;
14  
15  
16  
17  /**
18   * Driver to re-calculate the raw energy of all SimCalorimeterHits from the sum of their energy contributions. 
19   * 
20   * @author <a href="mailto:christian.grefe@cern.ch">Christian Grefe</a>
21   */
22  public class ResetCalorimeterHitEnergy extends Driver {
23  	
24  	protected List<String> ignoreCollections;
25  	
26  	public ResetCalorimeterHitEnergy() {
27  		ignoreCollections = new ArrayList<String>();
28  	}
29  	
30  	public void setIgnoreCollection(String collectionName) {
31  		ignoreCollections.add(collectionName);
32  	}
33  	
34  	public void setIgnoreCollections(String[] collectionNames) {
35  		ignoreCollections.addAll(Arrays.asList(collectionNames));
36  	}
37  	
38  	@Override
39  	protected void process(EventHeader event) {
40  		
41  		List<List<SimCalorimeterHit>> caloHitCollections = event.get(SimCalorimeterHit.class);
42  		
43  		for (List<SimCalorimeterHit> caloHitCollection : caloHitCollections) {
44  			LCMetaData metaData = event.getMetaData(caloHitCollection);
45  			String collectionName = metaData.getName();
46  			if (ignoreCollections.contains(collectionName)) {
47  				continue;
48  			}
49  			boolean hasPDG = LCIOUtil.bitTest(metaData.getFlags(),LCIOConstants.CHBIT_PDG);
50  			List<SimCalorimeterHit> resetHits = new ArrayList<SimCalorimeterHit>();
51  			for (SimCalorimeterHit caloHit : caloHitCollection) {
52  				long id = caloHit.getCellID();
53  				double totalEnergy = 0.;
54  				double time = caloHit.getTime();
55  				int nMCP = caloHit.getMCParticleCount();
56  				Object[] mcparts = new Object[nMCP];
57  				float[] energies = new float[nMCP];
58  				float[] times = new float[nMCP];
59  				int[] pdgs = null;
60  				List<float[]> steps = new ArrayList<float[]>();
61  				if (hasPDG) pdgs = new int[nMCP];
62  				// fill arrays with values from hit
63  				for (int i = 0; i != nMCP; i++) {
64  					mcparts[i] = caloHit.getMCParticle(i);
65  					energies[i] = (float) caloHit.getContributedEnergy(i);
66  					totalEnergy += energies[i];
67  					times[i] = (float) caloHit.getContributedTime(i);
68  					if (hasPDG){
69  						pdgs[i] = caloHit.getPDG(i);
70  						steps.add(caloHit.getStepPosition(i));
71  					}
72  				}
73  				
74  				BaseSimCalorimeterHit resetHit = new BaseSimCalorimeterHit(id, totalEnergy, time, mcparts, energies, times, pdgs, steps, metaData);
75  				resetHits.add(resetHit);
76  			}
77  			caloHitCollection.clear();
78  			caloHitCollection.addAll(resetHits);
79  		}
80  		
81  	}
82  
83  }