#include "THaHRS.h"
#include "THaTrackingDetector.h"
#include "THaTrack.h"
#include "THaScintillator.h"
#include "THaVDC.h"
#include "THaTrackProj.h"
#include "THaTriggerTime.h"
#include "TMath.h"
#include "TList.h"
#include "TList.h"
#include "TMath.h"
#ifdef WITH_DEBUG
#include <iostream>
#endif
using namespace std;
THaHRS::THaHRS( const char* name, const char* description ) :
THaSpectrometer( name, description )
{
AddDetector( new THaTriggerTime("trg","Trigger-based time offset"));
AddDetector( new THaVDC("vdc", "Vertical Drift Chamber"));
AddDetector( new THaScintillator("s1", "S1 scintillator"));
AddDetector( new THaScintillator("s2", "S2 scintillator"));
sc_ref = static_cast<THaScintillator*>(GetDetector("s1"));
SetTrSorting(kFALSE);
}
THaHRS::~THaHRS()
{
}
Bool_t THaHRS::SetTrSorting( Bool_t set )
{
if( set )
fProperties |= kSortTracks;
else
fProperties &= ~kSortTracks;
return set;
}
Bool_t THaHRS::GetTrSorting() const
{
return ((fProperties & kSortTracks) != 0);
}
Int_t THaHRS::FindVertices( TClonesArray& tracks )
{
TIter nextTrack( fTrackingDetectors );
nextTrack.Reset();
while( THaTrackingDetector* theTrackDetector =
static_cast<THaTrackingDetector*>( nextTrack() )) {
#ifdef WITH_DEBUG
if( fDebug>1 ) cout << "Call FineTrack() for "
<< theTrackDetector->GetName() << "... ";
#endif
theTrackDetector->FindVertices( tracks );
#ifdef WITH_DEBUG
if( fDebug>1 ) cout << "done.\n";
#endif
}
if( GetTrSorting() )
fTracks->Sort();
if( GetNTracks() > 0 ) {
fGoldenTrack = static_cast<THaTrack*>( fTracks->At(0) );
fTrkIfo = *fGoldenTrack;
fTrk = fGoldenTrack;
} else
fGoldenTrack = NULL;
return 0;
}
Int_t THaHRS::TrackCalc()
{
return TrackTimes( fTracks );
}
Int_t THaHRS::TrackTimes( TClonesArray* Tracks ) {
if ( !Tracks ) return -1;
THaTrack *track=0;
Int_t ntrack = GetNTracks();
for ( Int_t i=0; i < ntrack; i++ ) {
track = static_cast<THaTrack*>(Tracks->At(i));
THaTrackProj* tr_ref = static_cast<THaTrackProj*>
(sc_ref->GetTrackHits()->At(i));
Double_t pathlref = tr_ref->GetPathLen();
Double_t wgt_sum=0.,wx2=0.,wx=0.,wxy=0.,wy=0.;
Int_t ncnt=0;
TIter nextSc( fNonTrackingDetectors );
THaNonTrackingDetector *det;
while ( ( det = static_cast<THaNonTrackingDetector*>(nextSc()) ) ) {
THaScintillator *sc = dynamic_cast<THaScintillator*>(det);
if ( !sc ) continue;
const THaTrackProj *trh = static_cast<THaTrackProj*>(sc->GetTrackHits()->At(i));
Int_t pad = trh->GetChannel();
if (pad<0) continue;
Double_t pathl = (trh->GetPathLen()-pathlref);
Double_t time = (sc->GetTimes())[pad];
Double_t wgt = (sc->GetTuncer())[pad];
if (pathl>.5*kBig || time>.5*kBig) continue;
if (wgt>0) wgt = 1./(wgt*wgt);
else continue;
wgt_sum += wgt;
wx2 += wgt*pathl*pathl;
wx += wgt*pathl;
wxy += wgt*pathl*time;
wy += wgt*time;
ncnt++;
}
Double_t beta = kBig;
Double_t dbeta = kBig;
Double_t time = kBig;
Double_t dt = kBig;
Double_t delta = wgt_sum*wx2-wx*wx;
if (delta != 0.) {
time = (wx2*wy-wx*wxy)/delta;
dt = TMath::Sqrt(wx2/delta);
Double_t invbeta = (wgt_sum*wxy-wx*wy)/delta;
if (invbeta != 0.) {
#if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
Double_t c = TMath::C();
#else
Double_t c = 2.99792458e8;
#endif
beta = 1./(c*invbeta);
dbeta = TMath::Sqrt(wgt_sum/delta)/(c*invbeta*invbeta);
}
}
track->SetBeta(beta);
track->SetdBeta(dbeta);
track->SetTime(time);
track->SetdTime(dt);
}
return 0;
}
ClassImp(THaHRS)
Last change: Sat Nov 7 21:26:47 2009
Last generated: 2009-11-07 21:26
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.