00001
00002
00003
00004
00005 #include "FtfDedx.h"
00006
00007 #include <algorithm>
00008
00009
00010
00011
00012 FtfDedx::FtfDedx(l3CoordinateTransformer *trafo, float cutLow, float cutHigh, float driftLoss)
00013 {
00014 fCoordTransformer = trafo;
00015 fCutLow = cutLow;
00016 fCutHigh = cutHigh;
00017 fNTruncate = 0;
00018 fDriftLoss = driftLoss;
00019
00020
00021 for (int sector=0; sector<24; sector++) {
00022
00023 fUnitVec[sector].x = fCoordTransformer->GetSectorSin(sector);
00024 if (sector+1>12) fUnitVec[sector].x = -1 * fUnitVec[sector].x;
00025 fUnitVec[sector].y = fCoordTransformer->GetSectorCos(sector);
00026 }
00027 }
00028
00029
00030
00031
00032
00033
00034
00035
00036 int FtfDedx::TruncatedMean(FtfTrack *track) {
00037
00038 double padLength;
00039 int nPointsInArray;
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 double cosl = 1 / (sqrt( 1 + (double) track->tanl*track->tanl));
00052
00053
00054 if ( cosl==0 ) return 0;
00055
00056
00057 double tPhi0 = track->psi + track->q * track->getPara()->bFieldPolarity * pi/2;
00058 if ( tPhi0 > 2*pi ) tPhi0 = tPhi0 - 2*pi;
00059 else if ( tPhi0 < 0. ) tPhi0 = tPhi0 + 2*pi;
00060
00061 double x0 = track->r0 * cos(track->phi0);
00062 double y0 = track->r0 * sin(track->phi0);
00063 double rr = track->pt / ( bFactor *track->getPara()->bField );
00064 double xc = x0 - rr * cos(tPhi0);
00065 double yc = y0 - rr * sin(tPhi0);
00066
00067
00068
00069 nPointsInArray = 0;
00070
00071
00072 for ( FtfHit *ihit = (FtfHit *)track->firstHit ;
00073 ihit != 0 ;
00074 ihit = (FtfHit *)ihit->nextTrackHit) {
00075
00076
00077
00078 if (ihit->flags) continue;
00079
00080
00081
00082
00083
00084
00085
00086 struct christofs_2d_vector tangent;
00087 tangent.x = (ihit->y - yc)/rr;
00088 tangent.y = -(ihit->x - xc)/rr;
00089
00090
00091
00092
00093 double cosCrossing = fabs(tangent.x * fUnitVec[ihit->sector-1].x + tangent.y * fUnitVec[ihit->sector-1].y);
00094
00095
00096 if (ihit->row<14) padLength = padLengthInnerSector;
00097 else padLength = padLengthOuterSector;
00098
00099
00100 if ( cosCrossing==0 ) continue;
00101 double dx = padLength / (cosCrossing * cosl);
00102
00103
00104
00105 double scaleDrift = 1 - fabs(ihit->z) * fDriftLoss/100;
00106
00107
00108
00109
00110
00111 double deScale;
00112 if (ihit->row<14) deScale = 5.0345021e-9;
00113 else deScale = 1.4234702e-8;
00114
00115 fDedxArray[nPointsInArray] = ihit->q * deScale / ( dx * scaleDrift );
00116 nPointsInArray++;
00117
00118
00119
00120
00121
00122 }
00123
00124
00125 sort( fDedxArray, fDedxArray+nPointsInArray );
00126
00127
00128 int cLow = (int) floor(nPointsInArray * fCutLow);
00129 int cHigh = (int) floor(nPointsInArray * fCutHigh);
00130
00131 track->nDedx = 0;
00132 track->dedx = 0;
00133
00134 for (int i=cLow; i<cHigh; i++) {
00135 track->nDedx++;
00136 track->dedx += fDedxArray[i];
00137 }
00138
00139 if (track->nDedx>0) track->dedx = track->dedx/track->nDedx;
00140
00141
00142
00143 return 0;
00144 }