HARPO  5.1.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
HarpoMatching.cxx
Go to the documentation of this file.
1 #include "HarpoMatching.h"
2 #include "TMath.h"
3 #include <iostream>
4 #include "TROOT.h"
5 #include "TCanvas.h"
6 #include "TRootEmbeddedCanvas.h"
7 #include "TH2D.h"
8 #include "TF1.h"
9 #include "TH2F.h"
10 #include "TH1F.h"
11 #include "THStack.h"
12 #include "TNtuple.h"
13 #include "TLatex.h"
14 
15 #include "TH3D.h"
16 #include "TMath.h"
17 #include <vector>
18 #include "TBenchmark.h"
19 #include "TRandom.h"
20 #include "TInterpreter.h"
21 #include "HarpoConfig.h"
22 //#include "TTree.h"
23 #include "TFile.h"
24 #include "TGLabel.h"
25 #include "TSystem.h"
26 
27 #include "MakeNiceHisto.h"
28 
29 using namespace std;
30 
32 {
33  // ResetMatching();
34  fChooseFacXY = 0;
35 
36  Double_t fxy = 1.075,fact = 0.6, facrec =0.8, chi2cut=0.5;
37  FacXY = 1.075;
38  if( ! gHConfig->Lookup("matching.FacXY",fxy))
39  Info("Constructor","Use default FacXY %g",FacXY);
40  else
41  FacXY = fxy;
42 
43  FacTronc = 0.8;
44  if( ! gHConfig->Lookup("matching.FacTronc",fact))
45  Info("Constructor","Use default FacTronc %g",FacTronc);
46  else
47  FacTronc = fact;
48 
49  FacRec = 0.7;
50  if( ! gHConfig->Lookup("matching.FacRec",facrec))
51  Info("Constructor","Use default FacRec %g",FacRec);
52  else
53  FacRec = facrec;
54 
55  Chi2TroncNcut = 0.5;
56  if( ! gHConfig->Lookup("matching.Chi2TroncNcut",chi2cut))
57  Info("Constructor","Use default Chi2TroncNcut %g",Chi2TroncNcut);
58  else
59  Chi2TroncNcut = chi2cut;
60 
61  Long64_t nComMin = 20;
62  fNcomMin = 20;
63  if( ! gHConfig->Lookup("matching.NcomMin",nComMin))
64  Info("Constructor","Use default NcomMin %d",fNcomMin);
65  else
66  fNcomMin = nComMin;
67 
68 
69  Int_t nBinsChi2 = 100;
70  Double_t Chi2min = 1e-4;
71  Double_t Chi2max = 10;
72  Double_t yBinsChi2[nBinsChi2+1];
73  Double_t alphaChi2 = TMath::Power(Chi2max/Chi2min,1./(nBinsChi2+1));
74  Double_t binChi2 = Chi2min;
75  for(Int_t bin = 0; bin <=nBinsChi2; bin++){
76  yBinsChi2[bin] = binChi2;
77  binChi2 *= alphaChi2;
78  }
79 
80  hQxyVsNcom = new TH2F("hQxyVsNcom",";Q^{tot}_{x}/Q^{tot}_{y};N_{common}",200,0,10,128,0,5120000);
81  hCoverageX = new TH1F("hCoverageX",";",128,0,1);
82  hCoverageY = new TH1F("hCoverageY",";",128,0,1);
83  hChi2 = new TH1F("hChi2",";#chi^{2}",nBinsChi2,yBinsChi2);
84  hQxyVsNcomEvent = new TH2F("hQxyVsNcomEvent",";Q^{tot}_{x}/Q^{tot}_{y};N_{common}",200,0,10,128,0,512);
85  hCoverageXEvent = new TH1F("hCoverageXEvent",";",128,0,1);
86  hCoverageYEvent = new TH1F("hCoverageYEvent",";",128,0,1);
87  hChi2Event = new TH1F("hChi2Event",";#chi^{2}",nBinsChi2,yBinsChi2);
88 
89  for(Int_t j=0; j<NTRACK; j++){
90  hQvsTX[j] = new TH1F(Form("hQvsTX%d",j),";time bin;Q",NADC,0,NADC);
91  hQvsTY[j] = new TH1F(Form("hQvsTY%d",j),";time bin;Q",NADC,0,NADC);
92  }
93 
94  // for(Int_t i = 0; i<NTESTMAT; i++){
95  // fGraph3D[i] = new TGraph2D();
96  // }
97 }
98 
100 {
101 
102  fEvt->GetRecoEvent()->ResetMatchingArray ();
103  Int_t nTracks = InitEventNew();
104  if (nTracks>20) return;
105  DoMatchingNew();
106 }
107 
109 {
110 
111 
112  for(Int_t plane = 0; plane<2; plane++){
113  for(Int_t i = 0; i<kNmaxCompoundTracks; i++)
114  fCompoundTrack[plane][i] = 0;
115  fNcompoundTracks[plane] = 0;
116  }
117  MakeCompoundTracks(0,0,XPLANE);
118  MakeCompoundTracks(0,0,YPLANE);
119  // std::cout << "fNcompoundTracks: " << fNcompoundTracks[0] << " " << fNcompoundTracks[1] << std::endl;
120 
121  Int_t ntestmatch = 0;
122  Double_t chi2[NTESTMAT];
123  Int_t iX[NTESTMAT][2];
124  Int_t iY[NTESTMAT][2];
125  for(Int_t i = 0; i<NTESTMAT; i++){
126  chi2[i] = 10000;
127  iX[i][0] = -1;
128  iX[i][1] = -1;
129  iY[i][0] = -1;
130  iY[i][1] = -1;
131  }
132  for(Int_t itrX1 = 0; itrX1<fNcompoundTracks[XPLANE]; itrX1++){
133  if(ntestmatch>=NTESTMAT) break;
134  //cout << "#### iTrX1 = " << itrX1 << endl;
135  for(Int_t itrX2 = itrX1; itrX2<fNcompoundTracks[XPLANE]; itrX2++){
136  //cout << "##### iTrX2 = " << itrX2 << endl;
137  Int_t nComX = GetNcom(fCompoundTrack[XPLANE][itrX1],fCompoundTrack[XPLANE][itrX2],XPLANE);
138  if(nComX<fNcomMin) continue;
139  //cout << "*#### iTrX2 = " << itrX2 << " " << fCompoundTrack[XPLANE][itrX1] << " " << fCompoundTrack[XPLANE][itrX2] << endl;
140  //cout << "*#### iTrX2 = " << itrX2 << " " << (fCompoundTrack[XPLANE][itrX1] | fCompoundTrack[XPLANE][itrX2]) << " " << (fCompoundTrack[XPLANE][itrX1] | fCompoundTrack[XPLANE][itrX2]) << endl;
141  if(itrX2>itrX1){
142  if((fCompoundTrack[XPLANE][itrX1] | fCompoundTrack[XPLANE][itrX2]) == fCompoundTrack[XPLANE][itrX1]) continue;
143  if((fCompoundTrack[XPLANE][itrX1] | fCompoundTrack[XPLANE][itrX2]) == fCompoundTrack[XPLANE][itrX2]) continue;
144  }
145  //cout << "**### iTrX2 = " << itrX2 << endl;
146  if(ntestmatch>=NTESTMAT) break;
147  TH1F* hX;
148  ULong64_t trX = fCompoundTrack[XPLANE][itrX1] | fCompoundTrack[XPLANE][itrX2];
149  // if(itrX2>itrX1) hX = GetCompoundHist(fCompoundTrack[XPLANE][itrX1] | fCompoundTrack[XPLANE][itrX1], XPLANE);
150  // else
151  hX = GetCompoundHist(trX, XPLANE);
152  for(Int_t itrY1 = 0; itrY1<fNcompoundTracks[YPLANE]; itrY1++){
153  if(ntestmatch>=NTESTMAT) break;
154  //cout << "###### iTrY1 = " << itrY1 << endl;
155  for(Int_t itrY2 = itrY1; itrY2<fNcompoundTracks[YPLANE]; itrY2++){
156  //cout << "####### iTrY2 = " << itrY2 << endl;
157  Int_t nComY = GetNcom(fCompoundTrack[YPLANE][itrY1],fCompoundTrack[YPLANE][itrY2],YPLANE);
158  if(nComY<fNcomMin) continue;
159  if(itrY2>itrY1) {
160  if((fCompoundTrack[YPLANE][itrY1] | fCompoundTrack[YPLANE][itrY2]) == fCompoundTrack[YPLANE][itrY1]) continue;
161  if((fCompoundTrack[YPLANE][itrY1] | fCompoundTrack[YPLANE][itrY2]) == fCompoundTrack[YPLANE][itrY2]) continue;
162  }
163  if(ntestmatch>=NTESTMAT) break;
164  if(itrX1 != itrX2 && itrY1 != itrY2) continue;
165  TH1F* hY;
166  ULong64_t trY = fCompoundTrack[YPLANE][itrY1] | fCompoundTrack[YPLANE][itrY2];
167  hY = GetCompoundHist(trY, YPLANE);
168  // if(itrY2>itrY1) hY = GetCompoundHist(fCompoundTrack[YPLANE][itrY1] | fCompoundTrack[YPLANE][itrY1], YPLANE);
169  // else hY = GetCompoundHist(fCompoundTrack[YPLANE][itrY1], YPLANE);
170 
171  //cout << "Compare " << fCompoundTrack[XPLANE][itrX1] << " + " << fCompoundTrack[XPLANE][itrX2] << " and " << fCompoundTrack[YPLANE][itrY1] << " + " << fCompoundTrack[YPLANE][itrY2] << endl;
172  //cout << " " << itrX1 << " + " << itrX2 << " and " << itrY1 << " + " << itrY2 << endl;
173 
174  Double_t coverageX, coverageY, chi2Tmp;
175  Matching(hX,hY,coverageX,coverageY,chi2Tmp);
176  hY->Delete();
177  if(gHarpoDebug>1)
178  Info("process","(%d+%d|%d+%d) covX = %g, covY = %g, chi2 = %g",itrX1,itrX2,itrY1,itrY2,coverageX,coverageY,chi2Tmp);
179  //cout << chi2Tmp << " " << coverageX << " " << coverageY << endl;
180  if((coverageX < FacRec) || (coverageY < FacRec))
181  chi2[ntestmatch] = chi2Tmp + 0.2/coverageX + 0.2/coverageY;
182  else
183  chi2[ntestmatch] = chi2Tmp + 0.000001/coverageX + 0.000001/coverageY;
184 
185  iX[ntestmatch][0] = itrX1;
186  iX[ntestmatch][1] = itrX2;
187  iY[ntestmatch][0] = itrY1;
188  iY[ntestmatch][1] = itrY2;
189  ntestmatch++;
190  }
191  }
192  hX->Delete();
193  }
194  }
195 
196  Int_t* index = new Int_t[NTESTMAT];
197  TMath::Sort(NTESTMAT,chi2,index,kFALSE);
198  Int_t usedTracksX[NTRACK];
199  Int_t usedTracksY[NTRACK];
200  for(Int_t itr = 0; itr<NTRACK; itr++){
201  usedTracksX[itr] = 0;
202  usedTracksY[itr] = 0;
203  }
204  Int_t matchId = 0;
205  for(Int_t i = 0; i<NTESTMAT; i++){
206  Int_t ind = index[i];
207  if(chi2[ind]<0) continue;
208  if(chi2[ind]>=10) break;
209  Int_t trX = iX[ind][0];
210  Int_t trY = iY[ind][0];
211  Int_t trX2 = iX[ind][1];
212  Int_t trY2 = iY[ind][1];
213 
214 
215  if(gHarpoDebug>1)
216  Info("process","**Matching candidate X:(%d, %d) Y: (%d, %d), chi2 = %g",trX,trX2,trY,trY2,chi2[ind]);
217  if(trX<0) continue;
218  if(trY<0) continue;
219  if(trX2<0) continue;
220  if(trY2<0) continue;
221  ULong64_t maskX = fCompoundTrack[XPLANE][trX];
222  ULong64_t maskX2 = fCompoundTrack[XPLANE][trX2];
223  ULong64_t maskY = fCompoundTrack[YPLANE][trY];
224  ULong64_t maskY2 = fCompoundTrack[YPLANE][trY2];
225 
226  Bool_t skip = kFALSE;
227  for(Int_t j = 0; j<64; j++){
228  ULong64_t test = 1 << j;
229  if(test & (maskX | maskX2)){ // Track j belongs to X track
230  if(usedTracksX[j]){
231  skip = kTRUE;
232  break;
233  }
234  }
235  if(test & (maskY | maskY2)){ // Track j belongs to Y track
236  if(usedTracksY[j]){
237  skip = kTRUE;
238  break;
239  }
240  }
241  }
242  if(skip) continue;
243  if(trX != trX2 && trY != trY2) continue;
244 
245 
246  //cout << "Matching : " << maskX << " + " << maskX2 << " to " << maskY << " + " << maskY2 << endl;
247 
248  Int_t trXnew = CombineTracks(maskX, XPLANE);
249  Int_t trX2new = CombineTracks(maskX2, XPLANE);
250  Int_t trYnew = CombineTracks(maskY, YPLANE);
251  Int_t trY2new = CombineTracks(maskY2, YPLANE);
252  fMask[trXnew][XPLANE] = maskX;
253  fMask[trX2new][XPLANE] = maskX2;
254  fMask[trYnew][YPLANE] = maskY;
255  fMask[trY2new][YPLANE] = maskY2;
256 
257  if(gHarpoDebug>1)
258  Info("process","Matching candidate X:(%d, %d) Y: (%d, %d), chi2 = %g",trXnew,trX2new,trYnew,trY2new,chi2[ind]);
259  HarpoRecoMatching* matching = new HarpoRecoMatching(matchId,trXnew,trX2new,trYnew,trY2new,chi2[ind]);
260  // HarpoRecoMatching* matching = new HarpoRecoMatching(matchId,trX,trX2,trY,trY2,chi2[ind]);
261  fEvt->GetRecoEvent()->AddMatching(matching);
262  // usedTracksX[trX] = 1;
263  // usedTracksX[trX2] = 1;
264  // usedTracksY[trY] = 1;
265  // usedTracksY[trY2] = 1;
266 
267  for(Int_t j = 0; j<64; j++){
268  ULong64_t test = 1 << j;
269  if(test & (maskX | maskX2)) // Track j belongs to X track
270  usedTracksX[j] = 1;
271  if(test & (maskY | maskY2)) // Track j belongs to Y track
272  usedTracksY[j] = 1;
273  }
274  matchId++;
275  }
276 
277 
278  TClonesArray* trArray = fEvt->GetRecoEvent()->GetTracksArray();
279  Int_t nTr = trArray->GetEntries();
280  // Int_t nTrNew = 0;
281  for(Int_t itr = 0; itr<nTr; itr++){
282  HarpoRecoTracks* track = (HarpoRecoTracks*)trArray->At(itr);
283  Int_t nTr = track->GetNtrack();
284  if(nTr<0){
285  // trArray->AddAt(track,nTrNew);
286  trArray->RemoveAt(itr);
287  }
288  }
289  trArray->Compress();
290 
291  delete[] index;
292 
293 }
294 
295 
296 
298 {
299 
300  Int_t ntestmatch = 0;
301  Double_t chi2[NTESTMAT];
302  Int_t iX[NTESTMAT][2];
303  Int_t iY[NTESTMAT][2];
304  for(Int_t i = 0; i<NTESTMAT; i++){
305  chi2[i] = 10000;
306  iX[i][0] = -1;
307  iX[i][1] = -1;
308  iY[i][0] = -1;
309  iY[i][1] = -1;
310  }
311  for(Int_t itrX1 = 0; itrX1<NTRACK; itrX1++){
312  if(ntestmatch>=NTESTMAT) break;
313  if(hQvsTX[itrX1]->Integral()<=0) continue;
314  for(Int_t itrX2 = itrX1; itrX2<NTRACK; itrX2++){
315  if(ntestmatch>=NTESTMAT) break;
316  if(hQvsTX[itrX2]->Integral()<=0) continue;
317  TH1F* hX = (TH1F*)hQvsTX[itrX1]->Clone("hX");
318  if(itrX2>itrX1) hX->Add(hQvsTX[itrX2]);
319  for(Int_t itrY1 = 0; itrY1<NTRACK; itrY1++){
320  if(ntestmatch>=NTESTMAT) break;
321  if(hQvsTY[itrY1]->Integral()<=0) continue;
322  for(Int_t itrY2 = itrY1; itrY2<NTRACK; itrY2++){
323  if(ntestmatch>=NTESTMAT) break;
324  if(itrX1 != itrX2 && itrY1 != itrY2) continue;
325  if(hQvsTY[itrY2]->Integral()<=0) continue;
326  TH1F* hY = (TH1F*)hQvsTY[itrY1]->Clone("hY");
327  if(itrY2>itrY1) hY->Add(hQvsTY[itrY2]);
328 
329  Double_t coverageX, coverageY, chi2Tmp;
330  Matching(hX,hY,coverageX,coverageY,chi2Tmp);
331  hY->Delete();
332  if(gHarpoDebug>1)
333  Info("process","(%d+%d|%d+%d) covX = %g, covY = %g, chi2 = %g",itrX1,itrX2,itrY1,itrY2,coverageX,coverageY,chi2Tmp);
334  if(coverageX < FacRec) continue;
335  if(coverageY < FacRec) continue;
336  chi2[ntestmatch] = chi2Tmp + 0.000001/coverageX + 0.000001/coverageY;
337 
338  iX[ntestmatch][0] = itrX1;
339  iX[ntestmatch][1] = itrX2;
340  iY[ntestmatch][0] = itrY1;
341  iY[ntestmatch][1] = itrY2;
342  ntestmatch++;
343  }
344  }
345  hX->Delete();
346  }
347  }
348 
349  Int_t* index = new Int_t[NTESTMAT];
350  TMath::Sort(NTESTMAT,chi2,index,kFALSE);
351  Int_t usedTracksX[NTRACK];
352  Int_t usedTracksY[NTRACK];
353  for(Int_t itr = 0; itr<NTRACK; itr++){
354  usedTracksX[itr] = 0;
355  usedTracksY[itr] = 0;
356  }
357  Int_t matchId = 0;
358  for(Int_t i = 0; i<NTESTMAT; i++){
359  Int_t ind = index[i];
360  if(chi2[ind]<0) continue;
361  if(chi2[ind]>=10) break;
362  Int_t trX = iX[ind][0];
363  Int_t trY = iY[ind][0];
364  Int_t trX2 = iX[ind][1];
365  Int_t trY2 = iY[ind][1];
366  if(gHarpoDebug>1)
367  Info("process","**Matching candidate X:(%d, %d) Y: (%d, %d), chi2 = %g",trX,trX2,trY,trY2,chi2[ind]);
368  if(trX<0) continue;
369  if(trY<0) continue;
370  if(trX2<0) continue;
371  if(trY2<0) continue;
372  if(usedTracksX[trX]) continue;
373  if(usedTracksY[trY]) continue;
374  if(usedTracksX[trX2]) continue;
375  if(usedTracksY[trY2]) continue;
376  if(trX != trX2 && trY != trY2) continue;
377  if(gHarpoDebug>1)
378  Info("process","Matching candidate X:(%d, %d) Y: (%d, %d), chi2 = %g",trX,trX2,trY,trY2,chi2[ind]);
379 
380  HarpoRecoMatching* matching = new HarpoRecoMatching(matchId,trX,trX2,trY,trY2,chi2[ind]);
381  fEvt->GetRecoEvent()->AddMatching(matching);
382  usedTracksX[trX] = 1;
383  usedTracksX[trX2] = 1;
384  usedTracksY[trY] = 1;
385  usedTracksY[trY2] = 1;
386  matchId++;
387  }
388  delete[] index;
389 }
390 
391 
392 
393 
394 Int_t HarpoMatching::CombineTracks(ULong64_t mask, Int_t plane)
395 {
396 
397  Int_t nTrack = -1;
398 
399  for(Int_t j = 0; j<64; j++){
400  ULong64_t test = 1 << j;
401  if(test & mask){
402  nTrack = j;
403  break;
404  }
405  }
406 
407  //cout << "Combine tracks in " << mask << " to " << nTrack << endl;
408 
409  HarpoRecoEvent* reco = fEvt->GetRecoEvent();
410  // Clusters in the event (both X and Y directions)
411  TClonesArray* clArray = reco->GetClustersArray();
412  Int_t nCl = clArray->GetEntries();
413  for(Int_t icl = 0; icl<nCl; icl++){
414  HarpoRecoClusters* cluster = (HarpoRecoClusters*)clArray->At(icl);
415  if(cluster->GetPlane() != plane) continue;
416  Int_t nTr = cluster->GetIdClusterTrack();
417  ULong64_t test = 1 << nTr;
418  if(!(test & mask)) continue;
419  cluster->RemoveAllClusterTrack();
420  cluster->AddIdClusterTrack(nTrack);
421  }
422 
423  TClonesArray* trArray = reco->GetTracksArray();
424  Int_t nTr = trArray->GetEntries();
425  Double_t xSt = 1000;//, xEnd = -1000;
426  Double_t zSt = 1000, zEnd = -1000;
427  Double_t x0Tr = -1000, angleTr = -1000;
428  Int_t qTr = 0, nClTr = 0;
429  Int_t itrKeep = 0;
430  //Int_t remove[NTRACK];
431  //Int_t nRemove = 0;
432  //std::cout << "Tracks " << nTr << std::endl;
433  for(Int_t itr = 0; itr<nTr; itr++){
434  //std::cout << "Track " << itr << " / " << nTr << std::endl;
435  HarpoRecoTracks* track = (HarpoRecoTracks*)trArray->At(itr);
436  if(track->GetPlane() != plane) continue;
437  Int_t nTr = track->GetNtrack();
438  ULong64_t test = 1 << nTr;
439  if(!(test & mask)) continue;
440  if(gHarpoDebug>1)
441  Info("CombineTracks","start: %g %g, end: %g %g", track->GetZstart(),track->GetXstart(),track->GetZend(),track->GetXend());
442  qTr += track->GetQtTrack();
443  nClTr += track->GetNclusterTrack ();
444  //angleTr += track->GetQtTrack()*track->GetAngleTrack ();
445  if( track->GetZstart() <= zSt ){
446  zSt = track->GetZstart();
447  xSt = track->GetXstart();
448  }
449  if( track->GetZend() <= zSt ){
450  zSt = track->GetZend();
451  xSt = track->GetXend();
452  }
453  if( track->GetZstart() == zSt || track->GetZend () == zSt){
454  angleTr = track->GetAngleTrack ();
455  x0Tr = track->GetX0 ();
456  }
457  if( track->GetZstart() >= zEnd ){
458  zEnd = track->GetZstart();
459  // xEnd = track->GetXstart();
460  }
461  if( track->GetZend() >= zEnd ){
462  zEnd = track->GetZend();
463  // xEnd = track->GetXend();
464  }
465  if(nTr != nTrack){
466  // remove[nRemove] = itr;
467  // nRemove++;
468  track->SetNtrack(-1);
469  }else itrKeep = itr;
470  }
471  HarpoRecoTracks* track = (HarpoRecoTracks*)trArray->At(itrKeep);
472  track->SetXstart(xSt);
473  track->SetZstart(zSt);
474  track->SetXend(xSt);
475  track->SetZend(zSt);
476  //std::cout << "qTr = " << qTr << std::endl;
477  track->SetQtTrack(qTr);
478  track->SetNclusterTrack (nClTr);
479  // track->SetAngleTrack (angleTr);
480  track->SetAngleTrack (angleTr/qTr);
481  track->SetX0 (x0Tr);
482 
483  // for(Int_t i = 0; i<nRemove; i++){
484  // std::cout << "Remove track " << remove[i] << std::endl;
485  // trArray->RemoveAt(remove[i]);
486  // }
487 
488  return nTrack;
489 }
490 
491 
492 void HarpoMatching::MakeCompoundTracks(Int_t iTr, ULong64_t mask, Int_t plane)
493 {
494 
495  //for(Int_t i = 0; i<iTr; i++) cout << " ";
496  //std::cout << "MakeCompoundTracks " << iTr << " " << mask << " " << plane << " " << fTrMax[plane] << std::endl;
497 
498  if(iTr>fTrMax[plane] || iTr>=64){
499  if(mask != 0){
500  if(fNcompoundTracks[plane]>=kNmaxCompoundTracks){
501  Info("MakeCompoundTracks","Too many compound tracks");
502  return;
503  }
504  // cout << plane << " Compound track[" << fNcompoundTracks[plane] << "] = " << mask << endl;
505  fCompoundTrack[plane][fNcompoundTracks[plane]] = mask;
506  fNcompoundTracks[plane]++;
507  }
508  return;
509  }
510 
511  MakeCompoundTracks(iTr+1, mask,plane);
512  ULong64_t test = 1 << iTr;
513  //for(Int_t i = 0; i<iTr; i++) cout << " ";
514  Int_t nCom = GetNcom(test,mask,plane);
515  if(nCom>=0 && nCom<fNcomMin){
516  MakeCompoundTracks(iTr+1, mask | test,plane);
517  }
518 
519 
520 }
521 
522 
523 Int_t HarpoMatching::GetNcom(ULong64_t mask1, ULong64_t mask2, Int_t plane)
524 {
525 
526  // if(mask1 != mask2 && (mask1 & mask2 == mask1)) return -1; // 1 is included in 2
527  // if(mask1 != mask2 && (mask1 & mask2 == mask2)) return -1; // 2 is included in 1
528 
529  // if(plane == XPLANE && hQvsTX[iTr]->Integral()<=0) return -1;
530  // if(plane == YPLANE && hQvsTY[iTr]->Integral()<=0) return -1;
531  Double_t qtot1 = 0;
532  Int_t nCom = 0;
533  for(Int_t i = 0; i<NADC; i++){
534  // Double_t q = 0;
535  // if(plane == XPLANE) q = hQvsTX[iTr]->GetBinContent(i+1);
536  // if(plane == YPLANE) q = hQvsTY[iTr]->GetBinContent(i+1);
537  // if(q<=0) continue;
538  Double_t q1 = 0;
539  for(Int_t j = 0; j<64; j++){
540  ULong64_t test = 1 << j;
541  if(test & mask1){
542  if(plane == XPLANE) q1 += hQvsTX[j]->GetBinContent(i+1);
543  if(plane == YPLANE) q1 += hQvsTY[j]->GetBinContent(i+1);
544  }
545  }
546  if(q1<=0) continue;
547  qtot1 += q1;
548  Double_t q2 = 0;
549  for(Int_t j = 0; j<64; j++){
550  ULong64_t test = 1 << j;
551  if(test & mask2){
552  if(plane == XPLANE) q2 += hQvsTX[j]->GetBinContent(i+1);
553  if(plane == YPLANE) q2 += hQvsTY[j]->GetBinContent(i+1);
554  }
555  }
556  if(q2>0) nCom++;
557 
558  }
559 
560 
561  if(qtot1<=0) return -1;
562  // cout << mask1 << " + " << mask2 << " => " << nCom << endl;
563 
564  return nCom;
565 }
566 
567 
568 TH1F* HarpoMatching::GetCompoundHist(ULong64_t mask, Int_t plane)
569 {
570 
571  if(gHarpoDebug>1)
572  Info("GetCompoundHist","%llX %d",mask,plane);
573 
574  TH1F* h = new TH1F(Form("hQvsTX_%lld_%d",mask,plane),";time bin;Q",NADC,0,NADC);
575  for(Int_t j = 0; j<64; j++){
576  ULong64_t test = 1 << j;
577  if(test & mask){
578  if(plane == XPLANE) h->Add(hQvsTX[j]);
579  if(plane == YPLANE) h->Add(hQvsTY[j]);
580  }
581  }
582 
583  return h;
584 }
585 
586 
587 
588 
589 
591 {
592 
593  if(gHarpoDebug>1)
594  Info("InitEventNew","Init");
595  hQxyVsNcomEvent->Reset();
596  hCoverageXEvent->Reset();
597  hCoverageYEvent->Reset();
598  hChi2Event->Reset();
599  for(Int_t j=0; j<NTRACK; j++){
600  hQvsTX[j]->Reset();
601  hQvsTY[j]->Reset();
602  fMask[j][0] = 0;
603  fMask[j][1] = 0;
604  }
605 
606  HarpoRecoEvent* reco = fEvt->GetRecoEvent();
607  TClonesArray* clArray = reco->GetClustersArray();
608  Int_t nCl = clArray->GetEntries();
609  TClonesArray* trArray = reco->GetTracksArray();
610  Int_t Ntr = trArray->GetEntries();
611  if(gHarpoDebug>1)
612  Info("InitEventNew","Ntracks = %d",Ntr);
613  Int_t used[NCHAN][NADC][2];
614  for(Int_t i = 0; i<NCHAN; i++)
615  for(Int_t j = 0; j<NADC; j++)
616  for(Int_t k = 0; k<2; k++)
617  used[i][j][k] = 0;
618  HarpoDccMap* m[2];
619  m[0] = fEvt->GetDccMap(0);
620  m[1] = fEvt->GetDccMap(1);
621  fTrMax[0] = -1;
622  fTrMax[1] = -1;
623  for(Int_t icl = 0; icl<nCl; icl++){
624  HarpoRecoClusters* cluster = (HarpoRecoClusters*)clArray->At(icl);
625  Int_t type = cluster->GetType();
626  Int_t ind = cluster->GetIndex();
627  Int_t ind2 = cluster->GetIfirst();
628  Double_t mean = cluster->GetMean();
629  Int_t width = cluster->GetWidth();
630  Int_t plane = cluster->GetPlane();
631  Int_t nTr = cluster->GetNtr();
632  //Info("InitEventNew","icl = %d, nTr = %d", icl, nTr);
633  if(nTr<1) continue;
634  // Double_t q = 0;
635 
636 
637  // for(Int_t k = Int_t(mean) - width; k< Int_t(mean) + width; k++){
638  // Int_t i, j;
639  // if(type == CCLUSTER){ i = ind; j = k;}
640  // if(type == TCLUSTER){ i = k; j = ind;}
641 
642  Int_t imin = 0, imax = 0, jmin = 0, jmax = 0;
643  if(type == CCLUSTER){
644  imin = ind;
645  imax = ind;
646  jmin = Int_t(mean) - width;
647  jmin = Int_t(mean) + width -1;
648  }
649  if(type == TCLUSTER){
650  jmin = ind;
651  jmax = ind;
652  imin = Int_t(mean) - width;
653  imin = Int_t(mean) + width -1;
654  }
655  if(type == BLOCCLUSTER){
656  jmin = ind2%NADC;
657  jmax = width%NADC;
658  imin = ind2/NADC;
659  imax = width/NADC;
660  }
661  for(Int_t i = imin; i<=imax; i++){
662  for(Int_t j = jmin; j<=jmax; j++){
663  //Info("InitEventNew","%d %d",i,j);
664  if(i<0 || i>=NCHAN) continue;
665  if(j<0 || j>=NADC) continue;
666  Double_t qTmp = m[plane]->GetData(i,j);
667  if(qTmp<0) continue;
668  if(used[i][j][plane] == 1) continue;
669  used[i][j][plane] = 1;
670  for(Int_t k = 0; k<nTr; k++){
671  Int_t itr = cluster->GetIdClusterTrack(k);
672  if(itr<0) continue;
673  if(itr>fTrMax[plane]) fTrMax[plane]= itr;
674  if(plane == XPLANE){
675  hQvsTX[itr]->Fill(j,qTmp);
676  }
677  if(plane == YPLANE){
678  hQvsTY[itr]->Fill(j,qTmp);
679  }
680  }
681  }
682  }
683  }
684  if(gHarpoDebug>1){
685  for(Int_t itr = 0; itr<NTRACK; itr++){
686  if(hQvsTY[itr]->Integral()>0)
687  Info("InitEventNew","TrackY %d: %g",itr,hQvsTY[itr]->Integral());
688  if(hQvsTX[itr]->Integral()>0)
689  Info("InitEventNew","TrackX %d: %g",itr,hQvsTX[itr]->Integral());
690  }
691  }
692 
693  return Ntr;
694 }
695 
696 
697 void HarpoMatching::Matching(TH1F* hX, TH1F* hY, Double_t &coverageX, Double_t &coverageY, Double_t &chi2)
698 {
699  coverageX = -1;
700  coverageY = -1;
701  chi2 = -1;
702 
703  Double_t qTotX = hX->Integral();
704  Double_t qTotY = hY->Integral();
705 
706  if(gHarpoDebug>1)
707  Info("Matching","Qx = %g, Qy = %g",qTotX,qTotY);
708  if(qTotX<200) return;
709  if(qTotY<200) return;
710 
711  // Double_t chi2TroncNorm=0;
712  // Int_t nComNonZTronc=0;
713 
714  Double_t dChi2[NADC];
715  Int_t nComNonZ = 0, nNZX = 0, nNZY = 0;
716 
717  for(Int_t j=0;j<NADC;j++){ // for each time bin, get charge ratio X/Y = (f*Qx - Qy)/sqrt(f*Qx*Qy)
718  Double_t qX = hX->GetBinContent(j+1);
719  Double_t qY = hY->GetBinContent(j+1);
720  dChi2[j] = 0;
721  if(qX>=20) nNZX++;
722  if(qY>=20) nNZY++;
723  if(qX<20 || qY<20) continue;
724  Double_t diff = (FacXY * qY - qX);
725  Double_t prod = FacXY * qY * qX;
726  dChi2[j] = diff * diff / prod;
727  nComNonZ++;
728  if(gHarpoDebug>2)
729  Info("Matching","%g %d",dChi2[j],nComNonZ);
730  }
731 
732  if(nComNonZ<10){ // for short overlap, compare total charge
733  Double_t rQxy= qTotX / qTotY / FacXY;
734  // hQxyVsNcom->Fill(rQxy,nComNonZ);
735  hQxyVsNcom->Fill(rQxy,qTotX);
736  hQxyVsNcomEvent->Fill(rQxy,nComNonZ);
737  if(TMath::Abs(rQxy-1)<0.1){
738  chi2 = 2;
739  // chi2TroncN[ntestmatch] = 2;
740  // ntestmatch++;
741  }
742  return;
743  }
744 
745  Int_t* indexTmp = new Int_t[NADC];
746  TMath::Sort(NADC,dChi2,indexTmp,kFALSE);
747  Int_t nComNonZTronc = nComNonZ * FacTronc ;
748  Double_t chi2Tronc=0;
749 
750  Int_t nNZ = 0, k = 0;
751  while(k<NADC && nNZ<nComNonZTronc){
752  Int_t ind = indexTmp[k];
753  k++;
754  if(dChi2[ind]<=0) continue;
755  chi2Tronc += dChi2[ind];
756  nNZ++;
757  }
758  delete[] indexTmp;
759  if(chi2Tronc<=0) return;
760  if(nComNonZTronc<=0) return;
761 
762 
763  if(gHarpoDebug>1)
764  Info("Matching","nComNonZTronc = %d * %g = %d",nComNonZ,FacTronc,nComNonZTronc);
765 
766  coverageX = nComNonZ * 1. / nNZX;
767  coverageY = nComNonZ * 1. / nNZY;
768  chi2 = chi2Tronc/nComNonZTronc;
769 
770  hCoverageX->Fill(coverageX);
771  hCoverageY->Fill(coverageY);
772  hChi2->Fill(chi2);
773  hCoverageXEvent->Fill(coverageX);
774  hCoverageYEvent->Fill(coverageY);
775  hChi2Event->Fill(chi2);
776 }
777 
778 
779 
780 
781 TH1* HarpoMatching::GetHist(Int_t i, Int_t match)
782 {
783  if(i == 0 || i == 1){
784  if(gHarpoDebug>1)
785  Info("GetHist","%d %d (%llX",i,match,fMask[match][i]);
786  if(match<0 || match>= NTESTMAT) return 0;
787  }
788 
789  switch(i){
790  // case 0: return hQvsTX[match];
791  // case 1: return hQvsTY[match];
792  case 0: return GetCompoundHist(fMask[match][XPLANE], XPLANE);
793  case 1: return GetCompoundHist(fMask[match][YPLANE], YPLANE);
794  case 2: return hQxyVsNcom;
795  case 3: return hCoverageX;
796  case 4: return hCoverageY;
797  case 5: return hChi2;
798  case 6: return hQxyVsNcomEvent;
799  case 7: return hCoverageXEvent;
800  case 8: return hCoverageYEvent;
801  case 9: return hChi2Event;
802  }
803  return 0;
804 }
805 
806 
807 
808 
809 
810 
811 void HarpoMatching::DisplayAnalysis(TRootEmbeddedCanvas* ecTab, TGListBox* /* info */)
812 {
813  TCanvas* cTab = ecTab->GetCanvas();
814  cTab->GetPad(1)->Delete();
815  cTab->GetPad(2)->Delete();
816  cTab->Divide(2);
817 
818 
819  cTab->GetPad(2)->Divide(2,2);
820  TH2F* hQxyVsNcomEvent = (TH2F*)GetHist(6);
821  Info("DisplayMatching","%g",hQxyVsNcomEvent->GetEntries());
822  MakeNiceHisto(hQxyVsNcomEvent,cTab->GetPad(2)->GetPad(1),"colz");
823  TH1F* hCoverageXEvent = (TH1F*)GetHist(7);
824  TH1F* hCoverageYEvent = (TH1F*)GetHist(8);
825  hCoverageXEvent->SetLineColor(kBlue);
826  hCoverageYEvent->SetLineColor(kRed);
827  MakeNiceHisto(hCoverageXEvent,cTab->GetPad(2)->GetPad(3));
828  cTab->GetPad(2)->cd(3);
829  hCoverageXEvent->DrawCopy("same");
830  TH1F* hChi2Event = (TH1F*)GetHist(9);
831  TH1F* hChi2Run = (TH1F*)((GetHist(5))->Clone("hChi2Run"));
832  MakeNiceHisto(hChi2Event,cTab->GetPad(2)->GetPad(4));
833  hChi2Run->Scale(hChi2Event->GetMaximum()/hChi2Run->GetMaximum());
834  hChi2Run->SetLineColor(kRed);
835  hChi2Run->DrawCopy("same");
836  hChi2Run->Delete();
837  cTab->GetPad(2)->GetPad(4)->SetLogx();
838 
839  cTab->Update();
840 
841  // Int_t nMatch = fMatching->GetNgoodmatch();
842  HarpoRecoEvent* reco = fEvt->GetRecoEvent();
843 
844  // TClonesArray* trArray = reco->GetTracksArray();
845  // Int_t nTr = trArray->GetEntries();
846  TClonesArray* matchArray = reco->GetMatchingArray();
847  Int_t nMatch = matchArray->GetEntries();
848  Info("DisplayMatching","%d tracks",nMatch);
849  if(nMatch<1) return;
850  TLatex* latex = new TLatex();
851  latex->SetTextFont(132);
852  latex->SetTextAlign(12);
853  latex->SetTextSize(0.08);
854 
855  Int_t nX = Int_t(TMath::Sqrt(nMatch - 1)) + 1;
856  Int_t nY = Int_t((nMatch - 1)/nX) + 1;
857  cTab->GetPad(1)->Divide(nX,nY);
858  for(Int_t i = 0; i<nMatch; i++){
859  // cTab->GetPad(1)->cd(i+1);
860  HarpoRecoMatching* match = (HarpoRecoMatching*)matchArray->At(i);
861  DrawMatching(match,cTab->GetPad(1)->GetPad(i+1));
862 
863  // hX->Delete();
864  // hY->Delete();
865  }
866 
867 
868 
869 
870 
871  cTab->Update();
872 
873 }
874 
875 
876 
877 void HarpoMatching::DrawMatching(HarpoRecoMatching* match, TVirtualPad* c)
878 {
879 
880  Int_t iTrX1 = match->GetiMatchTrX();
881  Int_t iTrX2 = match->GetiMatchTrX2();
882  Int_t iTrY1 = match->GetiMatchTrY();
883  Int_t iTrY2 = match->GetiMatchTrY2();
884 
885 
886  TH1F* hX1 = (TH1F*)GetHist(0,iTrX1);
887  TH1F* hY1 = (TH1F*)GetHist(1,iTrY1);
888  if(!hX1) return;
889  if(!hY1) return;
890  SetHistStyle(hX1);
891  SetHistStyle(hY1);
892  TH1F* hXtot = (TH1F*)hX1->Clone("hXtot");
893  TH1F* hYtot = (TH1F*)hY1->Clone("hYtot");
894  SetHistStyle(hXtot);
895  SetHistStyle(hYtot);
896  hXtot->SetLineColor(kBlue);
897  hYtot->SetLineColor(kRed);
898  hXtot->SetLineStyle(1);
899  hYtot->SetLineStyle(1);
900  hXtot->SetLineWidth(2);
901  hYtot->SetLineWidth(2);
902 
903  hX1->SetLineColor(kBlue+3);
904  hY1->SetLineColor(kRed+3);
905  hX1->SetLineStyle(2);
906  hY1->SetLineStyle(2);
907  THStack* hX = new THStack("hX",";T [30ns bins];Q");
908  THStack* hY = new THStack("hY",";T [30ns bins];Q");
909 
910  hX->Add(hX1);
911  hY->Add(hY1);
912  if(iTrX2 != iTrX1){
913  TH1F* hX2 = (TH1F*)GetHist(0,iTrX2);
914  if(!hX2) return;
915  SetHistStyle(hX2);
916  hX2->SetLineColor(kBlue+3);
917  hX2->SetLineStyle(2);
918  hX->Add(hX2);
919  hXtot->Add(hX2);
920  }
921  if(iTrY2 != iTrY1){
922  TH1F* hY2 = (TH1F*)GetHist(1,iTrY2);
923  if(!hY2) return;
924  SetHistStyle(hY2);
925  hY2->SetLineColor(kRed+3);
926  hY2->SetLineStyle(2);
927  hY->Add(hY2);
928  hYtot->Add(hY2);
929  }
930  MakeNiceHisto(hXtot,c);
931  hX->Draw("same");
932  hY->Draw("same");
933  hXtot->DrawCopy("same");
934  hYtot->DrawCopy("same");
935  // latex->DrawLatex(50,0.8*hX->GetMaximum(),Form("X: %d, Y: %d",fMatching->GetXtrack(i),fMatching->GetYtrack(i)));
936 
937  TLatex* latex = new TLatex();
938  latex->SetTextFont(132);
939  latex->SetTextAlign(12);
940  latex->SetTextSize(0.08);
941 
942  if(iTrX2 != iTrX1)
943  latex->DrawLatex(50,0.8*hX->GetMaximum(),Form("X: %d + %d, Y: %d",iTrX1,iTrX2,iTrY1));
944  if(iTrY2 != iTrY1)
945  latex->DrawLatex(50,0.8*hX->GetMaximum(),Form("X: %d, Y: %d + %d",iTrX1,iTrY1,iTrY2));
946  if(iTrX2 == iTrX1 && iTrY1 == iTrY2)
947  latex->DrawLatex(50,0.8*hX->GetMaximum(),Form("X: %d, Y: %d",iTrX1,iTrY1));
948 
949 }
950 
951 
952 void HarpoMatching::ConfigFrame(TGMainFrame* fMain, Int_t id)
953 {
954 
955  UInt_t xsize = 200;
956  UInt_t ysize2 = 20;
957  UInt_t ysize = 9*ysize2;
958  TGTransientFrame* main = new TGTransientFrame(gClient->GetRoot(), fMain, xsize, ysize);
959  main->Connect("CloseWindow()", "HarpoRecoMonitorGui", main, "CloseWindow()");
960  main->DontCallClose(); // to avoid double deletions.
961 
962  // use hierarchical cleaning
963  main->SetCleanup(kDeepCleanup);
964 
965  TGVerticalFrame* f213 = new TGVerticalFrame(main,xsize,ysize,kVerticalFrame);
966  TGLabel* fLabel = new TGLabel(f213, "Clustering 2D blocs");
967 
968 
969  TGHorizontalFrame* FacXYFrame = new TGHorizontalFrame(f213,xsize,ysize2,kHorizontalFrame);
970  TGLabel* FacXYLabel = new TGLabel(FacXYFrame, "Qx/Qy");
971  fChooseFacXY = new TGNumberEntry(FacXYFrame);
972  fChooseFacXY->SetNumber(FacXY);
973 
974  TGHorizontalFrame* FacTroncFrame = new TGHorizontalFrame(f213,xsize,ysize2,kHorizontalFrame);
975  TGLabel* FacTroncLabel = new TGLabel(FacTroncFrame, "Truncation");
976  fChooseFacTronc = new TGNumberEntry(FacTroncFrame);
977  fChooseFacTronc->SetNumber(FacTronc);
978 
979  TGHorizontalFrame* FacRecFrame = new TGHorizontalFrame(f213,xsize,ysize2,kHorizontalFrame);
980  TGLabel* FacRecLabel = new TGLabel(FacRecFrame, "X size");
981  fChooseFacRec = new TGNumberEntry(FacRecFrame);
982  fChooseFacRec->SetNumber(FacRec);
983 
984  TGHorizontalFrame* Chi2TroncNcutFrame = new TGHorizontalFrame(f213,xsize,ysize2,kHorizontalFrame);
985  TGLabel* Chi2TroncNcutLabel = new TGLabel(Chi2TroncNcutFrame, "X size");
986  fChooseChi2TroncNcut = new TGNumberEntry(Chi2TroncNcutFrame);
987  fChooseChi2TroncNcut->SetNumber(Chi2TroncNcut);
988 
989  TGHorizontalFrame* NcomMinFrame = new TGHorizontalFrame(f213,xsize,ysize2,kHorizontalFrame);
990  TGLabel* NcomMinLabel = new TGLabel(NcomMinFrame, "X size");
991  fChooseNcomMin = new TGNumberEntry(NcomMinFrame);
992  fChooseNcomMin->SetNumber(fNcomMin);
993 
994 
995 
996 
997  TGTextButton* setConf = new TGTextButton(f213,"Save Config",id);
998  setConf->Associate(fMain);
999 
1000  TGLayoutHints* fLayout1 = new TGLayoutHints(kLHintsLeft ,5,5,5,5);
1001  TGLayoutHints* fLayout2 = new TGLayoutHints(kLHintsRight ,5,5,5,5);
1002  TGLayoutHints* fLayout3 = new TGLayoutHints(kLHintsTop | kLHintsExpandX ,5,5,5,5);
1003  TGLayoutHints* fLayout4 = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,5,5,5,5);
1004 
1005  main->AddFrame(f213,fLayout4);
1006  f213->AddFrame(fLabel,fLayout3);
1007 
1008  f213->AddFrame(FacXYFrame,fLayout3);
1009  FacXYFrame->AddFrame(FacXYLabel,fLayout1);
1010  FacXYFrame->AddFrame(fChooseFacXY,fLayout2);
1011 
1012  f213->AddFrame(FacTroncFrame,fLayout3);
1013  FacTroncFrame->AddFrame(FacTroncLabel,fLayout1);
1014  FacTroncFrame->AddFrame(fChooseFacTronc,fLayout2);
1015 
1016  f213->AddFrame(FacRecFrame,fLayout3);
1017  FacRecFrame->AddFrame(FacRecLabel,fLayout1);
1018  FacRecFrame->AddFrame(fChooseFacRec,fLayout2);
1019 
1020  f213->AddFrame(Chi2TroncNcutFrame,fLayout3);
1021  Chi2TroncNcutFrame->AddFrame(Chi2TroncNcutLabel,fLayout1);
1022  Chi2TroncNcutFrame->AddFrame(fChooseChi2TroncNcut,fLayout2);
1023 
1024  f213->AddFrame(NcomMinFrame,fLayout3);
1025  NcomMinFrame->AddFrame(NcomMinLabel,fLayout1);
1026  NcomMinFrame->AddFrame(fChooseNcomMin,fLayout2);
1027 
1028  f213->AddFrame(setConf,fLayout3);
1029 
1030 
1031  main->MapSubwindows();
1032  main->MapWindow();
1033  main->Resize();
1034 
1035 }
1036 
1037 
1038 
1039 
1041 {
1042  if(!fChooseFacXY) return;
1043 
1044  FacXY = fChooseFacXY->GetNumber();
1045  FacTronc = fChooseFacTronc->GetNumber();
1046  FacRec = fChooseFacRec->GetNumber();
1047  Chi2TroncNcut = fChooseChi2TroncNcut->GetNumber();
1048  fNcomMin = fChooseNcomMin->GetNumber();
1049 
1050 }
1051 
1052 
1053 //plots de testmatching
1054 void HarpoMatching::Save(char * /* mode */)
1055 {
1056 
1057  OpenHistFile("recomatching");
1058 
1059  hQxyVsNcom->Write();
1060  hCoverageX->Write();
1061  hCoverageY->Write();
1062  hChi2->Write();
1063 
1064 }
void SetXend(Double_t val)
#define NTRACK
Int_t GetNcom(ULong64_t iTr, ULong64_t mask, Int_t plane)
#define XPLANE
Definition: HarpoConfig.h:24
#define NCHAN
Definition: HarpoDccMap.h:16
Double_t GetMean()
void AddIdClusterTrack(Int_t val)
Double_t GetData(Int_t i, Int_t j)
Set/Get Data Cell.
Definition: HarpoDccMap.cxx:84
int main(int argc, char **argv)
Definition: drawAnalyse.cxx:25
Double_t GetXend()
Double_t GetAngleTrack()
Track object, containing position, angle, charge and quality information.
void SetNclusterTrack(Int_t val)
Object containing the reconstruction information for one event (with array of HarpoRecoClusters Harpo...
Matching object, containing matched track number, and quality info.
#define BLOCCLUSTER
TClonesArray * GetMatchingArray()
void SetNtrack(Int_t val)
void Matching(TH1F *hX, TH1F *hY, Double_t &coverageX, Double_t &coverageY, Double_t &chi2)
Redefine empty default.
void RemoveAllClusterTrack()
Double_t GetX0()
Cluster object, containing position, charge and quality information.
void SetXstart(Double_t val)
void SetZend(Double_t val)
static int type
unpacked dcc data The class contains the data map for DCC or Feminos The data is stored as a 2D TMatr...
Definition: HarpoDccMap.h:29
Double_t GetZstart()
TVirtualPad * MakeNiceHisto(TH1 *hist, TVirtualPad *c1, const char *opt, Bool_t copy)
Int_t GetIdClusterTrack()
void SetZstart(Double_t val)
void SetX0(Double_t val)
#define NADC
Definition: HarpoDccMap.h:18
void SetHistStyle(TH1 *hist)
void DrawMatching(HarpoRecoMatching *match, TVirtualPad *c)
TDirectory * OpenHistFile(Int_t run, const char *dir, const char *extra="", Int_t update=0)
Definition: HarpoTools.cxx:55
#define TCLUSTER
Long64_t gHarpoDebug
Definition: HarpoDebug.cxx:9
#define YPLANE
Definition: HarpoConfig.h:25
void DisplayAnalysis(TRootEmbeddedCanvas *ecTab, TGListBox *info)
Bool_t Lookup(const char *path, Bool_t &val)
Lookup function for scalar values.
Int_t InitEventNew()
TH1F * GetCompoundHist(ULong64_t mask, Int_t plane)
void MakeCompoundTracks(Int_t iTr, ULong64_t mask, Int_t plane)
Double_t GetXstart()
void Save(char *mode=NULL)
void SetQtTrack(Int_t val)
#define NTESTMAT
Definition: HarpoMatching.h:30
Int_t CombineTracks(ULong64_t mask, Int_t plane)
void ConfigFrame(TGMainFrame *fMain, Int_t id)
#define CCLUSTER
void SetAngleTrack(Int_t val)
HarpoConfig * gHConfig
TClonesArray * GetTracksArray()
Int_t GetNclusterTrack()
TH1 * GetHist(Int_t i, Int_t match=-1)
Double_t GetZend()
TClonesArray * GetClustersArray()