1212// / \file GPUExtractPbPbCollision.h
1313// / \author David Rohr
1414
15- static void GPUExtractPbPbCollision ()
15+ static void GPUExtractPbPbCollision (GPUParam& param, GPUTrackingInOutPointers& ioPtrs )
1616{
17- std::vector<unsigned int > counts (param ().par .continuousMaxTimeBin + 1 );
18- std::vector<unsigned int > sums (param ().par .continuousMaxTimeBin + 1 );
19- std::vector<unsigned int > countsTracks (param ().par .continuousMaxTimeBin + 1 );
20- std::vector<unsigned int > sumsTracks (param ().par .continuousMaxTimeBin + 1 );
17+ std::vector<unsigned int > counts (param.par .continuousMaxTimeBin + 1 );
18+ std::vector<unsigned int > sums (param.par .continuousMaxTimeBin + 1 );
19+ std::vector<unsigned int > countsTracks (param.par .continuousMaxTimeBin + 1 );
20+ std::vector<unsigned int > sumsTracks (param.par .continuousMaxTimeBin + 1 );
21+ std::vector<bool > mask (param.par .continuousMaxTimeBin + 1 );
2122 const int driftlength = 520 ;
22- for (unsigned int i = 0 ; i < mIOPtrs .clustersNative ->nClustersTotal ; i++) {
23- int time = mIOPtrs .clustersNative ->clustersLinear [i].getTime ();
24- if (time < 0 || time > param ().par .continuousMaxTimeBin ) {
25- fprintf (stderr, " Invalid time %d > %d\n " , time, param ().par .continuousMaxTimeBin );
23+ const bool checkAfterGlow = true ;
24+ const int afterGlowLength = checkAfterGlow ? 8000 : 0 ;
25+ for (unsigned int i = 0 ; i < ioPtrs.clustersNative ->nClustersTotal ; i++) {
26+ int time = ioPtrs.clustersNative ->clustersLinear [i].getTime ();
27+ if (time < 0 || time > param.par .continuousMaxTimeBin ) {
28+ fprintf (stderr, " Invalid time %d > %d\n " , time, param.par .continuousMaxTimeBin );
2629 throw std::runtime_error (" Invalid Time" );
2730 }
2831 counts[time]++;
2932 }
30- for (unsigned int i = 0 ; i < mIOPtrs .nMergedTracks ; i++) {
31- if (mIOPtrs .mergedTracks [i].NClusters () < 40 ) {
33+ for (unsigned int i = 0 ; i < ioPtrs .nMergedTracks ; i++) {
34+ if (ioPtrs .mergedTracks [i].NClusters () < 40 ) {
3235 continue ;
3336 }
34- int time = mIOPtrs .mergedTracks [i].GetParam ().GetTZOffset ();
35- if (time < 0 || time > param () .par .continuousMaxTimeBin ) {
37+ int time = ioPtrs .mergedTracks [i].GetParam ().GetTZOffset ();
38+ if (time < 0 || time > param.par .continuousMaxTimeBin ) {
3639 continue ;
3740 }
3841 countsTracks[time]++;
3942 }
4043 int first = 0 , last = 0 ;
41- for (int i = driftlength; i < param () .par .continuousMaxTimeBin ; i++) {
44+ for (int i = driftlength; i < param.par .continuousMaxTimeBin ; i++) {
4245 if (counts[i]) {
4346 first = i;
4447 break ;
4548 }
4649 }
47- for (int i = param () .par .continuousMaxTimeBin + 1 - driftlength; i > 0 ; i--) {
50+ for (int i = param.par .continuousMaxTimeBin + 1 - driftlength; i > 0 ; i--) {
4851 if (counts[i - 1 ]) {
4952 last = i;
5053 break ;
@@ -70,25 +73,56 @@ static void GPUExtractPbPbCollision()
7073 }
7174 avg /= (last - first - driftlength);
7275 printf (" BASELINE Min %d Avg %d\n " , min, (int )avg);
76+ /* for (int i = first; i < last - driftlength; i++) {
77+ printf("STAT %d: %u %u (trks %u)\n", i, sums[i], counts[i], sumsTracks[i]);
78+ }*/
7379 bool found = false ;
7480 do {
7581 found = false ;
7682 unsigned int max = 0 , maxpos = 0 ;
77- for (int i = first; i < last - driftlength; i++) {
78- if (sums[i] > 10 * min && sums[i] > avg && sumsTracks[i] > 3 && sums[i] > max) {
79- max = sums[i];
80- maxpos = i;
81- found = true ;
83+ for (int i = first; i < last - driftlength - afterGlowLength; i++) {
84+ if (sums[i] > 10 * min && sums[i] > avg && sumsTracks[i] > 3 ) {
85+ bool noColInAfterGlow = true ;
86+ if (checkAfterGlow) {
87+ for (int ii = i + driftlength; ii < i + driftlength + afterGlowLength; ii++) {
88+ if (sums[ii] > 10 * min && sums[ii] > avg && sumsTracks[ii] > 3 ) {
89+ noColInAfterGlow = false ;
90+ }
91+ }
92+ }
93+ if (noColInAfterGlow && sums[i] > max) {
94+ max = sums[i];
95+ maxpos = i;
96+ found = true ;
97+ }
8298 }
8399 }
84100 if (found) {
85- printf (" MAX %d: %u (Tracks %u)\n " , maxpos, max, sumsTracks[maxpos]);
86- for (int i = std::max<int >(first, maxpos - driftlength); i < std::min<int >(last, maxpos + driftlength); i++) {
101+ unsigned int glow = 0 ;
102+ unsigned int glowcount = 0 ;
103+ if (checkAfterGlow) {
104+ int glowstart = maxpos + driftlength;
105+ int glowend = std::min<int >(last, maxpos + driftlength + afterGlowLength);
106+ for (int i = glowstart; i < glowend; i++) {
107+ glowcount++;
108+ glow += counts[i];
109+ }
110+ // printf("AFTERGLOW RANGE %d %d\n", glowstart, glowend);
111+ }
112+ printf (" MAX %d: %u (Tracks %u) Glow %d (%d)\n " , maxpos, max, sumsTracks[maxpos], glow, glowcount);
113+ for (int i = std::max<int >(first, maxpos - driftlength); i < std::min<int >(last, maxpos + driftlength + afterGlowLength); i++) {
87114 sums[i] = 0 ;
115+ mask[i] = true ;
88116 }
89117 }
90- } while (found);
91- /* for (int i = first; i < last - driftlength; i++) {
92- printf("STAT %d: %u (trks %u)\n", i, sums[i], sumsTracks[i]);
93- }*/
118+ } while (found && !checkAfterGlow);
119+ unsigned int noise = 0 ;
120+ unsigned int noisecount = 0 ;
121+ for (int i = first; i < last; i++) {
122+ if (!mask[i]) {
123+ noise += counts[i];
124+ noisecount++;
125+ }
126+ }
127+ printf (" AVERAGE NOISE: %d\n " , noise / noisecount);
94128}
0 commit comments