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