26 #include "TLinearFitter.h"
50 if (plane != NULL )plane->
print();
60 for(Int_t itr = 0; itr<
NTRACK; itr++){
63 for(Int_t j = 0; j<10;j++){
70 for(Int_t i = 0; i<
NADC; i++){
72 for(Int_t k = 0; k<20; k++)
75 for(Int_t i = 0; i<
NCHAN; i++){
77 for(Int_t k = 0; k<20; k++)
86 for(Int_t i = 0; i<
NCHAN; i++){
87 for(Int_t j = 0; j<
NADC; j++){
94 Int_t nCl = clArray->GetEntries();
96 Warning(
"InitPlane",
"Too many clusters %d",nCl);
100 for(Int_t icl = 0; icl<nCl; icl++){
108 if(cluster->
GetPlane() != plane)
continue;
114 if(
NCcl[index]>=20)
continue;
119 if(
NTcl[index]>=20)
continue;
126 for(Int_t i = 0; i<
NCHAN; i++){
127 if(
NCcl[i]>0) Info(
"process",
"NCcl[%d] = %d",i,
NCcl[i]);
129 for(Int_t i = 0; i<
NADC; i++){
130 if(
NTcl[i]>0) Info(
"process",
"NTcl[%d] = %d",i,
NTcl[i]);
138 TArrayI*
HarpoKalman::FindNext(TMatrixD X, TMatrixD C, Double_t angle, Int_t iTr, TClonesArray* clArray, TArrayI* arr, Int_t ncl, Int_t plane, Int_t color, Int_t fill, Int_t smooth, Int_t qold)
141 return FindNextClosest(X,C,angle,iTr,clArray,arr,ncl,plane,color,fill,smooth,qold);
145 TArrayI*
HarpoKalman::FindNextClosest(TMatrixD X, TMatrixD C, Double_t angle, Int_t iTr, TClonesArray* clArray, TArrayI* arr, Int_t ncl, Int_t plane, Int_t color, Int_t fill, Int_t smooth, Int_t qold)
148 if(
fCanvas[plane]) gSystem->Sleep(0);
149 if(
gHarpoDebug>2) Info(
"FindNextClosest",
"angle = %g / %d = %g",angle,ncl,angle/ncl);
152 for(
int i = 0;i<4;i++){
153 for(
int j =0;j<4;j++){
163 Int_t fNskipRows = 6;
164 if(smooth == 2) fNskipRows = 30;
165 Double_t fRangeMax = 5;
168 Info(
"FindNextClosest",
"%f %f %f %f",X[0][0],X[1][0],X[2][0],X[3][0]);
170 Double_t angleOld = TMath::ATan2(X[2][0], X[3][0]);
172 Double_t distMin = 1000, meanMin = -10000, rangeMin = 0, angleMin = -1000, resMin = -1;
173 Int_t iclMin = -1, typeMin = -1, iMin = -1, kMin = -1, qMin = -1;
175 for(Int_t k = 1; k<=fNskipRows; k++){
176 if(k>distMin + kMin)
break;
182 if(X[3-
type][0]>0) I = Int_t(X[1-
type][0]+0.5) + k;
183 else I = Int_t(X[1-
type][0]+0.5) - k;
190 F[0][2]=(I-X[1-
type][0])*1./X[3-
type][0];
191 F[1][3]=(I-X[1-
type][0])*1./X[3-
type][0];
194 for(Int_t i = 0; i<n; i++){
198 else icl =
Ccl[I][i];
199 if(smooth == 0 &&
used[icl] > -1000)
continue;
200 if(smooth == 1 &&
used[icl] > -1000 &&
reused[icl] != 0)
continue;
205 if(cluster->
GetPlane() != plane)
continue;
206 if((cluster->
GetQuality() & 3) == 3)
continue;
208 Double_t mean = cluster->
GetMean();
210 Int_t q = cluster->
GetQ();
213 Info(
"FindNextClosest",
"#proj: %f %f %f %f",Xproj[0][0],Xproj[1][0],Xproj[2][0],Xproj[3][0]);
217 Double_t range = deltaRes*res + deltaScat*theta*k;
218 if(range>fRangeMax) range = fRangeMax;
220 Double_t dist = TMath::Abs(mean - Xproj[
type][0]);
224 if(type == 0) angleTmp = TMath::ATan2(mean - X[0][0], I - X[1][0] );
225 else angleTmp = TMath::ATan2(I - X[0][0], mean - X[1][0]);
226 Double_t dA = fmod(angleTmp - angle/ncl + 4*TMath::Pi(),2*TMath::Pi()) - TMath::Pi();
227 if(TMath::Abs(dA)<TMath::Pi()/2 && !(smooth == 1 &&
used[icl] == iTr))
continue;
229 Double_t dA2 = fmod(angleTmp - angleOld + 4*TMath::Pi(),2*TMath::Pi()) - TMath::Pi();
231 if(TMath::Abs(dA2)<TMath::Pi()*0.7 && !(smooth == 1 &&
used[icl] == iTr))
continue;
232 if(smooth == 1 &&
used[icl] == iTr) dist = 0;
234 if((dist < range || smooth == 2) && (dist+k<distMin || (dist == 0 && k<=kMin))){
243 if(smooth == 1) kMin = 100;
257 if(iclMin!=-1) ntr++;
270 Info(
"FindNextClosest",
"End of first pass (Ncl = %d). New seed: (%g, %g, %g, %g)",ncl,X[0][0],X[1][0],X[2][0],X[3][0]);
273 for(
int a = 0;a<4;a++){
274 for(
int b =0;b<4;b++){
288 arr =
FindNextClosest(X, Corig, -angle, iTr, clArray, arr, ncl, plane, color, fill, 1, qMin);
292 Info(
"FindNextClosest",
"End of last pass (%d clusters)",ncl);
302 Info(
"FindNextClosest",
"Add New Cluster");
313 Double_t inc = resMin;
314 if(inc==0) inc = 0.000001;
315 Double_t v = X[2][0]*X[2][0] + X[3][0]*X[3][0];
316 for(
int i = 0;i<4;i++){
317 for(
int j =0;j<4;j++){
320 Q[i][j]=theta*theta*(1-X[i][0]*X[i][0]/v);
326 for(
int i = 0;i<2;i++){
327 for(
int j =0;j<2;j++){
351 TMatrixD Cprojinv(4,4);
353 F[0][2]=(iMin-X[1-typeMin][0])*1./X[3-typeMin][0];
354 F[1][3]=(iMin-X[1-typeMin][0])*1./X[3-typeMin][0];
359 M[1-typeMin][0] = iMin;
360 M[typeMin][0] = meanMin;
364 Cinv=Cprojinv+Ht*G*H;
367 Xnew=Cnew*((Cprojinv*Xproj)+(Ht*G*M));
371 Float_t x[3] = {(Float_t) (X[1-typeMin][0]),
374 Float_t y[3] = {(Float_t) (X[typeMin][0]),
375 (Float_t) (Xproj[typeMin][0]-rangeMin),
376 (Float_t) (Xproj[typeMin][0]+rangeMin)};
378 Info(
"FindNextClosest",
"%g %g %g %g %g %g",x[0],y[0],x[1],y[1],x[2],y[2]);
380 if(typeMin ==
TCLUSTER) triangle =
new TPolyLine(3,x,y,
"FL");
381 else triangle =
new TPolyLine(3,y,x,
"FL");
382 triangle->SetLineColor(kBlack);
384 triangle->SetFillColor(color);
385 triangle->SetFillStyle(fill);
387 triangle->Draw(
"FL");
388 fHist[plane]->GetXaxis()->SetRangeUser(X[0][0]-20,X[0][0]+20);
389 fHist[plane]->GetYaxis()->SetRangeUser(X[1][0]-20,X[1][0]+20);
393 if(smooth == 1)
reused[iclMin] = 1;
395 if(smooth == 2)
used[iclMin] = 1000;
397 Bool_t skip = kFALSE;
400 while(arr->At(kcl) != 0){
401 if(arr->At(kcl) == 0)
break;
402 if(arr->At(kcl) == iclMin+1){
410 arr->AddAt(iclMin+1,kcl);
413 Info(
"FindNextClosest",
"Add cluster %d, (%d %p) %d",iclMin,iTr,arr,
fStartIndex[iTr]%10);
418 fStartDirZ[iTr][fStartIndex[iTr]%10] = X[2][0];
419 fStartDirX[iTr][fStartIndex[iTr]%10] = X[3][0];
425 cluster->
SetZfit(0,Xnew[0][0]);
426 cluster->
SetXfit(0,Xnew[1][0]);
431 Info(
"FindNextClosest",
"Test %g %d %p %p %d %d %d %d %d", angle, iTr, clArray, arr, ncl, plane, color, fill,smooth);
432 arr =
FindNextClosest(Xnew, Cnew, angle, iTr, clArray, arr, ncl, plane, color, fill,smooth,qMin);
481 hNcl =
new TH1F(
"hNcl",
"hNcl",500,0,500);
483 const Int_t nbinsDist = 200;
484 Double_t xminDist = 1;
485 Double_t xmaxDist = 10000;
486 Double_t logxminDist = TMath::Log(xminDist);
487 Double_t logxmaxDist = TMath::Log(xmaxDist);
488 Double_t binwidthDist = (logxmaxDist-logxminDist)/nbinsDist;
489 Double_t xbinsDist[nbinsDist+1];
490 xbinsDist[0] = xminDist;
491 for (Int_t i=1;i<=nbinsDist;i++)
492 xbinsDist[i] = TMath::Exp(logxminDist+i*binwidthDist);
495 const Int_t nbinsTheta = 100;
496 Double_t xminTheta = 1e-5;
497 Double_t xmaxTheta = 2;
498 Double_t logxminTheta = TMath::Log(xminTheta);
499 Double_t logxmaxTheta = TMath::Log(xmaxTheta);
500 Double_t binwidthTheta = (logxmaxTheta-logxminTheta)/nbinsTheta;
501 Double_t xbinsTheta[nbinsTheta+1];
502 xbinsTheta[0] = xminTheta;
503 for (Int_t i=1;i<=nbinsTheta;i++)
504 xbinsTheta[i] = TMath::Exp(logxminTheta+i*binwidthTheta);
506 hDistTracks =
new TH1F(
"hDistTracks",
"",nbinsDist,xbinsDist);
507 hDistMinTracks =
new TH1F(
"hDistMinTracks",
"",nbinsDist,xbinsDist);
508 hThetaTracks =
new TH1F(
"hThetaTracks",
"",nbinsTheta,xbinsTheta);
510 hThetaTracksNtr =
new TH2F(
"hThetaTracksNtr",
"",nbinsDist,xbinsDist,nbinsTheta,xbinsTheta);
511 for(Int_t i = 0; i<10; i++)
512 hThetaDist[i] =
new TH2F(Form(
"hThetaDist%d",i),
"",nbinsDist,xbinsDist,nbinsTheta,xbinsTheta);
515 const Int_t nbinsQ = 100;
516 Double_t xminQ = 1e-3;
517 Double_t xmaxQ = 1e3;
518 Double_t logxminQ = TMath::Log(xminQ);
519 Double_t logxmaxQ = TMath::Log(xmaxQ);
520 Double_t binwidthQ = (logxmaxQ-logxminQ)/nbinsQ;
521 Double_t xbinsQ[nbinsQ+1];
523 for (Int_t i=1;i<=nbinsQ;i++)
524 xbinsQ[i] = TMath::Exp(logxminQ+i*binwidthQ);
525 fHistQQtestVsDist =
new TH2F(
"fHistQQtestVsDist",
"",nbinsQ,xbinsQ,nbinsDist,xbinsDist);
526 fHistQQmin =
new TH2F(
"fHistQQmin",
"",nbinsQ,xbinsQ,nbinsDist,xbinsDist);
553 for(Int_t i = 0; i<10; i++){
Double_t fStartPointZ[NTRACK][10]
Double_t GetData(Int_t i, Int_t j)
Set/Get Data Cell.
void Save(char *mode=NULL)
Int_t InitPlane(TClonesArray *clArray, Int_t plane)
A virtual class for Kalman tracking.
TArrayI * FindNextClosest(TMatrixD X, TMatrixD C, Double_t angle, Int_t Ntr, TClonesArray *clArray, TArrayI *arr, Int_t ncl, Int_t plane, Int_t color, Int_t fill, Int_t smooth, Int_t q)
TH1F * hNcl
Redefine empty default.
Cluster object, containing position, charge and quality information.
TFile * OpenHistFile(const char *ananame)
unpacked dcc data The class contains the data map for DCC or Feminos The data is stored as a 2D TMatr...
ULong64_t fMapTmp[NCHAN][NADC]
Double_t GetResolution(HarpoRecoClusters *cl)
Int_t GetIdClusterTrack()
void SetXfit(Int_t i, Double_t val)
Double_t fStartDirX[NTRACK][10]
Int_t fStartIndex[NTRACK]
HarpoEventHeader * GetHeader()
TArrayI * FindNext(TMatrixD X, TMatrixD C, Double_t angle, Int_t Ntr, TClonesArray *clArray, TArrayI *arr, Int_t ncl, Int_t plane, Int_t color, Int_t fill, Int_t smooth, Int_t q)
Double_t fStartPointX[NTRACK][10]
const ULong_t gkNDetectors
Double_t fStartDirZ[NTRACK][10]
HarpoDccMap * GetDccMap(Long_t plane=XDCC)
void SetZfit(Int_t i, Double_t val)