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

DetectorAlignment Class Reference

#include <DetectorAlignment.h>

List of all members.

Public Member Functions

 DetectorAlignment ()
virtual ~DetectorAlignment ()
bool RunAlignment (const CandTrackSRHandle *trackhandle, const CandStripListHandle *cstriplh, NtpAlignmentRecord *ntpalignrec)

Private Member Functions

double FitTrackLessOne (vector< AlignmentStrip >::const_iterator begin, vector< AlignmentStrip >::const_iterator end, vector< AlignmentStrip >::const_iterator skip)
void GetTrackStrips (const CandTrackSRHandle *tkh)
void GetCandStrips (const CandStripListHandle *cslh)
void MakeAlignmentTrack (vector< AlignmentStrip >::iterator begin, vector< AlignmentStrip >::iterator end)
bool StripBelongsToVTrack (const AlignmentStrip &astrip)
bool StripBelongsToUTrack (const AlignmentStrip &astrip)

Private Attributes

vector< AlignmentStripfTrackVStrip
vector< AlignmentStripfTrackUStrip
vector< AlignmentStripfCandVStrip
vector< AlignmentStripfCandUStrip
vector< Double_t > fTrackTimes
double f2dTrackCharge
double fCandVCharge
double fCandUCharge
double f2dTrackResidualRMS
double fUncertaintyInTPosofStrips
double fFita
double fFitb
double fSigmaOfa
double fSigmaOfb
double fCovab
double fDeltaT


Constructor & Destructor Documentation

DetectorAlignment::DetectorAlignment  ) 
 

Definition at line 41 of file DetectorAlignment.cxx.

References MSG.

00042    :f2dTrackCharge(0.0),
00043     fCandVCharge(0.0),
00044     fCandUCharge(0.0),
00045     f2dTrackResidualRMS(0.0),
00046     fUncertaintyInTPosofStrips(0.0),
00047     fFita(0.0),
00048     fFitb(0.0),
00049     fSigmaOfa(0.0),
00050     fSigmaOfb(0.0),
00051     fCovab(0.0),
00052     fDeltaT(0.0)
00053 {
00054    MSG("Align", Msg::kDebug) << "Constructor DetectorAlignment()" << endl;
00055 }

virtual DetectorAlignment::~DetectorAlignment  )  [inline, virtual]
 

Definition at line 38 of file DetectorAlignment.h.

00038 {};


Member Function Documentation

double DetectorAlignment::FitTrackLessOne vector< AlignmentStrip >::const_iterator  begin,
vector< AlignmentStrip >::const_iterator  end,
vector< AlignmentStrip >::const_iterator  skip
[private]
 

Definition at line 302 of file DetectorAlignment.cxx.

References F, fCovab, fFita, fFitb, fSigmaOfa, fSigmaOfb, fUncertaintyInTPosofStrips, MSG, pow(), and run().

Referenced by MakeAlignmentTrack(), and RunAlignment().

00305 {
00306    MSG("Align", Msg::kVerbose) << "FitTrack..." << endl;
00307 
00308    fFita = 0.0;
00309    fFitb = 0.0;
00310    fSigmaOfa = 0.0;
00311    fSigmaOfb = 0.0;
00312    fCovab = 0.0;
00313    fUncertaintyInTPosofStrips = 0.0;
00314 
00315    // Linear regression parameters least squares method. See for eg. Num Rec Ch 15
00316    // Fit y = ax + b, as in W. R. Leo, Techniques for ..., Section 4.7.2
00317    // x is strip's Z position, y is strip's transverse position (U or V).
00318    double A = 0.0, B=0.0, C=0.0, D=0.0, E=0.0, F=0.0, S=0.0;
00319    
00320    for(vector<AlignmentStrip>::const_iterator run = begin; run != end; ++run)
00321    {
00322       if(run != skip)
00323       {
00324          const double &x = run -> zpos;
00325          const double &y = run -> tpos;
00326          A += x;
00327          B += 1.0;
00328          C += y;
00329          D += x*x;
00330          E += x*y;
00331          F += y*y;
00332       }
00333    }
00334    
00335    const double det = B*D - A*A; //determinant of error matrix
00336    if(det < 0.000001)
00337    {
00338       MSG("Align", Msg::kError) << "Linear fit failed!" << endl;
00339       return -100.0;
00340    }
00341    
00342    // The linear fitparameters in y = ax + b
00343    const double a = (E*B-C*A)/det;
00344    const double b = (D*C-E*A)/det;
00345 
00346    if(skip != end)
00347    {
00348       const double skipped_x = skip -> zpos;
00349       const double skipped_y = skip -> tpos;
00350       const double predict   = a*skipped_x + b;       
00351       return (predict - skipped_y);
00352    }
00353    
00354    fFita     = a;
00355    fFitb     = b;
00356    fSigmaOfa = pow(B/det, 0.5);
00357    fSigmaOfb = pow(D/det, 0.5);
00358    fCovab    = -A/det;   
00359 
00360    double npoints = 0.0;
00361    for(vector<AlignmentStrip>::const_iterator run = begin; run != end; ++run)
00362    {
00363       const double &x = run -> zpos;
00364       const double &y = run -> tpos;
00365       S += (y-a*x-b)*(y-a*x-b);
00366       npoints += 1.0;
00367    }
00368    
00369    if(npoints - 2.0 < 0.9){
00370       MSG("Align", Msg::kError) << "Linear fit failed!" << endl;
00371       return -100.0;
00372    }
00373    
00374    //square root of least squares sum
00375    fUncertaintyInTPosofStrips = pow(S/(npoints-2.0), 0.5);
00376 
00377    return fUncertaintyInTPosofStrips;
00378 }

void DetectorAlignment::GetCandStrips const CandStripListHandle cslh  )  [private]
 

Definition at line 204 of file DetectorAlignment.cxx.

References AlignmentStrip::charge, fCandUCharge, fCandUStrip, fCandVCharge, fCandVStrip, CandStripHandle::GetBegTime(), CandStripHandle::GetCharge(), CandHandle::GetDaughterIterator(), CandStripHandle::GetPlaneView(), CandStripHandle::GetStripEndId(), MSG, AlignmentStrip::plexseid, StripBelongsToUTrack(), and StripBelongsToVTrack().

Referenced by RunAlignment().

00205 {
00206    MSG("Align", Msg::kVerbose) << "Separating CandStripHandles from track strips" <<endl
00207                                << "cslh->GetNDaughters() = "<< cslh -> GetNDaughters() 
00208                                << ", cslh->GetTitle() = " << cslh -> GetTitle() <<endl;
00209    fCandVStrip.clear();
00210    fCandUStrip.clear();   
00211    
00212    fCandVCharge = 0.0;
00213    fCandUCharge = 0.0;
00214 
00215    MsgFormat ffmt("%10.9f");
00216    //store ony candidate handles that are not part of CandTrackSRHandle
00217    TIter sitr(cslh->GetDaughterIterator());
00218    while( CandStripHandle* csh = dynamic_cast<CandStripHandle*>(sitr()) ){
00219       MSG("Align", Msg::kVerbose) << "CandStrip: " << csh->GetStripEndId() 
00220                                   << " time: " << ffmt(csh->GetBegTime())
00221                                   << " charge = " << csh->GetCharge(CalDigitType::kNone) <<endl;  
00222       AlignmentStrip astrip(csh);
00223       if(csh->GetPlaneView() == PlaneView::kV){
00224          bool result = StripBelongsToVTrack(astrip); 
00225          if(!result){
00226             fCandVStrip.push_back(astrip);
00227             fCandVCharge += astrip.charge;
00228             MSG("Align", Msg::kVerbose) <<"Adding candstrip " <<PlexStripEndId(astrip.plexseid)<<endl;
00229          }
00230          continue;
00231       }
00232       
00233       if(csh->GetPlaneView() == PlaneView::kU){
00234          bool result = StripBelongsToUTrack(astrip); 
00235          if(!result){
00236             fCandUStrip.push_back(astrip);
00237             fCandUCharge += astrip.charge;
00238             MSG("Align", Msg::kVerbose) <<"Adding candstrip " <<PlexStripEndId(astrip.plexseid)<<endl;
00239          }
00240          continue;
00241       } 
00242       MSG("Align", Msg::kError) << "Strip is not in V or U view!!!"<<endl;
00243    }
00244 }

void DetectorAlignment::GetTrackStrips const CandTrackSRHandle tkh  )  [private]
 

Definition at line 176 of file DetectorAlignment.cxx.

References fTrackUStrip, fTrackVStrip, CandHandle::GetDaughterIterator(), CandHandle::GetNDaughters(), CandHandle::GetTitle(), MSG, and AlignmentStrip::plexseid.

Referenced by RunAlignment().

00177 {
00178    MSG("Align", Msg::kVerbose) << "Getting CandStripHandles from CandTrack: " 
00179                                << "tkh->GetNDaughters() = "
00180                                << tkh->GetNDaughters()
00181                                << ", tkh->GetTitle() = " << tkh->GetTitle()<<endl;
00182 
00183    fTrackVStrip.clear();
00184    fTrackUStrip.clear();
00185 
00186    int nstrip = 0;
00187    TIter sitr(tkh->GetDaughterIterator());
00188    while( CandStripHandle* csh = dynamic_cast<CandStripHandle*>(sitr()) ){
00189       AlignmentStrip astrip(csh);
00190       nstrip++;
00191       MSG("Align", Msg::kVerbose) << "Adding " <<PlexStripEndId(astrip.plexseid) 
00192                                   <<" to track record" <<endl;
00193       if( csh -> GetPlaneView() == PlaneView::kV)
00194          fTrackVStrip.push_back(astrip);
00195       else
00196          fTrackUStrip.push_back(astrip);      
00197    }
00198 
00199    MSG("Align", Msg::kVerbose) <<"Added "<<nstrip<<" track strips." << endl;
00200    return;
00201 }

void DetectorAlignment::MakeAlignmentTrack vector< AlignmentStrip >::iterator  begin,
vector< AlignmentStrip >::iterator  end
[private]
 

Definition at line 247 of file DetectorAlignment.cxx.

References f2dTrackCharge, f2dTrackResidualRMS, fDeltaT, FitTrackLessOne(), fTrackTimes, MSG, pow(), and NR::sort().

Referenced by RunAlignment().

00249 {
00250    MSG("Align", Msg::kVerbose) << "MakeAlignmentTrack()..."<<endl;
00251 
00252    f2dTrackCharge      = 0.0;
00253    f2dTrackResidualRMS = 0.0;
00254    fDeltaT             = 0.0;   
00255 
00256    vector<AlignmentStrip>::iterator itr;   
00257    double size = 0.0;
00258 
00259    vector<Double_t> begtime;
00260    vector<Double_t> endtime;
00261    
00262    //Filing vectors with data from 2d track
00263    for (itr = begin; itr != end; ++itr) {
00264       size += 1.0;
00265       const double residual = FitTrackLessOne(begin, end, itr);
00266       const double &charge   = itr -> charge;
00267 
00268       //store residual in AlignStrip
00269       itr -> residual = residual;
00270 
00271       //calculating "rms" of a current track
00272       f2dTrackResidualRMS += residual*residual;
00273       
00274       begtime.push_back(itr -> begtime);
00275       endtime.push_back(itr -> endtime);
00276       
00277       //add charge as we iterate along 2d track:
00278       if(charge > 0.0)
00279          f2dTrackCharge += itr->charge;
00280       else
00281          MSG("Align", Msg::kVerbose) <<PlexStripEndId(itr->plexseid)<<" charge = "<<charge<<endl;      
00282       
00283       MSG("Align", Msg::kVerbose) <<PlexStripEndId(itr->plexseid)<<" residual = "<<residual<<endl;
00284    }
00285 
00286    //sorting begtime and endtime to get time time interval of 2d track
00287    if(begtime.size() > 0 && endtime.size() > 0){
00288       sort(begtime.begin(), begtime.end());
00289       sort(endtime.begin(), endtime.end());
00290       fDeltaT = endtime[endtime.size()-1] - begtime[0];
00291       fTrackTimes.push_back(endtime[endtime.size()-1]);
00292       fTrackTimes.push_back(begtime[0]);
00293    }
00294    
00295    if(size > 0.0) f2dTrackResidualRMS = pow(f2dTrackResidualRMS/size, 0.5);
00296 
00297    MSG("Align", Msg::kVerbose) << "MakeAlignmentTrack() DONE!" << endl;
00298 }

bool DetectorAlignment::RunAlignment const CandTrackSRHandle trackhandle,
const CandStripListHandle cstriplh,
NtpAlignmentRecord ntpalignrec
 

Definition at line 57 of file DetectorAlignment.cxx.

References fCandUStrip, fCandVStrip, FitTrackLessOne(), fTrackTimes, fTrackUStrip, fTrackVStrip, GetCandStrips(), CandHandle::GetNDaughters(), GetTrackStrips(), MakeAlignmentTrack(), MSG, and NR::sort().

00060 {
00061 
00062    if(!tkh || !cslh || !ntpalignrec) return false;
00063 
00064    //clear vectors that store AlignmentStrips and track's time inteval
00065    fTrackTimes.clear();
00066 
00067    //Save strip data from CandTrackSR to vector<AlignmentStrip>, one for each view
00068    GetTrackStrips(tkh);
00069 
00070    //Save data from candidate strips to vector<AlignmentStrip>, one for each view
00071    //Ignore strips that belong to a track
00072    GetCandStrips(cslh);
00073 
00074    //Get directional cosines for 3d track
00075    ntpalignrec -> hcosu = tkh -> GetHoughDirCosU();
00076    ntpalignrec -> hcosv = tkh -> GetHoughDirCosV();
00077    ntpalignrec -> hcosz = tkh -> GetHoughDirCosZ();
00078 
00079    //Fit V view track with a straight line and save fit information
00080    vector<AlignmentStrip>::iterator begitr = fTrackVStrip.begin();
00081    vector<AlignmentStrip>::iterator enditr = fTrackVStrip.end();
00082 
00083    //V view: calculate residuals, track charge and residual rms
00084    MakeAlignmentTrack(begitr, enditr);
00085 
00086    FitTrackLessOne(begitr, enditr, enditr);
00087 
00088    //Fill ntuples record for V view track
00089    ntpalignrec -> vcharge      = f2dTrackCharge;
00090    ntpalignrec -> vcandcharge  = fCandVCharge;
00091    ntpalignrec -> vtrackrms    = f2dTrackResidualRMS;
00092    ntpalignrec -> vfita        = fFita;
00093    ntpalignrec -> vfitb        = fFitb;
00094    ntpalignrec -> vsigmaofa    = fSigmaOfa;
00095    ntpalignrec -> vsigmaofb    = fSigmaOfb;
00096    ntpalignrec -> vsigmaoftpos = fUncertaintyInTPosofStrips;
00097    ntpalignrec -> vcovab       = fCovab;
00098    ntpalignrec -> vdt          = fDeltaT;
00099    
00100 
00101    //Fit U view track with a straight line and save fit information
00102    begitr = fTrackUStrip.begin(); 
00103    enditr = fTrackUStrip.end();
00104    
00105    //U view: calculate residuals, track charge and residual rms
00106    MakeAlignmentTrack(begitr, enditr);
00107 
00108    FitTrackLessOne(begitr, enditr, enditr);
00109 
00110    //Fill ntuples record for U view track
00111    ntpalignrec -> ucharge      = f2dTrackCharge;
00112    ntpalignrec -> ucandcharge  = fCandUCharge;
00113    ntpalignrec -> utrackrms    = f2dTrackResidualRMS;
00114    ntpalignrec -> ufita        = fFita;
00115    ntpalignrec -> ufitb        = fFitb;
00116    ntpalignrec -> usigmaofa    = fSigmaOfa;
00117    ntpalignrec -> usigmaofb    = fSigmaOfb;
00118    ntpalignrec -> usigmaoftpos = fUncertaintyInTPosofStrips;
00119    ntpalignrec -> ucovab       = fCovab;
00120    ntpalignrec -> udt          = fDeltaT;
00121 
00122    //Fill TClonesArrays with candidate strips and track strips
00123    TClonesArray& trackvstrips = *(ntpalignrec -> trackvstrip);
00124    for(unsigned int i = 0; i < fTrackVStrip.size(); ++i){
00125       NtpAlignTrackStrip* ntpalign = new(trackvstrips[i])NtpAlignTrackStrip(fTrackVStrip[i]);
00126       if(!ntpalign)
00127          MSG("Align", Msg::kError) <<"Failed to fill TClonesArray!" << endl;
00128    }
00129    
00130    TClonesArray& trackustrips = *(ntpalignrec -> trackustrip);
00131    for(unsigned int i = 0; i < fTrackUStrip.size(); ++i){
00132       NtpAlignTrackStrip* ntpalign = new(trackustrips[i])NtpAlignTrackStrip(fTrackUStrip[i]);
00133       if(!ntpalign)
00134          MSG("Align", Msg::kError) <<"Failed to fill TClonesArray!" << endl;
00135    }
00136    
00137    TClonesArray& candvstrips = *(ntpalignrec -> candvstrip);
00138    for(unsigned int i = 0; i < fCandVStrip.size(); ++i){
00139       NtpAlignCandStrip* ntpalign = new(candvstrips[i])NtpAlignCandStrip(fCandVStrip[i]);
00140       if(!ntpalign)
00141          MSG("Align", Msg::kError) <<"Failed to fill TClonesArray!" << endl;
00142    }
00143 
00144    TClonesArray& candustrips = *(ntpalignrec -> candustrip);
00145    for(unsigned int i = 0; i <  fCandUStrip.size(); ++i){
00146       NtpAlignCandStrip* ntpalign = new(candustrips[i])NtpAlignCandStrip(fCandUStrip[i]);
00147       if(!ntpalign)
00148          MSG("Align", Msg::kError) <<"Failed to fill TClonesArray!" << endl;
00149    }
00150    
00151    ntpalignrec -> nstrip       = cslh -> GetNDaughters();
00152    ntpalignrec -> ntrackvstrip = fTrackVStrip.size();
00153    ntpalignrec -> ntrackustrip = fTrackUStrip.size();
00154    ntpalignrec -> ncandvstrip  = fCandVStrip.size();
00155    ntpalignrec -> ncandustrip  = fCandUStrip.size();
00156 
00157    sort(fTrackTimes.begin(), fTrackTimes.end());
00158 
00159    if(fTrackTimes.size() > 0)
00160       ntpalignrec ->  dt = fTrackTimes[fTrackTimes.size()-1]-fTrackTimes[0];
00161    else
00162       ntpalignrec ->  dt = 0.0;
00163 
00164    const int sum = fTrackVStrip.size() + fTrackUStrip.size() + fCandVStrip.size() + fCandUStrip.size();
00165    const int diff = cslh->GetNDaughters() - sum;
00166    if(diff != 0){
00167       MSG("Align", Msg::kDebug)<< "# of cand and track strips do not add up! "
00168                                << "diff = " << diff << endl;
00169       return false;
00170    }   
00171    return true;
00172 }

bool DetectorAlignment::StripBelongsToUTrack const AlignmentStrip astrip  )  [private]
 

Definition at line 409 of file DetectorAlignment.cxx.

References AlignmentStrip::begtime, AlignmentStrip::charge, fTrackUStrip, MSG, and AlignmentStrip::plexseid.

Referenced by GetCandStrips().

00410 {
00411    //if there is a track strip such that: PlexStripEndIds are the same
00412    //                                     beggining times are within 1ns of each other
00413    //then return true
00414    //
00415    //otherwise return false
00416    
00417    for(unsigned int i = 0; i < fTrackUStrip.size(); ++i){
00418       if(fTrackUStrip[i].plexseid == astrip.plexseid){
00419          double diff = fabs(fTrackUStrip[i].begtime - astrip.begtime);
00420          if(diff < 0.000000002){
00421             MsgFormat ffmt("%10.9f");
00422             MsgFormat fi("%3d");
00423             MSG("Align", Msg::kVerbose) << "Removing "
00424                                         << PlexStripEndId(astrip.plexseid) << " U track strip #"<<fi(i)<<endl
00425                                         << "    Charge = " << astrip.charge 
00426                                         << " lhs t = " << ffmt(fTrackUStrip[i].begtime)
00427                                         << " rhs t = " << ffmt(astrip.begtime) 
00428                                         << " diff = "<< ffmt(diff) <<endl;
00429             return true;  
00430          }   
00431       }
00432    }
00433    return false;
00434 }

bool DetectorAlignment::StripBelongsToVTrack const AlignmentStrip astrip  )  [private]
 

Definition at line 381 of file DetectorAlignment.cxx.

References AlignmentStrip::begtime, AlignmentStrip::charge, fTrackVStrip, MSG, and AlignmentStrip::plexseid.

Referenced by GetCandStrips().

00382 {
00383    //if there is a track strip such that: PlexStripEndIds are the same
00384    //                                     beggining times are within 10ns of each other
00385    //then return true
00386    //
00387    //otherwise return false
00388    
00389    for(unsigned int i = 0; i < fTrackVStrip.size(); ++i){
00390       if(fTrackVStrip[i].plexseid == astrip.plexseid){
00391          double diff = fabs(fTrackVStrip[i].begtime - astrip.begtime);
00392          if(diff < 0.000000002){
00393             MsgFormat ffmt("%10.9f");
00394             MsgFormat fi("%3d");
00395             MSG("Align", Msg::kVerbose) << "Removing "
00396                                         << PlexStripEndId(astrip.plexseid) << " V track strip #"<<fi(i) <<endl
00397                                         << "    Charge = " << astrip.charge 
00398                                         << " lhs t = " << ffmt(fTrackVStrip[i].begtime)
00399                                         << " rhs t = " << ffmt(astrip.begtime)
00400                                         << " diff = "<< ffmt(diff) <<endl;
00401             
00402             return true;  
00403          }
00404       }
00405    }
00406    return false;
00407 }


Member Data Documentation

double DetectorAlignment::f2dTrackCharge [private]
 

Definition at line 69 of file DetectorAlignment.h.

Referenced by MakeAlignmentTrack().

double DetectorAlignment::f2dTrackResidualRMS [private]
 

Definition at line 72 of file DetectorAlignment.h.

Referenced by MakeAlignmentTrack().

double DetectorAlignment::fCandUCharge [private]
 

Definition at line 71 of file DetectorAlignment.h.

Referenced by GetCandStrips().

vector<AlignmentStrip> DetectorAlignment::fCandUStrip [private]
 

Definition at line 65 of file DetectorAlignment.h.

Referenced by GetCandStrips(), and RunAlignment().

double DetectorAlignment::fCandVCharge [private]
 

Definition at line 70 of file DetectorAlignment.h.

Referenced by GetCandStrips().

vector<AlignmentStrip> DetectorAlignment::fCandVStrip [private]
 

Definition at line 64 of file DetectorAlignment.h.

Referenced by GetCandStrips(), and RunAlignment().

double DetectorAlignment::fCovab [private]
 

Definition at line 78 of file DetectorAlignment.h.

Referenced by FitTrackLessOne().

double DetectorAlignment::fDeltaT [private]
 

Definition at line 79 of file DetectorAlignment.h.

Referenced by MakeAlignmentTrack().

double DetectorAlignment::fFita [private]
 

Definition at line 74 of file DetectorAlignment.h.

Referenced by FitTrackLessOne().

double DetectorAlignment::fFitb [private]
 

Definition at line 75 of file DetectorAlignment.h.

Referenced by FitTrackLessOne().

double DetectorAlignment::fSigmaOfa [private]
 

Definition at line 76 of file DetectorAlignment.h.

Referenced by FitTrackLessOne().

double DetectorAlignment::fSigmaOfb [private]
 

Definition at line 77 of file DetectorAlignment.h.

Referenced by FitTrackLessOne().

vector<Double_t> DetectorAlignment::fTrackTimes [private]
 

Definition at line 67 of file DetectorAlignment.h.

Referenced by MakeAlignmentTrack(), and RunAlignment().

vector<AlignmentStrip> DetectorAlignment::fTrackUStrip [private]
 

Definition at line 62 of file DetectorAlignment.h.

Referenced by GetTrackStrips(), RunAlignment(), and StripBelongsToUTrack().

vector<AlignmentStrip> DetectorAlignment::fTrackVStrip [private]
 

Definition at line 61 of file DetectorAlignment.h.

Referenced by GetTrackStrips(), RunAlignment(), and StripBelongsToVTrack().

double DetectorAlignment::fUncertaintyInTPosofStrips [private]
 

Definition at line 73 of file DetectorAlignment.h.

Referenced by FitTrackLessOne().


The documentation for this class was generated from the following files:
Generated on Mon Jun 16 15:01:07 2008 for loon by  doxygen 1.3.9.1