Tracking with strip detectors in Corryvreckan

Hi everyone,

I am working with gaseous strip detectors and trying to see if we can do tracking reconstruction using Corryvreckan.

The approach that I am currently using in Corryvreckan is the following: I split the XY planes of the strip detectors into individual detectors. What this means is that, for the X-plane detectors we have 256 columns and 1 row, and for the for the Y-plane detectors we have 1 column and 256 rows. The sizes of the pixels for these detectors 100mm in one direction and 400um in the other direction. So I will have eight detectors in total from 4 GEM’s (GEMX1, GEMY1, GEMX2, …).

>> Snippet from the detectors file...

[GEMY3]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 1, 256
orientation = 0deg,0deg,0deg
orientation_mode = "xyz"
pixel_pitch = 100000um,400um
position = -554.46um,826.895um,-960.05mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMX3]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 1
orientation = 0deg,0deg,0deg
orientation_mode = "xyz"
pixel_pitch = 400um,100000um
position = 3.99586mm,1.52039mm,-960mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

I have my own custom module which loads in the strip hit data. From these strip hits, I let the default module [Clustering4D] to do the clustering. The clusters that Corryvreckan does for the planes are similar that we get from our own software (comparing the distribution and the amount of clusters).

The problem then arises when I try to do tracking in Corryvreckan. The tracks that Corryvreckan does are done using untrue 2D data, or at least that is how interpret it. As we assign the “long coordinate” to be zero, the hits inside the individual plane detectors will always be in the center of the pixel. What this means is that for these plane detectors, in the global coordinate system, the clusters that Corryvreckan does will always be on the X-axis for the X-plane detectors and on the Y-axis for the Y-plane detectors (or close to the axes when the telescope is aligned). As the planes are individual detectors the tracks is then made in-between these clusters when connected by a straight line. I tried to illustrate his problem with a drawing I made.

If the X and Y clusters were matched before the tracking, I would assume that Corryvreckan would do the tracking correctly. Currently I don’t know if this is possible to do in Corryvreckan without modifying the source code.

Another possibility would be to do the tracking for the y-plane and the x-plane and then match these tracks, but then the question is how do we apply rotational corrections in this approach, as we are doing tracking on a single plane at a time?

For alignment, I don’t do any rotational alignment as with this setting the X- and Y-plane detectors would be rotated by almost 90 deg (~80 deg in X-axis for Y-plane detectors and vice versa). With alignment I am only doing translational alignment and using the first detector in my setup as the reference, so the X-plane of the first GEM detector: GEMX1. I checked that the telescope is aligned from the correlation plots that the [Correlations] module gives. When the first X-plane is the reference detector, the correlations are good for the other X-plane detectors, but for the Y-plane detectors the correlations give a vertical line as the Y is always zero. I checked the Y correlations by changing the reference detector to be the first Y-plane detector, and then the correlation plots were good for the Y-plane detectors, but again a vertical line for the X-plane detectors as one would expect.

Now with this long introduction, my questions would be:

Is it possible to resolve this tracking issue without modifying the source code?

I see that there were some other people working with strip detectors using Corryvreckan, how were you guys able to get tracking done? Did you have a different approach?

Hi @alumppio,

welcome to the forum and thank you for your detailed issue description.

I think there are a few knobs you can turn to improve the tracking:

One first rather simple test is to add a better resolution estimate. Pitch/sqrt(12) as a starting point should be fine.
The 400um along the strip direction causes the Tracking modules to fail with exactly the issues you have described since the default cut is 3 times the resolution.

This should already result in proper tracking.

If you want a precise cluster position for pairs of x/y wires, you likely need to adjust your strip data loader and directly load clusters. But this is not really nice IMHO.

This is also a consequence of the design choice of Corry to have a single reference plane which you use to correlate all other detectors.

I am not aware of anyone using the exact same setup as you. There have been studies with ATLAS endcap modules and radial strips. This is as far as I know possible without further modifications of the tracking modules (I can ask the colleague who did this if you want me to)

Let me know if this solved it for you

Cheers,
Lennart

Thanks for the quick answer!

I don’t use the default relative spatial cut. In my configuration I define both the time and spatial cuts using absolute cuts. For the spatial cut I use 5 * sigma = 2000um. I have also tried doing tracking with the whole detector so spatial_cut_abs = 100mm,100mm, but this has the same problem as I described in the earlier post.

I have also tried this approach and it works for tracking, but some other modules might fail (or not give proper plots) as we don’t have any pixel information.

From what I have tested, currently the best compromising method to use Corryvreckan for tracking in our system, is to load in already matched clusters into Corryvreckan and make pixels out of this external XY data. Then we do the clustering again in Corryvreckan and made tracks out of these clusters. This solution is unelegant, but gives tracking data (also I am not sure do we lose some spatial resolution doing this).

I want to see if it would be possible to do all of the reconstruction inside Corryvreckan.

It would be interesting to see if could I implement the tracking that they use for my system using some coordinate transformations.

Hi,

I am unsure if I completely understand your issue fully now :sweat_smile:

Can you provide me the full geometry and config file of your setup? Ideally also a small data set that I can take a look at it.

This you might be able to solve by combining all strip hits to pixels and run regular clustering afterwards. But let’s try to get it running in regular mode first.

Sorry, I was not super clear with this, but in this approach I have regular XY detectors where the pixels are sized by the strip lenghts (400um,400um). Then I read in already matched cluster data (by our own software) into Corryvreckan. From these clusters that I loaded in, I first made Corryvreckan cluster objects and saw that the tracking worked, but for example the [AnalysisDUT] module gave a segmentation fault (as it is looking for pixel charges that are not there?).

Because the [AnalysisDUT] module didn’t work, I changed my approach and made Corryvreckan pixels out of this already matched cluster data that I read in. Then I let the default module [Clustering4D] to do the clustering and so forth, which is what I am referring to in this;

As this was working fine, I tried to go one step further and use strip hit data in Corryvreckan. This is what I am currently working on. I read in strip hit data in Corryvreckan, and try to do the clustering and the tracking inside the software. Here the tracking isn’t working as intended.

This is what I might have to do, but because I am working with strip hits it is not easy to pair them as pixels. The strip hits first have to be clustered inside the plane and then the individual plane clusters have to be combined into a XY pixel.

The configuration and geometry files you asked:

Configuration file and the geometry file for the XY Cluster approach:

>> Configuration file for the XY Cluster approach:

[Corryvreckan]
#log_level = "DEBUG"
log_format = "DEFAULT"
detectors_file = "geometries/ClusterVMM3a_clusters_alignedTrackChi2_withDUT.geo"
histogram_file = "ClusterVMM3a_withDUT_test.root"
#number_of_events = 1000

[Metronome]
event_length = 20us

[ClusterLoaderVMM3a]
file_input = "path_to_data_file"

[Clustering4D]
time_cut_abs=500ns
log_level = "FATAL"

[Correlations]
log_level = "FATAL"

[Tracking4D]
min_hits_on_track=1
time_cut_abs = 200ns
spatial_cut_abs = 2000um,2000um
require_detectors = "GEMXY1","GEMXY2","GEMXY3"
log_level = "FATAL"

[DUTAssociation]
time_cut_abs=500ns
spatial_cut_abs=4000um,4000um
log_level = "FATAL"

____________________________________________________

>> Geometry file for the XY Cluster approach:

[GEMXY3]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 256
orientation = 2.96437deg,-1.25197deg,0.656953deg
orientation_mode = "xyz"
pixel_pitch = 400um,400um
position = 3.65037mm,2.63583mm,-960mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "pixel_gemrd51"

[GEMXY2]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 256
orientation = -0.377064deg,1.79932deg,-0.0115737deg
orientation_mode = "xyz"
pixel_pitch = 400um,400um
position = 1.70232mm,-468.108um,-550mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "pixel_gemrd51"

[GEMXY4]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 256
orientation = 0deg,0deg,0deg
orientation_mode = "xyz"
pixel_pitch = 400um,400um
position = 161.369um,-706.098um,-359.5mm
role = "dut"
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "pixel_gemrd51"

[GEMXY1]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 256
orientation = 0deg,0deg,0deg
orientation_mode = "xyz"
pixel_pitch = 400um,400um
position = 0um,0um,0um
role = "reference"
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "pixel_gemrd51"

Configuration file and the geometry file for the strip hit approach:

[Corryvreckan]
#log_level = "debug"
log_format = "DEFAULT"
detectors_file = "geometries/pixelVMM3a_alignedTrackChi2_withDUT.geo"
histogram_file = "pixelVMM3a_withDUT_test"
#number_of_events = 1000

[Metronome]
event_length = 20us

[EventLoaderVMM3a]
file_input = "path_to_data_file"
log_level = "FATAL"

[Clustering4D]
time_cut_abs=500ns
neighbor_radius_col = 2
neighbor_radius_row = 2

[Correlations]
log_level = "FATAL"

[Tracking4D]
min_hits_on_track = 1
time_cut_abs = 200ns
spatial_cut_abs = 2mm,2mm
require_detectors = "GEMX1","GEMY1", "GEMX2","GEMY2", "GEMX3","GEMY3"
log_level = "fatal"

[DUTAssociation]
time_cut_abs=500ns
spatial_cut_abs=2mm,2mm
log_level = "FATAL"

[AnalysisDUT]
time_cut_frameedge = 50ns
inpixel_bin_size = 400um,400um
log_level = "FATAL"

________________________________________________________

>> Geometry file for the strip hit approach

[GEMY3]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 1, 256
orientation = 78.5495deg,0.602809deg,1.26853deg
orientation_mode = "xyz"
pixel_pitch = 100000um,400um
position = -918.852um,767.687um,-960.05mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMX3]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 1
orientation = -0.919941deg,-82.473deg,0.906706deg
orientation_mode = "xyz"
pixel_pitch = 400um,100000um
position = 55.769um,625.941um,-960mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMY2]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 1, 256
orientation = 56.0961deg,-1.16024deg,-2.16973deg
orientation_mode = "xyz"
pixel_pitch = 100000um,400um
position = -708.012um,-918.776um,-550.05mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMX2]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 1
orientation = 1.10993deg,48.2668deg,0.136364deg
orientation_mode = "xyz"
pixel_pitch = 400um,100000um
position = 1.30839mm,1.76261mm,-550mm
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMY4]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 1, 256
orientation = -27.8986deg,-1.14271deg,1.04737deg
orientation_mode = "xyz"
pixel_pitch = 100000um,400um
position = -57.927um,-307.528um,-359.55mm
role = "dut"
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMX4]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 1
orientation = -2.92873deg,30.1894deg,0.165642deg
orientation_mode = "xyz"
pixel_pitch = 400um,100000um
position = 765.378um,22.222um,-359.5mm
role = "dut"
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMX1]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 256, 1
orientation = 0deg,0deg,0deg
orientation_mode = "xyz"
pixel_pitch = 400um,100000um
position = 0um,0um,0um
role = "reference"
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

[GEMY1]
coordinates = "cartesian"
material_budget = 0.01068
number_of_pixels = 1, 256
orientation = -82.8447deg,-0.978268deg,-0.125191deg
orientation_mode = "xyz"
pixel_pitch = 100000um,400um
position = -1.12437mm,335.257um,50um
spatial_resolution = 400um,400um
time_resolution = 20ns
type = "strip_gemrd51"

>> EDIT: This is the geometry file where I also used the rotational alignment

I can also give you the data file if needed, but I don’t have a small one. Hopefully this clarified the problem I am dealing with :sweat_smile: