//_____________________________________________________________________________ void THaVDC::CorrectTimeOfFlight(TClonesArray& tracks) { const static Double_t v = 3.0e-8; // for now, assume that everything travels at c // get scintillator planes THaScintillator* s1 = static_cast<THaScintillator*> ( GetApparatus()->GetDetector("s1") ); THaScintillator* s2 = static_cast<THaScintillator*> ( GetApparatus()->GetDetector("s2") ); if( (s1 == NULL) || (s2 == NULL) ) return; // adjusts caluculated times so that the time of flight to S1 // is the same as a track going through the middle of the VDC // (i.e. x_det = 0) at a 45 deg angle (theta_t and phi_t = 0) // assumes that at least the coarse tracking has been performed Int_t n_exist = tracks.GetLast()+1; //cerr<<"num tracks: "<<n_exist<<endl; for( Int_t t = 0; t < n_exist; t++ ) { THaTrack* track = static_cast<THaTrack*>( tracks.At(t) ); // calculate the correction, since it's on a per track basis Double_t s1_dist, vdc_dist, dist, tdelta; if(!s1->CalcPathLen(track, s1_dist)) s1_dist = 0.0; if(!CalcPathLen(track, vdc_dist)) vdc_dist = 0.0; // since the z=0 of the transport coords is inclined with respect // to the VDC plane, the VDC correction depends on the location of // the track if( track->GetX() < 0 ) dist = s1_dist + vdc_dist; else dist = s1_dist - vdc_dist; tdelta = ( fCentralDist - dist) / v; //cout<<"time correction: "<<tdelta<<endl; // apply the correction Int_t n_clust = track->GetNclusters(); for( Int_t i = 0; i < n_clust; i++ ) { THaVDCUVTrack* the_uvtrack = static_cast<THaVDCUVTrack*>( track->GetCluster(i) ); if( !the_uvtrack ) continue; //FIXME: clusters guaranteed to be nonzero? the_uvtrack->GetUCluster()->SetTimeCorrection(tdelta); the_uvtrack->GetVCluster()->SetTimeCorrection(tdelta); } } }
//_____________________________________________________________________________ Int_t THaVDC::FindVertices( TClonesArray& tracks ) { // Calculate the target location and momentum at the target. // Assumes that CoarseTrack() and FineTrack() have both been called. Int_t n_exist = tracks.GetLast()+1; for( Int_t t = 0; t < n_exist; t++ ) { THaTrack* theTrack = static_cast<THaTrack*>( tracks.At(t) ); CalcTargetCoords(theTrack, kRotatingTransport); } return 0; }
//_____________________________________________________________________________ void THaVDC::FindBadTracks(TClonesArray& tracks) { // Flag tracks that don't intercept S2 scintillator as bad THaScintillator* s2 = static_cast<THaScintillator*> ( GetApparatus()->GetDetector("s2") ); if(s2 == NULL) { //cerr<<"Could not find s2 plane!!"<<endl; return; } Int_t n_exist = tracks.GetLast()+1; for( Int_t t = 0; t < n_exist; t++ ) { THaTrack* track = static_cast<THaTrack*>( tracks.At(t) ); Double_t x2, y2; // project the current x and y positions into the s2 plane if(!s2->CalcInterceptCoords(track, x2, y2)) { x2 = 0.0; y2 = 0.0; } // if the tracks go out of the bounds of the s2 plane, // toss the track out if( (TMath::Abs(x2 - s2->GetOrigin().X()) > s2->GetSize()[0]) || (TMath::Abs(y2 - s2->GetOrigin().Y()) > s2->GetSize()[1]) ) { // for now, we just flag the tracks as bad track->SetFlag( track->GetFlag() | kBadTrack ); //tracks.RemoveAt(t); #ifdef WITH_DEBUG //cout << "Track " << t << " deleted.\n"; #endif } } // get rid of the slots for the deleted tracks //tracks.Compress(); }
void ojtable(const char *className) { static int fTableOffset = 0; if (!fTableOffset) fTableOffset = gObjectTable->IsA()->GetDataMemberOffset("fTable"); // gObjectTable->Print(); TClass *kl; if (className && !*className) className=0; const char *qwe = ".*"; if (className) qwe = className; TRegexp regexp(qwe); int regexpLen=0; int sz = gObjectTable->GetSize(); int *ptr = new int[sz]; int *idx = new int[sz]; TObject **tab = *((TObject ***)((char*)gObjectTable+fTableOffset)); TObject *to; printf ("tab %p[%d]\n",tab,sz); int i,num=0; double hSize=0; int hNumb=0; const char *info_name = 0; for (i=0; i<sz; i++) { to = tab[i]; if (!to) continue; if (!to->TestBit(TObject::kNotDeleted)) continue; int hs = SizeOfH(to); if (hs) { hSize+=hs; hNumb++; } if (className && regexp.Index(to->ClassName(),®expLen)<0) continue; const char *mk = StMkDeb::GetUser(to); if(mk && *mk) printf("%s(%p) in %s\n",to->ClassName(),to,mk); ptr[num++]=int(to); } printf("TH1 N=%d, Size = %g\n",hNumb,hSize); TMath::Sort(num,ptr,idx,0); int last = 0; printf("Selected %d objects\n",num); for (i=0; i<num; i++) { int ix = idx[i]; to = (TObject*)ptr[ix]; int dist = 0; if (i) dist = ptr[ix]-last; last = ptr[ix]; // if ((int)to == 0xc94ff34) { // printf("Skipped %p\n",to); continue; } info_name = "??"; info_name=typeid(*to).name(); kl = to->IsA(); printf ("%4d +%6d : obj = %p(%3d) %s::%s \tinfo=%s\n",i,dist,to,kl->Size(),kl->GetName(),to->GetName(),info_name); if (strcmp("TClonesArray",kl->GetName())) continue; TClonesArray *tcl = ((TClonesArray*)to); printf(" Sizes = %d %d\n",tcl->GetLast()+1,tcl->Capacity()); tcl->ls(""); } delete [] ptr; delete [] idx; }