14 #define PI 3.141592654
48 for(j=0;j<nThetaD;j++){
49 if(Mat[i*nThetaD+j]>max){
50 max = Mat[i*nThetaD+j];
97 result = LoadMatrix_FindMaximum(
101 DriftRadiusconformal,
102 ErrorDriftRadiusconformal,
112 if (result<0) { *Type=
false;
return result;}
123 if(
fabs( R ) > 1.e-10) {
137 *pGamma += (trajectory_vertex[0]*trajectory_vertex[0]+
138 trajectory_vertex[1]*trajectory_vertex[1]
139 -*pAlfa*trajectory_vertex[0]-*pBeta*trajectory_vertex[1]);
140 *pAlfa -= 2.*trajectory_vertex[0];
141 *pBeta -= 2.*trajectory_vertex[1];
148 if( abs(*pBeta)>1e-10) {
150 *emme = -(*pAlfa)/(*pBeta);
154 *emme = -(*pAlfa)/1e-10;
170 Short_t LEGIANDRE_NTHETADIV,
171 Short_t LEGIANDRE_NRADIUSDIV,
172 Short_t nHitsinTrack,
176 Double_t *ErrorDriftRadiusconformal,
221 LoadMatrix_FindMaximum2(
224 LEGIANDRE_NRADIUSDIV,
231 DriftRadiusconformal,
232 ErrorDriftRadiusconformal,
251 if(
fabs( R ) > 1.e-10) {
265 *pGamma += (trajectory_vertex[0]*trajectory_vertex[0]+
266 trajectory_vertex[1]*trajectory_vertex[1]
267 -*pAlfa*trajectory_vertex[0]-*pBeta*trajectory_vertex[1]);
268 *pAlfa -= 2.*trajectory_vertex[0];
269 *pBeta -= 2.*trajectory_vertex[1];
276 if( abs(*pBeta)>1e-10) {
278 *emme = -(*pAlfa)/(*pBeta);
282 *emme = -(*pAlfa)/1e-10;
293 Short_t nHitsinTrack,
328 if(nHitsinTrack<1)
return -1;
344 len =
sizeof(Matrix);
345 memset (Matrix,0,len);
353 for(i=0;i<nHitsinTrack;i++){
354 if(DriftRadiusProjected[i]<=0.) nMvdHits ++;
else nSttHits++;
359 Double_t AngleArray[nMvdHits + 2*nSttHits];
363 for(i=0, icount=0, Amax = -99999., Amin = 9999999.;i<nHitsinTrack;i++){
364 if(DriftRadiusProjected[i]>0.){
368 if( abs(Z[i]+DriftRadiusProjected[i])>1.e-10){
369 AngleArray[icount] = atan( (S[i]-FInot)/(Z[i]+DriftRadiusProjected[i]) );
371 AngleArray[icount] =
PI/2.;
373 if(AngleArray[icount]<Amin) Amin=AngleArray[icount];
374 if(AngleArray[icount]>Amax) Amax=AngleArray[icount];
377 if( abs(Z[i]-DriftRadiusProjected[i])>1.e-10){
378 AngleArray[icount] = atan( (S[i]-FInot)/(Z[i]-DriftRadiusProjected[i]) );
380 AngleArray[icount] =
PI/2.;
382 if(AngleArray[icount]<Amin) Amin=AngleArray[icount];
383 if(AngleArray[icount]>Amax) Amax=AngleArray[icount];
390 if( abs(Z[i])>1.e-10){
391 AngleArray[icount] = atan( (S[i]-FInot)/Z[i] );
393 AngleArray[icount] =
PI/2.;
395 if(AngleArray[icount]<Amin) Amin=AngleArray[icount];
396 if(AngleArray[icount]>Amax) Amax=AngleArray[icount];
405 if(Amin >= Amax ) Amin = Amax - 0.1*
fabs(Amax);
407 delta = 0.1*(Amax - Amin);
410 delta = (Amax-Amin)/ThetaDiv ;
415 sprintf(titolo,
"KAPPA%d",PlotNumber);
416 TH1F * hKAPPAPlot =
new TH1F(titolo,
"",ThetaDiv, Amin, Amax );
420 for(i=0 ;i<icount;i++){
422 ncell = (int) ( (AngleArray[i] - Amin)/delta );
426 hKAPPAPlot->Fill(AngleArray[i]);
438 for(i=1;i<ThetaDiv;i++){
439 if(max<Matrix[i]) { max = Matrix[
i]; CellMax =
i; }
444 ThetaMax = Amin + (CellMax+0.5) * delta;
446 if (abs(
PI/2. - ThetaMax) < 1.e-5){
449 (*emme) = tan(ThetaMax);
461 Short_t nHitsinTrack,
465 Double_t *ErrorDriftRadiusconformal,
476 const int MAXCONTENT= 30000;
487 Matrix[fNRDiv][fNThetaDiv];
500 len =
sizeof(Matrix);
501 memset (Matrix,0,len);
504 HistoRmax = 0.000625;
508 for (i=0; i<nHitsinTrack; i++){
509 R =
sqrt(X[i]*X[i]+Y[i]*Y[i]);
511 if( DriftRadius[i]<0. ) {
514 if(HistoRmax < R){ HistoRmax=R+ErrorDriftRadiusconformal[
i]; }
519 if(HistoRmax < R){ HistoRmax=
R; }
520 Drift[
i] = DriftRadius[
i];
523 DeltaR = (HistoRmax-fRMin)/fNRDiv;
534 for (i=0; i<nHitsinTrack; i++){
536 for(j=0;j<fNThetaDiv;j++) {
539 R = X[
i]*
cos(Theta) + Y[
i]*
sin(Theta)+Drift[
i];
540 IndexR = (int) ((
fabs(R)-fRMin)/DeltaR);
541 if(IndexR>=fNRDiv) IndexR=fNRDiv-1;
547 if(Theta>2.*
PI){ Theta -= 2.*
PI; }
548 IndexT = (int)((Theta-
fThetaMin)/fDeltaT) ;
549 if(IndexT>=fNThetaDiv) IndexT=fNThetaDiv-1;
553 if( Matrix[IndexR][IndexT] < MAXCONTENT ){
554 Matrix[IndexR][IndexT]++;
566 maxval = FindMaximumInMatrix(
576 if(maxval < 0)
return -5;
578 *Rout = (iRMax+0.5) *DeltaR + fRMin;
579 *Thetaout = (iTMax+0.5) *fDeltaT +
fThetaMin;
592 Short_t LEGIANDRE_NTHETADIV,
593 Short_t LEGIANDRE_NRADIUSDIV,
594 Short_t nHitsinTrack,
601 Double_t *ErrorDriftRadiusconformal,
617 bool previously_filled[LEGIANDRE_NRADIUSDIV][LEGIANDRE_NTHETADIV];
618 memset(previously_filled,
false,
sizeof(previously_filled));
627 List_filled_cells_IndexR[nHitsinTrack*LEGIANDRE_NTHETADIV],
628 List_filled_cells_IndexT[nHitsinTrack*LEGIANDRE_NTHETADIV],
632 Int_t
Matrix[LEGIANDRE_NRADIUSDIV][LEGIANDRE_NTHETADIV];
649 len =
sizeof(Matrix);
650 memset (Matrix,0,len);
653 HistoRmax = 0.000625;
657 for (i=0; i<nHitsinTrack; i++){
658 R =
sqrt(X[i]*X[i]+Y[i]*Y[i]);
660 if( DriftRadius[i]<0. ) {
663 if(HistoRmax < R){ HistoRmax=R+ErrorDriftRadiusconformal[
i]; }
668 if(HistoRmax < R){ HistoRmax=
R; }
669 Drift[
i] = DriftRadius[
i];
672 DeltaR = (HistoRmax-fRMin)/LEGIANDRE_NRADIUSDIV;
685 for (i=0; i<nHitsinTrack; i++){
687 for(j=0;j<LEGIANDRE_NTHETADIV;j++) {
689 R = X[
i]*Cosine[j] + Y[
i]*Sinus[j]+Drift[
i];
690 IndexR = (Short_t) ((
fabs(R)-fRMin)/DeltaR);
691 if(IndexR>=LEGIANDRE_NRADIUSDIV) IndexR=LEGIANDRE_NRADIUSDIV-1;
696 IndexT = j + LEGIANDRE_NTHETADIV /2 ;
697 if( IndexT >= LEGIANDRE_NTHETADIV ) IndexT -= LEGIANDRE_NTHETADIV;
698 if( IndexT >= LEGIANDRE_NTHETADIV ) IndexT = LEGIANDRE_NTHETADIV;
706 if( ! previously_filled[IndexR][IndexT] ){
707 previously_filled[IndexR][IndexT]=
true;
709 List_filled_cells_IndexR[n_filled_cells-1] = IndexR;
710 List_filled_cells_IndexT[n_filled_cells-1] = IndexT;
711 Matrix[IndexR][IndexT]=0;
714 Matrix[IndexR][IndexT]++;
720 Short_t index_array[n_filled_cells];
721 Int_t input_array[n_filled_cells];
723 for(i=0;i<n_filled_cells;i++){
724 IndexR = List_filled_cells_IndexR[
i];
725 IndexT = List_filled_cells_IndexT[
i];
726 input_array[
i] = Matrix[IndexR][IndexT];
739 iRMax = List_filled_cells_IndexR[ index_array[n_filled_cells-1] ];
740 iTMax = List_filled_cells_IndexT[ index_array[n_filled_cells-1] ];
743 *Rout = (iRMax+0.5) *DeltaR + fRMin;
746 *Thetaout = (iTMax+0.5) *(THETAMAX-
THETAMIN)/LEGIANDRE_NTHETADIV + THETAMIN;
friend F32vec4 cos(const F32vec4 &a)
Short_t FitHelixCylinder(Short_t nHitsinTrack, Double_t *Xconformal, Double_t *Yconformal, Double_t *DriftRadiusconformal, Double_t *ErrorDriftRadiusconformal, Double_t rotationangle, Double_t trajectory_vertex[2], Short_t NMAX, Double_t *m, Double_t *q, Double_t *pAlfa, Double_t *pBeta, Double_t *pGamma, bool *Type, int istampa, int IVOLTE)
Short_t FitHelixCylinder2(Double_t *Cosine, Short_t LEGIANDRE_NTHETADIV, Short_t LEGIANDRE_NRADIUSDIV, Short_t nHitsinTrack, Double_t *Xconformal, Double_t *Yconformal, Double_t *DriftRadiusconformal, Double_t *ErrorDriftRadiusconformal, Double_t rotationangle, Double_t *Sinus, Double_t THETAMAX, Double_t THETAMIN, Double_t trajectory_vertex[2], Short_t NMAX, Double_t *m, Double_t *q, Double_t *pAlfa, Double_t *pBeta, Double_t *pGamma, bool *Type, int istampa, int IVOLTE)
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 sin(const F32vec4 &a)
void Merge_Sort3(Short_t n_ele, Int_t *array, Short_t *ind)
void LoadMatrix_FindMaximum2(Double_t *Cosine, Short_t LEGIANDRE_NTHETADIV, Short_t LEGIANDRE_NRADIUSDIV, Short_t nHitsinTrack, Double_t *Sinus, Double_t THETAMAX, Double_t THETAMIN, Double_t *X, Double_t *Y, Double_t *DriftRadius, Double_t *ErrorDriftRadiusconformal, Double_t *Rout, Double_t *Thetaout)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
int LoadMatrix_FindMaximum(Short_t nHitsinTrack, Double_t *X, Double_t *Y, Double_t *DriftRadius, Double_t *ErrorDriftRadiusconformal, Double_t *Rout, Double_t *Thetaout)
friend F32vec4 fabs(const F32vec4 &a)
static const Double_t THETAMAX
int FindMaximumInMatrix(int nRDiv, int nThetaD, UShort_t *Mat, int *iRMax, int *iTMax)
Short_t FitSZspace(Short_t nHitsinTrack, Double_t *S, Double_t *Z, Double_t *DriftRadius, Double_t *ErrorDriftRadius, Double_t FInot, Short_t NMAX, Double_t *emme, int PlotNumber)
static const Double_t THETAMIN