28 #include "TLinearFitter.h"
52 if (plane != NULL )plane->
print();
61 Info(
"process",
"Event %ld",
nEvents);
67 for(Int_t i = 0; i<
NTRACK; i++)
82 for(
int a = 0;a<4;a++){
83 for(
int b =0;b<4;b++){
88 Corig[a][b]=(2*inc)*(2*inc)+theta*theta;
95 for(Int_t plane = 0; plane<2; plane++){
98 Int_t counter = 0, color = 51, nClLeftOld = 0, nTry = 0;
105 Info(
"process",
"Look for seeds on plane %d %d",plane,counter);
108 Int_t iMin =
NCHAN, iMax = 0, jMin =
NADC, jMax = 0;
109 Int_t nClLeft =
GetMapEdges(clArray,plane,iMin,iMax,jMin,jMax);
112 Info(
"process",
"Only %d clusters left",nClLeft);
115 if(nClLeft==nClLeftOld){
117 Info(
"process",
"No new tracks, %d clusters left",nClLeft);
120 nClLeftOld = nClLeft;
125 for(Int_t side = 0; side<4; side++){
126 Int_t
type = -1, index0 = 0, index1 = 0, imax0 = 0, imax1 = 0, sign = 0;
128 case 0: type =
TCLUSTER; index0 = jMax; sign = -1;
break;
129 case 1: type =
CCLUSTER; index0 = iMax; sign = -1;
break;
130 case 2: type =
CCLUSTER; index0 = iMin; sign = +1;
break;
131 case 3: type =
TCLUSTER; index0 = jMin; sign = +1;
break;
135 index1 = index0 + sign;
137 if(index0<0 || index0>=
NADC)
continue;
138 while(
NTcl[index1]<=0 && TMath::Abs(index1-index0) < 50) index1 += sign;
139 if(index1<0 || index1>=
NADC)
continue;
140 imax0 =
NTcl[index0];
141 imax1 =
NTcl[index1];
143 if(index0<0 || index0>=
NCHAN)
continue;
144 while(
NCcl[index1]<=0 && TMath::Abs(index1-index0) < 50) index1 += sign;
145 if(index1<0 || index1>=
NCHAN)
continue;
146 imax0 =
NCcl[index0];
147 imax1 =
NCcl[index1];
151 if(TMath::Abs(index1-index0) >= 10){
152 for(Int_t i0 = 0; i0<imax0; i0++){
156 else icl0 =
Tcl[index0][i0];
160 if(
gHarpoDebug>1) Info(
"process",
"side %d: i0 = %d, i1 = %d",side,index0,index1);
166 Info(
"process",
"side %d => index = %d %d (%d %d)",side,index0,index1,imax0,imax1);
167 for(Int_t i0 = 0; i0<imax0; i0++){
171 else icl0 =
Tcl[index0][i0];
175 if(
used[icl0] != -1000)
continue;
177 for(Int_t i1 = 0; i1<imax1; i1++){
180 else icl1 =
Tcl[index1][i1];
183 if(
used[icl1] != -1000)
continue;
190 if(
gHarpoDebug>1) Info(
"process",
"nTry = %d",nTry);
191 FindTrack(clArray,icl0,icl1,Corig,plane,color);
203 fHist[plane]->GetXaxis()->SetRangeUser(0,511);
204 fHist[plane]->GetYaxis()->SetRangeUser(0,304);
216 for(Int_t itr = 0; itr<
NTRACK; itr++){
225 for(Int_t j = 0; j<10;j++){
238 for(Int_t i = 0; i<
NADC; i++){
240 for(Int_t k = 0; k<20; k++)
243 for(Int_t i = 0; i<
NCHAN; i++){
245 for(Int_t k = 0; k<20; k++)
254 for(Int_t i = 0; i<
NCHAN; i++){
255 for(Int_t j = 0; j<
NADC; j++){
262 Int_t nCl = clArray->GetEntries();
264 Warning(
"InitPlane",
"Too many clusters %d",nCl);
268 for(Int_t icl = 0; icl<nCl; icl++){
276 if(cluster->
GetPlane() != plane)
continue;
282 if(
NCcl[index]>=20)
continue;
287 if(
NTcl[index]>=20)
continue;
294 for(Int_t i = 0; i<
NCHAN; i++){
295 if(
NCcl[i]>0) Info(
"process",
"NCcl[%d] = %d",i,
NCcl[i]);
297 for(Int_t i = 0; i<
NADC; i++){
298 if(
NTcl[i]>0) Info(
"process",
"NTcl[%d] = %d",i,
NTcl[i]);
311 iMin =
NCHAN+1; iMax = -1; jMin =
NADC+1; jMax = -1;
312 Int_t nCl = clArray->GetEntries();
313 for(Int_t icl = 0; icl<nCl; icl++){
317 if(
used[icl] != -1000)
continue;
320 if(cluster->
GetPlane() != plane)
continue;
326 if(index>jMax) jMax = index;
327 if(index<jMin) jMin = index;
330 if(index>iMax) iMax = index;
331 if(index<iMin) iMin = index;
337 Info(
"process",
"%d %d %d %d (%d)",iMin, iMax, jMin, jMax, nClLeft);
346 Info(
"FindTrack",
"%d %d",icl0,icl1);
358 if(type != 0 && type != 1)
return;
360 Double_t x0 = cluster0->
GetMean();
361 Double_t x1 = cluster1->
GetMean();
362 Double_t index0 = cluster0->
GetIndex();
363 Double_t index1 = cluster1->
GetIndex();
364 Int_t q0 = cluster0->
GetQ();
366 if(TMath::Abs(x0-x1)>15)
return;
369 Xorig[1-
type][0] = index0;
370 Xorig[2+
type][0] = x1-x0;
371 Xorig[3-
type][0] = index1-index0;
373 Info(
"process",
"FindNext(%f,%f,%f,%f,%d)",Xorig[0][0],Xorig[1][0],Xorig[2][0],Xorig[3][0],
fNtr[plane]);
374 if(TMath::Abs(Xorig[2+type][0]/Xorig[3-type][0])>1.5)
return;
377 TArrow* arrow =
new TArrow();
378 arrow->SetLineColor(kBlack);
379 arrow->SetFillColor(color);
381 arrow->DrawArrow(Xorig[0][0],Xorig[1][0],Xorig[0][0]+Xorig[2][0],Xorig[1][0]+Xorig[3][0],0.01);
382 fHist[plane]->GetXaxis()->SetRangeUser(Xorig[0][0] - 10,Xorig[0][0] + 10);
383 fHist[plane]->GetYaxis()->SetRangeUser(Xorig[1][0] - 10,Xorig[1][0] + 10);
393 Double_t angleorig = TMath::ATan2(Xorig[2][0],Xorig[3][0]);
394 FindNext(Xorig,Corig,angleorig,
fNtr[plane],clArray,0,1,plane,color,3001,0,q0);
396 Info(
"process",
"Found new track %d",
fNtr[plane]);
398 Int_t nClTr =
AddTrack(clArray,plane);
403 Info(
"process",
"Track %d: %d clusters",
fNtr[plane]-1,nClTr);
419 Warning(
"AddTrack",
"Wrong track number %d",
fNtr[plane]);
432 Info(
"AddTrack",
"New seed: (%g, %g, %g, %g)",X[0][0],X[1][0],X[2][0],X[3][0]);
435 for(
int a = 0;a<4;a++){
436 for(
int b =0;b<4;b++){
447 TArrayI* arr =
new TArrayI(2000);
448 Double_t angleorig = TMath::ATan2(X[2][0],X[3][0]);
449 arr =
FindNextClosest(X, Corig, angleorig,fNtr[plane], clArray, arr, 1,plane, kGray, 3002, 2, -1);
451 for(Int_t i = 0; i<2000; i++){
452 if(arr->At(i)-1<0)
break;
461 if(
fGraphs[plane][fNtr[plane]])
462 fGraphs[plane][fNtr[plane]]->Delete();
463 fGraphs[plane][fNtr[plane]] =
new TGraph();
465 fGraphs[plane][fNtr[plane]]->SetName(Form(
"TrackX%d",fNtr[plane]));
467 fGraphs[plane][fNtr[plane]]->SetName(Form(
"TrackY%d",fNtr[plane]));
469 for(Int_t i = 0; i<n; i++){
470 Int_t icl = arr->At(i) - 1;
473 if(icl>=4000)
continue;
474 fTrack[icl] = fNtr[plane];
476 Double_t mean = cluster->
GetMean();
481 fGraphs[plane][fNtr[plane]]->SetPoint(
fGraphs[plane][fNtr[plane]]->GetN(),index,mean);
485 fGraphs[plane][fNtr[plane]]->SetPoint(
fGraphs[plane][fNtr[plane]]->GetN(),mean,index);
507 Double_t fThetaMin = -0.5;
508 Double_t fDminForward = 20, fDminTransverse = 2;
513 Info(
"SpliceTracks",
"plane %d: Ntracks = %d",plane,
fNtr[plane]);
515 Double_t x[
fNtr[plane]][2], z[fNtr[plane]][2], th[fNtr[plane]][2];
516 Double_t px[fNtr[plane]][2], pz[fNtr[plane]][2];
517 Int_t spliced[fNtr[plane]];
519 for(Int_t itr = 0; itr<fNtr[plane]; itr++){
521 if(
fGraphs[plane][itr]->GetN()<=fOffset+1)
continue;
522 fGraphs[plane][itr]->GetPoint(0 + fOffset,z[itr][0],x[itr][0]);
524 fGraphs[plane][itr]->GetPoint(1 + fOffset,xTmp,zTmp);
525 px[itr][0] = xTmp - x[itr][0];
526 pz[itr][0] = zTmp - z[itr][0];
527 fGraphs[plane][itr]->GetPoint(
fGraphs[plane][itr]->GetN()-1-fOffset,z[itr][1],x[itr][1]);
528 fGraphs[plane][itr]->GetPoint(
fGraphs[plane][itr]->GetN()-2-fOffset,xTmp,zTmp);
529 px[itr][1] = xTmp - x[itr][1];
530 pz[itr][1] = zTmp - z[itr][1];
538 for(Int_t itr1 = 0; itr1<fNtr[plane]; itr1++){
539 if(spliced[itr1] != itr1)
continue;
540 for(Int_t itr2 = itr1+1; itr2<fNtr[plane]; itr2++){
541 if(spliced[itr2] != itr2)
continue;
543 Int_t iMin = -1, jMin = -1;
544 for(Int_t i = 0; i<2; i++){
545 for(Int_t j = 0; j<2; j++){
546 Double_t d = TMath::Abs(x[itr1][i]-x[itr2][j]) + TMath::Abs(z[itr1][i]-z[itr2][j]);
555 Double_t dx1 = x[itr1][1-iMin] - x[itr1][iMin];
556 Double_t dz1 = z[itr1][1-iMin] - z[itr1][iMin];
557 Double_t dx2 = x[itr2][1-jMin] - x[itr2][jMin];
558 Double_t dz2 = z[itr2][1-jMin] - z[itr2][jMin];
561 Double_t cross = dx1*dx2 + dz1*dz2;
562 Double_t d1 = dx1*dx1 + dz1*dz1;
563 Double_t d2 = dx2*dx2 + dz2*dz2;
564 Double_t sd1 = TMath::Sqrt(d1);
565 Double_t sd2 = TMath::Sqrt(d2);
566 if(d1*d2 == 0)
continue;
567 Double_t costheta = cross/TMath::Sqrt(d1*d2);
571 Info(
"SpliceTracks",
"%d %d: (d=%g,theta=%g)",itr1,itr2,dMin,costheta);
573 if(costheta > fThetaMin)
continue;
579 Double_t dForward1 = TMath::Abs((x[itr1][iMin] - x[itr2][jMin])*dx1 +
580 (z[itr1][iMin] - z[itr2][jMin])*dz1)/sd1;
581 Double_t dTransverse1 = TMath::Abs((x[itr1][iMin] - x[itr2][jMin])*dz1 -
582 (z[itr1][iMin] - z[itr2][jMin])*dx1)/sd1;
583 Double_t dForward2 = TMath::Abs((x[itr1][iMin] - x[itr2][jMin])*dx2 +
584 (z[itr1][iMin] - z[itr2][jMin])*dz2)/sd2;
585 Double_t dTransverse2 = TMath::Abs((x[itr1][iMin] - x[itr2][jMin])*dz2 -
586 (z[itr1][iMin] - z[itr2][jMin])*dx2)/sd2;
589 Info(
"SpliceTracks",
"%d %d: (dF=%g,dT=%g,theta=%g)",itr1,itr2,dForward1,dTransverse1,costheta);
592 Double_t xRect[4] = {x[itr1][iMin] + ( fDminForward*dx1/sd1 - fDminTransverse*dz1/sd1),
593 x[itr1][iMin] + (- fDminForward*dx1/sd1 - fDminTransverse*dz1/sd1),
594 x[itr1][iMin] + (- fDminForward*dx1/sd1 + fDminTransverse*dz1/sd1),
595 x[itr1][iMin] + ( fDminForward*dx1/sd1 + fDminTransverse*dz1/sd1)};
596 Double_t zRect[4] = {z[itr1][iMin] + ( fDminForward*dz1/sd1 + fDminTransverse*dx1/sd1),
597 z[itr1][iMin] + (- fDminForward*dz1/sd1 + fDminTransverse*dx1/sd1),
598 z[itr1][iMin] + (- fDminForward*dz1/sd1 - fDminTransverse*dx1/sd1),
599 z[itr1][iMin] + ( fDminForward*dz1/sd1 - fDminTransverse*dx1/sd1)};
601 std::cout <<
"----------------" << std::endl;
602 for(Int_t i = 0; i<4; i++) std::cout << xRect[i] <<
" ";
603 std::cout << std::endl;
604 for(Int_t i = 0; i<4; i++) std::cout << zRect[i] <<
" ";
605 std::cout << std::endl;
606 TPolyLine* rect =
new TPolyLine(4,zRect,xRect,
"FL");
607 rect->SetFillColor(kRed);
608 rect->SetLineWidth(2);
611 fHist[plane]->GetYaxis()->SetRangeUser(x[itr1][iMin]-20,x[itr1][iMin]+20);
612 fHist[plane]->GetXaxis()->SetRangeUser(z[itr1][iMin]-20,z[itr1][iMin]+20);
620 if(((dForward1<fDminForward && dTransverse1<fDminTransverse) ||
621 (dForward2<fDminForward && dTransverse2<fDminTransverse)) &&
628 TArrow* arrow1 =
new TArrow();
629 arrow1->SetLineColor(kBlue);
630 arrow1->DrawArrow(z[itr1][iMin],x[itr1][iMin],z[itr1][iMin] + dz1,x[itr1][iMin]+dx1);
631 TArrow* arrow2 =
new TArrow();
632 arrow2->SetLineColor(kRed);
633 arrow2->DrawArrow(x[itr2][jMin],x[itr2][jMin],z[itr2][jMin]+dz2,x[itr2][jMin]+dx2);
635 gSystem->Sleep(1000);
636 fHist[plane]->GetXaxis()->SetRangeUser(90,420);
637 fHist[plane]->GetYaxis()->SetRangeUser(0,288);
642 spliced[itr2] = spliced[itr1];
643 x[itr1][iMin] = x[itr2][1-jMin];
644 z[itr1][iMin] = z[itr2][1-jMin];
645 px[itr1][iMin] = px[itr2][1-jMin];
646 pz[itr1][iMin] = pz[itr2][1-jMin];
647 th[itr1][iMin] = th[itr2][1-jMin];
650 Info(
"SpliceTrack",
"Splicing %d %d (dF=%g,dT=%g,theta=%g)",itr1,itr2,dForward1,dTransverse1,costheta);
654 Double_t a1 = ((x[itr1][iMin] - x[itr2][jMin])*dz2 - (z[itr1][iMin] - z[itr2][jMin])*dx2)/(dz1*dx2 - dz2*dx1);
655 Double_t a2 = ((x[itr1][iMin] - x[itr2][jMin])*dz1 - (z[itr1][iMin] - z[itr2][jMin])*dx1)/(dz1*dx2 - dz2*dx1);
658 Info(
"SpliceTracks",
"%d %d: %g/%g %g/%g",itr1,itr2,a1,sd1,a2,sd2);
662 if( TMath::Abs(a1 - 0.5) > 1)
continue;
663 if( TMath::Abs(a2 - 0.5) > 1)
continue;
664 if( (( a1*sd1 < -40 ) || (a1*sd1 > sd1 + 40)) &&
665 (( a2*sd2 < -40 ) || (a2*sd2 > sd2 + 40)))
671 TArrow* arrow1 =
new TArrow();
672 arrow1->SetLineColor(kBlue+3);
673 arrow1->DrawArrow(x[itr1][iMin],z[itr1][iMin],x[itr1][iMin] + a1*dx1,z[itr1][iMin]+a1*dz1);
674 TArrow* arrow2 =
new TArrow();
675 arrow2->SetLineColor(kRed+3);
676 arrow2->DrawArrow(x[itr2][jMin],z[itr2][jMin],x[itr2][jMin]+a2*dx2,z[itr2][jMin]+a2*dz2);
678 gSystem->Sleep(1000);
679 fHist[plane]->GetXaxis()->SetRangeUser(90,420);
680 fHist[plane]->GetYaxis()->SetRangeUser(0,288);
683 Double_t dMax = a1*sd1;
684 Int_t i0 = iMin, tr0 = itr1;
685 Int_t i1 = iMin, tr1 = itr1;
686 if((1-a1)*sd1 > dMax){
700 if((1-a2)*sd2 > dMax){
708 spliced[itr2] = spliced[itr1];
709 x[itr1][0] = x[tr0][i0];
710 z[itr1][0] = z[tr0][i0];
711 px[itr1][0] = px[tr0][i0];
712 pz[itr1][0] = pz[tr0][i0];
713 th[itr1][0] = th[tr0][i0];
714 x[itr1][1] = x[tr1][i1];
715 z[itr1][1] = z[tr1][i1];
716 px[itr1][1] = px[tr1][i1];
717 pz[itr1][1] = pz[tr1][i1];
718 th[itr1][1] = th[tr1][i1];
721 Info(
"SpliceTrack",
"** Splicing %d %d",itr1,itr2);
726 Info(
"SpliceTracks",
"** %d spliced (%d)",nSplice,nLoops);
727 if(nSplice == 0)
break;
735 Int_t newTrIndex[fNtr[plane]];
736 Int_t nClTr[fNtr[plane]];
737 Double_t qTr[fNtr[plane]];
739 for(Int_t itr = 0; itr<fNtr[plane]; itr++){
742 if(spliced[itr] != itr){
743 Int_t itrNew = spliced[itr];
744 while(spliced[itrNew] != itrNew)
745 itrNew = spliced[itrNew];
746 spliced[itr] = itrNew;
747 Int_t n =
fGraphs[plane][itr]->GetN();
748 for(Int_t k = 0; k<n; k++){
750 fGraphs[plane][itr]->GetPoint(k,xTmp,zTmp);
751 fGraphs[plane][itrNew]->SetPoint(
fGraphs[plane][itrNew]->GetN(),xTmp,zTmp);
759 newTrIndex[itr] = -1;
767 Int_t nCl = clArray->GetEntries();
769 Info(
"Splice",
"ntot = %d",nCl);
772 for(Int_t icl = 0; icl<nCl; icl++){
773 Int_t oldTrack =
fTrack[icl];
774 if(oldTrack<0 || oldTrack>=fNtr[plane])
continue;
775 Int_t splicedTrack = spliced[oldTrack];
778 nClTr[splicedTrack]++;
782 for(Int_t itr1 = 0; itr1<fNtr[plane]; itr1++){
784 for(Int_t itr2 = itr1+1; itr2<fNtr[plane]; itr2++){
786 Info(
"SpliceTracks",
"%d => %d (%g %g %g)",itr2,spliced[itr1],
fQcommon[itr1][itr1],
fQcommon[itr2][itr2],
fQcommon[itr1][itr2]);
790 Info(
"SpliceTracks",
"OK");
791 spliced[itr2] = spliced[itr1];
792 nClTr[spliced[itr1]] += nClTr[itr2];
793 qTr[spliced[itr1]] +=
fQcommon[itr2][itr2];
797 for(Int_t itr1 = 0; itr1<fNtr[plane]; itr1++){
798 if(itr1 == spliced[itr1] && nClTr[itr1]>
fNclMin2 && qTr[itr1]>20000){
799 newTrIndex[itr1] = nFinal;
802 newTrIndex[itr1] = -1;
806 for(Int_t icl = 0; icl<nCl; icl++){
808 if(cluster->
GetPlane() != plane)
continue;
811 Int_t oldTrack =
fTrack[icl];
812 if(oldTrack<0 || oldTrack>=fNtr[plane])
continue;
813 Int_t sp = spliced[oldTrack];
815 if(newTrIndex[sp]<0)
continue;
819 for(Int_t itr = 0; itr<fNtr[plane]; itr++){
821 Info(
"Splice",
"nCl(%d) = %d",itr,nClTr[itr]);
823 if(spliced[itr] != itr)
continue;
824 if(newTrIndex[itr] == -1)
continue;
826 Info(
"Splice",
"nCl(%d) = %d / %d",itr,nClTr[itr],
fGraphs[plane][itr]->GetN());
827 Double_t x0 = -1000, slope = -1000, chi2 = -1000;
828 if(
fGraphs[plane][itr]->GetN()>10){
829 TLinearFitter* linfit =
new TLinearFitter(1,
"pol1",
"D");
830 linfit->AssignData(
fGraphs[plane][itr]->GetN(), 1,
fGraphs[plane][itr]->GetX(),
fGraphs[plane][itr]->GetY());
831 linfit->EvalRobust();
832 x0 = linfit->GetParameter(0);
833 slope = linfit->GetParameter(1);
834 chi2 = linfit->GetChisquare();
847 Int_t typeTrack = 0, IdTrackMatching = 0;
848 Double_t xSt = x[itr][0], zSt = z[itr][0], thSt = th[itr][0], xEnd = x[itr][1], zEnd = z[itr][1], thEnd = th[itr][1];
849 Double_t pxSt = px[itr][0], pzSt = pz[itr][0], pxEnd = px[itr][1], pzEnd = pz[itr][1];
851 Info(
"SpliceTracks",
"new Track: %d (%d cl, q=%g) => (%g, %g, %g) (%g, %g, %g)", newTrIndex[itr],nClTr[itr], qTrTmp, xSt, zSt, thSt, xEnd, zEnd, thEnd);
852 HarpoRecoKalmanTracks* tr =
new HarpoRecoKalmanTracks(newTrIndex[itr],Int_t(qTrTmp),slope,x0,chi2,typeTrack,IdTrackMatching,nClTr[itr],plane,xSt,zSt,pxSt,pzSt,xEnd,zEnd,pxEnd,pzEnd);
855 fId[newTrIndex[itr]][plane] = itr;
859 Info(
"SpliceTracks",
"Done");
871 Int_t nCl = clArray->GetEntries();
873 for(Int_t icl = 0; icl<nCl; icl++){
875 if(cluster->
GetPlane() != plane)
continue;
881 for(Int_t k = ind2; k< ind2 + width; k++){
883 if(type ==
CCLUSTER){ i = ind; j = k;}
884 if(type ==
TCLUSTER){ i = k; j = ind;}
885 if(i<0 || i>=
NCHAN)
continue;
886 if(j<0 || j>=
NADC)
continue;
887 Double_t q = map->
GetData(i,j);
890 ULong64_t test = 1 << itr;
892 if(
fMapTmp[i][j] & test)
continue;
899 Info(
"GetQtrack",
"Plane %d, Track %d: Q = %g/%g",plane,itr,qTr,
fQtot);
909 Int_t nCl = clArray->GetEntries();
913 for(Int_t i = 0; i<
NCHAN; i++){
914 for(Int_t j = 0; j<
NADC; j++){
920 for(Int_t icl = 0; icl<nCl; icl++){
922 if(cluster->
GetPlane() != plane)
continue;
927 Int_t nTr = cluster->
GetNtr();
928 for(Int_t iTr = 0; iTr<nTr;iTr++){
930 for(Int_t k = ind2; k< ind2 + width; k++){
932 if(type ==
CCLUSTER){ i = ind; j = k;}
933 if(type ==
TCLUSTER){ i = k; j = ind;}
934 if(i<0 || i>=NCHAN)
continue;
935 if(j<0 || j>=
NADC)
continue;
936 Double_t q = map->
GetData(i,j);
939 ULong64_t test = 1 << itr;
941 if(used4Q[i][j] & test)
continue;
944 used4Q[i][j] |= test;
950 for(Int_t i = 0; i<
fNtr[plane]; i++){
951 for(Int_t j = 0; j<fNtr[plane]; j++){
955 for(Int_t i = 0; i<
NCHAN; i++){
956 for(Int_t j = 0; j<
NADC; j++){
957 Double_t q = map->
GetData(i,j);
960 for(Int_t itr1 = 0; itr1<fNtr[plane]; itr1++){
961 ULong64_t test1 = 1 << itr1;
962 if(!(used4Q[i][j] & test1))
continue;
963 for(Int_t itr2 = itr1; itr2<fNtr[plane]; itr2++){
964 ULong64_t test2 = 1 << itr2;
965 if(!(used4Q[i][j] & test2))
continue;
973 for(Int_t i = 0; i<fNtr[plane]; i++){
974 for(Int_t j = 0; j<fNtr[plane]; j++){
977 std::cout << std::endl;
985 TArrayI*
HarpoTrackingPh::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)
988 return FindNextClosest(X,C,angle,iTr,clArray,arr,ncl,plane,color,fill,smooth,qold);
992 TArrayI*
HarpoTrackingPh::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)
995 if(
fCanvas[plane]) gSystem->Sleep(50);
996 if(
gHarpoDebug>2) Info(
"FindNextClosest",
"angle = %g / %d = %g",angle,ncl,angle/ncl);
1004 Int_t fNskipRows = 6;
1005 Double_t fRangeMax = 5;
1008 Info(
"FindNextClosest",
"%f %f %f %f",X[0][0],X[1][0],X[2][0],X[3][0]);
1010 Double_t angleOld = TMath::ATan2(X[2][0], X[3][0]);
1012 Double_t distMin = 1000, meanMin = -10000, rangeMin = 0, angleMin = -1000, resMin = -1;
1013 Int_t iclMin = -1, typeMin = -1, iMin = -1, kMin = -1, qMin = -1;
1015 for(Int_t k = 1; k<=fNskipRows; k++){
1016 if(k>distMin + kMin)
break;
1026 if(X[3-
type][0]>0) I = Int_t(X[1-
type][0]+0.5) + k;
1027 else I = Int_t(X[1-
type][0]+0.5) - k;
1036 for(
int i = 0;i<4;i++){
1037 for(
int j =0;j<4;j++){
1043 F[0][2]=(I-X[1-
type][0])*1./X[3-
type][0];
1044 F[1][3]=(I-X[1-
type][0])*1./X[3-
type][0];
1047 for(Int_t i = 0; i<n; i++){
1051 else icl =
Ccl[I][i];
1052 if(smooth == 0 &&
used[icl] > -1000)
continue;
1053 if(smooth == 1 &&
used[icl] > -1000 &&
reused[icl] != 0)
continue;
1054 if(smooth == 2 &&
used[icl] != iTr)
continue;
1057 if(cluster->
GetPlane() != plane)
continue;
1058 if((cluster->
GetQuality() & 3) == 3)
continue;
1060 Double_t mean = cluster->
GetMean();
1062 Int_t q = cluster->
GetQ();
1065 Info(
"FindNextClosest",
"#proj: %f %f %f %f",Xproj[0][0],Xproj[1][0],Xproj[2][0],Xproj[3][0]);
1069 Double_t range = deltaRes*res + deltaScat*theta*k;
1070 if(range>fRangeMax) range = fRangeMax;
1072 Double_t dist = TMath::Abs(mean - Xproj[
type][0]);
1076 if(type == 0) angleTmp = TMath::ATan2(mean - X[0][0], I - X[1][0] );
1077 else angleTmp = TMath::ATan2(I - X[0][0], mean - X[1][0]);
1078 Double_t dA = fmod(angleTmp - angle/ncl + 4*TMath::Pi(),2*TMath::Pi()) - TMath::Pi();
1079 if(TMath::Abs(dA)<TMath::Pi()/2 && !(smooth == 1 &&
used[icl] == iTr))
continue;
1081 Double_t dA2 = fmod(angleTmp - angleOld + 4*TMath::Pi(),2*TMath::Pi()) - TMath::Pi();
1083 if(TMath::Abs(dA2)<TMath::Pi()*0.7 && !(smooth == 1 &&
used[icl] == iTr))
continue;
1084 if(smooth == 1 &&
used[icl] == iTr) dist = 0;
1086 if((dist < range || smooth == 2) && (dist+k<distMin || (dist == 0 && k<=kMin))){
1095 if(smooth == 1) kMin = 100;
1096 angleMin = angleTmp;
1109 if(iclMin!=-1) ntr++;
1122 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]);
1124 TMatrixD Corig(4,4);
1125 for(
int a = 0;a<4;a++){
1126 for(
int b =0;b<4;b++){
1140 arr =
FindNextClosest(X, Corig, -angle, iTr, clArray, arr, ncl, plane, color, fill, 1, qMin);
1144 Info(
"FindNextClosest",
"End of last pass (%d clusters)",ncl);
1154 Info(
"FindNextClosest",
"Add New Cluster");
1165 Double_t inc = resMin;
1166 if(inc==0) inc = 0.000001;
1167 for(
int i = 0;i<4;i++){
1168 for(
int j =0;j<4;j++){
1171 Q[i][j]=theta*theta;
1177 for(
int i = 0;i<2;i++){
1178 for(
int j =0;j<2;j++){
1199 TMatrixD Cproj(4,4);
1202 TMatrixD Cprojinv(4,4);
1204 for(
int i = 0;i<4;i++){
1205 for(
int j =0;j<4;j++){
1211 F[0][2]=(iMin-X[1-typeMin][0])*1./X[3-typeMin][0];
1212 F[1][3]=(iMin-X[1-typeMin][0])*1./X[3-typeMin][0];
1217 M[1-typeMin][0] = iMin;
1218 M[typeMin][0] = meanMin;
1222 Cinv=Cprojinv+Ht*G*H;
1225 Xnew=Cnew*((Cprojinv*Xproj)+(Ht*G*M));
1229 Float_t x[3] = {(Float_t) (X[1-typeMin][0]),
1232 Float_t y[3] = {(Float_t) (X[typeMin][0]),
1233 (Float_t) (Xproj[typeMin][0]-rangeMin),
1234 (Float_t) (Xproj[typeMin][0]+rangeMin)};
1236 Info(
"FindNextClosest",
"%g %g %g %g %g %g",x[0],y[0],x[1],y[1],x[2],y[2]);
1237 TPolyLine* triangle;
1238 if(typeMin ==
TCLUSTER) triangle =
new TPolyLine(3,x,y,
"FL");
1239 else triangle =
new TPolyLine(3,y,x,
"FL");
1240 triangle->SetLineColor(kBlack);
1242 triangle->SetFillColor(color);
1243 triangle->SetFillStyle(fill);
1245 triangle->Draw(
"FL");
1246 fHist[plane]->GetXaxis()->SetRangeUser(X[0][0]-20,X[0][0]+20);
1247 fHist[plane]->GetYaxis()->SetRangeUser(X[1][0]-20,X[1][0]+20);
1251 if(smooth == 1)
reused[iclMin] = 1;
1253 if(smooth == 2)
used[iclMin] = 1000;
1255 Bool_t skip = kFALSE;
1258 while(arr->At(kcl) != 0){
1259 if(arr->At(kcl) == 0)
break;
1260 if(arr->At(kcl) == iclMin+1){
1268 arr->AddAt(iclMin+1,kcl);
1271 Info(
"FindNextClosest",
"Add cluster %d, (%d %p) %d",iclMin,iTr,arr,
fStartIndex[iTr]%10);
1276 fStartDirZ[iTr][fStartIndex[iTr]%10] = X[2][0];
1277 fStartDirX[iTr][fStartIndex[iTr]%10] = X[3][0];
1289 cluster->
SetZfit(0,Xnew[0][0]);
1290 cluster->
SetXfit(0,Xnew[1][0]);
1295 Info(
"FindNextClosest",
"Test %g %d %p %p %d %d %d %d %d", angle, iTr, clArray, arr, ncl, plane, color, fill,smooth);
1296 arr =
FindNextClosest(Xnew, Cnew, angle, iTr, clArray, arr, ncl, plane, color, fill,smooth,qMin);
1345 hNcl =
new TH1F(
"hNcl",
"hNcl",500,0,500);
1347 for(Int_t itr = 0; itr<
NTRACK; itr++){
1353 const Int_t nbinsDist = 200;
1354 Double_t xminDist = 1;
1355 Double_t xmaxDist = 10000;
1356 Double_t logxminDist = TMath::Log(xminDist);
1357 Double_t logxmaxDist = TMath::Log(xmaxDist);
1358 Double_t binwidthDist = (logxmaxDist-logxminDist)/nbinsDist;
1359 Double_t xbinsDist[nbinsDist+1];
1360 xbinsDist[0] = xminDist;
1361 for (Int_t i=1;i<=nbinsDist;i++)
1362 xbinsDist[i] = TMath::Exp(logxminDist+i*binwidthDist);
1365 const Int_t nbinsTheta = 100;
1366 Double_t xminTheta = 1e-5;
1367 Double_t xmaxTheta = 2;
1368 Double_t logxminTheta = TMath::Log(xminTheta);
1369 Double_t logxmaxTheta = TMath::Log(xmaxTheta);
1370 Double_t binwidthTheta = (logxmaxTheta-logxminTheta)/nbinsTheta;
1371 Double_t xbinsTheta[nbinsTheta+1];
1372 xbinsTheta[0] = xminTheta;
1373 for (Int_t i=1;i<=nbinsTheta;i++)
1374 xbinsTheta[i] = TMath::Exp(logxminTheta+i*binwidthTheta);
1376 hDistTracks =
new TH1F(
"hDistTracks",
"",nbinsDist,xbinsDist);
1377 hDistMinTracks =
new TH1F(
"hDistMinTracks",
"",nbinsDist,xbinsDist);
1378 hThetaTracks =
new TH1F(
"hThetaTracks",
"",nbinsTheta,xbinsTheta);
1380 hThetaTracksNtr =
new TH2F(
"hThetaTracksNtr",
"",nbinsDist,xbinsDist,nbinsTheta,xbinsTheta);
1381 for(Int_t i = 0; i<10; i++)
1382 hThetaDist[i] =
new TH2F(Form(
"hThetaDist%d",i),
"",nbinsDist,xbinsDist,nbinsTheta,xbinsTheta);
1385 const Int_t nbinsQ = 100;
1386 Double_t xminQ = 1e-3;
1387 Double_t xmaxQ = 1e3;
1388 Double_t logxminQ = TMath::Log(xminQ);
1389 Double_t logxmaxQ = TMath::Log(xmaxQ);
1390 Double_t binwidthQ = (logxmaxQ-logxminQ)/nbinsQ;
1391 Double_t xbinsQ[nbinsQ+1];
1393 for (Int_t i=1;i<=nbinsQ;i++)
1394 xbinsQ[i] = TMath::Exp(logxminQ+i*binwidthQ);
1395 fHistQQtestVsDist =
new TH2F(
"fHistQQtestVsDist",
"",nbinsQ,xbinsQ,nbinsDist,xbinsDist);
1396 fHistQQmin =
new TH2F(
"fHistQQmin",
"",nbinsQ,xbinsQ,nbinsDist,xbinsDist);
1423 for(Int_t i = 0; i<10; i++){
void FindTrack(TClonesArray *clArray, Int_t icl0, Int_t icl1, TMatrixD Corig, Int_t plane, Int_t &color)
HarpoRecoEvent * GetRecoEvent()
void Save(char *mode=NULL)
Double_t fStartDirX[NTRACK][10]
void SpliceTracks(Int_t plane)
void AddIdClusterTrack(Int_t val)
Double_t GetData(Int_t i, Int_t j)
Set/Get Data Cell.
Double_t fStartPointZ[NTRACK][10]
Object containing the reconstruction information for one event (with array of HarpoRecoClusters Harpo...
void AddTracks(HarpoRecoTracks *val)
Int_t fStartIndex[NTRACK]
void print()
Ovreloaded medod whic do all job.
Int_t GetMapEdges(TClonesArray *clArray, Int_t plane, Int_t &iMin, Int_t &iMax, Int_t &jMin, Int_t &jMax)
void RemoveAllClusterTrack()
Double_t GetQtrack(Int_t itr, Int_t plane)
HarpoRecoTracks object, Obtained with Kalman filter.
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...
Double_t GetQtracks(Int_t plane)
Int_t GetIdClusterTrack()
Int_t InitPlane(TClonesArray *clArray, Int_t plane)
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)
void SetXfit(Int_t i, Double_t val)
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]
TGraph * fGraphs[2][NTRACK]
Double_t fQcommon[NTRACK][NTRACK]
HarpoEventHeader * GetHeader()
Int_t AddTrack(TClonesArray *clArray, Int_t plane)
Double_t fStartDirZ[NTRACK][10]
const ULong_t gkNDetectors
HarpoDccMap * GetDccMap(Long_t plane=XDCC)
A virtual class which define intrafece between HARPO Reader and Event Analysis code.
ULong64_t fMapTmp[NCHAN][NADC]
void SetZfit(Int_t i, Double_t val)
TClonesArray * GetClustersArray()
Double_t GetResolution(HarpoRecoClusters *cl)
void SetTrackType(Int_t val)
TH1F * hNcl
Redefine empty default.
Bool_t CheckIdClusterTrack(Int_t val)