11package org .hps .recon .tracking ;
22
33import hep .physics .matrix .SymmetricMatrix ;
4- import hep .physics .vec .BasicHep3Vector ;
54import hep .physics .vec .Hep3Vector ;
6- import hep .physics .vec .VecOp ;
75
86import java .util .ArrayList ;
97import java .util .HashMap ;
@@ -46,14 +44,15 @@ public class StripMaker {
4644 SiTrackerIdentifierHelper _sid_helper ;
4745 // Temporary map connecting hits to strip numbers for sake of speed (reset once per sensor)
4846 Map <FittedRawTrackerHit , Integer > _strip_map = new HashMap <FittedRawTrackerHit , Integer >();
49- double _oneClusterErr = 1 / Math .sqrt (12 );
50- double _twoClusterErr = 1 / 5 ;
51- double _threeClusterErr = 1 / 3 ;
52- double _fourClusterErr = 1 / 2 ;
53- double _fiveClusterErr = 1 ;
47+
5448
5549 boolean _debug = false ;
50+ private SiliconResolutionModel _res_model = new DefaultSiliconResolutionModel ();
5651
52+ public void setResolutionModel (SiliconResolutionModel model ){
53+ _res_model = model ;
54+ }
55+
5756 public StripMaker (ClusteringAlgorithm algo ) {
5857 _clustering = algo ;
5958 }
@@ -154,25 +153,7 @@ public List<SiTrackerHit> makeHits(SiSensor sensor, SiSensorElectrodes electrode
154153 return hits ;
155154 }
156155
157- public void SetOneClusterErr (double err ) {
158- _oneClusterErr = err ;
159- }
160-
161- public void SetTwoClusterErr (double err ) {
162- _twoClusterErr = err ;
163- }
164-
165- public void SetThreeClusterErr (double err ) {
166- _threeClusterErr = err ;
167- }
168-
169- public void SetFourClusterErr (double err ) {
170- _fourClusterErr = err ;
171- }
172-
173- public void SetFiveClusterErr (double err ) {
174- _fiveClusterErr = err ;
175- }
156+
176157
177158 public void setCentralStripAveragingThreshold (int max_noaverage_nstrips ) {
178159 _max_noaverage_nstrips = max_noaverage_nstrips ;
@@ -242,20 +223,9 @@ private Hep3Vector getPosition(List<FittedRawTrackerHit> cluster, SiSensorElectr
242223 System .out .println (this .getClass ().getSimpleName () + " Calculate charge weighted mean for " + signals .size () + " signals" );
243224 }
244225
245- double total_charge = 0 ;
246- Hep3Vector position = new BasicHep3Vector (0 , 0 , 0 );
247-
248- for (int istrip = 0 ; istrip < signals .size (); istrip ++) {
249- double signal = signals .get (istrip );
250-
251- total_charge += signal ;
252- position = VecOp .add (position , VecOp .mult (signal , positions .get (istrip )));
253- if (_debug ) {
254- System .out .println (this .getClass ().getSimpleName () + "strip " + istrip + ": signal " + signal + " position " + positions .get (istrip ) + " -> total_position " + position .toString () + " ( total charge " + total_charge + ")" );
255- }
256-
257- }
258- position = VecOp .mult (1 / total_charge , position );
226+
227+ Hep3Vector position = _res_model .weightedAveragePosition (signals , positions );
228+
259229 if (_debug ) {
260230 System .out .println (this .getClass ().getSimpleName () + " charge weighted position " + position .toString () + " (before trans)" );
261231 }
@@ -303,8 +273,8 @@ private double getTime(List<FittedRawTrackerHit> cluster) {
303273
304274 private SymmetricMatrix getCovariance (List <FittedRawTrackerHit > cluster , SiSensorElectrodes electrodes ) {
305275 SymmetricMatrix covariance = new SymmetricMatrix (3 );
306- covariance .setElement (0 , 0 , Math .pow (getMeasuredResolution (cluster , electrodes ), 2 ));
307- covariance .setElement (1 , 1 , Math .pow (getUnmeasuredResolution (cluster , electrodes ), 2 ));
276+ covariance .setElement (0 , 0 , Math .pow (_res_model . getMeasuredResolution (cluster , electrodes ), 2 ));
277+ covariance .setElement (1 , 1 , Math .pow (_res_model . getUnmeasuredResolution (cluster , electrodes , _strip_map ), 2 ));
308278 covariance .setElement (2 , 2 , 0.0 );
309279
310280 SymmetricMatrix covariance_global = electrodes .getLocalToGlobal ().transformed (covariance );
@@ -329,57 +299,7 @@ private SymmetricMatrix getCovariance(List<FittedRawTrackerHit> cluster, SiSenso
329299 // return new SymmetricMatrix((Matrix)covariance_global);
330300 }
331301
332- private double getMeasuredResolution (List <FittedRawTrackerHit > cluster , SiSensorElectrodes electrodes ) // should
333- // replace
334- // this
335- // by
336- // a
337- // ResolutionModel
338- // class
339- // that
340- // gives
341- // expected
342- // resolution.
343- // This
344- // could
345- // be
346- // a
347- // big
348- // job.
349- {
350- double measured_resolution ;
351-
352- double sense_pitch = ((SiSensor ) electrodes .getDetectorElement ()).getSenseElectrodes (electrodes .getChargeCarrier ()).getPitch (0 );
353-
354- // double readout_pitch = electrodes.getPitch(0);
355- // double noise =
356- // _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
357- // double signal_expected = (0.000280/DopedSilicon.ENERGY_EHPAIR) *
358- // ((SiSensor)electrodes.getDetectorElement()).getThickness(); // ~280 KeV/mm for thick Si
359- // sensors
360- if (cluster .size () == 1 ) {
361- measured_resolution = sense_pitch * _oneClusterErr ;
362- } else if (cluster .size () == 2 ) {
363- measured_resolution = sense_pitch * _twoClusterErr ;
364- } else if (cluster .size () == 3 ) {
365- measured_resolution = sense_pitch * _threeClusterErr ;
366- } else if (cluster .size () == 4 ) {
367- measured_resolution = sense_pitch * _fourClusterErr ;
368- } else {
369- measured_resolution = sense_pitch * _fiveClusterErr ;
370- }
371-
372- return measured_resolution ;
373- }
374-
375- private double getUnmeasuredResolution (List <FittedRawTrackerHit > cluster , SiSensorElectrodes electrodes ) {
376- // Get length of longest strip in hit
377- double hit_length = 0 ;
378- for (FittedRawTrackerHit hit : cluster ) {
379- hit_length = Math .max (hit_length , ((SiStrips ) electrodes ).getStripLength (_strip_map .get (hit )));
380- }
381- return hit_length / Math .sqrt (12 );
382- }
302+
383303
384304 private double getEnergy (List <FittedRawTrackerHit > cluster ) {
385305 double total_charge = 0.0 ;
0 commit comments