X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDtrackV1.cxx;h=aceb18107cc6a117758f7af8e5ff655b1f7ca1f7;hb=1d26da6d8e27b8543e7c65c22f19dff5775cbd93;hp=5fc3d2f59be5f7de392bcfa952f3051a5bbb6033;hpb=5d4510feb98bca4aa71e69bd5ccded563a83272c;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDtrackV1.cxx b/TRD/AliTRDtrackV1.cxx index 5fc3d2f59be..aceb18107cc 100644 --- a/TRD/AliTRDtrackV1.cxx +++ b/TRD/AliTRDtrackV1.cxx @@ -1,3 +1,4 @@ + /************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * @@ -15,6 +16,7 @@ /* $Id$ */ +#include "TVectorT.h" #include "AliLog.h" #include "AliESDtrack.h" #include "AliTracker.h" @@ -23,7 +25,12 @@ #include "AliTRDcluster.h" #include "AliTRDcalibDB.h" #include "AliTRDReconstructor.h" +#include "AliTRDPIDResponse.h" #include "AliTRDrecoParam.h" +#include "AliTRDdEdxBaseUtils.h" +#include "AliTRDdEdxCalibHistArray.h" +#include "AliTRDdEdxCalibUtils.h" +#include "AliTRDdEdxReconUtils.h" ClassImp(AliTRDtrackV1) @@ -43,6 +50,10 @@ AliTRDtrackV1::AliTRDtrackV1() : AliKalmanTrack() ,fStatus(0) ,fESDid(0) ,fDE(0.) + ,fTruncatedMean(0) + ,fNchamberdEdx(0) + ,fNclusterdEdx(0) + ,fNdEdxSlices(0) ,fkReconstructor(NULL) ,fBackupTrack(NULL) ,fTrackLow(NULL) @@ -62,6 +73,7 @@ AliTRDtrackV1::AliTRDtrackV1() : AliKalmanTrack() fTrackletIndex[ip] = -1; fTracklet[ip] = NULL; } + SetLabel(-123456789); // reset label } //_______________________________________________________________ @@ -69,6 +81,10 @@ AliTRDtrackV1::AliTRDtrackV1(const AliTRDtrackV1 &ref) : AliKalmanTrack(ref) ,fStatus(ref.fStatus) ,fESDid(ref.fESDid) ,fDE(ref.fDE) + ,fTruncatedMean(ref.fTruncatedMean) + ,fNchamberdEdx(ref.fNchamberdEdx) + ,fNclusterdEdx(ref.fNclusterdEdx) + ,fNdEdxSlices(ref.fNdEdxSlices) ,fkReconstructor(ref.fkReconstructor) ,fBackupTrack(NULL) ,fTrackLow(NULL) @@ -99,6 +115,10 @@ AliTRDtrackV1::AliTRDtrackV1(const AliESDtrack &t) : AliKalmanTrack() ,fStatus(0) ,fESDid(0) ,fDE(0.) + ,fTruncatedMean(0) + ,fNchamberdEdx(0) + ,fNclusterdEdx(0) + ,fNdEdxSlices(0) ,fkReconstructor(NULL) ,fBackupTrack(NULL) ,fTrackLow(NULL) @@ -112,7 +132,7 @@ AliTRDtrackV1::AliTRDtrackV1(const AliESDtrack &t) : AliKalmanTrack() SetLabel(t.GetLabel()); SetChi2(0.0); - SetMass(t.GetMass()/*0.000510*/); + SetMass(t.GetMassForTracking()); AliKalmanTrack::SetNumberOfClusters(t.GetTRDncls()); Int_t ti[]={-1, -1, -1, -1, -1, -1}; t.GetTRDtracklets(&ti[0]); for(int ip=0; ipGetClusters(ic))) continue; - for (Int_t k = 0; k < 3; k++) { - label = c->GetLabel(k); - labelAdded = kFALSE; - Int_t j = 0; - if (label >= 0) { - while ((!labelAdded) && (j < kMAXCLUSTERSPERTRACK)) { - if ((s[j][0] == label) || - (s[j][1] == 0)) { - s[j][0] = label; - s[j][1]++; - labelAdded = kTRUE; - } - j++; - } + for (Int_t k(0); k < 3; k++) { + if ((label = c->GetLabel(k)) < 0) continue; + Int_t j(0); + while(j < kMAXCLUSTERSPERTRACK){ + if(s[0][j]!=label && s[1][j]!=0){j++; continue;} + if(!s[1][j]) nlabels++; + s[0][j] = label; s[1][j]++; + break; } } } } - - Int_t max = 0; - label = -123456789; - for (Int_t i = 0; i < kMAXCLUSTERSPERTRACK; i++) { - if (s[i][1] <= max) continue; - max = s[i][1]; - label = s[i][0]; + //printf(" Found %4d labels\n", nlabels); + Float_t prob(1.); + if(!nlabels){ + AliError(Form("No MC labels found for track %d.", fESDid)); + return 0; + } else if(nlabels==1) { + label = s[0][0]; + if(labs && freq){labs[0]=label; freq[0]=1.;} + } else { + Int_t idx[kMAXCLUSTERSPERTRACK]; + TMath::Sort(nlabels, s[1], idx); + label = s[0][idx[0]]; prob = s[1][idx[0]]/Float_t(ncl); + if(labs && freq){ + for (Int_t i(0); i wrong) label = -label; - - SetLabel(label); - - return kTRUE; + SetLabel((1.-prob > wrong)?-label:label); + return nlabels; } //_______________________________________________________________ @@ -346,29 +379,42 @@ Bool_t AliTRDtrackV1::CookPID() // //End_Html // - - /*Reset the a priori probabilities*/ - Double_t pid = 1. / AliPID::kSPECIES; - for(int ispec=0; ispecGetPIDResponse(fkReconstructor->GetRecoParam()->GetPIDmethod()); + if(!pidResponse){ + AliError("PID Response not available"); return kFALSE; } - - for (Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++) fPID[iSpecies] /= probTotal; - + Double_t dEdx[kNplane * (Int_t)AliTRDseedV1::kNdEdxSlices] = {0.}; + Float_t trackletP[kNplane] = {0.}; + + fNdEdxSlices = pidResponse->GetNumberOfSlices(); + for(Int_t iseed = 0; iseed < kNplane; iseed++){ + if(!fTracklet[iseed]) continue; + trackletP[iseed] = fTracklet[iseed]->GetMomentum(); +// if(pidResponse->GetPIDmethod() == AliTRDPIDResponse::kLQ1D){ + dEdx[iseed] = fTracklet[iseed]->GetdQdl(); +/* } else { + fTracklet[iseed]->CookdEdx(fNdEdxSlices); + const Float_t *trackletdEdx = fTracklet[iseed]->GetdEdx(); + for(Int_t islice = 0; islice < fNdEdxSlices; islice++){ + dEdx[iseed*fNdEdxSlices + islice] = trackletdEdx[islice]; + } + }*/ + } + pidResponse->GetResponse(fNdEdxSlices, dEdx, trackletP, fPID); + + static Int_t nprint = 0; + if(!nprint){ + AliTRDdEdxBaseUtils::PrintControl(); + nprint++; + } + + //do truncated mean + AliTRDdEdxCalibUtils::SetObjArray(AliTRDcalibDB::Instance()->GetPHQ()); + const Double_t mag = AliTRDdEdxBaseUtils::IsExBOn() ? GetBz() : -1; + const Double_t charge = AliTRDdEdxBaseUtils::IsExBOn() ? Charge() : -1; + fTruncatedMean = CookTruncatedMean(0, mag, charge, kTRUE, fNchamberdEdx, fNclusterdEdx); + return kTRUE; } @@ -378,52 +424,15 @@ UChar_t AliTRDtrackV1::GetNumberOfTrackletsPID() const // Retrieve number of tracklets used for PID calculation. UChar_t nPID = 0; - Float_t *prob = NULL; for(int ip=0; ipIsOK()) continue; - if(!(prob = fTracklet[ip]->GetProbability(kFALSE))) continue; - - Int_t nspec = 0; // quality check of tracklet dEdx - for(int ispec=0; ispecSetPID(); nPID++; } return nPID; } -//___________________________________________________________ -UChar_t AliTRDtrackV1::SetNumberOfTrackletsPID(Bool_t recalc) -{ -// Retrieve number of tracklets used for PID calculation. // Recalculated PID at tracklet level by quering the PID DB. - - UChar_t fPIDquality(0); - - // steer PID calculation @ tracklet level - Float_t *prob(NULL); - for(int ip=0; ipIsOK()) continue; - if(!(prob = fTracklet[ip]->GetProbability(recalc))) return 0; - - Int_t nspec = 0; // quality check of tracklet dEdx - for(int ispec=0; ispecGetPIDquality() ) return kFALSE; - for(Int_t i = 0; i < AliPID::kSPECIES; i++){ - if ( fPID[i] != inTrack->GetPID(i) ) return kFALSE; - } - - for (Int_t i = 0; i < 3; i++){ - if ( fBudget[i] != inTrack->GetBudget(i) ) return kFALSE; - } - if ( fDE != inTrack->GetEdep() ) return kFALSE; - if ( fFakeRatio != inTrack->GetFakeRatio() ) return kFALSE; - if ( fChi2 != inTrack->GetChi2() ) return kFALSE; - if ( fMass != inTrack->GetMass() ) return kFALSE; - if ( fLab != inTrack->GetLabel() ) return kFALSE; - if ( fN != inTrack->GetNumberOfClusters() ) return kFALSE; - if ( AliKalmanTrack::GetIntegratedLength() != inTrack->GetIntegratedLength() ) return kFALSE; - - if ( GetX() != inTrack->GetX() ) return kFALSE; - if ( GetAlpha() != inTrack->GetAlpha() ) return kFALSE; - const Double_t *inP = inTrack->GetParameter(); - const Double_t *curP = GetParameter(); - for (Int_t i = 0; i < 5; i++){ - if ( curP[i] != inP[i]) return kFALSE; - } - const Double_t *inC = inTrack->GetCovariance(); - const Double_t *curC = GetCovariance(); - for (Int_t i = 0; i < 15; i++){ - if ( curC[i] != inC[i]) return kFALSE; - } + if(memcmp(fPID, inTrack->fPID, AliPID::kSPECIES*sizeof(Double32_t))) return kFALSE; + if(memcmp(fBudget, inTrack->fBudget, 3*sizeof(Double32_t))) return kFALSE; + if(memcmp(&fDE, &inTrack->fDE, sizeof(Double32_t))) return kFALSE; + if(memcmp(&fFakeRatio, &inTrack->fFakeRatio, sizeof(Double32_t))) return kFALSE; + if(memcmp(&fChi2, &inTrack->fChi2, sizeof(Double32_t))) return kFALSE; + if(memcmp(&fMass, &inTrack->fMass, sizeof(Double32_t))) return kFALSE; + if( fLab != inTrack->fLab ) return kFALSE; + if( fN != inTrack->fN ) return kFALSE; + Double32_t l(0.), in(0.); + l = GetIntegratedLength(); in = inTrack->GetIntegratedLength(); + if(memcmp(&l, &in, sizeof(Double32_t))) return kFALSE; + l=GetX(); in=inTrack->GetX(); + if(memcmp(&l, &in, sizeof(Double32_t))) return kFALSE; + l = GetAlpha(); in = inTrack->GetAlpha(); + if(memcmp(&l, &in, sizeof(Double32_t))) return kFALSE; + if(memcmp(GetParameter(), inTrack->GetParameter(), 5*sizeof(Double32_t))) return kFALSE; + if(memcmp(GetCovariance(), inTrack->GetCovariance(), 15*sizeof(Double32_t))) return kFALSE; for (Int_t iTracklet = 0; iTracklet < kNplane; iTracklet++){ AliTRDseedV1 *curTracklet = fTracklet[iTracklet]; @@ -567,7 +566,7 @@ Int_t AliTRDtrackV1::MakeBackupTrack() for(Int_t il(AliTRDgeometry::kNlayer); il--;){ if(!fTracklet[il]) continue; n++; - occupancy+=fTracklet[il]->GetOccupancyTB(); + occupancy+=fTracklet[il]->GetTBoccupancy()/AliTRDseedV1::kNtb; ncls += fTracklet[il]->GetN(); } if(!n) return -1; @@ -636,7 +635,7 @@ Bool_t AliTRDtrackV1::PropagateTo(Double_t xk, Double_t xx0, Double_t xrho) // "xrho" - thickness*density [g/cm^2] // - if (xk == GetX()) return kTRUE; + if (TMath::Abs(xk - GetX()) x1[%6.2f] dx[%6.2f] rho[%f]\n", xyz0[0], xyz1[0], xyz0[0]-xk, xrho/TMath::Abs(xyz0[0]-xk)); if(xyz0[0] < xk) { xrho = -xrho; if (IsStartedTimeIntegral()) { @@ -662,15 +662,15 @@ Bool_t AliTRDtrackV1::PropagateTo(Double_t xk, Double_t xx0, Double_t xrho) AddTimeStep(l2); } } - - if (!AliExternalTrackParam::CorrectForMeanMaterial(xx0, xrho, GetMass())) return kFALSE; + if (!AliExternalTrackParam::CorrectForMeanMaterial(xx0, xrho, fMass)) return kFALSE; { // Energy losses Double_t p2 = (1.0 + GetTgl()*GetTgl()) / (GetSigned1Pt()*GetSigned1Pt()); - Double_t beta2 = p2 / (p2 + GetMass()*GetMass()); + if (fMass<0) p2 *= 4; // q=2 + Double_t beta2 = p2 / (p2 + fMass*fMass); if ((beta2 < 1.0e-10) || ((5940.0 * beta2/(1.0 - beta2 + 1.0e-10) - beta2) < 0.0)) { return kFALSE; @@ -679,6 +679,7 @@ Bool_t AliTRDtrackV1::PropagateTo(Double_t xk, Double_t xx0, Double_t xrho) Double_t dE = 0.153e-3 / beta2 * (TMath::Log(5940.0 * beta2/(1.0 - beta2 + 1.0e-10)) - beta2) * xrho; + if (fMass<0) dE *= 4; // q=2 fBudget[0] += xrho; /* @@ -693,7 +694,7 @@ Bool_t AliTRDtrackV1::PropagateTo(Double_t xk, Double_t xx0, Double_t xrho) /* // Suspicious ! I.B. Double_t sigmade = 0.07 * TMath::Sqrt(TMath::Abs(dE)); // Energy loss fluctuation - Double_t sigmac2 = sigmade*sigmade*fC*fC*(p2+GetMass()*GetMass())/(p2*p2); + Double_t sigmac2 = sigmade*sigmade*fC*fC*(p2+fMass*fMass)/(p2*p2); fCcc += sigmac2; fCee += fX*fX * sigmac2; */ @@ -899,7 +900,7 @@ void AliTRDtrackV1::UpdateESDtrack(AliESDtrack *track) // Update the TRD PID information in the ESD track // - Int_t nslices = fkReconstructor->GetRecoParam()->IsEightSlices() ? (Int_t)AliTRDpidUtil::kNNslices : (Int_t)AliTRDpidUtil::kLQslices; +// Int_t nslices = AliTRDcalibDB::Instance()->GetPIDResponse(fkReconstructor->GetRecoParam()->GetPIDmethod())->GetNumberOfSlices(); // number of tracklets used for PID calculation UChar_t nPID = GetNumberOfTrackletsPID(); // number of tracklets attached to the track @@ -907,17 +908,93 @@ void AliTRDtrackV1::UpdateESDtrack(AliESDtrack *track) // pack the two numbers together and store them in the ESD track->SetTRDntracklets(nPID | (nTrk<<3)); // allocate space to store raw PID signals dEdx & momentum - track->SetNumberOfTRDslices((nslices+2)*AliTRDgeometry::kNlayer); + // independent of the method used to calculate PID (see below AliTRDPIDResponse) + track->SetNumberOfTRDslices((AliTRDseedV1::kNdEdxSlices+2)*AliTRDgeometry::kNlayer); // store raw signals Float_t p, sp; Double_t spd; for (Int_t ip = 0; ip < kNplane; ip++) { if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue; - if(!fTracklet[ip]->HasPID()) continue; + // Fill TRD dEdx info into ESD track + // a. Set Summed dEdx into the first slice + track->SetTRDslice(fTracklet[ip]->GetdQdl(), ip, 0); + // b. Set NN dEdx slices + fTracklet[ip]->CookdEdx(AliTRDPIDResponse::kNslicesNN); const Float_t *dedx = fTracklet[ip]->GetdEdx(); - for (Int_t js = 0; js < nslices; js++, dedx++) track->SetTRDslice(*dedx, ip, js); + for (Int_t js(0), ks(1); js < AliTRDPIDResponse::kNslicesNN; js++, ks++, dedx++){ + if(ks>=AliTRDseedV1::kNdEdxSlices){ + AliError(Form("Exceed allocated space for dEdx slices.")); + break; + } + track->SetTRDslice(*dedx, ip, ks); + } + // fill TRD momentum info into ESD track p = fTracklet[ip]->GetMomentum(&sp); spd = sp; track->SetTRDmomentum(p, ip, &spd); + // store global quality per tracklet instead of momentum error + // 26.09.11 A.Bercuci + // first implementation store no. of time bins filled in tracklet (5bits see "y" bits) and + // no. of double clusters in case of pad row cross (4bits see "x" bits) + // bit map for tracklet quality xxxxyyyyy + // 27.10.11 A.Bercuci + // add chamber status bit "z" bit + // bit map for tracklet quality zxxxxyyyyy + // 12.11.11 A.Bercuci + // fit tracklet quality into the field fTRDTimeBin [Char_t] + // bit map for tracklet quality zxxyyyyy + // The information should be retrieved by the following functions of AliESDtrack for each TRD layer + // GetTRDtrkltOccupancy(layer) -> no of TB filled in tracklet + // GetTRDtrkltClCross(layer) -> no of TB filled in crossing pad rows + // IsTRDtrkltChmbGood(layer) -> status of the chamber from which the tracklet is found + Int_t nCross(fTracklet[ip]->IsRowCross()?fTracklet[ip]->GetTBcross():0); if(nCross>3) nCross = 3; + Char_t trackletQ = Char_t(fTracklet[ip]->GetTBoccupancy() | (nCross<<5) | (fTracklet[ip]->IsChmbGood()<<7)); + track->SetTRDTimBin(trackletQ, ip); } // store PID probabilities track->SetTRDpid(fPID); + + //store truncated mean + track->SetTRDsignal(fTruncatedMean); + track->SetTRDNchamberdEdx(fNchamberdEdx); + track->SetTRDNclusterdEdx(fNclusterdEdx); +} + +//_______________________________________________________________ +Double_t AliTRDtrackV1::CookTruncatedMean(const Bool_t kinvq, const Double_t mag, const Int_t charge, const Int_t kcalib, Int_t &nch, Int_t &ncls, TVectorD *Qs, TVectorD *Xs, Int_t timeBin0, Int_t timeBin1, Int_t tstep) const +{ + // + //Origin: Xianguo Lu , Marian Ivanov + // + + TVectorD arrayQ(200), arrayX(200); + ncls = AliTRDdEdxReconUtils::GetArrayClusterQ(kinvq, &arrayQ, &arrayX, this, timeBin0, timeBin1, tstep); + + const TObjArray *cobj = kcalib ? AliTRDdEdxCalibUtils::GetObj(kinvq, mag, charge) : NULL; + + const Double_t tmean = AliTRDdEdxReconUtils::ToyCook(kinvq, ncls, &arrayQ, &arrayX, cobj); + + nch = AliTRDdEdxReconUtils::UpdateArrayX(ncls, &arrayX); + + if(Qs && Xs){ + (*Qs)=arrayQ; + (*Xs)=arrayX; + } + + //printf("\ntest %.10f %d %d\n", tmean, nch, ncls); + + return tmean; +} + +//_______________________________________________________________ +TObject* AliTRDtrackV1::Clone(const char* newname) const +{ + // temporary override TObject::Clone to avoid crashes in reco + AliTRDtrackV1* src = (AliTRDtrackV1*)this; + Bool_t isown = src->IsOwner(); + AliInfo(Form("src_owner %d",isown)); + AliTRDtrackV1* dst = new AliTRDtrackV1(*src); + if (isown) { + src->SetBit(kOwner); + dst->SetOwner(); + } + return dst; }