#include <AlgTrackAtNu.h>
Inheritance diagram for AlgTrackAtNu:

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] |
|
|
Definition at line 36 of file AlgTrackAtNu.cxx. 00037 {
00038
00039 }
|
|
|
Definition at line 41 of file AlgTrackAtNu.cxx. 00042 {
00043
00044 }
|
|
||||||||||||||||
|
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 }
|
|
|
Reimplemented from AlgBase. Definition at line 1602 of file AlgTrackAtNu.cxx. 01603 {
01604
01605 }
|
|
|
Definition at line 17 of file AlgTrackAtNu.h. Referenced by RunAlg(). |
|
|
Definition at line 18 of file AlgTrackAtNu.h. Referenced by RunAlg(). |
|
|
Definition at line 19 of file AlgTrackAtNu.h. Referenced by RunAlg(). |
1.3.9.1