2 //**************************************************************************
3 //* This file is property of and copyright by the ALICE HLT Project *
4 //* ALICE Experiment at CERN, All rights reserved. *
6 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
7 //* Jochen Thaeder <jochen@thaeder.de> *
8 //* for The ALICE HLT Project. *
10 //* Permission to use, copy, modify and distribute this software and its *
11 //* documentation strictly for non-commercial purposes is hereby granted *
12 //* without fee, provided that the above copyright notice appears in all *
13 //* copies and that both the copyright notice and this permission notice *
14 //* appear in the supporting documentation. The authors make no claims *
15 //* about the suitability of this software for any purpose. It is *
16 //* provided "as is" without express or implied warranty. *
17 //**************************************************************************
19 /// @file AliHLTTRDTriggerComponent.cxx
20 /// @author Felix Rettig, Stefan Kirsch
26 #include "TObjArray.h"
27 #include "TObjString.h"
31 #include "AliESDtrack.h"
32 #include "AliESDEvent.h"
33 #include "AliHLTTRDDefinitions.h"
34 #include "AliHLTTriggerDecision.h"
35 #include "AliHLTDomainEntry.h"
36 #include "AliHLTLogging.h"
37 #include "AliHLTErrorGuard.h"
38 #include "AliHLTGlobalBarrelTrack.h"
39 #include "AliESDtrackCuts.h"
40 //#include "AliHLTESDTrackCuts.h"
41 #include "AliGeomManager.h"
42 #include "AliHLTComponentBenchmark.h"
43 #include "AliHLTTRDTriggerComponent.h"
44 #include "AliTRDonlineTrackingDataContainer.h"
45 #include "AliTRDpadPlane.h"
47 ClassImp(AliHLTTRDTriggerComponent)
49 #define LogError( ... ) { HLTError(__VA_ARGS__); if (fDebugLevel >= 1) { DbgLog("ERROR", __VA_ARGS__); } }
50 #define LogInfo( ... ) { HLTInfo(__VA_ARGS__); if (fDebugLevel >= 1) { DbgLog("INFO", __VA_ARGS__); } }
51 #define LogInspect( ... ) { HLTDebug(__VA_ARGS__); if (fDebugLevel >= 1) { DbgLog("INSPECT", __VA_ARGS__); } }
52 #define LogDebug( ... ) { if (fDebugLevel >= 1) { HLTInfo(__VA_ARGS__); DbgLog("DEBUG", __VA_ARGS__); } }
54 AliHLTTRDTriggerComponent::AliHLTTRDTriggerComponent() :
57 fRefTrackSelectionEtaLimit(0.9),
58 fRefTrackSelectionVertexXYLimit(20.),
59 fRefTrackSelectionVertexZLimit(30.),
60 fRefTrackSelectionPtThreshold(0.7),
61 fMatchRatingThreshold(0.25),
62 fElectronTriggerPtThresholdHSE(3.),
63 fElectronTriggerPIDThresholdHSE(144),
64 fElectronTriggerPtThresholdHQU(2.),
65 fElectronTriggerPIDThresholdHQU(164),
66 fApplyRefTrackCuts(kFALSE),
67 fElectronTriggerOnL1TrgOnly(kFALSE),
70 fExtendedHistos(kFALSE),
71 fEventRendering(kFALSE),
74 fEventId(fgkInvalidEventId),
78 fIsMinBiasEvent(kFALSE),
79 fIsTRDElectronEvent(kFALSE),
80 fESDtracksPresent(kFALSE),
81 fHLTtracksPresent(kFALSE),
92 fHistMatchRating(NULL),
93 fHistMatchRatingByPt(NULL),
94 fHistMatchRatingByPid(NULL),
96 fHistTrackPtMatched(NULL),
97 fHistTrackPtCorr(NULL),
99 fHistTrackPidMatched(NULL),
100 fHistElectronCandidatePt(NULL),
101 fHistElectronCandidateMatchedPt(NULL),
102 fHistElectronCandidatePid(NULL),
103 fHistElectronCandidateMatchedPid(NULL),
104 fHistRefTrackPid(NULL),
105 fHistMatchedRefTrackPid(NULL),
106 fHistPIDvsTruncPID(NULL),
107 fHistElectronFalsePIDvsTruncPID(NULL),
108 fHistElectronConfirmedPIDvsTruncPID(NULL),
109 fHistTrackMatchingCombinations(NULL),
110 fHistElectronTriggerBaseMinBias(NULL),
111 fHistElectronTriggerBaseTrdL1(NULL)
115 const char* AliHLTTRDTriggerComponent::fgkDefaultOCDBEntry = "HLT/ConfigHLT/TRDTrigger";
116 const char* AliHLTTRDTriggerComponent::fgkTriggerDecisionElectronHSE = "TRD-ELECTRON-HSE";
117 const char* AliHLTTRDTriggerComponent::fgkTriggerDecisionElectronHQU = "TRD-ELECTRON-HQU";
119 AliHLTTRDTriggerComponent::~AliHLTTRDTriggerComponent()
123 const char* AliHLTTRDTriggerComponent::GetTriggerName() const
128 return "TRDTriggerComponent";
131 AliHLTComponent* AliHLTTRDTriggerComponent::Spawn()
133 return new AliHLTTRDTriggerComponent;
136 int AliHLTTRDTriggerComponent::DoInit(int argc, const char** argv)
142 fChunkId = new TString("XXXXX");
145 // chunk identification for debug output
146 *fChunkId = gSystem->WorkingDirectory();
147 fChunkId->Remove(0, fChunkId->Last('/') + 1);
148 if (fChunkId->Contains("hlt_trd_comp"))
156 AliGeomManager::LoadGeometry();
158 fTRDGeometry = new AliTRDgeometry();
164 fTrackingData = new AliTRDonlineTrackingDataContainer();
165 if (!fTrackingData) {
170 fHLTTracks = new vector<AliHLTGlobalBarrelTrack>;
176 fRefTrackCuts = new AliESDtrackCuts("AliESDtrackCuts", "No track cuts");
178 // fRefTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kTRUE, 0);
179 fRefTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
180 fRefTrackCuts->SetEtaRange(-0.8, 0.8);
186 fHistArray = new TObjArray(25);
189 fHistArray->SetOwner(kTRUE);
191 fHistMatchRating = new TH1I("trdtrg_match_rating", "Match rating distribution HLT tracks vs. GTU track;match rating;abundance;",
193 fHistArray->AddLast(fHistMatchRating);
195 fHistMatchRatingByPt = new TH2I("trdtrg_match_rating_pt", "Match rating distribution HLT tracks vs. GTU track by p_{T};match rating m;p_{T}^{TRD,online} (GeV/c)",
196 1./0.02, 0., 1., 20./0.02, 0., 20.);
197 fHistArray->AddLast(fHistMatchRatingByPt);
199 fHistMatchRatingByPid = new TH2I("trdtrg_match_rating_pid", "Match rating distribution HLT tracks vs. GTU track by PID;match rating m;PID (a.u.)",
200 1./0.02, 0., 1., 256, 0, 256);
201 fHistArray->AddLast(fHistMatchRatingByPid);
203 fHistTrackPt = new TH1I("trdtrg_track_pt", "GTU track p_{T};GTU track p_{T} (GeV/c);abundance", 200, -20, 20.);
204 fHistArray->AddLast(fHistTrackPt);
206 fHistTrackPtMatched = new TH1I("trdtrg_matched_track_pt", "matched GTU track p_{T};GTU track p_{T} (GeV/c);abundance", 200, -20, 20.);
207 fHistArray->AddLast(fHistTrackPtMatched);
209 fHistTrackPtCorr = new TH2I("trdtrg_track_pt_corr", "HLT vs. GTU track p_{T};p_{T}^{HLT} (GeV/c);p_{T}^{GTU} (GeV/c)",
210 400, -40., 40., 400, -40., 40.);
211 fHistArray->AddLast(fHistTrackPtCorr);
213 fHistTrackPid = new TH1I("trdtrg_track_pid", "GTU track PID;GTU track PID (a.u.);abundance", 256, 0, 256);
214 fHistArray->AddLast(fHistTrackPid);
216 fHistTrackPidMatched = new TH1I("trdtrg_matched_track_pid", "matched GTU track PID;GTU track PID (a.u.);abundance", 256, 0, 256);
217 fHistArray->AddLast(fHistTrackPidMatched);
219 fHistTrackMatchingCombinations = new TH2I("trdtrg_matching_combinations", "HLT-GTU track matching combinations;set;combinations to check;",
220 10, 0, 10, 2000, 0, 10000);
221 fHistArray->AddLast(fHistTrackMatchingCombinations);
223 fHistElectronTriggerBaseMinBias = new TH1I("trdtrg_electron_trigger_base_mb", "min. bias base numbers for electron trigger analysis;set;abundance;",
225 fHistElectronTriggerBaseMinBias->GetXaxis()->SetBinLabel(1, "min. bias events");
226 fHistElectronTriggerBaseMinBias->GetXaxis()->SetBinLabel(2, "TRD L1 electron triggered");
227 fHistElectronTriggerBaseMinBias->GetXaxis()->SetBinLabel(3, "TRD HLT electron triggered");
228 fHistArray->AddLast(fHistElectronTriggerBaseMinBias);
230 fHistElectronTriggerBaseTrdL1 = new TH1I("trdtrg_electron_trigger_base_l1", "TRD L1 base numbers for electron trigger analysis;set;abundance;",
232 fHistElectronTriggerBaseTrdL1->GetXaxis()->SetBinLabel(1, "TRD L1 electron triggered");
233 fHistElectronTriggerBaseTrdL1->GetXaxis()->SetBinLabel(2, "TRD HLT electron triggered");
234 fHistArray->AddLast(fHistElectronTriggerBaseTrdL1);
236 fHistElectronCandidatePt = new TH1I("trdtrg_electron_candidate_pt", "GTU electron candidate p_{T};GTU track p_{T} (GeV/c);abundance", 200, -20, 20.);
237 fHistArray->AddLast(fHistElectronCandidatePt);
239 fHistElectronCandidateMatchedPt = new TH1I("trdtrg_electron_candidate_matched_pt", "matching GTU electron candidate p_{T};GTU track p_{T} (GeV/c);abundance", 200, -20, 20.);
240 fHistArray->AddLast(fHistElectronCandidateMatchedPt);
242 fHistElectronCandidatePid = new TH1I("trdtrg_electron_candidate_pid", "GTU electron candidate PID;GTU track PID (a.u.);abundance", 256, 0, 256);
243 fHistArray->AddLast(fHistElectronCandidatePid);
245 fHistElectronCandidateMatchedPid = new TH1I("trdtrg_electron_candidate_matched_pid", "matching GTU electron candidate PID;GTU track PID (a.u.);abundance", 256, 0, 256);
246 fHistArray->AddLast(fHistElectronCandidateMatchedPid);
252 if (fHistArray) delete fHistArray;
255 if (fTRDGeometry) delete fTRDGeometry;
258 if (fRefTrackCuts) delete fRefTrackCuts;
259 fRefTrackCuts = NULL;
261 if (fHLTTracks) delete fHLTTracks;
264 if (fTrackingData) delete fTrackingData;
265 fTrackingData = NULL;
267 if (fChunkId) delete fChunkId;
272 // check if the -triggername argument is used, the trigger name determines the following initialization
273 vector<const char*> remainingArgs;
274 for (int i = 0; i < argc; ++i) {
275 if (strcmp(argv[i], "-triggername") == 0) {
279 LogError("invalid parameter for argument '-triggername', string expected");
284 remainingArgs.push_back(argv[i]);
288 if (!fName.IsNull()) {
289 cdbPath = "HLT/ConfigHLT/";
292 cdbPath = fgkDefaultOCDBEntry;
295 LogInfo("cdbPath = <%s>", cdbPath.Data());
296 iResult = ConfigureFromCDBObject(cdbPath);
298 if (iResult >= 0 && argc > 0)
299 iResult = ConfigureFromArgumentString(remainingArgs.size(), &(remainingArgs[0]));
304 int AliHLTTRDTriggerComponent::DoDeinit()
308 if (fEventDisplay) delete fEventDisplay;
309 fEventDisplay = NULL;
312 if ((fHistoMode == 1) && (fWriteHistos)){
313 TFile out("trg_out/trg_hists.root", "RECREATE");
314 if (!out.IsZombie()) {
316 UInt_t numHists = fHistArray->GetEntries();
317 for (UInt_t iHist = 0; iHist < numHists; ++iHist)
318 if (fHistArray->At(iHist))
319 fHistArray->At(iHist)->Write();
324 if (fHistArray) delete fHistArray;
327 if (fRefTrackCuts) delete fRefTrackCuts;
328 fRefTrackCuts = NULL;
330 if (!fHLTTracks) delete fHLTTracks;
333 if (fTrackingData) delete fTrackingData;
334 fTrackingData = NULL;
336 if (fTRDGeometry) delete fTRDGeometry;
339 if (fChunkId) delete fChunkId;
345 int AliHLTTRDTriggerComponent::Reconfigure(const char* cdbEntry, const char* /*chainId*/)
348 if (!cdbEntry || cdbEntry[0] == 0) {
349 if (!fName.IsNull()) {
350 cdbPath = "HLT/ConfigHLT/";
353 cdbPath = fgkDefaultOCDBEntry;
358 return ConfigureFromCDBObject(cdbPath);
361 int AliHLTTRDTriggerComponent::ReadPreprocessorValues(const char* /*modules*/)
366 Int_t AliHLTTRDTriggerComponent::ConfigureFromCDBObject(TString /*cdbPath*/)
371 int AliHLTTRDTriggerComponent::ScanConfigurationArgument(int argc, const char** argv)
378 TString argument(argv[iArg]);
380 if (!argument.CompareTo("-match-sel-eta")){
381 if (++iArg >= argc) return -EPROTO;
382 argument = argv[iArg];
383 fRefTrackSelectionEtaLimit = argument.Atof();
384 LogInfo("ref track selection eta limit set to %.1f.", fRefTrackSelectionEtaLimit);
388 if (!argument.CompareTo("-match-sel-vxy")){
389 if (++iArg >= argc) return -EPROTO;
390 argument = argv[iArg];
391 fRefTrackSelectionVertexXYLimit = argument.Atof();
392 LogInfo("ref track selection vertex xy limit set to %.1f.", fRefTrackSelectionVertexXYLimit);
396 if (!argument.CompareTo("-match-sel-vz")){
397 if (++iArg >= argc) return -EPROTO;
398 argument = argv[iArg];
399 fRefTrackSelectionVertexZLimit = argument.Atof();
400 LogInfo("ref track selection vertex z limit set to %.1f.", fRefTrackSelectionVertexZLimit);
404 if (!argument.CompareTo("-match-sel-pt")){
405 if (++iArg >= argc) return -EPROTO;
406 argument = argv[iArg];
407 fRefTrackSelectionPtThreshold = argument.Atof();
408 LogInfo("ref track selection pt threshold set to %.1f GeV/c.", fRefTrackSelectionPtThreshold);
412 if (!argument.CompareTo("-match-rating")){
413 if (++iArg >= argc) return -EPROTO;
414 argument = argv[iArg];
415 fMatchRatingThreshold = argument.Atof();
416 LogInfo("match rating threshold set to %.2f GeV/c.", fMatchRatingThreshold);
420 if (!argument.CompareTo("-histo-mode")){
421 if (++iArg >= argc) return -EPROTO;
422 argument = argv[iArg];
423 fHistoMode = argument.Atoi();
424 LogInfo("histo mode set to %d", fHistoMode);
428 if (!argument.CompareTo("-trghse")){
429 LogInfo("TRD HLT electron trigger HSE enabled.");
433 if (!argument.CompareTo("-hse-pt")){
434 if (++iArg >= argc) return -EPROTO;
435 argument = argv[iArg];
436 fElectronTriggerPtThresholdHSE = argument.Atof();
437 LogInfo("pt threshold for HSE trigger set to %.1f GeV/c.", fElectronTriggerPtThresholdHSE);
441 if (!argument.CompareTo("-hse-pid")){
442 if (++iArg >= argc) return -EPROTO;
443 argument = argv[iArg];
444 fElectronTriggerPIDThresholdHSE = argument.Atof();
445 LogInfo("PID threshold for HSE trigger set to %d.", fElectronTriggerPIDThresholdHSE);
449 if (!argument.CompareTo("-trghqu")){
450 LogInfo("TRD HLT electron trigger HQU enabled.");
454 if (!argument.CompareTo("-hqu-pt")){
455 if (++iArg >= argc) return -EPROTO;
456 argument = argv[iArg];
457 fElectronTriggerPtThresholdHQU = argument.Atof();
458 LogInfo("pt threshold for HQU trigger set to %.1f GeV/c.", fElectronTriggerPtThresholdHQU);
462 if (!argument.CompareTo("-hqu-pid")){
463 if (++iArg >= argc) return -EPROTO;
464 argument = argv[iArg];
465 fElectronTriggerPIDThresholdHQU = argument.Atof();
466 LogInfo("PID threshold for HQU trigger set to %.1f GeV/c.", fElectronTriggerPIDThresholdHQU);
470 if (!argument.CompareTo("-l1-only")){
471 LogInfo("evaluation of electron trigger only for events with TRD L1 electron trigger enabled.");
472 fElectronTriggerOnL1TrgOnly = kTRUE;
476 if (!argument.CompareTo("-histo-ext")){
477 LogInfo("extended histogramming enabled.");
478 fExtendedHistos = kTRUE; // enable extended histogramming, for debugging/tuning only!
480 if (!fHistRefTrackPid){
481 fHistRefTrackPid = new TH2I("trdtrg_reftrack_pid", "TPC dE/dx by p_{T} for matching GTU tracks;p_{T} (GeV/c);dE/dx (a. u.)",
482 500, 0., 10., 500, 0., 500);
483 fHistArray->AddLast(fHistRefTrackPid);
486 if (!fHistMatchedRefTrackPid){
487 fHistMatchedRefTrackPid = new TH2I("trdtrg_matched_reftrack_pid", "TPC dE/dx by p_{T} for matching GTU tracks;p_{T} (GeV/c);dE/dx (a. u.)",
488 500, 0., 10., 500, 0., 500);
489 fHistArray->AddLast(fHistMatchedRefTrackPid);
492 if (!fHistPIDvsTruncPID){
493 fHistPIDvsTruncPID = new TH2I("trdtrg_pid_trunc_pid", "GTU track PID vs. truncated PID;PID (a.u.);truncated PID (a. u.)",
494 256, 0., 256., 256, 0., 256.);
495 fHistArray->AddLast(fHistPIDvsTruncPID);
498 if (!fHistElectronFalsePIDvsTruncPID){
499 fHistElectronFalsePIDvsTruncPID = new TH2I("trdtrg_electron_false_pid_trunc_pid", "false electron PID vs. truncated PID;PID (a.u.);truncated PID (a. u.)",
500 256, 0., 256., 256, 0., 256.);
501 fHistArray->AddLast(fHistElectronFalsePIDvsTruncPID);
504 if (!fHistElectronConfirmedPIDvsTruncPID){
505 fHistElectronConfirmedPIDvsTruncPID = new TH2I("trdtrg_electron_confirmed_pid_trunc_pid", "confirmed electron PID vs. truncated PID;PID (a.u.);truncated PID (a. u.)",
506 256, 0., 256., 256, 0., 256.);
507 fHistArray->AddLast(fHistElectronConfirmedPIDvsTruncPID);
513 if (!argument.CompareTo("-ref-cuts")){
514 LogInfo("ref track cuts for matching enabled.");
515 fApplyRefTrackCuts = kTRUE;
519 if (!argument.CompareTo("-push-histograms")){
520 LogInfo("pushing of histograms enabled.");
521 fPushHistos = kTRUE; // enable histogram pushing, for debugging/tuning only!
525 if (!argument.CompareTo("-write-histograms")){
526 LogInfo("writing of histograms enabled.");
527 fWriteHistos = kTRUE; // enable histogram writing, for debugging/tuning only!
531 if (!argument.CompareTo("-render")){
533 LogInfo("rendering of interesting events enabled.");
535 fEventDisplay = new AliTRDtrackingEventDisplay();
536 LogInfo("event rendering activated. this is for debugging only!");
537 fEventRendering = kTRUE; // enable event rendering, for debugging/tuning only!
542 if (!argument.CompareTo("-debug")){
543 if (++iArg >= argc) return -EPROTO;
544 argument = argv[iArg];
545 fDebugLevel = argument.Atoi();
546 LogInfo("debug level set to %d.", fDebugLevel);
550 if (!argument.CompareTo("-ref-pt")){
551 if (++iArg >= argc) return -EPROTO;
552 argument = argv[iArg];
553 Float_t minPt, maxPt;
554 fRefTrackCuts->GetPtRange(minPt, maxPt);
555 maxPt = argument.Atof();
556 fRefTrackCuts->SetPtRange(minPt, maxPt);
557 LogInfo("ref track pt range set to %.1f .. %.1f GeV/c.", minPt, maxPt);
561 if (!argument.CompareTo("-ref-tdca")){
562 if (++iArg >= argc) return -EPROTO;
563 argument = argv[iArg];
564 fRefTrackCuts->SetMaxDCAToVertexXY(argument.Atof());
565 LogInfo("ref track DCA transverse threshold set to %.3f", argument.Atof());
569 if (!argument.CompareTo("-ref-ldca")){
570 if (++iArg >= argc) return -EPROTO;
571 argument = argv[iArg];
572 fRefTrackCuts->SetMaxDCAToVertexZ(argument.Atof());
573 LogInfo("ref track longitudinal DCA threshold set to %.3f", argument.Atof());
580 void AliHLTTRDTriggerComponent::ScanTriggerClasses(const char* firedTriggerClasses) {
582 fIsMinBiasEvent = kFALSE;
584 TString trg(firedTriggerClasses);
585 if (trg.Index("CINT7WU-S-NOPF-ALL") >= 0)
586 fIsMinBiasEvent = kTRUE;
588 if (trg.Index("CINT8WU-S-NOPF-ALL") >= 0)
589 fIsMinBiasEvent = kTRUE;
593 Bool_t AliHLTTRDTriggerComponent::CheckRefTrackCuts(AliESDtrack* track){
596 if (fApplyRefTrackCuts)
597 return fRefTrackCuts->AcceptTrack(track) ? kTRUE : kFALSE;
599 // simple custom cuts
600 Float_t dcaToVertexXY, dcaToVertexZ;
601 track->GetImpactParametersTPC(dcaToVertexXY, dcaToVertexZ);
602 // LogDebug("IMPACT TPC %.4f %.4f", dcaToVertexXY, dcaToVertexZ);
604 if ((dcaToVertexXY > fRefTrackSelectionVertexXYLimit) || (dcaToVertexZ >= fRefTrackSelectionVertexZLimit))
607 if (TMath::Abs(track->Eta()) > fRefTrackSelectionEtaLimit)
614 void AliHLTTRDTriggerComponent::DbgLog(const char* prefix, ...){
616 AliHLTEventID_t eventNumber = fEventId;
617 printf("TRDHLTGM %s-%s-%s: [TRG] %s",
618 (fRunNumber >= 0) ? Form("%06d", fRunNumber) : "XXXXXX",
620 (eventNumber != fgkInvalidEventId) ? Form("%05llu", eventNumber) : "XXXXX",
621 (strlen(prefix) > 0) ? Form("<%s> ", prefix) : "");
624 va_start(args, prefix);
625 char* fmt = va_arg(args, char*);
631 int AliHLTTRDTriggerComponent::PrepareESDData(){
634 fESDtracksPresent = kFALSE;
636 // check access to ESD event data
637 const TObject* obj = GetFirstInputObject(kAliHLTAllDataTypes, "AliESDEvent");
638 fEsdEvent = dynamic_cast<AliESDEvent*>(const_cast<TObject*>(obj));
641 fEsdEvent->GetStdContent();
642 fRunNumber = fEsdEvent->GetRunNumber();
643 fESDtracksPresent = kTRUE;
644 unsigned int numTracks = fEsdEvent->GetNumberOfTracks();
646 // process trigger classes
647 ScanTriggerClasses(fEsdEvent->GetFiredTriggerClasses().Data());
649 LogDebug("ESD event data: %d ESD tracks [event num: %d] [minbias: %d (fired:%s)]",
650 numTracks, fEsdEvent->GetEventNumberInFile(), fIsMinBiasEvent, fEsdEvent->GetFiredTriggerClasses().Data());
652 // process ESD tracks
653 if ((fDebugLevel >= 2) || fExtendedHistos){
654 AliESDtrack* esdTrack;
655 TString paramStr("");
656 for (unsigned int iTrack = 0; iTrack < numTracks; ++iTrack) {
657 esdTrack = fEsdEvent->GetTrack(iTrack);
659 if (fExtendedHistos){
660 fHistRefTrackPid->Fill(esdTrack->Pt(), esdTrack->GetTPCsignal());
663 if (fDebugLevel >= 2){
667 if (esdTrack->GetInnerParam())
670 if (esdTrack->GetOuterParam())
673 LogDebug("ESD track %4d - pt: %+.2fGeV/c [params: S%s]", iTrack, esdTrack->GetSignedPt(), paramStr.Data());
675 LogError("ESD data for track %d invalid", iTrack);
678 } // loop over ESD tracks
681 fTrackingData->SetGtuPtMultiplierFromMagField(fEsdEvent->GetMagneticField()); // used for sign correction
691 int AliHLTTRDTriggerComponent::PrepareHLTData(){
694 UInt_t numHLTTracks = 0;
695 fHLTtracksPresent = kFALSE;
698 LogError("HLT track vector instance not available.");
704 for (const AliHLTComponentBlockData *pBlock = GetFirstInputBlock(kAliHLTDataTypeTrack | kAliHLTDataOriginTPC);
705 pBlock != NULL; pBlock = GetNextInputBlock()) {
706 LogDebug("#hlttrk - data block with HLT raw tracks received");
707 fHLTtracksPresent = kTRUE;
709 // vector<AliHLTGlobalBarrelTrack> hltTracks;
710 if ((iResult = AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, *fHLTTracks)) >= 0) {
711 for (vector<AliHLTGlobalBarrelTrack>::iterator element = fHLTTracks->begin();
712 element != fHLTTracks->end(); element++) {
715 //## AliHLTGlobalBarrelTrack -> AliKalmanTrack -> AliExternalTrackParam
717 } // loop over HLT tracks
719 } // loop over data blocks
721 LogDebug("#hlttrk - %d HLT raw tracks found", numHLTTracks);
727 int AliHLTTRDTriggerComponent::PrepareTRDData() {
731 fSectorsWithData = 0;
732 fTrackingData->Clear();
733 for (const AliHLTComponentBlockData* datablock = GetFirstInputBlock(AliHLTTRDDefinitions::fgkOnlineDataType);
735 datablock = GetNextInputBlock())
737 fSectorsWithData |= datablock->fSpecification;
738 fTrackingData->Decompress(datablock->fPtr, datablock->fSize, kTRUE);
741 fTrackingData->SetGtuPtMultiplierFromMagField(GetBz()); // used for sign correction
743 fTrackingData->PrintSummary("trigger component");
749 int AliHLTTRDTriggerComponent::MatchTRDTracksESD(){
752 LogError("ESD event data not available in MatchTRDTracks().");
756 if (fHistoMode == 0){
757 UInt_t numHists = fHistArray->GetEntries();
758 for (UInt_t iHist = 0; iHist < numHists; ++iHist)
759 if (fHistArray->At(iHist))
760 ((TH1*) (fHistArray->At(iHist)))->Reset();
764 unsigned int numRefTracks = fEsdEvent->GetNumberOfTracks();
765 unsigned int numGtuTracks;
766 Int_t refTrackIndices[fkMaxRefTracksPerStack];
767 UInt_t refTrackCount = 0;
769 Double_t distY, distZ;
770 Double_t matchRating;
771 Double_t bestMatchRating;
772 Int_t bestMatchRefIndex;
773 AliESDtrack* refTrack = NULL;
774 UInt_t numComparisonsDone = 0;
775 UInt_t numUnmatchedTracks = 0;
776 UInt_t numMatchedTracks = 0;
777 Double_t magField = fEsdEvent->GetMagneticField();
779 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack) {
780 numGtuTracks = fTrackingData->GetNumTracks(iStack);
783 // preselect ESD relevant ESD tracks
784 for (UInt_t iRefTrack = 0; iRefTrack < numRefTracks; ++iRefTrack) {
785 refTrack = fEsdEvent->GetTrack(iRefTrack);
786 isRelevant = (refTrack->Pt() >= fRefTrackSelectionPtThreshold); //## implement properly
788 if (refTrackCount < fkMaxRefTracksPerStack)
789 refTrackIndices[refTrackCount++] = iRefTrack;
791 LogError("number of HLT tracks exceeding limit of %d. Skipping some tracks.", fkMaxRefTracksPerStack);
797 // try to match GTU track with ref tracks
798 for (UInt_t iGtuTrack = 0; iGtuTrack < numGtuTracks; ++iGtuTrack) {
799 bestMatchRating = 0.;
800 bestMatchRefIndex = -1;
801 Double_t gpt = fTrackingData->GetTrackPt(iStack, iGtuTrack);
802 UShort_t gpid = fTrackingData->GetTrackPID(iStack, iGtuTrack);
803 UShort_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iGtuTrack);
805 Float_t trklLocalY[fkTRDLayers];
806 Int_t trklBinZ[fkTRDLayers];
807 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
808 if ((layerMask >> iLayer) & 1){
809 trklLocalY[iLayer] = fTrackingData->GetTrackTrackletLocalY(iStack, iGtuTrack, iLayer);
810 trklBinZ[iLayer] = fTrackingData->GetTrackTrackletBinZ(iStack, iGtuTrack, iLayer);
814 for (UInt_t iRefTrack = 0; iRefTrack < refTrackCount; ++iRefTrack) {
815 refTrack = fEsdEvent->GetTrack(refTrackIndices[iRefTrack]);
817 // if (!CheckRefTrackCuts(refTrack))
820 numComparisonsDone++;
822 // if ((!refTrack->GetOuterParam()) && (!refTrack->GetInnerParam())) // use tracks with TPC outer param only (all HLT tracks have it anyways)
825 Int_t distRes = EstimateTrackDistance(refTrack, iStack, layerMask, trklLocalY, trklBinZ,
826 magField, &distY, &distZ);
828 if (fDebugLevel >= 3){
829 printf("CHECKMATCH = %i distY %.2f distZ %.2f pt: %.2f %.2f\n",
830 distRes, distY, distZ, gpt, refTrack->GetSignedPt());
834 matchRating = RateTrackMatch(distY, distZ, gpt, refTrack->GetSignedPt());
839 if ((matchRating >= fMatchRatingThreshold) && (matchRating > bestMatchRating)) {
840 bestMatchRefIndex = refTrackIndices[iRefTrack];
841 bestMatchRating = matchRating;
842 } else if (matchRating > bestMatchRating)
843 bestMatchRating = matchRating;
845 // DbgLog("", Form("#match - comparing GTU track %d in S%02d-%d with ref track %d: [gpt: %+5.2f rpt: %+5.2f] dy: %.1f dz: %.1f rating: %.1f",
846 // iGtuTrack, iStack/5, iStack%5, refTrackIndices[iRefTrack],
847 // fTrackingData->GetTrackPt(iStack, iGtuTrack), refTrack->GetSignedPt(),
848 // distY, distZ, matchRating));
850 } // loop over ref tracks in stack
852 fHistMatchRating->Fill(bestMatchRating);
853 fHistMatchRatingByPt->Fill(bestMatchRating, TMath::Abs(gpt));
854 fHistMatchRatingByPid->Fill(bestMatchRating, gpid);
855 fHistTrackPt->Fill(gpt);
856 fHistTrackPid->Fill(gpid);
858 if (fExtendedHistos){
859 fHistMatchedRefTrackPid->Fill(refTrack->Pt(), refTrack->GetTPCsignal());
862 if (bestMatchRefIndex >= 0){
863 // GTU track has matching reference track
864 refTrack = fEsdEvent->GetTrack(bestMatchRefIndex);
865 Double_t rpt = refTrack->GetSignedPt();
866 LogDebug("#match - match found: rating %.2f, gpt: %+5.2f, rpt: %+5.2f (%i) -> diff: %.2f%%",
867 bestMatchRating,gpt, rpt, bestMatchRefIndex, (gpt - rpt)/rpt*100.);
868 fTrackingData->SetTrackAddInfo(iStack, iGtuTrack, bestMatchRefIndex);
869 if (fDebugLevel >= 3){
870 LogDebug("#match-info rating: %.2f gpt: %+.2f matchref: %d rpt: %+.2f gpid: %d S%02d-%d %d rpid: %.3f",
871 bestMatchRating, gpt, bestMatchRefIndex, rpt, gpid,
872 iStack/5, iStack%5, iGtuTrack, refTrack->GetTPCsignal());
876 fHistTrackPtMatched->Fill(gpt);
877 fHistTrackPtCorr->Fill(rpt, gpt);
878 fHistTrackPidMatched->Fill(gpid);
881 if (fDebugLevel >= 3){
882 LogDebug("#match-info rating: %.2f gpt: %+.2f no ref matching gpid: %d S%02d-%d %d",
883 bestMatchRating, gpt, gpid,
884 iStack/5, iStack%5, iGtuTrack);
886 numUnmatchedTracks++;
889 } // loop over gtu tracks in stack
891 } // loop over stacks
893 LogInfo("#match - %d matched GTU tracks, %d unmatched",
894 numMatchedTracks, numUnmatchedTracks);
896 fHistTrackMatchingCombinations->Fill(0., (Double_t)(numRefTracks * fTrackingData->GetNumTracks())); // index 0: full combinatorics
897 fHistTrackMatchingCombinations->Fill(1., numComparisonsDone); // index 1: track matching comparisons actually done
903 int AliHLTTRDTriggerComponent::MatchTRDTracksHLT(){
906 LogError("HLT track data available.");
910 Double_t magField = GetBz();
911 unsigned int numGtuTracks;
912 unsigned int numHLTTracks = 0;
914 Double_t distY, distZ;
915 Double_t matchRating;
916 Double_t bestMatchRating;
917 Int_t bestMatchRefIndex;
918 UInt_t numComparisonsDone = 0;
919 UInt_t numUnmatchedTracks = 0;
920 UInt_t numMatchedTracks = 0;
922 Bool_t hltTrackPreSel[fkMaxRefTracks];
925 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack) {
926 numGtuTracks = fTrackingData->GetNumTracks(iStack);
928 // preselect relevant HLT tracks
930 for (vector<AliHLTGlobalBarrelTrack>::iterator element = fHLTTracks->begin();
931 element != fHLTTracks->end(); element++) {
933 isRelevant = (element->Pt() >= fRefTrackSelectionPtThreshold); //## implement properly
936 hltTrackPreSel[iHltTrack++] = isRelevant;
937 if (iHltTrack >= fkMaxRefTracks) {
938 LogError("maximum number of HLT tracks exceeded.");
941 } // loop over HLT tracks;
943 // search for matching HLT track for each GTU track
944 for (UInt_t iGtuTrack = 0; iGtuTrack < numGtuTracks; ++iGtuTrack) {
945 bestMatchRating = 0.;
946 bestMatchRefIndex = -1;
947 Double_t gpt = fTrackingData->GetTrackPt(iStack, iGtuTrack);
948 UShort_t gpid = fTrackingData->GetTrackPID(iStack, iGtuTrack);
949 UShort_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iGtuTrack);
951 Float_t trklLocalY[fkTRDLayers];
952 Int_t trklBinZ[fkTRDLayers];
953 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
954 if ((layerMask >> iLayer) & 1){
955 trklLocalY[iLayer] = fTrackingData->GetTrackTrackletLocalY(iStack, iGtuTrack, iLayer);
956 trklBinZ[iLayer] = fTrackingData->GetTrackTrackletBinZ(iStack, iGtuTrack, iLayer);
961 for (vector<AliHLTGlobalBarrelTrack>::iterator element = fHLTTracks->begin();
962 element != fHLTTracks->end(); element++) {
963 if (!hltTrackPreSel[iHltTrack]){
968 // compare GTU track and relevant HLT track
969 numComparisonsDone++;
971 AliHLTGlobalBarrelTrack hltPar(*element);
972 Int_t distRes = EstimateTrackDistance(&hltPar, iStack, layerMask, trklLocalY, trklBinZ,
973 magField, &distY, &distZ);
975 if (fDebugLevel >= 3){
976 printf("CHECKMATCH = %i distY %.2f distZ %.2f pt: %.2f %.2f\n",
977 distRes, distY, distZ, gpt, element->GetSignedPt());
981 matchRating = RateTrackMatch(distY, distZ, gpt, element->GetSignedPt());
986 if ((matchRating >= fMatchRatingThreshold) && (matchRating > bestMatchRating)) {
987 bestMatchRefIndex = iHltTrack;
988 bestMatchRating = matchRating;
989 } else if (matchRating > bestMatchRating)
990 bestMatchRating = matchRating;
994 } // loop over HLT tracks;
996 fHistMatchRating->Fill(bestMatchRating);
997 fHistMatchRatingByPt->Fill(bestMatchRating, TMath::Abs(gpt));
998 fHistMatchRatingByPid->Fill(bestMatchRating, gpid);
999 fHistTrackPt->Fill(gpt);
1000 fHistTrackPid->Fill(gpid);
1002 if (bestMatchRefIndex >= 0){
1003 // GTU track has matching reference track
1004 Double_t rpt = fHLTTracks->at(bestMatchRefIndex).GetSignedPt();
1005 LogDebug("#match - match found: rating %.2f, gpt: %+5.2f, rpt: %+5.2f (%i) -> diff: %.2f%%",
1006 bestMatchRating,gpt, rpt, bestMatchRefIndex, (gpt - rpt)/rpt*100.);
1007 fTrackingData->SetTrackAddInfo(iStack, iGtuTrack, bestMatchRefIndex);
1009 // if (fExtendedHistos){
1010 // fHistMatchedRefTrackPid->Fill(element->Pt(), element->GetTPCsignal());
1013 // if (fDebugLevel >= 3){
1014 // LogDebug("#match-info rating: %.2f gpt: %+.2f matchref: %d rpt: %+.2f gpid: %d S%02d-%d %d rpid: %.3f",
1015 // bestMatchRating, gpt, bestMatchRefIndex, rpt, gpid,
1016 // iStack/5, iStack%5, iGtuTrack, refTrack->GetTPCsignal());
1020 fHistTrackPtMatched->Fill(gpt);
1021 fHistTrackPtCorr->Fill(rpt, gpt);
1022 fHistTrackPidMatched->Fill(gpid);
1025 if (fDebugLevel >= 3){
1026 LogDebug("#match-info rating: %.2f gpt: %+.2f no ref matching gpid: %d S%02d-%d %d",
1027 bestMatchRating, gpt, gpid,
1028 iStack/5, iStack%5, iGtuTrack);
1030 numUnmatchedTracks++;
1033 } // loop over gtu tracks
1034 } // loop over stacks
1036 LogInfo("#match - %d matched GTU tracks, %d unmatched (%d comparisons)",
1037 numMatchedTracks, numUnmatchedTracks, numComparisonsDone);
1039 fHistTrackMatchingCombinations->Fill(0., (Double_t)(numHLTTracks * fTrackingData->GetNumTracks())); // index 0: full combinatorics
1040 fHistTrackMatchingCombinations->Fill(1., numComparisonsDone); // index 1: track matching comparisons actually done
1045 int AliHLTTRDTriggerComponent::MatchTRDTracks(){
1048 LogError("ESD event data not available in MatchTRDTracks().");
1052 if (fHistoMode == 0){
1053 UInt_t numHists = fHistArray->GetEntries();
1054 for (UInt_t iHist = 0; iHist < numHists; ++iHist)
1055 if (fHistArray->At(iHist))
1056 ((TH1*) (fHistArray->At(iHist)))->Reset();
1060 unsigned int numRefTracks = fEsdEvent->GetNumberOfTracks();
1061 unsigned int numGtuTracks;
1062 Int_t refTrackIndices[fkMaxRefTracksPerStack];
1063 UInt_t refTrackCount = 0;
1065 Double_t distY, distZ;
1066 Double_t matchRating;
1067 Double_t bestMatchRating;
1068 Int_t bestMatchRefIndex;
1069 AliESDtrack* refTrack;
1070 UInt_t numComparisonsDone = 0;
1071 UInt_t numUnmatchedTracks = 0;
1072 UInt_t numMatchedTracks = 0;
1074 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack) {
1075 numGtuTracks = fTrackingData->GetNumTracks(iStack);
1078 // preselect ESD relevant ESD tracks
1079 for (UInt_t iRefTrack = 0; iRefTrack < numRefTracks; ++iRefTrack) {
1080 refTrack = fEsdEvent->GetTrack(iRefTrack);
1081 isRelevant = (refTrack->Pt() >= fRefTrackSelectionPtThreshold);
1083 if (refTrackCount < fkMaxRefTracksPerStack)
1084 refTrackIndices[refTrackCount++] = iRefTrack;
1086 LogError("number of HLT tracks exceeding limit of %d. Skipping some tracks.", fkMaxRefTracksPerStack);
1092 // try to match GTU track with ref tracks
1093 for (UInt_t iGtuTrack = 0; iGtuTrack < numGtuTracks; ++iGtuTrack) {
1094 bestMatchRating = 0.;
1095 bestMatchRefIndex = -1;
1096 Double_t gpt = fTrackingData->GetTrackPt(iStack, iGtuTrack);
1097 UShort_t gpid = fTrackingData->GetTrackPID(iStack, iGtuTrack);
1098 UShort_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iGtuTrack);
1100 for (UInt_t iRefTrack = 0; iRefTrack < refTrackCount; ++iRefTrack) {
1101 refTrack = fEsdEvent->GetTrack(refTrackIndices[iRefTrack]);
1103 if (!CheckRefTrackCuts(refTrack))
1106 numComparisonsDone++;
1108 // if ((!refTrack->GetOuterParam()) && (!refTrack->GetInnerParam())) // use tracks with TPC outer param only (all HLT tracks have it anyways)
1111 Float_t trklLocalY[fkTRDLayers];
1112 Int_t trklBinZ[fkTRDLayers];
1113 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
1114 if ((layerMask >> iLayer) & 1){
1115 trklLocalY[iLayer] = fTrackingData->GetTrackTrackletLocalY(iStack, iGtuTrack, iLayer);
1116 trklBinZ[iLayer] = fTrackingData->GetTrackTrackletBinZ(iStack, iGtuTrack, iLayer);
1120 Int_t distRes = EstimateTrackDistance(refTrack, iStack, layerMask, trklLocalY, trklBinZ,
1121 fEsdEvent->GetMagneticField(), &distY, &distZ);
1124 matchRating = RateTrackMatch(distY, distZ, gpt, refTrack->GetSignedPt());
1129 if ((matchRating >= fMatchRatingThreshold) && (matchRating > bestMatchRating)) {
1130 bestMatchRefIndex = refTrackIndices[iRefTrack];
1131 bestMatchRating = matchRating;
1132 } else if (matchRating > bestMatchRating)
1133 bestMatchRating = matchRating;
1135 // DbgLog("", Form("#match - comparing GTU track %d in S%02d-%d with ref track %d: [gpt: %+5.2f rpt: %+5.2f] dy: %.1f dz: %.1f rating: %.1f",
1136 // iGtuTrack, iStack/5, iStack%5, refTrackIndices[iRefTrack],
1137 // fTrackingData->GetTrackPt(iStack, iGtuTrack), refTrack->GetSignedPt(),
1138 // distY, distZ, matchRating));
1140 } // loop over ref tracks in stack
1142 fHistMatchRating->Fill(bestMatchRating);
1143 fHistMatchRatingByPt->Fill(bestMatchRating, TMath::Abs(gpt));
1144 fHistMatchRatingByPid->Fill(bestMatchRating, gpid);
1145 fHistTrackPt->Fill(gpt);
1146 fHistTrackPid->Fill(gpid);
1148 if (bestMatchRefIndex >= 0){
1149 // GTU track has matching reference track
1150 refTrack = fEsdEvent->GetTrack(bestMatchRefIndex);
1151 Double_t rpt = refTrack->GetSignedPt();
1152 LogDebug("#match - match found: rating %.2f, gpt: %+5.2f, rpt: %+5.2f (%i) -> diff: %.2f%%",
1153 bestMatchRating,gpt, rpt, bestMatchRefIndex, (gpt - rpt)/rpt*100.);
1154 fTrackingData->SetTrackAddInfo(iStack, iGtuTrack, bestMatchRefIndex);
1156 if (fExtendedHistos){
1157 fHistMatchedRefTrackPid->Fill(refTrack->Pt(), refTrack->GetTPCsignal());
1160 if (fDebugLevel >= 3){
1161 LogDebug("#match-info rating: %.2f gpt: %+.2f matchref: %d rpt: %+.2f gpid: %d S%02d-%d %d rpid: %.3f",
1162 bestMatchRating, gpt, bestMatchRefIndex, rpt, gpid,
1163 iStack/5, iStack%5, iGtuTrack, refTrack->GetTPCsignal());
1167 fHistTrackPtMatched->Fill(gpt);
1168 fHistTrackPtCorr->Fill(rpt, gpt);
1169 fHistTrackPidMatched->Fill(gpid);
1172 if (fDebugLevel >= 3){
1173 LogDebug("#match-info rating: %.2f gpt: %+.2f no ref matching gpid: %d S%02d-%d %d",
1174 bestMatchRating, gpt, gpid,
1175 iStack/5, iStack%5, iGtuTrack);
1177 numUnmatchedTracks++;
1180 } // loop over gtu tracks in stack
1182 } // loop over stacks
1184 LogInfo("#match - %d matched GTU tracks, %d unmatched",
1185 numMatchedTracks, numUnmatchedTracks);
1187 fHistTrackMatchingCombinations->Fill(0., (Double_t)(numRefTracks * fTrackingData->GetNumTracks())); // index 0: full combinatorics
1188 fHistTrackMatchingCombinations->Fill(1., numComparisonsDone); // index 1: track matching comparisons actually done
1193 void AliHLTTRDTriggerComponent::DumpTrackingData(){
1195 if (fTrackingData->GetNumTracklets() + fTrackingData->GetNumTracks() == 0)
1198 TString trklStr("");
1199 TString matchStr("");
1202 // for (UShort_t iSector = 0; iSector < 18; ++iSector){
1203 // if (fTrackingData->GetSectorTrgWord(iSector) != ((UInt_t)0x2345352 ^ ((UInt_t)iSector + 34)))
1204 // LogError("invalid sector trigger word in sector %02d: trg word is 0x%08x, should be 0x%08x",
1205 // iSector, fTrackingData->GetSectorTrgWord(iSector), ((UInt_t)0x2345352 ^ ((UInt_t)iSector + 34)));
1206 // for (UShort_t iStack = 0; iStack < 5; ++iStack){
1207 // ULong64_t dwl = ((ULong64_t)0xaffe << 16) | (ULong64_t)iSector << 8 | iStack;
1208 // ULong64_t dw = (((ULong64_t)0xbead << 16) | (ULong64_t)iSector << 8 | iStack) | ((ULong64_t)dwl << 32);
1209 // if (fTrackingData->GetStackTrgWord(iSector, iStack) != dw)
1210 // LogError("stack %02d-%d trg word is 0x%016llx, should be 0x%016llx",
1211 // iSector, iStack, fTrackingData->GetStackTrgWord(iSector, iStack), dw);
1215 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1216 for (Int_t iTrk = 0; iTrk < fTrackingData->GetNumTracks(iStack); ++iTrk){
1218 layerMask = fTrackingData->GetTrackLayerMask(iStack, iTrk);
1220 trklStr = Form("trkl: ");
1221 for (Short_t iLayer = 5; iLayer >= 0; --iLayer){
1222 if ((layerMask >> iLayer) & 1)
1223 trklStr += Form("0x%08x (%+8.3f) ",
1224 fTrackingData->GetTrackTrackletWord(iStack, iTrk, iLayer),
1225 fTrackingData->GetTrackTrackletLocalY(iStack, iTrk, iLayer));
1227 trklStr += "--------------------- ";
1228 } // loop over layers
1229 trklStr.Remove(trklStr.Length() - 2, 2);
1231 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0){
1232 Double_t rpt = (fESDtracksPresent) ? fEsdEvent->GetTrack(fTrackingData->GetTrackAddInfo(iStack, iTrk))->GetSignedPt() :
1233 fHLTTracks->at(fTrackingData->GetTrackAddInfo(iStack, iTrk)).GetSignedPt();
1234 matchStr = Form("mpt: %+7.2f", rpt);
1236 matchStr = "unmatched";
1238 if (fDebugLevel >= 3){
1240 printf("###DOTDA EV%04llu GTU TRACK - S%02d-%d pt: %+7.2f pid: %3d lm: 0x%02x %s %s\n",
1242 iStack/5, iStack%5, fTrackingData->GetTrackPt(iStack, iTrk), fTrackingData->GetTrackPID(iStack, iTrk),
1243 layerMask, trklStr.Data(),
1246 printf("###DOTDB EV%04llu GTU TRACK - S%02d-%d pt: %+7.2f pid: %3d lm: 0x%02x %s\n",
1248 iStack/5, iStack%5, fTrackingData->GetTrackPt(iStack, iTrk), fTrackingData->GetTrackPID(iStack, iTrk),
1249 layerMask, trklStr.Data());
1254 for (Short_t iLayer = 5; iLayer >= 0; --iLayer){
1255 if (((layerMask >> iLayer) & 1) && (fTrackingData->GetTrackTrackletWord(iStack, iTrk, iLayer) == 0x10001000))
1256 LogError("invalid layer mask / tracklet value combination A");
1258 if ((((layerMask >> iLayer) & 1) == 0) && (fTrackingData->GetTrackTrackletWord(iStack, iTrk, iLayer) != 0x10001000))
1259 LogError("invalid layer mask / tracklet value combination B");
1262 } // loop over tracks in stack
1263 } // loop over stacks
1267 void AliHLTTRDTriggerComponent::AssignTrackInfo(TString* infoStr, const UInt_t stack, const UInt_t trackIndex, const char* flagStr) {
1269 TString flags(flagStr);
1270 Bool_t appendRefData = kFALSE;
1272 if (fTrackingData->GetTrackAddInfo(stack, trackIndex) >= 0){
1273 appendRefData = kTRUE;
1274 if (flags.First('M') < 0)
1278 *infoStr = Form("EXCH-TRK-INFO DS<%s> CH<%s> EV%05llu SEC%02d-%d-%d gpt: %+6.1f gpid: %3d flags: %s",
1280 fChunkId->Data(), fEventId,
1281 stack/5, stack%5, trackIndex,
1282 fTrackingData->GetTrackPt(stack, trackIndex),
1283 fTrackingData->GetTrackPID(stack, trackIndex), flags.Data());
1286 Double_t rpt = (fESDtracksPresent) ? fEsdEvent->GetTrack(fTrackingData->GetTrackAddInfo(stack, trackIndex))->GetSignedPt() :
1287 fHLTTracks->at(fTrackingData->GetTrackAddInfo(stack, trackIndex)).GetSignedPt();
1288 *infoStr += Form(" rpt: %+6.1f", rpt);
1293 #ifdef __TRDHLTDEBUG
1294 void AliHLTTRDTriggerComponent::RenderEvent(const Bool_t showGtuTracks, const Bool_t showTracklets, const Bool_t showRefTracks) {
1296 if ((!fEventDisplay) || (!fEsdEvent))
1299 LogDebug("rendering event");
1301 const Float_t refTrackPtDisplayThreshold = 0.7;
1302 const Float_t trackPtEmphasizeThreshold = 1.8;
1304 fEventDisplay->Reset();
1305 fEventDisplay->SetMagField(fEsdEvent->GetMagneticField());
1306 for (UInt_t iDet = 0; iDet < fkTRDStacks*fkTRDLayers; ++iDet)
1307 fEventDisplay->SetChamberState(iDet/fkTRDLayers, iDet%6, ((fSectorsWithData >> (iDet/30)) & 1) );
1310 for (UShort_t iDet = 0; iDet < fkTRDStacks*fkTRDLayers; ++iDet){
1311 UInt_t numTrkl = fTrackingData->GetNumTracklets(iDet);
1312 for (UInt_t iTrkl = 0; iTrkl < numTrkl; ++iTrkl){
1313 fEventDisplay->AddTracklet(fTrackingData->GetTracklet(iDet, iTrkl));
1319 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1320 for (Int_t iTrk = 0; iTrk < fTrackingData->GetNumTracks(iStack); ++iTrk){
1321 AliESDTrdTrack* track = fTrackingData->GetTrack(iStack, iTrk);
1322 Int_t trkIndex = fEventDisplay->AddTrack(track, (TMath::Abs(track->Pt()) >= trackPtEmphasizeThreshold) ? (kMagenta + 2) : kMagenta, 1, 1);
1323 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0)
1324 fEventDisplay->SetTrackTrackletStyle(trkIndex, kRed, 12);
1326 fEventDisplay->SetTrackTrackletStyle(trkIndex, kViolet - 5, 12);
1331 unsigned int numRefTracks = fEsdEvent->GetNumberOfTracks();
1332 unsigned int numRefTracksRendered = 0;
1334 // check for some marks for rendering
1335 UShort_t marks[40000];
1336 memset(marks, 0, sizeof(UShort_t)*40000);
1337 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1338 for (Int_t iTrk = 0; iTrk < fTrackingData->GetNumTracks(iStack); ++iTrk){
1339 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0){
1340 marks[fTrackingData->GetTrackAddInfo(iStack, iTrk)] |= 1;
1342 (fTrackingData->GetTrackPID(iStack, iTrk) >= fElectronTriggerPIDThresholdHQU) &&
1343 (TMath::Abs(fTrackingData->GetTrackPt(iStack, iTrk)) >= fElectronTriggerPtThresholdHQU))
1344 marks[fTrackingData->GetTrackAddInfo(iStack, iTrk)] |= 2;
1350 for (unsigned int iTrack = 0; iTrack < numRefTracks; ++iTrack){
1351 AliESDtrack* track = fEsdEvent->GetTrack(iTrack);
1352 if ((track->Pt() >= refTrackPtDisplayThreshold) || (marks[iTrack] != 0)){
1353 Color_t color = (track->Pt() >= trackPtEmphasizeThreshold) ? (kGray + 2) : kGray;
1356 if (marks[iTrack] & 0x2){
1360 if (!CheckRefTrackCuts(track))
1363 fEventDisplay->AddTrack(track, color, width, style);
1364 numRefTracksRendered++;
1369 if (!fEventDisplay->IsEmpty()){
1370 fEventDisplay->SetTitle("");
1371 fEventDisplay->SetSetupText("HLT", Form("%.1f#scale[0.5]{ }/#scale[0.5]{ }%.1f",
1372 refTrackPtDisplayThreshold, trackPtEmphasizeThreshold));
1373 fEventDisplay->SetBottomText(Form("%05i-%s-%05llu",
1374 fRunNumber, fChunkId->Data(), fEventId));
1375 fEventDisplay->SetBottomTextRight(Form("%d (%d) HLT tracks, %d tracklets, %d GTU tracks",
1377 numRefTracksRendered,
1378 fTrackingData->GetNumTracklets(),
1379 fTrackingData->GetNumTracks()));
1380 fEventDisplay->SetLook(AliTRDtrackingEventDisplay::dmMediumLight);
1381 fEventDisplay->SetDisplayMode(AliTRDtrackingEventDisplay::dmFullXY);
1382 fEventDisplay->SaveToFile(Form("display/event-%s-%05llu.eps",
1383 fChunkId->Data(), fEventId));
1389 Bool_t AliHLTTRDTriggerComponent::TRDElectronTrigger(const char *ident, const Double_t minPt, const UShort_t minPID){
1391 LogDebug("Electron trigger processing (%s: pt>=%.1f, pid>=%d)...", ident, minPt, minPID);
1394 Bool_t highPtElectronSeenGTU = kFALSE;
1395 Bool_t highPtElectronSeen = kFALSE;
1396 UInt_t truncMeanPID = 0;
1397 TString trackExchangeInfo("");
1400 UInt_t trdSectorTrgContribs = 0;
1401 for (UShort_t iSector = 0; iSector < fkTRDSectors; ++iSector)
1402 trdSectorTrgContribs |= fTrackingData->GetSectorTrgContribs(iSector);
1403 if ((trdSectorTrgContribs >> 5) & 0x3)
1404 fIsTRDElectronEvent = kTRUE;
1406 fIsTRDElectronEvent = kFALSE;
1408 if (fIsMinBiasEvent)
1409 fHistElectronTriggerBaseMinBias->Fill(0.);
1411 if (fIsTRDElectronEvent)
1412 fHistElectronTriggerBaseTrdL1->Fill(0.);
1414 if ((fElectronTriggerOnL1TrgOnly) && (!fIsTRDElectronEvent)){
1415 // evaluate trigger for events with TRD L1 electron trigger fired
1416 DbgLog("skipping %s electron trigger evaluation for event, because no TRD trigger flag set (ctbs: 0x%02x)",
1417 ident, trdSectorTrgContribs);
1421 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1422 numTracks = fTrackingData->GetNumTracks(iStack);
1423 for (UInt_t iTrk = 0; iTrk < numTracks; ++iTrk){
1424 Double_t gpt = fTrackingData->GetTrackPt(iStack, iTrk);
1425 Bool_t trdElectronCandidate = kFALSE;
1426 Bool_t hltElectronCandidate = kFALSE;
1428 // re-evaluate GTU only decision for comparison
1430 (TMath::Abs(gpt) >= minPt) &&
1431 (fTrackingData->GetTrackPID(iStack, iTrk) >= minPID)
1433 trdElectronCandidate = kTRUE;
1434 highPtElectronSeenGTU = kTRUE;
1435 fHistElectronCandidatePt->Fill(gpt);
1436 fHistElectronCandidatePid->Fill(fTrackingData->GetTrackPID(iStack, iTrk));
1438 if (fExtendedHistos){
1440 // idea to be checked
1442 Short_t minLyr = -1;
1443 UShort_t minValue = 255;
1444 Short_t maxLyr = -1;
1445 UShort_t maxValue = 0;
1446 UShort_t lyrCount = 0;
1447 UInt_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iTrk);
1449 // scan for min & max values
1450 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
1451 if ((layerMask >> iLayer) & 1){
1452 if (fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer) < minValue){
1453 minValue = fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer);
1456 if (fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer) > maxValue){
1457 maxValue = fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer);
1461 } // loop over layers
1463 // calculate trunc mean
1464 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
1465 if (((layerMask >> iLayer) & 1) && (iLayer != minLyr) && (iLayer != maxLyr)){
1466 truncMeanPID += fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer);
1469 } // loop over layers
1470 truncMeanPID = TMath::Nint((Double_t)(truncMeanPID)/(Double_t)(lyrCount));
1472 fHistPIDvsTruncPID->Fill(fTrackingData->GetTrackPID(iStack, iTrk), truncMeanPID);
1473 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) < 0)
1474 fHistElectronFalsePIDvsTruncPID->Fill(fTrackingData->GetTrackPID(iStack, iTrk), truncMeanPID);
1478 LogInspect("#hlt-trd-trg - GTU flagged %s %s high-pt electron seen in S%02d-%d: pt: %+6.1f pid: %d [id: S%02d-%d-%d] [trunc-pid: %d]",
1479 (fTrackingData->GetTrackAddInfo(iStack, iTrk) < 0) ? "unmatched" : "matched", ident,
1481 gpt, fTrackingData->GetTrackPID(iStack, iTrk),
1482 iStack/5, iStack%5, iTrk,
1486 // evaluate HLT-level trigger decision using match information
1488 (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0) &&
1489 (TMath::Abs(gpt) >= minPt) &&
1490 (fTrackingData->GetTrackPID(iStack, iTrk) >= minPID)
1492 hltElectronCandidate = kTRUE;
1493 highPtElectronSeen = kTRUE;
1495 fHistElectronCandidateMatchedPt->Fill(gpt);
1496 fHistElectronCandidateMatchedPid->Fill(fTrackingData->GetTrackPID(iStack, iTrk));
1498 if (fExtendedHistos){
1499 fHistElectronConfirmedPIDvsTruncPID->Fill(fTrackingData->GetTrackPID(iStack, iTrk), truncMeanPID);
1502 Double_t rpt = (fESDtracksPresent) ? fEsdEvent->GetTrack(fTrackingData->GetTrackAddInfo(iStack, iTrk))->GetSignedPt() :
1503 fHLTTracks->at(fTrackingData->GetTrackAddInfo(iStack, iTrk)).GetSignedPt();
1504 LogInspect("#hlt-trd-trg - HLT matched %s high-pt electron seen in S%02d-%d: gpt: %+6.1f gpid: %d rpt: %+6.1f [id: S%02d-%d-%d]",
1505 ident, iStack/5, iStack%5, fTrackingData->GetTrackPt(iStack, iTrk), fTrackingData->GetTrackPID(iStack, iTrk),
1506 rpt, iStack/5, iStack%5, iTrk);
1509 // log output for subsequent offline analysis
1510 if ((fDebugLevel >= 3) && (trdElectronCandidate || hltElectronCandidate)){
1511 trackExchangeInfo = "";
1513 if (trdElectronCandidate)
1515 if (hltElectronCandidate)
1517 AssignTrackInfo(&trackExchangeInfo, iStack, iTrk, flags.Data());
1518 LogDebug("%s\n", trackExchangeInfo.Data());
1521 } // loop over tracks in stack
1522 } // loop over stacks
1524 if (highPtElectronSeenGTU || highPtElectronSeen){
1525 LogInspect("#hlt-trd-trg - event triggered by %s electron trigger (TRD L1: %d, TRD HLT: %d)",
1526 ident, highPtElectronSeenGTU, highPtElectronSeen);
1529 if (highPtElectronSeenGTU){
1530 if (fIsMinBiasEvent)
1531 fHistElectronTriggerBaseMinBias->Fill(1.);
1534 if (highPtElectronSeen){
1535 if (fIsMinBiasEvent)
1536 fHistElectronTriggerBaseMinBias->Fill(2.);
1537 if (fIsTRDElectronEvent)
1538 fHistElectronTriggerBaseTrdL1->Fill(1.);
1541 return (highPtElectronSeen) ? kTRUE : kFALSE;
1545 int AliHLTTRDTriggerComponent::DoTrigger()
1551 UShort_t firedTriggers = 0;
1553 const AliHLTComponentEventData* hltEventData = GetEventData();
1554 fEventId = hltEventData->fEventID;
1555 LogDebug("### START DoTrigger [event id: %llu, %d blocks, size: %d]",
1556 fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1558 // LogDebug("### START DoTrigger [event id: %llu, %d blocks, size: %d]",
1559 // fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1561 if (!IsDataEvent()) { // process data events only
1563 LogDebug("### END DoTrigger [event id: %llu, %d blocks, size: %d] (skipped: no data event)",
1564 fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1568 fTrackingData->SetLogPrefix(Form("TRDHLTGM XXXXXX-%05llu: [TRG] {TrkDat} ", fEventId));
1572 // access to TRD specific data from AliHLTTRDPreprocessorComponent
1573 if (!PrepareTRDData()){
1574 LogError("access to TRD data failed. Skipping event...");
1578 if (fTrackingData->GetNumTracks() + fTrackingData->GetNumTracklets() == 0) {
1579 LogDebug("no trigger-relevant TRD information, skipping further event processing");
1583 // access to ESD data
1584 if (!PrepareESDData()){
1585 LogInfo("access to ESD event data failed.");
1588 // access to alternative HLT data
1589 if (!fESDtracksPresent){
1590 if (!PrepareHLTData()){
1591 LogError("access to HLT event data failed.");
1595 // match TRD and HLT tracks
1596 if (fESDtracksPresent){
1597 if (!MatchTRDTracksESD()){
1598 LogError("matching TRD tracks to ESD tracks failed. Skipping event...");
1601 } else if (fHLTtracksPresent){
1602 if (!MatchTRDTracksHLT()){
1603 LogError("matching TRD tracks to HLT tracks failed. Skipping event...");
1607 LogError("No HLT track information available. Skipping event...");
1611 // if (!MatchTRDTracks()){
1612 // LogError("matching TRD tracks to TPC tracks failed. Skipping event...");
1616 if (fDebugLevel >= 1)
1619 // evaluate electron trigger conditions
1620 if (TRDElectronTrigger("HSE", fElectronTriggerPtThresholdHSE, fElectronTriggerPIDThresholdHSE))
1621 firedTriggers |= fkElectronTriggerHSE;
1623 if (TRDElectronTrigger("HQU", fElectronTriggerPtThresholdHQU, fElectronTriggerPIDThresholdHQU))
1624 firedTriggers |= fkElectronTriggerHQU;
1632 TString description("");
1633 if (firedTriggers & fkElectronTriggerHSE){
1634 if (description.Length() > 0)
1636 description += fgkTriggerDecisionElectronHSE;
1639 if (firedTriggers & fkElectronTriggerHQU){
1640 if (description.Length() > 0)
1642 description += fgkTriggerDecisionElectronHQU;
1645 SetDescription(description.Data());
1646 AliHLTTriggerDecision decision((firedTriggers) ? kTRUE : kFALSE,
1651 TriggerEvent(&decision, kAliHLTDataTypeTObject | kAliHLTDataOriginOut);
1654 LogInspect("TRD HLT trigger fired for event: description: >%s<, flags: 0x%04x",
1655 description.Data(), firedTriggers);
1656 #ifdef __TRDHLTDEBUG
1657 if (fEventRendering)
1661 LogDebug("TRD HLT trigger did not fire for event");
1665 PushBack(fHistArray, (kAliHLTDataTypeTObjArray | kAliHLTDataOriginTRD), 0x3fffff);
1668 LogDebug("### END DoTrigger [event id: %llu, %d blocks, size: %d]",
1669 fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1674 Bool_t AliHLTTRDTriggerComponent::TrackPlaneIntersect(AliExternalTrackParam *trk, Double_t pnt[3], Double_t norm[3], Double_t mag){
1678 Double_t dist = 99999, dist_prev = 99999;
1679 Double_t x[3] = {0., 0., 0.};
1682 dist = (x[0] - pnt[0]) * norm[0] + (x[1] - pnt[1]) *norm[1] + (x[2] - pnt[2]) * norm[2];
1684 while(TMath::Abs(dist) > 0.1) {
1686 trk->GetXYZAt(r, mag, x);
1688 if ((x[0] * x[0] + x[1] * x[1]) < 100.) { // extrapolation to radius failed
1693 //distance between current track position and plane
1694 dist_prev = TMath::Abs(dist);
1695 dist = (x[0] - pnt[0]) * norm[0] + (x[1] - pnt[1]) * norm[1];
1698 if(TMath::Abs(dist) >= dist_prev ||
1699 (r > 380.) || (r < 100.)){
1705 for (Int_t i=0; i<3; i++){
1716 Double_t AliHLTTRDTriggerComponent::RateTrackMatch(Double_t distY, Double_t distZ, Double_t rpt, Double_t gpt){
1718 // maximum limits for spatial distance
1719 if ((distY > 5.) || (distZ > 20.))
1722 // same pt sign required
1723 if ((rpt * gpt) < 0.)
1726 Double_t rating_distY = -0.1 * distY + 1.;
1727 Double_t rating_distZ = -0.025 * distZ + 1.;
1728 Double_t rating_ptDiff = 1. - TMath::Abs((TMath::Abs(rpt) > 0.000001) ? ((gpt-rpt)/rpt) : 0.);
1730 if (rating_ptDiff < 0.)
1731 rating_ptDiff = 0.2;
1733 Double_t total = rating_distY * rating_distZ * rating_ptDiff;
1735 // DbgLog("", Form("#matching: rating: dy: %.3f dz: %.3f dpt: %.3f -> total: %.3f",
1736 // rating_distY, rating_distZ, rating_ptDiff, total));
1739 LogError("track match rating exceeds limit of 1.0: %.3f", total);
1744 Int_t AliHLTTRDTriggerComponent::EstimateTrackDistance(AliESDtrack *esd_track,
1745 const UShort_t stack,
1746 const UShort_t layerMask,
1747 const Float_t trklLocalY[6], const Int_t trklBinZ[6],
1748 Double_t mag, Double_t *ydist, Double_t *zdist){
1752 AliExternalTrackParam* refParam = NULL;
1753 if (esd_track->GetOuterParam())
1754 refParam = new AliExternalTrackParam(*(esd_track->GetOuterParam()));
1756 refParam = new AliExternalTrackParam(*(esd_track));
1758 Int_t res = EstimateTrackDistance(refParam, stack, layerMask, trklLocalY, trklBinZ, mag, ydist, zdist);
1767 Int_t AliHLTTRDTriggerComponent::EstimateTrackDistance(AliExternalTrackParam *refParam,
1768 const UShort_t stack,
1769 const UShort_t layerMask,
1770 const Float_t trklLocalY[6], const Int_t trklBinZ[6],
1771 Double_t mag, Double_t *ydist, Double_t *zdist){
1781 // UInt_t stack_gtu;
1782 UShort_t stackInSector;
1784 AliTRDpadPlane* padPlane;
1786 for (UShort_t iLayer = 0; iLayer < 6; iLayer++){
1787 if ((layerMask >> iLayer) & 1){
1788 trklDet = stack*6 + iLayer;
1790 // stack_gtu = stack;
1791 stackInSector = stack % 5;
1793 // local coordinates of the outer end point of the tracklet
1794 xtrkl[0] = AliTRDgeometry::AnodePos();
1795 xtrkl[1] = trklLocalY[iLayer];
1797 padPlane = fTRDGeometry->GetPadPlane(trklLayer, stackInSector);
1798 if(stackInSector == 2){ // corrected version by Felix Muecke
1799 xtrkl[2] = padPlane->GetRowPos(trklBinZ[iLayer]) - (padPlane->GetRowSize(trklBinZ[iLayer]))/2. - padPlane->GetRowPos(6);
1801 xtrkl[2] = padPlane->GetRowPos(trklBinZ[iLayer]) - (padPlane->GetRowSize(trklBinZ[iLayer]))/2. - padPlane->GetRowPos(8);
1804 // transform to global coordinates
1805 TGeoHMatrix *matrix = fTRDGeometry->GetClusterMatrix(trklDet);
1807 LogError("invalid TRD cluster matrix in EstimateTrackDistance for detector %i", trklDet);
1810 matrix->LocalToMaster(xtrkl, ptrkl);
1811 fTRDGeometry->RotateBack((stack/5) * 30, ptrkl, ptrkl2); // ptrkl2 now contains the global position of the outer end point of the tracklet
1813 // calculate parameterization of plane representing the tracklets layer
1814 Double_t layer_zero_local[3] = {0., 0., 0.};
1815 Double_t layer_zero_global[3], layer_zero_global2[3];
1817 matrix->LocalToMaster(layer_zero_local, layer_zero_global);
1818 fTRDGeometry->RotateBack(trklDet, layer_zero_global, layer_zero_global2); // layer_zero_global2 points to chamber origin in global coords
1820 Double_t layer_ref_local[3] = {AliTRDgeometry::AnodePos(), 0., 0.};
1821 Double_t layer_ref_global[3], layer_ref_global2[3];
1823 matrix->LocalToMaster(layer_ref_local, layer_ref_global);
1824 fTRDGeometry->RotateBack(trklDet, layer_ref_global, layer_ref_global2); // layer_ref_global2 points to center anode pos within plane in global coords
1826 Double_t n0[3] = {layer_ref_global2[0]-layer_zero_global2[0],
1827 layer_ref_global2[1]-layer_zero_global2[1],
1828 layer_ref_global2[2]-layer_zero_global2[2]};
1830 Double_t n_len = TMath::Sqrt(n0[0]*n0[0] + n0[1]*n0[1] + n0[2]*n0[2]);
1831 if (n_len == 0.){ // This should never happen
1832 //printf("<ERROR> divison by zero in estimate_track_distance!");
1835 Double_t n[3] = {n0[0]/n_len, n0[1]/n_len, n0[2]/n_len}; // normal vector of plane
1837 Bool_t isects = TrackPlaneIntersect(refParam, layer_ref_global2, n, mag); // find intersection point between track and TRD layer
1839 if (isects == kFALSE){ // extrapolation fails, because track never reaches the TRD radius
1843 Double_t m[2] = {ptrkl2[0] - layer_ref_global2[0], ptrkl2[1] - layer_ref_global2[1]};
1844 Double_t len_m = TMath::Sqrt(m[0]*m[0] + m[1]*m[1]);
1846 diff_z += TMath::Abs(ptrkl2[2] - layer_ref_global2[2]);
1852 *ydist = diff_y / nLayers;
1853 *zdist = diff_z / nLayers;
1856 LogError("invalid number of contributing layers (%d) in EstimateTrackDistance()", nLayers);