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

Public Member Functions | |
| AlgAtNuReco () | |
| ~AlgAtNuReco () | |
| void | RunAlg (AlgConfig &ac, CandHandle &ch, CandContext &cx) |
| void | Trace (const char *c) const |
Private Attributes | |
| TObjArray | hitplnbnk [500] |
| TObjArray | xtalkplnbnk [500] |
| TObjArray | clrplnbnk [500] |
| TObjArray | segplnbnk [500] |
| TObjArray | hitbnk |
| TObjArray | clrbnk |
| TObjArray | trksegbnk |
| TObjArray | shwsegbnk |
| TObjArray | trkbnk [2] |
| TObjArray | shwbnk [2] |
| TObjArray | trkcxt |
| TObjArray | shwcxt |
|
|
Definition at line 49 of file AlgAtNuReco.cxx. 00050 {
00051
00052 }
|
|
|
Definition at line 54 of file AlgAtNuReco.cxx. 00055 {
00056
00057 }
|
|
||||||||||||||||
|
Implements AlgBase. Definition at line 59 of file AlgAtNuReco.cxx. References ShowerAtNu::AddAssocTrack(), TrackSegmentAtNu::AddAssocTriToBeg(), TrackSegmentAtNu::AddAssocTriToEnd(), ShowerSegmentAtNu::AddCluster(), CandHandle::AddDaughterLink(), ShowerAtNu::AddHit(), TrackAtNu::AddHit(), ClusterAtNu::AddHit(), ShowerSegmentAtNu::AddSegment(), TrackSegmentAtNu::AddSegment(), TrackSegmentAtNu::AddSegToBeg(), TrackSegmentAtNu::AddSegToEnd(), CandAtNuRecoHandle::AddShower(), CandAtNuRecoHandle::AddTrack(), TrackSegmentAtNu::AddTriToBeg(), TrackSegmentAtNu::AddTriToEnd(), clrbnk, clrplnbnk, ShowerSegmentAtNu::ContainsClr(), AlgFactory::GetAlgHandle(), TrackSegmentAtNu::GetAssocTriBegAt(), TrackSegmentAtNu::GetAssocTriBegLast(), TrackSegmentAtNu::GetAssocTriEndLast(), ObjShowerAtNu::GetBegPlane(), ObjTrackAtNu::GetBegPlane(), ObjShowerAtNu::GetBegStrip(), ObjTrackAtNu::GetBegStrip(), ClusterAtNu::GetBegStrip(), ObjShowerAtNu::GetBegTime(), ObjTrackAtNu::GetBegTime(), CandContext::GetCandRecord(), HitAtNu::GetCharge(), ClusterAtNu::GetCharge(), CandStripHandle::GetCharge(), Registry::GetCharString(), ShowerSegmentAtNu::GetClrAt(), TrackSegmentAtNu::GetClrAt(), ShowerSegmentAtNu::GetClrLast(), TrackSegmentAtNu::GetClrLast(), CandContext::GetDataIn(), CandHandle::GetDaughterIterator(), CandDeMuxDigitHandle::GetDeMuxDigitFlagWord(), VldContext::GetDetector(), HitAtNu::GetDigits(), ClusterAtNu::GetDigits(), Registry::GetDouble(), ObjTrackAtNu::GetEndDir(), ObjShowerAtNu::GetEndPlane(), ObjTrackAtNu::GetEndPlane(), ObjShowerAtNu::GetEndStrip(), ObjTrackAtNu::GetEndStrip(), ClusterAtNu::GetEndStrip(), ObjShowerAtNu::GetEndTime(), ObjTrackAtNu::GetEndTime(), ObjAtNu::GetHitAt(), ObjAtNu::GetHitLast(), AlgFactory::GetInstance(), Registry::GetInt(), CandContext::GetMom(), CandHandle::GetName(), CandHandle::GetNDaughters(), TrackSegmentAtNu::GetNPlanes(), ObjShowerAtNu::GetPartner(), ObjTrackAtNu::GetPartner(), ClusterAtNu::GetPlane(), HitAtNu::GetPlane(), CandStripHandle::GetPlane(), HitAtNu::GetPlaneView(), ObjAtNu::GetPlaneView(), ObjShowerAtNu::GetReseedFlag(), ObjTrackAtNu::GetReseedFlag(), ShowerSegmentAtNu::GetScore(), TrackSegmentAtNu::GetScore(), TrackSegmentAtNu::GetSegBegAt(), TrackSegmentAtNu::GetSegBegLast(), TrackSegmentAtNu::GetSegEndAt(), TrackSegmentAtNu::GetSegEndLast(), TrackSegmentAtNu::GetSegment(), HitAtNu::GetShwFlag(), ClusterAtNu::GetShwFlag(), ClusterAtNu::GetShwPlnFlag(), HitAtNu::GetStrip(), HitAtNu::GetTime(), TrackSegmentAtNu::GetTmpTrkFlag(), TrackSegmentAtNu::GetTriBegAt(), TrackSegmentAtNu::GetTriBegLast(), TrackSegmentAtNu::GetTriEndAt(), TrackSegmentAtNu::GetTriEndLast(), HitAtNu::GetTrkFlag(), TrackSegmentAtNu::GetTrkFlag(), ClusterAtNu::GetTrkFlag(), ClusterAtNu::GetTrkPlnFlag(), ObjAtNu::GetUID(), HitAtNu::GetUID(), CandHandle::GetVldContext(), ClusterAtNu::GetZPos(), HitAtNu::GetZPos(), hitbnk, hitplnbnk, TrackSegmentAtNu::IsBegAssoc(), HitAtNu::IsDiffuseShwAssoc(), ShowerAtNu::IsDiffuseShwAssoc(), ShowerSegmentAtNu::IsDiffuseShwAssoc(), TrackSegmentAtNu::IsEndAssoc(), ClusterAtNu::IsHitAssoc(), HitAtNu::IsShwAssoc(), ShowerSegmentAtNu::IsShwAssoc(), ClusterAtNu::IsShwAssoc(), ClusterAtNu::IsTrkAssoc(), CandShowerAtNuList::MakeCandidate(), CandTrackAtNuList::MakeCandidate(), MSG, CandRecord::SecureCandHandle(), segplnbnk, CandAtNuRecoHandle::SetAtNuRecoScore(), ShowerAtNu::SetBegVtxFlag(), TrackAtNu::SetBegVtxShower(), ClusterAtNu::SetClrPlnFlag(), CandAtNuRecoHandle::SetCPUTime(), CandShowerAtNuListHandle::SetCPUTime(), CandTrackAtNuListHandle::SetCPUTime(), ShowerAtNu::SetEndVtxFlag(), TrackAtNu::SetEndVtxShower(), CandHandle::SetName(), CandAtNuRecoHandle::SetNBlocks(), TrackSegmentAtNu::SetNPlanes(), ObjShowerAtNu::SetPartner(), ObjTrackAtNu::SetPartner(), ObjShowerAtNu::SetReseedFlag(), ObjTrackAtNu::SetReseedFlag(), TrackSegmentAtNu::SetSegment(), HitAtNu::SetShwFlag(), ClusterAtNu::SetShwFlag(), ClusterAtNu::SetShwPlnFlag(), CandHandle::SetTitle(), TrackSegmentAtNu::SetTmpTrkFlag(), HitAtNu::SetTrkFlag(), TrackSegmentAtNu::SetTrkFlag(), ClusterAtNu::SetTrkFlag(), ClusterAtNu::SetTrkPlnFlag(), ObjAtNu::SetUID(), HitAtNu::SetUID(), HitAtNu::SetXtalkFlag(), shwbnk, shwcxt, shwsegbnk, trkbnk, trkcxt, trksegbnk, and xtalkplnbnk. 00060 {
00061
00062 MSG("AlgAtNuReco", Msg::kDebug) << "AlgAtNuReco::RunAlg(...)" << endl;
00063
00064 // Get CandAtNuRecoHandle
00065 CandAtNuRecoHandle& atnu_handle = dynamic_cast<CandAtNuRecoHandle&>(ch);
00066
00067 // Unpack AlgConfig
00068 Double_t fPeCut,fTimeWin;
00069 Int_t fVtxFlag,fObjMax,fObjMaxFlag;
00070 TString fListOutTrk,fListOutShw;
00071 Int_t NEWOBJCTR,DELOBJCTR;
00072
00073 fListOutTrk = ac.GetCharString("ListOutTrk");
00074 fListOutShw = ac.GetCharString("ListOutShw");
00075 fPeCut = ac.GetDouble("PeCut");
00076 fVtxFlag = ac.GetInt("VtxFlag");
00077 fTimeWin=100.0;
00078 fObjMax=100000;
00079 NEWOBJCTR=0; DELOBJCTR=0;
00080
00081 // Unpack CandContext
00082 CandSliceListHandle* slice_list = (CandSliceListHandle*)(cx.GetDataIn());
00083
00084 // Switch on detector type
00085 Int_t itr;
00086 Int_t modtype,modnum,modpln,modstr;
00087 Int_t fEndPln,fEndStr;
00088 switch(slice_list->GetVldContext()->GetDetector()){
00089 case DetectorType::kFar:
00090 modtype=1; modnum=2; modpln=248; modstr=192; break;
00091 case DetectorType::kNear:
00092 modtype=2; modnum=1; modpln=282; modstr=96; break;
00093 case DetectorType::kCalib:
00094 modtype=3; modnum=1; modpln=60; modstr=24; break;
00095 default:
00096 modtype=-1; modnum=0; modpln=0; break;
00097 }
00098 fEndPln = modnum*(modpln+1); fEndStr = modstr;
00099
00100 MSG("AlgAtNuReco", Msg::kDebug)
00101 << " *** PeCut=" << fPeCut << " VtxFlag=" << fVtxFlag << endl;
00102
00103 MSG("AlgAtNuReco", Msg::kDebug)
00104 << " *** ModType=" << modtype << " ModNum=" << modnum << " "
00105 << " ModPln=" << modpln << " ModStr=" << modstr << endl;
00106
00107 MSG("AlgAtNuReco", Msg::kDebug)
00108 << " *** EndPln=" << fEndPln << " fEndStr=" << fEndStr << endl;
00109
00110
00111 // Clear timebanks
00112 Double_t dtime;
00113 Double_t fTime_TrackAtNu,fTime_ShowerAtNu,fTime_AtNuReco;
00114 fTime_TrackAtNu=0.0; fTime_ShowerAtNu=0.0; fTime_AtNuReco=0.0;
00115
00116 struct timeval tpbefore;
00117 struct timeval tpafter;
00118
00119 struct timeval atnubefore;
00120 struct timeval atnuafter;
00121
00122 gettimeofday(&atnubefore,0);
00123
00124 // Look for tracks and showers
00125 TIter sliceitr(slice_list->GetDaughterIterator());
00126 while(CandSliceHandle* slice = dynamic_cast<CandSliceHandle*>(sliceitr())){
00127 atnu_handle.AddDaughterLink(*slice);
00128 fObjMaxFlag=0;
00129
00130 MSG("AlgAtNuReco", Msg::kDebug)
00131 << " *** SLICE (" << atnu_handle.GetNDaughters() << ") strips= " << slice->GetNDaughters() << endl;
00132
00133
00134 // *************************************
00135 // * F O R M A T I O N O F H I T S *
00136 // *************************************
00137
00138 gettimeofday(&tpbefore,0);
00139
00140 // Sort strips into hit banks
00141 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of hits *** " << endl;
00142 Int_t i,j,k,l;
00143 Bool_t cont;
00144 Double_t chg,scr;
00145 Int_t id,pln,npln,mod,vuw,ctr,xtalk,assoc;
00146 Int_t Nrealhits=0,Nxtalkhits=0;
00147 TObjArray tmp;
00148 TIter stritr(slice->GetDaughterIterator());
00149 while(CandStripHandle* strip = dynamic_cast<CandStripHandle*>(stritr())){
00150 pln=strip->GetPlane(); chg=strip->GetCharge(); xtalk=0;
00151 if(pln>0 && pln<fEndPln && pln<500){
00152 TIter digitr(strip->GetDaughterIterator());
00153 while(CandDeMuxDigitHandle* digit = (CandDeMuxDigitHandle*)(digitr())){
00154 if( ( digit->GetDeMuxDigitFlagWord()<8 )
00155 && (digit->GetDeMuxDigitFlagWord() & CandDeMuxDigit::kXTalk)==(CandDeMuxDigit::kXTalk) ){
00156 xtalk=1;
00157 }
00158 }
00159 HitAtNu* hit = new HitAtNu(strip); hitbnk.Add(hit); NEWOBJCTR++;
00160 if(!xtalk && chg>fPeCut){ hitplnbnk[pln].Add(hit); Nrealhits++; }
00161 else{ hit->SetXtalkFlag(1); xtalkplnbnk[pln].Add(hit); Nxtalkhits++; }
00162 }
00163 atnu_handle.AddDaughterLink(*strip);
00164 }
00165 MSG("AlgAtNuReco", Msg::kDebug) << " *** real hits = " << Nrealhits << " xtalk hits = " << Nxtalkhits << endl;
00166
00167
00168 // ***************************************************
00169 // * F O R M A T I O N O F 1 D C L U S T E R S *
00170 // ***************************************************
00171
00172 // Form clusters
00173 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of clusters *** " << endl;
00174 for(i=1;i<fEndPln;i++){
00175 for(j=0;j<1+hitplnbnk[i].GetLast();j++){
00176 HitAtNu* hitj = (HitAtNu*)(hitplnbnk[i].At(j));
00177 if(hitj->GetUID()==0){
00178 ClusterAtNu* clr = new ClusterAtNu(hitj); NEWOBJCTR++;
00179 clrplnbnk[i].Add(clr); clrbnk.Add(clr);
00180 hitj->SetUID(1); ctr=1;
00181 while(ctr>0){
00182 ctr=0;
00183 for(k=0;k<1+hitplnbnk[i].GetLast();k++){
00184 HitAtNu* hitk = (HitAtNu*)(hitplnbnk[i].At(k));
00185 if(hitk->GetUID()==0 && clr->IsHitAssoc(hitk)){
00186 clr->AddHit(hitk); hitk->SetUID(1); ctr++;
00187 }
00188 }
00189 }
00190 }
00191 }
00192 }
00193
00194 // Identify track+shower clusters
00195 Int_t k0,k1,k2;
00196 Int_t nhits0,nhits1,nclrs0,nclrs1;
00197 TObjArray tmp0,tmp1,tmp2;
00198
00199 for(mod=0;mod<modnum;mod++){
00200 for(pln=0;pln<modpln+1;pln++){
00201 i=pln+mod*(modpln+1);
00202 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
00203 ClusterAtNu* clr0 = (ClusterAtNu*)(clrplnbnk[i].At(j));
00204 if( clr0->GetCharge()>2.0 || clr0->GetDigits()>1.0 ){
00205 clr0->SetTrkFlag(1);
00206 }
00207 }
00208 }
00209 }
00210
00211 for(mod=0;mod<modnum;mod++){
00212 for(pln=1;pln<1+modpln;pln++){
00213 i=pln+mod*(modpln+1);
00214 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
00215 ClusterAtNu* clr0 = (ClusterAtNu*)(clrplnbnk[i].At(j));
00216 nhits0=0; nhits1=0; nclrs0=0; nclrs1=0;
00217 tmp0.Clear(); tmp1.Clear();
00218 for(k=-1;k<2;k++){
00219 k0=i+2*k;
00220 if(k0>mod*(modpln+1) && k0<(mod+1)*(modpln+1)){
00221 for(k1=0;k1<1+clrplnbnk[k0].GetLast();k1++){
00222 ClusterAtNu* clr1 = (ClusterAtNu*)(clrplnbnk[k0].At(k1));
00223 if(clr0->GetCharge()>1.0 && clr1->GetCharge()>1.0){
00224 assoc=clr0->IsShwAssoc(clr1);
00225 if(assoc>0){ nhits0+=1+clr1->GetHitLast(); nclrs0+=1; tmp0.Add(clr1); }
00226 if(assoc>1){ nhits1+=1+clr1->GetHitLast(); nclrs1+=1; tmp1.Add(clr1); }
00227 }
00228 }
00229 }
00230 }
00231 if(nclrs1>1 && nhits1>4){
00232 for(k=0;k<1+tmp1.GetLast();k++){
00233 ClusterAtNu* clrtmp = (ClusterAtNu*)(tmp1.At(k));
00234 clrtmp->SetShwFlag(1);
00235 }
00236 }
00237 if(nclrs0>4 && nhits0>5){
00238 for(k=0;k<1+tmp0.GetLast();k++){
00239 ClusterAtNu* clrtmp = (ClusterAtNu*)(tmp0.At(k));
00240 clrtmp->SetShwFlag(1);
00241 }
00242 }
00243 if(clr0->GetShwFlag()<1 && clr0->GetCharge()>50.0){
00244 clr0->SetShwFlag(1);
00245 }
00246 }
00247 }
00248 }
00249
00250 // Identify track+shower planes
00251 for(mod=0;mod<modnum;mod++){
00252 for(pln=0;pln<modpln+1;pln++){
00253 i=pln+mod*(modpln+1); chg=0.0;
00254 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
00255 ClusterAtNu* clr0 = (ClusterAtNu*)(clrplnbnk[i].At(j));
00256 chg+=clr0->GetCharge();
00257 }
00258 if(chg>0.0){
00259 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
00260 ClusterAtNu* clr1 = (ClusterAtNu*)(clrplnbnk[i].At(j));
00261 if(1+clr1->GetHitLast()<3 && clr1->GetCharge()/chg>0.5) clr1->SetTrkPlnFlag(1);
00262 if(1+clr1->GetHitLast()>1 && clr1->GetCharge()/chg>0.5) clr1->SetShwPlnFlag(1);
00263 if(clr1->GetCharge()/chg>0.5) clr1->SetClrPlnFlag(1);
00264 }
00265 }
00266 }
00267 }
00268
00269 // Print out list of hits + 1D clusters
00270 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF HITS/CLUSTERS *** " << endl;
00271 for(i=0;i<fEndPln;i++){
00272 for(j=0;j<1+hitplnbnk[i].GetLast();j++){
00273 HitAtNu* hit = (HitAtNu*)(hitplnbnk[i].At(j));
00274 MSG("AlgAtNuReco", Msg::kVerbose)
00275 << " HIT:"
00276 << " pln=" << hit->GetPlane()
00277 << " strp=" << hit->GetStrip()
00278 << " chg=" << hit->GetCharge()
00279 << " time=" << hit->GetTime()
00280 << " dig=" << hit->GetDigits() << endl;
00281 }
00282 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
00283 ClusterAtNu* clr = (ClusterAtNu*)(clrplnbnk[i].At(j));
00284 MSG("AlgAtNuReco", Msg::kVerbose)
00285 << " CLUSTER:"
00286 << " plane=" << clr->GetPlane()
00287 << " begstrip=" << clr->GetBegStrip()
00288 << " endstrip=" << clr->GetEndStrip()
00289 << " trkpln=" << clr->GetTrkPlnFlag()
00290 << " shwpln=" << clr->GetShwPlnFlag() << endl;
00291 }
00292 }
00293
00294 gettimeofday(&tpafter,0);
00295 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
00296 fTime_TrackAtNu+=0.5*dtime;
00297 fTime_ShowerAtNu+=0.5*dtime;
00298
00299
00300 // *********************************************
00301 // * F O R M A T I O N O F T R I P L E T S *
00302 // *********************************************
00303
00304 gettimeofday(&tpbefore,0);
00305
00306 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of triplets *** " << endl;
00307
00308 // Form triplets
00309 Int_t jnflag,jnflagtmp;
00310 Int_t km,kp,ktmp,ktmp1;
00311 for(mod=0;mod<modnum;mod++){
00312 for(pln=2;pln<modpln-1;pln++){
00313 i=pln+mod*(modpln+1);
00314 for(k0=0;k0<1+clrplnbnk[i].GetLast();k0++){
00315 ClusterAtNu* clr0 = (ClusterAtNu*)(clrplnbnk[i].At(k0));
00316 if(clr0->GetTrkFlag()>0){
00317 jnflag=0;
00318
00319 // look for triplets of form m 0 p
00320 if( 1+clrplnbnk[i-2].GetLast()>0 && 1+clrplnbnk[i+2].GetLast()>0 ){
00321 for(km=0;km<1+clrplnbnk[i-2].GetLast();km++){
00322 ClusterAtNu* clrm = (ClusterAtNu*)(clrplnbnk[i-2].At(km));
00323 for(kp=0;kp<1+clrplnbnk[i+2].GetLast();kp++){
00324 ClusterAtNu* clrp = (ClusterAtNu*)(clrplnbnk[i+2].At(kp));
00325 if(clrm->GetTrkFlag()>0 && clrp->GetTrkFlag()>0){
00326 assoc=clr0->IsTrkAssoc(clrm,clrp);
00327 if(assoc>0){
00328 TrackSegmentAtNu* seg0 = new TrackSegmentAtNu(clrm,clr0,clrp); NEWOBJCTR++;
00329 segplnbnk[i].Add(seg0); trksegbnk.Add(seg0); jnflag=1;
00330 if(assoc>1){
00331 clr0->SetTrkFlag(2);
00332 }
00333 }
00334 }
00335 }
00336 }
00337 }
00338
00339 // look for triplets of form m <-> 0 p
00340 if( 1+clrplnbnk[i+2].GetLast()>0 ){
00341
00342 // look for triplets of form m X 0 p
00343 if( pln>3 && 1+clrplnbnk[i-4].GetLast()>0 ){
00344 for(kp=0;kp<1+clrplnbnk[i+2].GetLast();kp++){
00345 ClusterAtNu* clrp = (ClusterAtNu*)(clrplnbnk[i+2].At(kp));
00346 for(km=0;km<1+clrplnbnk[i-4].GetLast();km++){
00347 ClusterAtNu* clrm = (ClusterAtNu*)(clrplnbnk[i-4].At(km));
00348 if(clrm->GetTrkFlag()>0 && clrp->GetTrkFlag()>0){
00349 assoc = clr0->IsTrkAssoc(clrm,clrp);
00350 if(assoc>0){
00351 jnflagtmp=0;
00352 if(jnflagtmp==0 && 1+clrplnbnk[i-2].GetLast()>0){
00353 for(ktmp=0;ktmp<1+clrplnbnk[i-2].GetLast();ktmp++){
00354 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i-2].At(ktmp));
00355 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00356 && clrtmp->IsTrkAssoc(clrm,clr0)>0 && clr0->IsTrkAssoc(clrtmp,clrp)>0 ) jnflagtmp=1;
00357 }
00358 }
00359 if(jnflagtmp==0){
00360 for(j=0;j<1;j++){
00361 TrackSegmentAtNu* seg0 = new TrackSegmentAtNu(clrm,clr0,clrp); NEWOBJCTR++;
00362 segplnbnk[i-2*j].Add(seg0); trksegbnk.Add(seg0); jnflag=1;
00363 }
00364 if(assoc>1){
00365 clr0->SetTrkFlag(2);
00366 }
00367 }
00368 }
00369 }
00370 }
00371 }
00372 }
00373
00374 // look for triplets of form m X X 0 p
00375 if( pln>5 && 1+clrplnbnk[i-6].GetLast()>0 ){
00376 for(kp=0;kp<1+clrplnbnk[i+2].GetLast();kp++){
00377 ClusterAtNu* clrp = (ClusterAtNu*)(clrplnbnk[i+2].At(kp));
00378 for(km=0;km<1+clrplnbnk[i-6].GetLast();km++){
00379 ClusterAtNu* clrm = (ClusterAtNu*)(clrplnbnk[i-6].At(km));
00380 if(clrm->GetTrkFlag()>0 && clrp->GetTrkFlag()>0){
00381 assoc = clr0->IsTrkAssoc(clrm,clrp);
00382 if(assoc>0){
00383 jnflagtmp=0;
00384 if(jnflagtmp==0 && 1+clrplnbnk[i-2].GetLast()>0){
00385 for(ktmp=0;ktmp<1+clrplnbnk[i-2].GetLast();ktmp++){
00386 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i-2].At(ktmp));
00387 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00388 && clrtmp->IsTrkAssoc(clrm,clr0)>0 && clr0->IsTrkAssoc(clrtmp,clrp)>0 ) jnflagtmp=1;
00389 }
00390 }
00391 if(jnflagtmp==0 && 1+clrplnbnk[i-4].GetLast()>0){
00392 for(ktmp=0;ktmp<1+clrplnbnk[i-4].GetLast();ktmp++){
00393 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i-4].At(ktmp));
00394 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00395 && clrtmp->IsTrkAssoc(clrm,clr0)>0 && clr0->IsTrkAssoc(clrtmp,clrp)>0 ) jnflagtmp=1;
00396 }
00397 }
00398 if(jnflagtmp==0 && 1+clrplnbnk[i-4].GetLast()>0 && 1+clrplnbnk[i-2].GetLast()>0){
00399 for(ktmp=0;ktmp<1+clrplnbnk[i-4].GetLast();ktmp++){
00400 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i-4].At(ktmp));
00401 for(ktmp1=0;ktmp1<1+clrplnbnk[i-2].GetLast();ktmp1++){
00402 ClusterAtNu* clrtmp1 = (ClusterAtNu*)(clrplnbnk[i-2].At(ktmp1));
00403 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0 && clrtmp1->GetTrkFlag()>0
00404 && clrtmp->IsTrkAssoc(clrm,clrtmp1)>0 && clrtmp1->IsTrkAssoc(clrtmp,clr0)>0
00405 && clr0->IsTrkAssoc(clrtmp1,clrp)>0 ) jnflagtmp=1;
00406 }
00407 }
00408 }
00409 if(jnflagtmp==0){
00410 for(j=0;j<1;j++){
00411 TrackSegmentAtNu* seg0 = new TrackSegmentAtNu(clrm,clr0,clrp); NEWOBJCTR++;
00412 segplnbnk[i-2*j].Add(seg0); trksegbnk.Add(seg0); jnflag=1;
00413 }
00414 if(assoc>1){
00415 clr0->SetTrkFlag(2);
00416 }
00417 }
00418 }
00419 }
00420 }
00421 }
00422 }
00423 }
00424
00425 // look for triplets of form m 0 <-> p
00426 if( 1+clrplnbnk[i-2].GetLast()>0 ){
00427
00428 // look for triplets of form m 0 X p
00429 if( pln<modpln-3 && 1+clrplnbnk[i+4].GetLast()>0 ){
00430 for(km=0;km<1+clrplnbnk[i-2].GetLast();km++){
00431 ClusterAtNu* clrm = (ClusterAtNu*)(clrplnbnk[i-2].At(km));
00432 for(kp=0;kp<1+clrplnbnk[i+4].GetLast();kp++){
00433 ClusterAtNu* clrp = (ClusterAtNu*)(clrplnbnk[i+4].At(kp));
00434 if(clrm->GetTrkFlag()>0 && clrp->GetTrkFlag()>0){
00435 assoc = clr0->IsTrkAssoc(clrm,clrp);
00436 if(assoc>0){
00437 jnflagtmp=0;
00438 if(jnflagtmp==0 && 1+clrplnbnk[i+2].GetLast()>0){
00439 for(ktmp=0;ktmp<1+clrplnbnk[i+2].GetLast();ktmp++){
00440 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i+2].At(ktmp));
00441 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00442 && clrtmp->IsTrkAssoc(clr0,clrp)>0 && clr0->IsTrkAssoc(clrm,clrtmp)>0 ) jnflagtmp=1;
00443 }
00444 }
00445 if(jnflagtmp==0){
00446 for(j=0;j<2;j++){
00447 TrackSegmentAtNu* seg0 = new TrackSegmentAtNu(clrm,clr0,clrp); NEWOBJCTR++;
00448 segplnbnk[i+2*j].Add(seg0); trksegbnk.Add(seg0); jnflag=1;
00449 }
00450 if(assoc>1){
00451 clr0->SetTrkFlag(2);
00452 }
00453 }
00454 }
00455 }
00456 }
00457 }
00458 }
00459
00460 // look for triplets of form m 0 X X p
00461 if( pln<modpln-5 && 1+clrplnbnk[i+6].GetLast()>0 ){
00462 for(km=0;km<1+clrplnbnk[i-2].GetLast();km++){
00463 ClusterAtNu* clrm = (ClusterAtNu*)(clrplnbnk[i-2].At(km));
00464 for(kp=0;kp<1+clrplnbnk[i+6].GetLast();kp++){
00465 ClusterAtNu* clrp = (ClusterAtNu*)(clrplnbnk[i+6].At(kp));
00466 if(clrm->GetTrkFlag()>0 && clrp->GetTrkFlag()>0){
00467 assoc = clr0->IsTrkAssoc(clrm,clrp);
00468 if(assoc>0){
00469 jnflagtmp=0;
00470 if(jnflagtmp==0 && 1+clrplnbnk[i+2].GetLast()>0){
00471 for(ktmp=0;ktmp<1+clrplnbnk[i+2].GetLast();ktmp++){
00472 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i+2].At(ktmp));
00473 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00474 && clrtmp->IsTrkAssoc(clr0,clrp)>0 && clr0->IsTrkAssoc(clrm,clrtmp)>0 ) jnflagtmp=1;
00475 }
00476 }
00477 if(jnflagtmp==0 && 1+clrplnbnk[i+4].GetLast()>0){
00478 for(ktmp=0;ktmp<1+clrplnbnk[i+4].GetLast();ktmp++){
00479 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i+4].At(ktmp));
00480 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00481 && clrtmp->IsTrkAssoc(clr0,clrp)>0 && clr0->IsTrkAssoc(clrm,clrtmp)>0 ) jnflagtmp=1;
00482 }
00483 }
00484 if(jnflagtmp==0 && 1+clrplnbnk[i+2].GetLast()>0 && 1+clrplnbnk[i+4].GetLast()>0){
00485 for(ktmp=0;ktmp<1+clrplnbnk[i+2].GetLast();ktmp++){
00486 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i+2].At(ktmp));
00487 for(ktmp1=0;ktmp1<1+clrplnbnk[i+4].GetLast();ktmp1++){
00488 ClusterAtNu* clrtmp1 = (ClusterAtNu*)(clrplnbnk[i+4].At(ktmp1));
00489 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0 && clrtmp1->GetTrkFlag()>0
00490 && clr0->IsTrkAssoc(clrm,clrtmp)>0 && clrtmp->IsTrkAssoc(clr0,clrtmp1)>0
00491 && clrtmp1->IsTrkAssoc(clrtmp,clrp) ) jnflagtmp=1;
00492 }
00493 }
00494 }
00495 if(jnflagtmp==0){
00496 for(j=0;j<3;j++){
00497 TrackSegmentAtNu* seg0 = new TrackSegmentAtNu(clrm,clr0,clrp); NEWOBJCTR++;
00498 segplnbnk[i+2*j].Add(seg0); trksegbnk.Add(seg0); jnflag=1;
00499 }
00500 if(assoc>1){
00501 clr0->SetTrkFlag(2);
00502 }
00503 }
00504 }
00505 }
00506 }
00507 }
00508 }
00509 }
00510
00511 // look for triplets of form m X 0 X p
00512 if( pln>3 && 1+clrplnbnk[i-4].GetLast()>0
00513 && pln<modpln-3 && 1+clrplnbnk[i+4].GetLast()>0 ){
00514 for(km=0;km<1+clrplnbnk[i-4].GetLast();km++){
00515 ClusterAtNu* clrm = (ClusterAtNu*)(clrplnbnk[i-4].At(km));
00516 for(kp=0;kp<1+clrplnbnk[i+4].GetLast();kp++){
00517 ClusterAtNu* clrp = (ClusterAtNu*)(clrplnbnk[i+4].At(kp));
00518 if(clrm->GetTrkFlag()>0 && clrp->GetTrkFlag()>0){
00519 assoc=clr0->IsTrkAssoc(clrm,clrp);
00520 if(assoc>0){
00521 jnflagtmp=0;
00522 if(jnflagtmp==0 && 1+clrplnbnk[i-2].GetLast()>0){
00523 for(ktmp=0;ktmp<1+clrplnbnk[i-2].GetLast();ktmp++){
00524 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i-2].At(ktmp));
00525 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00526 && clrtmp->IsTrkAssoc(clrm,clr0)>0 && clr0->IsTrkAssoc(clrtmp,clrp)>0 ) jnflagtmp=1;
00527 }
00528 }
00529 if(jnflagtmp==0 && 1+clrplnbnk[i+2].GetLast()>0){
00530 for(ktmp=0;ktmp<1+clrplnbnk[i+2].GetLast();ktmp++){
00531 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i+2].At(ktmp));
00532 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0
00533 && clrtmp->IsTrkAssoc(clr0,clrp)>0 && clr0->IsTrkAssoc(clrm,clrtmp)>0 ) jnflagtmp=1;
00534 }
00535 }
00536 if(jnflagtmp==0 && 1+clrplnbnk[i-2].GetLast()>0 && 1+clrplnbnk[i+2].GetLast()>0){
00537 for(ktmp=0;ktmp<1+clrplnbnk[i-2].GetLast();ktmp++){
00538 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrplnbnk[i-2].At(ktmp));
00539 for(ktmp1=0;ktmp1<1+clrplnbnk[i+2].GetLast();ktmp1++){
00540 ClusterAtNu* clrtmp1 = (ClusterAtNu*)(clrplnbnk[i+2].At(ktmp1));
00541 if( jnflagtmp==0 && clrtmp->GetTrkFlag()>0 && clrtmp1->GetTrkFlag()>0
00542 && clrtmp->IsTrkAssoc(clrm,clr0)>0 && clr0->IsTrkAssoc(clrtmp,clrtmp1)>0
00543 && clrtmp1->IsTrkAssoc(clr0,clrp) ) jnflagtmp=1;
00544 }
00545 }
00546 }
00547 if(jnflagtmp==0){
00548 for(j=0;j<2;j++){
00549 TrackSegmentAtNu* seg0 = new TrackSegmentAtNu(clrm,clr0,clrp); NEWOBJCTR++;
00550 segplnbnk[i+2*j].Add(seg0); trksegbnk.Add(seg0); jnflag=1;
00551 }
00552 if(assoc>1){
00553 clr0->SetTrkFlag(2);
00554 }
00555 }
00556 }
00557 }
00558 }
00559 }
00560 }
00561
00562 if( jnflag==1
00563 && 1+clr0->GetEndStrip()-clr0->GetBegStrip()<2 ){
00564 clr0->SetTrkFlag(2);
00565 }
00566
00567 }
00568 }
00569 }
00570 }
00571
00572 // Print out list of triplets
00573 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF TRIPLETS *** " << endl;
00574 for(i=0;i<fEndPln;i++){
00575 for(j=0;j<1+segplnbnk[i].GetLast();j++){
00576 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(segplnbnk[i].At(j));
00577 ClusterAtNu* clr0 = (ClusterAtNu*)(seg->GetClrAt(0));
00578 ClusterAtNu* clr1 = (ClusterAtNu*)(seg->GetClrAt(1));
00579 ClusterAtNu* clr2 = (ClusterAtNu*)(seg->GetClrAt(2));
00580 MSG("AlgAtNuReco", Msg::kVerbose)
00581 << " (" << clr0->GetPlane() << "," << clr0->GetBegStrip() << "->" << clr0->GetEndStrip() << ") "
00582 << " (" << clr1->GetPlane() << "," << clr1->GetBegStrip() << "->" << clr1->GetEndStrip() << ") "
00583 << " (" << clr2->GetPlane() << "," << clr2->GetBegStrip() << "->" << clr2->GetEndStrip() << ") " << endl;
00584 }
00585 }
00586
00587
00588 // *********************************************************
00589 // * F O R M A T I O N O F T R A C K S E G M E N T S *
00590 // *********************************************************
00591
00592 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of track segments *** " << endl;
00593 for(mod=0;mod<modnum;mod++){
00594 for(pln=3;pln<modpln-1;pln++){
00595 i=pln+mod*(modpln+1);
00596 if(1+segplnbnk[i].GetLast()>0 && 1+segplnbnk[i+2].GetLast()>0){
00597 for(k0=0;k0<1+segplnbnk[i].GetLast();k0++){
00598 TrackSegmentAtNu* seg0 = (TrackSegmentAtNu*)(segplnbnk[i].At(k0));
00599 for(kp=0;kp<1+segplnbnk[i+2].GetLast();kp++){
00600 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(segplnbnk[i+2].At(kp));
00601 if( seg0->IsEndAssoc(segp)>0 || segp->IsBegAssoc(seg0)>0 ){
00602 seg0->AddTriToEnd(segp); segp->AddTriToBeg(seg0);
00603 }
00604 }
00605 }
00606 }
00607 }
00608 }
00609
00610
00611 // Select preferred associations between triplets
00612 Int_t jnflagm,jnflagp;
00613 TObjArray tmpm,tmpp;
00614 for(mod=0;mod<modnum;mod++){
00615 for(pln=3;pln<modpln-1;pln++){
00616 i=pln+mod*(modpln+1);
00617
00618 // previous adjacent triplets ( i-2 <-> ) i <-> i+2
00619 tmpm.Clear();
00620 for(j=0;j<1+segplnbnk[i].GetLast();j++){
00621 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(segplnbnk[i].At(j));
00622 if(1+segm->GetTriEndLast()>0){
00623 tmpm.Add(segm);
00624 if(1+segm->GetTriBegLast()>0){
00625 segm->SetTmpTrkFlag(1);
00626 for(k=0;k<1+segm->GetTriBegLast();k++){
00627 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segm->GetTriBegAt(k));
00628 if( segm->GetTmpTrkFlag()<2 && segtmp->GetBegPlane()<segm->GetBegPlane() ){
00629 segm->SetTmpTrkFlag(2);
00630 }
00631 }
00632 }
00633 }
00634 }
00635
00636 // subsequent adjacent triplets i <-> i+2 ( <-> i+4 )
00637 tmpp.Clear();
00638 for(j=0;j<1+segplnbnk[i+2].GetLast();j++){
00639 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(segplnbnk[i+2].At(j));
00640 if(1+segp->GetTriBegLast()>0){
00641 tmpp.Add(segp);
00642 if(1+segp->GetTriEndLast()>0){
00643 segp->SetTmpTrkFlag(1);
00644 for(k=0;k<1+segp->GetTriEndLast();k++){
00645 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segp->GetTriEndAt(k));
00646 if( segp->GetTmpTrkFlag()<2 && segtmp->GetEndPlane()>segp->GetEndPlane() ){
00647 segp->SetTmpTrkFlag(2);
00648 }
00649 }
00650 }
00651 }
00652 }
00653
00654 // look for preferred joins ( i-2 <-> ) i <-> i+2
00655 for(j=0;j<1+tmpp.GetLast();j++){
00656 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(tmpp.At(j));
00657 jnflag=0;
00658 for(k=0;k<1+segp->GetTriBegLast();k++){
00659 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segp->GetTriBegAt(k));
00660 if(segtmp->GetTmpTrkFlag()>1) jnflag=1;
00661 }
00662 if(jnflag>0){
00663 for(k=0;k<1+segp->GetTriBegLast();k++){
00664 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segp->GetTriBegAt(k));
00665 if(segtmp->GetTmpTrkFlag()>0 && segtmp->GetTmpTrkFlag()<2) segtmp->SetTmpTrkFlag(2);
00666 }
00667 }
00668 }
00669
00670 // look for preferred joins i <-> i+2 ( <-> i+4 )
00671 for(j=0;j<1+tmpm.GetLast();j++){
00672 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(tmpm.At(j));
00673 jnflag=0;
00674 for(k=0;k<1+segm->GetTriEndLast();k++){
00675 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segm->GetTriEndAt(k));
00676 if(segtmp->GetTmpTrkFlag()>1) jnflag=1;
00677 }
00678 if(jnflag>0){
00679 for(k=0;k<1+segm->GetTriEndLast();k++){
00680 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segm->GetTriEndAt(k));
00681 if(segtmp->GetTmpTrkFlag()>0 && segtmp->GetTmpTrkFlag()<2) segtmp->SetTmpTrkFlag(2);
00682 }
00683 }
00684 }
00685
00686 // make joins
00687 if(1+tmpm.GetLast()>0 && 1+tmpp.GetLast()>0){
00688
00689 // look for doubly preferred joins ( i-2 <-> ) i <-> i+2 ( <-> i+4 )
00690 for(j=0;j<1+tmpm.GetLast();j++){
00691 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(tmpm.At(j));
00692 for(k=0;k<1+segm->GetTriEndLast();k++){
00693 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(segm->GetTriEndAt(k));
00694 if(segm->GetTmpTrkFlag()>1 && segp->GetTmpTrkFlag()>1){
00695 jnflagm=0;
00696 for(l=0;l<1+segm->GetTriBegLast();l++){
00697 TrackSegmentAtNu* segm2 = (TrackSegmentAtNu*)(segm->GetTriBegAt(l));
00698 if( jnflagm<1 && (segm2->IsEndAssoc(segp)||segp->IsBegAssoc(segm2)) ) jnflagm=1;
00699 }
00700 jnflagp=0;
00701 for(l=0;l<1+segp->GetTriEndLast();l++){
00702 TrackSegmentAtNu* segp2 = (TrackSegmentAtNu*)(segp->GetTriEndAt(l));
00703 if( jnflagp<1 && (segm->IsEndAssoc(segp2)||segp2->IsBegAssoc(segm)) ) jnflagp=1;
00704 }
00705 if(jnflagm>0 && jnflagp>0){
00706 segm->AddAssocTriToEnd(segp); segp->AddAssocTriToBeg(segm);
00707 }
00708 }
00709 }
00710 }
00711
00712 // look for singly preferred joins (1) ( i-2 <-> ) i <-> i+2
00713 for(j=0;j<1+tmpm.GetLast();j++){
00714 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(tmpm.At(j));
00715 if(segm->GetTmpTrkFlag()>1){
00716 jnflag=0;
00717 for(k=0;k<1+segm->GetTriEndLast();k++){
00718 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(segm->GetTriEndAt(k));
00719 if(segp->GetTmpTrkFlag()>1) jnflag=1;
00720 }
00721 if(jnflag<1){
00722 for(k=0;k<1+segm->GetTriEndLast();k++){
00723 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(segm->GetTriEndAt(k));
00724 jnflagm=0;
00725 for(l=0;l<1+segm->GetTriBegLast();l++){
00726 TrackSegmentAtNu* segm2 = (TrackSegmentAtNu*)(segm->GetTriBegAt(l));
00727 if( jnflagm<1 && (segm2->IsEndAssoc(segp)||segp->IsBegAssoc(segm2)) ) jnflagm=1;
00728 }
00729 if(jnflagm>0){
00730 segm->AddAssocTriToEnd(segp); segp->AddAssocTriToBeg(segm);
00731 }
00732 }
00733 }
00734 }
00735 }
00736
00737 // look for singly preferred joins (2) i <-> i+2 ( <-> i+4 )
00738 for(j=0;j<1+tmpp.GetLast();j++){
00739 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(tmpp.At(j));
00740 if(segp->GetTmpTrkFlag()>1){
00741 jnflag=0;
00742 for(k=0;k<1+segp->GetTriBegLast();k++){
00743 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(segp->GetTriBegAt(k));
00744 if(segm->GetTmpTrkFlag()>1) jnflag=1;
00745 }
00746 if(jnflag<1){
00747 for(k=0;k<1+segp->GetTriBegLast();k++){
00748 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(segp->GetTriBegAt(k));
00749 jnflagp=0;
00750 for(l=0;l<1+segp->GetTriEndLast();l++){
00751 TrackSegmentAtNu* segp2 = (TrackSegmentAtNu*)(segp->GetTriEndAt(l));
00752 if( jnflagp<1 && (segm->IsEndAssoc(segp2)||segp2->IsBegAssoc(segm)) ) jnflagp=1;
00753 }
00754 if(jnflagp>0){
00755 segm->AddAssocTriToEnd(segp); segp->AddAssocTriToBeg(segm);
00756 }
00757 }
00758 }
00759 }
00760 }
00761
00762 // look for other joins i <-> i+2
00763 for(j=0;j<1+tmpm.GetLast();j++){
00764 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(tmpm.At(j));
00765 for(k=0;k<1+segm->GetTriEndLast();k++){
00766 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(segm->GetTriEndAt(k));
00767 if(segm->GetTmpTrkFlag()<2 && segp->GetTmpTrkFlag()<2){
00768 jnflagm=0;
00769 for(l=0;l<1+segm->GetTriEndLast();l++){
00770 TrackSegmentAtNu* segmp = (TrackSegmentAtNu*)(segm->GetTriEndAt(l));
00771 if(segmp->GetTmpTrkFlag()>1) jnflagm=1;
00772 }
00773 jnflagp=0;
00774 for(l=0;l<1+segp->GetTriBegLast();l++){
00775 TrackSegmentAtNu* segpm = (TrackSegmentAtNu*)(segp->GetTriBegAt(l));
00776 if(segpm->GetTmpTrkFlag()>1) jnflagp=1;
00777 }
00778 if(jnflagm<1 && jnflagp<1){
00779 segm->AddAssocTriToEnd(segp); segp->AddAssocTriToBeg(segm);
00780 }
00781 }
00782 }
00783 }
00784
00785 }
00786
00787 // clear flags
00788 for(j=0;j<1+tmpm.GetLast();j++){
00789 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(tmpm.At(j));
00790 segm->SetTmpTrkFlag(0);
00791 }
00792
00793 for(j=0;j<1+tmpp.GetLast();j++){
00794 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(tmpp.At(j));
00795 segp->SetTmpTrkFlag(0);
00796 }
00797
00798 }
00799 }
00800
00801
00802 // Form segments from triplets
00803 TObjArray segbnk[2];
00804 for(mod=0;mod<modnum;mod++){
00805 for(pln=3;pln<modpln-1;pln++){
00806 i=pln+mod*(modpln+1);
00807
00808 for(j=0;j<1+segplnbnk[i].GetLast();j++){
00809 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(segplnbnk[i].At(j));
00810
00811 // isolated segments
00812 if(1+seg->GetTriBegLast()==0 && 1+seg->GetTriEndLast()==0){
00813 vuw=seg->GetPlaneView(); segbnk[vuw].Add(seg); seg->SetSegment(seg);
00814 }
00815
00816 // associated segments
00817 if(1+seg->GetAssocTriBegLast()>0 || 1+seg->GetAssocTriEndLast()>0){
00818 jnflag=0;
00819 if(1+seg->GetAssocTriBegLast()==1){
00820 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(seg->GetAssocTriBegAt(0));
00821 if(1+segtmp->GetAssocTriEndLast()==1){
00822 TrackSegmentAtNu* seg0 = (TrackSegmentAtNu*)(segtmp->GetSegment());
00823 seg0->AddSegment(seg); seg->SetSegment(seg0); seg->SetUID(-1);
00824 jnflag=1;
00825 }
00826 }
00827 if(jnflag<1){
00828 vuw=seg->GetPlaneView(); segbnk[vuw].Add(seg); seg->SetSegment(seg);
00829 for(k=0;k<1+seg->GetAssocTriBegLast();k++){
00830 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(seg->GetAssocTriBegAt(k));
00831 TrackSegmentAtNu* segtmp0 = (TrackSegmentAtNu*)(segtmp->GetSegment());
00832 seg->AddSegToBeg(segtmp0); segtmp0->AddSegToEnd(seg);
00833 }
00834 }
00835 }
00836
00837 }
00838 }
00839 }
00840
00841
00842 // Form associations between non-adjacent segments
00843 Int_t npts,npts0=4;
00844 Double_t inv_npts;
00845 for(vuw=0;vuw<2;vuw++){
00846 tmp1.Clear(); tmp2.Clear();
00847 for(i=0;i<1+segbnk[vuw].GetLast();i++){
00848 TrackSegmentAtNu* seg1 = (TrackSegmentAtNu*)(segbnk[vuw].At(i));
00849 if(1+seg1->GetSegEndLast()==0){
00850 jnflag=0; mod=(Int_t)((seg1->GetEndPlane())/(modpln+1)); npts=npts0;
00851 if( (modtype==1 && seg1->GetEndStrip()>80 && seg1->GetEndStrip()<=110)
00852 || (1+seg1->GetEndPlane()-seg1->GetBegPlane()/2>5) ){
00853 inv_npts = seg1->GetEndDir()/2.0;
00854 if(inv_npts<0) inv_npts=-inv_npts; if(inv_npts<0.01) inv_npts=0.01;
00855 npts=(Int_t)(1.0/inv_npts); if(npts<8) npts=8; if(npts>18) npts=18;
00856 }
00857 for(j=1;j<npts;j++){
00858 pln=seg1->GetEndPlane()+2*j;
00859 if(jnflag==0 && pln<(modpln+1)*(mod+1)){
00860 for(k=0;k<1+segplnbnk[pln].GetLast();k++){
00861 TrackSegmentAtNu* seg2 = (TrackSegmentAtNu*)(segplnbnk[pln].At(k));
00862 if( ( seg2->GetSegment()==seg2 && 1+seg2->GetSegBegLast()==0 )
00863 && ( seg2->GetBegPlane()-seg1->GetEndPlane()>0
00864 || seg1->GetClrLast()>5 && seg2->GetClrLast()>5 )
00865 && ( j<npts0
00866 || ( modtype==1
00867 && ( ( seg2->GetBegStrip()>80 && seg2->GetBegStrip()<=100
00868 && seg1->GetEndStrip()>90 && seg1->GetEndStrip()<=110 )
00869 || ( seg2->GetBegStrip()>90 && seg2->GetBegStrip()<=110
00870 && seg1->GetEndStrip()>80 && seg1->GetEndStrip()<=100 ) ) )
00871 || ( 1+seg1->GetEndPlane()-seg1->GetBegPlane()/2>5 ) ) ){
00872 if( seg1->IsEndAssoc(seg2) ){
00873 tmp1.Add(seg1); tmp2.Add(seg2); jnflag=1;
00874 MSG("AlgAtNuReco", Msg::kVerbose) << " NON-ADJ ASSOC: "
00875 << seg1->GetBegPlane() << " " << seg1->GetEndPlane() << " "
00876 << seg2->GetBegPlane() << " " << seg2->GetEndPlane() << endl;
00877 }
00878 }
00879 }
00880 }
00881 }
00882 }
00883 }
00884 for(i=0;i<1+tmp1.GetLast();i++){
00885 TrackSegmentAtNu* seg1 = (TrackSegmentAtNu*)(tmp1.At(i));
00886 TrackSegmentAtNu* seg2 = (TrackSegmentAtNu*)(tmp2.At(i));
00887 seg1->AddSegToEnd(seg2); seg2->AddSegToBeg(seg1);
00888 }
00889 }
00890
00891 // Print out list of segments
00892 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF TRACK SEGMENTS *** " << endl;
00893 for(vuw=0;vuw<2;vuw++){
00894 MSG("AlgAtNuReco", Msg::kVerbose) << "view: " << vuw << endl;
00895 for(i=0;i<1+segbnk[vuw].GetLast();i++){
00896 TrackSegmentAtNu* segment = (TrackSegmentAtNu*)(segbnk[vuw].At(i));
00897 MSG("AlgAtNuReco", Msg::kVerbose) << " i=" << i
00898 << " begpln: " << segment->GetBegPlane()
00899 << " begstr: " << segment->GetBegStrip()
00900 << " endpln: " << segment->GetEndPlane()
00901 << " endstr: " << segment->GetEndStrip() << endl;
00902 MSG("AlgAtNuReco", Msg::kVerbose) << " beg: " << endl;
00903 for(j=0;j<1+segment->GetSegBegLast();j++){
00904 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segment->GetSegBegAt(j));
00905 MSG("AlgAtNuReco", Msg::kVerbose) << " j=" << j
00906 << " begpln: " << segtmp->GetBegPlane()
00907 << " begstr: " << segtmp->GetBegStrip()
00908 << " endpln: " << segtmp->GetEndPlane()
00909 << " endstr: " << segtmp->GetEndStrip() << endl;
00910 }
00911 MSG("AlgAtNuReco", Msg::kVerbose) << " end: " << endl;
00912 for(j=0;j<1+segment->GetSegEndLast();j++){
00913 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(segment->GetSegEndAt(j));
00914 MSG("AlgAtNuReco", Msg::kVerbose) << " j=" << j
00915 << " begpln: " << segtmp->GetBegPlane()
00916 << " begstr: " << segtmp->GetBegStrip()
00917 << " endpln: " << segtmp->GetEndPlane()
00918 << " endstr: " << segtmp->GetEndStrip() << endl;
00919 }
00920 }
00921 }
00922
00923 gettimeofday(&tpafter,0);
00924 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
00925 fTime_TrackAtNu+=dtime;
00926
00927
00928 // ***********************************************************
00929 // * F O R M A T I O N O F S H O W E R S E G M E N T S *
00930 // ***********************************************************
00931
00932 gettimeofday(&tpbefore,0);
00933
00934 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of shower segments *** " << endl;
00935
00936 // Join associated clusters
00937 Int_t pln0;
00938 TObjArray segbnk2[2];
00939 for(mod=0;mod<modnum;mod++){
00940 for(pln=1;pln<1+modpln;pln++){
00941 i=pln+mod*(modpln+1);
00942 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
00943 ClusterAtNu* clr0 = (ClusterAtNu*)(clrplnbnk[i].At(j));
00944 if(clr0->GetShwFlag()>0 && clr0->GetShwFlag()<2){
00945 ShowerSegmentAtNu* seg0 = new ShowerSegmentAtNu(clr0); NEWOBJCTR++;
00946 vuw = seg0->GetPlaneView(); segbnk2[vuw].Add(seg0);
00947 clr0->SetShwFlag(2); shwsegbnk.Add(seg0); ctr=1;
00948 while(ctr>0){
00949 ctr=0;
00950 pln0 = -2 + seg0->GetBegPlane();
00951 npln = 3 + (seg0->GetEndPlane()-seg0->GetBegPlane())/2;
00952 for(k=0;k<npln;k++){
00953 k0=pln0+2*k;
00954 if(k0>mod*(modpln+1) && k0<(mod+1)*(modpln+1)){
00955 for(k1=0;k1<1+clrplnbnk[k0].GetLast();k1++){
00956 ClusterAtNu* clr1 = (ClusterAtNu*)(clrplnbnk[k0].At(k1));
00957 if(clr1->GetShwFlag()>0 && clr1->GetShwFlag()<2){
00958 assoc=seg0->IsShwAssoc(clr1);
00959 if(assoc>0){
00960 seg0->AddCluster(clr1);
00961 clr1->SetShwFlag(2); ctr++;
00962 }
00963 }
00964 }
00965 }
00966 }
00967 }
00968 }
00969 }
00970 }
00971 }
00972
00973 // Print out list of shower segments
00974 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF SHOWER SEGMENTS *** " << endl;
00975 for(vuw=0;vuw<2;vuw++){
00976 for(i=0;i<1+segbnk2[vuw].GetLast();i++){
00977 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(segbnk2[vuw].At(i));
00978 MSG("AlgAtNuReco", Msg::kVerbose)
00979 << "vuw=" << vuw << " i=" << i << " "
00980 << seg->GetBegPlane() << " " << seg->GetEndPlane() << " "
00981 << seg->GetBegStrip() << " " << seg->GetEndStrip() << " "
00982 << 1+seg->GetHitLast() << endl;
00983 }
00984 }
00985
00986 gettimeofday(&tpafter,0);
00987 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
00988 fTime_ShowerAtNu+=dtime;
00989
00990
00991 // ******************************************
00992 // * C O M P A R E U / V V I E W S (1) *
00993 // ******************************************
00994
00995 Int_t shwctr,trkctr,plnctr;
00996 TObjArray mysegbnk[2],mysegbnk2[2];
00997 MSG("AlgAtNuReco", Msg::kDebug) << " *** comparing views (1) *** " << endl;
00998
00999 // determine track-like track segments
01000 gettimeofday(&tpbefore,0);
01001
01002 for(vuw=0;vuw<2;vuw++){
01003 for(i=0;i<1+segbnk[vuw].GetLast();i++){
01004 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(segbnk[vuw].At(i));
01005 shwctr=0; trkctr=0; plnctr=0;
01006 for(j=0;j<1+seg->GetClrLast();j++){
01007 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
01008 if(clr->GetTrkFlag()>1){ trkctr++; if(clr->GetShwFlag()<2) shwctr++; }
01009 if(clr->GetTrkPlnFlag()>0){ plnctr++; }
01010 }
01011 if( plnctr>1 ){
01012 if(shwctr>0) seg->SetUID(1); if(shwctr>2) seg->SetUID(2);
01013 }
01014 }
01015 }
01016
01017 for(i=0;i<1+segbnk[0].GetLast();i++){
01018 TrackSegmentAtNu* segu = (TrackSegmentAtNu*)(segbnk[0].At(i));
01019 for(j=0;j<1+segbnk[1].GetLast();j++){
01020 TrackSegmentAtNu* segv = (TrackSegmentAtNu*)(segbnk[1].At(j));
01021 if( segu->GetBegPlane()+1<segv->GetEndPlane() && segu->GetEndPlane()>segv->GetBegPlane()+1
01022 && segu->GetUID()>0 && segv->GetUID()>0 ){
01023 if(segv->GetUID()>1) mysegbnk[0].Add(segu); if(segu->GetUID()>1) mysegbnk[1].Add(segv);
01024 }
01025 }
01026 }
01027
01028 for(vuw=0;vuw<2;vuw++){
01029 for(i=0;i<1+mysegbnk[vuw].GetLast();i++){
01030 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(mysegbnk[vuw].At(i));
01031 seg->SetUID(2);
01032 }
01033 }
01034
01035 for(vuw=0;vuw<2;vuw++){
01036 for(i=0;i<1+segbnk[vuw].GetLast();i++){
01037 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(segbnk[vuw].At(i));
01038 if( seg->GetUID()>0 && seg->GetUID()<2 ) seg->SetReseedFlag(1);
01039 }
01040 }
01041
01042 gettimeofday(&tpafter,0);
01043 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
01044 fTime_TrackAtNu+=dtime;
01045
01046 // determine shower-like shower segments
01047 gettimeofday(&tpbefore,0);
01048
01049 for(vuw=0;vuw<2;vuw++){
01050 for(i=0;i<1+segbnk2[vuw].GetLast();i++){
01051 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(segbnk2[vuw].At(i));
01052 trkctr=0; shwctr=0; plnctr=0;
01053 for(j=0;j<1+seg->GetClrLast();j++){
01054 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
01055 if(clr->GetShwFlag()>1){ shwctr++; if(clr->GetTrkFlag()<2) trkctr++; }
01056 if(clr->GetShwPlnFlag()>0){ plnctr++; }
01057 }
01058 if( plnctr>-1 ){
01059 if(trkctr>-1) seg->SetUID(1); if(trkctr>0) seg->SetUID(2);
01060 }
01061 }
01062 }
01063
01064 for(i=0;i<1+segbnk2[0].GetLast();i++){
01065 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(segbnk2[0].At(i));
01066 for(j=0;j<1+segbnk2[1].GetLast();j++){
01067 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(segbnk2[1].At(j));
01068 if( segu->GetBegPlane()-2<segv->GetEndPlane() && segu->GetEndPlane()>segv->GetBegPlane()-2
01069 && segu->GetUID()>0 && segv->GetUID()>0 ){
01070 if(segv->GetUID()>1) mysegbnk2[0].Add(segu); if(segu->GetUID()>1) mysegbnk2[1].Add(segv);
01071 }
01072 }
01073 }
01074
01075 for(vuw=0;vuw<2;vuw++){
01076 for(i=0;i<1+mysegbnk2[vuw].GetLast();i++){
01077 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(mysegbnk2[vuw].At(i));
01078 seg->SetUID(2);
01079 }
01080 }
01081
01082 for(vuw=0;vuw<2;vuw++){
01083 for(i=0;i<1+segbnk2[vuw].GetLast();i++){
01084 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(segbnk2[vuw].At(i));
01085 if( seg->GetUID()>0 && seg->GetUID()<2 ) seg->SetReseedFlag(1);
01086 }
01087 }
01088
01089 gettimeofday(&tpafter,0);
01090 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
01091 fTime_ShowerAtNu+=dtime;
01092
01093
01094 // ***********************************************
01095 // * F O R M A T I O N O F 2 D T R A C K S *
01096 // ***********************************************
01097
01098 gettimeofday(&tpbefore,0);
01099
01100 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of 2D tracks *** " << endl;
01101 Int_t bpln,epln;
01102 Int_t objctr,objarrctr;
01103 Double_t dscr,topscr;
01104 Double_t strw,strdw;
01105 Int_t idm,idp;
01106 Int_t ntrks;
01107 Int_t tmpflag,trkflag;
01108 TObjArray tmpb,tmpe;
01109 TObjArray begbnk,endbnk;
01110 TObjArray tmpbegbnk,tmpendbnk;
01111 TObjArray tmpbnk,tmpbnk2;
01112
01113 if(1+segbnk[0].GetLast()>0 && 1+segbnk[1].GetLast()>0){
01114 for(vuw=0;vuw<2;vuw++){
01115
01116 cont=1; ntrks=0;
01117 while(cont){
01118 cont=0;
01119 begbnk.Clear(); endbnk.Clear();
01120
01121 // select seed segments
01122 tmp1.Clear(); tmp2.Clear();
01123 for(i=0;i<1+segbnk[vuw].GetLast();i++){
01124 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(segbnk[vuw].At(i));
01125 if( seg->GetUID()>0 && seg->GetUID()<3 ){
01126 ctr=0;
01127 for(j=0;j<1+seg->GetClrLast();j++){
01128 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
01129 if( clr->GetTrkPlnFlag()>0 && clr->GetTrkFlag()>1 && clr->GetTrkFlag()<3 ) ctr++;
01130 }
01131 if( ntrks>0 && ctr<3 ) seg->SetUID(0);
01132 }
01133 if(seg->GetUID()==2) tmp1.Add(seg); if(seg->GetUID()==1) tmp2.Add(seg);
01134 }
01135
01136 if(1+tmp1.GetLast()==0){
01137 for(i=0;i<1+tmp2.GetLast();i++){
01138 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp2.At(i));
01139 tmp1.Add(seg);
01140 }
01141 }
01142
01143 tmp2.Clear();
01144 if(1+tmp1.GetLast()>0){
01145 npln=-1;
01146 for(i=0;i<1+tmp1.GetLast();i++){
01147 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp1.At(i));
01148 if( 1+seg->GetEndPlane()-seg->GetBegPlane()>npln ){
01149 npln=1+seg->GetEndPlane()-seg->GetBegPlane();
01150 }
01151 }
01152 if(npln>0){
01153 for(i=0;i<1+tmp1.GetLast();i++){
01154 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp1.At(i));
01155 if( 1+seg->GetEndPlane()-seg->GetBegPlane()>12
01156 || 1+seg->GetEndPlane()-seg->GetBegPlane()>npln-5 ){
01157 tmp2.Add(seg);
01158 }
01159 }
01160 }
01161 }
01162
01163 // select seed tracks
01164 tmp1.Clear();
01165 if(1+tmp2.GetLast()>0){
01166 npln=-1;
01167 for(i=0;i<1+tmp2.GetLast();i++){
01168 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp2.At(i));
01169 tmpm.Clear(); tmpp.Clear();
01170
01171 tmpb.Clear(); tmpb.Add(seg); tmpbnk.Clear();
01172 while(1+tmpb.GetLast()>0){
01173 tmp.Clear();
01174 for(j=0;j<1+tmpb.GetLast();j++){
01175 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmpb.At(j));
01176 tmp.Add(segtmp);
01177 }
01178 tmpb.Clear();
01179 for(j=0;j<1+tmp.GetLast();j++){
01180 tmpflag=0;
01181 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmp.At(j));
01182 for(k=0;k<1+segtmp->GetSegBegLast();k++){
01183 TrackSegmentAtNu* segb = (TrackSegmentAtNu*)(segtmp->GetSegBegAt(k));
01184 if(segb->GetUID()>-1 && segb->GetUID()<3){
01185 tmpflag=1;
01186 if(segb->GetTmpTrkFlag()<1){
01187 tmpb.Add(segb); segb->SetTmpTrkFlag(1); tmpbnk.Add(segb);
01188 }
01189 }
01190 }
01191 if(tmpflag==0){
01192 tmpm.Add(segtmp);
01193 }
01194 }
01195 }
01196 for(j=0;j<1+tmpbnk.GetLast();j++){
01197 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmpbnk.At(j));
01198 segtmp->SetTmpTrkFlag(0);
01199 }
01200
01201 tmpe.Clear(); tmpe.Add(seg); tmpbnk.Clear();
01202 while(1+tmpe.GetLast()>0){
01203 tmp.Clear();
01204 for(j=0;j<1+tmpe.GetLast();j++){
01205 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmpe.At(j));
01206 tmp.Add(segtmp);
01207 }
01208 tmpe.Clear();
01209 for(j=0;j<1+tmp.GetLast();j++){
01210 tmpflag=0;
01211 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmp.At(j));
01212 for(k=0;k<1+segtmp->GetSegEndLast();k++){
01213 TrackSegmentAtNu* sege = (TrackSegmentAtNu*)(segtmp->GetSegEndAt(k));
01214 if(sege->GetUID()>-1 && sege->GetUID()<3){
01215 tmpflag=1;
01216 if(sege->GetTmpTrkFlag()<1){
01217 tmpe.Add(sege); sege->SetTmpTrkFlag(1); tmpbnk.Add(sege);
01218 }
01219 }
01220 }
01221 if(tmpflag==0){
01222 tmpp.Add(segtmp);
01223 }
01224 }
01225 }
01226 for(j=0;j<1+tmpbnk.GetLast();j++){
01227 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmpbnk.At(j));
01228 segtmp->SetTmpTrkFlag(0);
01229 }
01230
01231 npts=-1;
01232 for(j=0;j<1+tmpm.GetLast();j++){
01233 TrackSegmentAtNu* segm = (TrackSegmentAtNu*)(tmpm.At(j));
01234 for(k=0;k<1+tmpp.GetLast();k++){
01235 TrackSegmentAtNu* segp = (TrackSegmentAtNu*)(tmpp.At(k));
01236 if(1+segp->GetEndPlane()-segm->GetBegPlane()>npts){
01237 npts=1+segp->GetEndPlane()-segm->GetBegPlane();
01238 }
01239 }
01240 }
01241 seg->SetNPlanes(npts);
01242 if(npts>npln) npln=npts;
01243 }
01244 if(npln>0){
01245 for(i=0;i<1+tmp2.GetLast();i++){
01246 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp2.At(i));
01247 if( seg->GetNPlanes()>npln-5 ){
01248 tmp1.Add(seg);
01249 }
01250 }
01251 }
01252 }
01253
01254 // propagate segments
01255 tmpbnk2.Clear();
01256 for(i=0;i<1+tmp1.GetLast();i++){
01257 TrackSegmentAtNu* seg0 = (TrackSegmentAtNu*)(tmp1.At(i));
01258
01259 MSG("AlgAtNuReco", Msg::kVerbose)
01260 << " PROPAGATE SEED SEGMENT " << seg0->GetBegPlane() << " " << seg0->GetEndPlane() << endl;
01261
01262 seg0->SetTmpTrkFlag(3); trkflag=0;
01263 tmpbnk.Clear(); tmpbnk.Add(seg0);
01264
01265 // track backwards (1)
01266 tmpm.Clear(); tmpb.Clear(); tmpb.Add(seg0);
01267 while(1+tmpb.GetLast()>0){
01268 tmp.Clear();
01269 for(j=0;j<1+tmpb.GetLast();j++){
01270 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmpb.At(j));
01271 tmp.Add(segtmp);
01272 }
01273 tmpb.Clear();
01274 for(j=0;j<1+tmp.GetLast();j++){
01275 tmpflag=0;
01276 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmp.At(j));
01277 for(k=0;k<1+segtmp->GetSegBegLast();k++){
01278 TrackSegmentAtNu* segb = (TrackSegmentAtNu*)(segtmp->GetSegBegAt(k));
01279 if(segb->GetUID()>-1 && segb->GetUID()<3){
01280 tmpflag=1;
01281 if(segb->GetTmpTrkFlag()<1){
01282 tmpb.Add(segb); segb->SetTmpTrkFlag(1); tmpbnk.Add(segb);
01283 }
01284 }
01285 }
01286 if(tmpflag==0){
01287 tmpm.Add(segtmp);
01288 }
01289 }
01290 }
01291
01292 npln=999;
01293 for(j=0;j<1+tmpm.GetLast();j++){
01294 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpm.At(j));
01295 if(seg->GetBegPlane()<npln) npln=seg->GetBegPlane();
01296 }
01297
01298 tmpb.Clear();
01299 for(j=0;j<1+tmpm.GetLast();j++){
01300 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpm.At(j));
01301 if(seg->GetBegPlane()<npln+5){
01302 tmpb.Add(seg);
01303 }
01304 }
01305
01306 while(1+tmpb.GetLast()>0){
01307 tmp.Clear();
01308 for(j=0;j<1+tmpb.GetLast();j++){
01309 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpb.At(j));
01310 if(seg->GetTmpTrkFlag()<2){
01311 seg->SetTmpTrkFlag(2); tmp.Add(seg);
01312 }
01313 if(seg->GetTrkFlag()<1){
01314 seg->SetTrkFlag(1); tmpbnk2.Add(seg); trkflag=1;
01315 }
01316 }
01317 tmpb.Clear();
01318 for(j=0;j<1+tmp.GetLast();j++){
01319 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp.At(j));
01320 for(k=0;k<1+seg->GetSegEndLast();k++){
01321 TrackSegmentAtNu* segb = (TrackSegmentAtNu*)(seg->GetSegEndAt(k));
01322 if(segb->GetTmpTrkFlag()>0){
01323 tmpb.Add(segb);
01324 }
01325 }
01326 }
01327 }
01328
01329 // track forwards (1)
01330 tmpp.Clear(); tmpe.Clear(); tmpe.Add(seg0);
01331 while(1+tmpe.GetLast()>0){
01332 tmp.Clear();
01333 for(j=0;j<1+tmpe.GetLast();j++){
01334 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmpe.At(j));
01335 tmp.Add(segtmp);
01336 }
01337 tmpe.Clear();
01338 for(j=0;j<1+tmp.GetLast();j++){
01339 tmpflag=0;
01340 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(tmp.At(j));
01341 for(k=0;k<1+segtmp->GetSegEndLast();k++){
01342 TrackSegmentAtNu* sege = (TrackSegmentAtNu*)(segtmp->GetSegEndAt(k));
01343 if(sege->GetUID()>-1 && sege->GetUID()<3){
01344 tmpflag=1;
01345 if(sege->GetTmpTrkFlag()<1){
01346 tmpe.Add(sege); sege->SetTmpTrkFlag(1); tmpbnk.Add(sege);
01347 }
01348 }
01349 }
01350 if(tmpflag==0){
01351 tmpp.Add(segtmp);
01352 }
01353 }
01354 }
01355
01356 npln=-999;
01357 for(j=0;j<1+tmpp.GetLast();j++){
01358 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpp.At(j));
01359 if(seg->GetEndPlane()>npln) npln=seg->GetEndPlane();
01360 }
01361
01362 tmpe.Clear();
01363 for(j=0;j<1+tmpp.GetLast();j++){
01364 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpp.At(j));
01365 if(seg->GetEndPlane()>npln-5){
01366 tmpe.Add(seg);
01367 }
01368 }
01369
01370 while(1+tmpe.GetLast()>0){
01371 tmp.Clear();
01372 for(j=0;j<1+tmpe.GetLast();j++){
01373 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpe.At(j));
01374 if(seg->GetTmpTrkFlag()<2){
01375 seg->SetTmpTrkFlag(2); tmp.Add(seg);
01376 }
01377 if(seg->GetTrkFlag()<1){
01378 seg->SetTrkFlag(1); tmpbnk2.Add(seg); trkflag=1;
01379 }
01380 }
01381 tmpe.Clear();
01382 for(j=0;j<1+tmp.GetLast();j++){
01383 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmp.At(j));
01384 for(k=0;k<1+seg->GetSegBegLast();k++){
01385 TrackSegmentAtNu* sege = (TrackSegmentAtNu*)(seg->GetSegBegAt(k));
01386 if(sege->GetTmpTrkFlag()>0){
01387 tmpe.Add(sege);
01388 }
01389 }
01390 }
01391 }
01392
01393 if(trkflag){
01394
01395 // track backwards (2)
01396 tmpbegbnk.Clear(); objarrctr=0;
01397 TObjArray* tmpbegsegbnk = new TObjArray(); NEWOBJCTR++;
01398 tmpbegsegbnk->Add(seg0); tmpbegbnk.Add(tmpbegsegbnk); objctr=1;
01399 while(objctr>0){
01400 objctr=0; npts=1+tmpbegbnk.GetLast();
01401 for(j=0;j<npts;j++){
01402 TObjArray* objtmp = (TObjArray*)(tmpbegbnk.At(j));
01403 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(objtmp->Last());
01404 tmpm.Clear();
01405 for(k=0;k<1+segtmp->GetSegBegLast();k++){
01406 TrackSegmentAtNu* segbeg = (TrackSegmentAtNu*)(segtmp->GetSegBegAt(k));
01407 if(segbeg->GetTmpTrkFlag()>1){
01408 tmpm.Add(segbeg);
01409 }
01410 }
01411 if(1+tmpm.GetLast()>0){
01412 for(k=1;k<1+tmpm.GetLast();k++){
01413 if(objarrctr<fObjMax){
01414 TObjArray* objnew = new TObjArray(*objtmp); NEWOBJCTR++;
01415 TrackSegmentAtNu* segbeg = (TrackSegmentAtNu*)(tmpm.At(k));
01416 objnew->Add(segbeg); tmpbegbnk.Add(objnew);
01417 objarrctr++;
01418 }
01419 else{
01420 if(!fObjMaxFlag){
01421 fObjMaxFlag=1;
01422 MSG("AlgAtNuReco", Msg::kWarning) << " *** CRAZY MEMORY GUZZLING *** " << endl;
01423 }
01424 }
01425 }
01426 TrackSegmentAtNu* segbeg = (TrackSegmentAtNu*)(tmpm.First());
01427 objtmp->Add(segbeg); objctr++;
01428 }
01429 }
01430 }
01431
01432 id=-1; topscr=-1.0;
01433 for(j=0;j<1+tmpbegbnk.GetLast();j++){
01434 TObjArray* objtmp = (TObjArray*)(tmpbegbnk.At(j));
01435 scr = seg0->GetScore(objtmp,0);
01436 if(scr>topscr){ topscr=scr; id=j; }
01437 }
01438
01439 TObjArray* objbegtmp = (TObjArray*)(tmpbegbnk.At(id));
01440 TObjArray* objbegnew = new TObjArray(*objbegtmp); begbnk.Add(objbegnew); NEWOBJCTR++;
01441 DELOBJCTR+=1+tmpbegbnk.GetLast(); tmpbegbnk.Delete();
01442
01443 // track forwards (2)
01444 tmpendbnk.Clear(); objarrctr=0;
01445 TObjArray* tmpendsegbnk = new TObjArray(); NEWOBJCTR++;
01446 tmpendsegbnk->Add(seg0); tmpendbnk.Add(tmpendsegbnk); objctr=1;
01447 while(objctr>0){
01448 objctr=0; npts=1+tmpendbnk.GetLast();
01449 for(j=0;j<npts;j++){
01450 TObjArray* objtmp = (TObjArray*)(tmpendbnk.At(j));
01451 TrackSegmentAtNu* segtmp = (TrackSegmentAtNu*)(objtmp->Last());
01452 tmpp.Clear();
01453 for(k=0;k<1+segtmp->GetSegEndLast();k++){
01454 TrackSegmentAtNu* segend = (TrackSegmentAtNu*)(segtmp->GetSegEndAt(k));
01455 if(segend->GetTmpTrkFlag()>1){
01456 tmpp.Add(segend);
01457 }
01458 }
01459 if(1+tmpp.GetLast()>0){
01460 for(k=1;k<1+tmpp.GetLast();k++){
01461 if(objarrctr<fObjMax){
01462 TObjArray* objnew = new TObjArray(*objtmp); NEWOBJCTR++;
01463 TrackSegmentAtNu* segend = (TrackSegmentAtNu*)(tmpp.At(k));
01464 objnew->Add(segend); tmpendbnk.Add(objnew);
01465 objarrctr++;
01466 }
01467 else{
01468 if(!fObjMaxFlag){
01469 fObjMaxFlag=1;
01470 MSG("AlgAtNuReco", Msg::kWarning) << " *** CRAZY MEMORY GUZZLING *** " << endl;
01471 }
01472 }
01473 }
01474 TrackSegmentAtNu* segend = (TrackSegmentAtNu*)(tmpp.First());
01475 objtmp->Add(segend); objctr++;
01476 }
01477 }
01478 }
01479
01480 id=-1; topscr=-1.0;
01481 for(j=0;j<1+tmpendbnk.GetLast();j++){
01482 TObjArray* objtmp = (TObjArray*)(tmpendbnk.At(j));
01483 scr = seg0->GetScore(0,objtmp);
01484 if(scr>topscr){ topscr=scr; id=j; }
01485 }
01486
01487 TObjArray* objendtmp = (TObjArray*)(tmpendbnk.At(id));
01488 TObjArray* objendnew = new TObjArray(*objendtmp); endbnk.Add(objendnew); NEWOBJCTR++;
01489 DELOBJCTR+=1+tmpendbnk.GetLast(); tmpendbnk.Delete();
01490 }
01491
01492 for(j=0;j<1+tmpbnk.GetLast();j++){
01493 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpbnk.At(j));
01494 seg->SetTmpTrkFlag(0);
01495 }
01496 }
01497
01498 for(j=0;j<1+tmpbnk2.GetLast();j++){
01499 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmpbnk2.At(j));
01500 seg->SetTrkFlag(0);
01501 }
01502
01503 // select best track
01504 if(1+begbnk.GetLast()>0 && 1+endbnk.GetLast()>0){
01505
01506 id=-1; topscr=-1.0;
01507 for(i=0;i<1+begbnk.GetLast();i++){
01508 TObjArray* objbeg = (TObjArray*)(begbnk.At(i));
01509 TObjArray* objend = (TObjArray*)(endbnk.At(i));
01510 TrackSegmentAtNu* seg0 = (TrackSegmentAtNu*)(objbeg->First());
01511 scr = seg0->GetScore(objbeg,objend);
01512 if(scr>topscr){ topscr=scr; id=i; }
01513 }
01514
01515 if(1+id>0){
01516 TObjArray* objbeg = (TObjArray*)(begbnk.At(id));
01517 TObjArray* objend = (TObjArray*)(endbnk.At(id));
01518 TrackSegmentAtNu* seg0 = (TrackSegmentAtNu*)(objbeg->First());
01519 for(i=1;i<1+objbeg->GetLast();i++){
01520 TrackSegmentAtNu* segbeg = (TrackSegmentAtNu*)(objbeg->At(i));
01521 seg0->AddSegment(segbeg); segbeg->SetUID(-1);
01522 }
01523 for(i=1;i<1+objend->GetLast();i++){
01524 TrackSegmentAtNu* segend = (TrackSegmentAtNu*)(objend->At(i));
01525 seg0->AddSegment(segend); segend->SetUID(-1);
01526 }
01527 seg0->SetUID(3);
01528 for(i=0;i<1+seg0->GetClrLast();i++){
01529 ClusterAtNu* clr = (ClusterAtNu*)(seg0->GetClrAt(i));
01530 clr->SetTrkFlag(3);
01531 }
01532 cont=1; ntrks++;
01533 }
01534 }
01535
01536 MSG("AlgAtNuReco", Msg::kVerbose) << " ... about to delete beg/end... " << endl;
01537 DELOBJCTR+=1+begbnk.GetLast(); DELOBJCTR+=1+endbnk.GetLast();
01538 begbnk.Delete(); endbnk.Delete();
01539 MSG("AlgAtNuReco", Msg::kVerbose) << " beg/end deleted ... " << endl;
01540 }
01541 }
01542 }
01543
01544 // Print out list of 2D tracks
01545 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF 2D TRACKS *** " << endl;
01546 for(vuw=0;vuw<2;vuw++){
01547 MSG("AlgAtNuReco", Msg::kVerbose) << "view: " << vuw << endl;
01548 for(i=0;i<1+segbnk[vuw].GetLast();i++){
01549 TrackSegmentAtNu* segment = (TrackSegmentAtNu*)(segbnk[vuw].At(i));
01550 if(segment->GetUID()>2){
01551 MSG("AlgAtNuReco", Msg::kVerbose) << " i=" << i
01552 << " begpln: " << segment->GetBegPlane()
01553 << " begstr: " << segment->GetBegStrip()
01554 << " endpln: " << segment->GetEndPlane()
01555 << " endstr: " << segment->GetEndStrip() << endl;
01556 }
01557 }
01558 }
01559
01560 gettimeofday(&tpafter,0);
01561 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
01562 fTime_TrackAtNu+=dtime;
01563
01564
01565 // *************************************************
01566 // * F O R M A T I O N O F 2 D S H O W E R S *
01567 // *************************************************
01568
01569 gettimeofday(&tpbefore,0);
01570
01571 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of 2D showers *** " << endl;
01572 Int_t nshws,maxshws;
01573 if(1+segbnk2[0].GetLast()>0 && 1+segbnk2[1].GetLast()>0){
01574 for(vuw=0;vuw<2;vuw++){
01575
01576 cont=1; nshws=0; maxshws=4;
01577 while(cont){
01578 cont=0;
01579
01580 // select segments
01581 tmp1.Clear(); tmp2.Clear();
01582 for(i=0;i<1+segbnk2[vuw].GetLast();i++){
01583 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(segbnk2[vuw].At(i));
01584 if(seg->GetUID()>0 && seg->GetUID()<3){
01585 ctr=0;
01586 for(j=0;j<1+seg->GetClrLast();j++){
01587 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
01588 if( clr->GetShwPlnFlag()>0 && clr->GetShwFlag()>1 && clr->GetShwFlag()<3 ) ctr++;
01589 }
01590 if( nshws>0 && ctr<1 ) seg->SetUID(0);
01591 }
01592 if(seg->GetUID()==2) tmp1.Add(seg); if(seg->GetUID()==1) tmp2.Add(seg);
01593 }
01594
01595 if(1+tmp1.GetLast()==0){
01596 for(i=0;i<1+tmp2.GetLast();i++){
01597 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(tmp2.At(i));
01598 tmp1.Add(seg);
01599 }
01600 }
01601
01602 // determine primary segment
01603 npln=0; id=-1; topscr=0.0;
01604 for(i=0;i<1+tmp1.GetLast();i++){
01605 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(tmp1.At(i));
01606 npts = 1+(seg->GetEndPlane()-seg->GetBegPlane())/2;
01607 if(npts>npln-3){
01608 scr=seg->GetScore();
01609 if(npts>npln || scr>topscr){
01610 npln=npts; topscr=scr;
01611 id=i;
01612 }
01613 }
01614 }
01615
01616 // propagate primary segment
01617 if(1+id>0){
01618 ShowerSegmentAtNu* seg0 = (ShowerSegmentAtNu*)(tmp1.At(id));
01619
01620 mod=(Int_t)((seg0->GetEndPlane())/(modpln+1));
01621 seg0->SetUID(3);
01622 cont=1; nshws++;
01623
01624 ctr=1;
01625 while(ctr>0){
01626 ctr=0;
01627
01628 // add associated clusters
01629 pln0 = -4 + seg0->GetBegPlane();
01630 npln = 5 + (seg0->GetEndPlane()-seg0->GetBegPlane())/2;
01631 for(k=0;k<npln;k++){
01632 k0 = pln0+2*k;
01633 if(k0>mod*(modpln+1) && k0<(mod+1)*(modpln+1)){
01634 for(k1=0;k1<1+clrplnbnk[k0].GetLast();k1++){
01635 ClusterAtNu* clr1 = (ClusterAtNu*)(clrplnbnk[k0].At(k1));
01636 if(clr1->GetShwFlag()<2){
01637 assoc=seg0->IsShwAssoc(clr1);
01638 if( ( assoc>0 && clr1->GetTrkFlag()<3 )
01639 || ( assoc>1 && clr1->GetPlane()-seg0->GetBegPlane()>0 && seg0->GetEndPlane()-clr1->GetPlane()>0 ) ){
01640 seg0->AddCluster(clr1);
01641 clr1->SetShwFlag(2); ctr++;
01642 }
01643 }
01644 }
01645 }
01646 }
01647
01648 // add associated segments
01649 for(i=0;i<1+segbnk2[vuw].GetLast();i++){
01650 ShowerSegmentAtNu* segtmp = (ShowerSegmentAtNu*)(segbnk2[vuw].At(i));
01651 if( segtmp->GetUID()>0 && segtmp->GetUID()<3
01652 && (Int_t)((segtmp->GetEndPlane())/(modpln+1))==mod ){
01653 assoc=seg0->IsShwAssoc(segtmp);
01654 if(assoc>0){
01655 seg0->AddSegment(segtmp);
01656 segtmp->SetUID(-1); ctr++;
01657 }
01658 }
01659 }
01660
01661 }
01662
01663 for(i=0;i<1+seg0->GetClrLast();i++){
01664 ClusterAtNu* clr = (ClusterAtNu*)(seg0->GetClrAt(i));
01665 clr->SetShwFlag(3);
01666 }
01667
01668 }
01669
01670 }
01671 }
01672 }
01673
01674 // Print out list of 2D showers
01675 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF 2D SHOWERS *** " << endl;
01676 for(vuw=0;vuw<2;vuw++){
01677 MSG("AlgAtNuReco", Msg::kVerbose) << "view: " << vuw << endl;
01678 for(i=0;i<1+segbnk2[vuw].GetLast();i++){
01679 ShowerSegmentAtNu* segment = (ShowerSegmentAtNu*)(segbnk2[vuw].At(i));
01680 if(segment->GetUID()>2){
01681 MSG("AlgAtNuReco", Msg::kVerbose) << " i=" << i
01682 << " begpln: " << segment->GetBegPlane()
01683 << " begstr: " << segment->GetBegStrip()
01684 << " endpln: " << segment->GetEndPlane()
01685 << " endstr: " << segment->GetEndStrip() << endl;
01686 }
01687 }
01688 }
01689
01690 gettimeofday(&tpafter,0);
01691 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
01692 fTime_ShowerAtNu+=dtime;
01693
01694
01695 // ******************************************
01696 // * C O M P A R E U / V V I E W S (2) *
01697 // ******************************************
01698
01699 MSG("AlgAtNuReco", Msg::kDebug) << " *** matching views (2) *** " << endl;
01700
01701 gettimeofday(&tpbefore,0);
01702
01703 // match tracks
01704 TObjArray tmptrk[2],tmptrkseg[2];
01705 Int_t dstr,dpln,dpln1,dpln2;
01706 Int_t bpln2,bpln1,epln1,epln2;
01707 Int_t jnflag2[2];
01708 for(i=0;i<1+segbnk[0].GetLast();i++){
01709 TrackSegmentAtNu* segu = (TrackSegmentAtNu*)(segbnk[0].At(i));
01710 if(segu->GetUID()>2){
01711 for(j=0;j<1+segbnk[1].GetLast();j++){
01712 TrackSegmentAtNu* segv = (TrackSegmentAtNu*)(segbnk[1].At(j));
01713 if(segv->GetUID()>2){
01714 if( ( (segv->GetBegPlane()-segu->GetBegPlane()>-10
01715 && segv->GetBegPlane()-segu->GetBegPlane()<10)
01716 || (segv->GetEndPlane()-segu->GetEndPlane()>-10
01717 && segv->GetEndPlane()-segu->GetEndPlane()<10) )
01718 && ( segv->GetEndPlane()-segu->GetBegPlane()>2
01719 && segu->GetEndPlane()-segv->GetBegPlane()>2 )
01720 && ( segv->GetEndTime()-segu->GetBegTime()>-fTimeWin
01721 && segu->GetEndTime()-segv->GetBegTime()>-fTimeWin ) ){
01722 tmptrkseg[0].Add(segu); tmptrkseg[1].Add(segv);
01723 }
01724 }
01725 }
01726 }
01727 }
01728
01729 if(modnum>1){
01730 TObjArray* tmpmod = new TObjArray[2*(modnum-1)]; NEWOBJCTR+=2*(modnum-1);
01731 for(i=0;i<2*(modnum-1);i++){
01732 for(j=0;j<2;j++){
01733 TObjArray* tmparr = new TObjArray(); NEWOBJCTR++;
01734 tmpmod[i].Add(tmparr);
01735 }
01736 }
01737
01738 for(i=0;i<1+tmptrkseg[0].GetLast();i++){
01739 TrackSegmentAtNu* segu = (TrackSegmentAtNu*)(tmptrkseg[0].At(i));
01740 TrackSegmentAtNu* segv = (TrackSegmentAtNu*)(tmptrkseg[1].At(i));
01741 mod=(Int_t)((segu->GetEndPlane())/(modpln+1));
01742 if( segu->GetBegPlane()<mod*(modpln+1)+20
01743 && segv->GetBegPlane()<mod*(modpln+1)+20
01744 && mod>0 ){
01745 TObjArray* tmparrum = (TObjArray*)(tmpmod[2*mod-1].At(0));
01746 TObjArray* tmparrvm = (TObjArray*)(tmpmod[2*mod-1].At(1));
01747 tmparrum->Add(segu); tmparrvm->Add(segv);
01748 }
01749 if( segu->GetEndPlane()>(mod+1)*(modpln+1)-20
01750 && segv->GetEndPlane()>(mod+1)*(modpln+1)-20
01751 && mod<modnum-1 ){
01752 TObjArray* tmparru = (TObjArray*)(tmpmod[2*mod].At(0));
01753 TObjArray* tmparrv = (TObjArray*)(tmpmod[2*mod].At(1));
01754 tmparru->Add(segu); tmparrv->Add(segv);
01755 }
01756 }
01757
01758 for(mod=0;mod<modnum-1;mod++){
01759 TObjArray* tmparru = (TObjArray*)(tmpmod[2*mod].At(0));
01760 TObjArray* tmparrv = (TObjArray*)(tmpmod[2*mod].At(1));
01761 TObjArray* tmparrup = (TObjArray*)(tmpmod[2*mod+1].At(0));
01762 TObjArray* tmparrvp = (TObjArray*)(tmpmod[2*mod+1].At(1));
01763
01764 if( 1+tmparru->GetLast()>0 && 1+tmparrup->GetLast()>0 ){
01765
01766 cont=1;
01767 while(cont){
01768 cont=0;
01769 idm=-1; idp=-1; topscr=0;
01770 for(i=0;i<1+tmparru->GetLast();i++){
01771 TrackSegmentAtNu* segum = (TrackSegmentAtNu*)(tmparru->At(i));
01772 TrackSegmentAtNu* segvm = (TrackSegmentAtNu*)(tmparrv->At(i));
01773 if( (segum->GetPartner()==segvm && segvm->GetPartner()==segum)
01774 || (segum->GetPartner()==0 && segvm->GetPartner()==0
01775 && segum->GetUID()>2 && segvm->GetUID()>2) ){
01776 for(j=0;j<1+tmparrup->GetLast();j++){
01777 TrackSegmentAtNu* segup = (TrackSegmentAtNu*)(tmparrup->At(j));
01778 TrackSegmentAtNu* segvp = (TrackSegmentAtNu*)(tmparrvp->At(j));
01779 if(segup->GetUID()>2 && segvp->GetUID()>2){
01780 if( segum->IsEndAssoc(segup) && segvm->IsEndAssoc(segvp) ){
01781 if(segum->GetBegPlane()<=segvm->GetBegPlane()){
01782 bpln2=segum->GetBegPlane(); bpln1=segvm->GetBegPlane(); }
01783 if(segvm->GetBegPlane()<=segum->GetBegPlane()){
01784 bpln2=segvm->GetBegPlane(); bpln1=segum->GetBegPlane(); }
01785 if(segup->GetEndPlane()>=segvp->GetEndPlane()){
01786 epln2=segup->GetEndPlane(); epln1=segvp->GetEndPlane(); }
01787 if(segvp->GetEndPlane()>=segup->GetEndPlane()){
01788 epln2=segvp->GetEndPlane(); epln1=segup->GetEndPlane(); }
01789 dpln1=epln2-bpln2; dpln2=epln1-bpln1;
01790 scr=dpln2*dpln2/dpln1;
01791 if(scr>topscr){
01792 idm=i; idp=j; topscr=scr;
01793 }
01794 }
01795 }
01796 }
01797 }
01798 }
01799 if(1+idm>0 && 1+idp>0){
01800 TrackSegmentAtNu* segum = (TrackSegmentAtNu*)(tmparru->At(idm));
01801 TrackSegmentAtNu* segvm = (TrackSegmentAtNu*)(tmparrv->At(idm));
01802 TrackSegmentAtNu* segup = (TrackSegmentAtNu*)(tmparrup->At(idp));
01803 TrackSegmentAtNu* segvp = (TrackSegmentAtNu*)(tmparrvp->At(idp));
01804 segup->AddSegment(segum); segup->SetPartner(segvp);
01805 segum->SetUID(-1); segum->SetPartner(0);
01806 segvp->AddSegment(segvm); segvp->SetPartner(segup);
01807 segvm->SetUID(-1); segvm->SetPartner(0);
01808 cont=1;
01809 }
01810 }
01811 }
01812 }
01813
01814 for(i=0;i<2*(modnum-1);i++){
01815 DELOBJCTR+=1+tmpmod[i].GetLast(); tmpmod[i].Delete();
01816 }
01817 delete [] tmpmod; DELOBJCTR+=2*(modnum-1);
01818 }
01819
01820 // determine other best matched tracks
01821 cont=1;
01822 while(cont){
01823 cont=0;
01824 id=-1; topscr=0.0;
01825 for(i=0;i<1+tmptrkseg[0].GetLast();i++){
01826 TrackSegmentAtNu* segu = (TrackSegmentAtNu*)(tmptrkseg[0].At(i));
01827 TrackSegmentAtNu* segv = (TrackSegmentAtNu*)(tmptrkseg[1].At(i));
01828 if( segu->GetPartner()==segv && segv->GetPartner()==segu
01829 && segu->GetUID()<4 && segv->GetUID()<4 ){
01830 tmptrk[0].Add(segu); tmptrk[1].Add(segv);
01831 segu->SetUID(4); segv->SetUID(4);
01832 }
01833 else{
01834 if( segu->GetPartner()==0 && segv->GetPartner()==0
01835 && segu->GetUID()>2 && segv->GetUID()>2 ){
01836 if(segu->GetBegPlane()<=segv->GetBegPlane()){
01837 bpln2=segu->GetBegPlane(); bpln1=segv->GetBegPlane(); }
01838 if(segv->GetBegPlane()<=segu->GetBegPlane()){
01839 bpln2=segv->GetBegPlane(); bpln1=segu->GetBegPlane(); }
01840 if(segu->GetEndPlane()>=segv->GetEndPlane()){
01841 epln2=segu->GetEndPlane(); epln1=segv->GetEndPlane(); }
01842 if(segv->GetEndPlane()>=segu->GetEndPlane()){
01843 epln2=segv->GetEndPlane(); epln1=segu->GetEndPlane(); }
01844 dpln1=epln2-bpln2; dpln2=epln1-bpln1;
01845 scr=dpln2*dpln2/dpln1;
01846 if(scr>topscr){
01847 topscr=scr; id=i;
01848 }
01849 }
01850 }
01851 }
01852 if(1+id>0){
01853 TrackSegmentAtNu* segu = (TrackSegmentAtNu*)(tmptrkseg[0].At(id));
01854 TrackSegmentAtNu* segv = (TrackSegmentAtNu*)(tmptrkseg[1].At(id));
01855 segu->SetPartner(segv); segv->SetPartner(segu);
01856 cont=1;
01857 }
01858 }
01859
01860 ntrks=1+tmptrk[0].GetLast();
01861 for(vuw=0;vuw<2;vuw++){
01862 for(i=0;i<1+tmptrk[vuw].GetLast();i++){
01863 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmptrk[vuw].At(i));
01864 for(j=0;j<1+seg->GetClrLast();j++){
01865 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
01866 clr->SetTrkFlag(4);
01867 }
01868 }
01869 }
01870
01871 gettimeofday(&tpafter,0);
01872 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
01873 fTime_TrackAtNu+=dtime;
01874
01875 gettimeofday(&tpbefore,0);
01876
01877 // match showers
01878 TObjArray tmpshw[2],tmpshwseg[2];
01879 for(i=0;i<1+segbnk2[0].GetLast();i++){
01880 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(segbnk2[0].At(i));
01881 if(segu->GetUID()>2){
01882 for(j=0;j<1+segbnk2[1].GetLast();j++){
01883 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(segbnk2[1].At(j));
01884 if(segv->GetUID()>2){
01885 if( ( segu->GetEndPlane()-segv->GetBegPlane()>-2
01886 && segv->GetEndPlane()-segu->GetBegPlane()>-2)
01887 && ( segu->GetEndTime()-segv->GetBegTime()>-fTimeWin
01888 && segv->GetEndTime()-segu->GetBegTime()>-fTimeWin ) ){
01889 tmpshwseg[0].Add(segu); tmpshwseg[1].Add(segv);
01890 }
01891 }
01892 }
01893 }
01894 }
01895
01896 // match showers that intersect tracks
01897 TObjArray tmpclr[2],tmpseg[2];
01898 if(1+tmptrk[0].GetLast()>0){
01899 for(i=0;i<1+tmptrk[0].GetLast();i++){
01900
01901 for(vuw=0;vuw<2;vuw++){
01902 tmpclr[vuw].Clear(); tmpseg[vuw].Clear();
01903 }
01904
01905 for(vuw=0;vuw<2;vuw++){
01906 TrackSegmentAtNu* segtrk = (TrackSegmentAtNu*)(tmptrk[vuw].At(i));
01907 for(j=0;j<1+segtrk->GetClrLast();j++){
01908 ClusterAtNu* clr = (ClusterAtNu*)(segtrk->GetClrAt(j));
01909 if(clr->GetShwFlag()>2) tmpclr[vuw].Add(clr);
01910 }
01911 }
01912
01913 if(1+tmpclr[0].GetLast()>0 && 1+tmpclr[1].GetLast()>0){
01914 for(j=0;j<1+tmpshwseg[0].GetLast();j++){
01915 for(vuw=0;vuw<2;vuw++){
01916 jnflag2[vuw]=0;
01917 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(tmpshwseg[vuw].At(j));
01918 if(seg->GetPartner()==0){
01919 for(k=0;k<1+tmpclr[vuw].GetLast();k++){
01920 ClusterAtNu* clr = (ClusterAtNu*)(tmpclr[vuw].At(k));
01921 if(seg->ContainsClr(clr)) jnflag2[vuw]=1;
01922 }
01923 }
01924 }
01925 if(jnflag2[0]>0 && jnflag2[1]>0){
01926 for(vuw=0;vuw<2;vuw++){
01927 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(tmpshwseg[vuw].At(j));
01928 tmpseg[vuw].Add(seg);
01929 }
01930 }
01931 }
01932 }
01933
01934 if(1+tmpseg[0].GetLast()>0 && 1+tmpseg[1].GetLast()>0){
01935 cont=1;
01936 while(cont){
01937 cont=0;
01938 id=-1; topscr=0.0;
01939 for(j=0;j<1+tmpseg[0].GetLast();j++){
01940 ShowerSegmentAtNu* segshwu = (ShowerSegmentAtNu*)(tmpseg[0].At(j));
01941 ShowerSegmentAtNu* segshwv = (ShowerSegmentAtNu*)(tmpseg[1].At(j));
01942 if( segshwu->GetPartner()==0 && segshwv->GetPartner()==0
01943 && segshwu->GetUID()>2 && segshwv->GetUID()>2 ){
01944 dpln1=segshwu->GetEndPlane()-segshwv->GetBegPlane();
01945 dpln2=segshwv->GetEndPlane()-segshwu->GetBegPlane();
01946 if(dpln1<=dpln2) scr=dpln1; if(dpln2<=dpln1) scr=dpln2;
01947 if(scr>topscr){
01948 id=j; scr=topscr;
01949 }
01950 }
01951 }
01952 if(1+id>0){
01953 ShowerSegmentAtNu* segshwu = (ShowerSegmentAtNu*)(tmpseg[0].At(id));
01954 ShowerSegmentAtNu* segshwv = (ShowerSegmentAtNu*)(tmpseg[1].At(id));
01955 segshwu->SetPartner(segshwv); segshwv->SetPartner(segshwu);
01956 cont=1;
01957 }
01958 }
01959 }
01960 }
01961 }
01962
01963 // determine other best matched showers
01964 cont=1;
01965 while(cont){
01966 cont=0;
01967 id=-1; topscr=0.0;
01968 for(i=0;i<1+tmpshwseg[1].GetLast();i++){
01969 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(tmpshwseg[0].At(i));
01970 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(tmpshwseg[1].At(i));
01971 if( segu->GetPartner()==segv && segv->GetPartner()==segu
01972 && segu->GetUID()<4 && segv->GetUID()<4 ){
01973 tmpshw[0].Add(segu); tmpshw[1].Add(segv);
01974 segu->SetUID(4); segv->SetUID(4);
01975 }
01976 else{
01977 if( segu->GetPartner()==0 && segv->GetPartner()==0
01978 && segu->GetUID()>2 && segv->GetUID()>2 ){
01979 dpln1 = segu->GetEndPlane()-segv->GetBegPlane();
01980 dpln2 = segv->GetEndPlane()-segu->GetBegPlane();
01981 if(dpln1<=dpln2) scr=dpln1; if(dpln2<=dpln1) scr=dpln2;
01982 if(scr>topscr){
01983 topscr=scr; id=i;
01984 }
01985 }
01986 }
01987 }
01988 if(1+id>0){
01989 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(tmpshwseg[0].At(id));
01990 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(tmpshwseg[1].At(id));
01991 segu->SetPartner(segv); segv->SetPartner(segu);
01992 cont=1;
01993 }
01994 }
01995
01996 nshws=1+tmpshw[0].GetLast();
01997 for(vuw=0;vuw<2;vuw++){
01998 for(i=0;i<1+tmpshw[vuw].GetLast();i++){
01999 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(tmpshw[vuw].At(i));
02000 for(j=0;j<1+seg->GetClrLast();j++){
02001 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
02002 clr->SetShwFlag(4);
02003 }
02004 }
02005 }
02006
02007 gettimeofday(&tpafter,0);
02008 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02009 fTime_ShowerAtNu+=dtime;
02010
02011
02012 // *************************************
02013 // * R E S E E D I N G S H O W E R S *
02014 // *************************************
02015
02016 if( 1+tmpshw[0].GetLast()==0 && 1+tmpshw[1].GetLast()==0
02017 && 1+tmptrk[0].GetLast()==0 && 1+tmptrk[1].GetLast()==0 ){
02018
02019 gettimeofday(&tpbefore,0);
02020
02021 // low-multiplicity showers
02022 MSG("AlgAtNuReco",Msg::kDebug) << " reseeding low muliplicity showers " << endl;
02023
02024 for(vuw=0;vuw<2;vuw++){
02025 tmpclr[vuw].Clear(); tmpseg[vuw].Clear(); tmpshwseg[vuw].Clear();
02026 }
02027
02028 // reseed clusters
02029 for(mod=0;mod<modnum;mod++){
02030 for(pln=1;pln<1+modpln;pln++){
02031 i=pln+mod*(modpln+1);
02032 for(j=0;j<1+clrplnbnk[i].GetLast();j++){
02033 ClusterAtNu* clr0 = (ClusterAtNu*)(clrplnbnk[i].At(j));
02034 clr0->SetShwFlag(0);
02035 npts=0;
02036 for(k=-4;k<5;k++){
02037 k0=i+k;
02038 if(k0>mod*(modpln+1) && k0<(mod+1)*(modpln+1)){
02039 for(k1=0;k1<1+clrplnbnk[k0].GetLast();k1++){
02040 ClusterAtNu* clr1 = (ClusterAtNu*)(clrplnbnk[k0].At(k1));
02041 if(clr0->GetCharge()>1.0 && clr1->GetCharge()>1.0){
02042 npts+=1+clr1->GetHitLast();
02043 }
02044 }
02045 }
02046 }
02047 if(npts>3){
02048 vuw=clr0->GetPlaneView(); tmpclr[vuw].Add(clr0); clr0->SetShwFlag(1);
02049 }
02050 }
02051 }
02052 }
02053
02054 // reseed 2D showers
02055 if(1+tmpclr[0].GetLast()>0 && 1+tmpclr[1].GetLast()>0){
02056 for(vuw=0;vuw<2;vuw++){
02057 for(i=0;i<1+tmpclr[vuw].GetLast();i++){
02058 ClusterAtNu* clr0 = (ClusterAtNu*)(tmpclr[vuw].At(i));
02059 if(clr0->GetShwFlag()>0 && clr0->GetShwFlag()<2){
02060 ShowerSegmentAtNu* seg0 = new ShowerSegmentAtNu(clr0); NEWOBJCTR++;
02061 tmpseg[vuw].Add(seg0); shwsegbnk.Add(seg0);
02062 seg0->SetUID(2); seg0->SetReseedFlag(1);
02063 mod=(Int_t)((clr0->GetPlane())/(modpln+1)); clr0->SetShwFlag(2);
02064 ctr=1;
02065 while(ctr>0){
02066 ctr=0;
02067 pln0=-6+seg0->GetBegPlane();
02068 npln=7+(seg0->GetEndPlane()-seg0->GetBegPlane())/2;
02069 for(k=0;k<npln;k++){
02070 k0=pln0+2*k;
02071 if(k0>mod*(modpln+1) && k0<(mod+1)*(modpln+1)){
02072 for(k1=0;k1<1+clrplnbnk[k0].GetLast();k1++){
02073 ClusterAtNu* clr1 = (ClusterAtNu*)(clrplnbnk[k0].At(k1));
02074 if( clr1->GetShwFlag()>0 && clr1->GetShwFlag()<2
02075 && seg0->IsDiffuseShwAssoc(clr1)>0 ){
02076 seg0->AddCluster(clr1);
02077 clr1->SetShwFlag(2); ctr++;
02078 }
02079 }
02080 }
02081 }
02082 }
02083 }
02084 }
02085 }
02086 }
02087
02088 MSG("AlgAtNuReco",Msg::kVerbose) << " low multiplicity 2D showers - U=" << 1+tmpseg[0].GetLast()
02089 << " V=" << 1+tmpseg[1].GetLast() << endl;
02090
02091 // reseed 3D showers
02092 if( 1+tmpseg[0].GetLast()>0 && 1+tmpseg[1].GetLast()>0 ){
02093
02094 for(i=0;i<1+tmpseg[0].GetLast();i++){
02095 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(tmpseg[0].At(i));
02096 for(j=0;j<1+tmpseg[1].GetLast();j++){
02097 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(tmpseg[1].At(j));
02098 if( 1+segu->GetHitLast()>2 || 1+segv->GetHitLast()>2
02099 && segu->GetEndPlane()-segv->GetBegPlane()>-4
02100 && segv->GetEndPlane()-segu->GetBegPlane()>-4 ){
02101 tmpshwseg[0].Add(segu); tmpshwseg[1].Add(segv);
02102 }
02103 }
02104 }
02105
02106 id=-1; topscr=0.0;
02107 for(i=0;i<1+tmpshwseg[0].GetLast();i++){
02108 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(tmpshwseg[0].At(i));
02109 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(tmpshwseg[1].At(i));
02110 scr=1+segu->GetHitLast()+segv->GetHitLast();
02111 if(scr>topscr){
02112 topscr=scr; id=i;
02113 }
02114 }
02115
02116 if(1+id>0){
02117 ShowerSegmentAtNu* segu = (ShowerSegmentAtNu*)(tmpshwseg[0].At(id));
02118 ShowerSegmentAtNu* segv = (ShowerSegmentAtNu*)(tmpshwseg[1].At(id));
02119 segu->SetPartner(segv); segv->SetPartner(segu);
02120 segu->SetUID(4); segv->SetUID(4);
02121 tmpshw[0].Add(segu); tmpshw[1].Add(segv);
02122 }
02123
02124 }
02125
02126 gettimeofday(&tpafter,0);
02127 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02128 fTime_ShowerAtNu+=dtime;
02129 }
02130
02131
02132 // ***********************************************
02133 // * F O R M A T I O N O F 3 D T R A C K S *
02134 // ***********************************************
02135
02136 gettimeofday(&tpbefore,0);
02137
02138 // Form tracks
02139 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of 3D tracks *** " << endl;
02140 Int_t km1,kp1;
02141 Double_t swx,swy,swx2,swxy,sw;
02142 Double_t w,x,y,m,c;
02143 Int_t ustrps,vstrps,trkstrps,trkplns;
02144 Int_t bplnvuw[2],eplnvuw[2];
02145 for(i=0;i<1+tmptrk[0].GetLast();i++){
02146
02147 MSG("AlgAtNuReco", Msg::kVerbose) << " making track " << i << endl;
02148
02149 // beg/end planes
02150 bpln2=-1; epln2=-1;
02151 for(vuw=0;vuw<2;vuw++){
02152 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmptrk[vuw].At(i));
02153 if(bpln2<0 || seg->GetBegPlane()<bpln2) bpln2=seg->GetBegPlane();
02154 if(epln2<0 || seg->GetEndPlane()>epln2) epln2=seg->GetEndPlane();
02155 }
02156
02157 bpln1=-1; epln1=-1;
02158 for(vuw=0;vuw<2;vuw++){
02159 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmptrk[vuw].At(i));
02160 if(bpln1<0 || seg->GetBegPlane()>bpln2) bpln1=seg->GetBegPlane();
02161 if(epln1<0 || seg->GetEndPlane()<epln2) epln1=seg->GetEndPlane();
02162 }
02163
02164 for(vuw=0;vuw<2;vuw++){
02165 bplnvuw[vuw]=-1; eplnvuw[vuw]=-1;
02166 }
02167
02168 MSG("AlgAtNuReco", Msg::kVerbose)
02169 << bpln2 << " (" << bpln1 << ") -> (" << epln1 << ") " << epln2 << endl;
02170
02171 // unpack segments
02172 npln=1+epln2-bpln2;
02173 Int_t* strlst = new Int_t[npln]; NEWOBJCTR+=npln;
02174 Int_t* vuwlst = new Int_t[npln]; NEWOBJCTR+=npln;
02175 TObjArray* clrlst = new TObjArray[npln]; NEWOBJCTR+=npln;
02176 TObjArray* hitlst = new TObjArray[npln]; NEWOBJCTR+=npln;
02177 for(pln=0;pln<npln;pln++){
02178 strlst[pln]=-1; vuwlst[pln]=-1;
02179 }
02180
02181 for(vuw=0;vuw<2;vuw++){
02182 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmptrk[vuw].At(i));
02183 for(j=0;j<1+seg->GetClrLast();j++){
02184 ClusterAtNu* clr = (ClusterAtNu*)(seg->GetClrAt(j));
02185 pln = clr->GetPlane()-bpln2;
02186 if( pln>=0 && pln<npln ){
02187 clrlst[pln].Add(clr);
02188 }
02189 }
02190 }
02191
02192 // trim segments
02193 bpln1=bpln1-4;
02194 km=-1; pln=bpln1-bpln2; if(pln<0) pln=0;
02195 while(km<0 && pln<npln){
02196 if(1+clrlst[pln].GetLast()>0) km=pln; else pln++;
02197 }
02198 if(km>-1 && km+4<npln && 1+clrlst[km+2].GetLast()==0){
02199 if(1+clrlst[km+4].GetLast()>0){
02200 ClusterAtNu* clr = (ClusterAtNu*)(clrlst[km+4].First());
02201 if(clr->GetTrkPlnFlag()>0 && clr->GetShwPlnFlag()==0) km=bpln1-bpln2;
02202 }
02203 bpln1=bpln2+km;
02204 }
02205
02206 epln1=epln1+4;
02207 kp=-1; pln=epln1-bpln2; if(pln>npln-1) pln=npln-1;
02208 while(kp<0 && pln>-1){
02209 if(1+clrlst[pln].GetLast()>0) kp=pln; else pln--;
02210 }
02211 if(kp>-1 && kp-4>-1 && 1+clrlst[kp-2].GetLast()==0){
02212 if(1+clrlst[kp-4].GetLast()>0){
02213 ClusterAtNu* clr = (ClusterAtNu*)(clrlst[kp-4].First());
02214 if(clr->GetTrkPlnFlag()>0 && clr->GetShwPlnFlag()==0) kp=epln1-bpln2;
02215 }
02216 epln1=bpln2+kp;
02217 }
02218
02219 ustrps=0; vstrps=0; trkstrps=0;
02220 for(pln=0;pln<npln;pln++){
02221 if( bpln2+pln>bpln1 && bpln2+pln<epln1
02222 && 1+clrlst[pln].GetLast()>0 ){
02223 ClusterAtNu* clr = (ClusterAtNu*)(clrlst[pln].First());
02224 vuw = clr->GetPlaneView();
02225 vuwlst[pln]=vuw; strlst[pln]=1;
02226 if(bplnvuw[vuw]<0||bpln2+pln<bplnvuw[vuw]) bplnvuw[vuw]=bpln2+pln;
02227 if(eplnvuw[vuw]<0||bpln2+pln>eplnvuw[vuw]) eplnvuw[vuw]=bpln2+pln;
02228 if(vuw==0) ustrps++; if(vuw==1) vstrps++;
02229 if(clr->GetTrkPlnFlag()>0) trkstrps++;
02230 }
02231 }
02232
02233 MSG("AlgAtNuReco", Msg::kVerbose)
02234 << " U: (" << bplnvuw[0] << "," << eplnvuw[0] << ") "
02235 << " V: (" << bplnvuw[1] << "," << eplnvuw[1] << ") " << endl;
02236
02237 if( ustrps>2 && vstrps>2 && trkstrps>2 ){
02238
02239 // sort track planes
02240 for(vuw=0;vuw<2;vuw++){
02241 for(pln=0;pln<npln;pln++){
02242 if(vuwlst[pln]==vuw && strlst[pln]>0){
02243
02244 ClusterAtNu* clr0 = (ClusterAtNu*)(clrlst[pln].First());
02245 k=0; km1=-1;
02246 while(pln-k>0 && km1<0){
02247 k++; if(vuwlst[pln-k]==vuw) km1=k;
02248 }
02249 k=0; kp1=-1;
02250 while(pln+k<npln-1 && kp1<0){
02251 k++; if(vuwlst[pln+k]==vuw) kp1=k;
02252 }
02253
02254 if(km1>0 && kp1>0){
02255 ClusterAtNu* clrp1 = (ClusterAtNu*)(clrlst[pln+kp1].First());
02256 ClusterAtNu* clrm1 = (ClusterAtNu*)(clrlst[pln-km1].First());
02257 if( ( clrm1->GetPlane()>bplnvuw[vuw]
02258 || ( clr0->GetPlane()-clrm1->GetPlane()<3
02259 && clr0->GetTrkPlnFlag()>0 ) )
02260 && ( clrp1->GetPlane()<eplnvuw[vuw]
02261 || ( clrp1->GetPlane()-clr0->GetPlane()<3
02262 && clr0->GetTrkPlnFlag()>0 ) ) ){
02263 if(clr0->IsTrkAssoc(clrm1,clrp1)>1){
02264 strlst[pln]=3;
02265 if( ( clrp1->GetBegStrip()-clr0->GetEndStrip()>-1
02266 && clr0->GetBegStrip()-clrm1->GetEndStrip()>-1 )
02267 || ( clrp1->GetEndStrip()-clr0->GetBegStrip()<1
02268 && clr0->GetEndStrip()-clrm1->GetBegStrip()<1 ) ){
02269 if( clr0->GetPlane()-clrm1->GetPlane()<3
02270 && clrm1->GetTrkPlnFlag()>-1 ){ strlst[pln-km1]=3; }
02271 if( clrp1->GetPlane()-clr0->GetPlane()<3
02272 && clrp1->GetTrkPlnFlag()>-1 ){ strlst[pln+kp1]=3; }
02273 }
02274 }
02275 else{
02276 if( 1+clr0->GetEndStrip()-clr0->GetBegStrip()<3
02277 && clr0->GetTrkPlnFlag()>0 ){ strlst[pln]=3; }
02278 }
02279 }
02280 }
02281
02282 }
02283 }
02284 }
02285
02286 MSG("AlgAtNuReco", Msg::kVerbose) << " *** SORT TRACK HITS *** " << endl;
02287 for(pln=0;pln<npln;pln++){
02288 if( vuwlst[pln]>-1 ){
02289 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrlst[pln].First());
02290 MSG("AlgAtNuReco", Msg::kVerbose) << " " << pln << " " << clrtmp->GetPlane()
02291 << " " << clrtmp->GetBegStrip() << " " << clrtmp->GetEndStrip()
02292 << " " << strlst[pln] << endl;
02293 }
02294 }
02295
02296 // perform global linear fits
02297 for(vuw=0;vuw<2;vuw++){
02298 for(pln=0;pln<npln;pln++){
02299 if(vuwlst[pln]==vuw && strlst[pln]<2){
02300
02301 MSG("AlgAtNuReco", Msg::kVerbose) << " *** GLOBAL FIT *** pln=" << pln << endl;
02302
02303 k=0; kp=-1;
02304 while(pln+k<epln1-bpln2 && pln+k<npln-1 && kp<0){
02305 k++; if(vuwlst[pln+k]==vuw && strlst[pln+k]>2) kp=k;
02306 }
02307
02308 k=0; km=-1;
02309 while(pln-k>bpln1-bpln2 && pln-k>0 && km<0){
02310 k++; if(vuwlst[pln-k]==vuw && strlst[pln-k]>2) km=k;
02311 }
02312
02313 if(km>0){ km1=0-km-7; k1=0-km; } else{ km1=(bpln1-bpln2)-pln+1; k1=(bpln1-bpln2)-pln+1; }
02314 if(pln+km1<0){ km1=0-pln; } if(pln+k1<0){ k1=0-pln; }
02315 if(kp>0){ kp1=1+kp+7; k2=1+kp; } else{ kp1=(epln1-bpln2)-pln; k2=(epln1-bpln2)-pln; }
02316 if(pln+kp1>npln){ kp1=npln-pln; } if(pln+k2>npln){ k2=npln-pln; }
02317
02318 ClusterAtNu* clrseed = (ClusterAtNu*)(clrlst[pln].First());
02319 m=0.0; c=0.5*(clrseed->GetBegStrip()+clrseed->GetEndStrip());
02320 swx=0.0; swy=0.0; swx2=0.0; swxy=0.0; sw=0.0;
02321 for(k=km1;k<kp1;k++){
02322 if(vuwlst[pln+k]==vuw){
02323 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrlst[pln+k].First());
02324 for(l=0;l<1+clrtmp->GetHitLast();l++){
02325 HitAtNu* hittmp = (HitAtNu*)(clrtmp->GetHitAt(l));
02326 x=hittmp->GetZPos(); y=hittmp->GetStrip();
02327 w=hittmp->GetCharge()/clrtmp->GetCharge();
02328 if(strlst[pln+k]>2) w=5.0*w; else w=0.5*w;
02329 swx+=w*x; swy+=w*y; swx2+=w*x*x; swxy+=w*x*y; sw+=w;
02330 }
02331 }
02332 }
02333 if(sw>0.0){
02334 m=(sw*swxy-swx*swy)/(sw*swx2-swx*swx);
02335 c=(swy*swx2-swx*swxy)/(sw*swx2-swx*swx);
02336 }
02337
02338 for(k=k1;k<k2;k++){
02339 if(vuwlst[pln+k]==vuw && strlst[pln+k]<2){
02340 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrlst[pln+k].First());
02341 strw = m*clrtmp->GetZPos()+c;
02342 if(m>=0.0) strdw = 0.6+0.02*m; if(m<=0) strdw = 0.6-0.02*m;
02343 MSG("AlgAtNuReco", Msg::kVerbose) << " pln=" << pln+k << " strw=" << strw << " strdw=" << strdw << " (" << clrtmp->GetBegStrip() << " " << clrtmp->GetEndStrip() << ") " << endl;
02344 if( (km>0 && kp>0) || (km<0 && kp<0)
02345 || (clrtmp->GetEndStrip()>strw-1.6 && clrtmp->GetBegStrip()<strw+1.6) ){
02346 id=-1; dscr=0.0; scr=999.9;
02347 for(l=0;l<1+clrtmp->GetHitLast();l++){
02348 HitAtNu* hit = (HitAtNu*)(clrtmp->GetHitAt(l));
02349 dscr=hit->GetStrip()-strw; if(dscr<0) dscr=-dscr;
02350 if(dscr<scr){
02351 id=l; scr=dscr;
02352 }
02353 }
02354 if(1+id>0){
02355 HitAtNu* hit = (HitAtNu*)(clrtmp->GetHitAt(id));
02356 ClusterAtNu* clrnew = new ClusterAtNu(hit); clrbnk.Add(clrnew); NEWOBJCTR++;
02357 clrlst[pln+k].Add(clrnew); strlst[pln+k]=2;
02358 for(l=0;l<1+clrtmp->GetHitLast();l++){
02359 HitAtNu* hittmp = (HitAtNu*)(clrtmp->GetHitAt(l));
02360 if( ( hittmp->GetStrip()-hit->GetStrip()>0
02361 && hittmp->GetStrip()-hit->GetStrip()<strdw)
02362 || ( hittmp->GetStrip()-hit->GetStrip()<0
02363 && hittmp->GetStrip()-hit->GetStrip()>-strdw) ){
02364 clrnew->AddHit(hittmp);
02365 }
02366 }
02367 for(l=0;l<1+clrnew->GetHitLast();l++){
02368 HitAtNu* hittmp = (HitAtNu*)(clrnew->GetHitAt(l));
02369 MSG("AlgAtNuReco", Msg::kVerbose) << " ... add hit=" << hittmp->GetStrip() << " (" << pln+k << ") " << endl;
02370 }
02371 }
02372 }
02373 }
02374 }
02375 }
02376
02377 }
02378 }
02379
02380 // perform local linear fits
02381 for(vuw=0;vuw<2;vuw++){
02382 for(pln=0;pln<npln;pln++){
02383 if(vuwlst[pln]==vuw && strlst[pln]>1){
02384
02385 MSG("AlgAtNuReco", Msg::kVerbose) << " *** FIT (2) *** pln=" << pln << endl;
02386
02387 ClusterAtNu* clr = (ClusterAtNu*)(clrlst[pln].Last());
02388 strw=0.5*(clr->GetBegStrip()+clr->GetEndStrip());
02389 strdw=0.6;
02390
02391 if(1+clr->GetHitLast()>1){
02392 for(k=0;k<1+clr->GetHitLast();k++){
02393 HitAtNu* hit = (HitAtNu*)(clr->GetHitAt(k));
02394 hit->SetTrkFlag(1);
02395 }
02396 swx=0.0; swy=0.0; swx2=0.0; swxy=0.0; sw=0.0;
02397 for(k=-4;k<5;k++){
02398 if( pln+k>=0 && pln+k<npln
02399 && vuwlst[pln+k]==vuw && strlst[pln+k]>1 ){
02400 ClusterAtNu* clrtmp = (ClusterAtNu*)(clrlst[pln+k].Last());
02401 for(l=0;l<1+clrtmp->GetHitLast();l++){
02402 HitAtNu* hittmp = (HitAtNu*)(clrtmp->GetHitAt(l));
02403 x=hittmp->GetZPos(); y=hittmp->GetStrip();
02404 w=hittmp->GetCharge()/clrtmp->GetCharge();
02405 swx+=w*x; swy+=w*y; swx2+=w*x*x; swxy+=w*x*y; sw+=w;
02406 }
02407 }
02408 }
02409 if(sw>1.0){
02410 m=(sw*swxy-swx*swy)/(sw*swx2-swx*swx);
02411 c=(swy*swx2-swx*swxy)/(sw*swx2-swx*swx);
02412 strw=m*clr->GetZPos()+c;
02413 if(m>=0.0) strdw = 0.6+0.02*m; if(m<=0) strdw = 0.6-0.02*m;
02414 }
02415 }
02416
02417 MSG("AlgAtNuReco", Msg::kVerbose) << " pln=" << pln << " strw=" << strw << " strdw=" << strdw << endl;
02418
02419 id=-1; dscr=0.0; scr=999.0;
02420 for(k=0;k<1+clr->GetHitLast();k++){
02421 HitAtNu* hit = (HitAtNu*)(clr->GetHitAt(k));
02422 dscr=hit->GetStrip()-strw; if(dscr<0) dscr=-dscr;
02423 if(dscr<scr){
02424 id=k; scr=dscr;
02425 }
02426 }
02427 if(1+id>0){
02428 HitAtNu* hit = (HitAtNu*)(clr->GetHitAt(id));
02429 hitlst[pln].Add(hit); strlst[pln]=4;
02430 for(k=0;k<1+clr->GetHitLast();k++){
02431 HitAtNu* hittmp = (HitAtNu*)(clr->GetHitAt(k));
02432 if( ( hittmp->GetStrip()-hit->GetStrip()>0
02433 && hittmp->GetStrip()-hit->GetStrip()<strdw)
02434 || ( hittmp->GetStrip()-hit->GetStrip()<0
02435 && hittmp->GetStrip()-hit->GetStrip()>-strdw) ){
02436 hitlst[pln].Add(hittmp);
02437 }
02438 }
02439 }
02440 for(l=0;l<1+hitlst[pln].GetLast();l++){
02441 HitAtNu* hittmp = (HitAtNu*)(hitlst[pln].At(l));
02442 MSG("AlgAtNuReco", Msg::kVerbose) << " ... add hit=" << hittmp->GetStrip() << " (" << pln << ") " << endl;
02443 }
02444 }
02445 }
02446 }
02447
02448 // form tracks
02449 trkplns=0;
02450 for(pln=0;pln<npln;pln++){
02451 if( strlst[pln]>3 ){
02452 trkplns++;
02453 }
02454 }
02455
02456 if(trkplns>5){
02457 for(vuw=0;vuw<2;vuw++){
02458 TrackSegmentAtNu* seg = (TrackSegmentAtNu*)(tmptrk[vuw].At(i));
02459 TrackAtNu* trk = new TrackAtNu(slice); trkbnk[vuw].Add(trk); NEWOBJCTR++;
02460 if(seg->GetReseedFlag()||fObjMaxFlag) jnflag2[vuw]=1; else jnflag2[vuw]=0;
02461 for(pln=0;pln<npln;pln++){
02462 if(vuwlst[pln]==vuw && strlst[pln]>3){
02463 for(k=0;k<1+hitlst[pln].GetLast();k++){
02464 HitAtNu* hit = (HitAtNu*)(hitlst[pln].At(k));
02465 hit->SetTrkFlag(2); trk->AddHit(hit);
02466 }
02467 }
02468 }
02469 }
02470 TrackAtNu* trku = (TrackAtNu*)(trkbnk[0].Last());
02471 TrackAtNu* trkv = (TrackAtNu*)(trkbnk[1].Last());
02472 trku->SetPartner(trkv); trkv->SetPartner(trku);
02473
02474 if(jnflag2[0]>0 && jnflag2[1]>0){
02475 trku->SetReseedFlag(1); trkv->SetReseedFlag(1);
02476 }
02477 }
02478
02479 }
02480
02481 delete [] strlst; DELOBJCTR+=npln;
02482 delete [] vuwlst; DELOBJCTR+=npln;
02483 delete [] clrlst; DELOBJCTR+=npln;
02484 delete [] hitlst; DELOBJCTR+=npln;
02485 }
02486
02487 // Print out list of tracks
02488 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF TRACKS *** " << endl;
02489 for(vuw=0;vuw<2;vuw++){
02490 for(i=0;i<1+trkbnk[vuw].GetLast();i++){
02491 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02492 MSG("AlgAtNuReco", Msg::kVerbose)
02493 << " " << vuw << " " << i
02494 << " " << trk->GetBegPlane() << " " << trk->GetBegStrip()
02495 << " " << trk->GetEndPlane() << " " << trk->GetEndStrip() << endl;
02496 }
02497 }
02498
02499 gettimeofday(&tpafter,0);
02500 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02501 fTime_TrackAtNu+=dtime;
02502
02503
02504 // *************************************************
02505 // * F O R M A T I O N O F 3 D S H O W E R S *
02506 // *************************************************
02507
02508 gettimeofday(&tpbefore,0);
02509
02510 // Form showers
02511 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of 3D showers *** " << endl;
02512 for(i=0;i<1+tmpshw[0].GetLast();i++){
02513
02514 MSG("AlgAtNuReco", Msg::kVerbose) << " making shower " << i << endl;
02515
02516 for(vuw=0;vuw<2;vuw++){
02517 ShowerSegmentAtNu* seg = (ShowerSegmentAtNu*)(tmpshw[vuw].At(i));
02518 ShowerAtNu* shw = new ShowerAtNu(slice); shwbnk[vuw].Add(shw); NEWOBJCTR++;
02519 if(seg->GetReseedFlag()||fObjMaxFlag) jnflag2[vuw]=1; else jnflag2[vuw]=0;
02520 for(j=0;j<1+seg->GetHitLast();j++){
02521 HitAtNu* hit = (HitAtNu*)(seg->GetHitAt(j));
02522 shw->AddHit(hit); hit->SetShwFlag(2);
02523 }
02524 }
02525 ShowerAtNu* shwu = (ShowerAtNu*)(shwbnk[0].Last());
02526 ShowerAtNu* shwv = (ShowerAtNu*)(shwbnk[1].Last());
02527 shwu->SetPartner(shwv); shwv->SetPartner(shwu);
02528
02529 if(jnflag2[0]>0 && jnflag2[1]>0){
02530 shwu->SetReseedFlag(1); shwv->SetReseedFlag(1);
02531 }
02532 }
02533
02534
02535 // *********************************************************
02536 // * F O R M A T I O N O F V E R T E X S H O W E R S *
02537 // *********************************************************
02538
02539 if(fVtxFlag){
02540 MSG("AlgAtNuReco", Msg::kDebug) << " *** formation of vertex showers *** " << endl;
02541
02542 Int_t shwflag=0;
02543 for(i=0;i<1+shwbnk[0].GetLast();i++){
02544 if(shwflag==0){
02545 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[0].At(i));
02546 if(shw->GetReseedFlag()||1) shwflag=1;
02547 }
02548 }
02549
02550 TObjArray tmphittrk[2],tmphitbeg[2],tmphitend[2];
02551 for(i=0;i<1+trkbnk[0].GetLast();i++){
02552
02553 // beginning vertex shower (existing)
02554 for(vuw=0;vuw<2;vuw++){
02555 tmpclr[vuw].Clear();
02556 tmphittrk[vuw].Clear(); tmphitbeg[vuw].Clear();
02557 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02558 for(j=0;j<1+trk->GetHitLast();j++){
02559 HitAtNu* hit = (HitAtNu*)(trk->GetHitAt(j));
02560 if( hit->GetPlane()<trk->GetBegPlane()+9
02561 && 2*hit->GetPlane()<trk->GetBegPlane()+trk->GetEndPlane()+1
02562 && (Int_t)((hit->GetPlane())/(modpln+1))==(Int_t)((trk->GetBegPlane())/(modpln+1)) ){
02563 tmphittrk[vuw].Add(hit);
02564 }
02565 }
02566 }
02567
02568 for(j=0;j<1+shwbnk[0].GetLast();j++){
02569 for(vuw=0;vuw<2;vuw++){
02570 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02571 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(j));
02572 jnflag2[vuw]=0;
02573 if( shw->GetBegPlane()<trk->GetBegPlane()+9
02574 && 2*shw->GetBegPlane()<trk->GetBegPlane()+trk->GetEndPlane()+1
02575 && (Int_t)((shw->GetBegPlane())/(modpln+1))==(Int_t)((trk->GetBegPlane())/(modpln+1)) ){
02576 for(k=0;k<1+tmphittrk[vuw].GetLast();k++){
02577 if(jnflag2[vuw]==0){
02578 HitAtNu* hit = (HitAtNu*)(tmphittrk[vuw].At(k));
02579 if(shw->IsDiffuseShwAssoc(hit)>0) jnflag2[vuw]=1;
02580 }
02581 }
02582 }
02583 }
02584 if(jnflag2[0]>0 || jnflag2[1]>0){
02585 for(vuw=0;vuw<2;vuw++){
02586 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(j));
02587 tmpclr[vuw].Add(shw);
02588 }
02589 }
02590 }
02591
02592 if( 1+tmpclr[0].GetLast()>0 && 1+tmpclr[1].GetLast()>0 ){
02593 id=-1; topscr=9999.9;
02594 for(j=0;j<1+tmpclr[0].GetLast();j++){
02595 ShowerAtNu* shwu = (ShowerAtNu*)(tmpclr[0].At(j));
02596 ShowerAtNu* shwv = (ShowerAtNu*)(tmpclr[1].At(j));
02597 scr = shwu->GetBegPlane()+shwv->GetBegPlane();
02598 if(scr<topscr){
02599 topscr=scr; id=j;
02600 }
02601 }
02602 if(1+id>0){
02603 MSG("AlgAtNuReco", Msg::kVerbose) << " found existing beginning vertex shower " << endl;
02604 for(vuw=0;vuw<2;vuw++){
02605 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02606 ShowerAtNu* shw = (ShowerAtNu*)(tmpclr[vuw].At(id));
02607 trk->SetBegVtxShower(shw); shw->AddAssocTrack(trk); shw->SetBegVtxFlag(1);
02608 }
02609 }
02610 }
02611
02612 // beginning vertex shower (new)
02613 else{
02614 if( shwflag==0 && i==0 ){
02615 for(vuw=0;vuw<2;vuw++){
02616 tmphitbeg[vuw].Clear();
02617 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02618
02619 mod=(Int_t)((trk->GetBegPlane())/(modpln+1));
02620 for(j=-3;j<4;j++){
02621 pln=trk->GetBegPlane()+2*j;
02622 if( 2*pln<trk->GetBegPlane()+trk->GetEndPlane()+1
02623 && pln>mod*(modpln+1) && pln<(mod+1)*(modpln+1) ){
02624 for(k=0;k<1+hitplnbnk[pln].GetLast();k++){
02625 HitAtNu* hit = (HitAtNu*)(hitplnbnk[pln].At(k));
02626 if( hit->GetShwFlag()<2
02627 && ( hit->GetTrkFlag()<2 || hit->GetCharge()>50 ) ){
02628 jnflag=0;
02629 for(l=0;l<1+tmphittrk[vuw].GetLast();l++){
02630 if(jnflag==0){
02631 HitAtNu* hittrk = (HitAtNu*)(tmphittrk[vuw].At(l));
02632 if( hittrk->GetPlane()<trk->GetBegPlane()+7
02633 && hittrk->IsDiffuseShwAssoc(hit)>0 ){
02634 tmphitbeg[vuw].Add(hit); hit->SetShwFlag(1); jnflag=1;
02635 }
02636 }
02637 }
02638 }
02639 }
02640 }
02641 }
02642
02643 if(1+tmphitbeg[vuw].GetLast()>0){
02644 bpln=trk->GetBegPlane()-6; epln=trk->GetBegPlane()+6;
02645 ctr=1;
02646 while(ctr>0){
02647 ctr=0;
02648 pln0=bpln-4; npln=5+(epln-bpln)/2;
02649 for(j=0;j<npln;j++){
02650 pln=pln0+2*j;
02651 if(pln>mod*(modpln+1) && pln<(mod+1)*(modpln+1)){
02652 for(k=0;k<1+hitplnbnk[pln].GetLast();k++){
02653 HitAtNu* hit = (HitAtNu*)(hitplnbnk[pln].At(k));
02654 if(hit->GetShwFlag()<1 && hit->GetTrkFlag()<1){
02655 jnflag=0;
02656 for(l=0;l<1+tmphitbeg[vuw].GetLast();l++){
02657 if(jnflag==0){
02658 HitAtNu* hitshw = (HitAtNu*)(tmphitbeg[vuw].At(l));
02659 if( hitshw->IsDiffuseShwAssoc(hit)>0 ){
02660 tmphitbeg[vuw].Add(hit); hit->SetShwFlag(1);
02661 if(hit->GetPlane()<bpln) bpln=hit->GetPlane();
02662 if(hit->GetPlane()>epln) epln=hit->GetPlane();
02663 jnflag=1; ctr++;
02664 }
02665 }
02666 }
02667 }
02668 }
02669 }
02670 }
02671 }
02672 for(j=0;j<1+tmphitbeg[vuw].GetLast();j++){
02673 HitAtNu* hit = (HitAtNu*)(tmphitbeg[vuw].At(j));
02674 hit->SetShwFlag(0);
02675 }
02676 }
02677
02678 }
02679 }
02680 }
02681
02682 // end vertex shower (existing)
02683 for(vuw=0;vuw<2;vuw++){
02684 tmpclr[vuw].Clear();
02685 tmphittrk[vuw].Clear(); tmphitend[vuw].Clear();
02686 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02687 for(j=0;j<1+trk->GetHitLast();j++){
02688 HitAtNu* hit = (HitAtNu*)(trk->GetHitAt(j));
02689 if( hit->GetPlane()>trk->GetEndPlane()-9
02690 && 2*hit->GetPlane()>trk->GetBegPlane()+trk->GetEndPlane()-1
02691 && (Int_t)((hit->GetPlane())/(modpln+1))==(Int_t)((trk->GetEndPlane())/(modpln+1)) ){
02692 tmphittrk[vuw].Add(hit);
02693 }
02694 }
02695 }
02696
02697 for(j=0;j<1+shwbnk[0].GetLast();j++){
02698 for(vuw=0;vuw<2;vuw++){
02699 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02700 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(j));
02701 jnflag2[vuw]=0;
02702 if( shw->GetEndPlane()>trk->GetEndPlane()-9
02703 && 2*shw->GetEndPlane()>trk->GetBegPlane()+trk->GetEndPlane()-1
02704 && (Int_t)((shw->GetEndPlane())/(modpln+1))==(Int_t)((trk->GetEndPlane())/(modpln+1)) ){
02705 for(k=0;k<1+tmphittrk[vuw].GetLast();k++){
02706 if(jnflag2[vuw]==0){
02707 HitAtNu* hit = (HitAtNu*)(tmphittrk[vuw].At(k));
02708 if(shw->IsDiffuseShwAssoc(hit)>0) jnflag2[vuw]=1;
02709 }
02710 }
02711 }
02712 }
02713 if(jnflag2[0]>0 || jnflag2[1]>0){
02714 for(vuw=0;vuw<2;vuw++){
02715 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(j));
02716 tmpclr[vuw].Add(shw);
02717 }
02718 }
02719 }
02720
02721 if( 1+tmpclr[0].GetLast()>0 && 1+tmpclr[1].GetLast()>0 ){
02722 id=-1; topscr=-9999.9;
02723 for(j=0;j<1+tmpclr[0].GetLast();j++){
02724 ShowerAtNu* shwu = (ShowerAtNu*)(tmpclr[0].At(j));
02725 ShowerAtNu* shwv = (ShowerAtNu*)(tmpclr[1].At(j));
02726 scr = shwu->GetEndPlane()+shwv->GetEndPlane();
02727 if(scr>topscr){
02728 topscr=scr; id=j;
02729 }
02730 }
02731 if(1+id>0){
02732 MSG("AlgAtNuReco", Msg::kVerbose) << " found existing end vertex shower " << endl;
02733 for(vuw=0;vuw<2;vuw++){
02734 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02735 ShowerAtNu* shw = (ShowerAtNu*)(tmpclr[vuw].At(id));
02736 trk->SetEndVtxShower(shw); shw->AddAssocTrack(trk); shw->SetEndVtxFlag(1);
02737 }
02738 }
02739 }
02740
02741 // end vertex shower (new)
02742 else{
02743 if( shwflag==0 && i==0 ){
02744 for(vuw=0;vuw<2;vuw++){
02745 tmphitend[vuw].Clear();
02746 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02747
02748 mod=(Int_t)((trk->GetEndPlane())/(modpln+1));
02749 for(j=-3;j<4;j++){
02750 pln=trk->GetEndPlane()+2*j;
02751 if( 2*pln>trk->GetBegPlane()+trk->GetEndPlane()-1
02752 && pln>mod*(modpln+1) && pln<(mod+1)*(modpln+1) ){
02753 for(k=0;k<1+hitplnbnk[pln].GetLast();k++){
02754 HitAtNu* hit = (HitAtNu*)(hitplnbnk[pln].At(k));
02755 if( hit->GetShwFlag()<2
02756 && ( hit->GetTrkFlag()<2 || hit->GetCharge()>50 ) ){
02757 jnflag=0;
02758 for(l=0;l<1+tmphittrk[vuw].GetLast();l++){
02759 if(jnflag==0){
02760 HitAtNu* hittrk = (HitAtNu*)(tmphittrk[vuw].At(l));
02761 if( hittrk->GetPlane()>trk->GetEndPlane()-7
02762 && hittrk->IsDiffuseShwAssoc(hit)>0 ){
02763 tmphitend[vuw].Add(hit); hit->SetShwFlag(1); jnflag=1;
02764 }
02765 }
02766 }
02767 }
02768 }
02769 }
02770 }
02771
02772 if(1+tmphitend[vuw].GetLast()>0){
02773 bpln=trk->GetEndPlane()-6; epln=trk->GetEndPlane()+6;
02774 ctr=1;
02775 while(ctr>0){
02776 ctr=0;
02777 pln0=bpln-4; npln=5+(epln-bpln)/2;
02778 for(j=0;j<npln;j++){
02779 pln=pln0+2*j;
02780 if(pln>mod*(modpln+1) && pln<(mod+1)*(modpln+1)){
02781 for(k=0;k<1+hitplnbnk[pln].GetLast();k++){
02782 HitAtNu* hit = (HitAtNu*)(hitplnbnk[pln].At(k));
02783 if(hit->GetShwFlag()<1 && hit->GetTrkFlag()<1){
02784 jnflag=0;
02785 for(l=0;l<1+tmphitend[vuw].GetLast();l++){
02786 if(jnflag==0){
02787 HitAtNu* hitshw = (HitAtNu*)(tmphitend[vuw].At(l));
02788 if( hitshw->IsDiffuseShwAssoc(hit)>0 ){
02789 tmphitend[vuw].Add(hit); hit->SetShwFlag(1);
02790 if(hit->GetPlane()<bpln) bpln=hit->GetPlane();
02791 if(hit->GetPlane()>epln) epln=hit->GetPlane();
02792 jnflag=1; ctr++;
02793 }
02794 }
02795 }
02796 }
02797 }
02798 }
02799 }
02800 }
02801 for(j=0;j<1+tmphitend[vuw].GetLast();j++){
02802 HitAtNu* hit = (HitAtNu*)(tmphitend[vuw].At(j));
02803 hit->SetShwFlag(0);
02804 }
02805 }
02806
02807 }
02808 }
02809 }
02810
02811 if( 1+tmphitbeg[0].GetLast()>0 && 1+tmphitbeg[1].GetLast()>0 ){
02812 MSG("AlgAtNuReco", Msg::kVerbose) << " found new vertex shower at beginning of track " << endl;
02813 for(vuw=0;vuw<2;vuw++){
02814 ShowerAtNu* shw = new ShowerAtNu(slice); NEWOBJCTR++;
02815 for(j=0;j<1+tmphitbeg[vuw].GetLast();j++){
02816 HitAtNu* hit = (HitAtNu*)(tmphitbeg[vuw].At(j));
02817 shw->AddHit(hit); hit->SetShwFlag(2);
02818 }
02819 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02820 trk->SetBegVtxShower(shw); shw->AddAssocTrack(trk);
02821 shw->SetBegVtxFlag(1); shw->SetReseedFlag(1);
02822 shwbnk[vuw].Add(shw);
02823 }
02824 }
02825
02826 if( 1+tmphitend[0].GetLast()>0 && 1+tmphitend[1].GetLast()>0 ){
02827 MSG("AlgAtNuReco", Msg::kVerbose) << " found new vertex shower at end of track " << endl;
02828 for(vuw=0;vuw<2;vuw++){
02829 ShowerAtNu* shw = new ShowerAtNu(slice); NEWOBJCTR++;
02830 for(j=0;j<1+tmphitend[vuw].GetLast();j++){
02831 HitAtNu* hit = (HitAtNu*)(tmphitend[vuw].At(j));
02832 shw->AddHit(hit); hit->SetShwFlag(2);
02833 }
02834 TrackAtNu* trk = (TrackAtNu*)(trkbnk[vuw].At(i));
02835 trk->SetEndVtxShower(shw); shw->AddAssocTrack(trk);
02836 shw->SetEndVtxFlag(1); shw->SetReseedFlag(1);
02837 shwbnk[vuw].Add(shw);
02838 }
02839 }
02840
02841 }
02842 }
02843
02844
02845 // *********************************************
02846 // * M O P U P R E M A I N I N G H I T S *
02847 // *********************************************
02848
02849 // Mopping up remaining hits
02850 MSG("AlgAtNuReco", Msg::kDebug) << " *** mop up remaining hits *** " << endl;
02851 Double_t shwwinplns,shwwinstrps;
02852 if( 1+shwbnk[0].GetLast()>0 ){
02853 shwwinplns=8; shwwinstrps=12;
02854 if(1+trkbnk[0].GetLast()==0){
02855 shwwinplns=16; shwwinstrps=25; }
02856 for(mod=0;mod<modnum;mod++){
02857 for(pln=1;pln<1+modpln;pln++){
02858 i=pln+mod*(modpln+1);
02859 for(j=0;j<1+hitplnbnk[i].GetLast();j++){
02860 HitAtNu* hit = (HitAtNu*)(hitplnbnk[i].At(j));
02861 if(hit->GetShwFlag()<1 && hit->GetTrkFlag()<1){
02862 vuw = hit->GetPlaneView();
02863 id=-1; scr=shwwinplns+shwwinstrps;
02864 for(k=0;k<1+shwbnk[vuw].GetLast();k++){
02865 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(k));
02866 if( (Int_t)((shw->GetEndPlane())/(modpln+1)) == mod ){
02867 for(l=0;l<1+shw->GetHitLast();l++){
02868 if(1+shwbnk[vuw].GetLast()>1 || id<0){
02869 HitAtNu* hittmp = (HitAtNu*)(shw->GetHitAt(l));
02870 if( (hittmp->GetShwFlag()>1)
02871 && (hit->GetTrkFlag()<1||hittmp->IsShwAssoc(hit)>0) ){
02872 dpln=hit->GetPlane()-hittmp->GetPlane(); if(dpln<0) dpln=-dpln;
02873 dstr=hit->GetStrip()-hittmp->GetStrip(); if(dstr<0) dstr=-dstr;
02874 if( dpln<shwwinplns && dstr<shwwinstrps && dpln+dstr<scr ){
02875 id=k; scr=dpln+dstr;
02876 }
02877 }
02878 }
02879 }
02880 }
02881 }
02882 if(1+id>0){
02883 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(id));
02884 shw->AddHit(hit); hit->SetShwFlag(1);
02885 }
02886 }
02887 }
02888 }
02889 }
02890 }
02891
02892 // Print list of showers
02893 MSG("AlgAtNuReco", Msg::kVerbose) << " *** LIST OF SHOWERS *** " << endl;
02894 for(vuw=0;vuw<2;vuw++){
02895 MSG("AlgAtNuReco", Msg::kVerbose) << "view: " << vuw << endl;
02896 for(i=0;i<1+shwbnk[vuw].GetLast();i++){
02897 ShowerAtNu* shw = (ShowerAtNu*)(shwbnk[vuw].At(i));
02898 MSG("AlgAtNuReco", Msg::kVerbose)
02899 << " i=" << i << " "
02900 << shw->GetBegPlane() << " " << shw->GetBegStrip() << " "
02901 << shw->GetEndPlane() << " " << shw->GetEndStrip() << endl;
02902 }
02903 }
02904
02905 gettimeofday(&tpafter,0);
02906 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02907 fTime_ShowerAtNu+=dtime;
02908
02909 // ***************************************************
02910 // * D E L E T E T E M P O R A R Y O B J E C T S *
02911 // ***************************************************
02912
02913 // clear/delete hit/cluster objects
02914 gettimeofday(&tpbefore,0);
02915 for(i=0;i<fEndPln;i++){
02916 hitplnbnk[i].Clear(); // hit plane bank
02917 xtalkplnbnk[i].Clear();// xtalk plane bank
02918 clrplnbnk[i].Clear(); // cluster plane bank
02919 }
02920 DELOBJCTR+=1+clrbnk.GetLast(); clrbnk.Delete(); // cluster bank
02921 gettimeofday(&tpafter,0);
02922 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02923 fTime_TrackAtNu+=0.5*dtime;
02924 fTime_ShowerAtNu+=0.5*dtime;
02925
02926 // clear/delete track segment objects
02927 gettimeofday(&tpbefore,0);
02928 for(i=0;i<fEndPln;i++){
02929 segplnbnk[i].Clear(); // track segment plane bank
02930 }
02931 DELOBJCTR+=1+trksegbnk.GetLast(); trksegbnk.Delete(); // track segment bank
02932 gettimeofday(&tpafter,0);
02933 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02934 fTime_TrackAtNu+=dtime;
02935
02936 // clear/delete shower segment objects
02937 gettimeofday(&tpbefore,0);
02938 DELOBJCTR+=1+shwsegbnk.GetLast(); shwsegbnk.Delete(); // shower segment bank
02939 gettimeofday(&tpafter,0);
02940 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02941 fTime_ShowerAtNu+=dtime;
02942
02943 } // iteration over slices
02944
02945
02946 // *********************************************************
02947 // * F O R M A T I O N O F C A N D X X X H A N D L E S *
02948 // *********************************************************
02949 MSG("AlgAtNuReco", Msg::kDebug) << " Formation of CandXXXHandles " << endl;
02950
02951 // create Singleton Instance of AlgFactory
02952 AlgFactory &af = AlgFactory::GetInstance();
02953
02954 // create CandTrackAtNuListHandle
02955 gettimeofday(&tpbefore,0);
02956
02957 TObjArray* objtrk = 0;
02958 for(itr=0;itr<1+trkbnk[0].GetLast();itr++){
02959 TrackAtNu* trku = (TrackAtNu*)(trkbnk[0].At(itr));
02960 TrackAtNu* trkv = (TrackAtNu*)(trkbnk[1].At(itr));
02961 objtrk = new TObjArray(); NEWOBJCTR++;
02962 objtrk->Add(trku);
02963 objtrk->Add(trkv);
02964 trkcxt.Add(objtrk);
02965 }
02966
02967 MSG("AlgAtNuReco", Msg::kDebug) << "*** CREATE CandTrackAtNuListHandle *** " << endl;
02968 AlgHandle ah_trk = af.GetAlgHandle("AlgTrackAtNuList", "default");
02969 CandContext cx_trk(this, cx.GetMom());
02970 cx_trk.SetCandRecord(cx.GetCandRecord());
02971 cx_trk.SetDataIn(&trkcxt);
02972 CandTrackAtNuListHandle trk_list = CandTrackAtNuList::MakeCandidate(ah_trk, cx_trk);
02973 trk_list.SetName(fListOutTrk.Data());
02974 trk_list.SetTitle(TString("Created by AtNuFindModule from ").Append(slice_list->GetName()));
02975
02976 TIter trkitr(trk_list.GetDaughterIterator());
02977 while(CandTrackAtNuHandle* trk = dynamic_cast<CandTrackAtNuHandle*>(trkitr())){
02978 atnu_handle.AddTrack(trk);
02979 }
02980
02981 gettimeofday(&tpafter,0);
02982 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
02983 fTime_TrackAtNu+=dtime;
02984
02985 // create CandShowerAtNuListHandle
02986 gettimeofday(&tpbefore,0);
02987
02988 TObjArray* objshw = 0;
02989 for(itr=0;itr<1+shwbnk[0].GetLast();itr++){
02990 ShowerAtNu* shwu = (ShowerAtNu*)(shwbnk[0].At(itr));
02991 ShowerAtNu* shwv = (ShowerAtNu*)(shwbnk[1].At(itr));
02992 objshw = new TObjArray(); NEWOBJCTR++;
02993 objshw->Add(shwu);
02994 objshw->Add(shwv);
02995 shwcxt.Add(objshw);
02996 }
02997
02998 MSG("AlgAtNuReco", Msg::kDebug) << "*** CREATE CandShowerAtNuListHandle *** " << endl;
02999 AlgHandle ah_shw = af.GetAlgHandle("AlgShowerAtNuList", "default");
03000 CandContext cx_shw(this, cx.GetMom());
03001 cx_shw.SetCandRecord(cx.GetCandRecord());
03002 cx_shw.SetDataIn(&shwcxt);
03003 CandShowerAtNuListHandle shw_list = CandShowerAtNuList::MakeCandidate(ah_shw, cx_shw);
03004 shw_list.SetName(fListOutShw.Data());
03005 shw_list.SetTitle(TString("Created by AtNuFindModule from ").Append(slice_list->GetName()));
03006
03007 TIter shwitr(shw_list.GetDaughterIterator());
03008 while(CandShowerAtNuHandle* shw = dynamic_cast<CandShowerAtNuHandle*>(shwitr())){
03009 atnu_handle.AddShower(shw);
03010 }
03011
03012 gettimeofday(&tpafter,0);
03013 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
03014 fTime_ShowerAtNu+=dtime;
03015
03016 // ***************************************************
03017 // * D E L E T E R E M A I N I N G O B J E C T S *
03018 // ***************************************************
03019
03020 // delete hit objects
03021 gettimeofday(&tpbefore,0);
03022 DELOBJCTR+=1+hitbnk.GetLast(); hitbnk.Delete(); // hit bank
03023 gettimeofday(&tpafter,0);
03024 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
03025 fTime_TrackAtNu+=0.5*dtime;
03026 fTime_ShowerAtNu+=0.5*dtime;
03027
03028 // delete track objects
03029 gettimeofday(&tpbefore,0);
03030 for(itr=0;itr<2;itr++){
03031 DELOBJCTR+=1+trkbnk[itr].GetLast(); trkbnk[itr].Delete(); // track bank
03032 }
03033 DELOBJCTR+=1+trkcxt.GetLast(); trkcxt.Delete(); // candcontext for tracks
03034 gettimeofday(&tpafter,0);
03035 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
03036 fTime_TrackAtNu+=dtime;
03037
03038 // delete shower objects
03039 gettimeofday(&tpbefore,0);
03040 for(itr=0;itr<2;itr++){
03041 DELOBJCTR+=1+shwbnk[itr].GetLast(); shwbnk[itr].Delete(); // shower bank
03042 }
03043 DELOBJCTR+=1+shwcxt.GetLast(); shwcxt.Delete(); // candcontext for showers
03044 gettimeofday(&tpafter,0);
03045 dtime=1000.0*(tpafter.tv_sec-tpbefore.tv_sec)+0.001*(tpafter.tv_usec-tpbefore.tv_usec);
03046 fTime_ShowerAtNu+=dtime;
03047
03048
03049 // *************************************************
03050 // * S E T A T N U R E C O P A R A M E T E R S *
03051 // *************************************************
03052
03053 MSG("AlgAtNuReco", Msg::kDebug) << " *** CANDATNURECO PARAMETERS *** " << endl;
03054
03055
03056 Double_t atnurecoscore=0.0;
03057
03058
03059 atnu_handle.SetAtNuRecoScore(atnurecoscore);
03060
03061 gettimeofday(&atnuafter,0);
03062 dtime=1000.0*(atnuafter.tv_sec-atnubefore.tv_sec)+0.001*(atnuafter.tv_usec-atnubefore.tv_usec);
03063 fTime_AtNuReco+=dtime;
03064
03065
03066 // ***************************************************************
03067 // * G I V E C A N D H A N D L E S T O C A N D R E C O R D *
03068 // ***************************************************************
03069
03070 MSG("AlgAtNuReco", Msg::kDebug) << " *** MEMORY BOOK-KEEPING : "
03071 << " new=" << NEWOBJCTR
03072 << " delete=" << DELOBJCTR << endl;
03073
03074 atnu_handle.SetNBlocks(NEWOBJCTR);
03075
03076 trk_list.SetCPUTime(fTime_TrackAtNu);
03077 MSG("AlgAtNuReco", Msg::kDebug) << " *** TRACK RECO TIME = " << fTime_TrackAtNu << endl;
03078
03079 shw_list.SetCPUTime(fTime_ShowerAtNu);
03080 MSG("AlgAtNuReco", Msg::kDebug) << " *** SHOWER RECO TIME = " << fTime_ShowerAtNu << endl;
03081
03082 atnu_handle.SetCPUTime(fTime_AtNuReco);
03083 MSG("AlgAtNuReco", Msg::kDebug) << " *** TOTAL ATNURECO TIME = " << fTime_AtNuReco << endl;
03084
03085
03086 CandRecord* candrec = (CandRecord*)(cx.GetCandRecord());
03087 candrec->SecureCandHandle(trk_list);
03088 candrec->SecureCandHandle(shw_list);
03089
03090 return;
03091
03092 }
|
|
|
Reimplemented from AlgBase. Definition at line 3094 of file AlgAtNuReco.cxx. 03095 {
03096
03097 }
|
|
|
Definition at line 25 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 21 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 24 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 19 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 22 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 30 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 32 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 27 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 29 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 31 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 26 of file AlgAtNuReco.h. Referenced by RunAlg(). |
|
|
Definition at line 20 of file AlgAtNuReco.h. Referenced by RunAlg(). |
1.3.9.1