Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

AlgFitTrack3 Class Reference

#include <AlgFitTrack3.h>

Inheritance diagram for AlgFitTrack3:

AlgBase AlgReco AlgTrack List of all members.

Public Member Functions

 AlgFitTrack3 ()
virtual ~AlgFitTrack3 ()
virtual void RunAlg (AlgConfig &ac, CandHandle &ch, CandContext &cx)
virtual void Trace (const char *c) const

Private Member Functions

void CleanUp ()
Double_t CalculateD (int i, int k)
Double_t CalculateP (int k, int n)
void FillWeightMatrix ()
void FillMatricesAandC ()
Double_t GetWiju (int row, int col)
Double_t GetWijv (int row, int col)
void InvertMatrixAndGetParams ()
void SwimAndFillMaps ()
int InitializeTrkClstList (const CandTrackHandle *track0)

Private Attributes

Int_t fParmMaxIterate
Double_t fParmMisalignmentError
IntDoubleMap fRangeThisPlane
IntDoubleMap fDistanceFromStart
IntDoubleMap fTheta0i
IntDoubleMap fThicknessi
IntDoubleMap fSwamU
IntDoubleMap fSwamV
IntDoubleMap fSwamdU
IntDoubleMap fSwamdV
IntDoubleMap fErrorOnMeasure
IntDoubleMap fMeasuredU
IntDoubleMap fMeasuredV
IntDoubleMap fActualZ
Int_t fFirstPlane
Int_t fLastPlane
Int_t fLowestPlane
Int_t fHighestPlane
Int_t fDirection
Int_t fIsNaturalP0
Double_t fMomFromRange
Int_t fCharge
Double_t fZ0
Double_t fU0
Double_t fV0
Double_t fdUdZ0
Double_t fdVdZ0
Double_t fP0
Int_t fLastCharge
Double_t fLastZ0
Double_t fLastU0
Double_t fLastV0
Double_t fLastdUdZ0
Double_t fLastdVdZ0
Double_t fLastP0
Double_t fDP0
Double_t fDU0
Double_t fDV0
Double_t fDdUdZ0
Double_t fDdVdZ0
Double_t fChiSqU
Double_t fChiSqV
Int_t fIterations
Int_t fSizeOfUWeightMatrix
Int_t fSizeOfVWeightMatrix
IntIntMap fReverseMapUIndex
IntIntMap fReverseMapVIndex
Int_t fTrackNum
TMatrixD * fUWeightMatrix
TMatrixD * fVWeightMatrix
TMatrixD fMatrixA
TMatrixD fMatrixC
TObjArray fTrkClstList
VldContextfMyVC
TFile * fFile
TTree * fSillyTree
TH1F * fReasonsForNotFitting
TTree * fReasonsTree
Int_t fR_totalU
Int_t fR_totalV
Int_t fR_showerU
Int_t fR_showerV
Int_t fR_validU
Int_t fR_validV
Double_t fS_z
Double_t fS_measuredU
Double_t fS_measuredV
Double_t fS_swamU
Double_t fS_swamV
Int_t fS_isU

Constructor & Destructor Documentation

AlgFitTrack3::AlgFitTrack3  ) 
 

Definition at line 51 of file AlgFitTrack3.cxx.

References MSG.

00052    :fIterations(0),fTrackNum(0),fUWeightMatrix(0),fVWeightMatrix(0),fMatrixA(5,5),fMatrixC(5,1)
00053 {
00054     MSG("FitTrack3", Msg::kDebug) 
00055        << "Starting AlgFitTrack3::AlgFitTrack3()" << endl;
00056     
00057     char* outPath = getenv ("OUTPATH") ;
00058     if (outPath == NULL) {
00059       sprintf(outPath,".");
00060     }
00061     char* runnum = getenv ("RUNNUM");
00062     if(runnum == NULL) {
00063       sprintf(runnum,"3");
00064     }
00065     char filename[180];
00066     sprintf(filename,"%s/debugFitTrack%s.root",outPath,runnum);
00067     fFile = new TFile(filename,"RECREATE");
00068     fFile->cd();
00069    
00070     fSillyTree = new TTree("sillyTree","sillyTree");
00071     fSillyTree->Branch("z",&fS_z,"z/D");
00072     fSillyTree->Branch("measuredU",&fS_measuredU,"measuredU/D");
00073     fSillyTree->Branch("measuredV",&fS_measuredV,"measuredV/D");
00074     fSillyTree->Branch("swamU",&fS_swamU,"swamU/D");
00075     fSillyTree->Branch("swamV",&fS_swamV,"swamV/D");
00076     fSillyTree->Branch("isU",&fS_isU,"isU/I");
00077     fSillyTree->Branch("trackNum",&fTrackNum,"trackNum/I");
00078     fSillyTree->Branch("iteration",&fIterations,"iteration/I");
00079     fReasonsForNotFitting = new TH1F("reasons","Why didn't I Fit?",20,-0.5,9.5);
00080 
00081     fReasonsTree = new TTree("reasonsTree","reasonsTree");
00082     fReasonsTree->Branch("totalU",&fR_totalU,"totalU/I");
00083     fReasonsTree->Branch("totalV",&fR_totalV,"totalV/I");
00084     fReasonsTree->Branch("showerU",&fR_showerU,"showerU/I");
00085     fReasonsTree->Branch("showerV",&fR_showerV,"showerV/I");
00086     fReasonsTree->Branch("validU",&fR_validU,"validU/I");
00087     fReasonsTree->Branch("validV",&fR_validV,"validV/I");
00088 }

AlgFitTrack3::~AlgFitTrack3  )  [virtual]
 

Definition at line 91 of file AlgFitTrack3.cxx.

References fActualZ, fDistanceFromStart, fErrorOnMeasure, fFile, fMeasuredU, fMeasuredV, fRangeThisPlane, fReverseMapUIndex, fReverseMapVIndex, fSwamdU, fSwamdV, fSwamU, fSwamV, fTheta0i, fThicknessi, fTrkClstList, and MSG.

00092 {
00093    MSG("FitTrack3", Msg::kDebug) 
00094       << "AlgFitTrack3::~AlgFitTrack3()" << endl;
00095    
00096    if(fUWeightMatrix) delete fUWeightMatrix;
00097    if(fVWeightMatrix) delete fVWeightMatrix;
00098    fTheta0i.clear(); // mean square scattering angle.
00099    fThicknessi.clear(); // thickness passed through at plane i.
00100    fSwamU.clear();
00101    fSwamV.clear();
00102    fSwamdU.clear();
00103    fSwamdV.clear();
00104    fMeasuredU.clear();
00105    fMeasuredV.clear();
00106    fActualZ.clear();
00107    fErrorOnMeasure.clear();
00108    fReverseMapUIndex.clear();
00109    fReverseMapVIndex.clear();
00110    fTrkClstList.Delete();
00111    fDistanceFromStart.clear();
00112    fRangeThisPlane.clear();
00113    fFile->Close();
00114   
00115 
00116 }


Member Function Documentation

Double_t AlgFitTrack3::CalculateD int  i,
int  k
[private]
 

Definition at line 1766 of file AlgFitTrack3.cxx.

References fDirection, and fDistanceFromStart.

Referenced by CalculateP().

01767 {
01768     if(fDirection==1) { // forwards
01769         if(k<i) {
01770            return -1.0*CalculateD(k,i); //Will be negative distance
01771         } 
01772         if(i<=fFirstPlane) return -1; // Can't do it that way
01773         if(k>fLastPlane) return -1; // Can't do it that way
01774         if(k==i) return 0;
01775         IntDoubleMap::iterator pos;
01776         Double_t iDistance=0;
01777         pos=fDistanceFromStart.find(i);
01778         if(pos==fDistanceFromStart.end()) {
01779            //Couldn't find that plane
01780            return 0;
01781         }
01782         else iDistance=pos->second;
01783         Double_t kDistance=0;
01784         pos=fDistanceFromStart.find(k);
01785         if(pos==fDistanceFromStart.end()) {
01786            //Couldn't find that plane
01787            return 0;
01788         }
01789         else kDistance=pos->second;
01790         return kDistance-iDistance;
01791     }
01792     else if(fDirection==-1) { //backwards
01793         if(k>i) return -1.0*CalculateD(k,i); //Will be negative distance
01794         if(i>=fHighestPlane) return -1; // Can't do it that way
01795         if(k<fLowestPlane) return -1; // Can't do it that way
01796         if(k==i) return 0;
01797         IntDoubleMap::iterator pos;
01798         Double_t iDistance=0;
01799         pos=fDistanceFromStart.find(i);
01800         if(pos==fDistanceFromStart.end()) {
01801            //Couldn't find that plane
01802            return 0;
01803         }
01804         else iDistance=pos->second;
01805         Double_t kDistance=0;
01806         pos=fDistanceFromStart.find(k);
01807         if(pos==fDistanceFromStart.end()) {
01808            //Couldn't find that plane
01809            return 0;
01810         }
01811         else kDistance=pos->second;
01812         return kDistance-iDistance;
01813       
01814     }
01815     return 0;
01816 }

Double_t AlgFitTrack3::CalculateP int  k,
int  n
[private]
 

Definition at line 1616 of file AlgFitTrack3.cxx.

References abs(), CalculateD(), fDirection, fFirstPlane, fHighestPlane, fLowestPlane, fTheta0i, fThicknessi, and MSG.

Referenced by FillWeightMatrix().

01617 {
01618    
01619    MSG("FitTrack3", Msg::kVerbose)
01620       << "AlgFitTrack3::CalculateP(" << k << "," << n << ")" << endl;
01621     if(k<1 || n<1) return -1;
01622     int highestIndex=abs(fLowestPlane-fHighestPlane);
01623     if(k>highestIndex || n>highestIndex) return -1;
01624 
01625     int usek=k;
01626     int usen=n;
01627     if(k>n) {
01628             usek=n;
01629             usen=k;
01630     }
01631     if(fDirection==1) {
01632         if(k==n) {
01633             double val=0;
01634             // int kPlane=fFirstPlane+usek;
01635             int nPlane=fFirstPlane+usen;
01636             double lastTheta=0;
01637             double lastThickness=0;
01638             double thisTheta=0;
01639             double thisThickness=0;
01640             for(int i=1;i<=usen;i++) {
01641                 int doingPlane=fFirstPlane+i;
01642 
01643                 IntDoubleMap::iterator thetaPos;
01644                 IntDoubleMap::iterator thicknessPos;
01645                 thetaPos = fTheta0i.find(doingPlane);
01646                 if(thetaPos==fTheta0i.end()) {
01647                     //Missing plane.
01648                     if(lastTheta!=0) thisTheta=lastTheta;
01649                     else {
01650                         int uptoPlane=doingPlane;
01651                         while(thetaPos==fTheta0i.end() && 
01652                               uptoPlane<fHighestPlane) {
01653                             uptoPlane++;
01654                             thetaPos=fTheta0i.find(uptoPlane);
01655                         }
01656                         if(thetaPos==fTheta0i.end()) {
01657                             thisTheta=0;
01658                         }
01659                         else thisTheta=thetaPos->second;
01660                     }
01661                 }
01662                 else thisTheta=thetaPos->second;
01663 
01664                 thicknessPos = fThicknessi.find(doingPlane);
01665                 if(thicknessPos==fThicknessi.end()) {
01666                     //Missing plane.
01667                     if(lastThickness!=0) thisThickness=lastThickness;
01668                     else {
01669                         int uptoPlane=doingPlane;
01670                         while(thicknessPos==fThicknessi.end() && 
01671                               uptoPlane<fHighestPlane) {
01672                             uptoPlane++;
01673                             thicknessPos=fThicknessi.find(uptoPlane);
01674                         }
01675                         if(thicknessPos==fThicknessi.end()) {
01676                             thisThickness=0;
01677                         }
01678                         else thisThickness=thicknessPos->second;
01679                     }
01680                 }
01681                 else thisThickness=thicknessPos->second;
01682 
01683                 val+=(thisTheta*thisTheta)*
01684                     ((thisThickness*thisThickness/3.00)+
01685                      CalculateD(doingPlane,nPlane)*
01686                      (thisThickness+CalculateD(doingPlane,nPlane)));
01687             }
01688             
01689             return val;
01690         }
01691         else {
01692             double val=0;
01693             int kPlane=fFirstPlane+usek;
01694             int nPlane=fFirstPlane+usen;
01695             double lastTheta=0;
01696             double lastThickness=0;
01697             double thisTheta=0;
01698             double thisThickness=0;
01699             for(int i=1;i<=usek;i++) {
01700                 int doingPlane=fFirstPlane+i;
01701 
01702                 IntDoubleMap::iterator thetaPos;
01703                 IntDoubleMap::iterator thicknessPos;
01704                 thetaPos = fTheta0i.find(doingPlane);
01705                 if(thetaPos==fTheta0i.end()) {
01706                     //Missing plane.
01707                     if(lastTheta!=0) thisTheta=lastTheta;
01708                     else {
01709                         int uptoPlane=doingPlane;
01710                         while(thetaPos==fTheta0i.end() && 
01711                               uptoPlane<fHighestPlane) {
01712                             uptoPlane++;
01713                             thetaPos=fTheta0i.find(uptoPlane);
01714                         }
01715                         if(thetaPos==fTheta0i.end()) {
01716                             thisTheta=0;
01717                         }
01718                         else thisTheta=thetaPos->second;
01719                     }
01720                 }
01721                 else thisTheta=thetaPos->second;
01722 
01723                 thicknessPos = fThicknessi.find(doingPlane);
01724                 if(thicknessPos==fThicknessi.end()) {
01725                     //Missing plane.
01726                     if(lastThickness!=0) thisThickness=lastThickness;
01727                     else {
01728                         int uptoPlane=doingPlane;
01729                         while(thicknessPos==fThicknessi.end() && 
01730                               uptoPlane<fHighestPlane) {
01731                             uptoPlane++;
01732                             thicknessPos=fThicknessi.find(uptoPlane);
01733                         }
01734                         if(thicknessPos==fThicknessi.end()) {
01735                             thisThickness=0;
01736                         }
01737                         else thisThickness=thicknessPos->second;
01738                     }
01739                 }
01740                 else thisThickness=thicknessPos->second;
01741 
01742                 Double_t dik=CalculateD(doingPlane,kPlane);
01743                 Double_t din=CalculateD(doingPlane,nPlane);
01744                 MSG("FitTrack3", Msg::kVerbose)
01745                    << "Summing (" << i << "," << k << "," << n << ")" << endl
01746                    << "Theta0i " << thisTheta << endl
01747                    << "xi (thickness) " << thisThickness << endl
01748                    << "D(i,k) " <<  dik << endl
01749                    << "D(i,n) " << din << endl;
01750 
01751                 val+=(thisTheta*thisTheta)*
01752                     ((thisThickness*thisThickness/3.00)+
01753                      (thisThickness/2.0)*(dik+din)+(dik*din));
01754             }
01755 
01756             return val;
01757         }
01758 
01759     }
01760        
01761     return 0;
01762 }

void AlgFitTrack3::CleanUp  )  [private]
 

Definition at line 119 of file AlgFitTrack3.cxx.

References fActualZ, fDistanceFromStart, fErrorOnMeasure, fIterations, fMeasuredU, fMeasuredV, fRangeThisPlane, fReverseMapUIndex, fReverseMapVIndex, fSwamdU, fSwamdV, fSwamU, fSwamV, fTheta0i, fThicknessi, fTrkClstList, fUWeightMatrix, fVWeightMatrix, and MSG.

Referenced by RunAlg().

00120 {
00121    MSG("FitTrack3", Msg::kVerbose) 
00122       << "Starting AlgFitTrack3::CleanUp()" << endl;
00123    fIterations=0;
00124    if(fUWeightMatrix) delete fUWeightMatrix;
00125    fUWeightMatrix=0;
00126    if(fVWeightMatrix) delete fVWeightMatrix;
00127    fVWeightMatrix=0;
00128    fTheta0i.clear(); // mean square scattering angle.
00129    fThicknessi.clear(); // thickness passed through at i.
00130    fSwamU.clear();
00131    fSwamV.clear();
00132    fSwamdU.clear();
00133    fSwamdV.clear();
00134    fMeasuredU.clear();
00135    fMeasuredV.clear();
00136    fActualZ.clear();
00137    fErrorOnMeasure.clear();
00138    fReverseMapUIndex.clear();
00139    fReverseMapVIndex.clear();
00140    fDistanceFromStart.clear();
00141    fRangeThisPlane.clear();
00142    fTrkClstList.Delete();
00143    //    MSG("FitTrack3", Msg::kDebug) 
00144    //      << "Finished AlgFitTrack3::CleanUp()" << endl;
00145 }

void AlgFitTrack3::FillMatricesAandC  )  [private]
 

Definition at line 1299 of file AlgFitTrack3.cxx.

References abs(), fActualZ, fChiSqU, fChiSqV, fDirection, fdUdZ0, fdVdZ0, fHighestPlane, fLowestPlane, fMatrixA, fMatrixC, fMeasuredU, fMeasuredV, fP0, fSwamU, fSwamV, fU0, fV0, GetWiju(), GetWijv(), and MSG.

Referenced by RunAlg().

01299                                      {
01300    
01301    MSG("FitTrack3", Msg::kVerbose)
01302      << "AlgFitTrack3::FillMatricesAandC()" << endl;
01303 
01304     fChiSqU=0;
01305     fChiSqV=0;
01306     int sizeOfMatrix=abs(fLowestPlane-fHighestPlane);
01307     
01308     Double_t tempMatA[5][5];
01309     Double_t tempMatC[5];
01310     for(int row=0;row<5;row++) {
01311         tempMatC[row]=0;
01312         for(int col=0;col<5;col++) {
01313             tempMatA[row][col]=0;
01314         }
01315     }
01316     for(int i=0;i<sizeOfMatrix;i++) {
01317         for(int j=0;j<sizeOfMatrix;j++) {
01318             int planeI=0;
01319             int planeJ=0;
01320             if(fDirection==1) {
01321                 planeI=i+fLowestPlane+1;
01322                 planeJ=j+fLowestPlane+1;
01323             }
01324             else {
01325                 planeI=fHighestPlane-i-1;
01326                 planeJ=fHighestPlane-j-1;
01327             }
01328 
01329             Double_t wiju=GetWiju(i,j);
01330             Double_t wijv=GetWijv(i,j);
01331             if(wiju==0 && wijv==0) continue;
01332             MSG("FitTrack3", Msg::kVerbose)
01333                << "Wu(" << i << "," << j << ") = " <<  wiju << endl
01334                << "Wv(" << i << "," << j << ") = " <<  wijv << endl;
01335             Double_t zi=0;
01336             Double_t zj=0;
01337             Double_t biu=0;
01338             Double_t biv=0;
01339             Double_t bju=0;
01340             Double_t bjv=0;
01341             Double_t uim=0;
01342             Double_t ujm=0;
01343             Double_t vim=0;
01344             Double_t vjm=0;
01345             Double_t newui=0;
01346             Double_t newvi=0;
01347             Double_t newuj=0;
01348             Double_t newvj=0;
01349             
01350             
01351             
01352             IntDoubleMap::iterator pos;
01353             pos=fActualZ.find(planeI);
01354             if(pos==fActualZ.end()) continue;
01355             else zi=(pos->second-fZ0);
01356             pos=fActualZ.find(planeJ);
01357             if(pos==fActualZ.end()) continue;
01358             else zj=(pos->second-fZ0);
01359             
01360             if(wiju!=0) {
01361                pos=fSwamU.find(planeI);
01362                if(pos!=fSwamU.end()) {
01363                   biu=(pos->second-fU0-fdUdZ0*(zi))*fP0;//*fCharge;
01364                   newui=pos->second;
01365                }
01366             }
01367             if(wijv!=0) {
01368                pos=fSwamV.find(planeI);
01369                if(pos!=fSwamV.end()) {
01370                   biv=(pos->second-fV0-fdVdZ0*(zi))*fP0;//*fCharge;
01371                   newvi=pos->second;
01372                }
01373             }
01374 
01375             if(wiju!=0) {
01376                pos=fSwamU.find(planeJ);
01377                if(pos!=fSwamU.end()) {
01378                   bju=(pos->second-fU0-fdUdZ0*(zj))*fP0;//*fCharge;
01379                   newuj=pos->second;
01380                }
01381             }
01382             if(wijv!=0) {
01383                pos=fSwamV.find(planeJ);
01384                if(pos!=fSwamV.end()) {
01385                   bjv=(pos->second-fV0-fdVdZ0*(zj))*fP0;//*fCharge;
01386                   newvj=pos->second;
01387                }
01388             }
01389                 
01390             if(wiju!=0) {
01391                pos=fMeasuredU.find(planeI);
01392                if(pos!=fMeasuredU.end()) uim=pos->second;
01393                pos=fMeasuredU.find(planeJ);
01394                if(pos!=fMeasuredU.end()) ujm=pos->second; 
01395             }
01396             if(wijv!=0) {
01397                pos=fMeasuredV.find(planeI);
01398                if(pos!=fMeasuredV.end()) vim=pos->second;
01399                pos=fMeasuredV.find(planeJ);
01400                if(pos!=fMeasuredV.end()) vjm=pos->second; 
01401             }
01402 
01403             MSG("FitTrack3", Msg::kVerbose)
01404                << "Wu(" << i << "," << j << ") = " <<  wiju << endl
01405                << "Wv(" << i << "," << j << ") = " <<  wijv << endl
01406                << "uim " << uim << endl
01407                << "ujm " << ujm << endl
01408                << "vim " << vim << endl
01409                << "vjm " << vjm << endl
01410                << "ui " << newui << " u0 " << fU0 
01411                << " dudz0 " << fdUdZ0 << " (zi-z0) " << zi 
01412                << " p0 " << fP0 << endl
01413                << "uj " << newuj << " u0 " << fU0 
01414                << " dudz0 " << fdUdZ0 << " (zj-z0) " << zj 
01415                << " p0 " << fP0 << endl
01416                << "vi " << newvi  << " v0 " << fV0 
01417                << " dvdz0 " << fdVdZ0 << " (zi-z0) " << zi 
01418                << " p0 " << fP0 << endl
01419                << "vj " << newvj  << " v0 " << fV0 
01420                << " dvdz0 " << fdVdZ0 << " (zj-z0) " << zj 
01421                << " p0 " << fP0 << endl
01422                << "biu(" << i <<  ") = " <<  biu << endl
01423                << "bju(" << j << ") = " <<  bju << endl
01424                << "biv(" << i << ") = " <<  biv << endl
01425                << "bjv(" << j << ") = " <<  bjv << endl;
01426 
01427             //Calculate Chisq.
01428             fChiSqU+=(newui-uim)*wiju*(newuj-ujm);
01429             fChiSqV+=(newvi-vim)*wijv*(newvj-vjm);
01430 
01431             //Now do the silly sums.
01432             // Starting with row 0 of matrix A
01433             tempMatA[0][0]+=2.0*wiju;
01434             tempMatA[0][1]+=wiju*(zi+zj);
01435             tempMatA[0][2]+=wiju*(biu+bju);
01436             //Now row 1
01437             tempMatA[1][0]+=wiju*(zi+zj);
01438             tempMatA[1][1]+=2.0*wiju*(zi*zj);
01439             tempMatA[1][2]+=wiju*(biu*zj+bju*zi);
01440             //Now the long midddle row
01441             tempMatA[2][0]+=wiju*(biu+bju);
01442             tempMatA[2][1]+=wiju*(zi*bju+zj*biu);
01443             tempMatA[2][2]+=2.0*wiju*(biu*bju)+2.0*wijv*(biv*bjv);
01444             tempMatA[2][3]+=wijv*(biv+bjv);
01445             tempMatA[2][4]+=wijv*(biv*zj+bjv*zi);
01446             //Now row 3
01447             tempMatA[3][2]+=wijv*(biv+bjv);
01448             tempMatA[3][3]+=2*wijv;
01449             tempMatA[3][4]+=wijv*(zi+zj);
01450             //Now row 4
01451             tempMatA[4][2]+=wijv*(biv*zj+bjv*zi);
01452             tempMatA[4][3]+=wijv*(zi+zj);
01453             tempMatA[4][4]+=2*wijv*(zi*zj);
01454 
01455             //And moving on to matrix C
01456             tempMatC[0]+=wiju*(uim+ujm);
01457             tempMatC[1]+=wiju*(uim*zj+ujm*zi);
01458             tempMatC[2]+=wiju*(uim*bju+ujm*biu)+wijv*(vim*bjv+vjm*biv);
01459             tempMatC[3]+=wijv*(vim+vjm);
01460             tempMatC[4]+=wijv*(vim*zj+vjm*zi);
01461         }
01462     }
01463     // cout << "Matrix C" << endl;
01464     for(int row=0;row<5;row++) {
01465        // cout << row << "\t" << tempMatC[row] << endl;
01466         fMatrixC[row][0]=tempMatC[row];
01467         for(int col=0;col<5;col++) {
01468             fMatrixA[row][col]=tempMatA[row][col];
01469         }
01470     }            
01471 
01472 }

void AlgFitTrack3::FillWeightMatrix  )  [private]
 

Definition at line 1475 of file AlgFitTrack3.cxx.

References abs(), CalculateP(), fDirection, fErrorOnMeasure, fHighestPlane, fLowestPlane, fMeasuredU, fMeasuredV, fReverseMapUIndex, fReverseMapVIndex, fSizeOfUWeightMatrix, fSizeOfVWeightMatrix, fUWeightMatrix, fVWeightMatrix, and MSG.

Referenced by RunAlg().

01475                                     {
01476    
01477    
01478     int sizeOfMatrix=abs(fLowestPlane-fHighestPlane);
01479     MSG("FitTrack3", Msg::kVerbose)
01480      << "AlgFitTrack3::FillWeightMatrix()\tsizeOfMatrix "
01481      << sizeOfMatrix << endl;
01482     TMatrixD invWeightMatrix(sizeOfMatrix,sizeOfMatrix);
01483     
01484     int *mapUIndex = new int [fSizeOfUWeightMatrix];
01485     int *mapVIndex = new int [fSizeOfVWeightMatrix];
01486     fReverseMapUIndex.clear();
01487     fReverseMapVIndex.clear();
01488     int uptoUindex=0;
01489     int uptoVindex=0;
01490     IntDoubleMap::iterator pos;
01491     for(int row=0;row<sizeOfMatrix;row++) {
01492        int planeRow=0;
01493        if(fDirection==1) {
01494           planeRow=row+fLowestPlane+1;
01495        }
01496        else {
01497           planeRow=fHighestPlane-row-1;
01498        }
01499       
01500        pos=fMeasuredU.find(planeRow);
01501        if(pos!=fMeasuredU.end()) {
01502           //Got a U plane;
01503           mapUIndex[uptoUindex]=row;
01504           fReverseMapUIndex[row]=uptoUindex;
01505           uptoUindex++;
01506        }
01507        pos=fMeasuredV.find(planeRow);
01508        if(pos!=fMeasuredV.end()) {
01509           //Got a U plane;
01510           mapVIndex[uptoVindex]=row;
01511           fReverseMapVIndex[row]=uptoVindex;
01512           uptoVindex++;
01513        }
01514     }
01515 
01516     TMatrixD invUWeightMatrix(fSizeOfUWeightMatrix,fSizeOfUWeightMatrix);
01517     TMatrixD invVWeightMatrix(fSizeOfVWeightMatrix,fSizeOfVWeightMatrix);
01518     for(int row=0;row<fSizeOfUWeightMatrix;row++) {
01519 
01520        int bigRow=mapUIndex[row];
01521        int planeRow=0;
01522        if(fDirection==1) {
01523           planeRow=bigRow+fLowestPlane+1;
01524        }
01525        else {
01526           planeRow=fHighestPlane-bigRow-1;
01527        }
01528        for(int col=0;col<fSizeOfUWeightMatrix;col++) {
01529           int bigCol=mapUIndex[col];
01530           int planeCol=0;
01531           if(fDirection==1) {
01532              planeCol=bigCol+fLowestPlane+1;
01533           }
01534           else {
01535              planeCol=fHighestPlane-bigCol-1;
01536           }
01537           
01538           double epsilon=0;
01539           pos=fErrorOnMeasure.find(planeRow);
01540           if(pos==fErrorOnMeasure.end()) {
01541              invUWeightMatrix[row][col]=0;
01542              continue;
01543           }
01544           else epsilon = pos->second;
01545           if(bigRow!=bigCol) {
01546              epsilon=0;
01547           }
01548           double element = (epsilon*epsilon)+CalculateP(bigRow+1,bigCol+1);
01549           MSG("FitTrack3", Msg::kVerbose)
01550              << "W(" << bigRow+1 << "," << bigCol+1 << ") = " 
01551              << element << "\tEpsilion = " << epsilon << endl;
01552           invUWeightMatrix[row][col]=element;  
01553        }
01554     }
01555     
01556     MSG("FitTrack3", Msg::kVerbose)
01557        << "Filled invUWeightMatrix" << endl;
01558     //Fill invVWeightMatrix
01559     for(int row=0;row<fSizeOfVWeightMatrix;row++) {
01560 
01561        int bigRow=mapVIndex[row];
01562        int planeRow=0;
01563        if(fDirection==1) {
01564           planeRow=bigRow+fLowestPlane+1;
01565        }
01566        else {
01567           planeRow=fHighestPlane-bigRow-1;
01568        }
01569        for(int col=0;col<fSizeOfVWeightMatrix;col++) {
01570           int bigCol=mapVIndex[col];
01571           int planeCol=0;
01572           if(fDirection==1) {
01573              planeCol=bigCol+fLowestPlane+1;
01574           }
01575           else {
01576              planeCol=fHighestPlane-bigCol-1;
01577           }
01578           
01579           double epsilon=0;
01580           pos=fErrorOnMeasure.find(planeRow);
01581           if(pos==fErrorOnMeasure.end()) {
01582              invVWeightMatrix[row][col]=0;
01583              continue;
01584           }
01585           else epsilon = pos->second;
01586           if(bigRow!=bigCol) {
01587              epsilon=0;
01588           }
01589           double element = (epsilon*epsilon)+CalculateP(bigRow+1,bigCol+1);
01590           MSG("FitTrack3", Msg::kVerbose)
01591              << "W(" << bigRow+1 << "," << bigCol+1 << ") = " 
01592              << element << "\tEpsilion = " << epsilon << endl;
01593           invVWeightMatrix[row][col]=element;  
01594        }
01595     }
01596 
01597     MSG("FitTrack3", Msg::kVerbose)
01598        << "Filled invVWeightMatrix" << endl;
01599         
01600     fUWeightMatrix = new TMatrixD(TMatrixD::kInverted,invUWeightMatrix);
01601     
01602     MSG("FitTrack3", Msg::kVerbose)
01603        << "Inverted invUWeightMatrix" << endl;
01604     fVWeightMatrix = new TMatrixD(TMatrixD::kInverted,invVWeightMatrix);
01605     
01606     MSG("FitTrack3", Msg::kVerbose)
01607        << "Inverted invUWeightMatrix" << endl;
01608     //fWeightMatrix = new TMatrixD(TMatrixD::kInverted,invWeightMatrix);
01609     //    cout << "Silly weight matrices: " << endl;
01610     //    fUWeightMatrix->Print();
01611     //    fVWeightMatrix->Print();
01612 }

Double_t AlgFitTrack3::GetWiju int  row,
int  col
[private]
 

Definition at line 1152 of file AlgFitTrack3.cxx.

References fReverseMapUIndex, and MSG.

Referenced by FillMatricesAandC().

01152                                                {
01153    IntIntMap::iterator pos;
01154    pos=fReverseMapUIndex.find(row);
01155    if(pos==fReverseMapUIndex.end()) return 0;
01156    pos=fReverseMapUIndex.find(col);
01157    if(pos==fReverseMapUIndex.end()) return 0;
01158    
01159    int newRow=fReverseMapUIndex[row];
01160    int newCol=fReverseMapUIndex[col];
01161    MSG("FitTrack3", Msg::kVerbose)
01162       << "GetWijv(" << row << "," << col << ")" << endl
01163       << "newRow " << newRow << " newCol " << newCol << endl;
01164    
01165    return (*fUWeightMatrix)[newRow][newCol];
01166 }

Double_t AlgFitTrack3::GetWijv int  row,
int  col
[private]
 

Definition at line 1171 of file AlgFitTrack3.cxx.

References fReverseMapVIndex, and MSG.

Referenced by FillMatricesAandC().

01171                                                {
01172    IntIntMap::iterator pos;
01173    pos=fReverseMapVIndex.find(row);
01174    if(pos==fReverseMapVIndex.end()) return 0;
01175    pos=fReverseMapVIndex.find(col);
01176    if(pos==fReverseMapVIndex.end()) return 0;
01177    int newRow=fReverseMapVIndex[row];
01178    int newCol=fReverseMapVIndex[col];
01179    MSG("FitTrack3", Msg::kVerbose)
01180       << "GetWijv(" << row << "," << col << ")" << endl
01181       << "newRow " << newRow << " newCol " << newCol << endl;
01182    return (*fVWeightMatrix)[newRow][newCol];
01183 }

int AlgFitTrack3::InitializeTrkClstList const CandTrackHandle track0  )  [private]
 

Definition at line 488 of file AlgFitTrack3.cxx.

References abs(), TrackClusterSR::AddStrip(), fCharge, fDirection, fdUdZ0, fdVdZ0, fFirstPlane, fHighestPlane, fLastPlane, fLowestPlane, fMyVC, fP0, fParmMisalignmentError, fR_showerU, fR_showerV, fR_totalU, fR_totalV, fR_validU, fR_validV, fReasonsForNotFitting, fReasonsTree, fSizeOfUWeightMatrix, fSizeOfVWeightMatrix, fTrkClstList, fU0, fV0, fZ0, CandRecoHandle::GetBegPlane(), CandHandle::GetDaughterIterator(), VldContext::GetDetector(), CandRecoHandle::GetEndPlane(), CandRecoHandle::GetEndU(), CandRecoHandle::GetEndV(), CandRecoHandle::GetEndZ(), CandTrackHandle::GetMomentum(), TrackClusterSR::GetPlane(), CandStripHandle::GetPlane(), TrackClusterSR::GetPlaneView(), CandStripHandle::GetPlaneView(), VldContext::GetSimFlag(), CandTrackHandle::GetT(), CandRecoHandle::GetTimeSlope(), VldContext::GetTimeStamp(), TrackClusterSR::GetTPos(), TrackClusterSR::GetTPosError(), CandHandle::GetVldContext(), UgliGeomHandle::GetZExtent(), TrackClusterSR::GetZPos(), CandTrackHandle::IsInShower(), min, MSG, and TrackClusterSR::SetTime3D().

Referenced by RunAlg().

00489 {
00490   MSG("FitTrack3", Msg::kVerbose)
00491      << "AlgFitTrack3::InitializeTrkClstList()" << endl;
00492 //  Int_t dplane = abs(track0->GetEndPlane()-track0->GetBegPlane());  
00493   Int_t begplane = track0->GetBegPlane();  
00494   Int_t endplane = track0->GetEndPlane();
00495   fFirstPlane=begplane;
00496   fLastPlane=endplane;
00497   const VldContext *myvc = track0->GetVldContext();
00498   fMyVC = new VldContext(myvc->GetDetector(),myvc->GetSimFlag(),
00499                          myvc->GetTimeStamp());
00500   UgliGeomHandle ugh(*myvc);
00501   if(endplane<begplane) {
00502       Int_t temp=begplane;
00503       begplane=endplane;
00504       endplane=temp;
00505   }
00506   fLowestPlane=begplane;
00507   fHighestPlane=endplane;
00508   CandStripHandleItr stripItr(track0->GetDaughterIterator());
00509   CandStripHandleKeyFunc *stripKf = stripItr.CreateKeyFunc();
00510   stripKf->SetFun(CandStripHandle::KeyFromPlane);
00511   stripItr.GetSet()->AdoptSortKeyFunc(stripKf);
00512   stripKf = 0;
00513   Int_t izfor=1;
00514   if (track0->GetTimeSlope()>0.) {
00515     stripItr.SetDirection(1);
00516     izfor=1;
00517   }
00518   else {
00519     stripItr.SetDirection(-1);
00520     izfor=-1;
00521   }
00522   fDirection=izfor;
00523   Int_t oldplane=0;
00524   Int_t oldplane2=0;
00525   Int_t nplane=0;
00526   Int_t nplaneu=0;
00527   Int_t nplanev=0;
00528   Int_t isFirstPlaneU=0;
00529   stripItr.Reset();
00530   TrackClusterSR *oldtc=0;
00531  
00532   fLowestPlane=1000;
00533   fHighestPlane=-1000;
00534     
00535   
00536   int numShowerPlanes=0;
00537   int numShowerStrips=0;
00538   map<int,int> showerPlanes;
00539   map<int,int>::iterator showerPos;
00540   TObjArray tempTrkClstList;
00541 
00542   fR_totalU=0;
00543   fR_totalV=0;
00544   fR_showerU=0;
00545   fR_showerV=0;
00546   fR_validU=0;
00547   fR_validV=0;
00548   int lastTotal=-1;
00549   //  int lastValid=-1;
00550   int lastShower=-1;
00551 
00552   while (CandStripHandle *strip = stripItr()) {
00553      //    cfh.SetInShower(strip,track0->IsInShower(strip));
00554      //Just counts the number of planes hit in each view.
00555      if(lastTotal!=strip->GetPlane()) {
00556         switch (strip->GetPlaneView()) {
00557               case PlaneView::kU:
00558                  fR_totalU++;
00559                  break;
00560               case PlaneView::kV:
00561                  fR_totalV++;
00562                  break;
00563         default:
00564            break;
00565         }
00566      }
00567      lastTotal=strip->GetPlane();
00568      if(!(track0->IsInShower(strip)>1)) {
00569         if (oldplane!=strip->GetPlane()) {
00570            if (strip->GetPlane()>=begplane) {
00571               if(strip->GetPlane()<fLowestPlane) 
00572                  fLowestPlane=strip->GetPlane();
00573               if(strip->GetPlane()>fHighestPlane) 
00574                  fHighestPlane=strip->GetPlane();
00575               nplane++;
00576               switch (strip->GetPlaneView()) {
00577               case PlaneView::kU:
00578                  if(isFirstPlaneU==0) isFirstPlaneU=1;
00579                  nplaneu++;
00580                  fR_validU++;
00581                  break;
00582               case PlaneView::kV:
00583                  if(isFirstPlaneU==0) isFirstPlaneU=-1;
00584                  nplanev++;
00585                  fR_validV++;
00586                  break;
00587               default:
00588                  break;
00589               }
00590            }
00591            oldplane = strip->GetPlane();
00592         }
00593      
00594         
00595         if (strip->GetPlane()>=begplane) {
00596            //      cfh.AddDaughterLink(*strip);
00597            
00598            if (!oldtc) {
00599               oldtc = new TrackClusterSR(strip, fParmMisalignmentError);
00600               oldtc->SetTime3D(track0->GetT(oldtc->GetPlane()));
00601               oldplane2 = strip->GetPlane();
00602            }
00603            else if (strip->GetPlane()==oldplane2) {
00604               oldtc->AddStrip(strip);
00605            }
00606            else {
00607               TrackClusterSR *newtc = new TrackClusterSR(*oldtc);
00608               tempTrkClstList.Add(newtc);
00609               delete oldtc;
00610               oldplane2 = strip->GetPlane();
00611               oldtc = new TrackClusterSR(strip, fParmMisalignmentError);
00612               oldtc->SetTime3D(track0->GetT(oldtc->GetPlane()));
00613            }
00614         }
00615      }
00616      else {
00617 //          MSG("FitTrack3", Msg::kDebug) 
00618 //             << "Got shower strip: plane " 
00619 //             << strip->GetPlane() << " strip " << strip->GetStrip()
00620 //             << " InShower " << track0->IsInShower(strip) << endl;
00621 
00622         if(lastShower!=strip->GetPlane()) {
00623            switch (strip->GetPlaneView()) {
00624            case PlaneView::kU:
00625               fR_showerU++;
00626               break;
00627            case PlaneView::kV:
00628                  fR_showerV++;
00629                  break;
00630            default:
00631               break;
00632            }
00633         }
00634         lastShower=strip->GetPlane();   
00635         showerPos=showerPlanes.find(strip->GetPlane());
00636         if(showerPos!=showerPlanes.end()) {
00637            showerPlanes[strip->GetPlane()]++;
00638            numShowerStrips+=track0->IsInShower(strip);
00639         }
00640         else {
00641            numShowerPlanes++;
00642            numShowerStrips+=track0->IsInShower(strip);
00643            showerPlanes[strip->GetPlane()]=1;
00644         }
00645      }
00646      
00647   }
00648 
00649   if (oldtc) {
00650     TrackClusterSR *newtc = new TrackClusterSR(*oldtc);
00651     tempTrkClstList.Add(newtc);
00652     delete oldtc;
00653   }
00654 
00655   
00656    MSG("FitTrack3", Msg::kVerbose)
00657      << "Lowest Plane " << fLowestPlane
00658      << " Highest Plane " << fHighestPlane 
00659      << " Direction " << izfor << endl;
00660 
00661   //At this point each plane is a TrackClusterSR object in fTrkClstList
00662    MSG("FitTrack3", Msg::kVerbose)
00663       << "Filled fTrkClstList:\tnplane " << nplane
00664       << "\tnplaneu " << nplaneu << "\tnplanev" << nplanev << endl
00665       << "fTrkClstList.GetEntries() " << fTrkClstList.GetEntries() << endl;
00666   
00667    if(nplaneu<8 || nplanev<8) {
00668       MSG("FitTrack3", Msg::kWarning) 
00669          << "Too few non-shower planes to fit" 
00670          << endl;
00671       fReasonsForNotFitting->Fill(1); //Too few planes total.
00672       fReasonsTree->Fill();
00673       fReasonsTree->Write("reasonsTree",TObject::kOverwrite);
00674       return -1;
00675    }
00676 
00677 
00678   Int_t startPlane[10];
00679   Int_t endPlane[10];
00680   Int_t numPlanesInSection[10];
00681   Int_t lastPlanenum=-1000;
00682   Int_t numSections=0;
00683   for (Int_t i=0; i<=tempTrkClstList.GetLast() ; i++) {
00684      TrackClusterSR *thisPlane = 
00685         dynamic_cast<TrackClusterSR*>(tempTrkClstList.At(i));
00686      Int_t planenum=thisPlane->GetPlane();
00687      if(abs(planenum-lastPlanenum)>5) { //Missing 5 planes
00688         numSections++;
00689         startPlane[numSections-1]=planenum;
00690         endPlane[numSections-1]=planenum;
00691         numPlanesInSection[numSections-1]=1;
00692      }
00693      else {
00694         endPlane[numSections-1]=planenum;
00695         numPlanesInSection[numSections-1]++;
00696      }
00697      
00698      lastPlanenum=planenum;
00699   }
00700   int biggestSection=0;
00701   int numInBiggestSection=0;
00702   for(int i=0; i<numSections; i++) {
00703      if(numPlanesInSection[i]>numInBiggestSection) {
00704         numInBiggestSection=numPlanesInSection[i];
00705         biggestSection=i;
00706      }
00707   }
00708      
00709   int started=0;
00710   int ended=0;
00711   isFirstPlaneU=0;
00712   nplane=0;
00713   nplaneu=0;
00714   nplanev=0;
00715   for (Int_t i=0; i<=tempTrkClstList.GetLast() ; i++) {
00716      TrackClusterSR *thisPlane = 
00717         dynamic_cast<TrackClusterSR*>(tempTrkClstList.At(i));
00718      Int_t planenum=thisPlane->GetPlane();
00719      if(planenum==startPlane[biggestSection]) {
00720         started=1;
00721      }
00722      if(started==1 && ended==0) {
00723         TrackClusterSR *newtc = new TrackClusterSR(*thisPlane);
00724         fTrkClstList.Add(newtc);
00725         nplane++;
00726         switch (thisPlane->GetPlaneView()) {
00727         case PlaneView::kU:
00728            if(isFirstPlaneU==0) isFirstPlaneU=1;
00729            nplaneu++;
00730            break;
00731         case PlaneView::kV:
00732            if(isFirstPlaneU==0) isFirstPlaneU=-1;
00733            nplanev++;
00734            break;
00735         default:
00736            break;
00737         }
00738      }
00739      if(planenum==endPlane[biggestSection]) ended=1;
00740   }
00741   tempTrkClstList.Delete();
00742   fLowestPlane=startPlane[biggestSection];
00743   fHighestPlane=endPlane[biggestSection];
00744   if(fLowestPlane>fHighestPlane) {
00745      int temp=fHighestPlane;
00746      fHighestPlane=fLowestPlane;
00747      fLowestPlane=temp;
00748   }
00749 
00750 
00751   fSizeOfVWeightMatrix=nplaneu;
00752   fSizeOfUWeightMatrix=nplanev;
00753   if(isFirstPlaneU==1) fSizeOfVWeightMatrix--;
00754   else fSizeOfUWeightMatrix--;
00755 
00756   if(nplaneu<8 || nplanev<8) {
00757       MSG("FitTrack3", Msg::kWarning) 
00758          << "Too few non-shower planes to fit in section" 
00759          << endl;
00760       fReasonsForNotFitting->Fill(2); //Too few planes section.
00761       return -1;
00762    }
00763   numShowerStrips=0;
00764   numShowerPlanes=0;
00765   for(Int_t planenum=fLowestPlane;planenum<=fHighestPlane;planenum++) {
00766      showerPos=showerPlanes.find(planenum);
00767      if(showerPos!=showerPlanes.end()) {
00768         numShowerPlanes++;
00769         numShowerStrips+=showerPos->second;
00770      }
00771   }
00772 
00773   
00774   if(numShowerPlanes>7 && numShowerStrips>10) {
00775      MSG("FitTrack3", Msg::kWarning) 
00776         << "Too many shower planes to fit: planes "
00777         << numShowerPlanes << " strips " << numShowerStrips 
00778         << endl;
00779      fReasonsForNotFitting->Fill(3); //Too many shower planes.
00780      return -1;
00781   }
00782   Double_t *zUPos = new Double_t [nplanev];
00783   Double_t *zVPos = new Double_t [nplaneu];
00784   Double_t *uPos = new Double_t [nplanev];
00785   Double_t *vPos = new Double_t [nplaneu];
00786   Double_t *zUPosErr = new Double_t [nplanev];
00787   Double_t *zVPosErr = new Double_t [nplaneu];
00788   Double_t *uPosErr = new Double_t [nplanev];
00789   Double_t *vPosErr = new Double_t [nplaneu];
00790   Int_t uptoU=0;
00791   Int_t uptoV=0;
00792   for (Int_t i=0; i<=fTrkClstList.GetLast() ; i++) {
00793      TrackClusterSR *thisPlane = 
00794         dynamic_cast<TrackClusterSR*>(fTrkClstList.At(i));
00795      Double_t tempZPos=thisPlane->GetZPos();
00796      Double_t tempTPos=thisPlane->GetTPos();
00797      Double_t tempZPosErr=0.005;
00798      Double_t tempTPosErr=thisPlane->GetTPosError();
00799 
00800      switch (thisPlane->GetPlaneView()) {
00801      case PlaneView::kU:
00802         zVPos[uptoV]=tempZPos;
00803         vPos[uptoV]=tempTPos;
00804         zVPosErr[uptoV]=tempZPosErr;
00805         vPosErr[uptoV]=tempTPosErr;
00806         uptoV++;
00807         break;
00808      case PlaneView::kV:
00809         zUPos[uptoU]=tempZPos;
00810         uPos[uptoU]=tempTPos;
00811         zUPosErr[uptoU]=tempZPosErr;
00812         uPosErr[uptoU]=tempTPosErr;
00813         uptoU++;
00814         break;
00815      default:
00816         break;
00817      }
00818   }
00819   Double_t uFigureOfStraightness=0;
00820   Double_t vFigureOfStraightness=0;
00821   {
00822      TGraphErrors grU(nplanev,zUPos,uPos,zUPosErr,uPosErr);
00823      TGraphErrors grV(nplaneu,zVPos,vPos,zVPosErr,vPosErr);
00824      TF1 fitty("fitty","pol1");
00825      grU.Fit("fitty","Q");
00826      Double_t uSlope=fitty.GetParameter(0);
00827      Double_t uSlopeErr=fitty.GetParError(0);
00828      Double_t uIntercept=fitty.GetParameter(1);
00829      Double_t uInterceptErr=fitty.GetParError(1);
00830      Double_t uChiSq=fitty.GetChisquare();
00831      Double_t uNDF=fitty.GetNDF();
00832      uFigureOfStraightness=uChiSq/uNDF;
00833      grV.Fit("fitty","Q");
00834      Double_t vSlope=fitty.GetParameter(0);
00835      Double_t vSlopeErr=fitty.GetParError(0);
00836      Double_t vIntercept=fitty.GetParameter(1);
00837      Double_t vInterceptErr=fitty.GetParError(1);
00838      Double_t vChiSq=fitty.GetChisquare();
00839      Double_t vNDF=fitty.GetNDF();
00840      vFigureOfStraightness=vChiSq/vNDF;
00841      MSG("FitTrack3", Msg::kVerbose)
00842         << endl
00843         << "uSlope: " << uSlope << endl
00844         << "uSlopeErr: " << uSlopeErr << endl
00845         << "uIntercept: " << uIntercept << endl
00846         << "uInterceptErr: " << uInterceptErr << endl
00847         << "uChiSq: " << uChiSq << endl
00848         << "uNDF: " << uNDF << endl
00849         << "uFigureOfStraightness: " << uFigureOfStraightness << endl
00850         << "vSlope: " << vSlope << endl
00851         << "vSlopeErr: " << vSlopeErr << endl
00852         << "vIntercept: " << vIntercept << endl
00853         << "vInterceptErr: " << vInterceptErr << endl
00854         << "vChiSq: " << vChiSq << endl
00855         << "vNDF: " << vNDF << endl
00856         << "vFigureOfStraightness: " << vFigureOfStraightness << endl;
00857   }
00858   delete [] zUPos;
00859   delete [] zVPos;
00860   delete [] uPos; 
00861   delete [] vPos;
00862   delete [] zUPosErr;
00863   delete [] zVPosErr;
00864   delete [] uPosErr;
00865   delete [] vPosErr;
00866 
00867   if(uFigureOfStraightness<0.4 || vFigureOfStraightness<0.4) {
00868       MSG("FitTrack3", Msg::kWarning) 
00869         << "Too straight to bother fitting: uChiSq/uNDF "
00870         << uFigureOfStraightness << " vChiSq/vNDF "
00871         << vFigureOfStraightness << endl;
00872        fReasonsForNotFitting->Fill(4); //Too straight
00873       return -1;
00874   }
00875   
00876   TrackClusterSR *firstPlane = 
00877      dynamic_cast<TrackClusterSR*>(fTrkClstList.At(0));  
00878   Double_t startU=0;
00879   Double_t startV=0;
00880   Double_t startZ=firstPlane->GetZPos();
00881   Double_t startdUdZ=0;
00882   Double_t startdVdZ=0;
00883   Double_t startMomentum=track0->GetMomentum()*1.1;
00884   
00885   
00886   Float_t zextent[2];
00887   ugh.GetZExtent(zextent[0],zextent[1]);
00888   Double_t endz=track0->GetEndZ();
00889   Double_t endu=track0->GetEndU();
00890   Double_t endv=track0->GetEndV();
00891   Double_t endx= .70710678*(endu-endv);
00892   Double_t endy= .70710678*(endu+endv);
00893 
00894   Double_t d2endz=min(endz-zextent[0],zextent[1]-endz);
00895   Double_t d2endv=0;
00896   Double_t d2endu=0;
00897   Double_t d2endx=0;
00898   Double_t d2endy=0;
00899   switch (fMyVC->GetDetector()) {
00900   case Detector::kNear:
00901      
00902      break;
00903   case Detector::kFar:
00904      // assume 8 m octagon
00905      d2endu = min(4.-endu,4.+endu);
00906      d2endv = min(4.-endv,4.+endv);
00907      d2endx = min(4.-endx,4.+endx);
00908      d2endy = min(4.-endy,4.+endy);
00909      break;
00910   case Detector::kCalDet:
00911      // assume 1 m rectangle
00912      break;
00913   default:
00914      MSG("EventSR",Msg::kWarning) << "Detector type " << fMyVC->GetDetector() 
00915                                   << " not supported.\n";
00916      break;
00917   }
00918   Double_t d2endmin=min(min(min(d2endu,d2endv),min(d2endx,d2endy)),d2endz);
00919   MSG("FitTrack3", Msg::kDebug) 
00920      << endl
00921      << "d2endmin: " << d2endmin << endl
00922      << "d2endz: " << d2endz << endl
00923      << "d2endu: " << d2endu << endl
00924      << "d2endv: " << d2endv << endl
00925      << "d2endx: " << d2endx << endl
00926      << "d2endy: " << d2endy << endl;
00927 
00928   if(d2endmin<0.1) startMomentum+=4; //Not contained
00929 
00930   fZ0=startZ;
00931   fU0=startU;
00932   fV0=startV;
00933   fdUdZ0=startdUdZ;
00934   fdVdZ0=startdVdZ;
00935   fP0=startMomentum;
00936   switch (firstPlane->GetPlaneView()) {
00937       case PlaneView::kU:
00938           startV=firstPlane->GetTPos();
00939           break;
00940       case PlaneView::kV:
00941           startU=firstPlane->GetTPos();
00942           break;
00943       default:
00944           break;
00945   }
00946   
00947    MSG("FitTrack3", Msg::kVerbose)
00948       << "Start Momentum " << fP0
00949       << " Start U " << startU
00950       << " Start V " << startV << endl;
00951   int doneSame=0;
00952   int doneOther=0;
00953   double firstOtherZ=0;
00954   double firstOtherTPos=0;
00955   int gotFirstOther=0;
00956   for (Int_t i=1; i<=fTrkClstList.GetLast() ; i++) {
00957       TrackClusterSR *thisPlane = 
00958           dynamic_cast<TrackClusterSR*>(fTrkClstList.At(i));
00959       if(thisPlane->GetPlaneView()==firstPlane->GetPlaneView()
00960           &&!doneSame) {
00961           Double_t newZ=thisPlane->GetZPos();
00962           Double_t newTPos=thisPlane->GetTPos();
00963           Double_t startTPos=firstPlane->GetTPos();
00964           if(newZ==startZ) continue; //should never happen
00965           Double_t dTdZ=(newTPos-startTPos)/(newZ-startZ);
00966           switch (firstPlane->GetPlaneView()) {
00967               case PlaneView::kU:
00968                   startdVdZ=dTdZ;
00969                   break;
00970               case PlaneView::kV:
00971                   startdUdZ=dTdZ;
00972                   break;
00973               default:
00974                   break;
00975           }
00976           doneSame=1;
00977       }
00978       else if(!doneOther) {
00979           if(!gotFirstOther) {
00980               firstOtherZ=thisPlane->GetZPos();
00981               firstOtherTPos=thisPlane->GetTPos();
00982               gotFirstOther=1;
00983           }
00984           else {
00985               Double_t newZ=thisPlane->GetZPos();
00986               Double_t newTPos=thisPlane->GetTPos();
00987               if(newZ==firstOtherZ) continue; //should never happen
00988               Double_t dTdZ=(newTPos-firstOtherTPos)/(newZ-firstOtherZ);
00989               Double_t startT=firstOtherTPos+(startZ-firstOtherZ)*dTdZ;
00990               switch (firstPlane->GetPlaneView()) {
00991                   case PlaneView::kU:
00992                       startdUdZ=dTdZ;
00993                       startU=startT;
00994                       break;
00995                   case PlaneView::kV:
00996                       startdVdZ=dTdZ;
00997                       startV=startT;
00998                       break;
00999                   default:
01000                       break;
01001               }
01002               doneOther=1;
01003           }    
01004 
01005 
01006 
01007       }
01008       if(doneSame && doneOther) break;
01009       
01010   }
01011   Int_t charge=-1; //Probably is.
01012   fCharge=charge;
01013   fZ0=startZ;
01014   fU0=startU;
01015   fV0=startV;
01016   fdUdZ0=startdUdZ;
01017   fdVdZ0=startdVdZ;
01018   fP0=startMomentum;
01019   MSG("FitTrack3", Msg::kVerbose)
01020      << "Start Momentum " << fP0 << endl
01021      << " Start U " << fU0 << endl
01022      << " Start V " << fV0 << endl
01023      << " Start dUdZ " << fdUdZ0 << endl
01024       << " Start dVdZ " << fdVdZ0 << endl;
01025   // Have now initialised the following variables.
01026   // 
01027 //   Double_t startU;
01028 //   Double_t startV;
01029 //   Double_t startZ;
01030 //   Double_t startdUdZ;
01031 //   Double_t startdVdZ;
01032 //   Int_t startPlane;
01033 //   Double_t startMomentum;
01034 //   Int_t izfor;   
01035   
01036   return 1;
01037   }

void AlgFitTrack3::InvertMatrixAndGetParams  )  [private]
 

Definition at line 1189 of file AlgFitTrack3.cxx.

References fCharge, fDdUdZ0, fDdVdZ0, fDP0, fDU0, fdUdZ0, fDV0, fdVdZ0, fIsNaturalP0, fLastCharge, fLastdUdZ0, fLastdVdZ0, fLastP0, fLastU0, fLastV0, fLastZ0, fMatrixA, fMatrixC, fMomFromRange, fP0, fU0, fV0, fZ0, and MSG.

Referenced by RunAlg().

01189                                             {
01190 
01191    MSG("FitTrack3", Msg::kVerbose)
01192      << "AlgFitTrack3::InvertMatrixAndGetParams()" << endl;
01193     
01194     fLastCharge=fCharge;
01195     fLastZ0=fZ0; //Doesn't change
01196     fLastU0=fU0;
01197     fLastV0=fV0;
01198     fLastdUdZ0=fdUdZ0;
01199     fLastdVdZ0=fdVdZ0;
01200     fLastP0=fP0;
01201 
01202  //     cout << endl << endl << "Matrix A =" << endl;
01203 //      fMatrixA.Print();
01204 //      cout << endl << endl << "Matrix C =" << endl;
01205 //      fMatrixC.Print();    
01206     if(fMatrixA.Determinant()!=0) {
01207        TMatrixD invertedMatrixA(TMatrixD::kInverted,fMatrixA);
01208        TMatrixD solution(invertedMatrixA,TMatrixD::kMult,fMatrixC);
01209        //      cout << endl << endl << "Inverted Matrix A =" << endl;
01210        //      invertedMatrixA.Print();
01211        //      cout << endl << endl << "Matrix B =" << endl;
01212        //      solution.Print();
01213        fU0=solution[0][0];
01214        fdUdZ0=solution[1][0];
01215        if(solution[2][0]!=0) fP0=1.0/solution[2][0];
01216        fV0=solution[3][0];
01217        fdVdZ0=solution[4][0];
01218        if(fP0<0) {
01219           fP0=-fP0;
01220           fCharge=-fCharge;
01221        }
01222        
01223        if(invertedMatrixA[0][0]>0) {
01224           fDU0=TMath::Sqrt(invertedMatrixA[0][0]);
01225        }
01226        else {
01227           fDU0=0;
01228        }
01229        if(invertedMatrixA[1][1]>0) {
01230           fDdUdZ0=TMath::Sqrt(invertedMatrixA[1][1]);
01231        }
01232        else {
01233           fDdUdZ0=0;
01234        }
01235        Double_t fDOneOverP0;
01236        if(invertedMatrixA[2][2]>0) {
01237           fDOneOverP0=TMath::Sqrt(invertedMatrixA[2][2]);
01238        }
01239        else {
01240           fDOneOverP0=0;
01241        }
01242        if(solution[2][0]!=0) fDP0=fDOneOverP0/solution[2][0];
01243        if(fDP0<0) fDP0=-fDP0;
01244        if(invertedMatrixA[3][3]>0) {
01245           fDV0=TMath::Sqrt(invertedMatrixA[3][3]);
01246        }
01247        else {
01248           fDV0=0;
01249        }
01250        if(invertedMatrixA[4][4]>0) {
01251           fDdVdZ0=TMath::Sqrt(invertedMatrixA[4][4]);
01252        }
01253        else {
01254           fDdVdZ0=0;
01255        }
01256        fIsNaturalP0=1;
01257        if(fP0<0.8*fMomFromRange) {
01258           fIsNaturalP0=0;
01259           MSG("FitTrack3",Msg::kError) 
01260              << "Momentum has gone too low. Now: " << fP0 << " from range: " 
01261              << fMomFromRange << " will try: " << fMomFromRange*0.9 << endl;
01262           fP0=fMomFromRange*0.9;
01263        }
01264        
01265        if(fDdVdZ0<=0 || fDV0<=0 || fDOneOverP0<=0 || fDdUdZ0<=0 || fDU0<=0) {
01266           MSG("FitTrack3",Msg::kError) 
01267              << "Negative errors. It's all gone horribly wrong" 
01268              << endl;
01269           fIsNaturalP0=0;
01270        }
01271     
01272        MSG("FitTrack3", Msg::kDebug) 
01273           << endl
01274           << "Charge: " << fCharge << " was " << fLastCharge << endl
01275           << "Z0: "  << fZ0 << " was " << fLastZ0 << endl
01276           << "U0: "  << fU0  << " +/- " << fDU0 << " was " << fLastU0 << endl
01277           << "V0: "  << fV0 <<  " +/- " << fDV0 << " was " << fLastV0 << endl
01278           << "dUdZ0: "  << fdUdZ0 <<  " +/- " << fDdUdZ0 
01279           << " was " << fLastdUdZ0 << endl
01280           << "dVdZ0: "  << fdVdZ0 <<  " +/- " << fDdVdZ0 
01281           << " was " << fLastdVdZ0 << endl
01282           << "P0: "  << fP0 << " +/- " << fDP0 << " was " << fLastP0 << endl;
01283        
01284      
01285     }
01286     else {
01287        MSG("FitTrack3",Msg::kError) 
01288              << "Can't invert MatrixA" 
01289              << endl;
01290        fP0+=1;
01291        fIsNaturalP0=0;
01292     }
01293         
01294 
01295 }

void AlgFitTrack3::RunAlg AlgConfig ac,
CandHandle ch,
CandContext cx
[virtual]
 

Implements AlgBase.

Definition at line 147 of file AlgFitTrack3.cxx.

References CandHandle::AddDaughterLink(), CleanUp(), fCharge, fChiSqU, fChiSqV, fDdUdZ0, fDdVdZ0, fDirection, fDP0, fDU0, fdUdZ0, fDV0, fdVdZ0, fFile, FillMatricesAandC(), FillWeightMatrix(), fIsNaturalP0, fLastP0, fMomFromRange, fP0, fParmMaxIterate, fParmMisalignmentError, fRangeThisPlane, fReasonsForNotFitting, fSwamdU, fSwamdV, fSwamU, fSwamV, fTrackNum, fTrkClstList, fU0, fV0, CandRecoHandle::GetCandSlice(), CandFitTrackHandle::GetChi2(), CandContext::GetDataIn(), CandHandle::GetDaughterIterator(), CandRecoHandle::GetDirCosU(), CandRecoHandle::GetDirCosV(), CandRecoHandle::GetDirCosZ(), CandTrackHandle::GetdS(), CandFitTrackHandle::GetEMCharge(), CandRecoHandle::GetEndDirCosU(), CandRecoHandle::GetEndDirCosV(), CandRecoHandle::GetEndDirCosZ(), CandRecoHandle::GetEndPlane(), CandRecoHandle::GetEndT(), CandRecoHandle::GetEndU(), CandRecoHandle::GetEndV(), CandRecoHandle::GetEndZ(), Registry::GetInt(), CandTrackHandle::GetMomentum(), CandFitTrackHandle::GetMomentumCurve(), CandFitTrackHandle::GetMomentumRange(), GetMomFromRange(), CandFitTrackHandle::GetPass(), TrackClusterSR::GetPlane(), CandTrackHandle::GetRange(), TrackClusterSR::GetStripList(), CandRecoHandle::GetTimeOffset(), CandRecoHandle::GetTimeSlope(), CandTrackHandle::GetU(), CandTrackHandle::GetV(), CandRecoHandle::GetVtxPlane(), CandRecoHandle::GetVtxT(), CandRecoHandle::GetVtxU(), CandRecoHandle::GetVtxV(), CandRecoHandle::GetVtxZ(), InitializeTrkClstList(), InvertMatrixAndGetParams(), CandTrackHandle::IsInShower(), CandTrackHandle::IsTPosValid(), MSG, CandRecoHandle::SetCandSlice(), CandFitTrackHandle::SetChi2(), CandRecoHandle::SetDirCosU(), CandRecoHandle::SetDirCosV(), CandRecoHandle::SetDirCosZ(), CandTrackHandle::SetdS(), CandFitTrack3Handle::SetdUdZ(), CandFitTrack3Handle::SetdUdZ0(), CandFitTrack3Handle::SetdUdZ0Err(), CandFitTrack3Handle::SetdUdZ0Initial(), CandFitTrack3Handle::SetdVdZ(), CandFitTrack3Handle::SetdVdZ0(), CandFitTrack3Handle::SetdVdZ0Err(), CandFitTrack3Handle::SetdVdZ0Initial(), CandFitTrackHandle::SetEMCharge(), CandRecoHandle::SetEndDirCosU(), CandRecoHandle::SetEndDirCosV(), CandRecoHandle::SetEndDirCosZ(), CandRecoHandle::SetEndPlane(), CandRecoHandle::SetEndT(), CandRecoHandle::SetEndU(), CandRecoHandle::SetEndV(), CandRecoHandle::SetEndZ(), CandFitTrack3Handle::SetInitialQP(), CandTrackHandle::SetInShower(), CandFitTrackHandle::SetMomentumCurve(), CandFitTrackHandle::SetMomentumRange(), CandFitTrack3Handle::SetNIterate(), CandFitTrack3Handle::SetP0(), CandFitTrack3Handle::SetP0Err(), CandFitTrack3Handle::SetP0Initial(), CandFitTrackHandle::SetPass(), CandTrackHandle::SetRange(), CandRecoHandle::SetTimeOffset(), CandRecoHandle::SetTimeSlope(), CandTrackHandle::SetU(), CandFitTrack3Handle::SetU0(), CandFitTrack3Handle::SetU0Err(), CandFitTrack3Handle::SetU0Initial(), CandTrackHandle::SetV(), CandFitTrack3Handle::SetV0(), CandFitTrack3Handle::SetV0Err(), CandFitTrack3Handle::SetV0Initial(), CandRecoHandle::SetVtxPlane(), CandRecoHandle::SetVtxT(), CandRecoHandle::SetVtxU(), CandRecoHandle::SetVtxV(), CandRecoHandle::SetVtxZ(), SwimAndFillMaps(), and tc.

00148 {
00149   MSG("FitTrack3", Msg::kVerbose) << "Starting AlgFitTrack3::RunAlg()" << endl;
00150 
00151   fParmMisalignmentError = ac.GetInt("MisalignmentError")*Munits::mm;
00152 
00153   fParmMaxIterate = ac.GetInt("MaxIterate");
00154 
00155   assert(ch.InheritsFrom("CandFitTrack3Handle"));
00156   CandFitTrack3Handle &cfh = dynamic_cast<CandFitTrack3Handle &>(ch);
00157 
00158   cfh.SetPass(0);
00159 
00160   assert(cx.GetDataIn());
00161 
00162   assert(cx.GetDataIn()->InheritsFrom("TObjArray"));
00163 
00164   
00165   const CandTrackHandle *track0 = 0;
00166   const TObjArray *cxin = dynamic_cast<const TObjArray *>(cx.GetDataIn());
00167   for (Int_t i=0; i<=cxin->GetLast(); i++) {
00168     TObject *tobj = cxin->At(i);
00169     if (tobj->InheritsFrom("CandTrackHandle")) {
00170       track0 = dynamic_cast<CandTrackHandle*>(tobj);
00171     }
00172   }
00173 
00174   assert(track0);
00175 
00176   fTrackNum++;
00177   //Set some standard CandTrack/CandFitTrack thingies.
00178   cfh.SetCandSlice(track0->GetCandSlice());
00179   cfh.SetDirCosU(track0->GetDirCosU());
00180   cfh.SetDirCosV(track0->GetDirCosV());
00181   cfh.SetDirCosZ(track0->GetDirCosZ());
00182   cfh.SetVtxU(track0->GetVtxU());
00183   cfh.SetVtxV(track0->GetVtxV());
00184   cfh.SetVtxZ(track0->GetVtxZ());
00185   cfh.SetVtxT(track0->GetVtxT());
00186   cfh.SetVtxPlane(track0->GetVtxPlane());
00187   cfh.SetEndDirCosU(track0->GetEndDirCosU());
00188   cfh.SetEndDirCosV(track0->GetEndDirCosV());
00189   cfh.SetEndDirCosZ(track0->GetEndDirCosZ());
00190   cfh.SetEndU(track0->GetEndU());
00191   cfh.SetEndV(track0->GetEndV());
00192   cfh.SetEndZ(track0->GetEndZ());
00193   cfh.SetEndT(track0->GetEndT());
00194   cfh.SetEndPlane(track0->GetEndPlane());
00195   cfh.SetTimeSlope(track0->GetTimeSlope());
00196   cfh.SetTimeOffset(track0->GetTimeOffset());
00197   cfh.SetMomentumRange(track0->GetMomentum());
00198   fMomFromRange=track0->GetMomentum();
00199   
00200 
00201   if(InitializeTrkClstList(track0)==-1) {
00202      //Can't go on
00203         
00204      CandStripHandleItr stripItr(track0->GetDaughterIterator());
00205      CandStripHandleKeyFunc *stripKf = stripItr.CreateKeyFunc();
00206      stripKf->SetFun(CandStripHandle::KeyFromPlane);
00207      stripItr.GetSet()->AdoptSortKeyFunc(stripKf);
00208      stripKf = 0;
00209      Int_t izfor=1;
00210      if (track0->GetTimeSlope()>0.) {
00211         stripItr.SetDirection(1);
00212         izfor=1;
00213      }
00214      else {
00215         stripItr.SetDirection(-1);
00216         izfor=-1;
00217      }
00218      stripItr.Reset();
00219      while (CandStripHandle *strip = stripItr()) {
00220         cfh.AddDaughterLink(*strip);
00221         cfh.SetInShower(strip,track0->IsInShower(strip));
00222      }
00223      for (Int_t iplane = cfh.GetEndPlane(); iplane*fDirection>=cfh.GetVtxPlane()*fDirection; iplane-=fDirection) {
00224         if (track0->IsTPosValid(iplane)) {
00225            // u and v coordinates have been calculated for this plane
00226            cfh.SetRange(iplane,track0->GetRange(iplane));
00227            
00228            cfh.SetU(iplane,track0->GetU(iplane));
00229            cfh.SetV(iplane,track0->GetV(iplane));
00230            cfh.SetdS(iplane,track0->GetdS(iplane));
00231         }
00232      }
00233      Double_t range = cfh.GetRange();
00234      if (range>0.) {
00235        // Until June 2005 was:
00236        //cfh.SetMomentumRange(0.105658*exp(1.0363*log(range)-4.383));
00237         // taken from PDG R/M vs p/M plot for Fe
00238 
00239        cfh.SetMomentumRange(GetMomFromRange(range));
00240 
00241      } else {
00242         cfh.SetMomentumRange(0.);
00243      }
00244      
00245   }
00246   else {
00247      //All the maps have been filled with the initial values.
00248     cfh.SetU0Initial(fU0);
00249     cfh.SetV0Initial(fV0);
00250     cfh.SetdUdZ0Initial(fdUdZ0);
00251     cfh.SetdVdZ0Initial(fdVdZ0);
00252     cfh.SetP0Initial(fP0);
00253     if(fP0>0) {
00254       cfh.SetInitialQP(fCharge/fP0);
00255     }
00256 
00257 
00258      SwimAndFillMaps();
00259      FillWeightMatrix();
00260      FillMatricesAandC();
00261      InvertMatrixAndGetParams();
00262      //First iteration don't know if we have the correct sign.
00263      //But the clever algorithm switches sign all by itself.
00264      SwimAndFillMaps();
00265      FillWeightMatrix();
00266      FillMatricesAandC();
00267      InvertMatrixAndGetParams();
00268      //Set Parameters in cfh
00269      cfh.SetU0(fU0);
00270      cfh.SetV0(fV0);
00271      cfh.SetdUdZ0(fdUdZ0);
00272      cfh.SetdVdZ0(fdVdZ0);
00273      cfh.SetP0(fP0);
00274      
00275      cfh.SetU0Err(fDU0);
00276      cfh.SetV0Err(fDV0);
00277      cfh.SetdUdZ0Err(fDdUdZ0);
00278      cfh.SetdVdZ0Err(fDdVdZ0);
00279      cfh.SetP0Err(fDP0);
00280      int numIterations=1;
00281      int numIterations2=0;
00282      while((fabs(fLastP0-fP0)>0.2 || fIsNaturalP0==0 )&& numIterations<=fParmMaxIterate) {
00283         SwimAndFillMaps();
00284         FillWeightMatrix();
00285         FillMatricesAandC();
00286         InvertMatrixAndGetParams();
00287         //Set Parameters in cfh
00288         cfh.SetU0(fU0);
00289         cfh.SetV0(fV0);
00290         cfh.SetdUdZ0(fdUdZ0);
00291         cfh.SetdVdZ0(fdVdZ0);
00292         cfh.SetP0(fP0);
00293      
00294         cfh.SetU0Err(fDU0);
00295         cfh.SetV0Err(fDV0);
00296         cfh.SetdUdZ0Err(fDdUdZ0);
00297         cfh.SetdVdZ0Err(fDdVdZ0);
00298         cfh.SetP0Err(fDP0);
00299         numIterations++;
00300      }
00301      if(fabs(fLastP0-fP0)>0.2 && fIsNaturalP0==1) {
00302         fP0=(fLastP0+fP0)/2.0;
00303         
00304         while((fabs(fLastP0-fP0)>0.2 || fIsNaturalP0==0 )&& numIterations2<=fParmMaxIterate) {
00305            SwimAndFillMaps();
00306            FillWeightMatrix();
00307            FillMatricesAandC();
00308            InvertMatrixAndGetParams();
00309            //Set Parameters in cfh
00310            cfh.SetU0(fU0);
00311            cfh.SetV0(fV0);
00312            cfh.SetdUdZ0(fdUdZ0);
00313            cfh.SetdVdZ0(fdVdZ0);
00314            cfh.SetP0(fP0);
00315            
00316            cfh.SetU0Err(fDU0);
00317            cfh.SetV0Err(fDV0);
00318            cfh.SetdUdZ0Err(fDdUdZ0);
00319            cfh.SetdVdZ0Err(fDdVdZ0);
00320            cfh.SetP0Err(fDP0);
00321            numIterations2++;
00322         }
00323      }
00324      cfh.SetNIterate(numIterations2+numIterations);
00325 
00326      //Quick check to see if our answer makes any sense what so ever
00327      Double_t totalRange=0;
00328      for (int i=0;i<=fTrkClstList.GetLast(); i++) {
00329         TrackClusterSR *tc = dynamic_cast<TrackClusterSR*>(fTrkClstList.At(i));
00330         Int_t iplane=tc->GetPlane();
00331         
00332         IntDoubleMap::iterator pos;
00333         pos=fRangeThisPlane.find(iplane);
00334         if(pos!=fRangeThisPlane.end()) {
00335            totalRange+=pos->second;
00336         }
00337      }
00338      if(totalRange < track0->GetRange() / 3.0) {
00339         //Something messed up.
00340         CandStripHandleItr stripItr(track0->GetDaughterIterator());
00341         CandStripHandleKeyFunc *stripKf = stripItr.CreateKeyFunc();
00342         stripKf->SetFun(CandStripHandle::KeyFromPlane);
00343         stripItr.GetSet()->AdoptSortKeyFunc(stripKf);
00344         stripKf = 0;
00345         Int_t izfor=1;
00346         if (track0->GetTimeSlope()>0.) {
00347            stripItr.SetDirection(1);
00348            izfor=1;
00349         }
00350         else {
00351            stripItr.SetDirection(-1);
00352            izfor=-1;
00353         }
00354         stripItr.Reset();
00355         while (CandStripHandle *strip = stripItr()) {
00356            cfh.AddDaughterLink(*strip);
00357            cfh.SetInShower(strip,track0->IsInShower(strip));
00358         }
00359         for (Int_t iplane = cfh.GetEndPlane(); iplane*fDirection>=cfh.GetVtxPlane()*fDirection; iplane-=fDirection) {
00360            if (track0->IsTPosValid(iplane)) {
00361               // u and v coordinates have been calculated for this plane
00362               cfh.SetRange(iplane,track0->GetRange(iplane));
00363               
00364               cfh.SetU(iplane,track0->GetU(iplane));
00365               cfh.SetV(iplane,track0->GetV(iplane));
00366               cfh.SetdS(iplane,track0->GetdS(iplane));
00367            }
00368         }
00369         Double_t range = cfh.GetRange();
00370         if (range>0.) {
00371           // Until June 2006 was:
00372            //cfh.SetMomentumRange(0.105658*exp(1.0363*log(range)-4.383));
00373            // taken from PDG R/M vs p/M plot for Fe
00374            cfh.SetMomentumRange(GetMomFromRange(range));
00375 
00376         } else {
00377            cfh.SetMomentumRange(0.);
00378         }
00379      }
00380      else {
00381      
00382         //Whoo! have hopefully fitted the little blighter
00383         for (int i=0;i<=fTrkClstList.GetLast(); i++) {
00384            TrackClusterSR *tc = dynamic_cast<TrackClusterSR*>(fTrkClstList.At(i));
00385            for (int j=0; j<=tc->GetStripList()->GetLast(); j++) {
00386               CandStripHandle *strip = dynamic_cast<CandStripHandle*>
00387               (tc->GetStripList()->At(j));
00388               cfh.AddDaughterLink(*strip);
00389               cfh.SetInShower(strip,track0->IsInShower(strip));
00390               Int_t thisPlane=tc->GetPlane();
00391               if((fDirection==1 && thisPlane==fLowestPlane) ||
00392                  (fDirection==-1 && thisPlane==fHighestPlane)) {
00393                  cfh.SetU(thisPlane,fU0);
00394                  cfh.SetV(thisPlane,fV0);
00395               }
00396               IntDoubleMap::iterator pos;
00397               pos=fSwamU.find(thisPlane);
00398               if(pos!=fSwamU.end()) cfh.SetU(thisPlane,pos->second);
00399               pos=fSwamV.find(thisPlane);
00400               if(pos!=fSwamV.end()) cfh.SetV(thisPlane,pos->second);
00401               pos=fSwamdU.find(thisPlane);
00402               if(pos!=fSwamdU.end()) cfh.SetdUdZ(thisPlane,pos->second);
00403               pos=fSwamdV.find(thisPlane);
00404               if(pos!=fSwamdV.end()) cfh.SetdVdZ(thisPlane,pos->second);
00405               
00406               
00407            }
00408         }
00409         
00410         // set ds, range
00411         Double_t totalRange=0;
00412         for (Int_t iplane = cfh.GetEndPlane(); iplane*fDirection>=cfh.GetVtxPlane()*fDirection; iplane-=fDirection) {
00413            if (track0->IsTPosValid(iplane)) {
00414               // u and v coordinates have been calculated for this plane
00415               cfh.SetdS(iplane,track0->GetdS(iplane));
00416               cfh.SetRange(iplane,totalRange);
00417               IntDoubleMap::iterator pos;
00418               pos=fRangeThisPlane.find(iplane);
00419               if(pos!=fRangeThisPlane.end()) {
00420                  totalRange+=pos->second;
00421               }
00422            }
00423         }
00424         MSG("FitTrack3", Msg::kVerbose) << "Total Range: " << totalRange 
00425                                         << " CandTrackSR range: " 
00426                                         << track0->GetRange() << endl;
00427         int definetlyFail=0;
00428         if(totalRange < track0->GetRange() / 3.0) {
00429            definetlyFail=1;
00430            for (Int_t iplane = cfh.GetEndPlane(); 
00431                 iplane*fDirection>=cfh.GetVtxPlane()*fDirection;
00432                 iplane-=fDirection) {
00433               if (track0->IsTPosValid(iplane)) {
00434                  // u and v coordinates have been calculated for this plane
00435                  cfh.SetRange(iplane,track0->GetRange(iplane));
00436               }
00437            }
00438         }
00439         
00440      
00441      
00442      
00443      
00444         MSG("FitTrack3", Msg::kVerbose) << "Finished after "
00445                                         << numIterations << " iterations." << endl;
00446         if(fabs(fLastP0-fP0)<0.2 && fIsNaturalP0==1 && fP0>0.1 && !definetlyFail) //Sometimes get silly results
00447            cfh.SetPass(1);
00448         MSG("FitTrack3", Msg::kVerbose) << "Did it pass?? " 
00449                                         << cfh.GetPass() << endl;
00450 
00451         
00452         Double_t range = cfh.GetRange();
00453         if (range>0.) {
00454           // until june 2006  
00455           // cfh.SetMomentumRange(0.105658*exp(1.0363*log(range)-4.383));
00456            // taken from PDG R/M vs p/M plot for Fe
00457 
00458            cfh.SetMomentumRange(GetMomFromRange(range));
00459 
00460 
00461         } else {
00462            cfh.SetMomentumRange(0.);
00463         }
00464 
00465         
00466         MSG("FitTrack3", Msg::kVerbose) << "Set Momentum Range to: " 
00467                                         << cfh.GetMomentumRange() << endl;
00468         cfh.SetMomentumCurve(fP0);
00469         MSG("FitTrack3", Msg::kVerbose) << "Set Momentum Curve to: " 
00470                                         << cfh.GetMomentumCurve() << endl;
00471         cfh.SetEMCharge(fCharge);
00472         MSG("FitTrack3", Msg::kVerbose) << "Set Charge to: " 
00473                                         << cfh.GetEMCharge() << endl;
00474         cfh.SetChi2(fChiSqU+fChiSqV);
00475         MSG("FitTrack3", Msg::kVerbose) << "Set Chisq to: " 
00476                                         << cfh.GetChi2() << endl;
00477         
00478      }
00479   }
00480   CleanUp();
00481   fFile->cd();
00482   fReasonsForNotFitting->Write("reasons",TObject::kOverwrite);
00483 }

void AlgFitTrack3::SwimAndFillMaps  )  [private]
 

Definition at line 1041 of file AlgFitTrack3.cxx.

References PlexPlaneId::AsString(), fActualZ, fDistanceFromStart, SwimObj3::fdudz, SwimObj3::fdvdz, fErrorOnMeasure, fFile, fIterations, fMeasuredU, fMeasuredV, fMyVC, fRangeThisPlane, fS_isU, fS_measuredU, fS_measuredV, fS_swamU, fS_swamV, fS_z, fSillyTree, fSwamdU, fSwamdV, fSwamU, fSwamV, fTheta0i, fThicknessi, fTrkClstList, SwimObj3::fu, SwimObj3::fv, SwimObj3::GetPath(), PlexPlaneId::GetPlane(), TrackClusterSR::GetPlane(), UgliGeomHandle::GetPlaneIdFromZ(), TrackClusterSR::GetPlaneView(), SwimObj3::GetRange(), SwimObj3::GetTheta(), TrackClusterSR::GetTPos(), TrackClusterSR::GetTPosError(), TrackClusterSR::GetZPos(), PlexPlaneId::IsSteel(), MSG, and SwimObj3::SwimTo().

Referenced by RunAlg().

01041                                    {
01042    MSG("FitTrack3", Msg::kVerbose)
01043      << "AlgFitTrack3::SwimAndFillMaps()" << endl;
01044  // Have now initialised the following variables.
01045   // 
01046    fIterations++;
01047   
01048 
01049     Double_t startU=fU0;
01050     Double_t startV=fV0;
01051     Double_t startZ=fZ0;
01052     Double_t startdUdZ=fdUdZ0;
01053     Double_t startdVdZ=fdVdZ0;
01054     Double_t startMomentum=fP0;
01055     Int_t charge=fCharge;
01056     Int_t izfor=fDirection;   
01057     
01058     UgliGeomHandle ugh(*fMyVC);
01059     
01060 
01061     fTheta0i.clear(); // mean square scattering angle.
01062     fThicknessi.clear(); // thickness .
01063     fSwamU.clear();
01064     fSwamV.clear();
01065     fSwamdU.clear();
01066     fSwamdV.clear();
01067     fMeasuredU.clear();
01068     fMeasuredV.clear();
01069     fActualZ.clear();
01070     fErrorOnMeasure.clear();
01071     fDistanceFromStart.clear();
01072     fRangeThisPlane.clear();
01073     
01074     //Make ourselves a swimmer object.
01075     SwimObj3 swimmer(startU,startV,startZ,startdUdZ,startdVdZ,
01076                      double(charge*startMomentum),izfor,fMyVC);
01077 
01078 //     Double_t lastU=startU;
01079 //     Double_t lastV=startV;
01080 //     Double_t lastZ=startZ;
01081     
01082     // int numDone;
01083     Double_t totalDistanceFromStart=0;
01084     for(Int_t i=1; i<=fTrkClstList.GetLast(); i++) {
01085         TrackClusterSR *thisPlane = 
01086             dynamic_cast<TrackClusterSR*>(fTrkClstList.At(i));
01087         Int_t newPlane=thisPlane->GetPlane();
01088         Double_t newZ=thisPlane->GetZPos();
01089         MSG("FitTrack3", Msg::kVerbose)
01090            << "Plane: " << newPlane 
01091            << "\tZ Pos: " << newZ << endl;
01092 
01093         fActualZ[newPlane]=newZ;
01094         swimmer.SwimTo(newZ);
01095         Double_t pathFromLast=swimmer.GetPath();
01096 
01097         totalDistanceFromStart+=pathFromLast;
01098         fDistanceFromStart[newPlane]=pathFromLast;
01099         Double_t thisTheta=swimmer.GetTheta();
01100         fTheta0i[newPlane]=thisTheta;
01101         MSG("FitTrack3", Msg::kVerbose)
01102            << "Plane: " << newPlane << endl 
01103            << "Z Pos: " << newZ << endl
01104            << "Path From Last Plane " << pathFromLast << endl
01105            << "Theta0i " << thisTheta << endl;
01106         
01107         PlexPlaneId planeId= ugh.GetPlaneIdFromZ(newZ);
01108         MSG("FitTrack3", Msg::kVerbose)
01109            << "Plane: " << newPlane << endl
01110            << "From Plane Id: " << planeId.GetPlane() << endl
01111            << "IsSteel: " << planeId.IsSteel() << endl
01112            << planeId.AsString() << endl;
01113         fRangeThisPlane[newPlane]=swimmer.GetRange();
01114         
01115         Double_t thisPlaneThickness=pathFromLast; //Seems I need this number and not xi
01116 
01117         fThicknessi[newPlane]=thisPlaneThickness;
01118         
01119         fErrorOnMeasure[newPlane]=thisPlane->GetTPosError();
01120         fS_z=newZ;
01121         fSwamdV[newPlane]=swimmer.fdvdz;
01122         fSwamdU[newPlane]=swimmer.fdudz;
01123         fSwamV[newPlane]=swimmer.fv;
01124         fSwamU[newPlane]=swimmer.fu;
01125         switch (thisPlane->GetPlaneView()) {
01126             case PlaneView::kU:
01127                 fMeasuredV[newPlane]=thisPlane->GetTPos();
01128                 fS_measuredV=thisPlane->GetTPos();
01129                 fS_swamV=swimmer.fv;
01130                 fS_isU=0;
01131                 break;
01132             case PlaneView::kV:
01133                 fMeasuredU[newPlane]=thisPlane->GetTPos();
01134                 fS_measuredU=thisPlane->GetTPos();
01135                 fS_swamU=swimmer.fu;
01136                 fS_isU=1;
01137                 break;
01138             default:
01139                 break;
01140         }
01141         fSillyTree->Fill();
01142     }
01143     
01144     fFile->cd();
01145     fSillyTree->Write("sillyTree",TObject::kOverwrite);
01146     
01147 
01148 }

void AlgFitTrack3::Trace const char *  c  )  const [virtual]
 

Reimplemented from AlgBase.

Definition at line 1821 of file AlgFitTrack3.cxx.

01822 {
01823 }


Member Data Documentation

IntDoubleMap AlgFitTrack3::fActualZ [private]
 

Definition at line 63 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillMatricesAandC(), SwimAndFillMaps(), and ~AlgFitTrack3().

Int_t AlgFitTrack3::fCharge [private]
 

Definition at line 74 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList(), InvertMatrixAndGetParams(), and RunAlg().

Double_t AlgFitTrack3::fChiSqU [private]
 

Definition at line 99 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), and RunAlg().

Double_t AlgFitTrack3::fChiSqV [private]
 

Definition at line 100 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), and RunAlg().

Double_t AlgFitTrack3::fDdUdZ0 [private]
 

Definition at line 93 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Double_t AlgFitTrack3::fDdVdZ0 [private]
 

Definition at line 94 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Int_t AlgFitTrack3::fDirection [private]
 

Definition at line 70 of file AlgFitTrack3.h.

Referenced by CalculateD(), CalculateP(), FillMatricesAandC(), FillWeightMatrix(), InitializeTrkClstList(), and RunAlg().

IntDoubleMap AlgFitTrack3::fDistanceFromStart [private]
 

Definition at line 53 of file AlgFitTrack3.h.

Referenced by CalculateD(), CleanUp(), SwimAndFillMaps(), and ~AlgFitTrack3().

Double_t AlgFitTrack3::fDP0 [private]
 

Definition at line 90 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Double_t AlgFitTrack3::fDU0 [private]
 

Definition at line 91 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Double_t AlgFitTrack3::fdUdZ0 [private]
 

Definition at line 78 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), InitializeTrkClstList(), InvertMatrixAndGetParams(), and RunAlg().

Double_t AlgFitTrack3::fDV0 [private]
 

Definition at line 92 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Double_t AlgFitTrack3::fdVdZ0 [private]
 

Definition at line 79 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), InitializeTrkClstList(), InvertMatrixAndGetParams(), and RunAlg().

IntDoubleMap AlgFitTrack3::fErrorOnMeasure [private]
 

Definition at line 60 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillWeightMatrix(), SwimAndFillMaps(), and ~AlgFitTrack3().

TFile* AlgFitTrack3::fFile [private]
 

Definition at line 131 of file AlgFitTrack3.h.

Referenced by RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

Int_t AlgFitTrack3::fFirstPlane [private]
 

Definition at line 66 of file AlgFitTrack3.h.

Referenced by CalculateP(), and InitializeTrkClstList().

Int_t AlgFitTrack3::fHighestPlane [private]
 

Definition at line 69 of file AlgFitTrack3.h.

Referenced by CalculateP(), FillMatricesAandC(), FillWeightMatrix(), and InitializeTrkClstList().

Int_t AlgFitTrack3::fIsNaturalP0 [private]
 

Definition at line 72 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Int_t AlgFitTrack3::fIterations [private]
 

Definition at line 102 of file AlgFitTrack3.h.

Referenced by CleanUp(), and SwimAndFillMaps().

Int_t AlgFitTrack3::fLastCharge [private]
 

Definition at line 82 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams().

Double_t AlgFitTrack3::fLastdUdZ0 [private]
 

Definition at line 86 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams().

Double_t AlgFitTrack3::fLastdVdZ0 [private]
 

Definition at line 87 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams().

Double_t AlgFitTrack3::fLastP0 [private]
 

Definition at line 88 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

Int_t AlgFitTrack3::fLastPlane [private]
 

Definition at line 67 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

Double_t AlgFitTrack3::fLastU0 [private]
 

Definition at line 84 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams().

Double_t AlgFitTrack3::fLastV0 [private]
 

Definition at line 85 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams().

Double_t AlgFitTrack3::fLastZ0 [private]
 

Definition at line 83 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams().

Int_t AlgFitTrack3::fLowestPlane [private]
 

Definition at line 68 of file AlgFitTrack3.h.

Referenced by CalculateP(), FillMatricesAandC(), FillWeightMatrix(), and InitializeTrkClstList().

TMatrixD AlgFitTrack3::fMatrixA [private]
 

Definition at line 125 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), and InvertMatrixAndGetParams().

TMatrixD AlgFitTrack3::fMatrixC [private]
 

Definition at line 126 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), and InvertMatrixAndGetParams().

IntDoubleMap AlgFitTrack3::fMeasuredU [private]
 

Definition at line 61 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillMatricesAandC(), FillWeightMatrix(), SwimAndFillMaps(), and ~AlgFitTrack3().

IntDoubleMap AlgFitTrack3::fMeasuredV [private]
 

Definition at line 62 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillMatricesAandC(), FillWeightMatrix(), SwimAndFillMaps(), and ~AlgFitTrack3().

Double_t AlgFitTrack3::fMomFromRange [private]
 

Definition at line 73 of file AlgFitTrack3.h.

Referenced by InvertMatrixAndGetParams(), and RunAlg().

VldContext* AlgFitTrack3::fMyVC [private]
 

Definition at line 129 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList(), and SwimAndFillMaps().

Double_t AlgFitTrack3::fP0 [private]
 

Definition at line 80 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), InitializeTrkClstList(), InvertMatrixAndGetParams(), and RunAlg().

Int_t AlgFitTrack3::fParmMaxIterate [private]
 

Definition at line 48 of file AlgFitTrack3.h.

Referenced by RunAlg().

Double_t AlgFitTrack3::fParmMisalignmentError [private]
 

Definition at line 49 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList(), and RunAlg().

Int_t AlgFitTrack3::fR_showerU [private]
 

Definition at line 137 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

Int_t AlgFitTrack3::fR_showerV [private]
 

Definition at line 138 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

Int_t AlgFitTrack3::fR_totalU [private]
 

Definition at line 135 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

Int_t AlgFitTrack3::fR_totalV [private]
 

Definition at line 136 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

Int_t AlgFitTrack3::fR_validU [private]
 

Definition at line 139 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

Int_t AlgFitTrack3::fR_validV [private]
 

Definition at line 140 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

IntDoubleMap AlgFitTrack3::fRangeThisPlane [private]
 

Definition at line 52 of file AlgFitTrack3.h.

Referenced by CleanUp(), RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

TH1F* AlgFitTrack3::fReasonsForNotFitting [private]
 

Definition at line 133 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList(), and RunAlg().

TTree* AlgFitTrack3::fReasonsTree [private]
 

Definition at line 134 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList().

IntIntMap AlgFitTrack3::fReverseMapUIndex [private]
 

Definition at line 105 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillWeightMatrix(), GetWiju(), and ~AlgFitTrack3().

IntIntMap AlgFitTrack3::fReverseMapVIndex [private]
 

Definition at line 106 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillWeightMatrix(), GetWijv(), and ~AlgFitTrack3().

Int_t AlgFitTrack3::fS_isU [private]
 

Definition at line 148 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

Double_t AlgFitTrack3::fS_measuredU [private]
 

Definition at line 144 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

Double_t AlgFitTrack3::fS_measuredV [private]
 

Definition at line 145 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

Double_t AlgFitTrack3::fS_swamU [private]
 

Definition at line 146 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

Double_t AlgFitTrack3::fS_swamV [private]
 

Definition at line 147 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

Double_t AlgFitTrack3::fS_z [private]
 

Definition at line 143 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

TTree* AlgFitTrack3::fSillyTree [private]
 

Definition at line 132 of file AlgFitTrack3.h.

Referenced by SwimAndFillMaps().

Int_t AlgFitTrack3::fSizeOfUWeightMatrix [private]
 

Definition at line 103 of file AlgFitTrack3.h.

Referenced by FillWeightMatrix(), and InitializeTrkClstList().

Int_t AlgFitTrack3::fSizeOfVWeightMatrix [private]
 

Definition at line 104 of file AlgFitTrack3.h.

Referenced by FillWeightMatrix(), and InitializeTrkClstList().

IntDoubleMap AlgFitTrack3::fSwamdU [private]
 

Definition at line 58 of file AlgFitTrack3.h.

Referenced by CleanUp(), RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

IntDoubleMap AlgFitTrack3::fSwamdV [private]
 

Definition at line 59 of file AlgFitTrack3.h.

Referenced by CleanUp(), RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

IntDoubleMap AlgFitTrack3::fSwamU [private]
 

Definition at line 56 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillMatricesAandC(), RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

IntDoubleMap AlgFitTrack3::fSwamV [private]
 

Definition at line 57 of file AlgFitTrack3.h.

Referenced by CleanUp(), FillMatricesAandC(), RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

IntDoubleMap AlgFitTrack3::fTheta0i [private]
 

Definition at line 54 of file AlgFitTrack3.h.

Referenced by CalculateP(), CleanUp(), SwimAndFillMaps(), and ~AlgFitTrack3().

IntDoubleMap AlgFitTrack3::fThicknessi [private]
 

Definition at line 55 of file AlgFitTrack3.h.

Referenced by CalculateP(), CleanUp(), SwimAndFillMaps(), and ~AlgFitTrack3().

Int_t AlgFitTrack3::fTrackNum [private]
 

Definition at line 120 of file AlgFitTrack3.h.

Referenced by RunAlg().

TObjArray AlgFitTrack3::fTrkClstList [private]
 

Definition at line 128 of file AlgFitTrack3.h.

Referenced by CleanUp(), InitializeTrkClstList(), RunAlg(), SwimAndFillMaps(), and ~AlgFitTrack3().

Double_t AlgFitTrack3::fU0 [private]
 

Definition at line 76 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), InitializeTrkClstList(), InvertMatrixAndGetParams(), and RunAlg().

TMatrixD* AlgFitTrack3::fUWeightMatrix [private]
 

Definition at line 123 of file AlgFitTrack3.h.

Referenced by CleanUp(), and FillWeightMatrix().

Double_t AlgFitTrack3::fV0 [private]
 

Definition at line 77 of file AlgFitTrack3.h.

Referenced by FillMatricesAandC(), InitializeTrkClstList(), InvertMatrixAndGetParams(), and RunAlg().

TMatrixD* AlgFitTrack3::fVWeightMatrix [private]
 

Definition at line 124 of file AlgFitTrack3.h.

Referenced by CleanUp(), and FillWeightMatrix().

Double_t AlgFitTrack3::fZ0 [private]
 

Definition at line 75 of file AlgFitTrack3.h.

Referenced by InitializeTrkClstList(), and InvertMatrixAndGetParams().


The documentation for this class was generated from the following files:
Generated on Sat Nov 21 22:49:17 2009 for loon by  doxygen 1.3.9.1