28 #include "TLinearFitter.h"
50 if (plane != NULL )plane->
print();
86 Int_t nMatch = matchArray->GetEntries();
88 Int_t nTr = trArray->GetEntries();
90 for(Int_t i = 0; i<nTr; i++){
94 Double_t xEnd1 = tr1->
GetXend();
95 Double_t zEnd1 = tr1->
GetZend();
97 Double_t dist = 1000000;
98 for(Int_t j = i+1; j<nTr; j++){
101 if(plane2 != plane1)
continue;
104 Double_t xEnd2 = tr2->
GetXend();
105 Double_t zEnd2 = tr2->
GetZend();
108 d[0] = (xStart1-xStart2)*(xStart1-xStart2) + (zStart1-zStart2)*(zStart1-zStart2);
109 d[1] = (xEnd1-xEnd2)*(xEnd1-xEnd2) + (zEnd1-zEnd2)*(zEnd1-zEnd2);
110 d[2] = (xEnd1-xStart2)*(xEnd1-xStart2) + (zEnd1-zStart2)*(zEnd1-zStart2);
111 d[3] = (xStart1-xEnd2)*(xStart1-xEnd2) + (zStart1-zEnd2)*(zStart1-zEnd2);
112 for(Int_t k = 0; k<4; k++)
113 if(d[k]<dist) dist = d[k];
124 for(Int_t i = 0; i<nMatch; i++){
133 if(trX == trX2 && trY != trY2) n3Dtr++;
134 if(trX != trX2 && trY == trY2) n3Dtr++;
138 const Int_t kNdata = 18;
139 Double_t data[kNdata];
140 for(Int_t i = 0; i<kNdata; i++)
156 for(Int_t i = 0; i<nMCtracks; i++){
163 for(Int_t k = 0; k<3; k++) norm1 += p1[k]*p1[k];
164 norm1 = TMath::Sqrt(norm1);
165 for(Int_t k = 0; k<3; k++) p1[k] /= norm1;
166 for(Int_t j = i+1; j<nMCtracks; j++){
169 p2[0] = tr2->
GetPx();
170 p2[1] = tr2->
GetPy();
171 p2[2] = tr2->
GetPz();
173 for(Int_t k = 0; k<3; k++) norm2 += p2[k]*p2[k];
174 norm2 = TMath::Sqrt(norm2);
175 for(Int_t k = 0; k<3; k++) p2[k] /= norm2;
177 for(Int_t k = 0; k<3; k++){
180 Double_t angle_open=acos(u1u2/(norm1*norm2));
181 Double_t angle_omega = atan2((p2[2]*p1[0]-p1[2]*p2[0]),(p2[2]*p1[1]-p1[2]*p2[1]));
183 data[13] = angle_omega;
184 data[14] = angle_open;
199 Int_t nTrK = trArrayK->GetEntries();
202 Double_t slopetr[2][nTrK];
204 for(Int_t i = 0; i<nTrK; i++){
210 if(idTr>=nTrK)
continue;
228 for(Int_t i = 0; i<nMatch; i++){
241 Double_t norm = slopetr[0][trX]*slopetr[0][trX]+slopetr[1][trY]*slopetr[1][trY] + 1;
242 Double_t cosa = TMath::Sqrt((norm-1.)/norm);
245 data[10] = TMath::ATan2(slopetr[0][trX],slopetr[1][trY]);
246 data[11] = TMath::ACos(cosa);
261 Int_t nTrK = trArrayK->GetEntries();
263 Double_t x0tr[2][nTrK], slopetr[2][nTrK];
264 Double_t xXtr[nTrK][2], xYtr[nTrK][2], zXtr[nTrK][2], zYtr[nTrK][2];
265 for(Int_t i = 0; i<nTrK; i++){
271 if(idTr>=nTrK)
continue;
272 for(Int_t j = i+1; j<nTrK; j++){
275 if(plane2!=plane)
continue;
277 if(idTr2<0)
continue;
278 if(idTr2>=nTrK)
continue;
279 Double_t dmin = 5000;
280 for(Int_t i1 = 0; i1<2; i1++){
289 for(Int_t i2 = 0; i2<2; i2++){
298 Double_t dX = TMath::Abs(x1 - x2);
299 Double_t dZ = TMath::Abs(z1 - z2);
312 xXtr[idTr][1] = track->
GetXend();
313 zXtr[idTr][1] = track->
GetZend();
318 xYtr[idTr][1] = track->
GetXend();
319 zYtr[idTr][1] = track->
GetZend();
321 x0tr[plane][idTr] = track->
GetX0();
328 for(Int_t i = 0; i<
NTRACK; i++)
329 for(Int_t j = 0; j<
NTRACK; j++)
332 Double_t x0[nTrK], y0[nTrK], slopeX[nTrK], slopeY[nTrK];
333 Double_t xX[nTrK][2], xY[nTrK][2], zX[nTrK][2], zY[nTrK][2];
334 Double_t xEnds[nTrK][2], yEnds[nTrK][2], zEnds[nTrK][2];
337 for(Int_t i = 0; i<nMatch; i++){
344 if(used[trX][trY] == kBlack){
345 used[trX][trY] = color;
350 for(Int_t k = 0; k<3; k++){
352 if(k == 1 && !(trX2 != trX && trY2 == trY))
continue;
353 if(k == 2 && !(trX2 == trX && trY2 != trY))
continue;
359 slopeX[n3Dtr] = slopetr[0][trX];
360 xX[n3Dtr][0] = xXtr[trX][0];
361 zX[n3Dtr][0] = zXtr[trX][0];
362 xX[n3Dtr][1] = xXtr[trX][1];
363 zX[n3Dtr][1] = zXtr[trX][1];
364 x0[n3Dtr] = x0tr[0][trX];
366 slopeY[n3Dtr] = slopetr[1][trY];
367 xY[n3Dtr][0] = xYtr[trY][0];
368 zY[n3Dtr][0] = zYtr[trY][0];
369 xY[n3Dtr][1] = xYtr[trY][1];
370 zY[n3Dtr][1] = zYtr[trY][1];
371 y0[n3Dtr] = x0tr[1][trY];
373 Double_t zDiffMin = 100000;
374 Int_t iMin = -1, jMin = -1;
376 if(zX[n3Dtr][1]<zX[n3Dtr][0]) iMin = 1;
378 if(zY[n3Dtr][1]<zY[n3Dtr][0]) jMin = 1;
380 zDiffMin = TMath::Abs(zX[n3Dtr][iMin] - zY[n3Dtr][jMin]);
382 xEnds[n3Dtr][0] = xX[n3Dtr][iMin];
383 yEnds[n3Dtr][0] = xY[n3Dtr][jMin];
384 zEnds[n3Dtr][0] = 0.5*(zX[n3Dtr][iMin] + zY[n3Dtr][jMin]);
385 xEnds[n3Dtr][1] = xX[n3Dtr][1-iMin];
386 yEnds[n3Dtr][1] = xY[n3Dtr][1-jMin];
387 zEnds[n3Dtr][1] = 0.5*(zX[n3Dtr][1-iMin] + zY[n3Dtr][1-jMin]);
390 hStartFit->Fill(zEnds[n3Dtr][0],x0[n3Dtr] + slopeX[n3Dtr]*zEnds[n3Dtr][0],y0[n3Dtr] + slopeY[n3Dtr]*zEnds[n3Dtr][0]);
398 Info(
"process",
"N3dTracks = %d",n3Dtr);
401 Double_t distPocaVertexMin = 1e10, omega = 1000, open = 1000;
404 for(Int_t i = 0; i<n3Dtr; i++){
405 Double_t p1[3] = {slopeX[i], slopeY[i], 1};
406 Double_t x1[3] = {x0[i], y0[i], 0};
408 for(Int_t k = 0; k<3; k++) norm1 += p1[k]*p1[k];
409 norm1 = TMath::Sqrt(norm1);
410 for(Int_t k = 0; k<3; k++) p1[k] /= norm1;
411 for(Int_t j = i+1; j<n3Dtr; j++){
412 Double_t p2[3] = {slopeX[j], slopeY[j], 1};
413 Double_t x2[3] = {x0[j], y0[j], 0};
415 for(Int_t k = 0; k<3; k++) norm2 += p2[k]*p2[k];
416 norm2 = TMath::Sqrt(norm2);
417 for(Int_t k = 0; k<3; k++) p2[k] /= norm2;
418 Double_t u1u2 = 0, u1dX = 0, u2dX = 0;
419 for(Int_t k = 0; k<3; k++){
421 u1dX += p1[k]*(x1[k]-x2[k]);
422 u2dX += p2[k]*(x1[k]-x2[k]);
425 Double_t t1 = (u1u2*u2dX - u1dX)/(1 - u1u2*u1u2);
426 Double_t t2 = - (u1u2*u1dX - u2dX)/(1 - u1u2*u1u2);
429 Double_t xPoca1[3], xPoca2[3], xPoca[3];
431 for(Int_t k = 0; k<3; k++){
432 xPoca1[k] = x1[k] + t1*p1[k];
433 xPoca2[k] = x2[k] + t2*p2[k];
434 xPoca[k] = 0.5*(xPoca1[k] + xPoca2[k]);
435 doca += (xPoca1[k]-xPoca2[k])*(xPoca1[k]-xPoca2[k]);
437 doca = TMath::Sqrt(doca);
444 Double_t distMin = 100000;
445 Int_t iMin = -1, jMin = -1;
446 for(Int_t iTmp = 0; iTmp<2; iTmp++){
447 for(Int_t jTmp = 0; jTmp<2; jTmp++){
449 Double_t distTmp = (xEnds[i][iTmp] - xEnds[j][jTmp])*(xEnds[i][iTmp] - xEnds[j][jTmp]) + (yEnds[i][iTmp] - yEnds[j][jTmp])*(yEnds[i][iTmp] - yEnds[j][jTmp]) + (zEnds[i][iTmp] - zEnds[j][jTmp])*(zEnds[i][iTmp] - zEnds[j][jTmp]);
459 Double_t distPocaVertexI = (xEnds[i][iMin] - xPoca[0])*(xEnds[i][iMin] - xPoca[0]) + (yEnds[i][iMin] - xPoca[1])*(yEnds[i][iMin] - xPoca[1]) + (zEnds[i][iMin] - xPoca[2])*(zEnds[i][iMin] - xPoca[2]);
462 Double_t distPocaVertexJ = (xEnds[j][jMin] - xPoca[0])*(xEnds[j][jMin] - xPoca[0]) + (yEnds[j][jMin] - xPoca[1])*(yEnds[j][jMin] - xPoca[1]) + (zEnds[j][jMin] - xPoca[2])*(zEnds[j][jMin] - xPoca[2]);
467 hPoca->Fill(xPoca[2],xPoca[0],xPoca[1]);
470 Double_t angle_open=acos(u1u2/(norm1*norm2));
471 Double_t angle_omega = atan2((p2[2]*p1[0]-p1[2]*p2[0]),(p2[2]*p1[1]-p1[2]*p2[1]));
475 Double_t distPocaVertex = (0.5*(xEnds[i][iMin] + xEnds[j][jMin]) - xPoca[0])*(0.5*(xEnds[i][iMin] + xEnds[j][jMin]) - xPoca[0]) + (0.5*(yEnds[i][iMin] + yEnds[j][jMin]) - xPoca[1])*(0.5*(yEnds[i][iMin] + yEnds[j][jMin]) - xPoca[1]) + (0.5*(zEnds[i][iMin] + zEnds[j][jMin]) - xPoca[2])*(0.5*(zEnds[i][iMin] + zEnds[j][jMin]) - xPoca[2]);
478 if(distPocaVertex<distPocaVertexMin){
479 distPocaVertexMin = distPocaVertex;
482 data[3] = xEnds[i][iMin];
483 data[4] = yEnds[i][iMin];
484 data[5] = zEnds[i][iMin];
485 data[6] = xEnds[j][jMin];
486 data[7] = yEnds[j][jMin];
487 data[8] = zEnds[j][jMin];
488 data[9] = distPocaVertex;
491 for(Int_t k = 0; k<3; k++)
492 data[15+k] = 0.5*(p1[k]+p2[k]);
498 if(distPocaVertexMin<4900){
520 Double_t pi = TMath::Pi();
521 hStartFit =
new TH3F(
"hStartFit",
";z;x;y",200,0,511,100,0,288,100,0,288);
522 hPoca =
new TH3F(
"hPoca",
";z;x;y",200,0,511,100,0,288,100,0,288);
523 hDoca =
new TH1F(
"hDoca",
";DOCA [mm]",500,0,50);
524 hOpenAngle =
new TH1F(
"hOpenAngle",
";#theta [^{o}]",360,-180,180);
525 hOmegaAngle =
new TH1F(
"hOmegaAngle",
";#omega [^{o}]",360,-180,180);
526 hOmegaSim =
new TH1F(
"hOmegaSim",
";#omega [^{o}]",360,-pi,pi);
527 hOmegaSimReco =
new TH2F(
"hOmegaSimReco",
";#omega_{SIM} [^{o}];#omega_{RECO} [^{o}]",360,-pi,pi,360,-pi,pi);
528 hOmegaVsDistPocaVertex =
new TH2F(
"hOmegaVsDistPocaVertex",
";#theta [^{o}];dist(POCA,start track)",360,-180,180,500,0,500);
529 hDiffZstart =
new TH1F(
"hDiffZstart",
";z_{start,X} - z_{start,Y}",500,0,500);
530 hDistVertex =
new TH1F(
"hDistVertex",
";dist(start track X, start track Y)",500,0,500);
531 hDistPocaVertex =
new TH1F(
"hDistPocaVertex",
";dist(POCA,start track)",500,0,500);
532 hN3Dtr =
new TH1F(
"hN3Dtr",
";number of 3D tracks",50,0,50);
533 hDends =
new TH1F(
"hDends",
";number of 3D tracks",500,0,100);
535 fNtuple =
new TNtupleD(
"fNtuple",
"Vertex data",
"x0:y0:z0:xs1:ys1:zs1:xs2:ys2:zs2:dpv:omega:alpha:n3Dtr:omegasim:alphasim:px:py:pz");
HarpoRecoEvent * GetRecoEvent()
TClonesArray * GetKalmanTracksArray()
void print()
Overloaded method which do all job.
Bool_t isExist(ULong_t det)
Detecror date exist //! Number of Real Detectors.
Track object, containing position, angle, charge and quality information.
Dummy analysis to run as test and example. Give basic histograms of the data.
Object containing the reconstruction information for one event (with array of HarpoRecoClusters Harpo...
Matching object, containing matched track number, and quality info.
TClonesArray * GetMatchingArray()
A class store HARPO row DCC event data and header. End provide access metods to the row data...
HarpoRecoTracks object, Obtained with Kalman filter.
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...
HarpoDetEvent * GetDetEvent(Long_t plane=XDCC)
Data from Keller temperuture and pressure sensors.
void Save(char *mode=NULL)
TpcSimMCTrack * GetTrack(Int_t i)
TH2F * hOmegaVsDistPocaVertex
TH1F * hDiffZstart
Redefine empty default.
TpcSimMCEvent * GetMCEvent()
HarpoEventHeader * GetHeader()
const ULong_t gkNDetectors
TClonesArray * GetTracksArray()
HarpoDccMap * GetDccMap(Long_t plane=XDCC)
R__EXTERN HarpoDetSet * gHDetSet