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

AlgTrackAtNu Class Reference

#include <AlgTrackAtNu.h>

Inheritance diagram for AlgTrackAtNu:

AlgBase List of all members.

Public Member Functions

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

Private Attributes

TObjArray fHitArr [500]
TObjArray fSliceStrpArr [500]
TObjArray fTrackStrpArr [500]

Constructor & Destructor Documentation

AlgTrackAtNu::AlgTrackAtNu  ) 
 

Definition at line 36 of file AlgTrackAtNu.cxx.

00037 {
00038 
00039 }

AlgTrackAtNu::~AlgTrackAtNu  ) 
 

Definition at line 41 of file AlgTrackAtNu.cxx.

00042 {
00043 
00044 }


Member Function Documentation

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

Implements AlgBase.

Definition at line 46 of file AlgTrackAtNu.cxx.

References CandHandle::AddDaughterLink(), C, UgliStripHandle::ClearFiber(), fHitArr, fSliceStrpArr, fTrackStrpArr, CandTrackAtNuHandle::GetAssocTrkPH(), CandTrackAtNuHandle::GetAssocTrkPHfrac(), ObjTrackAtNu::GetBegPlane(), TrackAtNu::GetBegVtxShower(), CandContext::GetCandRecord(), CandRecoHandle::GetCandSlice(), TrackAtNu::GetCandSliceHandle(), HitAtNu::GetCandStripHandle(), CandStripHandle::GetCharge(), HitAtNu::GetCharge(), CandContext::GetDataIn(), CandHandle::GetDaughterIterator(), CandDeMuxDigitHandle::GetDeMuxDigitFlagWord(), VldContext::GetDetector(), CandRecoHandle::GetDirCosU(), CandRecoHandle::GetDirCosV(), CandRecoHandle::GetDirCosZ(), CandTrackAtNuHandle::GetDirTimeOffset(), CandTrackAtNuHandle::GetDirTimeScatter(), CandTrackAtNuHandle::GetDirTimeScore(), CandTrackAtNuHandle::GetDirTimeSlope(), Registry::GetDouble(), PlexSEIdAltL::GetEnd(), CandRecoHandle::GetEndDirCosU(), CandRecoHandle::GetEndDirCosV(), CandRecoHandle::GetEndDirCosZ(), CandTrackAtNuHandle::GetEndDirTimeFitChisq(), CandTrackAtNuHandle::GetEndDirTimeFitNdf(), CandRecoHandle::GetEndPlane(), ObjTrackAtNu::GetEndPlane(), CandTrackAtNuHandle::GetEndPlaneDigits(), CandTrackAtNuHandle::GetEndQmax(), CandTrackAtNuHandle::GetEndR(), CandTrackAtNuHandle::GetEndRdigits(), CandTrackAtNuHandle::GetEndRmax(), CandTrackAtNuHandle::GetEndShw(), CandTrackAtNuHandle::GetEndShwReseedFlag(), CandTrackAtNuHandle::GetEndShwStrips(), CandRecoHandle::GetEndT(), CandTrackHandle::GetEndTrace(), CandTrackHandle::GetEndTraceZ(), CandRecoHandle::GetEndU(), CandTrackAtNuHandle::GetEndUmean(), CandTrackAtNuHandle::GetEndUwidth(), CandRecoHandle::GetEndV(), CandTrackAtNuHandle::GetEndVmean(), TrackAtNu::GetEndVtxShower(), CandTrackAtNuHandle::GetEndVwidth(), CandRecoHandle::GetEndZ(), UgliStripHandle::GetHalfLength(), ObjAtNu::GetHitAt(), ObjAtNu::GetHitLast(), CandTrackAtNuHandle::GetLinearDirCosU(), CandTrackAtNuHandle::GetLinearDirCosV(), CandTrackAtNuHandle::GetLinearDirCosZ(), CandTrackAtNuHandle::GetLinearDirFitChisq(), CandTrackAtNuHandle::GetLinearDirFitNdf(), CandTrackAtNuHandle::GetMaxPlane(), CandTrackAtNuHandle::GetMinPlane(), CandTrackHandle::GetMomentum(), CandTrackAtNuHandle::GetMomentumErr(), CandTrackAtNuHandle::GetNPlanes(), CandTrackAtNuHandle::GetNStrips(), CandStripHandle::GetPlane(), HitAtNu::GetPlane(), CandStripHandle::GetPlaneView(), HitAtNu::GetPlaneView(), CandDigitHandle::GetPlexSEIdAltL(), CandTrackAtNuHandle::GetRangeThruSteel(), CandTrackAtNuHandle::GetReseedFlag(), ObjTrackAtNu::GetReseedFlag(), ObjShowerAtNu::GetReseedFlag(), HitAtNu::GetShwFlag(), CandTrackAtNuHandle::GetShwPH(), UgliGeomHandle::GetSteelPlnHandle(), CandStripHandle::GetStrip(), CandStripHandle::GetStripEndId(), UgliGeomHandle::GetStripHandle(), CandStripHandle::GetTime(), CandRecoHandle::GetTimeOffset(), CandRecoHandle::GetTimeSlope(), CandStripHandle::GetTPos(), HitAtNu::GetTPos(), CandTrackAtNuHandle::GetTrkPH(), CandTrackAtNuHandle::GetTrkPlanes(), RecMinos::GetVldContext(), CandTrackAtNuHandle::GetVtxDirTimeFitChisq(), CandTrackAtNuHandle::GetVtxDirTimeFitNdf(), CandRecoHandle::GetVtxPlane(), CandTrackAtNuHandle::GetVtxPlaneDigits(), CandTrackAtNuHandle::GetVtxQmax(), CandTrackAtNuHandle::GetVtxR(), CandTrackAtNuHandle::GetVtxRdigits(), CandTrackAtNuHandle::GetVtxRmax(), CandTrackAtNuHandle::GetVtxShw(), CandTrackAtNuHandle::GetVtxShwReseedFlag(), CandTrackAtNuHandle::GetVtxShwStrips(), CandRecoHandle::GetVtxT(), CandTrackHandle::GetVtxTrace(), CandTrackHandle::GetVtxTraceZ(), CandRecoHandle::GetVtxU(), CandTrackAtNuHandle::GetVtxUmean(), CandTrackAtNuHandle::GetVtxUwidth(), CandRecoHandle::GetVtxV(), CandTrackAtNuHandle::GetVtxVmean(), CandTrackAtNuHandle::GetVtxVwidth(), CandRecoHandle::GetVtxZ(), UgliSteelPlnHandle::GetZ0(), CandStripHandle::GetZPos(), HitAtNu::GetZPos(), UgliSteelPlnHandle::IsValid(), MSG, s(), CandTrackAtNuHandle::SetAssocTrkPH(), CandTrackAtNuHandle::SetAssocTrkPHfrac(), CandRecoHandle::SetCandSlice(), CandRecoHandle::SetDirCosU(), CandRecoHandle::SetDirCosV(), CandRecoHandle::SetDirCosZ(), CandTrackAtNuHandle::SetDirTimeOffset(), CandTrackAtNuHandle::SetDirTimeScatter(), CandTrackAtNuHandle::SetDirTimeScore(), CandTrackAtNuHandle::SetDirTimeSlope(), CandTrackHandle::SetdS(), CandRecoHandle::SetEndDirCosU(), CandRecoHandle::SetEndDirCosV(), CandRecoHandle::SetEndDirCosZ(), CandTrackAtNuHandle::SetEndDirTimeFitChisq(), CandTrackAtNuHandle::SetEndDirTimeFitNdf(), CandRecoHandle::SetEndPlane(), CandTrackAtNuHandle::SetEndPlaneDigits(), CandTrackAtNuHandle::SetEndQmax(), CandTrackAtNuHandle::SetEndR(), CandTrackAtNuHandle::SetEndRdigits(), CandTrackAtNuHandle::SetEndRmax(), CandTrackAtNuHandle::SetEndShw(), CandTrackAtNuHandle::SetEndShwReseedFlag(), CandTrackAtNuHandle::SetEndShwStrips(), CandRecoHandle::SetEndT(), CandTrackHandle::SetEndTrace(), CandTrackHandle::SetEndTraceZ(), CandRecoHandle::SetEndU(), CandTrackAtNuHandle::SetEndUmean(), CandTrackAtNuHandle::SetEndUwidth(), CandRecoHandle::SetEndV(), CandTrackAtNuHandle::SetEndVmean(), CandTrackAtNuHandle::SetEndVwidth(), CandRecoHandle::SetEndZ(), CandTrackHandle::SetInShower(), CandTrackAtNuHandle::SetLinearDirCosU(), CandTrackAtNuHandle::SetLinearDirCosV(), CandTrackAtNuHandle::SetLinearDirCosZ(), CandTrackAtNuHandle::SetLinearDirFitChisq(), CandTrackAtNuHandle::SetLinearDirFitNdf(), CandTrackAtNuHandle::SetMaxPlane(), CandTrackAtNuHandle::SetMinPlane(), CandTrackHandle::SetMomentum(), CandTrackAtNuHandle::SetMomentumErr(), CandTrackAtNuHandle::SetNPlanes(), CandTrackAtNuHandle::SetNStrips(), CandTrackHandle::SetRange(), CandTrackAtNuHandle::SetRangeThruDetector(), CandTrackAtNuHandle::SetRangeThruSteel(), CandTrackAtNuHandle::SetReseedFlag(), CandTrackAtNuHandle::SetShwPH(), CandTrackHandle::SetT(), CandRecoHandle::SetTimeOffset(), CandRecoHandle::SetTimeSlope(), CandTrackAtNuHandle::SetTrkPH(), CandTrackAtNuHandle::SetTrkPlanes(), CandTrackHandle::SetU(), CandTrackHandle::SetV(), CandTrackAtNuHandle::SetVtxDirTimeFitChisq(), CandTrackAtNuHandle::SetVtxDirTimeFitNdf(), CandRecoHandle::SetVtxPlane(), CandTrackAtNuHandle::SetVtxPlaneDigits(), CandTrackAtNuHandle::SetVtxQmax(), CandTrackAtNuHandle::SetVtxR(), CandTrackAtNuHandle::SetVtxRdigits(), CandTrackAtNuHandle::SetVtxRmax(), CandTrackAtNuHandle::SetVtxShw(), CandTrackAtNuHandle::SetVtxShwReseedFlag(), CandTrackAtNuHandle::SetVtxShwStrips(), CandRecoHandle::SetVtxT(), CandTrackHandle::SetVtxTrace(), CandTrackHandle::SetVtxTraceZ(), CandRecoHandle::SetVtxU(), CandTrackAtNuHandle::SetVtxUmean(), CandTrackAtNuHandle::SetVtxUwidth(), CandRecoHandle::SetVtxV(), CandTrackAtNuHandle::SetVtxVmean(), CandTrackAtNuHandle::SetVtxVwidth(), CandRecoHandle::SetVtxZ(), v, and UgliStripHandle::WlsPigtail().

00047 {
00048 
00049   MSG("AlgTrackAtNu", Msg::kDebug) << "AlgTrackAtNu::RunAlg(...)" << endl;
00050 
00051   // Get CandTrackAtNuHandle
00052   CandTrackAtNuHandle& track = dynamic_cast<CandTrackAtNuHandle&>(ch);
00053 
00054   // Unpack AlgConfig
00055   Double_t fFibreIndex;
00056   fFibreIndex = ac.GetDouble("FibreIndex");
00057   MSG("AlgTrackAtNu", Msg::kDebug) << " FibreIndex=" << fFibreIndex << endl;
00058 
00059   // Unpack CandContext
00060   const TObjArray* arr = dynamic_cast<const TObjArray*>(cx.GetDataIn()); 
00061   TrackAtNu* trku = (TrackAtNu*)(arr->At(0));
00062   TrackAtNu* trkv = (TrackAtNu*)(arr->At(1));
00063   track.SetCandSlice(trku->GetCandSliceHandle());
00064 
00065   CandRecord* candrec = (CandRecord*)(cx.GetCandRecord());
00066   VldContext *vldc = (VldContext*)(candrec->GetVldContext());
00067   UgliGeomHandle ugh(*vldc);
00068 
00069   // Get Geometry
00070   Int_t atmosflag,modtype,modnum,modpln,modstr;
00071   switch(candrec->GetVldContext()->GetDetector()){
00072     case DetectorType::kFar:
00073       atmosflag=1; modtype=1; modnum=2; modpln=248; modstr=192; break;
00074     case DetectorType::kNear:
00075       atmosflag=0; modtype=2; modnum=1; modpln=282; modstr=96; break;
00076     case DetectorType::kCalib:
00077       atmosflag=0; modtype=3; modnum=1; modpln=60; modstr=24; break;
00078     default:
00079       atmosflag=0; modtype=-1; modnum=0; modpln=0; modstr=0; break;
00080   }
00081 
00082   Int_t i,j,k,l;
00083   Int_t pln,bpln,epln,npln;
00084   Double_t begZsm1=-9999.9,endZsm1=-9999.9;
00085   Double_t begZsm2=-9999.9,endZsm2=-9999.9;
00086   Int_t begsm1=-1,endsm1=-1,begsm2=-1,endsm2=-1;
00087 
00088   for(j=0;j<486;j++){
00089     PlexPlaneId myplaneid(vldc->GetDetector(),j,1);
00090     UgliSteelPlnHandle myplanehandle = ugh.GetSteelPlnHandle(myplaneid);
00091     if(myplanehandle.IsValid()){
00092       if(j<=modpln && begZsm1<0.0){ begsm1=j; begZsm1=myplanehandle.GetZ0(); }
00093       if(j<=modpln && myplanehandle.GetZ0()>endZsm1){ endsm1=j; endZsm1=myplanehandle.GetZ0(); }
00094       if(j>modpln && begZsm2<0.0){ begsm2=j; begZsm2=myplanehandle.GetZ0(); }
00095       if(j>modpln && myplanehandle.GetZ0()>endZsm2){ endsm2=j; endZsm2=myplanehandle.GetZ0(); }
00096     }
00097   }
00098 
00099   MSG("AlgTrackAtNu", Msg::kDebug) << " *** detector geometry *** " << endl
00100                                    << "  SM1 :  pln " << begsm1 << " -> " << endsm1
00101                                    << "    Z " << begZsm1 << " -> " << endZsm1 << endl
00102                                    << "  SM2 :  pln " << begsm2 << " -> " << endsm2 
00103                                    << "    Z " << begZsm2 << " -> " << endZsm2 << endl;
00104 
00105   if(trku->GetBegPlane()<trkv->GetBegPlane()) bpln=trku->GetBegPlane(); else bpln=trkv->GetBegPlane();
00106   if(trku->GetEndPlane()>trkv->GetEndPlane()) epln=trku->GetEndPlane(); else epln=trkv->GetEndPlane();
00107 
00108   // ***********************************************
00109   // * C A L C U L A T E   C O - O R D I N A T E S *
00110   // ***********************************************
00111 
00112   MSG("AlgTrackAtNu", Msg::kDebug) << " *** calculate strip co-ordinates *** " << endl;
00113 
00114   npln = 1+epln-bpln;
00115   Double_t* U = new Double_t[npln];
00116   Double_t* V = new Double_t[npln];
00117   Double_t* Z = new Double_t[npln];
00118   Double_t* Q = new Double_t[npln];
00119   Double_t* dS = new Double_t[npln];
00120   Double_t* dSsteel = new Double_t[npln];
00121   Double_t* Qm = new Double_t[npln];
00122   Double_t* Qp = new Double_t[npln];
00123   Double_t* CTm = new Double_t[npln];
00124   Double_t* CTp = new Double_t[npln]; 
00125   Double_t* Wm = new Double_t[npln];
00126   Double_t* Wp = new Double_t[npln];
00127   Int_t* plnvuw = new Int_t[npln];
00128   Int_t* plnnum = new Int_t[npln];
00129   for(i=0;i<npln;i++){  
00130     plnvuw[i]=-1; plnnum[i]=0;
00131     U[i]=0.0; V[i]=0.0; Z[i]=0.0; Q[i]=0.0; 
00132     Qm[i]=0.0; Qp[i]=0.0; CTm[i]=0.0; CTp[i]=0.0; 
00133     Wm[i]=0.0; Wp[i]=0.0;
00134   }
00135 
00136   // loop over hits and fill T,Z
00137   for(i=0;i<1+trku->GetHitLast();i++){
00138     HitAtNu* hit = (HitAtNu*)(trku->GetHitAt(i));
00139     CandStripHandle* strip = (CandStripHandle*)(hit->GetCandStripHandle());
00140     pln = hit->GetPlane()-bpln;
00141     fHitArr[pln].Add(hit);
00142     if(plnvuw[pln]<0){
00143       plnvuw[pln]=hit->GetPlaneView();
00144       Z[pln]=hit->GetZPos();
00145     }
00146     U[pln]+=hit->GetCharge()*hit->GetTPos();
00147     Q[pln]+=hit->GetCharge();
00148     track.AddDaughterLink(*strip);
00149     track.SetInShower(strip,hit->GetShwFlag());
00150     plnnum[pln]++; 
00151   }
00152 
00153   for(i=0;i<1+trkv->GetHitLast();i++){
00154     HitAtNu* hit = (HitAtNu*)(trkv->GetHitAt(i));
00155     CandStripHandle* strip = (CandStripHandle*)(hit->GetCandStripHandle());
00156     pln = hit->GetPlane()-bpln;
00157     fHitArr[pln].Add(hit);
00158     if(plnvuw[pln]<0){
00159       plnvuw[pln]=hit->GetPlaneView();
00160       Z[pln]=hit->GetZPos();
00161     }
00162     V[pln]+=hit->GetCharge()*hit->GetTPos();
00163     Q[pln]+=hit->GetCharge();
00164     track.AddDaughterLink(*strip);
00165     track.SetInShower(strip,hit->GetShwFlag());
00166     plnnum[pln]++;
00167   }
00168 
00169   Int_t nplanes=0,nstrips=0;
00170   for(i=0;i<npln;i++){
00171     if(plnvuw[i]>-1){
00172       if(Q[i]>0.0){
00173         U[i]=U[i]/Q[i];
00174         V[i]=V[i]/Q[i];
00175         nstrips+=plnnum[i];
00176         nplanes++;
00177       }
00178     }
00179   }
00180 
00181   // interpolate between views for U,V
00182   Int_t flag,vuw;
00183   Int_t km1,kp1,km2,kp2;
00184   for(pln=0;pln<npln;pln++){
00185     if(plnvuw[pln]>-1){
00186       flag=0;
00187       vuw=plnvuw[pln];
00188       k=0; km1=-1; km2=-1;
00189       while(pln-k>0 && km2<0){
00190         k++; 
00191         if(plnvuw[pln-k]>-1 && plnvuw[pln-k]!=vuw){
00192           if(km1<0) km1=k; else km2=k;
00193         }
00194       }
00195       k=0; kp1=-1; kp2=-1;
00196       while(pln+k<npln-1 && kp2<0){
00197         k++;
00198         if(plnvuw[pln+k]>-1 && plnvuw[pln+k]!=vuw){
00199           if(kp1<0) kp1=k; else kp2=k;
00200         }
00201       }
00202       if(km1>0 && kp1>0){ 
00203         if(vuw==0) V[pln]=(kp1*V[pln-km1]+km1*V[pln+kp1])/(km1+kp1);
00204         if(vuw==1) U[pln]=(kp1*U[pln-km1]+km1*U[pln+kp1])/(km1+kp1);
00205         flag=1;
00206       }
00207       else{
00208         if(km1>0){
00209           if(vuw==0) if(km2>0) V[pln]=V[pln-km1]+(Z[pln]-Z[pln-km1])*(V[pln-km1]-V[pln-km2])/(Z[pln-km1]-Z[pln-km2]); else V[pln]=V[pln-km1];
00210           if(vuw==1) if(km2>0) U[pln]=U[pln-km1]+(Z[pln]-Z[pln-km1])*(U[pln-km1]-U[pln-km2])/(Z[pln-km1]-Z[pln-km2]); else U[pln]=U[pln-km1];
00211           flag=1;
00212         }
00213         if(kp1>0){
00214           if(vuw==0) if(kp2>0) V[pln]=V[pln+kp1]+(Z[pln]-Z[pln+kp1])*(V[pln+kp1]-V[pln+kp2])/(Z[pln+kp1]-Z[pln+kp2]); else V[pln]=V[pln+kp1];
00215           if(vuw==1) if(kp2>0) U[pln]=U[pln+kp1]+(Z[pln]-Z[pln+kp1])*(U[pln+kp1]-U[pln+kp2])/(Z[pln+kp1]-Z[pln+kp2]); else U[pln]=U[pln+kp1];
00216           flag=1;
00217         }
00218       }
00219       if(flag==0){
00220         plnvuw[pln]=-1;
00221       }
00222     }
00223   }
00224 
00225   // calculate dS
00226   Double_t utmp,vtmp,ztmp;
00227   Double_t dq,du,dv,dz,ds; 
00228   Double_t range_thru_detector,range_thru_steel;
00229   Double_t sumz_thru_steel,sumz_thru_detector;
00230   flag=0; 
00231   range_thru_detector=0.0; range_thru_steel=0.0; 
00232   sumz_thru_steel=0.0; sumz_thru_detector=0.0;
00233   for(i=0;i<npln;i++){
00234     if(plnvuw[i]>-1){
00235       if(flag){
00236         du=U[i]-utmp; dv=V[i]-vtmp; dz=Z[i]-ztmp;
00237         ds=sqrt(du*du+dv*dv+dz*dz);
00238         if(dz>1.0) dq=2.0; else dq=1.0;
00239         range_thru_steel+=dq*ds*(0.0254/dz);
00240         sumz_thru_steel+=dq*0.0254;
00241         range_thru_detector+=ds;
00242         sumz_thru_detector+=dz;
00243       }
00244       dS[i]=range_thru_detector;
00245       dSsteel[i]=range_thru_steel;
00246       utmp=U[i]; vtmp=V[i]; ztmp=Z[i];
00247       flag=1;
00248     }
00249   }
00250 
00251   // get timing information
00252   Double_t tpos,fibre;
00253   Double_t ctime,digchg;
00254   Double_t indx=fFibreIndex;
00255   for(pln=0;pln<npln;pln++){
00256     for(i=0;i<1+fHitArr[pln].GetLast();i++){
00257       HitAtNu* hit = (HitAtNu*)(fHitArr[pln].At(i));
00258 
00259       // timing/charge
00260       CandStripHandle* strip = (CandStripHandle*)(hit->GetCandStripHandle());     
00261       if(strip->GetPlaneView()==PlaneView::kU) tpos = -V[pln];
00262       if(strip->GetPlaneView()==PlaneView::kV) tpos = U[pln];
00263       PlexStripEndId stripid = strip->GetStripEndId();
00264       UgliStripHandle striphandle = ugh.GetStripHandle(stripid);
00265       TIter digitr(strip->GetDaughterIterator());
00266       while(CandDigitHandle* digit = dynamic_cast<CandDigitHandle*>(digitr())){
00267         ctime=0.0; fibre=0.0; digchg=0.0;
00268         if(digit->GetPlexSEIdAltL().GetEnd()==StripEnd::kPositive) { 
00269           fibre = striphandle.ClearFiber(StripEnd::kPositive)+striphandle.WlsPigtail(StripEnd::kPositive)+striphandle.GetHalfLength()-tpos; 
00270           ctime = 3.0e8*strip->GetTime(StripEnd::kPositive)-indx*fibre; 
00271           digchg=strip->GetCharge(StripEnd::kPositive); 
00272           Qp[pln]=digchg; CTp[pln]=ctime;
00273         }
00274         if(digit->GetPlexSEIdAltL().GetEnd()==StripEnd::kNegative) { 
00275           fibre = striphandle.ClearFiber(StripEnd::kNegative)+striphandle.WlsPigtail(StripEnd::kNegative)+striphandle.GetHalfLength()+tpos; 
00276           ctime = 3.0e8*strip->GetTime(StripEnd::kNegative)-indx*fibre; 
00277           digchg=strip->GetCharge(StripEnd::kNegative); 
00278           Qm[pln]=digchg; CTm[pln]=ctime;
00279         }   
00280       }
00281     }
00282   }
00283 
00284   // set map values
00285   Int_t plnm,plnp;
00286   Double_t dens=830.0;
00287   plnm=-1; plnp=-1;
00288   for(i=0;i<npln;i++){
00289     pln=bpln+i;
00290     if(plnvuw[i]>-1){
00291       track.SetU(pln,U[i]);
00292       track.SetV(pln,V[i]);
00293       if(Qm[i]>0.0) track.SetT(pln,StripEnd::kNegative,CTm[i]/3.0e8);  
00294       if(Qp[i]>0.0) track.SetT(pln,StripEnd::kPositive,CTp[i]/3.0e8);
00295       if(plnm<0||i<plnm) plnm=i; if(plnp<0||i>plnp) plnp=i;
00296     }
00297   }
00298 
00299   MSG("AlgTrackAtNu", Msg::kDebug) << " *** track hits *** " << endl;
00300   for(pln=0;pln<npln;pln++){
00301     if( plnvuw[pln]>-1 ){
00302       MSG("AlgTrackAtNu",Msg::kDebug)
00303         << " pln=" << pln << " vuw=" << plnvuw[pln]
00304         << " z=" << Z[pln] << " u=" << U[pln] << " v=" << V[pln]
00305         << " s=" << dS[pln] << endl;
00306     }
00307   }
00308 
00309   // *************************************
00310   // * V E R T E X  +  D I R E C T I O N *
00311   // *************************************
00312 
00313   MSG("AlgTrackAtNu", Msg::kDebug) << " *** vertex + direction *** " << endl;
00314 
00315   // determine track vertex + direction   
00316   Double_t mu,cu,mv,cv,err;
00317   Double_t u,v,z,w;
00318   Double_t Uw,Uwz,Uwzz,Uwu,Uwuu,Uwzu;
00319   Double_t Vw,Vwz,Vwzz,Vwv,Vwvv,Vwzv;
00320 
00321   Int_t Upts,Vpts,MAXpts=4;
00322   Double_t precou,precov,precos,precoz;
00323   Int_t ndf;
00324 
00325   Double_t bdiru,bdirv,bdirx,bdiry,bdirz;
00326   Double_t bvtxu,bvtxv,bvtxx,bvtxy,bvtxz;
00327   Double_t bdirerr=-1.0;
00328   Int_t bndf=-1;
00329 
00330   Double_t ediru,edirv,edirx,ediry,edirz;
00331   Double_t evtxu,evtxv,evtxx,evtxy,evtxz;
00332   Double_t edirerr=-1.0;
00333   Int_t endf=-1;
00334 
00335   Double_t lindiru,lindirv,lindirx,lindiry,lindirz;
00336   Double_t lindirerr=-1.0;
00337   Int_t linndf=-1;
00338  
00339   // beginning direction
00340   Uw=0.0; Uwz=0.0; Uwzz=0.0; Uwu=0.0; Uwuu=0.0; Uwzu=0.0;
00341   Vw=0.0; Vwz=0.0; Vwzz=0.0; Vwv=0.0; Vwvv=0.0; Vwzv=0.0;
00342   Upts=0; Vpts=0;
00343 
00344   for(i=0;i<npln;i++){
00345     if(i>=plnm && plnvuw[i]>-1){
00346       u=U[i]; v=V[i]; z=Z[i]; w=Q[i];
00347       
00348       if(plnvuw[i]==0 && Upts<MAXpts){
00349         Uw+=w;
00350         Uwu+=w*u; Uwz+=w*z; Uwuu+=w*u*u;
00351         Uwzu+=w*u*z; Uwzz+=w*z*z;
00352         Upts++;
00353       }
00354 
00355       if(plnvuw[i]==1 && Vpts<MAXpts){
00356         Vw+=w;
00357         Vwv+=w*v; Vwz+=w*z; Vwvv+=w*v*v;
00358         Vwzv+=w*v*z; Vwzz+=w*z*z;
00359         Vpts++;
00360       }
00361     }
00362   }
00363   
00364   mu=0.0; mv=0.0; err=-1.0; ndf=-1;
00365   if(Upts>1 && Vpts>1){
00366     mu=(Uw*Uwzu-Uwz*Uwu)/(Uw*Uwzz-Uwz*Uwz); cu=(Uwu*Uwzz-Uwz*Uwzu)/(Uw*Uwzz-Uwz*Uwz);
00367     mv=(Vw*Vwzv-Vwz*Vwv)/(Vw*Vwzz-Vwz*Vwz); cv=(Vwv*Vwzz-Vwz*Vwzv)/(Vw*Vwzz-Vwz*Vwz);
00368     err=(Uwuu-2.0*mu*Uwzu-2.0*cu*Uwu+mu*mu*Uwzz+2.0*mu*cu*Uwz+Uw*cu*cu)+(Vwvv-2.0*mv*Vwzv-2.0*cv*Vwv+mv*mv*Vwzz+2.0*mv*cv*Vwz+Vw*cv*cv);
00369     ndf=Upts+Vpts-4;
00370   }
00371 
00372   precou=mu; precov=mv;
00373   precos=sqrt(precou*precou+precov*precov+1.0);
00374   precou=precou/precos; precov=precov/precos; precoz=1.0/precos;
00375   bdiru=precou; bdirv=precov; bdirz=precoz;
00376   bdirx=0.7071*(bdiru-bdirv); bdiry=0.7071*(bdiru+bdirv); 
00377   bdirerr=err;
00378   bndf=ndf;
00379 
00380   bvtxu=U[plnm]-0.02*(bdiru/bdirz); bvtxv=V[plnm]-0.02*(bdirv/bdirz); bvtxz=Z[plnm]-0.02;
00381   bvtxx=0.7071*(bvtxu-bvtxv); bvtxy=0.7071*(bvtxu+bvtxv);
00382 
00383   // end direction
00384   Uw=0.0; Uwz=0.0; Uwzz=0.0; Uwu=0.0; Uwuu=0.0; Uwzu=0.0;
00385   Vw=0.0; Vwz=0.0; Vwzz=0.0; Vwv=0.0; Vwvv=0.0; Vwzv=0.0;
00386   Upts=0; Vpts=0; 
00387 
00388   for(i=npln-1;i>-1;i--){
00389     if(i<=plnp && plnvuw[i]>-1){
00390       u=U[i]; v=V[i]; z=Z[i]; w=Q[i];
00391 
00392       if(plnvuw[i]==0 && Upts<MAXpts){
00393         Uw+=w;
00394         Uwu+=w*u; Uwz+=w*z; Uwuu+=w*u*u;
00395         Uwzu+=w*u*z; Uwzz+=w*z*z;
00396         Upts++;
00397       }
00398 
00399       if(plnvuw[i]==1 && Vpts<MAXpts){
00400         Vw+=w;
00401         Vwv+=w*v; Vwz+=w*z; Vwvv+=w*v*v;
00402         Vwzv+=w*v*z; Vwzz+=w*z*z;
00403         Vpts++;
00404       }
00405     }
00406   }
00407 
00408   mu=0.0; mv=0.0; err=-1.0; ndf=-1;
00409   if(Upts>1 && Vpts>1){ 
00410     mu=(Uw*Uwzu-Uwz*Uwu)/(Uw*Uwzz-Uwz*Uwz); cu=(Uwu*Uwzz-Uwz*Uwzu)/(Uw*Uwzz-Uwz*Uwz);
00411     mv=(Vw*Vwzv-Vwz*Vwv)/(Vw*Vwzz-Vwz*Vwz); cv=(Vwv*Vwzz-Vwz*Vwzv)/(Vw*Vwzz-Vwz*Vwz);
00412     err=(Uwuu-2.0*mu*Uwzu-2.0*cu*Uwu+mu*mu*Uwzz+2.0*mu*cu*Uwz+Uw*cu*cu)+(Vwvv-2.0*mv*Vwzv-2.0*cv*Vwv+mv*mv*Vwzz+2.0*mv*cv*Vwz+Vw*cv*cv);
00413     ndf=Upts+Vpts-4;
00414   }
00415 
00416   precou=mu; precov=mv;
00417   precos=sqrt(precou*precou+precov*precov+1.0);
00418   precou=precou/precos; precov=precov/precos; precoz=1.0/precos;
00419   ediru=precou; edirv=precov; edirz=precoz;
00420   edirx=0.7071*(ediru-edirv); ediry=0.7071*(ediru+edirv); 
00421   edirerr=err;  
00422   endf=ndf;
00423 
00424   evtxu=U[plnp]+0.04*(ediru/edirz); evtxv=V[plnp]+0.04*(edirv/edirz); evtxz=Z[plnp]+0.04;
00425   evtxx=0.7071*(evtxu-evtxv); evtxy=0.7071*(evtxu+evtxv); 
00426 
00427   MSG("AlgTrackAtNu", Msg::kDebug) << " beg vertex : UVXYZ = (" << bvtxu << "," << bvtxv << "," << bvtxx << "," << bvtxy << "," << bvtxz << ") " << endl;
00428 
00429   MSG("AlgTrackAtNu", Msg::kDebug) << " end vertex : UVXYZ = (" << evtxu << "," << evtxv << "," << evtxx << "," << evtxy << "," << evtxz << ") " << endl;
00430 
00431   // linear fit
00432   Uw=0.0; Uwz=0.0; Uwzz=0.0; Uwu=0.0; Uwuu=0.0; Uwzu=0.0;
00433   Vw=0.0; Vwz=0.0; Vwzz=0.0; Vwv=0.0; Vwvv=0.0; Vwzv=0.0;
00434   Upts=0; Vpts=0;
00435 
00436   for(i=0;i<npln;i++){
00437     if(i>=plnm && i<=plnp && plnvuw[i]>-1){
00438       u=U[i]; v=V[i]; z=Z[i]; w=Q[i];
00439 
00440       if(plnvuw[i]==0){
00441         Uw+=w;
00442         Uwu+=w*u; Uwz+=w*z; Uwuu+=w*u*u;
00443         Uwzu+=w*u*z; Uwzz+=w*z*z;
00444         Upts++;
00445       }
00446 
00447       if(plnvuw[i]==1){
00448         Vw+=w;
00449         Vwv+=w*v; Vwz+=w*z; Vwvv+=w*v*v;
00450         Vwzv+=w*v*z; Vwzz+=w*z*z;
00451         Vpts++;
00452       }
00453     }
00454   }
00455 
00456   mu=0.0; mv=0.0; err=-1.0; ndf=-1;
00457   if(Upts>1 && Vpts>1){
00458     mu=(Uw*Uwzu-Uwz*Uwu)/(Uw*Uwzz-Uwz*Uwz); cu=(Uwu*Uwzz-Uwz*Uwzu)/(Uw*Uwzz-Uwz*Uwz);
00459     mv=(Vw*Vwzv-Vwz*Vwv)/(Vw*Vwzz-Vwz*Vwz); cv=(Vwv*Vwzz-Vwz*Vwzv)/(Vw*Vwzz-Vwz*Vwz);
00460     err=(Uwuu-2.0*mu*Uwzu-2.0*cu*Uwu+mu*mu*Uwzz+2.0*mu*cu*Uwz+Uw*cu*cu)+(Vwvv-2.0*mv*Vwzv-2.0*cv*Vwv+mv*mv*Vwzz+2.0*mv*cv*Vwz+Vw*cv*cv);
00461     ndf=Upts+Vpts-4;
00462   }
00463 
00464   precou=mu; precov=mv;
00465   precos=sqrt(precou*precou+precov*precov+1.0);
00466   precou=precou/precos; precov=precov/precos; precoz=1.0/precos;
00467   lindiru=precou; lindirv=precov; lindirz=precoz;
00468   lindirx=0.7071*(lindiru-lindirv); lindiry=0.7071*(lindiru+lindirv); 
00469   lindirerr=err;
00470   linndf=ndf;
00471 
00472   // *************************************
00473   // * C O N T A I N M E N T   S T U F F *
00474   // *************************************
00475 
00476   MSG("AlgTrackAtNu", Msg::kDebug) << " *** containment stuff *** " << endl;
00477 
00478   Double_t begr=0.0,endr=0.0;
00479   Double_t begtrace=0.0,endtrace=0.0;
00480   Double_t begtraceZ=0.0,endtraceZ=0.0;
00481 
00482   if(atmosflag){
00483 
00484     // closest distance to edge
00485     Double_t xm,xp,ym,yp,um,up,vm,vp;
00486     Double_t rmin;
00487 
00488     rmin=4.0; 
00489     up=4.0-bvtxu; if(up<rmin) rmin=up;
00490     um=4.0+bvtxu; if(um<rmin) rmin=um;
00491     vp=4.0-bvtxv; if(vp<rmin) rmin=vp;
00492     vm=4.0+bvtxv; if(vm<rmin) rmin=vm;
00493     xp=4.0-bvtxx; if(xp<rmin) rmin=xp;
00494     xm=4.0+bvtxx; if(xm<rmin) rmin=xm;
00495     yp=4.0-bvtxy; if(yp<rmin) rmin=yp;
00496     ym=4.0+bvtxy; if(ym<rmin) rmin=ym;
00497     begr=rmin;
00498 
00499     rmin=4.0; 
00500     up=4.0-evtxu; if(up<rmin) rmin=up;
00501     um=4.0+evtxu; if(um<rmin) rmin=um;
00502     vp=4.0-evtxv; if(vp<rmin) rmin=vp;
00503     vm=4.0+evtxv; if(vm<rmin) rmin=vm;
00504     xp=4.0-evtxx; if(xp<rmin) rmin=xp;
00505     xm=4.0+evtxx; if(xm<rmin) rmin=xm;
00506     yp=4.0-evtxy; if(yp<rmin) rmin=yp;
00507     ym=4.0+evtxy; if(ym<rmin) rmin=ym;
00508     endr=rmin;
00509 
00510     Int_t trkflag;
00511     Double_t posX,posY,posU,posV,posZ;
00512     Double_t dirX,dirY,dirU,dirV,dirZ;
00513     Double_t dX,dY,dU,dV,dR;
00514     Double_t trace,traceZ;
00515     Double_t tmpU,tmpV,tmpZ;
00516     Double_t tmpdirU,tmpdirV,tmpdirZ;
00517     Double_t gradu,gradv,grads;
00518     Double_t tmpgrad;
00519     Int_t jm,jp;
00520 
00521     // beg trace
00522     tmpU = bvtxu; tmpV = bvtxv; tmpZ = bvtxz;
00523     tmpdirU = bdiru; tmpdirV = bdirv; tmpdirZ = bdirz;
00524     gradu = (tmpdirU/tmpdirZ); gradv = (tmpdirV/tmpdirZ);
00525                 
00526     for(j=0;j<10;j++){
00527       jm=plnm+j; jp=-1;
00528       if( jm<npln && plnvuw[jm]>-1 && Z[jm]-bvtxz<1.0 ){
00529         if( jp<0 && jm+2<10 && jm+2<npln && plnvuw[jm+2]>-1 && Z[jm+2]-bvtxz<1.0 ) jp=jm+2;
00530         if( jp<0 && jm+4<10 && jm+4<npln && plnvuw[jm+4]>-1 && Z[jm+4]-bvtxz<1.0 ) jp=jm+4;
00531         if( jp>=0 && plnvuw[jm]==plnvuw[jp] ){
00532           if( plnvuw[jm]==0 ){
00533             tmpgrad=(U[jp]-U[jm])/(Z[jp]-Z[jm]);
00534             if( (gradu<0&&tmpgrad<gradu)||(gradu>0.0&&tmpgrad>gradu) ){
00535               gradu=tmpgrad; tmpU=U[jm]+gradu*(tmpZ-Z[jm]);
00536             }
00537           }
00538           if( plnvuw[jm]==1 ){
00539             tmpgrad=(V[jp]-V[jm])/(Z[jp]-Z[jm]);
00540             if( (gradv<0&&tmpgrad<gradv)||(gradv>0.0&&tmpgrad>gradv) ){
00541               gradv=tmpgrad; tmpV=V[jm]+gradv*(tmpZ-Z[jm]);
00542             }
00543           }
00544         }
00545       }
00546     }
00547 
00548     posU=tmpU; posV=tmpV; posZ=tmpZ; posX=0.7071*(posU-posV); posY=0.7071*(posU+posV);
00549     grads=sqrt(gradu*gradu+gradv*gradv+1.0);
00550     dirU=-gradu/grads; dirV=-gradv/grads; dirZ=-1.0/grads;
00551     dirX=0.7071*(dirU-dirV); dirY=0.7071*(dirU+dirV);
00552     trkflag=0; dR=0.0;
00553 
00554     if(trkflag==0){
00555       if(dirX>0.0){
00556         dX = 4.0-posX; dY = dX*(dirY/dirX);
00557         if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
00558           trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
00559         }
00560       }
00561       if(dirX<0.0){
00562         dX = 4.0+posX; dY = -dX*(dirY/dirX);
00563         if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
00564            trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
00565         }
00566       }
00567     }
00568 
00569     if(trkflag==0){
00570       if(dirY>0.0){
00571         dY = 4.0-posY; dX = dY*(dirX/dirY);
00572         if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
00573           trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
00574         }
00575       }
00576       if(dirY<0.0){
00577         dY = 4.0+posY; dX = -dY*(dirX/dirY);
00578         if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
00579           trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
00580         }
00581       }
00582     }
00583 
00584     if(trkflag==0){
00585       if(dirU>0.0){
00586         dU = 4.0-posU; dV = dU*(dirV/dirU);
00587         if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
00588           trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
00589         }
00590       }
00591       if(dirU<0.0){
00592         dU = 4.0+posU; dV = -dU*(dirV/dirU);
00593         if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
00594           trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
00595         }
00596       }
00597     }
00598 
00599     if(trkflag==0){
00600       if(dirV>0.0){
00601         dV = 4.0-posV; dU = dV*(dirU/dirV);
00602         if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
00603           trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
00604         }
00605       }
00606       if(dirV<0.0){
00607         dV = 4.0+posV; dU = -dV*(dirU/dirV);
00608         if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
00609           trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
00610         }
00611       }
00612     }
00613 
00614     traceZ=0.0; trace=0.0;
00615     if(sqrt(dirX*dirX+dirY*dirY)>0.0){
00616       traceZ = -(dR*dirZ)/sqrt(dirX*dirX+dirY*dirY);
00617     }
00618     if(traceZ>0.0){                
00619       if(begZsm1>-100.0 && posZ-begZsm1>-0.06 && traceZ>posZ-begZsm1) traceZ = posZ-begZsm1;
00620       if(begZsm2>-100.0 && posZ-begZsm2>-0.06 && traceZ>posZ-begZsm2) traceZ = posZ-begZsm2;
00621     }
00622     if(traceZ<0.0){
00623       if(begZsm1>-100.0 && posZ-begZsm1>-0.06 && traceZ<-(posZ-begZsm1)) traceZ = -(posZ-begZsm1);
00624       if(begZsm2>-100.0 && posZ-begZsm2>-0.06 && traceZ<-(posZ-begZsm2)) traceZ = -(posZ-begZsm2);
00625     }
00626     if(dirZ<0.0){
00627       trace=-traceZ/dirZ;
00628     }
00629     begtrace=trace;  
00630     begtraceZ=traceZ;             
00631 
00632     // end trace
00633     tmpU = evtxu; tmpV = evtxv; tmpZ = evtxz;
00634     tmpdirU = ediru; tmpdirV = edirv; tmpdirZ = edirz;
00635     gradu = (tmpdirU/tmpdirZ); gradv = (tmpdirV/tmpdirZ);
00636 
00637     for(j=0;j<10;j++){
00638       jm=-1; jp=plnp-1-j;
00639       if( jp>-1 && plnvuw[jp]>-1 && Z[jp]-evtxz>-1.0 ){
00640         if( jm<0 && jp-2>npln-1-10 && jp-2>-1 && plnvuw[jp-2]>-1 && Z[jp-2]-evtxz>-1.0 ) jm=jp-2;
00641         if( jm<0 && jp-4>npln-1-10 && jp-4>-1 && plnvuw[jp-4]>-1 && Z[jp-4]-evtxz>-1.0 ) jm=jp-4;
00642         if( jm>=0 && plnvuw[jm]==plnvuw[jp] ){
00643           if( plnvuw[jp]==0 ){
00644             tmpgrad=(U[jp]-U[jm])/(Z[jp]-Z[jm]);
00645             if( (gradu<0&&tmpgrad<gradu)||(gradu>0.0&&tmpgrad>gradu) ){
00646               gradu=tmpgrad; tmpU=U[jp]+gradu*(tmpZ-Z[jp]);  
00647             }
00648           }
00649           if( plnvuw[jp]==1 ){
00650             tmpgrad=(V[jp]-V[jm])/(Z[jp]-Z[jm]);
00651             if( (gradv<0&&tmpgrad<gradv)||(gradv>0.0&&tmpgrad>gradv) ){
00652               gradv=tmpgrad; tmpV=V[jp]+gradv*(tmpZ-Z[jp]);
00653             }
00654           }
00655         }
00656       }
00657     }
00658 
00659     posU=tmpU; posV=tmpV; posZ=tmpZ; posX=0.7071*(posU-posV); posY=0.7071*(posU+posV);
00660     grads=sqrt(gradu*gradu+gradv*gradv+1.0);
00661     dirU=gradu/grads; dirV=gradv/grads; dirZ=1.0/grads;
00662     dirX=0.7071*(dirU-dirV); dirY=0.7071*(dirU+dirV);
00663     trkflag=0; dR=0.0;
00664 
00665     if(trkflag==0){
00666       if(dirX>0.0){
00667         dX = 4.0-posX; dY = dX*(dirY/dirX);
00668         if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
00669           trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
00670         }
00671       }
00672       if(dirX<0.0){
00673         dX = 4.0+posX; dY = -dX*(dirY/dirX);
00674         if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
00675          trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
00676         } 
00677       }
00678     }
00679 
00680     if(trkflag==0){
00681       if(dirY>0.0){
00682         dY = 4.0-posY; dX = dY*(dirX/dirY);
00683         if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
00684           trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
00685         }
00686       }
00687       if(dirY<0.0){
00688         dY = 4.0+posY; dX = -dY*(dirX/dirY);
00689         if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
00690           trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
00691         }
00692       }
00693     }
00694 
00695     if(trkflag==0){
00696       if(dirU>0.0){
00697         dU = 4.0-posU; dV = dU*(dirV/dirU);
00698         if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
00699           trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
00700         }
00701       }
00702       if(dirU<0.0){
00703         dU = 4.0+posU; dV = -dU*(dirV/dirU);
00704         if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
00705           trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
00706         }
00707       }
00708     }
00709 
00710     if(trkflag==0){
00711       if(dirV>0.0){
00712         dV = 4.0-posV; dU = dV*(dirU/dirV);
00713         if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
00714           trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
00715         }
00716       }
00717       if(dirV<0.0){
00718         dV = 4.0+posV; dU = -dV*(dirU/dirV);
00719         if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
00720           trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
00721         }
00722       }
00723     }
00724 
00725     traceZ = 0.0; trace=0.0;
00726     if(sqrt(dirX*dirX+dirY*dirY)>0.0){
00727       traceZ = (dR*dirZ)/sqrt(dirX*dirX+dirY*dirY); 
00728     }              
00729     if(traceZ>0.0){ 
00730       if(endZsm1>-100.0 && endZsm1-posZ>-0.06 && traceZ>endZsm1-posZ) traceZ = endZsm1-posZ;
00731       if(endZsm2>-100.0 && endZsm2-posZ>-0.06 && traceZ>endZsm2-posZ) traceZ = endZsm2-posZ;
00732     }
00733     if(traceZ<0.0){
00734       if(endZsm1>-100.0 && endZsm1-posZ>-0.06 && traceZ<-(endZsm1-posZ)) traceZ = -(endZsm1-posZ);
00735       if(endZsm2>-100.0 && endZsm2-posZ>-0.06 && traceZ<-(endZsm2-posZ)) traceZ = -(endZsm2-posZ);
00736     }
00737     if(dirZ>0.0){
00738       trace = traceZ/dirZ;
00739     }
00740     endtrace=trace;
00741     endtraceZ=traceZ;
00742 
00743   }
00744 
00745   // ***********************************************
00746   // * D I R E C T I O N   U S I N G   T I M I N G *
00747   // ***********************************************
00748 
00749   MSG("AlgTrackAtNu", Msg::kDebug) << " *** direction using timing *** " << endl;
00750 
00751   // timing weights
00752   Int_t ctflag;
00753   Double_t ctmin,ctmax,ctave,ctrms;
00754   Double_t sq,sqct,sqctct,swgt;
00755   Double_t wm,wp;
00756   for(i=0;i<npln;i++){
00757     if( plnvuw[i]>-1 ){
00758       wm=0.0; wp=0.0;
00759       if(Qm[i]>0.0) wm=1.0; if(Qp[i]>0.0) wp=1.0;
00760       ctflag=0; ctmin=0.0; ctmax=0.0; ctave=0.0; ctrms=0.0;
00761       sq=0.0; sqct=0.0; sqctct=0.0; swgt=0.0;
00762       for(j=-4;j<5;j++){
00763         if( j!=0 && i+j>-1 && i+j<npln && plnvuw[i+j]>-1 ){
00764           if( Qm[i+j]>1.0 
00765            && !( Qp[i+j]>0.0 && !(CTm[i+j]-CTp[i+j]>-4.0&&CTm[i+j]-CTp[i+j]<4.0) ) ){
00766             if(ctflag){
00767               if(CTm[i+j]<ctmin) ctmin=CTm[i+j]; if(CTm[i+j]>ctmax) ctmax=CTm[i+j]; 
00768             }
00769             else{
00770               ctmin=CTm[i+j]; ctmax=CTm[i+j]; ctflag=1;
00771             }
00772             sq+=Qm[i+j]; sqct+=Qm[i+j]*CTm[i+j]; sqctct+=Qm[i+j]*CTm[i+j]*CTm[i+j];
00773             swgt+=1.0;
00774           }
00775           if( Qp[i+j]>1.0 
00776            && !( Qm[i+j]>0.0 && !(CTp[i+j]-CTm[i+j]>-4.0&&CTp[i+j]-CTm[i+j]<4.0) ) ){
00777             if(ctflag){
00778               if(CTp[i+j]<ctmin) ctmin=CTp[i+j]; if(CTp[i+j]>ctmax) ctmax=CTp[i+j];
00779             }
00780             else{
00781               ctmin=CTp[i+j]; ctmax=CTp[i+j]; ctflag=1;
00782             }
00783             sq+=Qp[i+j]; sqct+=Qp[i+j]*CTp[i+j]; sqctct+=Qp[i+j]*CTp[i+j]*CTp[i+j];
00784             swgt+=1.0;
00785           }
00786         }
00787       }
00788       if( swgt>1.0 ){
00789         ctave=sqct/sq; ctrms=0.0;
00790         if((sqctct/sq)-(sqct/sq)*(sqct/sq)>0.0){ 
00791           ctrms=sqrt((sqctct/sq)-(sqct/sq)*(sqct/sq));
00792         }
00793         if( (Qm[i]>1.0) 
00794          && (CTm[i]-ctmin>-2.0 && CTm[i]-ctmax<2.0)
00795          && (CTm[i]-ctave<ctrms+3.0 && CTm[i]-ctave>-ctrms-3.0) ){
00796           wm=Qm[i];
00797         }
00798         if( (Qp[i]>1.0)
00799          && (CTp[i]-ctmin>-2.0 && CTp[i]-ctmax<2.0)
00800          && (CTp[i]-ctave<ctrms+3.0 && CTp[i]-ctave>-ctrms-3.0) ){
00801           wp=Qp[i];
00802         }
00803       }
00804       Wm[i]=wm; Wp[i]=wp;
00805     }
00806   }
00807 
00808   for(i=0;i<npln;i++){
00809     if( plnvuw[i]>-1 ){
00810       MSG("AlgTrackAtNu", Msg::kDebug) << " S=" << dS[i] 
00811                                        << " CTm=" << CTm[i] << " CTp=" << CTp[i]
00812                                        << " Wm=" << Wm[i] << " Wp=" << Wp[i] << endl;
00813     }
00814   }
00815 
00816   // measure overall timeslope
00817   Double_t ctimeslope=0.0,ctimeoffset=0.0,ctimeaverage=0.0,ctimescatter=0.0;
00818   Double_t Sw,Sws,Swss,Swt,Swtt,Swst;
00819   Double_t s,t;
00820   Int_t npts=0;
00821   Sw=0.0; Sws=0.0; Swss=0.0; Swt=0.0; Swtt=0.0; Swst=0.0;
00822   for(i=0;i<npln;i++){
00823     if( plnvuw[i]>-1 ){
00824       if( Wm[i]>0.0 ){
00825         s=dS[i]; t=CTm[i]; w=Wm[i];
00826         Sws+=w*s; Swss+=w*s*s; Swt+=w*t; Swtt+=w*t*t; Swst+=w*s*t;
00827         Sw+=w; npts++;
00828       }
00829       if( Wp[i]>0.0 ){
00830         s=dS[i]; t=CTp[i]; w=Wp[i];
00831         Sws+=w*s; Swss+=w*s*s; Swt+=w*t; Swtt+=w*t*t; Swst+=w*s*t;
00832         Sw+=w; npts++;
00833       }
00834     }
00835   }
00836   if(npts>2){
00837     ctimeslope=(Sw*Swst-Sws*Swt)/(Sw*Swss-Sws*Sws); 
00838     ctimeoffset=(Swt*Swss-Sws*Swst)/(Sw*Swss-Sws*Sws);
00839     ctimeaverage=(Swt/Sw); ctimescatter=0.0;
00840     if( (Swtt/Sw)-(Swt/Sw)*(Swt/Sw)>0.0 && (Swss/Sw)-(Sws/Sw)*(Sws/Sw)>0.0 ){
00841       ctimescatter=((Swst/Sw)-(Sws/Sw)*(Swt/Sw))/((sqrt((Swss/Sw)-(Sws/Sw)*(Sws/Sw)))*(sqrt((Swtt/Sw)-(Swt/Sw)*(Swt/Sw))));
00842     }
00843   }
00844 
00845   // determine direction using timing
00846   Double_t C,Csigma,Ctrunc; 
00847   Double_t cp,cm;
00848   Double_t chisqp=0.0,chisqm=0.0;
00849   Int_t chisqndfp=0,chisqndfm=0;
00850   Double_t dir,time_score,mytimeoffset;
00851   Int_t itr;
00852   
00853   MSG("AlgTrackAtNu", Msg::kDebug) << " POSITIVE FIT: " << endl;
00854   chisqp=-99999.9; cp=-99999.9;
00855   C=ctimeaverage; Csigma=-99999.9; Ctrunc=-99999.9;
00856   for(itr=0;itr<2;itr++){
00857     Swtt=0.0; Swt=0.0; Sw=0.0; npts=0;
00858     for(pln=0;pln<npln;pln++){
00859       if( plnvuw[pln]>-1 ){
00860         if( Wm[pln]>0.0 ){
00861           w=Wm[pln]; t=CTm[pln]-dS[pln]+C;
00862           if(Ctrunc<0.0||(t>-Ctrunc&&t<Ctrunc)){
00863             Swtt+=w*t*t; Swt+=w*t; Sw+=w; npts++;
00864           }
00865         }
00866         if( Wp[pln]>0.0 ){
00867           w=Wp[pln]; t=CTp[pln]-dS[pln]+C;
00868           if(Ctrunc<0.0||(t>-Ctrunc&&t<Ctrunc)){
00869             Swtt+=w*t*t; Swt+=w*t; Sw+=w; npts++;
00870           }
00871         }
00872       }
00873     }
00874     if(npts>1){
00875       C=C-Swt/Sw; Csigma=0.0; 
00876       if((Swtt/Sw)-(Swt/Sw)*(Swt/Sw)>0.0){
00877         Csigma=sqrt((Swtt/Sw)-(Swt/Sw)*(Swt/Sw));
00878       }
00879       chisqp=Csigma; chisqndfp=npts-1; cp=-C;
00880       Ctrunc=Csigma+3.0;
00881     }
00882   }
00883   MSG("AlgTrackAtNu", Msg::kDebug) << " *** C=" << C << " Csigma=" << Csigma << " *** " << endl;
00884 
00885 
00886   MSG("AlgTrackAtNu", Msg::kDebug) << " NEGATIVE FIT: " << endl;
00887   chisqm=-99999.9; cm=-99999.9;
00888   C=ctimeaverage; Csigma=-99999.9; Ctrunc=-99999.9;
00889   for(itr=0;itr<2;itr++){
00890     Swtt=0.0; Swt=0.0; Sw=0.0; npts=0;
00891     for(pln=0;pln<npln;pln++){
00892       if( plnvuw[pln]>-1 ){
00893         if( Wm[pln]>0.0 ){
00894           w=Wm[pln]; t=CTm[pln]+dS[pln]+C;
00895           if(Ctrunc<0.0||(t>-Ctrunc&&t<Ctrunc)){
00896             Swtt+=w*t*t; Swt+=w*t; Sw+=w; npts++;
00897           }
00898         }
00899         if( Wp[pln]>0.0 ){
00900           w=Wp[pln]; t=CTp[pln]+dS[pln]+C;
00901           if(Ctrunc<0.0||(t>-Ctrunc&&t<Ctrunc)){
00902             Swtt+=w*t*t; Swt+=w*t; Sw+=w; npts++;
00903           }
00904         }
00905       }
00906     }
00907     if(npts>1){
00908       C=C-Swt/Sw; Csigma=0.0;
00909       if((Swtt/Sw)-(Swt/Sw)*(Swt/Sw)>0.0){
00910         Csigma=sqrt((Swtt/Sw)-(Swt/Sw)*(Swt/Sw));
00911       }
00912       chisqm=Csigma; chisqndfm=npts-1; cm=-C;
00913       Ctrunc=Csigma+3.0;
00914     }
00915   }
00916   MSG("AlgTrackAtNu", Msg::kDebug) << " *** C=" << C << " Csigma=" << Csigma << " *** " << endl;
00917   
00918   dir=0.0; 
00919   time_score=0.0; mytimeoffset=0.0;
00920   if(chisqm>0.0 && chisqp>0.0){
00921     if(chisqp>chisqm){
00922       dir=-1.0; time_score=1-chisqm/chisqp; mytimeoffset=cm;
00923     }
00924     else{
00925       dir=+1.0; time_score=1-chisqp/chisqm; mytimeoffset=cp;
00926     }
00927     time_score=dir*time_score;
00928   }
00929 
00930   MSG("AlgTrackAtNu", Msg::kDebug) << " timing parameters " << endl
00931     << " chisqp=" << chisqp << " (" << chisqndfp << ") " 
00932     << " chisqm=" << chisqm << " (" << chisqndfm << ") " << endl
00933     << " score=" << time_score << endl;
00934 
00935 
00936   // ******************************
00937   // * V E R T E X   S H O W E R  *
00938   // ******************************
00939 
00940   // determine direction using showering
00941   MSG("AlgTrackAtNu", Msg::kDebug) << " *** vertex showers *** " << endl;
00942   Bool_t begvtxshw=0,endvtxshw=0;
00943   Int_t begvtxshwstrips=0,endvtxshwstrips=0;
00944   Bool_t begvtxreseeded=0,endvtxreseeded=0;
00945 
00946   ShowerAtNu* begshwU = (ShowerAtNu*)(trku->GetBegVtxShower()); 
00947   ShowerAtNu* begshwV = (ShowerAtNu*)(trkv->GetBegVtxShower());
00948   if( begshwU && begshwV ){
00949     begvtxshw=1; 
00950     begvtxshwstrips=(1+begshwU->GetHitLast())+(1+begshwV->GetHitLast());
00951     if(begshwU->GetReseedFlag() && begshwV->GetReseedFlag()) begvtxreseeded=1;
00952   }
00953 
00954   ShowerAtNu* endshwU = (ShowerAtNu*)(trku->GetEndVtxShower()); 
00955   ShowerAtNu* endshwV = (ShowerAtNu*)(trkv->GetEndVtxShower());
00956   if( endshwU && endshwV ){
00957     endvtxshw=1; 
00958     endvtxshwstrips=(1+endshwU->GetHitLast())+(1+endshwV->GetHitLast());
00959     if(endshwU->GetReseedFlag() && endshwV->GetReseedFlag()) endvtxreseeded=1;
00960   }
00961 
00962   MSG("AlgTrackAtNu", Msg::kVerbose) << " vertex showers " << endl
00963                                      << "  beg vtxshw strps = " << begvtxshwstrips
00964                                      << "  end vtxshw strps = " << endvtxshwstrips << endl;
00965 
00966 
00967   // *************************
00968   // * S L I C E   S T U F F * 
00969   // *************************
00970 
00971   MSG("AlgTrackAtNu", Msg::kDebug) << " *** slice stuff *** " << endl;
00972 
00973   Int_t ntrkplns=0;
00974   Double_t trkph=0.0,shwph=0.0;
00975   Double_t assocph=0.0,totph=0.0;
00976   Double_t assocphlocal=0.0,totphlocal=0.0;
00977   Double_t begQmax=0.0,endQmax=0.0;
00978   Double_t begRmax=0.0,endRmax=0.0;
00979   Double_t begRdigits=0.0,endRdigits=0.0;
00980   Double_t begUmean=0.0,endUmean=0.0;
00981   Double_t begUwidth=0.0,endUwidth=0.0;
00982   Double_t begVmean=0.0,endVmean=0.0;
00983   Double_t begVwidth=0.0,endVwidth=0.0;
00984   Int_t begplndigits=bpln,endplndigits=epln;
00985   Int_t bstr,estr,xtalk;
00986   Double_t chg;
00987 
00988   const CandSliceHandle* slice = dynamic_cast<const CandSliceHandle*>(track.GetCandSlice());
00989   TIter sliceitr(slice->GetDaughterIterator());
00990   while(CandStripHandle* strip = (CandStripHandle*)(sliceitr())){
00991     pln=strip->GetPlane(); chg=strip->GetCharge();
00992     xtalk=0;
00993     TIter digitr(strip->GetDaughterIterator());
00994     while(CandDeMuxDigitHandle* digit = dynamic_cast<CandDeMuxDigitHandle*>(digitr())){
00995       if(  (digit->GetDeMuxDigitFlagWord()<8)
00996         && ( (digit->GetDeMuxDigitFlagWord() & CandDeMuxDigit::kXTalk)==(CandDeMuxDigit::kXTalk) ) ){
00997         xtalk=1; 
00998       }
00999     }
01000     if( !xtalk && chg>2.0
01001      && pln>-1 && pln<500 ){
01002       fSliceStrpArr[pln].Add(strip);
01003     }
01004   }
01005   
01006   TIter stripitr(track.GetDaughterIterator());
01007   while(CandStripHandle* strip = (CandStripHandle*)(stripitr())){
01008     pln=strip->GetPlane(); chg=strip->GetCharge();
01009     xtalk=0;
01010     TIter digitr(strip->GetDaughterIterator());
01011     while(CandDeMuxDigitHandle* digit = dynamic_cast<CandDeMuxDigitHandle*>(digitr())){
01012       if(  (digit->GetDeMuxDigitFlagWord()<8)
01013         && ( (digit->GetDeMuxDigitFlagWord() & CandDeMuxDigit::kXTalk)==(CandDeMuxDigit::kXTalk) ) ){
01014         xtalk=1; 
01015       }
01016     }
01017     if( !xtalk && chg>2.0
01018      && pln>-1 && pln<500 ){
01019       fTrackStrpArr[pln].Add(strip);
01020     }
01021   }
01022 
01023   // pulseheight
01024   for(i=0;i<500;i++){
01025     if( 1+fSliceStrpArr[i].GetLast()>0 ){
01026       bstr=-1; estr=-1;
01027       for(j=0;j<1+fTrackStrpArr[i].GetLast();j++){
01028         CandStripHandle* strip = (CandStripHandle*)(fTrackStrpArr[i].At(j));
01029         if(bstr<0||strip->GetStrip()<bstr) bstr=strip->GetStrip();
01030         if(estr<0||strip->GetStrip()>estr) estr=strip->GetStrip();
01031         trkph+=strip->GetCharge();
01032       }
01033       assocphlocal=0.0; totphlocal=0.0;
01034       for(j=0;j<1+fSliceStrpArr[i].GetLast();j++){
01035         CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[i].At(j));
01036         if( bstr>-1 && estr>-1 
01037          && strip->GetStrip()>bstr-2 && strip->GetStrip()<estr+2 ){
01038           assocphlocal+=strip->GetCharge(); assocph+=strip->GetCharge();
01039         }
01040         totphlocal+=strip->GetCharge(); totph+=strip->GetCharge();
01041       }
01042       if( totphlocal>0.0 && totphlocal<80.0 
01043        && assocphlocal/totphlocal>0.8 ){
01044         ntrkplns++;
01045       }
01046     }
01047   }
01048   shwph=totph-trkph;
01049 
01050   if(atmosflag){
01051 
01052     TObjArray tmpu,tmpv;
01053     Double_t dT,dU,dV,dR,dQ;
01054     Double_t myUwt2,myUwt,myUw;
01055     Double_t myVwt2,myVwt,myVw;
01056     Double_t Qmax,Rmax;
01057 
01058     // R stuff
01059     Rmax=0.0;
01060     myUwt2=0.0; myUwt=0.0; myUw=0.0;
01061     myVwt2=0.0; myVwt=0.0; myVw=0.0;
01062     for(j=-4;j<=5;j++){
01063       tmpu.Clear(); tmpv.Clear();
01064 
01065       if( bpln+j>0 && bpln+j<500 
01066        && !(bpln<249&&bpln+j>249) && !(bpln>249&&bpln+j<249) ){
01067         for(k=0;k<1+fSliceStrpArr[bpln+j].GetLast();k++){
01068           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[bpln+j].At(k));
01069           dT=0.0; dQ=0.0;
01070           if(strip->GetPlaneView()==PlaneView::kU){ 
01071             dT=(strip->GetTPos())-(bvtxu+bdiru*(strip->GetZPos()-bvtxz));
01072             dQ=strip->GetCharge();
01073             myUwt2+=dQ*dT*dT; myUwt+=dQ*dT; myUw+=dQ;
01074           }
01075           if(strip->GetPlaneView()==PlaneView::kV){ 
01076             dT=(strip->GetTPos())-(bvtxv+bdirv*(strip->GetZPos()-bvtxz));
01077             dQ=strip->GetCharge();
01078             myVwt2+=dQ*dT*dT; myVwt+=dQ*dT; myVw+=dQ;
01079           }
01080         }
01081       }
01082 
01083       if( bpln+j>0 && bpln+j<500 
01084        && !(bpln<249&&bpln+j>249) && !(bpln>249&&bpln+j<249) ){
01085         for(k=0;k<1+fSliceStrpArr[bpln+j].GetLast();k++){
01086           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[bpln+j].At(k));
01087           if(strip->GetPlaneView()==PlaneView::kU){ tmpu.Add(strip); }
01088           if(strip->GetPlaneView()==PlaneView::kV){ tmpv.Add(strip); }
01089         }
01090       }    
01091                       
01092       if( bpln+j-1>0 && bpln+j-1<500 
01093        && !(bpln<249&&bpln+j-1>249) && !(bpln>249&&bpln+j-1<249) ){
01094         for(k=0;k<1+fSliceStrpArr[bpln+j-1].GetLast();k++){
01095           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[bpln+j-1].At(k));
01096           if(strip->GetPlaneView()==PlaneView::kU){ tmpu.Add(strip); }
01097           if(strip->GetPlaneView()==PlaneView::kV){ tmpv.Add(strip); } 
01098         }
01099       }
01100                   
01101       if(1+tmpu.GetLast()>0 && 1+tmpv.GetLast()>0){
01102         for(k=0;k<1+tmpu.GetLast();k++){
01103           for(l=0;l<1+tmpv.GetLast();l++){
01104             CandStripHandle* strip = (CandStripHandle*)(tmpu.At(k));
01105             CandStripHandle* strip1 = (CandStripHandle*)(tmpv.At(l));
01106             dU=strip->GetTPos()-bvtxu; dV=strip1->GetTPos()-bvtxv;            
01107             dR=sqrt(dU*dU+dV*dV); if(dR>Rmax) Rmax=dR; 
01108           }
01109         }
01110       }
01111     }
01112 
01113     begRmax=Rmax;
01114 
01115     if(myUw>0.0){
01116       begUmean=myUwt/myUw;
01117       if((myUwt2/myUw)>(myUwt/myUw)*(myUwt/myUw)){
01118         begUwidth=sqrt((myUwt2/myUw)-(myUwt/myUw)*(myUwt/myUw));
01119       }
01120     }
01121 
01122     if(myVw>0.0){
01123       begVmean=myVwt/myVw;
01124       if((myVwt2/myVw)>(myVwt/myVw)*(myVwt/myVw)){
01125         begVwidth=sqrt((myVwt2/myVw)-(myVwt/myVw)*(myVwt/myVw));
01126       }
01127     }
01128 
01129 
01130     Rmax=0.0;
01131     myUwt2=0.0; myUwt=0.0; myUw=0.0;
01132     myVwt2=0.0; myVwt=0.0; myVw=0.0;
01133     for(j=-4;j<=5;j++){
01134       tmpu.Clear(); tmpv.Clear();
01135 
01136       if( epln+j>0 && epln+j<500 
01137        && !(epln<249&&epln+j>249) && !(epln>249&&epln+j<249) ){
01138         for(k=0;k<1+fSliceStrpArr[epln+j].GetLast();k++){
01139           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[epln+j].At(k));
01140           dT=0.0; dQ=0.0;
01141           if(strip->GetPlaneView()==PlaneView::kU){ 
01142             dT=(strip->GetTPos())-(evtxu+ediru*(strip->GetZPos()-evtxz));
01143             dQ=strip->GetCharge();
01144             myUwt2+=dQ*dT*dT; myUwt+=dQ*dT; myUw+=dQ;
01145           }
01146           if(strip->GetPlaneView()==PlaneView::kV){ 
01147             dT=(strip->GetTPos())-(evtxv+edirv*(strip->GetZPos()-evtxz));
01148             dQ=strip->GetCharge();
01149             myVwt2+=dQ*dT*dT; myVwt+=dQ*dT; myVw+=dQ;
01150           }
01151         }
01152       }
01153 
01154       if( epln+j>0 && epln+j<500 
01155        && !(epln<249&&epln+j>249) && !(epln>249&&epln+j<249) ){
01156         for(k=0;k<1+fSliceStrpArr[epln+j].GetLast();k++){
01157           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[epln+j].At(k));
01158           if(strip->GetPlaneView()==PlaneView::kU){ tmpu.Add(strip); }
01159           if(strip->GetPlaneView()==PlaneView::kV){ tmpv.Add(strip); }
01160         }
01161       }
01162                       
01163       if( epln+j-1>0 && epln+j-1<500 
01164        && !(epln<249&&epln+j-1>249) && !(epln>249&&epln+j-1<249) ){
01165         for(k=0;k<1+fSliceStrpArr[epln+j-1].GetLast();k++){
01166           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[epln+j-1].At(k));
01167           if(strip->GetPlaneView()==PlaneView::kU){ tmpu.Add(strip); }
01168           if(strip->GetPlaneView()==PlaneView::kV){ tmpv.Add(strip); } 
01169         }
01170       }
01171 
01172       if(1+tmpu.GetLast()>0 && 1+tmpv.GetLast()>0){
01173         for(k=0;k<1+tmpu.GetLast();k++){
01174           for(l=0;l<1+tmpv.GetLast();l++){
01175             CandStripHandle* strip = (CandStripHandle*)(tmpu.At(k));
01176             CandStripHandle* strip1 = (CandStripHandle*)(tmpv.At(l));
01177             dU=strip->GetTPos()-evtxu; dV=strip1->GetTPos()-evtxv;
01178             dR=sqrt(dU*dU+dV*dV); if(dR>Rmax) Rmax=dR;               
01179           }
01180         }
01181       }
01182     }
01183 
01184     endRmax=Rmax;
01185 
01186     if(myUw>0.0){
01187       endUmean=myUwt/myUw;
01188       if((myUwt2/myUw)>(myUwt/myUw)*(myUwt/myUw)){
01189         endUwidth=sqrt((myUwt2/myUw)-(myUwt/myUw)*(myUwt/myUw));
01190       }
01191     }
01192 
01193     if(myVw>0.0){
01194       endVmean=myVwt/myVw;
01195       if((myVwt2/myVw)>(myVwt/myVw)*(myVwt/myVw)){
01196         endVwidth=sqrt((myVwt2/myVw)-(myVwt/myVw)*(myVwt/myVw));
01197       }
01198     }
01199 
01200                     
01201     // Q stuff
01202     Qmax=0.0;
01203     for(j=-4;j<=5;j++){
01204       dQ=0.0;
01205       if( bpln+j>0 && bpln+j<500 
01206        && !(bpln<249&&bpln+j>249) && !(bpln>249&&bpln+j<249) ){
01207         for(k=0;k<1+fSliceStrpArr[bpln+j].GetLast();k++){
01208           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[bpln+j].At(k));
01209           dQ+=strip->GetCharge();
01210         }
01211       }
01212       if(dQ>Qmax) Qmax=dQ;
01213     }
01214     begQmax=Qmax;
01215 
01216     Qmax=0.0;
01217     for(j=-4;j<=5;j++){
01218       dQ=0.0;
01219       if( epln+j>0 && epln+j<500 
01220        && !(epln<249&&epln+j>249) && !(epln>249&&epln+j<249) ){
01221         for(k=0;k<1+fSliceStrpArr[epln+j].GetLast();k++){
01222           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[epln+j].At(k));
01223           dQ+=strip->GetCharge();
01224         }
01225       }
01226       if(dQ>Qmax) Qmax=dQ;
01227     }
01228     endQmax=Qmax;
01229 
01230     // containment stuff
01231     Int_t plnM,plnP;
01232     Double_t totq,totqt;
01233     Double_t opos,tpos,upos,vpos,xpos,ypos,rpos;
01234     Double_t xm,xp,ym,yp,um,up,vm,vp;   
01235 
01236     begplndigits=bpln;
01237     begRdigits=4.0;
01238     if(bpln<249){ 
01239       plnM=begsm1; plnP=bpln+3; if(plnP>endsm1) plnP=endsm1; 
01240     }
01241     if(bpln>249){ 
01242       plnM=begsm2; plnP=bpln+3; if(plnP>endsm2) plnP=endsm2;  
01243     }
01244     for(i=plnM;i<plnP;i++){  
01245       if( i-1>=0 
01246        && 1+fSliceStrpArr[i].GetLast()>0 && 1+fSliceStrpArr[i-1].GetLast()>0 ){ 
01247         totqt=0.0; totq=0.0; 
01248         for(j=0;j<1+fSliceStrpArr[i-1].GetLast();j++){
01249           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[i-1].At(j));
01250           totqt+=strip->GetTPos()*strip->GetCharge(); 
01251           totq+=strip->GetCharge();
01252         }
01253         if(totq>0.0){
01254           opos=totqt/totq;
01255           for(j=0;j<1+fSliceStrpArr[i].GetLast();j++){
01256             CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[i].At(j));
01257             upos=0.0; vpos=0.0; tpos=strip->GetTPos();
01258             if(strip->GetPlaneView()==PlaneView::kU){ upos=tpos; vpos=opos; }
01259             if(strip->GetPlaneView()==PlaneView::kV){ vpos=tpos; upos=opos; }
01260             xpos=0.7071*(upos-vpos); ypos=0.7071*(upos+vpos); rpos=4.0;
01261             up=4.0-upos; if(up<rpos) rpos=up;
01262             um=4.0+upos; if(um<rpos) rpos=um;
01263             vp=4.0-vpos; if(vp<rpos) rpos=vp;
01264             vm=4.0+vpos; if(vm<rpos) rpos=vm;
01265             xp=4.0-xpos; if(xp<rpos) rpos=xp;
01266             xm=4.0+xpos; if(xm<rpos) rpos=xm;
01267             yp=4.0-ypos; if(yp<rpos) rpos=yp;
01268             ym=4.0+ypos; if(ym<rpos) rpos=ym;
01269             if(rpos<begRdigits) begRdigits=rpos;
01270             if(strip->GetPlane()<begplndigits) begplndigits=strip->GetPlane();
01271           }
01272         }
01273       } 
01274     }
01275 
01276     endplndigits=epln;
01277     endRdigits=4.0;
01278     if(epln<249){ 
01279       plnP=endsm1; plnM=epln-3; if(plnM<begsm1) plnM=begsm1; 
01280     }
01281     if(epln>249){ 
01282       plnP=endsm2; plnM=epln-3; if(plnM<begsm2) plnM=begsm2; 
01283     }
01284     for(i=plnM;i<plnP;i++){
01285       if( i+1<500
01286        && 1+fSliceStrpArr[i].GetLast()>0 && 1+fSliceStrpArr[i+1].GetLast()>0 ){ 
01287         totqt=0.0; totq=0.0;  
01288         for(j=0;j<1+fSliceStrpArr[i+1].GetLast();j++){
01289           CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[i+1].At(j));
01290           totqt+=strip->GetTPos()*strip->GetCharge(); 
01291           totq+=strip->GetCharge();
01292         }
01293         if(totq>0.0){
01294           opos=totqt/totq;
01295           for(j=0;j<1+fSliceStrpArr[i].GetLast();j++){
01296             CandStripHandle* strip = (CandStripHandle*)(fSliceStrpArr[i].At(j));
01297             upos=0.0; vpos=0.0; tpos=strip->GetTPos();
01298             if(strip->GetPlaneView()==PlaneView::kU){ upos=tpos; vpos=opos; }
01299             if(strip->GetPlaneView()==PlaneView::kV){ vpos=tpos; upos=opos; }
01300             xpos=0.7071*(upos-vpos); ypos=0.7071*(upos+vpos); rpos=4.0;
01301             up=4.0-upos; if(up<rpos) rpos=up;
01302             um=4.0+upos; if(um<rpos) rpos=um;
01303             vp=4.0-vpos; if(vp<rpos) rpos=vp;
01304             vm=4.0+vpos; if(vm<rpos) rpos=vm;
01305             xp=4.0-xpos; if(xp<rpos) rpos=xp;
01306             xm=4.0+xpos; if(xm<rpos) rpos=xm;
01307             yp=4.0-ypos; if(yp<rpos) rpos=yp;
01308             ym=4.0+ypos; if(ym<rpos) rpos=ym;
01309             if(rpos<endRdigits) endRdigits=rpos;
01310             if(strip->GetPlane()>endplndigits) endplndigits=strip->GetPlane();
01311           }
01312         }
01313       } 
01314     }
01315 
01316     MSG("AlgTrackAtNu",Msg::kDebug) << "  beg vtx topology : Umean=" << begUmean << " Uwidth=" << begUwidth << " Vmean=" << begVmean << " Vwidth=" << begVwidth << " Rmax=" << begRmax << " Qmax=" << begQmax << endl;
01317 
01318     MSG("AlgTrackAtNu",Msg::kDebug) << "  end vtx topology : Umean=" << endUmean << " Uwidth=" << endUwidth << " Vmean=" << endVmean << " Vwidth=" << endVwidth << " Rmax=" << endRmax << " Qmax=" << endQmax << endl;
01319 
01320   }
01321 
01322   for(i=0;i<500;i++){
01323     fSliceStrpArr[i].Clear();
01324     fTrackStrpArr[i].Clear();
01325   }
01326 
01327   // *******************************
01328   // * M O M E N T U M   S T U F F *
01329   // *******************************
01330 
01331   MSG("AlgTrackAtNu",Msg::kDebug) << " *** calculate momentum *** " << endl;
01332 
01333   // calculate momentum
01334   Double_t momentum=0.0,momentum_err=0.0;
01335   Double_t range_thru_steel_xtra=0.0;
01336   Double_t range_thru_detector_xtra=0.0;
01337   if(range_thru_detector>0.0){
01338     range_thru_steel_xtra = 0.0127*(1.0/bdirz+1.0/edirz);
01339     range_thru_detector_xtra = 0.0296*(1.0/bdirz+1.0/edirz);
01340     range_thru_steel+=range_thru_steel_xtra;
01341     range_thru_detector+=range_thru_detector_xtra;
01342     momentum = 1.52*range_thru_steel; 
01343     // momentum = 0.131 + 1.309*range_thru_steel + 0.0288*range_thru_steel*range_thru_steel;
01344     momentum_err = 0.0; 
01345   }
01346 
01347   // *****************************************
01348   // * S E T   T R A C K   V A R I A B L E S *
01349   // *****************************************
01350 
01351   MSG("AlgTrackAtNu",Msg::kDebug) << " *** set track variables *** " << endl;
01352 
01353   // set reseed flag
01354   Bool_t reseedflag=0;
01355   if(trku->GetReseedFlag()&&trkv->GetReseedFlag()) reseedflag=1;
01356 
01357   // determine overall direction using timing
01358   dir=0.0; 
01359   if(time_score>0.0) dir=1.0; if(time_score<0.0) dir=-1.0;
01360 
01361   // set ranges
01362   for(i=0;i<npln;i++){
01363     pln=bpln+i;
01364     if(plnvuw[i]>-1){
01365       if(dir>=0.0){
01366         track.SetdS(pln,dS[i]+0.5*range_thru_detector_xtra);
01367         track.SetRange(pln,dens*(dSsteel[i]+0.5*range_thru_steel_xtra));
01368       }
01369       else{
01370         track.SetdS(pln,range_thru_detector-dS[i]-0.5*range_thru_detector_xtra);
01371         track.SetRange(pln,dens*(range_thru_steel-dSsteel[i]-0.5*range_thru_steel_xtra));
01372       }
01373     }
01374   }
01375 
01376   // set track variables
01377   track.SetMinPlane(bpln);
01378   track.SetMaxPlane(epln);
01379   track.SetNPlanes(nplanes);
01380   track.SetNStrips(nstrips);
01381   track.SetTimeSlope((dir)/(3.0e8));
01382   track.SetTimeOffset((mytimeoffset)/(3.0e8));
01383   track.SetDirTimeSlope((ctimeslope)/(3.0e8));
01384   track.SetDirTimeOffset((ctimeoffset)/(3.0e8));
01385   track.SetDirTimeScatter(ctimescatter);
01386   track.SetDirTimeScore(time_score);
01387   track.SetTrkPlanes(ntrkplns);
01388   track.SetTrkPH(trkph);
01389   track.SetShwPH(shwph);
01390   track.SetAssocTrkPH(assocph);
01391   track.SetAssocTrkPHfrac(assocph/totph);
01392   track.SetLinearDirCosU(dir*lindiru);
01393   track.SetLinearDirCosV(dir*lindirv);
01394   track.SetLinearDirCosZ(dir*lindirz);
01395   track.SetLinearDirFitChisq(lindirerr);
01396   track.SetLinearDirFitNdf(linndf);
01397   track.SetRangeThruSteel(range_thru_steel);
01398   track.SetRangeThruDetector(range_thru_detector);
01399   track.SetMomentum(momentum);
01400   track.SetMomentumErr(momentum_err);
01401   track.SetReseedFlag(reseedflag);
01402   if(dir>=0.0){
01403     track.SetVtxU(bvtxu);
01404     track.SetVtxV(bvtxv);
01405     track.SetVtxZ(bvtxz);
01406     track.SetVtxR(begr);
01407     track.SetVtxT((mytimeoffset)/(3.0e8));
01408     track.SetVtxPlane(bpln+plnm);
01409     track.SetVtxPlaneDigits(begplndigits); 
01410     track.SetVtxTrace(begtrace);
01411     track.SetVtxTraceZ(begtraceZ);
01412     track.SetVtxRdigits(begRdigits);
01413     track.SetVtxUwidth(begUwidth);
01414     track.SetVtxUmean(begUmean);
01415     track.SetVtxVwidth(begVwidth);
01416     track.SetVtxVmean(begVmean);
01417     track.SetVtxRmax(begRmax);
01418     track.SetVtxQmax(begQmax);
01419     track.SetDirCosU(bdiru);
01420     track.SetDirCosV(bdirv);
01421     track.SetDirCosZ(bdirz);
01422     track.SetEndU(evtxu);
01423     track.SetEndV(evtxv);
01424     track.SetEndZ(evtxz);
01425     track.SetEndR(endr);
01426     track.SetEndT((mytimeoffset+range_thru_detector)/(3.0e8));
01427     track.SetEndPlane(bpln+plnp);
01428     track.SetEndPlaneDigits(endplndigits); 
01429     track.SetEndTrace(endtrace);
01430     track.SetEndTraceZ(endtraceZ);
01431     track.SetEndRdigits(endRdigits);
01432     track.SetEndUwidth(endUwidth);
01433     track.SetEndUmean(endUmean);
01434     track.SetEndVwidth(endVwidth);
01435     track.SetEndVmean(endVmean);
01436     track.SetEndRmax(endRmax);
01437     track.SetEndQmax(endQmax); 
01438     track.SetEndDirCosU(ediru);
01439     track.SetEndDirCosV(edirv);
01440     track.SetEndDirCosZ(edirz);
01441     track.SetVtxDirTimeFitChisq(chisqp);
01442     track.SetVtxDirTimeFitNdf(chisqndfp);
01443     track.SetEndDirTimeFitChisq(chisqm);
01444     track.SetEndDirTimeFitNdf(chisqndfm);
01445     track.SetVtxShw(begvtxshw);
01446     track.SetVtxShwStrips(begvtxshwstrips);
01447     track.SetVtxShwReseedFlag(begvtxreseeded);
01448     track.SetEndShw(endvtxshw);
01449     track.SetEndShwStrips(endvtxshwstrips);
01450     track.SetEndShwReseedFlag(endvtxreseeded);
01451   }
01452   else{
01453     track.SetVtxU(evtxu);
01454     track.SetVtxV(evtxv);
01455     track.SetVtxZ(evtxz);
01456     track.SetVtxR(endr);
01457     track.SetVtxT((mytimeoffset-range_thru_detector)/(3.0e8));
01458     track.SetVtxPlane(bpln+plnp);
01459     track.SetVtxPlaneDigits(endplndigits);
01460     track.SetVtxTrace(endtrace);
01461     track.SetVtxTraceZ(endtraceZ);
01462     track.SetVtxRdigits(endRdigits);
01463     track.SetVtxUwidth(endUwidth); 
01464     track.SetVtxUmean(endUmean); 
01465     track.SetVtxVwidth(endVwidth); 
01466     track.SetVtxVmean(endVmean); 
01467     track.SetVtxRmax(endRmax); 
01468     track.SetVtxQmax(endQmax);
01469     track.SetDirCosU(-ediru);
01470     track.SetDirCosV(-edirv);
01471     track.SetDirCosZ(-edirz);
01472     track.SetEndU(bvtxu);
01473     track.SetEndV(bvtxv);
01474     track.SetEndZ(bvtxz);
01475     track.SetEndR(begr);
01476     track.SetEndT((mytimeoffset)/(3.0e8));
01477     track.SetEndPlane(bpln+plnm);
01478     track.SetEndPlaneDigits(begplndigits);
01479     track.SetEndTrace(begtrace);
01480     track.SetEndTraceZ(begtraceZ);
01481     track.SetEndRdigits(begRdigits);
01482     track.SetEndUmean(begUmean);
01483     track.SetEndUwidth(begUwidth);
01484     track.SetEndVmean(begVmean);
01485     track.SetEndVwidth(begVwidth);
01486     track.SetEndRmax(begRmax);
01487     track.SetEndQmax(begQmax);
01488     track.SetEndDirCosU(-bdiru);
01489     track.SetEndDirCosV(-bdirv);
01490     track.SetEndDirCosZ(-bdirz);
01491     track.SetVtxDirTimeFitChisq(chisqm);
01492     track.SetVtxDirTimeFitNdf(chisqndfm);
01493     track.SetEndDirTimeFitChisq(chisqp);
01494     track.SetEndDirTimeFitNdf(chisqndfp);
01495     track.SetVtxShw(endvtxshw);
01496     track.SetVtxShwStrips(endvtxshwstrips);
01497     track.SetVtxShwReseedFlag(endvtxreseeded);
01498     track.SetEndShw(begvtxshw);
01499     track.SetEndShwStrips(begvtxshwstrips);
01500     track.SetEndShwReseedFlag(begvtxreseeded);
01501   }
01502 
01503   MSG("AlgTrackAtNu", Msg::kDebug) 
01504     << " *** CREATING NEW TRACK *** " << endl
01505     << "  VtxPln = " << track.GetVtxPlane() << endl
01506     << "  VtxPlnDigits = " << track.GetVtxPlaneDigits() << endl
01507     << "  VtxU = " << track.GetVtxU() << endl
01508     << "  VtxV = " << track.GetVtxV() << endl
01509     << "  VtxZ = " << track.GetVtxZ() << endl
01510     << "  VtxT = " << track.GetVtxT() << endl
01511     << "  VtxR = " << track.GetVtxR() << endl
01512     << "  VtxTrace = " << track.GetVtxTrace() << endl
01513     << "  VtxTraceZ = " << track.GetVtxTraceZ() << endl
01514     << "  VtxRdigits = " << track.GetVtxRdigits() << endl
01515     << "  VtxUwidth = " << track.GetVtxUwidth() << endl
01516     << "  VtxUmean = " << track.GetVtxUmean() << endl
01517     << "  VtxVwidth = " << track.GetVtxVwidth() << endl
01518     << "  VtxVmean = " << track.GetVtxVmean() << endl
01519     << "  VtxRmax = " << track.GetVtxRmax() << endl
01520     << "  VtxQmax = " << track.GetVtxQmax() << endl
01521     << "  DirCosU = " << track.GetDirCosU() << endl
01522     << "  DirCosV = " << track.GetDirCosV() << endl
01523     << "  DirCosZ = " << track.GetDirCosZ() << endl
01524     << "  EndPln = " << track.GetEndPlane() << endl
01525     << "  EndPlnDigits = " << track.GetEndPlaneDigits() << endl
01526     << "  EndU = " << track.GetEndU() << endl
01527     << "  EndV = " << track.GetEndV() << endl
01528     << "  EndZ = " << track.GetEndZ() << endl
01529     << "  EndT = " << track.GetEndT() << endl
01530     << "  EndR = " << track.GetEndR() << endl
01531     << "  EndTrace = " << track.GetEndTrace() << endl
01532     << "  EndTraceZ = " << track.GetEndTraceZ() << endl
01533     << "  EndRdigits = " << track.GetEndRdigits() << endl
01534     << "  EndUwidth = " << track.GetEndUwidth() << endl
01535     << "  EndUmean = " << track.GetEndUmean() << endl
01536     << "  EndVwidth = " << track.GetEndVwidth() << endl
01537     << "  EndVmean = " << track.GetEndVmean() << endl
01538     << "  EndRmax = " << track.GetEndRmax() << endl
01539     << "  EndQmax = " << track.GetEndQmax() << endl
01540     << "  EndDirCosU = " << track.GetEndDirCosU() << endl
01541     << "  EndDirCosV = " << track.GetEndDirCosV() << endl
01542     << "  EndDirCosZ = " << track.GetEndDirCosZ() << endl 
01543     << "  MinPlane = " << track.GetMinPlane() << endl
01544     << "  MaxPlane = " << track.GetMaxPlane() << endl
01545     << "  NPlanes = " << track.GetNPlanes() << endl
01546     << "  NStrips = " << track.GetNStrips() << endl
01547     << "  TrkPlanes = " << track.GetTrkPlanes() << endl
01548     << "  TrkPH = " << track.GetTrkPH() << endl
01549     << "  ShwPH = " << track.GetShwPH() << endl
01550     << "  AssocPH = " << track.GetAssocTrkPH() << endl
01551     << "  AssocPHfrac = " << track.GetAssocTrkPHfrac() << endl
01552     << "  TimeSlope = " << track.GetTimeSlope() << endl
01553     << "  TimeOffset = " << track.GetTimeOffset() << endl
01554     << "  DirTimeSlope = " << track.GetDirTimeSlope() << endl
01555     << "  DirTimeOffset = " << track.GetDirTimeOffset() << endl
01556     << "  DirTimeScatter = " << track.GetDirTimeScatter() << endl
01557     << "  DirTimeScore = " << track.GetDirTimeScore()<< endl
01558     << "  VtxDirTimeFitRms = " << track.GetVtxDirTimeFitChisq() << endl
01559     << "  EndDirTimeFitRms = " << track.GetEndDirTimeFitChisq() << endl
01560     << "  VtxDirTimeFitNdf = " << track.GetVtxDirTimeFitNdf() << endl
01561     << "  EndDirTimeFitNdf = " << track.GetEndDirTimeFitNdf() << endl
01562     << "  VtxShw = " << track.GetVtxShw() << endl
01563     << "  VtxShwStrips = " << track.GetVtxShwStrips() << endl
01564     << "  VtxShwReseedFlag = " << track.GetVtxShwReseedFlag() << endl 
01565     << "  EndShw = " << track.GetEndShw() << endl
01566     << "  EndShwStrips = " << track.GetEndShwStrips() << endl
01567     << "  EndShwReseedFlag = " << track.GetEndShwReseedFlag() << endl
01568     << "  LinearDirCosU = " << track.GetLinearDirCosU() << endl
01569     << "  LinearDirCosV = " << track.GetLinearDirCosV() << endl
01570     << "  LinearDirCosZ = " << track.GetLinearDirCosZ() << endl
01571     << "  LinearDirFitChisq = " << track.GetLinearDirFitChisq() << endl
01572     << "  LinearDirFitNdf = " << track.GetLinearDirFitNdf() << endl
01573     << "  RangeThruSteel = " << track.GetRangeThruSteel() << endl
01574     << "  Momentum = " << track.GetMomentum() << endl
01575     << "  MomentumErr = " << track.GetMomentumErr() << endl
01576     << "  ReseedFlag = " << track.GetReseedFlag() << endl;
01577     
01578 
01579   for(i=0;i<npln;i++){
01580     fHitArr[i].Clear();
01581   }
01582 
01583   delete [] U;
01584   delete [] V;
01585   delete [] Z;
01586   delete [] Q;
01587   delete [] dS;
01588   delete [] dSsteel;
01589   delete [] Qm;
01590   delete [] Qp;
01591   delete [] CTm;
01592   delete [] CTp;
01593   delete [] Wm;
01594   delete [] Wp;
01595   delete [] plnvuw;
01596   delete [] plnnum;
01597 
01598   return;
01599   
01600 }

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

Reimplemented from AlgBase.

Definition at line 1602 of file AlgTrackAtNu.cxx.

01603 {
01604 
01605 }


Member Data Documentation

TObjArray AlgTrackAtNu::fHitArr[500] [private]
 

Definition at line 17 of file AlgTrackAtNu.h.

Referenced by RunAlg().

TObjArray AlgTrackAtNu::fSliceStrpArr[500] [private]
 

Definition at line 18 of file AlgTrackAtNu.h.

Referenced by RunAlg().

TObjArray AlgTrackAtNu::fTrackStrpArr[500] [private]
 

Definition at line 19 of file AlgTrackAtNu.h.

Referenced by RunAlg().


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