* provided "as is" without express or implied warranty. *
**************************************************************************/
+////////////////////////////////////////////////////////////////////////////
+// //
+// Surveyed Laser Track positions //
+// the position and direction information are stored in //
+// the AliExternalTrackParam base class //
+// This class extends this information by identification parameters //
+/*
+
+//Dump positions to a tree:
+AliTPCLaserTrack::LoadTracks();
+TObjArray *arr=AliTPCLaserTrack::GetTracks();
+TTreeSRedirector *s=new TTreeSRedirector("LaserTracks.root");
+TIter next(arr);
+TObject *o=0x0;
+while ( (o=next()) ) (*s) << "tracks" << "l.=" << o << "\n";
+delete s;
+
+//draw something
+TFile f("LaserTracks.root");
+TTree *tracks=(TTree*)f.Get("tracks");
+tracks->Draw("fVecGY.fElements:fVecGX.fElements");
+
+ tracks->Draw("fVecGY.fElements:fVecGX.fElements>>h(500,-250,250,500,-250,250)","fId<7")
+*/
+// //
+////////////////////////////////////////////////////////////////////////////
+
#include <TObjArray.h>
#include <TFile.h>
#include <TSystem.h>
#include "AliLog.h"
+#include "AliCDBManager.h"
+#include "AliCDBEntry.h"
+#include "AliCDBPath.h"
#include "AliTPCLaserTrack.h"
+#include "AliTPCROC.h"
ClassImp(AliTPCLaserTrack)
fSide(-1),
fRod(-1),
fBundle(-1),
- fBeam(-1)
+ fBeam(-1),
+ fRayLength(0),
+ fVecSec(0), // points vectors - sector
+ fVecP2(0), // points vectors - snp
+ fVecPhi(0), // points vectors - global phi
+ fVecGX(0), // points vectors - globalX
+ fVecGY(0), // points vectors - globalY
+ fVecGZ(0), // points vectors - globalZ
+ fVecLX(0), // points vectors - localX
+ fVecLY(0), // points vectors - localY
+ fVecLZ(0) // points vectors - localZ
{
//
- // Default constructor
+// // Default constructor
//
}
-AliTPCLaserTrack::AliTPCLaserTrack(AliTPCLaserTrack <r) :
+AliTPCLaserTrack::AliTPCLaserTrack(const AliTPCLaserTrack <r) :
AliExternalTrackParam(ltr),
fId(ltr.fId),
fSide(ltr.fSide),
fRod(ltr.fRod),
fBundle(ltr.fBundle),
- fBeam(ltr.fBeam)
+ fBeam(ltr.fBeam),
+ fRayLength(ltr.fRayLength),
+ fVecSec(0), // points vectors - sector
+ fVecP2(0), // points vectors - snp
+ fVecPhi(0), // points vectors - global phi
+ fVecGX(0), // points vectors - globalX
+ fVecGY(0), // points vectors - globalY
+ fVecGZ(0), // points vectors - globalZ
+ fVecLX(0), // points vectors - localX
+ fVecLY(0), // points vectors - localY
+ fVecLZ(0) // points vectors - localZ
{
//
// Default constructor
//
+ fVecSec=new TVectorD(*ltr.fVecSec); // points vectors - sector
+ fVecP2 =new TVectorD(*ltr.fVecP2); // points vectors - snp
+ fVecPhi=new TVectorD(*ltr.fVecPhi); // points vectors - global phi
+ fVecGX =new TVectorD(*ltr.fVecGX); // points vectors - globalX
+ fVecGY =new TVectorD(*ltr.fVecGY); // points vectors - globalY
+ fVecGZ =new TVectorD(*ltr.fVecGZ); // points vectors - globalZ
+ fVecLX =new TVectorD(*ltr.fVecLX); // points vectors - localX
+ fVecLY =new TVectorD(*ltr.fVecLY); // points vectors - localY
+ fVecLZ =new TVectorD(*ltr.fVecLZ); // points vectors - localY
}
const Int_t bundle, const Int_t beam,
Double_t x, Double_t alpha,
const Double_t param[5],
- const Double_t covar[15]) :
+ const Double_t covar[15], const Float_t rayLength) :
AliExternalTrackParam(x,alpha,param,covar),
fId(id),
fSide(side),
fRod(rod),
fBundle(bundle),
- fBeam(beam)
+ fBeam(beam),
+ fRayLength(rayLength),
+ fVecSec(new TVectorD(159)), // points vectors - sector
+ fVecP2(new TVectorD(159)), // points vectors - snp
+ fVecPhi(new TVectorD(159)), // points vectors - global phi
+ fVecGX(new TVectorD(159)), // points vectors - globalX
+ fVecGY(new TVectorD(159)), // points vectors - globalY
+ fVecGZ(new TVectorD(159)), // points vectors - globalZ
+ fVecLX(new TVectorD(159)), // points vectors - localX
+ fVecLY(new TVectorD(159)), // points vectors - localY
+ fVecLZ(new TVectorD(159)) // points vectors - localZ
+
{
//
// create laser track from arguments
//
-
+
}
-
-void AliTPCLaserTrack::LoadTracks()
+//_____________________________________________________________________
+AliTPCLaserTrack& AliTPCLaserTrack::operator = (const AliTPCLaserTrack &source)
{
- //
- // Load all design positions from file into the static array fgArrLaserTracks
- //
+ //
+ // assignment operator
+ //
+ if (&source == this) return *this;
+ new (this) AliTPCLaserTrack(source);
+
+ return *this;
+}
- if ( fgArrLaserTracks ) return;
- TString dataFileName("$ALICE_ROOT/TPC/Calib/LaserTracks.root"); //Path to the Data File
+AliTPCLaserTrack::~AliTPCLaserTrack(){
+ //
+ // destructor
+ //
+ delete fVecSec; // - sector numbers
+ delete fVecP2; // - P2
+ delete fVecPhi; // points vectors - global phi
+ delete fVecGX; // points vectors - globalX
+ delete fVecGY; // points vectors - globalY
+ delete fVecGZ; // points vectors - globalZ
+ delete fVecLX; // points vectors - localX
+ delete fVecLY; // points vectors - localY
+ delete fVecLZ; // points vectors - localZ
+}
- TFile *f=TFile::Open(gSystem->ExpandPathName(dataFileName.Data()));
- if ( !f || !f->IsOpen() ){
-// AliWarning(Form("Could not open laser data file: '%s'",dataFileName.Data()));
-// AliWarning("Could not open laser data file");
- return;
+void AliTPCLaserTrack::LoadTracks()
+{
+ //
+ // Load all design positions from file into the static array fgArrLaserTracks
+ //
+
+ if ( fgArrLaserTracks ) return;
+ TObjArray *arrLaserTracks = 0x0;
+
+ AliCDBManager *man=AliCDBManager::Instance();
+ if (!man->GetDefaultStorage() && gSystem->Getenv("ALICE_ROOT")) man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+ if (man->GetDefaultStorage()){
+ if (man->GetRun()<0) man->SetRun(0);
+ AliCDBEntry *entry=man->Get(AliCDBPath("TPC/Calib/LaserTracks"));
+ if (!entry) return;
+ arrLaserTracks = (TObjArray*)entry->GetObject();
+ entry->SetOwner(kTRUE);
+ } else {
+ if (!gSystem->AccessPathName("LaserTracks.root")){
+ TFile f("LaserTracks.root");
+ arrLaserTracks=(TObjArray*)f.Get("arrLaserTracks");
+ f.Close();
}
- TObjArray *arrLaserTracks = (TObjArray*)f->Get("arrLaserTracks");
- if ( !arrLaserTracks ) {
+ }
+ if ( !arrLaserTracks ) {
// AliWarning(Form("Could not get laser position data from file: '%s'",fgkDataFileName));
- return;
+ return;
+ }
+
+ arrLaserTracks->SetOwner();
+
+ fgArrLaserTracks = new TObjArray(fgkNLaserTracks);
+ fgArrLaserTracks->SetOwner();
+ for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
+ AliTPCLaserTrack *ltr = (AliTPCLaserTrack*)arrLaserTracks->At(itrack);
+ if ( !ltr ){
+// AliWarning(Form("No informatino found for Track %d!",itrack));
+ continue;
}
+ ltr->UpdatePoints();
+ fgArrLaserTracks->AddAt(new AliTPCLaserTrack(*ltr),itrack);
+ }
- fgArrLaserTracks = new TObjArray(fgkNLaserTracks);
- for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
- AliTPCLaserTrack *ltr = (AliTPCLaserTrack*)arrLaserTracks->At(itrack);
- if ( !ltr ){
-// AliWarning(Form("No informatino found for Track %d!",itrack));
- continue;
- }
- fgArrLaserTracks->AddAt(new AliTPCLaserTrack(*ltr),itrack);
+ delete arrLaserTracks;
+}
+
+
+void AliTPCLaserTrack::UpdatePoints(){
+ //
+ // update track points
+ //
+ const Double_t kMaxSnp=0.97;
+ AliTPCROC* roc = AliTPCROC::Instance();
+ //
+ //
+ if (!fVecSec){
+ fVecSec=new TVectorD(159);
+ fVecP2 =new TVectorD(159); // - P2
+ fVecPhi=new TVectorD(159); // - Phi
+ fVecGX=new TVectorD(159); // points vectors - globalX
+ fVecGY=new TVectorD(159); // points vectors - globalY
+ fVecGZ=new TVectorD(159); // points vectors - globalZ
+ fVecLX=new TVectorD(159); // points vectors - localX
+ fVecLY=new TVectorD(159); // points vectors - localY
+ fVecLZ=new TVectorD(159); // points vectors - localZ
+
+ }
+ for (Int_t irow=158; irow>=0; irow--){
+ (*fVecSec)[irow]= -1; // -
+ (*fVecP2)[irow] = 0; // - P2 -snp
+ (*fVecPhi)[irow]= 0; // - global phi
+ (*fVecGX)[irow] = 0; // points vectors - globalX
+ (*fVecGY)[irow] = 0; // points vectors - globalY
+ (*fVecGZ)[irow] = 0; // points vectors - globalZ
+ (*fVecLX)[irow] = 0; // points vectors - localX
+ (*fVecLY)[irow] = 0; // points vectors - localY
+ (*fVecLZ)[irow] = 0; // points vectors - localZ
+
+ }
+ Double_t gxyz[3];
+ Double_t lxyz[3];
+ AliTPCLaserTrack*ltrp=new AliTPCLaserTrack(*this); //make temporary track
+
+ for (Int_t irow=158; irow>=0; irow--){
+ UInt_t srow = irow;
+ Int_t sector=0;
+
+ if (srow >=roc->GetNRows(0)) {
+ srow-=roc->GetNRows(0);
+ sector=36 ;
}
- delete f;
+ lxyz[0]= roc->GetPadRowRadii(sector,srow);
+ if (!ltrp->PropagateTo(lxyz[0],5)) break;
+ ltrp->GetXYZ(gxyz);
+ //
+ Double_t alpha=TMath::ATan2(gxyz[1],gxyz[0]);
+ if (alpha<0) alpha+=2*TMath::Pi();
+ sector +=TMath::Nint(-0.5+9*alpha/TMath::Pi());
+ if (gxyz[2]<0) sector+=18;
+ Double_t salpha = TMath::Pi()*(sector+0.5)/9.;
+ if (!ltrp->Rotate(salpha)) break;
+ if (!ltrp->PropagateTo(lxyz[0],5)) break;
+ if (TMath::Abs(ltrp->GetSnp())>kMaxSnp) break;
+ ltrp->GetXYZ(gxyz);
+ lxyz[1]=ltrp->GetY();
+ lxyz[2]=ltrp->GetZ();
+ (*fVecSec)[irow]= sector;
+ (*fVecP2)[irow] = ltrp->GetSnp(); // - P2 -snp
+ (*fVecPhi)[irow]= TMath::ATan2(gxyz[1],gxyz[0]); // - global phi
+ (*fVecGX)[irow] = gxyz[0]; // points vectors - globalX
+ (*fVecGY)[irow] = gxyz[1]; // points vectors - globalY
+ (*fVecGZ)[irow] = gxyz[2]; // points vectors - globalZ
+ (*fVecLX)[irow] = lxyz[0]; // points vectors - localX
+ (*fVecLY)[irow] = lxyz[1]; // points vectors - localY
+ (*fVecLZ)[irow] = lxyz[2]; // points vectors - localZ
+
+ }
+ delete ltrp; // delete temporary track
}
-Int_t AliTPCLaserTrack::IdentifyTrack(AliExternalTrackParam *track)
+Int_t AliTPCLaserTrack::IdentifyTrack(AliExternalTrackParam *track, Int_t side)
{
+ //
+ // Find the laser track which is corresponding closest to 'track'
+ // return its id
+ //
+ //
+ const Float_t kMaxdphi=0.2;
+ const Float_t kMaxdphiP=0.05;
+ const Float_t kMaxdz=40;
+
+ if ( !fgArrLaserTracks ) LoadTracks();
+ TObjArray *arrTracks = GetTracks();
+ Double_t lxyz0[3];
+ Double_t lxyz1[3];
+ Double_t pxyz0[3];
+ Double_t pxyz1[3];
+ track->GetXYZ(lxyz0);
+ track->GetDirection(pxyz0);
+ //
+ Float_t mindist=10; // maxima minimal distance
+ Int_t id = -1;
+ for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
+ AliTPCLaserTrack *ltr = (AliTPCLaserTrack*)arrTracks->UncheckedAt(itrack);
+ if (side>=0) if (ltr->GetSide()!=side) continue;
+ Double_t * kokot = (Double_t*)ltr->GetParameter();
+ kokot[4]=-0.0000000001;
//
- // Find the laser track which is corresponding closest to 'track'
- // return its id
+ ltr->GetXYZ(lxyz1);
+ if (TMath::Abs(lxyz1[2]-lxyz0[2])>kMaxdz) continue;
+ // phi position
+ Double_t phi0 = TMath::ATan2(lxyz0[1],lxyz0[0]);
+ Double_t phi1 = TMath::ATan2(lxyz1[1],lxyz1[0]);
+ if (TMath::Abs(phi0-phi1)>kMaxdphi) continue;
+ // phi direction
+ ltr->GetDirection(pxyz1);
+ Float_t direction= pxyz0[0]*pxyz1[0] + pxyz0[1]*pxyz1[1] + pxyz0[2]*pxyz1[2];
+ Float_t distdir = (1-TMath::Abs(direction))*90.; //distance at entrance
+ if (1-TMath::Abs(direction)>kMaxdphiP)
+ continue;
//
-
- LoadTracks();
- TObjArray *arrTracks = GetTracks();
-
- Double_t phitr=0;
- Double_t philtr=0;
- Double_t xltr[3];
- Double_t xtr[3];
- Double_t vtr[3];
-
- track->GetXYZ(xtr);
- track->GetDirection(vtr);
- phitr=track->Phi();
-
- Int_t id = -1;
- Double_t dcaMin=3; // 3 sigma is the minimum weighted dca accepted
- for (Int_t itrack=0; itrack<fgkNLaserTracks; itrack++){
- AliExternalTrackParam *ltr = (AliExternalTrackParam*)arrTracks->UncheckedAt(itrack);
- philtr=ltr->Phi();
- Double_t phiadd=0;
- Double_t dphi=TMath::Abs(phitr-philtr);
- if (dphi>TMath::Pi()) phiadd=TMath::Pi();
- dphi-=phiadd;
- if (dphi>2*TMath::DegToRad()) continue; //only 2 degree in phi
-
- //printf("itrack: %d; dphi: %f\n",itrack,dphi/TMath::DegToRad());
-
- ltr->GetXYZ(xltr);
-
- Double_t l=0;
- Double_t d2=0;
- Double_t d=0;
- for (Int_t i=0; i<2; i++)
- l+=(xltr[i]-xtr[i])*vtr[i];
- for (Int_t i=0; i<2; i++)
- d2+=(xltr[i]-xtr[i]-l*vtr[i])*(xltr[i]-xtr[i]-l*vtr[i]);
- d=TMath::Sqrt(d2);
-
- //printf("itrack: %d; d-xy: %f\n",itrack,d);
-
-
- //only 3mm in x-y
- if ( d>.3 ) continue;
-
-
- Double_t dz=TMath::Abs(xltr[2] - xtr[2]);
- //printf("itrack: %d; d-z: %f\n",itrack,dz);
- //30 cm in z
- if ( dz > 30. ) continue;
-
- //if ( id!=-1 ) printf("Warnig: Track (%d) already identified before (%d)\n", itrack, id);
- id=itrack;
-// Double_t relDistX
-// Double_t xtr=0;
-// Double_t xltr=0;
-// Double_t dca=track->GetDCA(ltr,0,xtr,xltr);
-// if ( dca<dcaMin ){
-// id=itrack;
-// dcaMin=dca;
-// }
+ Float_t dist=0;
+ dist+=TMath::Abs(lxyz1[0]-lxyz0[0]);
+ dist+=TMath::Abs(lxyz1[1]-lxyz0[1]);
+ // dist+=TMath::Abs(lxyz1[2]-lxyz0[2]); //z is not used for distance calculation
+ dist+=distdir;
+ //
+ if (id<0) {
+ id =itrack;
+ mindist=dist;
+ continue;
}
- return id;
+ if (dist>mindist) continue;
+ id = itrack;
+ mindist=dist;
+ }
+ return id;
}