Here is my general outline of a "use case" for the tracking infrastructure we need to do track reconstruction using realistic silicon hits. Given: ====== 1) a collection of SimTrackerHits 2) some definition for the size and shape of a readout segment in each layer The task: ======== A) create a complete set of SiStripDetector that tile the layer with readout segments ("modules") B) iterate over SimTrackerHits, for each... I) identify the SiStripDetector (one of my classes) that this SimTrackerHit resides in and access that object II) transform the location/information of the SimTrackerHit from global to the local coordinates of that SiStripDetector, and create a TrackSegment (one of my classes) from the SimTrackerHit that is assigned to that SiStripDetector C) iterate over SiStripDetectors, for each... (I - IV here are either already coded or my infrastructure already includes an easy way to implement the functionality) I) tell the SiStripDetector to iterate over TrackSegments and deposit charge on strips II) tell SiStripDetector to add noise to the strips III) tell the SiStripDetector to turn the raw charge on the strips into ADC counts (digitize) and produce a set of "local" RawTrackerHits (e.g. low bits = channel number) IV) tell the SiStripDetector to cluster the hits and produce a set of "local" TrackerHits (position and covariance matrix in local coordinates) V) get the RawTrackerHits from the SiStripDetector and convert them to "global" RawTrackerHits (e.g. add high bits for module #) and write to event VI) get the TrackerHits from the SiStripDetector and convert them to "global" TrackerHits (transform position and covariance to global coordinates) and write to event VII) clear SiStripDetector Now, some notes: ============== On defining size and shape of a SiStripDetector. One would supply maximum dimensions, and the code would figure out how to tile the surface with the largest pieces no larger than that dimension. For example, one might say 10X10cm squares for the barrel, and the code would look at the cylinder size and say, OK I can tile that completely with squares that are 9.78X9.3cm, and return that information to the user, so that these values can be used to instantiate the corresponding SiStripDetector. Clearly this is more complicated for some endcap geometries (e.g. wedges), which must return much more information about the geometry of each piece. It is important to have the full range of coordinate transformations available, including... Given a point in global coordinates: - What SiStripDetector am I in and how do I access that object? - How do I transform into the local coordinates? - (possibly) What SiStripDetectors are within some distance of this point on the surface Given an SiStripDetector and a local coordinate: - How do I transform into the global coordinate system - (possibly) Who are my neighbors in each direction? I've got so much more rattling around in my head on this that I don't know where to start. Much of it is more in the form of questions than answers, so I think I should just start trying to code something that does the job for the barrel and see what I learn. I expect that once I get started, I'll really need some help in deciding how to solve some of these problems, which is where I am hoping you can help. Cheers, Tim