From 9dcc64ccb5cfd65dab7d61cd88e4ec7e35df6171 Mon Sep 17 00:00:00 2001 From: abercuci Date: Fri, 25 Feb 2011 17:04:04 +0000 Subject: [PATCH] new tracking for PbPb and pp (Alex) new 1D PID (Markus) new tail cancellation (Ionut) --- .../Calib/PIDLQ1D/Run0_999999999_v0_s0.root | Bin 0 -> 13528 bytes .../RecoParam/Run95352_999999999_v0_s1.root | Bin 4616 -> 4632 bytes .../TrkAttach/Run95352_999999999_v0_s0.root | Bin 0 -> 23175 bytes PWG1/TRD/AliTRDresolution.cxx | 45 +- PWG1/TRD/AliTRDresolution.h | 7 +- PWG1/TRD/macros/AddTRDresolution.C | 2 +- TRD/AliTRDReconstructor.cxx | 2 +- TRD/AliTRDcalibDB.cxx | 34 +- TRD/AliTRDcalibDB.h | 12 +- TRD/AliTRDcluster.h | 12 + TRD/AliTRDclusterizer.cxx | 72 +- TRD/AliTRDclusterizer.h | 2 + TRD/AliTRDrecoParam.cxx | 4 +- TRD/AliTRDrecoParam.h | 37 +- TRD/AliTRDseedV1.cxx | 1118 +++++++++++------ TRD/AliTRDseedV1.h | 6 +- TRD/AliTRDtrackV1.cxx | 92 +- TRD/AliTRDtrackV1.h | 1 - TRD/AliTRDtrackerV1.cxx | 23 +- TRD/AliTRDtrackerV1.h | 3 +- TRD/AliTRDtransform.cxx | 34 +- TRD/AliTRDtransform.h | 5 +- TRD/CMakelibTRDbase.pkg | 2 +- TRD/CMakelibTRDrec.pkg | 2 +- TRD/Cal/AliTRDCreateOCDBPIDLQ.C | 31 + TRD/Cal/AliTRDmakeRecoParamFirstPhysics.C | 11 +- TRD/Cal/AliTRDmakeTrkDB.C | 28 + TRD/TRDbaseLinkDef.h | 1 + TRD/TRDrecLinkDef.h | 1 + 29 files changed, 1036 insertions(+), 551 deletions(-) create mode 100644 OCDB/TRD/Calib/PIDLQ1D/Run0_999999999_v0_s0.root create mode 100644 OCDB/TRD/Calib/TrkAttach/Run95352_999999999_v0_s0.root create mode 100644 TRD/Cal/AliTRDCreateOCDBPIDLQ.C create mode 100644 TRD/Cal/AliTRDmakeTrkDB.C diff --git a/OCDB/TRD/Calib/PIDLQ1D/Run0_999999999_v0_s0.root b/OCDB/TRD/Calib/PIDLQ1D/Run0_999999999_v0_s0.root new file mode 100644 index 0000000000000000000000000000000000000000..4e73c5b5375b94aee6316eae474f858d202469be GIT binary patch literal 13528 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 MAeI$3)?}dn2Du3mQvd(} literal 0 HcmV?d00001 diff --git a/OCDB/TRD/Calib/RecoParam/Run95352_999999999_v0_s1.root b/OCDB/TRD/Calib/RecoParam/Run95352_999999999_v0_s1.root index c8b5e37bc07b2d8e601c528efadf782e6c404341..88fed71d3c4d97972777f494107025e95681ecbd 100644 GIT binary patch delta 702 zcmeBBnW17@l%HS1z;N~v0|P?}1A~wR1B2jHAiEie8G-l`3xvV4fPsO>m4Q*j=X-*~ z_sKDg5)=K!rGRSq7(gnfI&9{-z)%U+0yKt!Ve)%{_=$I8l!3xvDF%iOK+#J;43=hK z5O|7Ym?XCz$QUj*klM)&j2eueCa+|i7OQdp-xD8!8BZ0OwDRk({@+*XHDyh+tjnE$ zOjGWO|FbS`6QBRL=x(dm{&jP={b#tkoN1|P|9at-RWBYMC|F_d_V{&ThsK4uNdngx zZ8>-^voB73^}^%uBMzCR0@X90PM*QExnAOxYb&$LnZ~0}8yIt3ThB0viC*HJ;G)Rm zC$jB$vE5m{k!CVrm~^B@k))2D#rHwrj;B4+LZ?uwcj)4ymODy zTlRpLJkx`vmK&Pn4m>$Hfz_MK$D!QPz+i^r=hnuPj`t;}$b511aK^$T*P)5X>AUzy}G{m3Mj3D-^=tX**7 zVT<`>5t-s3ZK2OWU0$Mdg1RSpPc|0)B3dKdy~(><^o~$>aB;&bNlRXz(%v(ryk{n9 zIlMcmt*5Ew%eMS3Q^0A>ttwkrL@4U+_fS;dALFiA&m1BBN<+o@l-+`hTqiv`_pUHm zAJKn$^Nt-Rp^B;-RYDJ*Si%xfzD!M1LQ+ENm1cvHdt6V1W@b3^WIr&9fe8f|o2swDG4B9M6rkk8kir_`lUZEC6I@c1nwXnfvsR2t1wqS|AH0F(e2YAmjz7PM$58!75R1I)woMA!+{< delta 664 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 Xi~m1)|0&S_?|C26n#2T%q+|RCN3sSg literal 0 HcmV?d00001 diff --git a/PWG1/TRD/AliTRDresolution.cxx b/PWG1/TRD/AliTRDresolution.cxx index b5b62ffad75..dc51e274e17 100644 --- a/PWG1/TRD/AliTRDresolution.cxx +++ b/PWG1/TRD/AliTRDresolution.cxx @@ -130,7 +130,7 @@ AliTRDresolution::AliTRDresolution() ,fIdxPlot(0) ,fIdxFrame(0) ,fPtThreshold(1.) - ,fDyRange(1.5) + ,fDyRange(0.75) ,fDBPDG(NULL) ,fGraphS(NULL) ,fGraphM(NULL) @@ -154,7 +154,7 @@ AliTRDresolution::AliTRDresolution(char* name) ,fIdxPlot(0) ,fIdxFrame(0) ,fPtThreshold(1.) - ,fDyRange(1.5) + ,fDyRange(0.75) ,fDBPDG(NULL) ,fGraphS(NULL) ,fGraphM(NULL) @@ -242,6 +242,8 @@ Bool_t AliTRDresolution::Pulls(Double_t dyz[2], Double_t cov[3], Double_t tilt) // Uses functionality defined by AliTRDseedV1. Double_t t2(tilt*tilt); + // exit door until a bug fix is found for AliTRDseedV1::GetCovSqrt + return kTRUE; // rotate along pad Double_t cc[3]; @@ -402,9 +404,9 @@ TH1* AliTRDresolution::PlotCluster(const AliTRDtrackV1 *track) y0 = par[1] + dydx * (x0 - par[0]);//param[1] + dydx * (x0 - param[0]); z0 = param[2] + dzdx * (x0 - param[0]); } else { - y0 = fTracklet->GetYref(0); + y0 = fTracklet->GetYfit(0);//fTracklet->GetYref(0); z0 = fTracklet->GetZref(0); - dydx = fTracklet->GetYref(1); + dydx = fTracklet->GetYfit(1);//fTracklet->GetYref(1); dzdx = fTracklet->GetZref(1); } /*printf("RC[%c] Primary[%c]\n" @@ -430,7 +432,7 @@ TH1* AliTRDresolution::PlotCluster(const AliTRDtrackV1 *track) // rotate along pad dy[1] = cost*(dy[0] - dz[0]*tilt); dz[1] = cost*(dz[0] + dy[0]*tilt); - if(pt>fPtThreshold && c->IsInChamber()) ((TH3S*)arr->At(0))->Fill(dydx, dy[1], sgm[fSegmentLevel]); + if(pt>fPtThreshold && c->IsInChamber()) ((TH3S*)arr->At(0))->Fill(fTracklet->GetYref(1), dy[0], sgm[fSegmentLevel]); // tilt rotation of covariance for clusters Double_t sy2(c->GetSigmaY2()), sz2(c->GetSigmaZ2()); @@ -535,7 +537,7 @@ TH1* AliTRDresolution::PlotTracklet(const AliTRDtrackV1 *track) dy[1]= cost*(dy[0] - dz[0]*tilt); dz[1]= cost*(dz[0] + dy[0]*tilt); ((TH3S*)arr->At(0))->Fill(phi, dy[1], sgm[fSegmentLevel]+rc*fgkNresYsegm[fSegmentLevel]); - ((TH3S*)arr->At(2))->Fill(tht, dz[1], rc); + if(rc) ((TH2S*)arr->At(2))->Fill(tht, dz[1]); // compute covariance matrix fTracklet->GetCovAt(x, cov); @@ -546,9 +548,12 @@ TH1* AliTRDresolution::PlotTracklet(const AliTRDtrackV1 *track) ((TH3S*)arr->At(1))->Fill(sgm[fSegmentLevel], dyz[0], dyz[1]); ((TH3S*)arr->At(3))->Fill(tht, dyz[1], rc); - Double_t dphi((phi-fTracklet->GetYfit(1))/(1-phi*fTracklet->GetYfit(1))); + // calculate angular residuals and correct for tilt + Double_t phiTrklt = fTracklet->GetYfit(1); + phiTrklt += tilt*tht; + Double_t dphi((phi-phiTrklt)/(1-phi*phiTrklt)); Double_t dtht((tht-fTracklet->GetZfit(1))/(1-tht*fTracklet->GetZfit(1))); - ((TH2I*)arr->At(4))->Fill(phi, TMath::ATan(dphi)); + ((TH3S*)arr->At(4))->Fill(phi, TMath::ATan(dphi), sgm[fSegmentLevel]); if(DebugLevel()>=1){ UChar_t err(fTracklet->GetErrorMsg()); @@ -610,7 +615,7 @@ TH1* AliTRDresolution::PlotTrackIn(const AliTRDtrackV1 *track) break; } if(!fTracklet || TMath::Abs(x-fTracklet->GetX())>1.e-3){ - AliWarning("Tracklet did not match Track."); + AliDebug(1, "Tracklet did not match Track."); return NULL; } Int_t sgm[3]; @@ -785,7 +790,7 @@ TH1* AliTRDresolution::PlotTrackOut(const AliTRDtrackV1 *track) break; } if(!fTracklet || TMath::Abs(x-fTracklet->GetX())>1.e-3){ - AliWarning("Tracklet did not match Track position."); + AliDebug(1, "Tracklet did not match Track position."); return NULL; } Int_t sgm[3]; @@ -2273,7 +2278,7 @@ void AliTRDresolution::AdjustF1(TH1 *h, TF1 *f) } //________________________________________________________ -TObjArray* AliTRDresolution::BuildMonitorContainerCluster(const char* name, Bool_t expand) +TObjArray* AliTRDresolution::BuildMonitorContainerCluster(const char* name, Bool_t expand, Float_t range) { // Build performance histograms for AliTRDcluster.vs TRD track or MC // - y reziduals/pulls @@ -2285,12 +2290,13 @@ TObjArray* AliTRDresolution::BuildMonitorContainerCluster(const char* name, Bool // tracklet resolution/pull in y direction snprintf(hname, 100, "%s_%s_Y", GetNameId(), name); snprintf(htitle, 300, "Y res for \"%s\" @ %s;tg(#phi);#Delta y [cm];%s", GetNameId(), name, fgkResYsegmName[fSegmentLevel]); + Float_t rr = range<0.?fDyRange:range; if(!(h = (TH3S*)gROOT->FindObject(hname))){ Int_t nybins=fgkNresYsegm[fSegmentLevel]; if(expand) nybins*=2; h = new TH3S(hname, htitle, 48, -.48, .48, // phi - 60, -fDyRange, fDyRange, // dy + 60, -rr, rr, // dy nybins, -0.5, nybins-0.5);// segment } else h->Reset(); arr->AddAt(h, 0); @@ -2311,15 +2317,15 @@ TObjArray* AliTRDresolution::BuildMonitorContainerTracklet(const char* name, Boo // - y reziduals/pulls // - z reziduals/pulls // - phi reziduals - TObjArray *arr = BuildMonitorContainerCluster(name, expand); + TObjArray *arr = BuildMonitorContainerCluster(name, expand, 0.05); arr->Expand(5); TH1 *h(NULL); char hname[100], htitle[300]; // tracklet resolution/pull in z direction snprintf(hname, 100, "%s_%s_Z", GetNameId(), name); - snprintf(htitle, 300, "Z res for \"%s\" @ %s;tg(#theta);#Delta z [cm];row cross", GetNameId(), name); - if(!(h = (TH3S*)gROOT->FindObject(hname))){ - h = new TH3S(hname, htitle, 50, -1., 1., 100, -1.5, 1.5, 2, -0.5, 1.5); + snprintf(htitle, 300, "Z res for \"%s\" @ %s;tg(#theta);#Delta z [cm]", GetNameId(), name); + if(!(h = (TH2S*)gROOT->FindObject(hname))){ + h = new TH2S(hname, htitle, 50, -1., 1., 100, -.05, .05); } else h->Reset(); arr->AddAt(h, 2); snprintf(hname, 100, "%s_%s_Zpull", GetNameId(), name); @@ -2333,9 +2339,10 @@ TObjArray* AliTRDresolution::BuildMonitorContainerTracklet(const char* name, Boo // tracklet to track phi resolution snprintf(hname, 100, "%s_%s_PHI", GetNameId(), name); - snprintf(htitle, 300, "#Phi res for \"%s\" @ %s;tg(#phi);#Delta #phi [rad];entries", GetNameId(), name); - if(!(h = (TH2I*)gROOT->FindObject(hname))){ - h = new TH2I(hname, htitle, 21, -.33, .33, 100, -.5, .5); + snprintf(htitle, 300, "#Phi res for \"%s\" @ %s;tg(#phi);#Delta #phi [rad];%s", GetNameId(), name, fgkResYsegmName[fSegmentLevel]); + Int_t nsgms=fgkNresYsegm[fSegmentLevel]; + if(!(h = (TH3S*)gROOT->FindObject(hname))){ + h = new TH3S(hname, htitle, 48, -.48, .48, 100, -.5, .5, nsgms, -0.5, nsgms-0.5); } else h->Reset(); arr->AddAt(h, 4); diff --git a/PWG1/TRD/AliTRDresolution.h b/PWG1/TRD/AliTRDresolution.h index 73df3f1d501..c3bcb6a37bb 100644 --- a/PWG1/TRD/AliTRDresolution.h +++ b/PWG1/TRD/AliTRDresolution.h @@ -60,6 +60,11 @@ public: ,kTrkltToMC = 5 ,kNOutSlots = 4 }; + enum ETRDresolutionSegmentation { + kSector = 0 + ,kStack + ,kDetector + }; AliTRDresolution(); AliTRDresolution(char* name); @@ -114,7 +119,7 @@ private: AliTRDresolution& operator=(const AliTRDresolution&); void AdjustF1(TH1 *h, TF1 *f); - TObjArray* BuildMonitorContainerCluster(const char* name, Bool_t expand=kFALSE); + TObjArray* BuildMonitorContainerCluster(const char* name, Bool_t expand=kFALSE, Float_t range=-1.); TObjArray* BuildMonitorContainerTracklet(const char* name, Bool_t expand=kFALSE); TObjArray* BuildMonitorContainerTrack(const char* name); void GetLandauMpvFwhm(TF1 * const f, Float_t &mpv, Float_t &xm, Float_t &xM); diff --git a/PWG1/TRD/macros/AddTRDresolution.C b/PWG1/TRD/macros/AddTRDresolution.C index db53a00a22a..b74a56e19e9 100644 --- a/PWG1/TRD/macros/AddTRDresolution.C +++ b/PWG1/TRD/macros/AddTRDresolution.C @@ -25,7 +25,7 @@ void AddTRDresolution(AliAnalysisManager *mgr, Int_t map, AliAnalysisDataContain res->SetMCdata(mgr->GetMCtruthEventHandler()); res->SetPostProcess(kFALSE); res->SetDebugLevel(0); - //if(itq==0) res->SetSegmentationLevel(1); + if(itq==0) res->SetSegmentationLevel(AliTRDresolution::kDetector); // use these settings if you know what you are doing ! //res->SetTrackRefit(); //res->SetPtThreshold(0.); diff --git a/TRD/AliTRDReconstructor.cxx b/TRD/AliTRDReconstructor.cxx index 1fdacd42529..26fe457ce32 100644 --- a/TRD/AliTRDReconstructor.cxx +++ b/TRD/AliTRDReconstructor.cxx @@ -95,7 +95,7 @@ AliTRDReconstructor::AliTRDReconstructor() // write clusters [cw] SETFLG(fSteerParam, kWriteClusters); // track seeding (stand alone tracking) [sa] - SETFLG(fSteerParam, kSeeding); + //SETFLG(fSteerParam, kSeeding); // Cluster radial correction during reconstruction [cc] //SETFLG(fSteerParam, kClRadialCorr); memset(fDebugStream, 0, sizeof(TTreeSRedirector *) * AliTRDrecoParam::kTRDreconstructionTasks); diff --git a/TRD/AliTRDcalibDB.cxx b/TRD/AliTRDcalibDB.cxx index 4e136e899a0..1f50533b946 100644 --- a/TRD/AliTRDcalibDB.cxx +++ b/TRD/AliTRDcalibDB.cxx @@ -47,6 +47,7 @@ #include "Cal/AliTRDCalChamberStatus.h" #include "Cal/AliTRDCalPadStatus.h" #include "Cal/AliTRDCalSingleChamberStatus.h" +#include "Cal/AliTRDCalTrkAttach.h" ClassImp(AliTRDcalibDB) @@ -102,6 +103,7 @@ AliTRDcalibDB::AliTRDcalibDB() ,fPRFhi(0) ,fPRFwid(0) ,fPRFpad(0) + ,fPIDResponse(NULL) { // // Default constructor @@ -131,6 +133,7 @@ AliTRDcalibDB::AliTRDcalibDB(const AliTRDcalibDB &c) ,fPRFhi(0) ,fPRFwid(0) ,fPRFpad(0) + ,fPIDResponse(NULL) { // // Copy constructor (not that it make any sense for a singleton...) @@ -172,6 +175,7 @@ AliTRDcalibDB::~AliTRDcalibDB() delete [] fPRFsmp; fPRFsmp = 0; } + if(fPIDResponse) delete fPIDResponse; Invalidate(); @@ -256,10 +260,15 @@ const TObject *AliTRDcalibDB::GetCachedCDBObject(Int_t id) case kIDPIDLQ : return CacheCDBEntry(kIDPIDLQ ,"TRD/Calib/PIDLQ"); break; + case kIDPIDLQ1D: + return CacheCDBEntry(kIDPIDLQ1D ,"TRD/Calib/PIDLQ1D"); + break; case kIDRecoParam : - return CacheCDBEntry(kIDRecoParam ,"TRD/Calib/RecoParam"); + return CacheCDBEntry(kIDRecoParam ,"TRD/Calib/RecoParam"); + break; + case kIDAttach : + return CacheCDBEntry(kIDAttach ,"TRD/Calib/TrkAttach"); break; - } return 0; @@ -1148,6 +1157,27 @@ const AliTRDCalPID *AliTRDcalibDB::GetPIDObject(AliTRDpidUtil::ETRDPIDMethod met } +//_____________________________________________________________________________ +AliTRDPIDResponse *AliTRDcalibDB::GetPIDResponse(AliTRDPIDResponse::ETRDPIDMethod method){ + if(!fPIDResponse){ + fPIDResponse = new AliTRDPIDResponse; + // Load Reference Histos from OCDB + fPIDResponse->SetPIDmethod(method); + fPIDResponse->Load(dynamic_cast(GetCachedCDBObject(kIDPIDLQ1D))); + } + return fPIDResponse; +} + +//_____________________________________________________________________________ +const AliTRDCalTrkAttach* AliTRDcalibDB::GetAttachObject() +{ + // + // Returns the object storing likelihood distributions for cluster to track attachment + // + return dynamic_cast(GetCachedCDBObject(kIDAttach)); +} + + //_____________________________________________________________________________ const AliTRDCalMonitoring *AliTRDcalibDB::GetMonitoringObject() { diff --git a/TRD/AliTRDcalibDB.h b/TRD/AliTRDcalibDB.h index 8b6cd8bf4db..25d7f660466 100644 --- a/TRD/AliTRDcalibDB.h +++ b/TRD/AliTRDcalibDB.h @@ -19,9 +19,14 @@ #include "AliTRDpidUtil.h" #endif +#ifndef ALITRDPIDRESPONSE_H +#include "AliTRDPIDResponse.h" +#endif + class AliCDBEntry; class AliTRDrecoParam; +class AliTRDCalTrkAttach; class AliTRDCalPID; class AliTRDCalMonitoring; class AliTRDCalROC; @@ -80,6 +85,7 @@ class AliTRDcalibDB : public TObject { Char_t GetPadStatus(Int_t det, Int_t col, Int_t row); AliTRDCalSingleChamberStatus *GetPadStatusROC(Int_t det); AliTRDrecoParam* GetRecoParam(Int_t *eventtype); + AliTRDPIDResponse *GetPIDResponse(AliTRDPIDResponse::ETRDPIDMethod m); Char_t GetChamberStatus(Int_t det); @@ -94,6 +100,7 @@ class AliTRDcalibDB : public TObject { const AliTRDCalMonitoring *GetMonitoringObject(); const AliTRDCalPID *GetPIDObject(AliTRDpidUtil::ETRDPIDMethod m); + const AliTRDCalTrkAttach *GetAttachObject(); // Related functions, these depend on calibration data Int_t PadResponse(Double_t signal, Double_t dist @@ -117,11 +124,13 @@ class AliTRDcalibDB : public TObject { , kIDSuperModulePos , kIDPIDNN , kIDPIDLQ + , kIDPIDLQ1D , kIDRecoParam , kIDMonitoringData , kIDChamberStatus , kIDPadStatus , kIDDCS + , kIDAttach , kCDBCacheSize }; // IDs of cached objects const TObject *GetCachedCDBObject(Int_t id); @@ -146,6 +155,7 @@ class AliTRDcalibDB : public TObject { Float_t fPRFhi; // Higher boundary of the PRF Float_t fPRFwid; // Bin width of the sampled PRF Int_t fPRFpad; // Distance to next pad in PRF + AliTRDPIDResponse *fPIDResponse; // TRD PID Response function private: @@ -154,7 +164,7 @@ class AliTRDcalibDB : public TObject { AliTRDcalibDB &operator=(const AliTRDcalibDB &c); virtual ~AliTRDcalibDB(); - ClassDef(AliTRDcalibDB, 4) // Provides central access to the CDB + ClassDef(AliTRDcalibDB, 5) // Provides central access to the CDB }; diff --git a/TRD/AliTRDcluster.h b/TRD/AliTRDcluster.h index 6373fc462b9..244497d81e4 100644 --- a/TRD/AliTRDcluster.h +++ b/TRD/AliTRDcluster.h @@ -17,6 +17,7 @@ class AliTRDtrackletWord; class AliTRDcluster : public AliCluster { friend class AliHLTTRDCluster; + friend class AliTRDtrackletOflHelper; public: enum ETRDclusterStatus { @@ -115,6 +116,8 @@ protected: Float_t fQ; // Amplitude Float_t fCenter; // Center of the cluster relative to the pad + inline void Update(Short_t adc[7]); + private: Float_t GetDYcog(const Double_t *const y1=0x0, const Double_t *const y2=0x0); @@ -129,6 +132,15 @@ private: }; +//___________________________________________________ +inline void AliTRDcluster::Update(Short_t adc[7]) +{ + memcpy(fSignals, adc, 7*sizeof(Short_t)); + fQ = Float_t(adc[2]+adc[3]+adc[4]); + if(IsRPhiMethod(AliTRDcluster::kLUT)) GetDYlut(); + else GetDYcog(); +} + //________________________________________________ inline Bool_t AliTRDcluster::IsRPhiMethod(ETRDclusterStatus m) const { diff --git a/TRD/AliTRDclusterizer.cxx b/TRD/AliTRDclusterizer.cxx index 6801e09b41e..60bad65c4d9 100644 --- a/TRD/AliTRDclusterizer.cxx +++ b/TRD/AliTRDclusterizer.cxx @@ -587,9 +587,9 @@ Bool_t AliTRDclusterizer::Raw2ClustersChamber(AliRawReader *rawReader) else fRawStream->SetReader(rawReader); - if(fReconstructor->IsHLT()){ + //if(fReconstructor->IsHLT()){ fRawStream->DisableErrorStorage(); - } + //} // register tracklet array for output if (fReconstructor->IsProcessingTracklets()) @@ -1185,14 +1185,78 @@ void AliTRDclusterizer::TailCancelation(const AliTRDrecoParam* const recoParam) } // Apply the tail cancelation via the digital filter - DeConvExp(fDigits->GetDataAddress(iRow,iCol),fTimeTotal,nexp); - + //DeConvExp(fDigits->GetDataAddress(iRow,iCol),fTimeTotal,nexp); + ApplyTCTM(fDigits->GetDataAddress(iRow,iCol),fTimeTotal,nexp); } // while irow icol return; } + +//_____________________________________________________________________________ +void AliTRDclusterizer::ApplyTCTM(Short_t *const arr, const Int_t nTime, const Int_t nexp) +{ + // + // Steer tail cancellation + // + + + switch(nexp) { + case 1: + case 2: + DeConvExp(arr,nTime,nexp); + break; + case -1: + ConvExp(arr,nTime); + break; + case -2: + DeConvExp(arr,nTime,1); + ConvExp(arr,nTime); + break; + default: + break; + } +} + + +//_____________________________________________________________________________ +void AliTRDclusterizer::ConvExp(Short_t *const arr, const Int_t nTime) +{ + // + // Tail maker + // + + // Initialization (coefficient = alpha, rates = lambda) + Float_t slope = 1.0; + Float_t coeff = 0.5; + Float_t rate; + + Double_t par[4]; + fReconstructor->GetRecoParam()->GetTCParams(par); + slope = par[1]; + coeff = par[3]; + + Double_t dt = 0.1; + + rate = TMath::Exp(-dt/(slope)); + + Float_t reminder = .0; + Float_t correction = 0.0; + Float_t result = 0.0; + + for (int i = nTime-1; i >= 0; i--) { + + result = arr[i] + correction - fBaseline; // No rescaling + arr[i] = (Short_t)(result + fBaseline + 0.5f); + + correction = 0.0; + + correction += reminder = rate * (reminder + coeff * result); + } +} + + //_____________________________________________________________________________ void AliTRDclusterizer::DeConvExp(Short_t *const arr, const Int_t nTime, const Int_t nexp) { diff --git a/TRD/AliTRDclusterizer.h b/TRD/AliTRDclusterizer.h index 7a9414b6f76..83ff093c05a 100644 --- a/TRD/AliTRDclusterizer.h +++ b/TRD/AliTRDclusterizer.h @@ -111,7 +111,9 @@ class AliTRDclusterizer : public TNamed protected: + void ApplyTCTM(Short_t *const arr, const Int_t nTime, const Int_t nexp); void DeConvExp (Short_t *const arr, const Int_t nTime, const Int_t nexp); + void ConvExp(Short_t *const arr, const Int_t nTime); void TailCancelation(const AliTRDrecoParam* const recoParam); Float_t Unfold(Double_t eps, Int_t layer, const Double_t *const padSignal) const; diff --git a/TRD/AliTRDrecoParam.cxx b/TRD/AliTRDrecoParam.cxx index 9ff9cd06c37..97af520c86c 100644 --- a/TRD/AliTRDrecoParam.cxx +++ b/TRD/AliTRDrecoParam.cxx @@ -61,7 +61,7 @@ AliTRDrecoParam::AliTRDrecoParam() ,fkTrackLikelihood(-15.) ,fNumberOfConfigs(3) ,fFlags(0) - ,fRawStreamVersion("REAL") + ,fRawStreamVersion("DEFAULT") ,fMinMaxCutSigma(4.) ,fMinLeftRightCutSigma(8.) ,fClusMaxThresh(4.5) @@ -94,7 +94,7 @@ AliTRDrecoParam::AliTRDrecoParam() memset(fPIDThreshold, 0, AliTRDCalPID::kNMom*sizeof(Double_t)); memset(fStreamLevel, 0, kTRDreconstructionTasks * sizeof(Int_t)); - SetPIDNeuralNetwork(); + SetPIDmethod(AliTRDPIDResponse::kLQ1D); SetEightSlices(); SetImproveTracklets(); SetLUT(); diff --git a/TRD/AliTRDrecoParam.h b/TRD/AliTRDrecoParam.h index a12b902b3c3..86325b1f1d1 100644 --- a/TRD/AliTRDrecoParam.h +++ b/TRD/AliTRDrecoParam.h @@ -14,10 +14,15 @@ #ifndef ALIDETECTORRECOPARAM_H #include "AliDetectorRecoParam.h" #endif + #ifndef ALITRDCALPID_H #include "Cal/AliTRDCalPID.h" #endif +#ifndef ALITRDPIDRESPONSE_H +#include "AliTRDPIDResponse.h" +#endif + class TString; class AliTRDrecoParam : public AliDetectorRecoParam @@ -57,6 +62,7 @@ public: Double_t GetNSigmaClusters() const { return fkNSigmaClusters; } Double_t GetFindableClusters() const { return fkFindable; } inline Int_t GetPIDLQslices() const; + inline AliTRDPIDResponse::ETRDPIDMethod GetPIDmethod() const; Double_t GetMaxTheta() const { return fkMaxTheta; } Double_t GetMaxPhi() const { return fkMaxPhi; } Double_t GetPlaneQualityThreshold() const { return fkPlaneQualityThreshold; } @@ -109,6 +115,7 @@ public: void SetLUT(Bool_t b=kTRUE) {if(b) SETBIT(fFlags, kLUT); else CLRBIT(fFlags, kLUT);} void SetGAUS(Bool_t b=kTRUE) {if(b) SETBIT(fFlags, kGAUS); else CLRBIT(fFlags, kGAUS);} void SetPIDNeuralNetwork(Bool_t b=kTRUE) {if(b) SETBIT(fFlags, kSteerPID); else CLRBIT(fFlags, kSteerPID);} + inline void SetPIDmethod(AliTRDPIDResponse::ETRDPIDMethod method); void SetPIDLQslices(Int_t s); void SetTailCancelation(Bool_t b=kTRUE) {if(b) SETBIT(fFlags, kTailCancelation); else CLRBIT(fFlags, kTailCancelation);} void SetXenon(Bool_t b = kTRUE) {if(b) CLRBIT(fFlags, kDriftGas); else SETBIT(fFlags, kDriftGas);} @@ -177,7 +184,7 @@ private: // Reconstruction Options for TRD reconstruction Int_t fStreamLevel[kTRDreconstructionTasks]; // Stream Level Long64_t fFlags; // option Flags - + // Raw Reader Params TString fRawStreamVersion; // Raw Reader version @@ -253,4 +260,32 @@ inline Int_t AliTRDrecoParam::GetPIDLQslices() const return TESTBIT(fFlags, kLQ2D) ? 2 : 1; } +//___________________________________________________ +inline AliTRDPIDResponse::ETRDPIDMethod AliTRDrecoParam::GetPIDmethod() const +{ + AliTRDPIDResponse::ETRDPIDMethod method = AliTRDPIDResponse::kLQ1D; + if(IsPIDNeuralNetwork()) method = AliTRDPIDResponse::kNN; + else if(TESTBIT(fFlags, kLQ2D)) method = AliTRDPIDResponse::kLQ2D; + return method; +} + +//___________________________________________________ +inline void AliTRDrecoParam::SetPIDmethod(AliTRDPIDResponse::ETRDPIDMethod method) +{ + switch(method){ + case AliTRDPIDResponse::kLQ2D: + CLRBIT(fFlags, kSteerPID); + SETBIT(fFlags, kLQ2D); + break; + case AliTRDPIDResponse::kNN: + SETBIT(fFlags, kSteerPID); + break; + case AliTRDPIDResponse::kLQ1D: + default: + CLRBIT(fFlags, kSteerPID); + CLRBIT(fFlags, kLQ2D); + break; + } +} + #endif diff --git a/TRD/AliTRDseedV1.cxx b/TRD/AliTRDseedV1.cxx index 3061dcd8268..a1573784028 100644 --- a/TRD/AliTRDseedV1.cxx +++ b/TRD/AliTRDseedV1.cxx @@ -36,7 +36,8 @@ //////////////////////////////////////////////////////////////////////////// #include "TMath.h" -#include +#include "TTreeStream.h" +#include "TGraphErrors.h" #include "AliLog.h" #include "AliMathBase.h" @@ -45,6 +46,7 @@ #include "AliTRDReconstructor.h" #include "AliTRDpadPlane.h" +#include "AliTRDtransform.h" #include "AliTRDcluster.h" #include "AliTRDseedV1.h" #include "AliTRDtrackV1.h" @@ -54,7 +56,9 @@ #include "AliTRDtrackerV1.h" #include "AliTRDrecoParam.h" #include "AliTRDCommonParam.h" +#include "AliTRDtrackletOflHelper.h" +#include "Cal/AliTRDCalTrkAttach.h" #include "Cal/AliTRDCalPID.h" #include "Cal/AliTRDCalROC.h" #include "Cal/AliTRDCalDet.h" @@ -483,7 +487,7 @@ Float_t AliTRDseedV1::GetAnodeWireOffset(Float_t zt) //____________________________________________________________________ -Float_t AliTRDseedV1::GetCharge(Bool_t useOutliers) +Float_t AliTRDseedV1::GetCharge(Bool_t useOutliers) const { // Computes total charge attached to tracklet. If "useOutliers" is set clusters // which are not in chamber are also used (default false) @@ -538,6 +542,15 @@ Bool_t AliTRDseedV1::GetEstimatedCrossPoint(Float_t &x, Float_t &z) const return kTRUE; } +//____________________________________________________________________ +Float_t AliTRDseedV1::GetdQdl() const +{ +// Calculate total charge / tracklet length for 1D PID +// + Float_t Q = GetCharge(kTRUE); + return Q/TMath::Sqrt(1. + fYref[1]*fYref[1] + fZref[1]*fZref[1]); +} + //____________________________________________________________________ Float_t AliTRDseedV1::GetdQdl(Int_t ic, Float_t *dl) const { @@ -629,6 +642,7 @@ Float_t AliTRDseedV1::GetMomentum(Float_t *err) const return p; } + //____________________________________________________________________ Float_t AliTRDseedV1::GetOccupancyTB() const { @@ -964,8 +978,9 @@ void AliTRDseedV1::SetPadPlane(AliTRDpadPlane * const p) } + //____________________________________________________________________ -Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t tilt) +Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t tilt, Bool_t chgPos, Int_t ev) { // // Projective algorithm to attach clusters to seeding tracklets. The following steps are performed : @@ -982,7 +997,7 @@ Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t // - true : if tracklet found successfully. Failure can happend because of the following: // - // Detailed description -// +// // We start up by defining the track direction in the xy plane and roads. The roads are calculated based // on tracking information (variance in the r-phi direction) and estimated variance of the standard // clusters (see AliTRDcluster::SetSigmaY2()) corrected for tilt (see GetCovAt()). From this the road is @@ -992,7 +1007,9 @@ Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t // END_LATEX // // Author : Alexandru Bercuci -// Debug : level >3 +// Debug : level = 2 for calibration +// level = 3 for visualization in the track SR +// level = 4 for full visualization including digit level const AliTRDrecoParam* const recoParam = fkReconstructor->GetRecoParam(); //the dynamic cast in GetRecoParam is slow, so caching the pointer to it @@ -1000,43 +1017,74 @@ Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t AliError("Tracklets can not be used without a valid RecoParam."); return kFALSE; } + AliTRDcalibDB *calibration = AliTRDcalibDB::Instance(); + if (!calibration) { + AliError("No access to calibration data"); + return kFALSE; + } + // Retrieve the CDB container class with the parametric likelihood + const AliTRDCalTrkAttach *attach = calibration->GetAttachObject(); + if (!attach) { + AliError("No usable AttachClusters calib object."); + return kFALSE; + } + // Initialize reco params for this tracklet // 1. first time bin in the drift region Int_t t0 = 14; Int_t kClmin = Int_t(recoParam->GetFindableClusters()*AliTRDtrackerV1::GetNTimeBins()); + Int_t kTBmin = 4; - Double_t sysCov[5]; recoParam->GetSysCovMatrix(sysCov); + Double_t sysCov[5]; recoParam->GetSysCovMatrix(sysCov); Double_t s2yTrk= fRefCov[0], s2yCl = 0., s2zCl = GetPadLength()*GetPadLength()/12., syRef = TMath::Sqrt(s2yTrk), t2 = GetTilt()*GetTilt(); //define roads - Double_t kroady = 1., //recoParam->GetRoad1y(); - kroadz = GetPadLength() * recoParam->GetRoadzMultiplicator() + 1.; + const Double_t kroady = 3.; //recoParam->GetRoad1y(); + const Double_t kroadz = GetPadLength() * recoParam->GetRoadzMultiplicator() + 1.; // define probing cluster (the perfect cluster) and default calibration Short_t sig[] = {0, 0, 10, 30, 10, 0,0}; AliTRDcluster cp(fDet, 6, 75, 0, sig, 0); if(fkReconstructor->IsHLT()) cp.SetRPhiMethod(AliTRDcluster::kCOG); if(!IsCalibrated()) Calibrate(); - AliDebug(4, ""); - AliDebug(4, Form("syKalman[%f] rY[%f] rZ[%f]", syRef, kroady, kroadz)); + Int_t kroadyShift(0); + Float_t bz(AliTrackerBase::GetBz()); + if(TMath::Abs(bz)>2.){ + if(bz<0.) kroadyShift = chgPos ? +1 : -1; + else kroadyShift = chgPos ? -1 : +1; + } + AliDebug(4, Form("\n syTrk[cm]=%4.2f dydxTrk[deg]=%+6.2f rs[%d] Chg[%c] rY[cm]=%4.2f rZ[cm]=%5.2f TC[%c]", syRef, TMath::ATan(fYref[1])*TMath::RadToDeg(), kroadyShift, chgPos?'+':'-', kroady, kroadz, tilt?'y':'n')); + Double_t phiTrk(TMath::ATan(fYref[1])), + thtTrk(TMath::ATan(fZref[1])); // working variables const Int_t kNrows = 16; const Int_t kNcls = 3*kNclusters; // buffer size - AliTRDcluster *clst[kNrows][kNcls]; + TObjArray clst[kNrows]; Bool_t blst[kNrows][kNcls]; - Double_t cond[4], dx, dy, yt, zt, yres[kNrows][kNcls]; + Double_t cond[4], + dx, dy, dz, + yt, zt, + zc[kNrows], + xres[kNrows][kNcls], yres[kNrows][kNcls], zres[kNrows][kNcls], s2y[kNrows][kNcls]; Int_t idxs[kNrows][kNcls], ncl[kNrows], ncls = 0; memset(ncl, 0, kNrows*sizeof(Int_t)); + memset(zc, 0, kNrows*sizeof(Double_t)); + memset(idxs, 0, kNrows*kNcls*sizeof(Int_t)); + memset(xres, 0, kNrows*kNcls*sizeof(Double_t)); memset(yres, 0, kNrows*kNcls*sizeof(Double_t)); + memset(zres, 0, kNrows*kNcls*sizeof(Double_t)); + memset(s2y, 0, kNrows*kNcls*sizeof(Double_t)); memset(blst, 0, kNrows*kNcls*sizeof(Bool_t)); //this is 8 times faster to memset than "memset(clst, 0, kNrows*kNcls*sizeof(AliTRDcluster*))" - // Do cluster projection - AliTRDcluster *c = NULL; - AliTRDchamberTimeBin *layer = NULL; + Double_t roady(0.), s2Mean(0.), sMean(0.); Int_t ns2Mean(0); + + // Do cluster projection and pick up cluster candidates + AliTRDcluster *c(NULL); + AliTRDchamberTimeBin *layer(NULL); Bool_t kBUFFER = kFALSE; for (Int_t it = 0; it < kNtb; it++) { if(!(layer = chamber->GetTB(it))) continue; @@ -1045,37 +1093,44 @@ Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t dx = fX0 - layer->GetX(); yt = fYref[0] - fYref[1] * dx; zt = fZref[0] - fZref[1] * dx; - // get standard cluster error corrected for tilt + // get standard cluster error corrected for tilt if selected cp.SetLocalTimeBin(it); cp.SetSigmaY2(0.02, fDiffT, fExB, dx, -1./*zt*/, fYref[1]); - s2yCl = (cp.GetSigmaY2() + sysCov[0] + t2*s2zCl)/(1.+t2); - // get estimated road - kroady = 3.*TMath::Sqrt(12.*(s2yTrk + s2yCl)); - - AliDebug(5, Form(" %2d x[%f] yt[%f] zt[%f]", it, dx, yt, zt)); - - AliDebug(5, Form(" syTrk[um]=%6.2f syCl[um]=%6.2f syClTlt[um]=%6.2f Ry[mm]=%f", 1.e4*TMath::Sqrt(s2yTrk), 1.e4*TMath::Sqrt(cp.GetSigmaY2()), 1.e4*TMath::Sqrt(s2yCl), 1.e1*kroady)); - - // select clusters - cond[0] = yt; cond[2] = kroady; + s2yCl = cp.GetSigmaY2() + sysCov[0]; if(!tilt) s2yCl = (s2yCl + t2*s2zCl)/(1.+t2); + if(TMath::Abs(it-12)<7){ s2Mean += cp.GetSigmaY2(); ns2Mean++;} + // get estimated road in r-phi direction + roady = TMath::Min(3.*TMath::Sqrt(12.*(s2yTrk + s2yCl)), kroady); + + AliDebug(5, Form("\n" + " %2d xd[cm]=%6.3f yt[cm]=%7.2f zt[cm]=%8.2f\n" + " syTrk[um]=%6.2f syCl[um]=%6.2f syClTlt[um]=%6.2f\n" + " Ry[mm]=%f" + , it, dx, yt, zt + , 1.e4*TMath::Sqrt(s2yTrk), 1.e4*TMath::Sqrt(cp.GetSigmaY2()+sysCov[0]), 1.e4*TMath::Sqrt(s2yCl) + , 1.e1*roady)); + + // get clusters from layer + cond[0] = yt/*+0.5*kroadyShift*kroady*/; cond[2] = roady; cond[1] = zt; cond[3] = kroadz; - Int_t n=0, idx[6]; - layer->GetClusters(cond, idx, n, 6); + Int_t n=0, idx[6]; layer->GetClusters(cond, idx, n, 6); for(Int_t ic = n; ic--;){ c = (*layer)[idx[ic]]; - dy = yt - c->GetY(); - dy += tilt ? GetTilt() * (c->GetZ() - zt) : 0.; - // select clusters on a 3 sigmaKalman level -/* if(tilt && TMath::Abs(dy) > 3.*syRef){ - printf("too large !!!\n"); - continue; - }*/ + dx = fX0 - c->GetX(); + yt = fYref[0] - fYref[1] * dx; + zt = fZref[0] - fZref[1] * dx; + dz = zt - c->GetZ(); + dy = yt - (c->GetY() + (tilt ? (GetTilt() * dz) : 0.)); Int_t r = c->GetPadRow(); - AliDebug(5, Form(" -> dy[%f] yc[%f] r[%d]", TMath::Abs(dy), c->GetY(), r)); - clst[r][ncl[r]] = c; + clst[r].AddAtAndExpand(c, ncl[r]); blst[r][ncl[r]] = kTRUE; idxs[r][ncl[r]] = idx[ic]; + zres[r][ncl[r]] = dz/GetPadLength(); yres[r][ncl[r]] = dy; + xres[r][ncl[r]] = dx; + zc[r] = c->GetZ(); + // TODO temporary solution to avoid divercences in error parametrization + s2y[r][ncl[r]] = TMath::Min(c->GetSigmaY2()+sysCov[0], 0.025); + AliDebug(5, Form(" -> dy[cm]=%+7.4f yc[cm]=%7.2f row[%d] idx[%2d]", dy, c->GetY(), r, ncl[r])); ncl[r]++; ncls++; if(ncl[r] >= kNcls) { @@ -1086,173 +1141,525 @@ Bool_t AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_t } if(kBUFFER) break; } - AliDebug(4, Form("Found %d clusters. Processing ...", ncls)); if(ncls=2){ + if(nrc==2){ + if(zresRow[0]>zresRow[1]){ // swap + Int_t itmp=idxRow[1]; idxRow[1] = idxRow[0]; idxRow[0] = itmp; + Double_t dtmp=zresRow[1]; zresRow[1] = zresRow[0]; zresRow[0] = dtmp; + } + if(TMath::Abs(idxRow[1] - idxRow[0]) != 1){ + SetErrorMsg(kAttachRowGap); + AliDebug(2, Form("Rows attached not continuous. Select first candidate.\n" + " row[%2d] Ncl[%2d] [cm]=%+8.2f row[%2d] Ncl[%2d] [cm]=%+8.2f", + idxRow[0], ncl[idxRow[0]], zresRow[0], idxRow[1], ncl[idxRow[1]], zresRow[1])); + nrc=1; idxRow[1] = -1; zresRow[1] = 999.; + } + } else { + Int_t idx0[kNrows]; + TMath::Sort(nrc, zresRow, idx0, kFALSE); + nrc = 3; // select only maximum first 3 candidates + Int_t iatmp[] = {-1, -1, -1}; Double_t datmp[] = {999., 999., 999.}; + for(Int_t irc(0); irc[cm]=%+8.2f\n" + "row[%2d] Ncl[%2d] [cm]=%+8.2f\n" + "row[%2d] Ncl[%2d] [cm]=%+8.2f", + idxRow[0], ncl[idxRow[0]], zresRow[0], + idxRow[1], ncl[idxRow[1]], zresRow[1], + idxRow[2], ncl[idxRow[2]], zresRow[2])); + if(TMath::Abs(idxRow[0] - idxRow[2]) == 1){ // select second candidate + AliDebug(2, "Solved ! Remove second candidate."); + nrc = 2; + idxRow[1] = idxRow[2]; zresRow[1] = zresRow[2]; // swap + idxRow[2] = -1; zresRow[2] = 999.; // remove + } else if(TMath::Abs(idxRow[1] - idxRow[2]) == 1){ + if(ncl[idxRow[1]]+ncl[idxRow[2]] > ncl[idxRow[0]]){ + AliDebug(2, "Solved ! Remove first candidate."); + nrc = 2; + idxRow[0] = idxRow[1]; zresRow[0] = zresRow[1]; // swap + idxRow[1] = idxRow[2]; zresRow[1] = zresRow[2]; // swap + } else { + AliDebug(2, "Solved ! Remove second and third candidate."); + nrc = 1; + idxRow[1] = -1; zresRow[1] = 999.; // remove + idxRow[2] = -1; zresRow[2] = 999.; // remove + } + } else { + AliDebug(2, "Unsolved !!! Remove second and third candidate."); + nrc = 1; + idxRow[1] = -1; zresRow[1] = 999.; // remove + idxRow[2] = -1; zresRow[2] = 999.; // remove + } + } else { // remove temporary candidate + nrc = 2; + idxRow[2] = -1; zresRow[2] = 999.; + } + } + } + AliDebug(4, Form("Sorted row candidates:\n" + " row[%2d] Ncl[%2d] [cm]=%+8.2f row[%2d] Ncl[%2d] [cm]=%+8.2f" + , idxRow[0], ncl[idxRow[0]], zresRow[0], idxRow[1], ncl[idxRow[1]], zresRow[1])); + + // initialize debug streamer + TTreeSRedirector *pstreamer(NULL); + if(recoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 3 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker); + if(pstreamer){ + // save config. for calibration + TVectorD vdy[2], vdx[2], vs2[2]; + for(Int_t jr(0); jrGetStreamLevel(AliTRDrecoParam::kTracker) > 4){ + Int_t idx(idxRow[1]); + if(idx<0){ + for(Int_t ir(0); ir0) continue; + idx = ir; + break; + } + } + (*pstreamer) << "AttachClusters5" + << "c0.=" << &clst[idxRow[0]] + << "c1.=" << &clst[idx] + << "\n"; + } + } - // analyze each row individualy - Bool_t kRowSelection(kFALSE); - Double_t mean[]={1.e3, 1.e3, 1.3}, syDis[]={1.e3, 1.e3, 1.3}; - Int_t nrow[] = {0, 0, 0}, rowId[] = {-1, -1, -1}, nr = 0, lr=-1; - TVectorD vdy[3]; - for(Int_t ir=0; ir0 && ir-lr != 1){ - AliDebug(2, "Rows attached not continuous. Turn on selection."); - kRowSelection=kTRUE; +//======================================================================================= + // Analyse cluster topology + Double_t f[kNcls], // likelihood factors for segments + r[2][kNcls], // d(dydx) of tracklet candidate with respect to track + xm[2][kNcls], // mean + ym[2][kNcls], // mean + sm[2][kNcls], // mean + s[2][kNcls], // sigma_y + p[2][kNcls]; // prob of Gauss + memset(f, 0, kNcls*sizeof(Double_t)); + Int_t index[2][kNcls], n[2][kNcls]; + memset(n, 0, 2*kNcls*sizeof(Int_t)); + Int_t mts(0), nts[2] = {0, 0}; // no of tracklet segments in row + AliTRDpadPlane *pp(AliTRDtransform::Geometry().GetPadPlane(fDet)); + AliTRDtrackletOflHelper helper; + Int_t lyDet(AliTRDgeometry::GetLayer(fDet)); + for(Int_t jr(0), n0(0); jrCookLikelihood(chgPos, lyDet, fPt, phiTrk, n[jr][its], ym[jr][its]/*sRef*/, r[jr][its]*TMath::RadToDeg(), s[jr][its]/sm[jr][its]); + } + } + AliDebug(4, Form(" Tracklet candidates: row[%2d] = %2d row[%2d] = %2d:", idxRow[0], nts[0], idxRow[1], nts[1])); + if(AliLog::GetDebugLevel("TRD", "AliTRDseedV1")>3){ + for(Int_t jr(0); jrGetStreamLevel(AliTRDrecoParam::kTracker) > 2 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker); + if(pstreamer){ + // save config. for calibration + TVectorD vidx, vn, vx, vy, vr, vs, vsm, vp, vf; + vidx.ResizeTo(ncl[idxRow[0]]+(idxRow[1]<0?0:ncl[idxRow[1]])); + vn.ResizeTo(mts); + vx.ResizeTo(mts); + vy.ResizeTo(mts); + vr.ResizeTo(mts); + vs.ResizeTo(mts); + vsm.ResizeTo(mts); + vp.ResizeTo(mts); + vf.ResizeTo(mts); + for(Int_t jr(0), jts(0), jc(0); jr 3. * syDis[nr]){ - blst[ir][ic] = kFALSE; continue; +//========================================================= + // Get seed tracklet segment + Int_t idx2[kNcls]; memset(idx2, 0, kNcls*sizeof(Int_t)); // seeding indexing + if(nts[0]>1) TMath::Sort(nts[0], f, idx2); + Int_t is(idx2[0]); // seed index + Int_t idxTrklt[kNcls], + kts(0), + nTrklt(n[0][is]); + Double_t fTrklt(f[is]), + rTrklt(r[0][is]), + yTrklt(ym[0][is]), + sTrklt(s[0][is]), + smTrklt(sm[0][is]), + xTrklt(xm[0][is]), + pTrklt(p[0][is]); + memset(idxTrklt, 0, kNcls*sizeof(Int_t)); + // check seed idx2[0] exit if not found + if(f[is]<1.e-2){ + AliDebug(1, Form("Seed seg[%d] row[%2d] n[%2d] f[%f]<0.01.", is, idxRow[0], n[0][is], f[is])); + SetErrorMsg(kAttachClAttach); + if(!pstreamer && recoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 1 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker); + if(pstreamer){ + UChar_t stat(0); + if(IsKink()) SETBIT(stat, 1); + if(IsStandAlone()) SETBIT(stat, 2); + if(IsRowCross()) SETBIT(stat, 3); + SETBIT(stat, 4); // set error bit + TVectorD vidx; vidx.ResizeTo(1); vidx[0] = is; + (*pstreamer) << "AttachClusters2" + << "stat=" << stat + << "ev=" << ev + << "chg=" << chgPos + << "det=" << fDet + << "x0=" << fX0 + << "y0=" << fYref[0] + << "z0=" << fZref[0] + << "phi=" << phiTrk + << "tht=" << thtTrk + << "pt=" << fPt + << "s2Trk=" << s2yTrk + << "s2Cl=" << s2Mean + << "idx=" << &vidx + << "n=" << nTrklt + << "f=" << fTrklt + << "x=" << xTrklt + << "y=" << yTrklt + << "r=" << rTrklt + << "s=" << sTrklt + << "sm=" << smTrklt + << "p=" << pTrklt + << "\n"; + } + return kFALSE; + } + AliDebug(2, Form("Seed seg[%d] row[%2d] n[%2d] dy[%f] r[%+5.2f] s[%+5.2f] f[%5.3f]", is, idxRow[0], n[0][is], ym[0][is], r[0][is]*TMath::RadToDeg(), s[0][is]/sm[0][is], f[is])); + + // save seeding segment in the helper + idxTrklt[kts++] = is; + helper.Init(pp, &clst[idxRow[0]], index[0], is); + AliTRDtrackletOflHelper test; // helper to test segment expantion + Float_t rcLikelihood(0.); SetBit(kRowCross, kFALSE); + Double_t dyRez[kNcls]; Int_t idx3[kNcls]; + + //========================================================= + // Define filter parameters from OCDB + Int_t kNSgmDy[2]; attach->GetNsgmDy(kNSgmDy[0], kNSgmDy[1]); + Float_t kLikeMinRelDecrease[2]; attach->GetLikeMinRelDecrease(kLikeMinRelDecrease[0], kLikeMinRelDecrease[1]); + Float_t kRClikeLimit(attach->GetRClikeLimit()); + + //========================================================= + // Try attaching next segments from first row (if any) + if(nts[0]>1){ + Int_t jr(0), ir(idxRow[jr]); + // organize secondary sgms. in decreasing order of their distance from seed + memset(dyRez, 0, nts[jr]*sizeof(Double_t)); + for(Int_t jts(1); jts kNSgmDy[jr]*smTrklt){ + AliDebug(2, Form("Reject seg[%d] row[%2d] n[%2d] dy[%f] > %d*s[%f].", its, idxRow[jr], n[jr][its], dyRez[its], kNSgmDy[jr], kNSgmDy[jr]*smTrklt)); + continue; + } + + test = helper; + Int_t n0 = test.Expand(&clst[ir], index[jr], its); + Double_t rt, dyt, st, xt, smt, pt, ft; + Int_t n1 = test.GetRMS(rt, dyt, st, xt); + pt = Double_t(n1)/n0; + smt = test.GetSyMean(); + // correct position + Double_t dxm= fX0 - xt; + yt = fYref[0] - fYref[1]*dxm; + zt = fZref[0] - fZref[1]*dxm; + // correct tracklet fit for tilt + dyt+= GetTilt()*(zt - zc[idxRow[0]]); + rt += GetTilt() * fZref[1]; + // correct tracklet fit for track position/inclination + dyt= yt - dyt; + rt = (rt - fYref[1])/(1+rt*fYref[1]); + // report inclination in radians + rt = TMath::ATan(rt); + + ft = (n0>=2) ? attach->CookLikelihood(chgPos, lyDet, fPt, phiTrk, n0, dyt/*sRef*/, rt*TMath::RadToDeg(), st/smt) : 0.; + Bool_t kAccept(ft>=fTrklt*(1.-kLikeMinRelDecrease[jr])); + + AliDebug(2, Form("%s seg[%d] row[%2d] n[%2d] dy[%f] r[%+5.2f] s[%+5.2f] f[%f] < %4.2f*F[%f].", + (kAccept?"Adding":"Reject"), its, idxRow[jr], n0, dyt, rt*TMath::RadToDeg(), st/smt, ft, 1.-kLikeMinRelDecrease[jr], fTrklt*(1.-kLikeMinRelDecrease[jr]))); + if(kAccept){ + idxTrklt[kts++] = its; + nTrklt = n0; + fTrklt = ft; + rTrklt = rt; + yTrklt = dyt; + sTrklt = st; + smTrklt= smt; + xTrklt = xt; + pTrklt = pt; + helper.Expand(&clst[ir], index[jr], its); } - nrow[nr]++; rowId[nr]=ir; kFOUND = kTRUE; } - if(kFOUND){ - vdy[nr].Use(nrow[nr], yres[ir]); - nr++; + } + + //========================================================= + // Try attaching next segments from second row (if any) + if(nts[1] && (rcLikelihood = zresRow[0]/zresRow[1]) > kRClikeLimit){ + // organize secondaries in decreasing order of their distance from seed + Int_t jr(1), ir(idxRow[jr]); + memset(dyRez, 0, nts[jr]*sizeof(Double_t)); + Double_t rot(TMath::Tan(r[0][is])); + for(Int_t jts(0); jts kNSgmDy[jr]*smTrklt){ + AliDebug(2, Form("Reject seg[%d] row[%2d] n[%2d] dy[%f] > %d*s[%f].", its, idxRow[jr], n[jr][its], dyRez[its], kNSgmDy[jr], kNSgmDy[jr]*smTrklt)); + continue; + } + + test = helper; + Int_t n0 = test.Expand(&clst[ir], index[jr], its); + Double_t rt, dyt, st, xt, smt, pt, ft; + Int_t n1 = test.GetRMS(rt, dyt, st, xt); + pt = Double_t(n1)/n0; + smt = test.GetSyMean(); + // correct position + Double_t dxm= fX0 - xt; + yt = fYref[0] - fYref[1]*dxm; + zt = fZref[0] - fZref[1]*dxm; + // correct tracklet fit for tilt + dyt+= GetTilt()*(zt - zc[idxRow[0]]); + rt += GetTilt() * fZref[1]; + // correct tracklet fit for track position/inclination + dyt= yt - dyt; + rt = (rt - fYref[1])/(1+rt*fYref[1]); + // report inclination in radians + rt = TMath::ATan(rt); + + ft = (n0>=2) ? attach->CookLikelihood(chgPos, lyDet, fPt, phiTrk, n0, dyt/*sRef*/, rt*TMath::RadToDeg(), st/smt) : 0.; + Bool_t kAccept(ft>=fTrklt*(1.-kLikeMinRelDecrease[jr])); + + AliDebug(2, Form("%s seg[%d] row[%2d] n[%2d] dy[%f] r[%+5.2f] s[%+5.2f] f[%f] < %4.2f*F[%f].", + (kAccept?"Adding":"Reject"), its, idxRow[jr], n0, dyt, rt*TMath::RadToDeg(), st/smt, ft, 1.-kLikeMinRelDecrease[jr], fTrklt*(1.-kLikeMinRelDecrease[jr]))); + if(kAccept){ + idxTrklt[kts++] = its; + nTrklt = n0; + fTrklt = ft; + rTrklt = rt; + yTrklt = dyt; + sTrklt = st; + smTrklt= smt; + xTrklt = xt; + pTrklt = pt; + helper.Expand(&clst[ir], index[jr], its); + SetBit(kRowCross, kTRUE); // mark pad row crossing + } } - lr = ir; if(nr>=3) break; } - if(recoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 3 && fkReconstructor->IsDebugStreaming()){ - TTreeSRedirector &cstreamer = *fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker); + // clear local copy of clusters + for(Int_t ir(0); irGetStreamLevel(AliTRDrecoParam::kTracker) > 1 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker); + if(pstreamer){ UChar_t stat(0); if(IsKink()) SETBIT(stat, 1); if(IsStandAlone()) SETBIT(stat, 2); - cstreamer << "AttachClusters" + if(IsRowCross()) SETBIT(stat, 3); + TVectorD vidx; vidx.ResizeTo(kts); + for(Int_t its(0); itsnrow[0]) AliDebug(2, Form("Conflicting mean[%f < %f] but ncl[%d < %d].", TMath::Abs(mean[0]), TMath::Abs(mean[1]), nrow[0], nrow[1])); - }else{ - if(nrow[1] %f] but ncl[%d > %d].", TMath::Abs(mean[0]), TMath::Abs(mean[1]), nrow[0], nrow[1])); - Swap(nrow[0],nrow[1]); Swap(rowId[0],rowId[1]); - Swap(mean[0],mean[1]); Swap(syDis[0],syDis[1]); - } - rowRemove=1; nr=1; - } else if(nr==3){ // select based on 2 consecutive rows - if(rowId[1]==rowId[0]+1 && rowId[1]!=rowId[2]-1){ - nr=2;rowRemove=2; - } else if(rowId[1]!=rowId[0]+1 && rowId[1]==rowId[2]-1){ - Swap(nrow[0],nrow[2]); Swap(rowId[0],rowId[2]); - Swap(mean[0],mean[2]); Swap(syDis[0],syDis[2]); - nr=2; rowRemove=2; - } - } - if(rowRemove>0){nrow[rowRemove]=0; rowId[rowRemove]=-1;} - } - AliDebug(4, Form(" Ncl[%d[%d] + %d[%d] + %d[%d]]", nrow[0], rowId[0], nrow[1], rowId[1], nrow[2], rowId[2])); - - if(nr==3){ - SetBit(kRowCross, kTRUE); // mark pad row crossing - SetErrorMsg(kAttachRow); - const Float_t am[]={TMath::Abs(mean[0]), TMath::Abs(mean[1]), TMath::Abs(mean[2])}; - AliDebug(4, Form("complex row configuration\n" - " r[%d] n[%d] m[%6.3f] s[%6.3f]\n" - " r[%d] n[%d] m[%6.3f] s[%6.3f]\n" - " r[%d] n[%d] m[%6.3f] s[%6.3f]\n" - , rowId[0], nrow[0], am[0], syDis[0] - , rowId[1], nrow[1], am[1], syDis[1] - , rowId[2], nrow[2], am[2], syDis[2])); - Int_t id[]={0,1,2}; TMath::Sort(3, am, id, kFALSE); - // backup - Int_t rnn[3]; memcpy(rnn, nrow, 3*sizeof(Int_t)); - Int_t rid[3]; memcpy(rid, rowId, 3*sizeof(Int_t)); - Double_t rm[3]; memcpy(rm, mean, 3*sizeof(Double_t)); - Double_t rs[3]; memcpy(rs, syDis, 3*sizeof(Double_t)); - nrow[0]=rnn[id[0]]; rowId[0]=rid[id[0]]; mean[0]=rm[id[0]]; syDis[0]=rs[id[0]]; - nrow[1]=rnn[id[1]]; rowId[1]=rid[id[1]]; mean[1]=rm[id[1]]; syDis[1]=rs[id[1]]; - nrow[2]=0; rowId[2]=-1; mean[2] = 1.e3; syDis[2] = 1.e3; - AliDebug(4, Form("solved configuration\n" - " r[%d] n[%d] m[%+6.3f] s[%6.3f]\n" - " r[%d] n[%d] m[%+6.3f] s[%6.3f]\n" - " r[%d] n[%d] m[%+6.3f] s[%6.3f]\n" - , rowId[0], nrow[0], mean[0], syDis[0] - , rowId[1], nrow[1], mean[1], syDis[1] - , rowId[2], nrow[2], mean[2], syDis[2])); - nr=2; - } else if(nr==2) { - SetBit(kRowCross, kTRUE); // mark pad row crossing - if(nrow[1] > nrow[0]){ // swap row order - Swap(nrow[0],nrow[1]); Swap(rowId[0],rowId[1]); - Swap(mean[0],mean[1]); Swap(syDis[0],syDis[1]); - } + + + //========================================================= + // Store clusters + Int_t nselected(0), nc(0); + TObjArray *selected(helper.GetClusters()); + if(!selected || !(nselected = selected->GetEntriesFast())){ + AliError("Cluster candidates missing !!!"); + SetErrorMsg(kAttachClAttach); + return kFALSE; } - - // Select and store clusters - // We should consider here : - // 1. How far is the chamber boundary - // 2. How big is the mean - Int_t n(0); Float_t dyc[kNclusters]; memset(dyc,0,kNclusters*sizeof(Float_t)); - for (Int_t ir = 0; ir < nr; ir++) { - Int_t jr(rowId[ir]); - AliDebug(4, Form(" Attaching Ncl[%d]=%d ...", jr, ncl[jr])); - for (Int_t ic = 0; ic < ncl[jr]; ic++) { - if(!blst[jr][ic])continue; - c = clst[jr][ic]; - Int_t it(c->GetPadTime()); - Int_t idx(it+kNtb*ir); - if(fClusters[idx]){ - AliDebug(4, Form("Many cluster candidates on row[%2d] tb[%2d].", jr, it)); - // TODO should save also the information on where the multiplicity happened and its size - SetErrorMsg(kAttachMultipleCl); - // TODO should also compare with mean and sigma for this row - if(yres[jr][ic] > dyc[idx]) continue; - } - - // TODO proper indexing of clusters !! - fIndexes[idx] = chamber->GetTB(it)->GetGlobalIndex(idxs[jr][ic]); - fClusters[idx] = c; - dyc[idx] = yres[jr][ic]; - n++; + for(Int_t ic(0); icAt(ic))) continue; + Int_t it(c->GetPadTime()), + jr(Int_t(helper.GetRow() != c->GetPadRow())), + idx(it+kNtb*jr); + if(fClusters[idx]){ + AliDebug(1, Form("Multiple clusters/tb for D[%03d] Tb[%02d] Row[%2d]", fDet, it, c->GetPadRow())); + continue; // already booked } + // TODO proper indexing of clusters !! + fIndexes[idx] = chamber->GetTB(it)->GetGlobalIndex(idxs[idxRow[jr]][ic]); + fClusters[idx] = c; + nc++; } - SetN(n); + AliDebug(2, Form("Clusters Found[%2d] Attached[%2d] RC[%c]", nselected, nc, IsRowCross()?'y':'n')); // number of minimum numbers of clusters expected for the tracklet - if (GetN() < kClmin){ - AliDebug(1, Form("NOT ENOUGH CLUSTERS %d ATTACHED TO THE TRACKLET [min %d] FROM FOUND %d.", GetN(), kClmin, n)); + if (nc < kClmin){ + AliDebug(1, Form("NOT ENOUGH CLUSTERS %d ATTACHED TO THE TRACKLET [min %d] FROM FOUND %d.", nc, kClmin, ncls)); SetErrorMsg(kAttachClAttach); return kFALSE; } + SetN(nc); // Load calibration parameters for this tracklet - Calibrate(); + //Calibrate(); // calculate dx for time bins in the drift region (calibration aware) Float_t x[2] = {0.,0.}; Int_t tb[2]={0,0}; @@ -1433,6 +1840,7 @@ Bool_t AliTRDseedV1::Fit(UChar_t opt) const Char_t *tcName[]={"NONE", "FULL", "HALF"}; AliDebug(2, Form("Options : TC[%s] dzdx[%c]", tcName[opt], kDZDX?'Y':'N')); + for (Int_t ic=0; ic kmaxtan){ - //printf("Exit: Abs(fYref[1]) = %3.3f, kmaxtan = %3.3f\n", TMath::Abs(fYref[1]), kmaxtan); - return; // Track inclined too much - } - - Float_t sigmaexp = 0.05 + TMath::Abs(fYref[1] * 0.25); // Expected r.m.s in y direction - Float_t ycrosscor = GetPadLength() * GetTilt() * 0.5; // Y correction for crossing - Int_t fNChange = 0; - - Double_t sumw; - Double_t sumwx; - Double_t sumwx2; - Double_t sumwy; - Double_t sumwxy; - Double_t sumwz; - Double_t sumwxz; - - // Buffering: Leave it constant fot Performance issues - Int_t zints[kNtb]; // Histograming of the z coordinate - // Get 1 and second max probable coodinates in z - Int_t zouts[2*kNtb]; - Float_t allowedz[kNtb]; // Allowed z for given time bin - Float_t yres[kNtb]; // Residuals from reference - //Float_t anglecor = GetTilt() * fZref[1]; // Correction to the angle - - Float_t pos[3*kNtb]; memset(pos, 0, 3*kNtb*sizeof(Float_t)); - Float_t *fX = &pos[0], *fY = &pos[kNtb], *fZ = &pos[2*kNtb]; - - Int_t fN = 0; AliTRDcluster *c = 0x0; - fN2 = 0; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins(); i++) { - yres[i] = 10000.0; - if (!(c = fClusters[i])) continue; - if(!c->IsInChamber()) continue; - // Residual y - //yres[i] = fY[i] - fYref[0] - (fYref[1] + anglecor) * fX[i] + GetTilt()*(fZ[i] - fZref[0]); - fX[i] = fX0 - c->GetX(); - fY[i] = c->GetY(); - fZ[i] = c->GetZ(); - yres[i] = fY[i] - GetTilt()*(fZ[i] - (fZref[0] - fX[i]*fZref[1])); - zints[fN] = Int_t(fZ[i]); - fN++; - } - - if (fN < kClmin){ - //printf("Exit fN < kClmin: fN = %d\n", fN); - return; - } - Int_t nz = AliTRDtrackerV1::Freq(fN, zints, zouts, kFALSE); - Float_t fZProb = zouts[0]; - if (nz <= 1) zouts[3] = 0; - if (zouts[1] + zouts[3] < kClmin) { - //printf("Exit zouts[1] = %d, zouts[3] = %d\n",zouts[1],zouts[3]); - return; - } - - // Z distance bigger than pad - length - if (TMath::Abs(zouts[0]-zouts[2]) > 12.0) zouts[3] = 0; - - Int_t breaktime = -1; - Bool_t mbefore = kFALSE; - Int_t cumul[kNtb][2]; - Int_t counts[2] = { 0, 0 }; - - if (zouts[3] >= 3) { - - // - // Find the break time allowing one chage on pad-rows - // with maximal number of accepted clusters - // - fNChange = 1; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins(); i++) { - cumul[i][0] = counts[0]; - cumul[i][1] = counts[1]; - if (TMath::Abs(fZ[i]-zouts[0]) < 2) counts[0]++; - if (TMath::Abs(fZ[i]-zouts[2]) < 2) counts[1]++; - } - Int_t maxcount = 0; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins(); i++) { - Int_t after = cumul[AliTRDtrackerV1::GetNTimeBins()][0] - cumul[i][0]; - Int_t before = cumul[i][1]; - if (after + before > maxcount) { - maxcount = after + before; - breaktime = i; - mbefore = kFALSE; - } - after = cumul[AliTRDtrackerV1::GetNTimeBins()-1][1] - cumul[i][1]; - before = cumul[i][0]; - if (after + before > maxcount) { - maxcount = after + before; - breaktime = i; - mbefore = kTRUE; - } - } - breaktime -= 1; - } +// Author +// A.Bercuci - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins()+1; i++) { - if (i > breaktime) allowedz[i] = mbefore ? zouts[2] : zouts[0]; - if (i <= breaktime) allowedz[i] = (!mbefore) ? zouts[2] : zouts[0]; - } + TTreeSRedirector *pstreamer(NULL); + const AliTRDrecoParam* const recoParam = fkReconstructor->GetRecoParam(); if(recoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 3 && fkReconstructor->IsDebugStreaming()) pstreamer = fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker); - if (((allowedz[0] > allowedz[AliTRDtrackerV1::GetNTimeBins()]) && (fZref[1] < 0)) || - ((allowedz[0] < allowedz[AliTRDtrackerV1::GetNTimeBins()]) && (fZref[1] > 0))) { - // - // Tracklet z-direction not in correspondance with track z direction - // - fNChange = 0; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins()+1; i++) { - allowedz[i] = zouts[0]; // Only longest taken - } - } - - if (fNChange > 0) { - // - // Cross pad -row tracklet - take the step change into account - // - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins()+1; i++) { - if (!fClusters[i]) continue; - if(!fClusters[i]->IsInChamber()) continue; - if (TMath::Abs(fZ[i] - allowedz[i]) > 2) continue; - // Residual y - //yres[i] = fY[i] - fYref[0] - (fYref[1] + anglecor) * fX[i] + GetTilt()*(fZ[i] - fZref[0]); - yres[i] = fY[i] - GetTilt()*(fZ[i] - (fZref[0] - fX[i]*fZref[1])); -// if (TMath::Abs(fZ[i] - fZProb) > 2) { -// if (fZ[i] > fZProb) yres[i] += GetTilt() * GetPadLength(); -// if (fZ[i] < fZProb) yres[i] -= GetTilt() * GetPadLength(); - } + // factor to scale y pulls. + // ideally if error parametrization correct this is 1. + //Float_t lyScaler = 1./(AliTRDgeometry::GetLayer(fDet)+1.); + Float_t kScalePulls = 1.; + AliTRDcalibDB *calibration = AliTRDcalibDB::Instance(); + if(!calibration){ + AliWarning("No access to calibration data"); + } else { + // Retrieve the CDB container class with the parametric likelihood + const AliTRDCalTrkAttach *attach = calibration->GetAttachObject(); + if(!attach){ + AliWarning("No usable AttachClusters calib object."); + } else { + kScalePulls = attach->GetScaleCov();//*lyScaler; } + } + Double_t xc[kNclusters], yc[kNclusters], sy[kNclusters]; + Int_t n(0), // clusters used in fit + row[]={-1, 0}; // pad row spanned by the tracklet + AliTRDcluster *c(NULL), **jc = &fClusters[0]; + for(Int_t ic=0; icIsInChamber()) continue; + if(row[0]<0){ + fZfit[0] = c->GetZ(); + fZfit[1] = 0.; + row[0] = c->GetPadRow(); + } + xc[n] = fX0 - c->GetX(); + yc[n] = c->GetY(); + sy[n] = c->GetSigmaY2()>0?(TMath::Min(TMath::Sqrt(c->GetSigmaY2()), 0.08)):0.08; + n++; } - - Double_t yres2[kNtb]; - Double_t mean; - Double_t sigma; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins()+1; i++) { - if (!fClusters[i]) continue; - if(!fClusters[i]->IsInChamber()) continue; - if (TMath::Abs(fZ[i] - allowedz[i]) > 2) continue; - yres2[fN2] = yres[i]; - fN2++; - } - if (fN2 < kClmin) { - //printf("Exit fN2 < kClmin: fN2 = %d\n", fN2); - fN2 = 0; - return; - } - AliMathBase::EvaluateUni(fN2,yres2,mean,sigma, Int_t(fN2*kRatio-2.)); - if (sigma < sigmaexp * 0.8) { - sigma = sigmaexp; - } - //Float_t fSigmaY = sigma; - - // Reset sums - sumw = 0; - sumwx = 0; - sumwx2 = 0; - sumwy = 0; - sumwxy = 0; - sumwz = 0; - sumwxz = 0; - - fN2 = 0; - Float_t fMeanz = 0; - Float_t fMPads = 0; - fUsable = 0; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins()+1; i++) { - if (!fClusters[i]) continue; - if (!fClusters[i]->IsInChamber()) continue; - if (TMath::Abs(fZ[i] - allowedz[i]) > 2){fClusters[i] = 0x0; continue;} - if (TMath::Abs(yres[i] - mean) > 4.0 * sigma){fClusters[i] = 0x0; continue;} - SETBIT(fUsable,i); - fN2++; - fMPads += fClusters[i]->GetNPads(); - Float_t weight = 1.0; - if (fClusters[i]->GetNPads() > 4) weight = 0.5; - if (fClusters[i]->GetNPads() > 5) weight = 0.2; - - - Double_t x = fX[i]; - //printf("x = %7.3f dy = %7.3f fit %7.3f\n", x, yres[i], fY[i]-yres[i]); - - sumw += weight; - sumwx += x * weight; - sumwx2 += x*x * weight; - sumwy += weight * yres[i]; - sumwxy += weight * (yres[i]) * x; - sumwz += weight * fZ[i]; - sumwxz += weight * fZ[i] * x; + Double_t corr = fPad[2]*fPad[0]; + for(Int_t ic=kNtb; icIsInChamber()) continue; + if(row[1]==0) row[1] = c->GetPadRow() - row[0]; + xc[n] = fX0 - c->GetX(); + yc[n] = c->GetY() + corr*row[1]; + sy[n] = c->GetSigmaY2()>0?(TMath::Min(TMath::Sqrt(c->GetSigmaY2()), 0.08)):0.08; + n++; } - - if (fN2 < kClmin){ - //printf("Exit fN2 < kClmin(2): fN2 = %d\n",fN2); - fN2 = 0; - return; + UChar_t status(0); + Double_t par[3] = {0.,0.,21122012.}, cov[3]; + if(!AliTRDtrackletOflHelper::Fit(n, xc, yc, sy, par, 1.5, cov)){ + AliDebug(1, Form("Tracklet fit failed D[%03d].", fDet)); + SetErrorMsg(kFitCl); + return kFALSE; + } + fYfit[0] = par[0]; + fYfit[1] = -par[1]; + // store covariance + fCov[0] = kScalePulls*cov[0]; // variance of y0 + fCov[1] = kScalePulls*cov[2]; // covariance of y0, dydx + fCov[2] = kScalePulls*cov[1]; // variance of dydx + // the ref radial position is set at the minimum of + // the y variance of the tracklet + fX = -fCov[1]/fCov[2]; + // check radial position + Float_t xs=fX+.5*AliTRDgeometry::CamHght(); + if(xs < 0. || xs > AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght()){ + AliDebug(1, Form("Ref radial position x[%5.2f] ouside D[%3d].", fX, fDet)); + SetErrorMsg(kFitFailedY); + return kFALSE; } - fMeanz = sumwz / sumw; - Float_t correction = 0; - if (fNChange > 0) { - // Tracklet on boundary - if (fMeanz < fZProb) correction = ycrosscor; - if (fMeanz > fZProb) correction = -ycrosscor; + fS2Y = fCov[0] + fX*fCov[1]; + fS2Z = fPad[0]*fPad[0]/12.; + AliDebug(2, Form("[I] x[cm]=%6.2f y[cm]=%+5.2f z[cm]=%+6.2f dydx[deg]=%+5.2f sy[um]=%6.2f sz[cm]=%6.2f", GetX(), GetY(), GetZ(), TMath::ATan(fYfit[1])*TMath::RadToDeg(), TMath::Sqrt(fS2Y)*1.e4, TMath::Sqrt(fS2Z))); + if(IsRowCross()){ + Float_t x,z; + if(!GetEstimatedCrossPoint(x,z)){ + AliDebug(2, Form("Failed getting crossing point D[%03d].", fDet)); + SetErrorMsg(kFitFailedY); + return kTRUE; + } + fX = fX0-x; + fS2Y = fCov[0] + fX*fCov[1]; + fZfit[0] = z; + if(IsPrimary()){ + fZfit[1] = z/x; + fS2Z = 0.05+0.4*TMath::Abs(fZfit[1]); fS2Z *= fS2Z; + } + AliDebug(2, Form("[II] x[cm]=%6.2f y[cm]=%+5.2f z[cm]=%+6.2f dydx[deg]=%+5.2f sy[um]=%6.2f sz[um]=%6.2f dzdx[deg]=%+5.2f", GetX(), GetY(), GetZ(), TMath::ATan(fYfit[1])*TMath::RadToDeg(), TMath::Sqrt(fS2Y)*1.e4, TMath::Sqrt(fS2Z)*1.e4, TMath::ATan(fZfit[1])*TMath::RadToDeg())); } - - Double_t det = sumw * sumwx2 - sumwx * sumwx; - fYfit[0] = (sumwx2 * sumwy - sumwx * sumwxy) / det; - fYfit[1] = (sumw * sumwxy - sumwx * sumwy) / det; - - fS2Y = 0; - for (Int_t i = 0; i < AliTRDtrackerV1::GetNTimeBins()+1; i++) { - if (!TESTBIT(fUsable,i)) continue; - Float_t delta = yres[i] - fYfit[0] - fYfit[1] * fX[i]; - fS2Y += delta*delta; - } - fS2Y = TMath::Sqrt(fS2Y / Float_t(fN2-2)); - // TEMPORARY UNTIL covariance properly calculated - fS2Y = TMath::Max(fS2Y, Float_t(.1)); - fZfit[0] = (sumwx2 * sumwz - sumwx * sumwxz) / det; - fZfit[1] = (sumw * sumwxz - sumwx * sumwz) / det; -// fYfitR[0] += fYref[0] + correction; -// fYfitR[1] += fYref[1]; -// fYfit[0] = fYfitR[0]; - fYfit[1] = -fYfit[1]; - - UpdateUsed(); -}*/ + if(pstreamer){ + Float_t x= fX0 -fX, + y = GetY(), + yt = fYref[0]-fX*fYref[1]; + SETBIT(status, 2); + TVectorD vcov(3); vcov[0]=cov[0];vcov[1]=cov[1];vcov[2]=cov[2]; + Double_t sm(0.), chi2(0.), tmp, dy[kNclusters]; + for(Int_t ic(0); ic //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; - + Int_t nslices = pidResponse->GetNumberOfSlices(); + Double_t dEdx[kNplane * (Int_t)AliTRDPIDResponse::kNslicesNN]; + Float_t trackletP[kNplane]; + memset(dEdx, 0, sizeof(Double_t) * kNplane * (Int_t)AliTRDPIDResponse::kNslicesNN); + memset(trackletP, 0, sizeof(Float_t)*kNplane); + 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(nslices); + const Float_t *trackletdEdx = fTracklet[iseed]->GetdEdx(); + for(Int_t islice = 0; islice < nslices; islice++){ + dEdx[iseed*nslices + islice] = trackletdEdx[islice]; + } + fTracklet[iseed]->SetPID(); + } + } + pidResponse->GetResponse(nslices, dEdx, trackletP, fPID); return kTRUE; } @@ -378,52 +381,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; ispecGetRecoParam()->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 @@ -904,9 +870,13 @@ void AliTRDtrackV1::UpdateESDtrack(AliESDtrack *track) if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue; if(!fTracklet[ip]->HasPID()) continue; const Float_t *dedx = fTracklet[ip]->GetdEdx(); - for (Int_t js = 0; js < nslices; js++, dedx++) track->SetTRDslice(*dedx, ip, js); - p = fTracklet[ip]->GetMomentum(&sp); spd = sp; + for (Int_t js = 0; js < nslices; js++, dedx++) track->SetTRDslice(*dedx, ip, js+1); + p = fTracklet[ip]->GetMomentum(&sp); + // 04.01.11 A.Bercuci + // store global dQdl per tracklet instead of momentum error + spd = sp; track->SetTRDmomentum(p, ip, &spd); + track->SetTRDslice(fTracklet[ip]->GetdQdl(), ip, 0); // Set Summed dEdx into the first slice } // store PID probabilities track->SetTRDpid(fPID); diff --git a/TRD/AliTRDtrackV1.h b/TRD/AliTRDtrackV1.h index 403539ae3a3..88db8c3ddce 100644 --- a/TRD/AliTRDtrackV1.h +++ b/TRD/AliTRDtrackV1.h @@ -123,7 +123,6 @@ public: void SetKink(Bool_t k) { SetBit(kKink, k);} void SetPrimary(Bool_t k) { SetBit(kPrimary, k);} void SetNumberOfClusters(); - UChar_t SetNumberOfTrackletsPID(Bool_t recalc); void SetOwner(); void SetPID(Short_t is, Double_t inPID){if (is >=0 && is < AliPID::kSPECIES) fPID[is]=inPID;}; void SetPIDquality(UChar_t /*inPIDquality*/) const {/*fPIDquality = inPIDquality*/;}; diff --git a/TRD/AliTRDtrackerV1.cxx b/TRD/AliTRDtrackerV1.cxx index c0203971f51..6afdb846085 100644 --- a/TRD/AliTRDtrackerV1.cxx +++ b/TRD/AliTRDtrackerV1.cxx @@ -86,6 +86,7 @@ AliTRDtrackerV1::AliTRDtrackerV1(AliTRDReconstructor *rec) ,fTracks(NULL) ,fTracksESD(NULL) ,fSieveSeeding(0) + ,fEventInFile(-1) { // // Default constructor. @@ -285,6 +286,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) Float_t *quality = NULL; Int_t *index = NULL; + fEventInFile = event->GetEventNumberInFile(); nSeeds = event->GetNumberOfTracks(); // Sort tracks according to quality // (covariance in the yz plane) @@ -877,12 +879,12 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliDebug(4, "Failed Tracklet Init"); break; } - if(!ptrTracklet->AttachClusters(chamber, kTRUE)){ + if(!ptrTracklet->AttachClusters(chamber, kTRUE, t.Charge()>0?kTRUE:kFALSE, fEventInFile)){ t.SetStatus(AliTRDtrackV1::kNoAttach, ily); if(debugLevel>3){ AliTRDseedV1 trackletCp(*ptrTracklet); UChar_t status(t.GetStatusTRD(ily)); - (*cstreamer) << "FollowBackProlongation2" + (*cstreamer) << "FollowBackProlongation4" <<"status=" << status <<"tracklet.=" << &trackletCp << "\n"; @@ -896,7 +898,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) if(debugLevel>3){ AliTRDseedV1 trackletCp(*ptrTracklet); UChar_t status(t.GetStatusTRD(ily)); - (*cstreamer) << "FollowBackProlongation2" + (*cstreamer) << "FollowBackProlongation4" <<"status=" << status <<"tracklet.=" << &trackletCp << "\n"; @@ -912,7 +914,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) // tilt correction options // 0 : no correction // 2 : pseudo tilt correction - if(!ptrTracklet->Fit(2)){ + if(!ptrTracklet->FitRobust(t.Charge()>0?kTRUE:kFALSE)){ t.SetStatus(AliTRDtrackV1::kNoFit, ily); AliDebug(4, "Failed Tracklet Fit"); continue; @@ -947,7 +949,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliTRDseedV1 trackletCp(*ptrTracklet); AliTRDtrackV1 trackCp(t); trackCp.SetOwner(); - (*cstreamer) << "FollowBackProlongation1" + (*cstreamer) << "FollowBackProlongation3" << "status=" << status << "tracklet.=" << &trackletCp << "track.=" << &trackCp @@ -965,7 +967,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliTRDseedV1 trackletCp(*ptrTracklet); AliTRDtrackV1 trackCp(t); trackCp.SetOwner(); - (*cstreamer) << "FollowBackProlongation1" + (*cstreamer) << "FollowBackProlongation3" << "status=" << status << "tracklet.=" << &trackletCp << "track.=" << &trackCp @@ -1003,13 +1005,12 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) //printf("clusters[%d] chi2[%f] x[%f] status[%d ", n, t.GetChi2(), t.GetX(), t.GetStatusTRD()); //for(int i=0; i<6; i++) printf("%d ", t.GetStatusTRD(i)); printf("]\n"); - if(debugLevel > 1){ - Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber(); + if(n && debugLevel > 1){ + //Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber(); AliTRDtrackV1 track(t); track.SetOwner(); - (*cstreamer) << "FollowBackProlongation0" - << "EventNumber=" << eventNumber - << "ncl=" << n + (*cstreamer) << "FollowBackProlongation2" + << "EventNumber=" << fEventInFile << "track.=" << &track << "\n"; } diff --git a/TRD/AliTRDtrackerV1.h b/TRD/AliTRDtrackerV1.h index 28e12c322cd..f782e329ab2 100644 --- a/TRD/AliTRDtrackerV1.h +++ b/TRD/AliTRDtrackerV1.h @@ -217,6 +217,7 @@ private: Int_t fSeedLayer[kMaxTracksStack]; // Seed layer AliTRDchamberTimeBin *fSeedTB[kNSeedPlanes]; // seeding time bin planes Int_t fSieveSeeding; //! Seeding iterator + Int_t fEventInFile; //! event in file being tracked (debug purposes) static const Double_t fgkX0[kNPlanes]; // default values for the position of anode wire static Int_t fgNTimeBins; // Timebins per plane in track prolongation @@ -224,7 +225,7 @@ private: static TLinearFitter *fgTiltedRiemanConstrained; // Fitter for the tilted Rieman fit with vertex constraint static AliRieman *fgRieman; // Fitter for the untilted Rieman fit - ClassDef(AliTRDtrackerV1, 6) // TRD tracker - tracklet based tracking + ClassDef(AliTRDtrackerV1, 7) // TRD tracker - tracklet based tracking }; #endif diff --git a/TRD/AliTRDtransform.cxx b/TRD/AliTRDtransform.cxx index 4528a09a5ba..6be6039c34b 100644 --- a/TRD/AliTRDtransform.cxx +++ b/TRD/AliTRDtransform.cxx @@ -37,8 +37,6 @@ ClassImp(AliTRDtransform) -AliTRDgeometry* AliTRDtransform::fgGeo = NULL; - //_____________________________________________________________________________ AliTRDtransform::AliTRDtransform() :TObject() @@ -61,13 +59,6 @@ AliTRDtransform::AliTRDtransform() // AliTRDtransform default constructor // - if(!fgGeo){ - fgGeo = new AliTRDgeometry(); - if (!fgGeo->CreateClusterMatrixArray()) { - AliError("Could not get transformation matrices\n"); - } - } - fParam = AliTRDCommonParam::Instance(); if (!fParam) { AliError("Could not get common parameters\n"); @@ -107,13 +98,6 @@ AliTRDtransform::AliTRDtransform(Int_t det) // AliTRDtransform constructor for a given detector // - if(!fgGeo){ - fgGeo = new AliTRDgeometry(); - if (!fgGeo->CreateClusterMatrixArray()) { - AliError("Could not get transformation matrices\n"); - } - } - fParam = AliTRDCommonParam::Instance(); if (!fParam) { AliError("Could not get common parameters\n"); @@ -224,6 +208,16 @@ void AliTRDtransform::Copy(TObject &t) const } +//_____________________________________________________________________________ +AliTRDgeometry& AliTRDtransform::Geometry() +{ + static AliTRDgeometry g; + if (!g.CreateClusterMatrixArray()) { + AliErrorGeneral("AliTRDtransform::Geometry()", "Could not get transformation matrices\n"); + } + return g; +} + //_____________________________________________________________________________ void AliTRDtransform::SetDetector(Int_t det) { @@ -244,13 +238,13 @@ void AliTRDtransform::SetDetector(Int_t det) fCalT0DetValue = fkCalT0Det->GetValue(det); // Shift needed to define Z-position relative to middle of chamber - Int_t layer = fgGeo->GetLayer(det); - Int_t stack = fgGeo->GetStack(det); - fPadPlane = fgGeo->GetPadPlane(layer,stack); + Int_t layer = Geometry().GetLayer(det); + Int_t stack = Geometry().GetStack(det); + fPadPlane = Geometry().GetPadPlane(layer,stack); fZShiftIdeal = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd()); // Get the current transformation matrix - fMatrix = fgGeo->GetClusterMatrix(det); + fMatrix = Geometry().GetClusterMatrix(det); } diff --git a/TRD/AliTRDtransform.h b/TRD/AliTRDtransform.h index f3dcf8ce73e..c3ccf11bd93 100644 --- a/TRD/AliTRDtransform.h +++ b/TRD/AliTRDtransform.h @@ -39,10 +39,9 @@ class AliTRDtransform : public TObject { virtual void Recalibrate(AliTRDcluster *c, Bool_t setDet = kTRUE); void SetDetector(Int_t det); + static AliTRDgeometry& Geometry(); -protected: - - static AliTRDgeometry *fgGeo; // TRD geometry + protected: Int_t fDetector; // Detector number AliTRDCommonParam *fParam; // TRD common parameters diff --git a/TRD/CMakelibTRDbase.pkg b/TRD/CMakelibTRDbase.pkg index 1fb90073a8d..0cdd9b6e7df 100644 --- a/TRD/CMakelibTRDbase.pkg +++ b/TRD/CMakelibTRDbase.pkg @@ -25,7 +25,7 @@ # SHLIBS - Shared Libraries and objects for linking (Executables only) # #--------------------------------------------------------------------------------# -set ( SRCS AliTRDarraySignal.cxx AliTRDarrayDictionary.cxx AliTRDarrayADC.cxx AliTRDSignalIndex.cxx AliTRDgeometry.cxx AliTRDdigit.cxx AliTRDdigitsManager.cxx AliTRDdigitsParam.cxx AliTRDrawData.cxx AliTRDpadPlane.cxx AliTRDrawStream.cxx AliTRDCommonParam.cxx AliTRDfeeParam.cxx AliTRDgtuParam.cxx AliTRDcalibDB.cxx Cal/AliTRDCalROC.cxx Cal/AliTRDCalPad.cxx Cal/AliTRDCalDet.cxx Cal/AliTRDCalDCS.cxx Cal/AliTRDCalDCSFEE.cxx Cal/AliTRDCalDCSv2.cxx Cal/AliTRDCalDCSFEEv2.cxx Cal/AliTRDCalDCSPTR.cxx Cal/AliTRDCalDCSGTUBoardInfo.cxx Cal/AliTRDCalDCSGTUCtpOpc.cxx Cal/AliTRDCalDCSGTUSegment.cxx Cal/AliTRDCalDCSGTUTgu.cxx Cal/AliTRDCalDCSGTUTmu.cxx Cal/AliTRDCalDCSGTU.cxx Cal/AliTRDCalMonitoring.cxx Cal/AliTRDCalChamberStatus.cxx Cal/AliTRDCalPadStatus.cxx Cal/AliTRDCalSingleChamberStatus.cxx Cal/AliTRDCalPID.cxx AliTRDCalibraFit.cxx AliTRDCalibraMode.cxx AliTRDCalibraVector.cxx AliTRDCalibraVdriftLinearFit.cxx AliTRDCalibPadStatus.cxx AliTRDCalibChamberStatus.cxx AliTRDCalibViewer.cxx AliTRDCalibViewerGUI.cxx AliTRDEntriesInfo.cxx AliTRDPhInfo.cxx AliTRDPrfInfo.cxx AliTRDUshortInfo.cxx AliTRDQAChecker.cxx AliTRDPreprocessor.cxx AliTRDSaxHandler.cxx AliTRDDataDCS.cxx AliTRDSensor.cxx AliTRDSensorArray.cxx AliTRDalignment.cxx AliTRDtrapConfig.cxx AliTRDmcmSim.cxx AliTRDltuParam.cxx AliTRDtrapConfigHandler.cxx AliTRDtrackGTU.cxx AliTRDtrackletBase.cxx AliTRDtrackletGTU.cxx AliTRDtrackletMCM.cxx AliTRDtrackletWord.cxx AliTRDgtuSim.cxx AliTRDgtuTMU.cxx AliTRDhit.cxx AliTRDrecoParam.cxx AliTRDSimParam.cxx) +set ( SRCS AliTRDarraySignal.cxx AliTRDarrayDictionary.cxx AliTRDarrayADC.cxx AliTRDSignalIndex.cxx AliTRDgeometry.cxx AliTRDdigit.cxx AliTRDdigitsManager.cxx AliTRDdigitsParam.cxx AliTRDrawData.cxx AliTRDpadPlane.cxx AliTRDrawStream.cxx AliTRDCommonParam.cxx AliTRDfeeParam.cxx AliTRDgtuParam.cxx AliTRDcalibDB.cxx Cal/AliTRDCalROC.cxx Cal/AliTRDCalPad.cxx Cal/AliTRDCalDet.cxx Cal/AliTRDCalDCS.cxx Cal/AliTRDCalDCSFEE.cxx Cal/AliTRDCalDCSv2.cxx Cal/AliTRDCalDCSFEEv2.cxx Cal/AliTRDCalDCSPTR.cxx Cal/AliTRDCalDCSGTUBoardInfo.cxx Cal/AliTRDCalDCSGTUCtpOpc.cxx Cal/AliTRDCalDCSGTUSegment.cxx Cal/AliTRDCalDCSGTUTgu.cxx Cal/AliTRDCalDCSGTUTmu.cxx Cal/AliTRDCalDCSGTU.cxx Cal/AliTRDCalMonitoring.cxx Cal/AliTRDCalChamberStatus.cxx Cal/AliTRDCalPadStatus.cxx Cal/AliTRDCalSingleChamberStatus.cxx Cal/AliTRDCalPID.cxx Cal/AliTRDCalTrkAttach.cxx AliTRDCalibraFit.cxx AliTRDCalibraMode.cxx AliTRDCalibraVector.cxx AliTRDCalibraVdriftLinearFit.cxx AliTRDCalibPadStatus.cxx AliTRDCalibChamberStatus.cxx AliTRDCalibViewer.cxx AliTRDCalibViewerGUI.cxx AliTRDEntriesInfo.cxx AliTRDPhInfo.cxx AliTRDPrfInfo.cxx AliTRDUshortInfo.cxx AliTRDQAChecker.cxx AliTRDPreprocessor.cxx AliTRDSaxHandler.cxx AliTRDDataDCS.cxx AliTRDSensor.cxx AliTRDSensorArray.cxx AliTRDalignment.cxx AliTRDtrapConfig.cxx AliTRDmcmSim.cxx AliTRDltuParam.cxx AliTRDtrapConfigHandler.cxx AliTRDtrackGTU.cxx AliTRDtrackletBase.cxx AliTRDtrackletGTU.cxx AliTRDtrackletMCM.cxx AliTRDtrackletWord.cxx AliTRDgtuSim.cxx AliTRDgtuTMU.cxx AliTRDhit.cxx AliTRDrecoParam.cxx AliTRDSimParam.cxx) string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" ) diff --git a/TRD/CMakelibTRDrec.pkg b/TRD/CMakelibTRDrec.pkg index 637296b9826..9630aa9715a 100644 --- a/TRD/CMakelibTRDrec.pkg +++ b/TRD/CMakelibTRDrec.pkg @@ -25,7 +25,7 @@ # SHLIBS - Shared Libraries and objects for linking (Executables only) # #--------------------------------------------------------------------------------# -set ( SRCS AliTRDcluster.cxx AliTRDclusterizer.cxx AliTRDtransform.cxx AliTRDtracklet.cxx AliTRDpidUtil.cxx AliTRDpidESD.cxx AliTRDReconstructor.cxx AliTRDseedV1.cxx AliTRDtrackV1.cxx AliTRDtrackerV1.cxx AliTRDtrackerDebug.cxx AliTRDtrackingSector.cxx AliTRDtrackingChamber.cxx AliTRDchamberTimeBin.cxx AliTRDQADataMakerRec.cxx AliTRDqaBuildReference.cxx AliTRDCalibraFillHisto.cxx Cal/AliTRDCalPIDLQ.cxx Cal/AliTRDCalPIDNN.cxx AliTRDqaRecPoints.cxx) +set ( SRCS AliTRDcluster.cxx AliTRDclusterizer.cxx AliTRDtransform.cxx AliTRDtracklet.cxx AliTRDtrackletOflHelper.cxx AliTRDpidUtil.cxx AliTRDpidESD.cxx AliTRDReconstructor.cxx AliTRDseedV1.cxx AliTRDtrackV1.cxx AliTRDtrackerV1.cxx AliTRDtrackerDebug.cxx AliTRDtrackingSector.cxx AliTRDtrackingChamber.cxx AliTRDchamberTimeBin.cxx AliTRDQADataMakerRec.cxx AliTRDqaBuildReference.cxx AliTRDCalibraFillHisto.cxx Cal/AliTRDCalPIDLQ.cxx Cal/AliTRDCalPIDNN.cxx AliTRDqaRecPoints.cxx) string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" ) diff --git a/TRD/Cal/AliTRDCreateOCDBPIDLQ.C b/TRD/Cal/AliTRDCreateOCDBPIDLQ.C new file mode 100644 index 00000000000..d45082365b4 --- /dev/null +++ b/TRD/Cal/AliTRDCreateOCDBPIDLQ.C @@ -0,0 +1,31 @@ +void AliTRDCreateOCDBPIDLQ(const char *fn){ + + TObjArray *content = new TObjArray; + TFile *in = TFile::Open(fn); + TKey *key = NULL; + TObject *tmp = NULL; + TIter iter(in->GetListOfKeys()); + while((key = (TKey *)iter())){ + tmp = key->ReadObj(); + printf("Putting %s into the OCDB\n", tmp->GetName()); + content->Add(tmp); + } + + AliCDBMetaData *metaData= new AliCDBMetaData(); + metaData->SetObjectClassName("TObjArray"); + metaData->SetResponsible("Markus Fasel"); + metaData->SetBeamPeriod(1); + metaData->SetAliRootVersion("05-21-01"); //root version + metaData->SetComment("TRD PID Reference Histos for the 1D Likelihood method"); + + AliCDBId id("TRD/Calib/PIDLQ1D", 0, AliCDBRunRange::Infinity()); + AliCDBManager *man = AliCDBManager::Instance(); + AliCDBStorage *gStorLoc = man->GetStorage("local:///u/mfasel/OCDB");//$ALICE_ROOT/OCDB"); + if (!gStorLoc) { + return; + } + gStorLoc->Put(content, id, metaData); + in->Close(); + + return; +} \ No newline at end of file diff --git a/TRD/Cal/AliTRDmakeRecoParamFirstPhysics.C b/TRD/Cal/AliTRDmakeRecoParamFirstPhysics.C index 80590907958..6b8d0030a4d 100644 --- a/TRD/Cal/AliTRDmakeRecoParamFirstPhysics.C +++ b/TRD/Cal/AliTRDmakeRecoParamFirstPhysics.C @@ -33,6 +33,7 @@ TObjArray* CreateRecoParamObject() rec->SetNameTitle("Default", "TRD Default Reco Param"); rec->SetNameTitle("LOW", "TRD Low Flux Reco Param"); rec->SetRawStreamVersion("DEFAULT"); + rec->SetPIDmethod(AliTRDPIDResponse::kLQ1D); rec->SetXenon(); rec->SetVertexConstrained(); rec->SetSysCovMatrix(cov); @@ -45,7 +46,7 @@ TObjArray* CreateRecoParamObject() rec->SetNMeanClusters(12.89); rec->SetNSigmaClusters(2.095); rec->SetRoadzMultiplicator(3.); - rec->SetPtThreshold(100.); + rec->SetPtThreshold(0.2);//100.); rec->SetStreamLevel(AliTRDrecoParam::kTracker, 1); rec->SetAsDefault(); @@ -53,6 +54,7 @@ TObjArray* CreateRecoParamObject() rec->SetEventSpecie(AliRecoParam::kHighMult); rec->SetNameTitle("HIGH", "TRD High Flux Reco Param"); rec->SetRawStreamVersion("DEFAULT"); + rec->SetPIDmethod(AliTRDPIDResponse::kLQ1D); rec->SetXenon(); rec->SetVertexConstrained(); rec->SetSysCovMatrix(cov); @@ -64,15 +66,16 @@ TObjArray* CreateRecoParamObject() rec->SetMaxPhi(2.7475); rec->SetNMeanClusters(12.89); rec->SetNSigmaClusters(2.095); - rec->SetPtThreshold(100.); + rec->SetPtThreshold(0.2);//100.); rec->SetStreamLevel(AliTRDrecoParam::kTracker, 1); recos->AddLast(rec = AliTRDrecoParam::GetCosmicTestParam()); rec->SetEventSpecie(AliRecoParam::kCosmic); rec->SetNameTitle("COSMIC", "TRD Cosmic Reco Param"); rec->SetRawStreamVersion("DEFAULT"); + rec->SetPIDmethod(AliTRDPIDResponse::kLQ1D); rec->SetXenon(); -// rec->SetPtThreshold(100.); + rec->SetPtThreshold(0.2); rec->SetStreamLevel(AliTRDrecoParam::kTracker, 1); recos->AddLast(rec = AliTRDrecoParam::GetCosmicTestParam()); @@ -80,8 +83,6 @@ TObjArray* CreateRecoParamObject() rec->SetNameTitle("CALIBRATION", "TRD Calibration Reco Param"); rec->SetRawStreamVersion("DEFAULT"); rec->SetXenon(); -// rec->SetPtThreshold(100.); - rec->SetStreamLevel(AliTRDrecoParam::kTracker, 1); return recos; } diff --git a/TRD/Cal/AliTRDmakeTrkDB.C b/TRD/Cal/AliTRDmakeTrkDB.C new file mode 100644 index 00000000000..665222d1e58 --- /dev/null +++ b/TRD/Cal/AliTRDmakeTrkDB.C @@ -0,0 +1,28 @@ +//____________________________________________________ +void AliTRDmakeTrkDB(const Char_t *file) +{ + AliCDBManager *man = AliCDBManager::Instance(); + AliCDBStorage *gStorLoc = man->GetStorage("local://$ALICE_ROOT/OCDB"); + if (!gStorLoc) return; + + // Attach clusters likelihoods + AliCDBMetaData *metaData= new AliCDBMetaData(); + metaData->SetObjectClassName("TObjArray"); + metaData->SetResponsible("Alexandru Bercuci"); + metaData->SetBeamPeriod(1); + metaData->SetAliRootVersion("05-27-06b"); //root version + metaData->SetComment( + "Likelihoods for Attach Cluster.\n" + " Tunned on Pb-Pb run 137161."); + AliCDBId id("TRD/Calib/TrkAttach", 95352, AliCDBRunRange::Infinity()); + AliTRDCalTrkAttach attach; + if(!attach.LoadReferences(file)) return; +// attach.SetNsgmDy(Int_t ns0, Int_t ns1); +// attach.SetLikeMinRelDecrease(Float_t p0, Float_t p1); +// attach.SetRClikeLimit(Float_t rc); + attach.SetScaleCov(5.); + gStorLoc->Put(&attach, id, metaData); + + return; +} + diff --git a/TRD/TRDbaseLinkDef.h b/TRD/TRDbaseLinkDef.h index 0c0d046c335..47a1e05b2d4 100644 --- a/TRD/TRDbaseLinkDef.h +++ b/TRD/TRDbaseLinkDef.h @@ -56,6 +56,7 @@ #pragma link C++ class AliTRDCalPadStatus+; #pragma link C++ class AliTRDCalSingleChamberStatus+; #pragma link C++ class AliTRDCalPID+; +#pragma link C++ class AliTRDCalTrkAttach+; #pragma link C++ class AliTRDalignment+; diff --git a/TRD/TRDrecLinkDef.h b/TRD/TRDrecLinkDef.h index 2f09265c291..c74de77a89f 100644 --- a/TRD/TRDrecLinkDef.h +++ b/TRD/TRDrecLinkDef.h @@ -18,6 +18,7 @@ #pragma link C++ class AliTRDReconstructor+; #pragma link C++ class AliTRDtracklet+; +#pragma link C++ class AliTRDtrackletOflHelper+; #pragma link C++ class AliTRDseedV1+; #pragma link C++ class AliTRDtrackV1+; #pragma link C++ class AliTRDtrackerV1+; -- 2.43.0