//$Id$ // Author: Anders Vestbo //*-- Copyright © ASV #include #include #include #include #include "AliL3ModelTrack.h" #include "AliL3Transform.h" //_____________________________________________________________ // AliL3ModelTrack // // ClassImp(AliL3ModelTrack) AliL3ModelTrack::AliL3ModelTrack() { fNClusters = 0; fClusters = 0; fOverlap = 0; fPad=0; fTime=0; fClusterCharge=0; fTrackModel=0; fLabel=0; } AliL3ModelTrack::~AliL3ModelTrack() { if(fClusters) delete [] fClusters; if(fPad) delete [] fPad; if(fTime) delete [] fTime; if(fOverlap) delete [] fOverlap; if(fTrackModel) delete fTrackModel; } void AliL3ModelTrack::Init(Int_t slice,Int_t patch) { fNClusters = 0; fSlice=slice; fPatch=patch; Int_t nrows = AliL3Transform::GetNRows(fPatch); fClusters = new AliL3ClusterModel[nrows]; fPad = new Float_t[nrows]; fTime = new Float_t[nrows]; fTrackModel = new AliL3TrackModel; fOverlap = new Int_t[nrows]; memset(fClusters,0,nrows*sizeof(AliL3ClusterModel)); memset(fPad,0,nrows*sizeof(Float_t)); memset(fTime,0,nrows*sizeof(Float_t)); memset(fTrackModel,0,sizeof(AliL3TrackModel)); for(Int_t i=0; i AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::SetCluster() : Wrong index: "<fPresent = kFALSE; else { cl->fPresent = kTRUE; cl->fDTime = (ftime - GetTimeHit(row))/fXYResidualQ; cl->fDPad = (fpad - GetPadHit(row))/fZResidualQ; cl->fDCharge = charge - fClusterCharge; cl->fDSigmaY2 = (sigmaY2 - GetParSigmaY2(row))/fXYWidthQ; cl->fDSigmaZ2 = (sigmaZ2 - GetParSigmaZ2(row))/fZWidthQ; cl->fNPads = npads; } fNClusters++; } Int_t AliL3ModelTrack::CheckClustersQuality(UInt_t npads=3) { //Check the quality of clusters,- remove clusters with less than //npads. //Returns the number of good clusters left. Int_t count=0; for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++) { AliL3ClusterModel *cl = GetClusterModel(i); if(cl->fNPads < npads) cl->fPresent = kFALSE; if(cl->fPresent) count++; } return count; } void AliL3ModelTrack::FillModel() { //Fill the track structure if(!fTrackModel) { cerr<<"AliL3ModelTrack::FillModel() : No trackmodel "<fKappa = GetKappa(); fTrackModel->fFirstPointX = GetFirstPointX(); fTrackModel->fFirstPointY = GetFirstPointY(); fTrackModel->fFirstPointZ = GetFirstPointZ(); fTrackModel->fTgl = GetTgl(); fTrackModel->fPsi = GetPsi(); fTrackModel->fLength = (Short_t)GetLength(); fTrackModel->fClusterCharge = fClusterCharge; fTrackModel->fNClusters = fNClusters; } void AliL3ModelTrack::FillTrack() { //Fill the track parameters from the structure. if(!fTrackModel) { cerr<<"AliL3ModelTrack::FillTrack() : No data!!"<fKappa); SetCharge((-1*(Int_t)copysign(1.,GetKappa()))); SetFirstPoint(fTrackModel->fFirstPointX,fTrackModel->fFirstPointY,fTrackModel->fFirstPointZ); SetTgl(fTrackModel->fTgl); SetPsi(fTrackModel->fPsi); SetLength(fTrackModel->fLength); fClusterCharge=fTrackModel->fClusterCharge; fNClusters = fTrackModel->fNClusters; SetPt((BFACT*AliL3Transform::GetBField())/fabs(GetKappa())); CalculateHelix(); Float_t hit[3]; Int_t sector,row; for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++) { AliL3ClusterModel *cl = GetClusterModel(i); if(!cl) continue; GetCrossingPoint(i,hit); AliL3Transform::Slice2Sector(fSlice,i,sector,row); AliL3Transform::Local2Raw(hit,sector,row); SetPadHit(i,hit[1]); SetTimeHit(i,hit[2]); } } void AliL3ModelTrack::SetTrackID(Int_t row,Int_t *trackID) { #ifdef do_mc AliL3ClusterModel *cluster = GetClusterModel(row); cluster->fTrackID[0] = trackID[0]; cluster->fTrackID[1] = trackID[1]; cluster->fTrackID[2] = trackID[2]; return; #endif cerr<<"AliL3ModelTrack::SetTrackID : Compile with do_mc flag"< AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::SetPadHit() : Wrong index: "< AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::SetTimeHit() : Wrong index: "< AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::SetOverlap() : Wrong index: "<fTrackID[index]; #endif cerr<<"AliL3ModelTrack::GetTrackID : Compile with do_mc flag"<fNPads; } Bool_t AliL3ModelTrack::GetPad(Int_t row,Float_t &pad) { //(ftime - GetTimeHit(fNClusters))/fXYResidualQ; //(fpad - GetPadHit(fNClusters))/fZResidualQ; AliL3ClusterModel *cl = GetClusterModel(row); pad = cl->fDPad*fXYResidualQ + GetPadHit(row); return (Bool_t)cl->fPresent; } Bool_t AliL3ModelTrack::GetTime(Int_t row,Float_t &time) { AliL3ClusterModel *cl = GetClusterModel(row); time = cl->fDTime*fZResidualQ + GetTimeHit(row); return (Bool_t)cl->fPresent; } Bool_t AliL3ModelTrack::GetClusterCharge(Int_t row,Int_t &charge) { AliL3ClusterModel *cl = GetClusterModel(row); charge = (Int_t)cl->fDCharge + fClusterCharge; return (Bool_t)cl->fPresent; } Bool_t AliL3ModelTrack::GetXYWidth(Int_t row,Float_t &width) { AliL3ClusterModel *cl = GetClusterModel(row); width = cl->fDSigmaY2*fXYWidthQ + GetParSigmaY2(row); return (Bool_t)cl->fPresent; } Bool_t AliL3ModelTrack::GetZWidth(Int_t row,Float_t &width) { AliL3ClusterModel *cl = GetClusterModel(row); width = cl->fDSigmaZ2*fZWidthQ + GetParSigmaZ2(row); return (Bool_t)cl->fPresent; } Bool_t AliL3ModelTrack::GetPadResidual(Int_t row,Float_t &res) { AliL3ClusterModel *cl = GetClusterModel(row); res = cl->fDPad; return cl->fPresent; } Bool_t AliL3ModelTrack::GetTimeResidual(Int_t row,Float_t &res) { AliL3ClusterModel *cl = GetClusterModel(row); res = cl->fDTime; return cl->fPresent; } Bool_t AliL3ModelTrack::GetXYWidthResidual(Int_t row,Float_t &res) { AliL3ClusterModel *cl = GetClusterModel(row); res = cl->fDSigmaY2; return cl->fPresent; } Bool_t AliL3ModelTrack::GetZWidthResidual(Int_t row,Float_t &res) { AliL3ClusterModel *cl = GetClusterModel(row); res = cl->fDSigmaZ2; return cl->fPresent; } Float_t AliL3ModelTrack::GetPadHit(Int_t row) { Int_t index = row-AliL3Transform::GetFirstRow(fPatch); if(index < 0 || index > AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::GetPadHit() : Wrong index: "< AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::GetTimeHit() : Wrong index: "< AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::GetOverlap() : Wrong index: "< AliL3Transform::GetNRows(fPatch)) { cerr<<"AliL3ModelTrack::GetClusterModel() : Wrong index: "<fPresent) cout<fDPad<<" Dtime "<fDTime<<" Dcharge "<fDCharge; cout<<" DsigmaY2 "<fDSigmaY2<<" DsigmaZ2 "<fDSigmaZ2; cout<<" Padcrossing "< 0) drift = AliL3Transform::GetZLength() - xyz[2]; else drift = AliL3Transform::GetZLength() + xyz[2]; Double_t prf = AliL3Transform::GetPRFSigma(fPatch); Double_t diffT = AliL3Transform::GetDiffT(); Double_t padlength = AliL3Transform::GetPadLength(fPatch); Double_t anode = AliL3Transform::GetAnodeWireSpacing(); Double_t beta = GetCrossingAngle(row); Double_t sigmaY2 = prf*prf + diffT*diffT*drift + padlength*padlength*tan(beta)*tan(beta)/12 + anode*anode*pow( tan(beta)-0.15, 2)/12; //Convert back to raw coordinates. sigmaY2 = sigmaY2/pow(AliL3Transform::GetPadPitchWidth(fPatch),2); return sigmaY2; } Double_t AliL3ModelTrack::GetParSigmaZ2(Int_t row) { //Calculate the expected cluster width, based on the track parameters and drift distance. Float_t pad,time; if(!GetTime(row,time) || !GetPad(row,pad)) return -1; Float_t xyz[3]; Int_t sector,padrow; AliL3Transform::Slice2Sector(fSlice,row,sector,padrow); AliL3Transform::Raw2Local(xyz,sector,padrow,pad,time); //Calculate the drift length: Double_t drift; if(xyz[2] > 0) drift = AliL3Transform::GetZLength() - xyz[2]; else drift = AliL3Transform::GetZLength() + xyz[2]; Double_t sigma0 = AliL3Transform::GetTimeSigma(); Double_t diffL = AliL3Transform::GetDiffL(); Double_t padlength = AliL3Transform::GetPadLength(fPatch); Double_t tanl = GetTgl(); Double_t sigmaZ2 = sigma0*sigma0 + diffL*diffL*drift + padlength*padlength * tanl*tanl/12; //Convert back to raw coodinates: sigmaZ2 = sigmaZ2/pow(AliL3Transform::GetZWidth(),2); return sigmaZ2; } void AliL3ModelTrack::AssignTrackID(Float_t wrong=0.10) { //Assign a track ID to the track, corresponding to the MC TParticle ID. //Can only be done if you compiled with do_mc flag, of course. //The function loops over the assigned clusters, and finds the label (ID) //of each clusters, and assigns the ID with the most hits to the track. //If there are more than wrong% clusters of a different ID, the track is //considered to be fake, and label will be assigned as negative. #ifdef do_mc Int_t *lb = new Int_t[GetNClusters()]; Int_t *mx = new Int_t[GetNClusters()]; Int_t i,j; for(Int_t i=0; i max) { max=mx[i]; lab=lb[i]; } } for (i=0; i wrong) lab=-lab; SetLabel(lab); delete[] lb; delete[] mx; return; #endif cerr<<"AliL3ModelTrack::AssignTrackID : Compile with do_mc flag"<