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

AlgFitTrackAtNu Class Reference

#include <AlgFitTrackAtNu.h>

Inheritance diagram for AlgFitTrackAtNu:

AlgBase List of all members.

Public Member Functions

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

Private Member Functions

Double_t GetTrackQP (TVector3 P, TVector3 dPdZ, TVector3 B)
Int_t FitTrack (Int_t N, TMatrixD *x, TMatrixD *y, TMatrixD *err, Int_t M, TMatrixD *p, TMatrixD *dp, TMatrixD *dpdx)

Private Attributes

TObjArray fTrkStrpList [500]
TObjArray fSliStrpList [500]

Constructor & Destructor Documentation

AlgFitTrackAtNu::AlgFitTrackAtNu  ) 
 

Definition at line 24 of file AlgFitTrackAtNu.cxx.

References MSG.

00025 {
00026   MSG("AlgFitTrackAtNu",Msg::kVerbose) << " *** AlgFitTrackAtNu::AlgFitTrackAtNu() *** " << endl;
00027 }

AlgFitTrackAtNu::~AlgFitTrackAtNu  ) 
 

Definition at line 29 of file AlgFitTrackAtNu.cxx.

References MSG.

00030 {
00031   MSG("AlgFitTrackAtNu",Msg::kVerbose) << " *** AlgFitTrackAtNu::~AlgFitTrackAtNu() *** " << endl;
00032 }


Member Function Documentation

Int_t AlgFitTrackAtNu::FitTrack Int_t  N,
TMatrixD *  x,
TMatrixD *  y,
TMatrixD *  err,
Int_t  M,
TMatrixD *  p,
TMatrixD *  dp,
TMatrixD *  dpdx
[private]
 

Definition at line 774 of file AlgFitTrackAtNu.cxx.

References C, MSG, and v.

Referenced by RunAlg().

00775 {
00776   // This method performs M-th order polynomial fit
00777   // N measurements, M parameters
00778 
00779   Double_t u,v;
00780   Int_t i,n,m,q; 
00781 
00782   if(M>N){
00783     MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** not enough measurements for fit *** " << endl;
00784     return -1;
00785   }
00786 
00787   // expanion matrix L(m,n) = F_m( X(n) )   
00788   TMatrixD L(M,N); // M down, N across  
00789   for(n=0;n<N;n++){
00790     for(m=0;m<M;m++){
00791       u=(*x)(n,0); v=0.0;
00792       switch(m){
00793         case 0 : v=1.0; break; 
00794         case 1 : v=1.0*u; break; 
00795         case 2 : v=1.0*u*u; break; 
00796         case 3 : v=1.0*u*u*u; break; 
00797         case 4 : v=1.0*u*u*u*u; break; 
00798         case 5 : v=1.0*u*u*u*u*u; break;
00799         default : break; 
00800       }
00801       L(m,n) = v;
00802     }
00803   }
00804 
00805   // measurement matrix
00806   TMatrixD Y(N,1); // N down, 1 across
00807   for(n=0;n<N;n++){
00808     Y(n,0) = (*y)(n,0);
00809   }
00810 
00811   // measurement error matrix 
00812   TMatrixD dY(N,N); // N down, N across
00813   for(n=0;n<N;n++){
00814     for(i=0;i<N;i++){
00815       if(i==n) dY(n,i)=((*err)(n,0))*((*err)(n,0)); else dY(n,i)=0.0;
00816     }
00817   }
00818 
00819   // parameter matrix A(m) = coefficient of F_m
00820   TMatrixD A(M,1); // M down, 1 across
00821 
00822   // parameter error matrix
00823   TMatrixD dA(M,M); // M down, M across
00824 
00825   // normal equations:
00826   // L(M,N) C(N,N) Y(N,0)  =  L(M,N) C(N,N) L_t(N,M) A(M,0)
00827   // C(N,N) = covariance matrix = inv(dY)
00828 
00829   // solutions:
00830   // A(M)  =  T(M,N) Y(N)  =  inv(L C L_t) (L C) Y(N)
00831   // dA(M,M) = T(M,N) dY(N,N) T_t(N,M)
00832 
00833   // Tranpose L
00834   TMatrixD Lt(N,M);
00835   for(n=0;n<N;n++){
00836     for(m=0;m<M;m++){
00837       Lt(n,m)=L(m,n);
00838     }
00839   }
00840 
00841   // Calculate A
00842   TMatrixD C(N,N); C=dY; C.Invert();
00843   TMatrixD LC(M,N); LC.Mult(L,C);
00844   TMatrixD LCL(M,M); LCL.Mult(LC,Lt); LCL.Invert();
00845   TMatrixD T(M,N); T.Mult(LCL,LC);
00846   A.Mult(T,Y);
00847 
00848   // Tranpose T
00849   TMatrixD Tt(N,M);
00850   for(n=0;n<N;n++){
00851     for(m=0;m<M;m++){
00852       Tt(n,m)=T(m,n);
00853     }
00854   }
00855 
00856   // Calculate dA
00857   TMatrixD dYTt(N,M); dYTt.Mult(dY,Tt);
00858   dA.Mult(T,dYTt);
00859 
00860   // return dA/dx
00861   for(n=0;n<N;n++){
00862     for(m=0;m<M;m++){
00863       (*dpdx)(n,m)=Tt(n,m);
00864     }
00865   }
00866 
00867   // return A and dA
00868   for(m=0;m<M;m++){
00869     (*p)(m,0)=A(m,0);
00870     for(q=0;q<M;q++){
00871       (*dp)(m,q)=dA(m,q);
00872     }
00873   }
00874 
00875   return 1;
00876 }

Double_t AlgFitTrackAtNu::GetTrackQP TVector3  P,
TVector3  dPdZ,
TVector3  B
[private]
 

Definition at line 749 of file AlgFitTrackAtNu.cxx.

Referenced by RunAlg().

00750 {
00751   // This method calculates Q/P from fit
00752   Double_t qp;
00753   Double_t dUdZ,d2UdZ2,dVdZ,d2VdZ2;
00754   Double_t Bu,Bv,Bz;
00755   TVector3 p,b,pxb,dpds,ndpds,pdnds;
00756 
00757   qp=0.0;
00758   dUdZ=P.X(); dVdZ=P.Y(); 
00759   d2UdZ2=dPdZ.X(); d2VdZ2=dPdZ.Y();
00760   Bu=B.X(); Bv=B.Y(); Bz=B.Z();
00761   p.SetXYZ(dUdZ,dVdZ,1.0);
00762   b.SetXYZ(Bu,Bv,Bz);
00763   if(p.Mag2()>0.0 && b.Mag2()>0.0){
00764     pxb=(1.0/p.Mag())*p.Cross(b);
00765     ndpds.SetXYZ(d2UdZ2,d2VdZ2,0.0);
00766     pdnds.SetXYZ(dUdZ,dVdZ,1.0); 
00767     dpds=(1.0/p.Mag2())*(ndpds-pdnds*((d2UdZ2*dUdZ+d2VdZ2*dVdZ)/(p.Mag2())));
00768     qp=(dpds.Dot(pxb))/(0.3*pxb.Mag2()); 
00769   }
00770 
00771   return qp;
00772 }

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

Implements AlgBase.

Definition at line 34 of file AlgFitTrackAtNu.cxx.

References CandHandle::AddDaughterLink(), FitTrack(), fSliStrpList, fTrkStrpList, BField::GetBField(), CandContext::GetCandRecord(), CandRecoHandle::GetCandSlice(), CandStripHandle::GetCharge(), CandFitTrackHandle::GetChi2(), CandFitTrackAtNuHandle::GetChi2Lin(), CandContext::GetDataIn(), CandHandle::GetDaughterIterator(), VldContext::GetDetector(), CandRecoHandle::GetDirCosU(), CandRecoHandle::GetDirCosV(), CandRecoHandle::GetDirCosZ(), CandFitTrackHandle::GetEMCharge(), CandRecoHandle::GetEndDirCosU(), CandRecoHandle::GetEndDirCosV(), CandRecoHandle::GetEndDirCosZ(), CandRecoHandle::GetEndU(), CandRecoHandle::GetEndV(), CandRecoHandle::GetEndZ(), Registry::GetInt(), CandTrackHandle::GetMomentum(), CandFitTrackHandle::GetMomentumCurve(), CandFitTrackAtNuHandle::GetMomentumCurveErr(), CandFitTrackHandle::GetMomentumRange(), CandFitTrackHandle::GetPass(), CandStripHandle::GetPlane(), CandStripHandle::GetPlaneView(), CandFitTrackAtNuHandle::GetQPcorr(), CandFitTrackAtNuHandle::GetQPerr(), CandFitTrackAtNuHandle::GetQPmean(), CandFitTrackAtNuHandle::GetQPplns(), CandFitTrackAtNuHandle::GetQPwidth(), CandTrackHandle::GetRange(), UgliGeomHandle::GetSteelPlnHandle(), CandStripHandle::GetStrip(), CandRecoHandle::GetTimeSlope(), CandStripHandle::GetTPos(), GetTrackQP(), RecMinos::GetVldContext(), CandFitTrackHandle::GetVtxQPError(), CandRecoHandle::GetVtxU(), CandRecoHandle::GetVtxV(), CandRecoHandle::GetVtxZ(), UgliSteelPlnHandle::GetZ0(), CandStripHandle::GetZPos(), MSG, s(), CandFitTrackHandle::SetChi2(), CandFitTrackAtNuHandle::SetChi2Lin(), CandRecoHandle::SetDirCosU(), CandRecoHandle::SetDirCosV(), CandRecoHandle::SetDirCosZ(), CandFitTrackHandle::SetEMCharge(), CandRecoHandle::SetEndDirCosU(), CandRecoHandle::SetEndDirCosV(), CandRecoHandle::SetEndDirCosZ(), CandRecoHandle::SetEndPlane(), CandRecoHandle::SetEndT(), CandTrackHandle::SetEndTrace(), CandRecoHandle::SetEndU(), CandRecoHandle::SetEndV(), CandRecoHandle::SetEndZ(), CandFitTrackHandle::SetFinderTrack(), BField::SetInterpMethod(), CandTrackHandle::SetMomentum(), CandFitTrackHandle::SetMomentumCurve(), CandFitTrackAtNuHandle::SetMomentumCurveErr(), CandFitTrackHandle::SetMomentumRange(), CandFitTrackHandle::SetNIterate(), CandFitTrackHandle::SetPass(), CandFitTrackAtNuHandle::SetQPcorr(), CandFitTrackAtNuHandle::SetQPerr(), CandFitTrackAtNuHandle::SetQPmean(), CandFitTrackAtNuHandle::SetQPplns(), CandFitTrackAtNuHandle::SetQPwidth(), CandRecoHandle::SetTimeOffset(), CandRecoHandle::SetTimeSlope(), CandRecoHandle::SetVtxPlane(), CandFitTrackHandle::SetVtxQPError(), CandRecoHandle::SetVtxT(), CandTrackHandle::SetVtxTrace(), CandRecoHandle::SetVtxU(), CandRecoHandle::SetVtxV(), CandRecoHandle::SetVtxZ(), and v.

00035 {
00036 
00037   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** AlgFitTrackAtNu::RunAlg(...) *** " << endl;
00038 
00039   CandFitTrackAtNuHandle& fittrack = dynamic_cast<CandFitTrackAtNuHandle&>(ch);
00040 
00041   // Unpack AlgConfig
00042   Int_t fBFieldMap=201;
00043   fBFieldMap = ac.GetInt("BFieldMap");
00044   MSG("AlgFitTrackAtNu", Msg::kDebug) << "   BFieldMap = " << fBFieldMap << endl;
00045 
00046   // Unpack CandContext
00047   const CandTrackHandle* track = dynamic_cast<const CandTrackHandle*>(cx.GetDataIn());
00048   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** FOUND THE TRACK *** " << endl;
00049 
00050   const CandSliceHandle* slice = dynamic_cast<const CandSliceHandle*>(track->GetCandSlice());
00051   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** FOUND THE SLICE *** " << endl;
00052   
00053   CandRecord* candrec = (CandRecord*)(cx.GetCandRecord());
00054   VldContext *vldc = (VldContext*)(candrec->GetVldContext());
00055 
00056   // Set up the BField
00057   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** SETTING UP MAGNETIC FIELD *** " << endl;
00058   BField* bf = new BField(*vldc,-1,fBFieldMap);
00059   bf->SetInterpMethod(BfldInterpMethod::kPlanar);
00060 
00061   // Set up the Geometry
00062   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** SETTING UP GEOMETRY *** " << endl;
00063   UgliGeomHandle ugh(*vldc);
00064 
00065   Int_t modtype,modnum,modpln,modstr;
00066   Int_t fEndPln,fEndStr;
00067   switch(vldc->GetDetector()){
00068     case DetectorType::kFar:
00069       modtype=1; modnum=2; modpln=248; modstr=192; break;
00070     case DetectorType::kNear:
00071       modtype=2; modnum=1; modpln=282; modstr=96; break;
00072     case DetectorType::kCalib:
00073       modtype=3; modnum=1; modpln=60; modstr=24; break;
00074     default:
00075       modtype=-1; modnum=0; modpln=0; break;
00076   }
00077   fEndPln = modnum*(modpln+1); fEndStr = modstr;
00078 
00079   MSG("AlgFitTrackAtNu", Msg::kDebug) << " modtype=" << modtype 
00080                                       << " modnum=" << modnum 
00081                                       << " modpln=" << modpln 
00082                                       << " modstr=" << modstr << endl;
00083 
00084   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** UNPACKING STRIPS *** " << endl;
00085 
00086   Int_t nplns=0;
00087   Int_t i,j,k;
00088   Double_t minz,maxz;
00089   Int_t pln,mod,vuw,shw;
00090   Int_t bstr=-1,estr=-1,bpln=-1,epln=-1;
00091   Int_t bplnu=-1,eplnu=-1,bplnv=-1,eplnv=-1;
00092   Double_t dir=0.0,range=0.0,ptrk=0.0;
00093 
00094   Int_t* moduplns = new Int_t[modnum];
00095   Int_t* modvplns = new Int_t[modnum];
00096   for(mod=0;mod<modnum;mod++){
00097     moduplns[mod]=0; modvplns[mod]=0;
00098   }
00099 
00100   TIter trackitr(track->GetDaughterIterator());
00101   while(CandStripHandle* strp = (CandStripHandle*)(trackitr())){
00102     vuw=-1; 
00103     pln=strp->GetPlane(); mod=(Int_t)((pln)/(modpln+1.0));
00104     if( strp->GetPlaneView()==PlaneView::kU
00105      || strp->GetPlaneView()==PlaneView::kX 
00106      || strp->GetPlaneView()==PlaneView::kA ){ vuw=0; }
00107     if( strp->GetPlaneView()==PlaneView::kV
00108      || strp->GetPlaneView()==PlaneView::kY
00109      || strp->GetPlaneView()==PlaneView::kB ){ vuw=1; }
00110     if(pln>0&&pln<500) fTrkStrpList[pln].Add(strp);  
00111     if(bpln<0||pln<bpln){ bpln=pln; minz=strp->GetZPos(); } 
00112     if(epln<0||pln>epln){ epln=pln; maxz=strp->GetZPos(); }
00113     if(vuw==0){ moduplns[mod]++; }  if(vuw==1){ modvplns[mod]++; }
00114     if(vuw==0){ if(bplnu<0||pln<bplnu) bplnu=pln; if(eplnu<0||pln>eplnu) eplnu=pln; }
00115     if(vuw==1){ if(bplnv<0||pln<bplnv) bplnv=pln; if(eplnv<0||pln>eplnv) eplnv=pln; }
00116     fittrack.AddDaughterLink(*strp);
00117   }
00118   if(bpln>0 && epln>0){
00119     nplns=1+epln-bpln;
00120   }
00121 
00122   TIter sliceitr(slice->GetDaughterIterator());
00123   while(CandStripHandle* strp = (CandStripHandle*)(sliceitr())){
00124     pln=strp->GetPlane(); if(pln>0&&pln<500) fSliStrpList[pln].Add(strp);
00125   }
00126 
00127   ptrk=track->GetMomentum();
00128 
00129   if(track->GetTimeSlope()>0.0) dir=1.0; if(track->GetTimeSlope()<0.0) dir=-1.0;
00130 
00131   for(i=bpln;i<epln+1;i++){
00132     if(track->GetRange(i)>range) range=track->GetRange(i);
00133   }
00134 
00135   Double_t* U = new Double_t[nplns];
00136   Double_t* V = new Double_t[nplns];
00137   Double_t* Z = new Double_t[nplns];
00138   Double_t* dU = new Double_t[nplns];
00139   Double_t* dV = new Double_t[nplns];
00140   Double_t* dE = new Double_t[nplns];
00141   Int_t* plnshw = new Int_t[nplns];
00142   Int_t* plnvuw = new Int_t[nplns];
00143   Int_t* plnpln = new Int_t[nplns];
00144   Int_t* plnpos = new Int_t[nplns];
00145 
00146   Int_t Nplns=0,Uplns=0,Vplns=0;
00147   Int_t Npos=0,Upos=0,Vpos=0;
00148   Double_t Sn,Sq,Sqt,Sqtt;
00149   Double_t u,v,z,s,du,dv,dz,dt;
00150   for(i=0;i<nplns;i++){
00151     plnvuw[i]=-1;
00152 
00153     pln=bpln+i; 
00154     mod=(Int_t)((pln)/(modpln+1.0));
00155     if(moduplns[mod]>2 && modvplns[mod]>2){ 
00156 
00157       vuw=-1; shw=0; bstr=-1; estr=-1;
00158       u=0.0; v=0.0; z=0.0; s=0.0;
00159       du=0.0; dv=0.0; dt=0.0;
00160 
00161       if(1+fTrkStrpList[pln].GetLast()>0){
00162         Sq=0.0; Sqt=0.0;
00163         for(j=0;j<1+fTrkStrpList[pln].GetLast();j++){
00164           CandStripHandle* strp = (CandStripHandle*)(fTrkStrpList[pln].At(j));
00165           z=strp->GetZPos(); 
00166           if(dir>=0) s=track->GetRange(pln); else s=range-track->GetRange(pln);
00167           if( strp->GetPlaneView()==PlaneView::kU
00168            || strp->GetPlaneView()==PlaneView::kX 
00169            || strp->GetPlaneView()==PlaneView::kA ){ vuw=0; }
00170           if( strp->GetPlaneView()==PlaneView::kV
00171            || strp->GetPlaneView()==PlaneView::kY
00172            || strp->GetPlaneView()==PlaneView::kB ){ vuw=1; }
00173           if(bstr<0||strp->GetStrip()<bstr) bstr=strp->GetStrip();
00174           if(estr<0||strp->GetStrip()>estr) estr=strp->GetStrip();
00175           Sqt+=strp->GetTPos()*strp->GetCharge(); Sq+=strp->GetCharge();
00176         }
00177         if(Sq>0.0){
00178           if(vuw==0){ u=Sqt/Sq; Uplns++; } if(vuw==1){ v=Sqt/Sq; Vplns++; }
00179         }
00180       }
00181 
00182       if(1+fSliStrpList[pln].GetLast()>0){
00183         Sn=0.0; Sq=0.0; Sqt=0.0; Sqtt=0.0;
00184         for(j=0;j<1+fSliStrpList[pln].GetLast();j++){
00185           CandStripHandle* strp = (CandStripHandle*)(fSliStrpList[pln].At(j));
00186           if( bstr>-1 && estr>-1
00187            && strp->GetStrip()>bstr-3 && strp->GetStrip()<estr+3 ){
00188             Sqtt+=strp->GetTPos()*strp->GetTPos()*strp->GetCharge(); 
00189             Sqt+=strp->GetTPos()*strp->GetCharge(); 
00190             Sq+=strp->GetCharge();
00191           }
00192           if( strp->GetCharge()>3.0 ) Sn+=1.0;
00193         }
00194         if( Sq>0.0 ){
00195           if( (Sqtt/Sq)-(Sqt/Sq)*(Sqt/Sq)>0.0 ){
00196             dt=sqrt( (Sqtt/Sq)-(Sqt/Sq)*(Sqt/Sq) );  
00197           }   
00198           if(vuw==0){ du=dt+0.012; } if(vuw==1){ dv=dt+0.012; }
00199         }
00200         if( Sn>2.0 ){ shw=1; }
00201       }
00202 
00203       if( vuw>-1 && Nplns<nplns ){
00204         plnvuw[Nplns]=vuw; plnshw[Nplns]=shw; plnpln[Nplns]=pln; plnpos[Nplns]=-1;
00205         U[Nplns]=u; V[Nplns]=v; Z[Nplns]=z;
00206         dU[Nplns]=du; dV[Nplns]=dv; dE[Nplns]=ptrk*s/range;
00207         Nplns++;
00208       }
00209     }
00210 
00211   }
00212     
00213   Int_t im=-1,ip=-1;
00214   for(i=0;i<Nplns;i++){
00215     pln=plnpln[i];
00216     if( pln>bplnu && pln>bplnv && pln<eplnu && pln<eplnv ){
00217       plnpos[i]=Npos; Npos++;
00218       if(plnvuw[i]==0) Upos++; if(plnvuw[i]==1) Vpos++;
00219       if(im<0||i<im) im=i; if(ip<0||i>ip) ip=i;
00220     }
00221   }
00222 
00223   MSG("AlgFitTrackAtNu", Msg::kDebug) << " bpln=" << bpln << " epln=" << epln << endl;
00224     
00225   Double_t bvtxu,bvtxv,bvtxz;
00226   Double_t bdiru,bdirv,bdirz;
00227   Double_t evtxu,evtxv,evtxz;
00228   Double_t ediru,edirv,edirz;
00229 
00230   Double_t pcurv=0.0,pcurverr=0.0;
00231   Double_t qpmean=0.0,qperr=0.0,qpcorr=0.0,qpwidth=0.0;
00232   Double_t chisqpol=9999.9,chisqlin=9999.9;
00233   Double_t rmspol=9999.9,rmslin=9999.9;
00234   Int_t qpplns=0,emcharge=0,pass=0;
00235 
00236   if( Uplns>2 && Vplns>2 && Upos>0 && Vpos>0 ){
00237     MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** FITTING TRACK *** " << endl;
00238 
00239    /*******************************
00240     * P O L Y N O M I A L   F I T *
00241     *******************************/
00242 
00243     MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** POLYNOMIAL FIT *** " << endl;
00244 
00245     Int_t ipos,jpos;
00246     Int_t begi,endi;
00247     Double_t b,de,qp,tmpqp;
00248     Double_t x0,y0,z0;
00249     Double_t u0,u1,u2,v0,v1,v2;
00250     Double_t cu,cv,pu,pv;
00251     Int_t modbpln,modepln;
00252     Int_t utmp,vtmp,utot,vtot;
00253     Int_t Ntmp,Nlin;
00254     Int_t Upars,Vpars;
00255     Double_t dparam,dqpdau,dqpdav;
00256     Double_t dau,dav,dqpu,dqpv,dqp;
00257     Double_t bx,by,bz;
00258     Double_t Srms,Stot;
00259     TVector3 RXYZ,BXYZ;
00260     TVector3 B,P,dPdZ;
00261     Int_t flagU,flagV;
00262 
00263     TMatrixD* fB = new TMatrixD(Npos,1);
00264     TMatrixD* fQP = new TMatrixD(Npos,1);
00265     TMatrixD* fdE = new TMatrixD(Npos,1);
00266     TMatrixD* fdT = new TMatrixD(Npos,1);
00267     TMatrixD* fdQP = new TMatrixD(Npos,1);
00268     TMatrixD* fdQPdX = new TMatrixD(Nplns,Npos); 
00269     TMatrixD* fdQPdXt = new TMatrixD(Npos,Nplns);  
00270     TMatrixD* fdXdX = new TMatrixD(Nplns,Nplns); 
00271 
00272     for(i=0;i<Nplns;i++){
00273       for(j=0;j<Npos;j++){
00274         (*fdQPdX)(i,j)=0.0; (*fdQPdXt)(j,i)=0.0;
00275       }
00276       if(plnvuw[i]==0) (*fdXdX)(i,i)=dU[i]*dU[i]; if(plnvuw[i]==1) (*fdXdX)(i,i)=dV[i]*dV[i];
00277     }
00278 
00279 
00280     // CALCULATE Q/P
00281     for(i=im;i<=ip;i++){
00282 
00283       de=dE[i];
00284       qp=0.0; dqp=9999.9; dt=0.0; b=0.0;
00285       pln=plnpln[i]; ipos=plnpos[i];
00286       utot=0; vtot=0; begi=i; endi=i; 
00287       if(plnvuw[i]==0) utot=1; if(plnvuw[i]==1) vtot=1;
00288       mod=(Int_t)((pln)/(modpln+1.0));
00289       modbpln=mod*(modpln+1); modepln=(mod+1)*(modpln+1);
00290       PlexPlaneId planeid(vldc->GetDetector(),pln,1);
00291       UgliSteelPlnHandle planehandle=ugh.GetSteelPlnHandle(planeid);
00292       z0=planehandle.GetZ0();
00293 
00294       utmp=0; vtmp=0; k=0;
00295       while( i-k>0 && plnpln[i-k]>modbpln && plnpln[i-k]<modepln && (utmp<3||vtmp<3) ){
00296         k++; if(plnvuw[i-k]==0) utmp++; if(plnvuw[i-k]==1) vtmp++;
00297       }
00298       utot+=utmp; vtot+=vtmp; begi=i-k;
00299 
00300       utmp=0; vtmp=0; k=0;
00301       while( i+k<Nplns-1 && plnpln[i+k]>modbpln && plnpln[i+k]<modepln && (utmp<3||vtmp<3) ){
00302         k++; if(plnvuw[i+k]==0) utmp++; if(plnvuw[i+k]==1) vtmp++;
00303       }
00304       utot+=utmp; vtot+=vtmp; endi=i+k;
00305 
00306       // fit U view
00307       TMatrixD* ZUtmp = new TMatrixD(utot,1);
00308       TMatrixD* Utmp = new TMatrixD(utot,1);
00309       TMatrixD* dUtmp = new TMatrixD(utot,1);
00310       Int_t* JUtmp = new Int_t[utot];
00311       Ntmp=0; 
00312 
00313       for(j=begi;j<=endi;j++){
00314         if(Ntmp<utot && plnvuw[j]==0){
00315           u=U[j]; du=dU[j]; dz=Z[j]-z0;
00316           (*Utmp)(Ntmp,0)=u;
00317           (*dUtmp)(Ntmp,0)=du;
00318           (*ZUtmp)(Ntmp,0)=dz;
00319           JUtmp[Ntmp]=j; Ntmp++;
00320         }
00321       }
00322 
00323       Upars=3;
00324       TMatrixD* PUtmp = new TMatrixD(3,1);
00325       TMatrixD* dPUtmp = new TMatrixD(3,3);
00326       TMatrixD* dPdUtmp = new TMatrixD(Ntmp,3);
00327       flagU=this->FitTrack(Ntmp,ZUtmp,Utmp,dUtmp,Upars,PUtmp,dPUtmp,dPdUtmp);
00328       u0=(*PUtmp)(0,0); u1=(*PUtmp)(1,0); u2=(*PUtmp)(2,0); 
00329 
00330 
00331       // fit V view
00332       TMatrixD* ZVtmp = new TMatrixD(vtot,1);
00333       TMatrixD* Vtmp = new TMatrixD(vtot,1);
00334       TMatrixD* dVtmp = new TMatrixD(vtot,1);
00335       Int_t* JVtmp = new Int_t[vtot];
00336       Ntmp=0; 
00337 
00338       for(j=begi;j<=endi;j++){
00339         if(Ntmp<vtot && plnvuw[j]==1){
00340           v=V[j]; dv=dV[j]; dz=Z[j]-z0;
00341           (*Vtmp)(Ntmp,0)=v;
00342           (*dVtmp)(Ntmp,0)=dv;
00343           (*ZVtmp)(Ntmp,0)=dz;
00344           JVtmp[Ntmp]=j; Ntmp++;
00345         }
00346       }
00347 
00348       Vpars=3;
00349       TMatrixD* PVtmp = new TMatrixD(3,1);
00350       TMatrixD* dPVtmp = new TMatrixD(3,3);
00351       TMatrixD* dPdVtmp = new TMatrixD(Ntmp,3);
00352       flagV=this->FitTrack(Ntmp,ZVtmp,Vtmp,dVtmp,Vpars,PVtmp,dPVtmp,dPdVtmp);
00353       v0=(*PVtmp)(0,0); v1=(*PVtmp)(1,0); v2=(*PVtmp)(2,0); 
00354 
00355 
00356       // Calculate Q/P
00357       if( flagU>-1 && flagV>-1 ){
00358 
00359         if(plnvuw[i]==0) dt=u0-U[i]; if(plnvuw[i]==1) dt=v0-V[i];
00360         x0=0.7071*(u0-v0); y0=0.7071*(u0+v0);
00361         RXYZ.SetXYZ(x0,y0,z0); 
00362         BXYZ=bf->GetBField(RXYZ);
00363         bx=BXYZ.X(); by=BXYZ.Y(); bz=BXYZ.Z(); b=BXYZ.Mag();
00364         B.SetXYZ(0.7071*(by+bx),0.7071*(by-bx),bz);
00365         P.SetXYZ(u1,v1,1.0); dPdZ.SetXYZ(2.0*u2,2.0*v2,0.0);
00366         qp=this->GetTrackQP( P,dPdZ,B );
00367   
00368         dau=sqrt((*dPUtmp)(2,2)); dparam=0.01*dau;
00369         dPdZ.SetXYZ(2.0*(u2+dparam),2.0*v2,0.0);          
00370         tmpqp=this->GetTrackQP( P,dPdZ,B );
00371         dqpdau=(tmpqp-qp)/dparam; dqpu=dqpdau*dau;
00372         for(j=0;j<utot;j++){
00373           jpos=JUtmp[j];
00374           (*fdQPdX)(jpos,ipos)=(dqpdau)*((*dPdUtmp)(j,2));
00375           (*fdQPdXt)(ipos,jpos)=(*fdQPdX)(jpos,ipos);
00376         }
00377       
00378         dav=sqrt((*dPVtmp)(2,2)); dparam=0.01*dav;
00379         dPdZ.SetXYZ(2.0*u2,2.0*(v2+dparam),0.0);          
00380         tmpqp=this->GetTrackQP( P,dPdZ,B );
00381         dqpdav=(tmpqp-qp)/dparam; dqpv=dqpdav*dav;      
00382         for(j=0;j<vtot;j++){
00383           jpos=JVtmp[j];
00384           (*fdQPdX)(jpos,ipos)=(dqpdav)*((*dPdVtmp)(j,2));
00385           (*fdQPdXt)(ipos,jpos)=(*fdQPdX)(jpos,ipos);
00386         }
00387 
00388         dqp=sqrt(dqpu*dqpu+dqpv*dqpv); 
00389       }
00390 
00391       MSG("AlgFitTrackAtNu", Msg::kDebug) << " PLN=" << pln 
00392                                           << " QP=" << qp 
00393                                           << " dQP=" << dqp 
00394                                           << " dT=" << dt << endl;
00395 
00396       delete [] JUtmp;
00397       delete [] JVtmp;
00398 
00399       delete ZUtmp;
00400       delete Utmp;
00401       delete dUtmp;
00402       delete PUtmp;
00403       delete dPUtmp;
00404       delete dPdUtmp;
00405 
00406       delete ZVtmp;
00407       delete Vtmp;
00408       delete dVtmp;
00409       delete PVtmp;
00410       delete dPVtmp;
00411       delete dPdVtmp;
00412 
00413       (*fB)(ipos,0)=b; (*fdT)(ipos,0)=dt; (*fdE)(ipos,0)=de;
00414       (*fQP)(ipos,0)=qp; (*fdQP)(ipos,0)=dqp; 
00415     }
00416 
00417     
00418     // CALCULATE BEST FIT MOMENTUM
00419     MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** calculating best fit momentum *** " << endl;
00420     Int_t myqpplns=0,myplns=0,mypass=0;
00421     Double_t myqpmean=0.0,myqperr=0.0,myqpcorr=0.0,myqpwidth=0.0;
00422     Double_t si,sj,xi,xj,dxi,dxj,dxij;
00423     Double_t Sw2dx2,Swx2,Swx,Sws,Sw;
00424     Double_t sigma,mean;
00425     Int_t itr;
00426 
00427     // best fit Q/P;
00428     TMatrixD* fQPdQP = new TMatrixD(Nplns,Npos);
00429     TMatrixD* fdQPdQP = new TMatrixD(Npos,Npos);
00430 
00431     fQPdQP->Mult(*fdXdX,*fdQPdX);
00432     fdQPdQP->Mult(*fdQPdXt,*fQPdQP);
00433 
00434     mean=0.0; sigma=4.0;
00435     for(itr=0;itr<2;itr++){
00436       myplns=0; mypass=0;
00437       Sw2dx2=0.0; Swx2=0.0; Swx=0.0; Sws=0.0; Sw=0.0; 
00438       for(i=0;i<Npos;i++){
00439         xi=(*fQP)(i,0); dxi=(*fdQP)(i,0); si=(*fdE)(i,0);
00440         if( dxi!=0.0 && xi>mean-2.0*sigma-0.5 && xi<mean+2.0*sigma+0.5 ){
00441           Swx2+=xi*xi/(dxi*dxi); Swx+=xi/(dxi*dxi); Sws+=xi*si/(dxi*dxi); 
00442           Sw+=1.0/(dxi*dxi); myplns++;
00443           for(j=0;j<Npos;j++){
00444             xj=(*fQP)(j,0); dxj=(*fdQP)(j,0); sj=(*fdE)(j,0);
00445             if( dxj!=0.0 && xj>mean-2.0*sigma-0.5 && xj<mean+2.0*sigma+0.5 ){
00446               dxij=(*fdQPdQP)(i,j); Sw2dx2+=dxij/(dxi*dxi*dxj*dxj);
00447             }
00448           }
00449         }
00450       }
00451       if(Sw>0.0){
00452         myqpmean=Swx/Sw; myqpcorr=Sws/Sw; myqpplns=myplns;
00453         if(Sw2dx2>=0.0) myqperr=sqrt(Sw2dx2)/Sw; else myqperr=-sqrt(-Sw2dx2)/Sw;
00454         if((Swx2/Sw)-(Swx/Sw)*(Swx/Sw)>0.0) myqpwidth=sqrt((Swx2/Sw)-(Swx/Sw)*(Swx/Sw)); else myqpwidth=0.0;
00455         mean=myqpmean; sigma=myqpwidth; mypass=1;
00456       }
00457     }
00458 
00459     qpmean=2.3*myqpmean; qperr=2.3*myqperr; qpwidth=2.3*myqpwidth;
00460     if(myqpmean>=0.0) qpcorr=2.3*myqpmean/(1.0+2.3*myqpcorr); else qpcorr=2.3*myqpmean/(1.0-2.3*myqpcorr);
00461     qpplns=myqpplns; pass=mypass;
00462 
00463     MSG("AlgFitTrackAtNu", Msg::kDebug) << " BEST FIT Q/P : " << endl
00464                                         << "   Q/P mean = " << qpmean << endl
00465                                         << "   Q/P err = " << qperr << endl
00466                                         << "   Q/P corr = " << qpcorr << endl 
00467                                         << "   Q/P width = " << qpwidth << endl
00468                                         << "   Q/P plns = " << qpplns << endl;
00469     
00470 
00471     pcurv=0.0; pcurverr=0.0;
00472     if( qpcorr!=0.0 ) pcurv=1.0/qpcorr;
00473 
00474 
00475     // calculate chisqpol
00476     Srms=0.0; Stot=0.0;
00477     for(i=0;i<Npos;i++){  
00478       dt=(*fdT)(i,0);  
00479       if(dt*dt>0.0){
00480         Srms+=dt*dt; Stot+=1.0;
00481       }  
00482     }
00483     if( Stot>0.0 ){
00484       rmspol=sqrt(Srms/Stot);
00485     }
00486 
00487     chisqpol=rmspol;
00488 
00489     MSG("AlgFitTrackAtNu", Msg::kDebug) << "  chisqpol = " << chisqpol << endl;
00490 
00491     delete fB;
00492     delete fQP;
00493     delete fdE;
00494     delete fdT;
00495     delete fdQP;
00496 
00497     delete fdQPdX;
00498     delete fdQPdXt;
00499     delete fdXdX;
00500     delete fQPdQP;
00501     delete fdQPdQP;
00502      
00503 
00504     /***********************
00505      * L I N E A R   F I T *
00506      ***********************/
00507   
00508     MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** LINEAR FIT *** " << endl; 
00509 
00510     // fit U view
00511     TMatrixD* ZUlin = new TMatrixD(Uplns,1);
00512     TMatrixD* Ulin = new TMatrixD(Uplns,1);
00513     TMatrixD* dUlin = new TMatrixD(Uplns,1);
00514     Nlin=0; 
00515 
00516     for(i=0;i<Nplns;i++){
00517       if(Nlin<Uplns && plnvuw[i]==0){
00518         (*Ulin)(Nlin,0)=U[i];
00519         (*dUlin)(Nlin,0)=dU[i];
00520         (*ZUlin)(Nlin,0)=Z[i];
00521         Nlin++;
00522       }
00523     }
00524 
00525     Upars=2;
00526     TMatrixD* PUlin = new TMatrixD(2,1);
00527     TMatrixD* dPUlin = new TMatrixD(2,2);
00528     TMatrixD* dPdUlin = new TMatrixD(Nlin,2);
00529     flagU=this->FitTrack(Nlin,ZUlin,Ulin,dUlin,Upars,PUlin,dPUlin,dPdUlin);
00530     cu=(*PUlin)(0,0); pu=(*PUlin)(1,0); 
00531 
00532     // fit V view
00533     TMatrixD* ZVlin = new TMatrixD(Vplns,1);
00534     TMatrixD* Vlin = new TMatrixD(Vplns,1);
00535     TMatrixD* dVlin = new TMatrixD(Vplns,1);
00536     Nlin=0; 
00537 
00538     for(i=0;i<Nplns;i++){
00539       if(Nlin<Vplns && plnvuw[i]==1){
00540         (*Vlin)(Nlin,0)=V[i];
00541         (*dVlin)(Nlin,0)=dV[i];
00542         (*ZVlin)(Nlin,0)=Z[i];
00543         Nlin++;
00544       }
00545     }
00546 
00547     Vpars=2;
00548     TMatrixD* PVlin = new TMatrixD(2,1);
00549     TMatrixD* dPVlin = new TMatrixD(2,2);
00550     TMatrixD* dPdVlin = new TMatrixD(Nlin,2);
00551     flagV=this->FitTrack(Nlin,ZVlin,Vlin,dVlin,Vpars,PVlin,dPVlin,dPdVlin);
00552     cv=(*PVlin)(0,0); pv=(*PVlin)(1,0); 
00553   
00554     // calculate chisqlin
00555     rmslin = -9999.9;
00556     Srms=0.0; Stot=0.0;
00557     if( flagU>-1 && flagV>-1 ){
00558       for(i=0;i<Nplns;i++){
00559         dt=0.0;
00560         if(plnvuw[i]==0) dt=U[i]-(cu+pu*Z[i]); if(plnvuw[i]==1) dt=V[i]-(cv+pv*Z[i]);
00561         if(dt*dt>0.0){
00562           Srms+=dt*dt; Stot+=1.0;
00563         }
00564       }
00565       if(Stot>0.0){
00566         rmslin=sqrt(Srms/Stot);
00567       }
00568     }
00569 
00570     chisqlin=rmslin;
00571 
00572     MSG("AlgFitTrackAtNu", Msg::kDebug) << "  chisqlin=" << chisqlin << endl;
00573 
00574     delete ZUlin;
00575     delete Ulin;
00576     delete dUlin;
00577     delete PUlin;
00578     delete dPUlin;
00579     delete dPdUlin;
00580 
00581     delete ZVlin;
00582     delete Vlin;
00583     delete dVlin;
00584     delete PVlin;
00585     delete dPVlin;
00586     delete dPdVlin;
00587 
00588   }
00589 
00590 
00591   // set charge
00592   if(qpcorr>0) emcharge=1; if(qpcorr<0) emcharge=-1;
00593 
00594   MSG("AlgFitTrackAtNu", Msg::kDebug) << " *** Q=" << emcharge << " *** " << endl;
00595 
00596   delete [] moduplns;
00597   delete [] modvplns;
00598 
00599   delete [] U;
00600   delete [] V;
00601   delete [] Z;
00602   delete [] dU;
00603   delete [] dV;
00604   delete [] dE;
00605 
00606   delete [] plnshw;
00607   delete [] plnvuw;
00608   delete [] plnpln;
00609   delete [] plnpos;
00610 
00611 
00612   if(track->GetTimeSlope()>=0.0){
00613     bvtxu=track->GetVtxU();
00614     bvtxv=track->GetVtxV();
00615     bvtxz=track->GetVtxZ();
00616     bdiru=track->GetDirCosU();
00617     bdirv=track->GetDirCosV();
00618     bdirz=track->GetDirCosZ();
00619     evtxu=track->GetEndU();
00620     evtxv=track->GetEndV();
00621     evtxz=track->GetEndZ();
00622     ediru=track->GetEndDirCosU();
00623     edirv=track->GetEndDirCosV();
00624     edirz=track->GetEndDirCosZ();
00625   }
00626   else{
00627     bvtxu=track->GetEndU();
00628     bvtxv=track->GetEndV();
00629     bvtxz=track->GetEndZ();
00630     bdiru=-track->GetEndDirCosU();
00631     bdirv=-track->GetEndDirCosV();
00632     bdirz=-track->GetEndDirCosZ();
00633     evtxu=track->GetVtxU();
00634     evtxv=track->GetVtxV();
00635     evtxz=track->GetVtxZ();
00636     ediru=-track->GetDirCosU();
00637     edirv=-track->GetDirCosV();
00638     edirz=-track->GetDirCosZ();
00639   }
00640 
00641   fittrack.SetTimeSlope((dir)/(3.0e8));
00642   fittrack.SetTimeOffset(0.0);
00643   fittrack.SetMomentumRange(ptrk);
00644   fittrack.SetMomentum(0.0);
00645 
00646   if(dir>=0.0){
00647     fittrack.SetVtxU(bvtxu);
00648     fittrack.SetVtxV(bvtxv);
00649     fittrack.SetVtxZ(bvtxz);
00650     fittrack.SetVtxT(0.0);
00651     fittrack.SetVtxPlane(bpln);
00652     fittrack.SetVtxTrace(0.0);
00653     fittrack.SetDirCosU(bdiru);
00654     fittrack.SetDirCosV(bdirv);
00655     fittrack.SetDirCosZ(bdirz);  
00656     fittrack.SetEndU(evtxu);
00657     fittrack.SetEndV(evtxv);
00658     fittrack.SetEndZ(evtxz);
00659     fittrack.SetEndT(0.0);
00660     fittrack.SetEndPlane(epln);
00661     fittrack.SetEndTrace(0.0);
00662     fittrack.SetEndDirCosU(ediru);
00663     fittrack.SetEndDirCosV(edirv);
00664     fittrack.SetEndDirCosZ(edirz);
00665   }
00666   else{
00667     fittrack.SetVtxU(evtxu);
00668     fittrack.SetVtxV(evtxv);
00669     fittrack.SetVtxZ(evtxz);
00670     fittrack.SetVtxT(0.0);
00671     fittrack.SetVtxPlane(epln);
00672     fittrack.SetVtxTrace(0.0);
00673     fittrack.SetDirCosU(-ediru);
00674     fittrack.SetDirCosV(-edirv);
00675     fittrack.SetDirCosZ(-edirz);
00676     fittrack.SetEndU(bvtxu);
00677     fittrack.SetEndV(bvtxv);
00678     fittrack.SetEndZ(bvtxz);
00679     fittrack.SetEndT(0.0);
00680     fittrack.SetEndPlane(bpln);
00681     fittrack.SetEndTrace(0.0);
00682     fittrack.SetEndDirCosU(-bdiru);
00683     fittrack.SetEndDirCosV(-bdirv);
00684     fittrack.SetEndDirCosZ(-bdirz);
00685   }
00686 
00687   // charge
00688   if(dir>=0.0){
00689     fittrack.SetEMCharge(emcharge);  
00690     fittrack.SetQPmean(qpmean);
00691     fittrack.SetQPerr(qperr);
00692     fittrack.SetQPcorr(qpcorr);
00693     fittrack.SetQPwidth(qpwidth);
00694     fittrack.SetQPplns(qpplns);
00695     fittrack.SetMomentumCurve(emcharge*pcurv);
00696     fittrack.SetMomentumCurveErr(pcurverr);
00697     fittrack.SetVtxQPError(qperr);
00698   }
00699   else{
00700     fittrack.SetEMCharge(-emcharge);  
00701     fittrack.SetQPmean(-qpmean);
00702     fittrack.SetQPerr(qperr);
00703     fittrack.SetQPcorr(-qpcorr);
00704     fittrack.SetQPwidth(qpwidth);
00705     fittrack.SetQPplns(qpplns);
00706     fittrack.SetMomentumCurve((-emcharge)*(-pcurv));
00707     fittrack.SetMomentumCurveErr(pcurverr);
00708     fittrack.SetVtxQPError(qperr);
00709   }
00710 
00711   fittrack.SetChi2Lin(chisqlin);
00712   fittrack.SetChi2(chisqpol);
00713   fittrack.SetPass(pass);  
00714   fittrack.SetNIterate(1);
00715   fittrack.SetFinderTrack((CandTrackHandle*)(track));
00716   
00717 
00718   MSG("AlgFitTrackAtNu", Msg::kDebug) 
00719     << " *** CREATING NEW FITTED TRACK *** " << endl
00720     << "  EMcharge = " << fittrack.GetEMCharge() << endl
00721     << "  Chisq = " << fittrack.GetChi2() << endl
00722     << "  ChisqLin = " << fittrack.GetChi2Lin() << endl
00723     << "  MomentumRange = " << fittrack.GetMomentumRange() << endl
00724     << "  MomentumCurve = " << fittrack.GetMomentumCurve() << endl
00725     << "  MomentumCurveErr = " << fittrack.GetMomentumCurveErr() << endl 
00726     << "  VtxQPError = " << fittrack.GetVtxQPError() << endl
00727     << "  QPmean = " << fittrack.GetQPmean() << endl
00728     << "  QPerr = " << fittrack.GetQPerr() << endl
00729     << "  QPcorr = " << fittrack.GetQPcorr() << endl
00730     << "  QPwidth = " << fittrack.GetQPwidth() << endl
00731     << "  QPplns = " << fittrack.GetQPplns() << endl
00732     << "  Pass = " << fittrack.GetPass() << endl;
00733 
00734   // clear banks
00735   for(i=0;i<500;i++){
00736     fTrkStrpList[i].Clear(); fSliStrpList[i].Clear();
00737   }
00738   
00739   delete bf;
00740 
00741   return;
00742 }

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

Reimplemented from AlgBase.

Definition at line 744 of file AlgFitTrackAtNu.cxx.

00745 {
00746 
00747 }


Member Data Documentation

TObjArray AlgFitTrackAtNu::fSliStrpList[500] [private]
 

Definition at line 24 of file AlgFitTrackAtNu.h.

Referenced by RunAlg().

TObjArray AlgFitTrackAtNu::fTrkStrpList[500] [private]
 

Definition at line 23 of file AlgFitTrackAtNu.h.

Referenced by RunAlg().


The documentation for this class was generated from the following files:
Generated on Thu Nov 1 15:55:25 2007 for loon by  doxygen 1.3.9.1