+//______________________________________________________________________________
+void AliTOFTenderSupply::DetectRecoPass()
+{
+ //
+ // Detect reconstruction information
+ //
+
+ //reset information
+ fRecoPass=0;
+
+ //Get the current file to check the reconstruction pass (UGLY, but not stored in ESD... )
+ AliAnalysisManager *mgr=AliAnalysisManager::GetAnalysisManager();
+ AliVEventHandler *inputHandler=mgr->GetInputEventHandler();
+ if (!inputHandler) return;
+
+ TTree *tree= (TTree*)inputHandler->GetTree();
+ TFile *file= (TFile*)tree->GetCurrentFile();
+
+ if (!file) {
+ AliFatal("Current file not found");
+ }
+
+ //find pass from file name (UGLY, but not stored in ESD... )
+ TString fileName(file->GetName());
+ if (fileName.Contains("pass1") ) {
+ fRecoPass=1;
+ } else if (fileName.Contains("pass2") ) {
+ fRecoPass=2;
+ } else if (fileName.Contains("pass3") ) {
+ fRecoPass=3;
+ }
+ if (fRecoPass == 0) {
+ AliInfo(Form("From file name %s reco pass cannot be detected",fileName.Data()));
+ AliInfo("Change file name or use SetUserRecoPass method");
+ AliFatal("------------- TOF tender cannot run with reco pass unspecified, issuing FATAL error ---------- ");
+ }
+}
+
+
+//______________________________________________________________________________
+void AliTOFTenderSupply::InitGeom()
+{
+
+ if (fGeomSet == kTRUE) return;
+
+ // Printf("\n \n ----- calling InitGeom to fix TRD Bug ----- \n \n");
+ AliCDBManager * man = AliCDBManager::Instance();
+ man->SetDefaultStorage("raw://");
+ fCDBkey = man->SetLock(kFALSE, fCDBkey);
+ Int_t run = fTender->GetRun();
+ // Printf(" ---------> run is %d",run);
+ man->SetRun(run);
+ AliCDBEntry *entry = (AliCDBEntry*)man->Get("GRP/Geometry/Data");
+ if (entry) {
+ AliGeomManager::LoadGeometry();
+ AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF");
+ // fCDBkey = man->SetLock(kTRUE, fCDBkey);
+ // Printf("\n \n ----- Geometry loaded ------ \n \n");
+ }
+ fGeomSet=kTRUE;
+
+}
+
+
+//______________________________________________________________________________
+void AliTOFTenderSupply::FixTRDBug(AliESDEvent* event)
+//
+// recompute texp fixing wrong dE/dx from TRD (LHC10b,c pass3)
+//
+{
+
+ if (fGeomSet == kFALSE) InitGeom();
+
+ // Printf("Running FixTRD bug ");
+ /* loop over tracks */
+ AliESDtrack *track = NULL;
+ for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
+ track = event->GetTrack(itrk);
+ FixTRDBug(track);
+ }
+}
+
+
+//_____________________________________________________
+void AliTOFTenderSupply::FixTRDBug(AliESDtrack *track)
+{
+ //
+ //
+ //
+
+
+ ULong_t status=track->GetStatus();
+ if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) &&
+ ( (status & AliVTrack::kTPCrefit)==AliVTrack::kTPCrefit ) &&
+ ( (status & AliVTrack::kTPCout)==AliVTrack::kTPCout ) &&
+ ( (status & AliVTrack::kTOFout)==AliVTrack::kTOFout ) &&
+ ( (status & AliVTrack::kTIME)==AliVTrack::kTIME ) ) ) return;
+
+ fIsEnteringInTRD=kFALSE;
+ fInTRD=kFALSE;
+ fIsComingOutTRD=kFALSE;
+ fOutTRD=kFALSE;
+
+ // Printf("Track reached TOF %f",track->P());
+ Double_t correctionTimes[5] = {0.,0.,0.,0.,0.}; // to be added to the expected times
+ FindTRDFix(track, correctionTimes);
+ Double_t expectedTimes[5] = {0.,0.,0.,0.,0.}; track->GetIntegratedTimes(expectedTimes);
+ // Printf("Exp. times: %f %f %f %f %f",
+ // expectedTimes[0],expectedTimes[1],expectedTimes[2],expectedTimes[3],expectedTimes[4]);
+ // Printf("Corr. times: %f %f %f %f %f",
+ // correctionTimes[0],correctionTimes[1],correctionTimes[2],correctionTimes[3],correctionTimes[4]);
+
+ for (Int_t jj=0; jj<5; jj++) expectedTimes[jj]+=correctionTimes[jj];
+ track->SetIntegratedTimes(expectedTimes);
+
+}
+
+
+//________________________________________________________________________
+void AliTOFTenderSupply::FindTRDFix(AliESDtrack *track,Double_t *corrections)
+{
+
+ Double_t pT = track->Pt();
+ ULong_t status=track->GetStatus();
+ Bool_t isTRDout = (status & AliVTrack::kTRDout)==AliVTrack::kTRDout;
+
+ Double_t length = 0.;
+
+ Double_t xyzIN[3]={0.,0.,0.};
+ fIsEnteringInTRD = track->GetXYZAt(fRhoTRDin,fMagField,xyzIN);
+
+ Double_t xyzOUT[3]={0.,0.,0.};
+ fIsComingOutTRD = track->GetXYZAt(fRhoTRDout,fMagField,xyzOUT);
+
+ if (fIsEnteringInTRD && fIsComingOutTRD) {
+
+
+ Double_t phiIN = TMath::Pi()+TMath::ATan2(-xyzIN[1],-xyzIN[0]);
+ phiIN *= TMath::RadToDeg();
+ fInTRD = ( (phiIN>= 0. && phiIN<= 40.) ||
+ (phiIN>=140. && phiIN<=220.) ||
+ (phiIN>=340. && phiIN<=360.) ); // TRD SMs installed @ 2010
+
+ Double_t phiOUT = TMath::Pi()+TMath::ATan2(-xyzOUT[1],-xyzOUT[0]);
+ phiOUT *= TMath::RadToDeg();
+ fOutTRD = ( (phiOUT>= 0. && phiOUT<= 40.) ||
+ (phiOUT>=140. && phiOUT<=220.) ||
+ (phiOUT>=340. && phiOUT<=360.) ); // TRD SMs installed @ 2010
+
+ length = 0.;
+
+ if (fInTRD || fOutTRD) {
+
+ if ( ( fInTRD && fOutTRD ) || ( fInTRD && !fOutTRD ) ) {
+ length = EstimateLengthInTRD1(track);
+ } else if ( !fInTRD && fOutTRD ) {
+ length = EstimateLengthInTRD2(track);
+ }
+
+ } else { // ( !fInTRD && !fOutTRD )
+
+ length = EstimateLengthOutTRD(track);
+
+ }
+
+ }
+ // Printf("estimated length in TRD %f [isTRDout %d]",length,isTRDout);
+ CorrectDeltaTimes(pT,length,isTRDout,corrections);
+
+}
+
+//________________________________________________________________________
+void AliTOFTenderSupply::CorrectDeltaTimes(Double_t pT,
+ Double_t length,
+ Bool_t flagTRDout,
+ Double_t *corrections)
+{
+
+ corrections[2] = CorrectExpectedPionTime(pT,length,flagTRDout);
+ corrections[0] = corrections[2]; // x electrons used pion corrections
+ corrections[1] = corrections[2]; // x muons used pion corrections
+ corrections[3] = CorrectExpectedKaonTime(pT,length,flagTRDout);
+ corrections[4] = CorrectExpectedProtonTime(pT,length,flagTRDout);
+
+}
+
+//________________________________________________________________________
+Double_t AliTOFTenderSupply::CorrectExpectedPionTime(Double_t pT,
+ Double_t length,
+ Bool_t isTRDout)
+{
+ // correction for expected time for pions
+
+ Double_t delta=0.;
+
+ // Printf("Flags Ent In ComingOut Out %d %d %d %d",fIsEnteringInTRD,fInTRD,fIsComingOutTRD,fOutTRD);
+ if (!fIsEnteringInTRD || !fIsComingOutTRD) { // zone 5
+
+ Float_t p[2]={0.,0.};
+
+ if (isTRDout) {
+
+ if (pT<0.30) {
+ p[0] = 180.; p[1] = 0.;
+ } else if (pT>=0.30 && pT<0.35) {
+ p[0] = 740.; p[1] = -1800.;
+ } else if (pT>=0.35 && pT<0.40) {
+ p[0] = 488.; p[1] =-1080.;
+ } else if (pT>=0.40 && pT<0.45) {
+ p[0] = 179.; p[1] = -307.;
+ } else if (pT>=0.45 && pT<0.50) {
+ p[0] = 97.; p[1] = -123.;
+ } else { //if (pT>=0.50)
+ p[0] = 120.; p[1] = -172.;
+ }
+
+ } else {
+
+ if (pT<0.30) {
+ p[0] = 70.; p[1] = 0.;
+ } else if (pT>=0.30 && pT<0.35) {
+ p[0] = 339.; p[1] = -927.;
+ } else if (pT>=0.35 && pT<0.40) {
+ p[0] = 59.; p[1] = -121.;
+ } else if (pT>=0.40 && pT<0.50) {
+ p[0] = 21.; p[1] = -24.;
+ } else { //if (pT>=0.50)
+ p[0] = 42.; p[1] = -67.;
+ }
+
+ }
+
+ delta = p[0]+p[1]*pT;
+ // Printf("Pion time: %f %f %f %f",p[0],p[1],length,delta);
+
+ } else {
+
+ Float_t p[2] = {0.,0.};
+
+ if ( fInTRD && fOutTRD) { // zone 1
+
+ if (isTRDout) {
+
+ if (length<130.) {
+ p[0] = 0.; p[1] = 0.;
+ } else if (length>=130. && length<170.) {
+ p[0] = -20.5; p[1] = 0.25;
+ } else {//if (length>=170.)
+ p[0] = 22.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ p[0] = 20.; p[1] = 0.;
+
+ }
+
+ } else if (!fInTRD && !fOutTRD) { // zone 2
+
+ p[0] = 0.; p[1] = 0.;
+
+ } else if ( fInTRD && !fOutTRD) { // zone 3
+
+ if (isTRDout) {
+
+ if (length< 75.) {
+ p[0] = 17.; p[1] = 0.;
+ } else if (length>= 75. && length< 95.) {
+ p[0] = 81.; p[1] = -0.85;
+ } else if (length>= 95. && length<155.) {
+ p[0] = 0.; p[1] = 0.;
+ } else {//if (length>=155.)
+ p[0] = 10.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ p[0] = 0.; p[1] = 0.;
+
+ }
+
+ } else if (!fInTRD && fOutTRD) { // zone 4
+
+ if (isTRDout) {
+
+ if (length<80.) {
+ p[0] = 0.; p[1] = 0.;
+ } else {//if (length>=80.)
+ p[0] = 10.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ if (length<30.) {
+ p[0] = 0.; p[1] = 0.;
+ } else {//if (length>=30.)
+ p[0] = 6.; p[1] = 0.;
+ }
+
+ }
+
+ }
+
+ delta = p[0]+p[1]*length;
+ // Printf("Pion time: %f %f %f %f",p[0],p[1],length,delta);
+
+ }
+
+ return delta;
+
+}
+
+//________________________________________________________________________
+Double_t AliTOFTenderSupply::CorrectExpectedKaonTime(Double_t pT,
+ Double_t length,
+ Bool_t isTRDout)
+{
+ // correction for expected time for kaons
+
+ Double_t delta=0.;
+ // Printf("Flags Ent In ComingOut Out %d %d %d %d",fIsEnteringInTRD,fInTRD,fIsComingOutTRD,fOutTRD);
+
+ if (!fIsEnteringInTRD || !fIsComingOutTRD) { // zone 5
+
+ Float_t p[2]={0.,0.};
+
+ if (isTRDout) {
+
+ if (pT<0.4) {
+ p[0] = 900.; p[1] = 0.;
+ } else if (pT>=0.40 && pT<0.45) {
+ p[0] = 3100.; p[1] = -6000.;
+ } else if (pT>=0.45 && pT<0.50) {
+ p[0] = 1660.; p[1] = -2800.;
+ } else if (pT>=0.50 && pT<0.55) {
+ p[0] = 860.; p[1] = -1200.;
+ } else { //if (pT>=0.55)
+ p[0] = 200.; p[1] = 0.;
+ }
+
+ } else {
+
+ if (pT<0.30) {
+ p[0] = 0.; p[1] = 0.;
+ } else if (pT>=0.30 && pT<0.32) {
+ p[0] = 570.; p[1] = 0.;
+ } else if (pT>=0.32 && pT<0.35) {
+ p[0] = 3171.; p[1] = -8133.;
+ } else if (pT>=0.35 && pT<0.40) {
+ p[0] = 1815.; p[1] = -4260.;
+ } else if (pT>=0.40 && pT<0.45) {
+ p[0] = 715.; p[1] = -1471.;
+ } else if (pT>=0.45 && pT<0.50) {
+ p[0] = 233.; p[1] = -407.;
+ } else if (pT>=0.50 && pT<0.55) {
+ p[0] = 408.; p[1] = -752.;
+ } else { //if (pT>=0.55)
+ p[0] = 408.-752.*0.55; p[1] = 0.;
+ }
+
+ }
+
+ delta = p[0]+p[1]*pT;
+ // Printf("Kaon time: %f %f %f %f",p[0],p[1],length,delta);
+
+ } else {
+
+ Float_t p[2] = {0.,0.};
+
+ if ( fInTRD && fOutTRD) { // zone 1
+
+ if (isTRDout) {
+
+ if (length<95.) {
+ p[0] = 20.; p[1] = 0.;
+ } else if (length>=95. && length<195.) {
+ p[0] = -24.0; p[1] = 0.10+0.0041*length;
+ } else {//if (length>=195.)
+ p[0] = 150.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ p[0] = 40.; p[1] = 0.;
+
+ }
+
+ } else if (!fInTRD && !fOutTRD) { // zone 2
+
+ p[0] = 0.; p[1] = 0.;
+
+ } else if ( fInTRD && !fOutTRD) { // zone 3
+
+ if (isTRDout) {
+
+ if (length< 15.) {
+ p[0] = 180.; p[1] = 0.;
+ } else if (length>= 15. && length< 55.) {
+ p[0] = 215.; p[1] = -2.5;
+ } else {//if (length>=55.)
+ p[0] = 78.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ p[0] = 0.; p[1] = 0.;
+
+ }
+
+ } else if (!fInTRD && fOutTRD) { // zone 4
+
+ if (isTRDout) {
+
+ if (length< 55.) {
+ p[0] = 0.; p[1] = 0.;
+ } else if (length>= 55. && length<115.) {
+ p[0] = -85.; p[1] = 1.9;
+ } else {//if (length>=115.)
+ p[0] = 100.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ p[0] = 0.; p[1] = 0.;
+
+ }
+
+ }
+
+ delta = p[0]+p[1]*length;
+ // Printf("Kaon time: %f %f %f %f",p[0],p[1],length,delta);
+
+ }
+
+ return delta;
+
+}
+
+//________________________________________________________________________
+Double_t AliTOFTenderSupply::CorrectExpectedProtonTime(Double_t pT,
+ Double_t length,
+ Bool_t isTRDout)
+{
+ // correction for expected time for protons
+
+ Double_t delta=0.;
+ // Printf("Flags Ent In ComingOut Out %d %d %d %d",fIsEnteringInTRD,fInTRD,fIsComingOutTRD,fOutTRD);
+
+ if (!fIsEnteringInTRD || !fIsComingOutTRD) { // zone 5
+ Float_t p[2]={0.,0.};
+
+
+ if (isTRDout) {
+
+ if (pT<0.375) {
+ p[0] = 1000.; p[1] = 0.;
+ } else if (pT>=0.375 && pT<0.45) {
+ p[0] = 1500.; p[1] = 0.;
+ } else if (pT>=0.45 && pT<0.50) {
+ p[0] = 4650.; p[1] = -7000.;
+ } else if (pT>=0.50 && pT<0.55) {
+ p[0] = 3150.; p[1] = -4000.;
+ } else { //if (pT>=0.55)
+ p[0] = 3150. -4000.*0.55; p[1] = 0.;
+ }
+
+ } else {
+
+ if (pT<0.32) {
+ p[0] = 2963.-5670.*0.032; p[1] = 0.;
+ } else if (pT>=0.32 && pT<0.35) {
+ p[0] = 2963.; p[1] = -5670.;
+ } else if (pT>=0.35 && pT<0.40) {
+ p[0] = 4270.; p[1] = -9400.;
+ } else if (pT>=0.40 && pT<0.45) {
+ p[0] = 1550.; p[1] = -2600.;
+ } else if (pT>=0.45 && pT<0.50) {
+ p[0] = 1946.; p[1] = -3480.;
+ } else if (pT>=0.50 && pT<0.55) {
+ p[0] = 1193.; p[1] = -1974.;
+ } else { //if (pT>=0.55)
+ p[0] = 1193.-1974.*0.55; p[1] = 0.;
+ }
+
+ }
+
+ delta = p[0]+p[1]*pT;
+ // Printf("Proton time: %f %f %f %f",p[0],p[1],length,delta);
+
+ } else {
+
+ Float_t p[2] = {0.,0.};
+
+ if ( fInTRD && fOutTRD) { // zone 1
+
+ if (isTRDout) {
+
+ if (length<90.) {
+ p[0] = 0.; p[1] = 0.;
+ } else if (length>=90. && length<200.) {
+ p[0] = 1063.; p[1] = -32.+0.30*length-0.00072*length*length;
+ } else {//if (length>=200.)
+ p[0] = 900.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ p[0] = 80.; p[1] = 0.;
+
+ }
+
+ } else if (!fInTRD && !fOutTRD) { // zone 2
+
+ if (isTRDout) {
+ p[0] = 0.; p[1] = 0.;
+ } else {
+ if (length<125.) {
+ p[0] = 0.; p[1] = 0.;
+ } else if (length>=125. && length<180.) {
+ p[0] = -132.; p[1] = 1.3;
+ } else {
+ p[0] = 100.; p[1] = 0.;
+ }
+
+ }
+
+ } else if ( fInTRD && !fOutTRD) { // zone 3
+
+ if (isTRDout) {
+
+ if (length< 30.) {
+ p[0] = 670.; p[1] = 0.;
+ } else if (length>= 30. && length<155.) {
+ p[0] = 944.; p[1] = -11.+0.064*length;
+ } else {//if (length>=155.)
+ p[0] = 780.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ if (length< 30.) {
+ p[0] = 140.; p[1] = -4.5;
+ } else {
+ p[0] = 0.; p[1] = 0.;
+ }
+
+ }
+
+ } else if (!fInTRD && fOutTRD) { // zone 4
+
+ if (isTRDout) {
+
+ if (length< 45.) {
+ p[0] = 130.; p[1] = 0.;
+ } else if (length>= 45. && length<120.) {
+ p[0] = -190.; p[1] = 6.5;
+ } else {//if (length>=120.)
+ p[0] = 750.; p[1] = 0.;
+ }
+
+ } else { // !isTRDout
+
+ if (length<75.5) {
+ p[0] = 0.; p[1] = 0.;
+ } else if (length>= 75.5 && length<90.) {
+ p[0] = -830.; p[1] = 11.;
+ } else {
+ p[0] = 160.; p[1] = 0.;
+ }
+
+ }
+
+ }
+
+ delta = p[0]+p[1]*length;
+ // Printf("Proton time: %f %f %f %f",p[0],p[1],length,delta);
+
+ }
+
+ return delta;
+
+}
+
+//________________________________________________________________________
+Double_t AliTOFTenderSupply::EstimateLengthInTRD1(AliESDtrack *track)
+{
+
+ Double_t xyz0[3]={0.,0.,0.};
+ Bool_t stayInTRD = track->GetXYZAt(fRhoTRDin,fMagField,xyz0);
+
+ Double_t phi0 = TMath::Pi()+TMath::ATan2(-xyz0[1],-xyz0[0]);
+ phi0 *= TMath::RadToDeg();
+ stayInTRD = stayInTRD && ( (phi0>= 0. && phi0<= 40.) ||
+ (phi0>=140. && phi0<=220.) ||
+ (phi0>=340. && phi0<=360.) );
+
+ Double_t trackLengthInTRD = 0.;
+ Int_t iStep=0;
+
+ Double_t b[3];track->GetBxByBz(b);
+
+ Double_t xyz1[3]={0.,0.,0.};
+ Double_t rho = fRhoTRDin;
+ while (stayInTRD && rho<=fRhoTRDout) {
+ iStep++;
+ rho += fStep;
+
+ for (Int_t ii=0; ii<3; ii++) xyz1[ii]=0.;
+ stayInTRD = track->GetXYZAt(rho,fMagField,xyz1);
+ Double_t phi1 = TMath::Pi()+TMath::ATan2(-xyz1[1],-xyz1[0]);
+ phi1 *= TMath::RadToDeg();
+ stayInTRD = stayInTRD && ( (phi1>= 0. && phi1<= 40.) ||
+ (phi1>=140. && phi1<=220.) ||
+ (phi1>=340. && phi1<=360.) );
+
+ Double_t l2 = TMath::Sqrt((xyz1[0]-xyz0[0])*(xyz1[0]-xyz0[0]) +
+ (xyz1[1]-xyz0[1])*(xyz1[1]-xyz0[1]) +
+ (xyz1[2]-xyz0[2])*(xyz1[2]-xyz0[2]));
+ trackLengthInTRD += l2;
+
+ for (Int_t ii=0; ii<3; ii++) xyz0[ii]=xyz1[ii];
+ }
+
+ return trackLengthInTRD;
+
+}
+
+//________________________________________________________________________
+Double_t AliTOFTenderSupply::EstimateLengthInTRD2(AliESDtrack *track)
+{
+
+ Double_t xyz0[3]={0.,0.,0.};
+ Bool_t stayInTRD = track->GetXYZAt(fRhoTRDout,fMagField,xyz0);
+
+ Double_t phi0 = TMath::Pi()+TMath::ATan2(-xyz0[1],-xyz0[0]);
+ phi0 *= TMath::RadToDeg();
+ stayInTRD = stayInTRD && ( (phi0>= 0. && phi0<= 40.) ||
+ (phi0>=140. && phi0<=220.) ||
+ (phi0>=340. && phi0<=360.) );
+
+ Double_t trackLengthInTRD = 0.;
+ Int_t iStep=0;
+
+ Double_t b[3];track->GetBxByBz(b);
+
+ Double_t xyz1[3]={0.,0.,0.};
+ Double_t rho = fRhoTRDout;
+ while (stayInTRD && rho>=fRhoTRDin) {
+ iStep++;
+ rho -= fStep;
+
+ for (Int_t ii=0; ii<3; ii++) xyz1[ii]=0.;
+ stayInTRD = track->GetXYZAt(rho,fMagField,xyz1);
+ Double_t phi1 = TMath::Pi()+TMath::ATan2(-xyz1[1],-xyz1[0]);
+ phi1 *= TMath::RadToDeg();
+ stayInTRD = stayInTRD && ( (phi1>= 0. && phi1<= 40.) ||
+ (phi1>=140. && phi1<=220.) ||
+ (phi1>=340. && phi1<=360.) );
+
+ Double_t l2 = TMath::Sqrt((xyz0[0]-xyz1[0])*(xyz0[0]-xyz1[0]) +
+ (xyz0[1]-xyz1[1])*(xyz0[1]-xyz1[1]) +
+ (xyz0[2]-xyz1[2])*(xyz0[2]-xyz1[2]));
+ trackLengthInTRD += l2;
+
+ for (Int_t ii=0; ii<3; ii++) xyz0[ii]=xyz1[ii];
+ }
+
+ return trackLengthInTRD;
+
+}
+
+//________________________________________________________________________
+Double_t AliTOFTenderSupply::EstimateLengthOutTRD(AliESDtrack *track)
+{
+
+ Double_t xyz0[3]={0.,0.,0.};
+ Bool_t stayInTRD = track->GetXYZAt(fRhoTRDin,fMagField,xyz0);
+
+ Double_t phi0 = TMath::Pi()+TMath::ATan2(-xyz0[1],-xyz0[0]);
+ phi0 *= TMath::RadToDeg();
+ stayInTRD = stayInTRD && !( (phi0>= 0. && phi0<= 40.) ||
+ (phi0>=140. && phi0<=220.) ||
+ (phi0>=340. && phi0<=360.) );
+
+ Double_t trackLengthInTRD = 0.;
+ Int_t iStep=0;
+
+ Double_t b[3];track->GetBxByBz(b);
+
+ Double_t xyz1[3]={0.,0.,0.};
+ Double_t rho = fRhoTRDin;
+ while (stayInTRD && rho<=fRhoTRDout) {
+ iStep++;
+ rho += fStep;
+
+ for (Int_t ii=0; ii<3; ii++) xyz1[ii]=0.;
+ stayInTRD = track->GetXYZAt(rho,fMagField,xyz1);
+ Double_t phi1 = TMath::Pi()+TMath::ATan2(-xyz1[1],-xyz1[0]);
+ phi1 *= TMath::RadToDeg();
+ stayInTRD = stayInTRD && !( (phi1>= 0. && phi1<= 40.) ||
+ (phi1>=140. && phi1<=220.) ||
+ (phi1>=340. && phi1<=360.) );
+
+ Double_t l2 = TMath::Sqrt((xyz1[0]-xyz0[0])*(xyz1[0]-xyz0[0]) +
+ (xyz1[1]-xyz0[1])*(xyz1[1]-xyz0[1]) +
+ (xyz1[2]-xyz0[2])*(xyz1[2]-xyz0[2]));
+ trackLengthInTRD += l2;
+
+ for (Int_t ii=0; ii<3; ii++) xyz0[ii]=xyz1[ii];
+ }
+
+ return trackLengthInTRD;
+
+}
+