/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* laser track clasification; TCut cutT("cutT","abs(Tr.fP[3])<0.06"); TCut cutPt("cutPt","abs(Tr.fP[4])<0.1"); TCut cutN("cutN","fTPCncls>70"); TCut cutP("cutP","abs(atan2(x1,x0)-atan2(lx1,lx0))<0.03") TCut cutA = cutT+cutPt+cutP; TFile f("laserTPCDebug.root"); TTree * treeT = (TTree*)f.Get("Track"); treeT->Draw("(atan2(x1,x0)-atan2(lx1,lx0))*250.:fBundle","fSide==1&&fRod==0"+cutA,"prof") gSystem->Load("libSTAT.so") TStatToolkit toolkit; Double_t chi2; TVectorD fitParam; TMatrixD covMatrix; Int_t npoints; TString *strq0 = toolkit.FitPlane(treeT,"Tr.fP[1]-LTr.fP[1]","lx1++lx2", "fSide==1"+cutA, chi2,npoints,fitParam,covMatrix); */ #include "TLinearFitter.h" #include "AliTPCcalibLaser.h" #include "AliExternalTrackParam.h" #include "AliESDEvent.h" #include "AliESDfriend.h" #include "AliESDtrack.h" #include "AliTPCTracklet.h" #include "TH1D.h" #include "TVectorD.h" #include "TTreeStream.h" #include "TFile.h" #include "TF1.h" #include "TGraphErrors.h" #include "AliTPCclusterMI.h" #include "AliTPCseed.h" #include "AliTracker.h" #include "TClonesArray.h" #include "TTreeStream.h" #include #include #include "AliTPCLaserTrack.h" using namespace std; ClassImp(AliTPCcalibLaser) AliTPCcalibLaser::AliTPCcalibLaser(): AliTPCcalibBase(), fESD(0), fESDfriend(), fTracksMirror(336), fTracksEsd(336), fTracksEsdParam(336), fTracksTPC(336), fDeltaZ(336), // array of histograms of delta z for each track fDeltaPhi(336), // array of histograms of delta z for each track fDeltaPhiP(336), // array of histograms of delta z for each track fFitAside(new TVectorD(3)), // drift fit - A side fFitCside(new TVectorD(3)), // drift fit - C- side fRun(0) { // // Constructor // fTracksEsdParam.SetOwner(kTRUE); } AliTPCcalibLaser::AliTPCcalibLaser(const Text_t *name, const Text_t *title): AliTPCcalibBase(), fESD(0), fESDfriend(0), fTracksMirror(336), fTracksEsd(336), fTracksEsdParam(336), fTracksTPC(336), fDeltaZ(336), // array of histograms of delta z for each track fDeltaPhi(336), // array of histograms of delta z for each track fDeltaPhiP(336), // array of histograms of delta z for each track fFitAside(new TVectorD(3)), // drift fit - A side fFitCside(new TVectorD(3)), // drift fit - C- side fRun(0) { SetName(name); SetTitle(title); // // Constructor // fTracksEsdParam.SetOwner(kTRUE); } AliTPCcalibLaser::~AliTPCcalibLaser() { // // destructor // } void AliTPCcalibLaser::Process(AliESDEvent * event) { // // // Loop over tracks and call Process function // fESD = event; if (!fESD) { return; } fESDfriend=static_cast(fESD->FindListObject("AliESDfriend")); if (!fESDfriend) { return; } fTracksTPC.Clear(); fTracksEsd.Clear(); fTracksEsdParam.Delete(); // Int_t n=fESD->GetNumberOfTracks(); Int_t run = fESD->GetRunNumber(); fRun = run; for (Int_t i=0;iGetTrack(i); AliESDtrack *track=fESD->GetTrack(i); TObject *calibObject=0; AliTPCseed *seed=0; for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j) if ((seed=dynamic_cast(calibObject))) break; if (track&&seed) FindMirror(track,seed); // } FitDriftV(); MakeDistHisto(); // for (Int_t id=0; id<336; id++){ // // if (!fTracksEsdParam.At(id)) continue; DumpLaser(id); RefitLaser(id); } } void AliTPCcalibLaser::MakeDistHisto(){ // // // for (Int_t id=0; id<336; id++){ // // if (!fTracksEsdParam.At(id)) continue; if (!AcceptLaser(id)) continue; // // TH1F * hisdz = (TH1F*)fDeltaZ.At(id); TH1F * hisdphi = (TH1F*)fDeltaPhi.At(id); TH1F * hisdphiP = (TH1F*)fDeltaPhiP.At(id); if (!hisdz){ hisdz = new TH1F(Form("hisdz%d",id),Form("hisdz%d",id),500,-10,10); fDeltaZ.AddAt(hisdz,id); // hisdphi = new TH1F(Form("hisdphi%d",id),Form("hisdphi%d",id),500,-2,2); fDeltaPhi.AddAt(hisdphi,id); // hisdphiP = new TH1F(Form("hisdphiP%d",id),Form("hisdphiP%d",id),500,-0.02,0.02); fDeltaPhiP.AddAt(hisdphiP,id); } AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id); AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id); Double_t xyz[3]; Double_t pxyz[3]; Double_t lxyz[3]; Double_t lpxyz[3]; param->GetXYZ(xyz); param->GetPxPyPz(pxyz); ltrp->GetXYZ(lxyz); ltrp->GetPxPyPz(lpxyz); // Float_t dz = param->GetZ()-ltrp->GetZ(); Float_t dphi = (TMath::ATan2(xyz[1],xyz[0])- TMath::ATan2(lxyz[1],lxyz[0]))*254.; Float_t dphiP = param->GetParameter()[2]-ltrp->GetParameter()[2]; hisdz->Fill(dz); hisdphi->Fill(dphi); hisdphiP->Fill(dphiP); } } void AliTPCcalibLaser::FitDriftV(){ // // Fit drift velocity - linear approximation in the z and global y // static TLinearFitter fdriftA(3,"hyp2"); static TLinearFitter fdriftC(3,"hyp2"); fdriftA.ClearPoints(); fdriftC.ClearPoints(); // for (Int_t id=0; id<336; id++){ if (!fTracksEsdParam.At(id)) continue; if (!AcceptLaser(id)) continue; AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id); AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id); Double_t xyz[3]; Double_t pxyz[3]; Double_t lxyz[3]; Double_t lpxyz[3]; param->GetXYZ(xyz); param->GetPxPyPz(pxyz); ltrp->GetXYZ(lxyz); ltrp->GetPxPyPz(lpxyz); Double_t xxx[2] = {lxyz[2],lxyz[1]}; if (ltrp->GetSide()==0){ fdriftA.AddPoint(xxx,xyz[2],1); }else{ fdriftC.AddPoint(xxx,xyz[2],1); } } Float_t chi2A = 0; Float_t chi2C = 0; Int_t npointsA=0; Int_t npointsC=0; // if (fdriftA.GetNpoints()>10){ fdriftA.Eval(); fdriftA.EvalRobust(0.8); fdriftA.GetParameters(*fFitAside); npointsA= fdriftA.GetNpoints(); chi2A = fdriftA.GetChisquare()/fdriftA.GetNpoints(); } if (fdriftC.GetNpoints()>10){ fdriftC.Eval(); fdriftC.EvalRobust(0.8); fdriftC.GetParameters(*fFitCside); npointsC= fdriftC.GetNpoints(); chi2C = fdriftC.GetChisquare()/fdriftC.GetNpoints(); } if (fStreamLevel>0){ TTreeSRedirector *cstream = GetDebugStreamer(); Int_t time = fESD->GetTimeStamp(); if (cstream){ (*cstream)<<"driftv"<< "driftA.="<70"); TCut cutP("cutP","abs(atan2(x1,x0)-atan2(lx1,lx0))<0.03") TCut cutA = cutT+cutPt+cutP; */ AliExternalTrackParam *param =(AliExternalTrackParam*)fTracksEsdParam.At(id); AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id); AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id); if (TMath::Abs(param->GetParameter()[4])>0.03) return kFALSE; if (TMath::Abs(param->GetParameter()[3])>0.06) return kFALSE; if (TMath::Abs(param->GetParameter()[2]-ltrp->GetParameter()[2])>0.06) return kFALSE; if (TMath::Abs(param->GetParameter()[1]-ltrp->GetParameter()[1])>10) return kFALSE; // // dedx cut // if (TMath::Abs(track->GetTPCsignal())<20) return kFALSE; if (TMath::Abs(track->GetTPCsignal())>800) return kFALSE; // return kTRUE; } Int_t AliTPCcalibLaser::FindMirror(AliESDtrack *track, AliTPCseed *seed){ // // Find corresponding mirror // add the corresponding tracks // Float_t kRadius0 = 252; Float_t kRadius = 253.4; if (!track->GetOuterParam()) return -1; AliExternalTrackParam param(*(track->GetOuterParam())); AliTracker::PropagateTrackTo(¶m,kRadius0,0.10566,3,kTRUE); AliTracker::PropagateTrackTo(¶m,kRadius,0.10566,0.1,kTRUE); AliTPCLaserTrack ltr; AliTPCLaserTrack *ltrp=0x0; // Int_t id = AliTPCLaserTrack::IdentifyTrack(¶m); if (id!=-1 && (AliTPCLaserTrack::GetTracks()->UncheckedAt(id))) ltrp=(AliTPCLaserTrack*)AliTPCLaserTrack::GetTracks()->UncheckedAt(id); else ltrp=<r; if (id>=0){ // // Float_t radius=TMath::Abs(ltrp->GetX()); AliTracker::PropagateTrackTo(¶m,radius,0.10566,0.01,kTRUE); // if (!fTracksMirror.At(id)) fTracksMirror.AddAt(ltrp,id); fTracksEsdParam.AddAt(param.Clone(),id); fTracksEsd.AddAt(track,id); fTracksTPC.AddAt(seed,id); // } return id; } void AliTPCcalibLaser::DumpLaser(Int_t id) { // // Dump Laser info to the tree // AliESDtrack *track = (AliESDtrack*)fTracksEsd.At(id); AliExternalTrackParam *param=(AliExternalTrackParam*)fTracksEsdParam.At(id); AliTPCLaserTrack *ltrp = ( AliTPCLaserTrack*)fTracksMirror.At(id); // // Fast laser ID // Double_t xyz[3]; Double_t pxyz[3]; Double_t lxyz[3]; Double_t lpxyz[3]; param->GetXYZ(xyz); param->GetPxPyPz(pxyz); ltrp->GetXYZ(lxyz); ltrp->GetPxPyPz(lpxyz); if (fStreamLevel>0){ TTreeSRedirector *cstream = GetDebugStreamer(); Int_t time = fESD->GetTimeStamp(); Bool_t accept = AcceptLaser(id); if (cstream){ (*cstream)<<"Track"<< "run="<GetClusterPointer(i); if (c) nclusters[c->GetDetector()]++; } for (Int_t isec=0; isec<72;isec++){ if (nclusters[isec]GetClusterPointer(irow); //if (c && RejectCluster(c)) continue; if (c&&c->GetDetector()==isec) { Double_t xd = c->GetX()-120;; Double_t x[2]={xd,xd*xd}; fy2.AddPoint(x,c->GetY()); fz2.AddPoint(x,c->GetZ()); // fy1.AddPoint(x,c->GetY()); fz1.AddPoint(x,c->GetZ()); } } fy2.Eval(); fz2.Eval(); fy1.Eval(); fz1.Eval(); fy1.GetParameters(vecy1); fy2.GetParameters(vecy2); fz1.GetParameters(vecz1); fz2.GetParameters(vecz2); if (fStreamLevel>0){ TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream){ Float_t dedx = track->GetdEdx(); (*cstream)<<"Tracklet"<< "LTr.="<GetClusterPointer(irow); // if (c && RejectCluster(c)) continue; // if (c&&c->GetDetector()==isec) { // Double_t x[2]={c->GetX(),c->GetX()*c->GetX()}; // fy2.AddPoint(&x,c->GetY()); // fz2.AddPoint(&x,c->GetZ()); // // // fy1.AddPoint(&x,c->GetY()); // fz1.AddPoint(&x,c->GetZ()); // } // } } void AliTPCcalibLaser::Analyze(){ // // // }