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.");
939 } // loop over HLT tracks;
941 // search for matching HLT track for each GTU track
942 for (UInt_t iGtuTrack = 0; iGtuTrack < numGtuTracks; ++iGtuTrack) {
943 bestMatchRating = 0.;
944 bestMatchRefIndex = -1;
945 Double_t gpt = fTrackingData->GetTrackPt(iStack, iGtuTrack);
946 UShort_t gpid = fTrackingData->GetTrackPID(iStack, iGtuTrack);
947 UShort_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iGtuTrack);
949 Float_t trklLocalY[fkTRDLayers];
950 Int_t trklBinZ[fkTRDLayers];
951 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
952 if ((layerMask >> iLayer) & 1){
953 trklLocalY[iLayer] = fTrackingData->GetTrackTrackletLocalY(iStack, iGtuTrack, iLayer);
954 trklBinZ[iLayer] = fTrackingData->GetTrackTrackletBinZ(iStack, iGtuTrack, iLayer);
959 for (vector<AliHLTGlobalBarrelTrack>::iterator element = fHLTTracks->begin();
960 element != fHLTTracks->end(); element++) {
961 if (!hltTrackPreSel[iHltTrack]){
966 // compare GTU track and relevant HLT track
967 numComparisonsDone++;
969 AliHLTGlobalBarrelTrack hltPar(*element);
970 Int_t distRes = EstimateTrackDistance(&hltPar, iStack, layerMask, trklLocalY, trklBinZ,
971 magField, &distY, &distZ);
973 if (fDebugLevel >= 3){
974 printf("CHECKMATCH = %i distY %.2f distZ %.2f pt: %.2f %.2f\n",
975 distRes, distY, distZ, gpt, element->GetSignedPt());
979 matchRating = RateTrackMatch(distY, distZ, gpt, element->GetSignedPt());
984 if ((matchRating >= fMatchRatingThreshold) && (matchRating > bestMatchRating)) {
985 bestMatchRefIndex = iHltTrack;
986 bestMatchRating = matchRating;
987 } else if (matchRating > bestMatchRating)
988 bestMatchRating = matchRating;
992 } // loop over HLT tracks;
994 fHistMatchRating->Fill(bestMatchRating);
995 fHistMatchRatingByPt->Fill(bestMatchRating, TMath::Abs(gpt));
996 fHistMatchRatingByPid->Fill(bestMatchRating, gpid);
997 fHistTrackPt->Fill(gpt);
998 fHistTrackPid->Fill(gpid);
1000 if (bestMatchRefIndex >= 0){
1001 // GTU track has matching reference track
1002 Double_t rpt = fHLTTracks->at(bestMatchRefIndex).GetSignedPt();
1003 LogDebug("#match - match found: rating %.2f, gpt: %+5.2f, rpt: %+5.2f (%i) -> diff: %.2f%%",
1004 bestMatchRating,gpt, rpt, bestMatchRefIndex, (gpt - rpt)/rpt*100.);
1005 fTrackingData->SetTrackAddInfo(iStack, iGtuTrack, bestMatchRefIndex);
1007 // if (fExtendedHistos){
1008 // fHistMatchedRefTrackPid->Fill(element->Pt(), element->GetTPCsignal());
1011 // if (fDebugLevel >= 3){
1012 // LogDebug("#match-info rating: %.2f gpt: %+.2f matchref: %d rpt: %+.2f gpid: %d S%02d-%d %d rpid: %.3f",
1013 // bestMatchRating, gpt, bestMatchRefIndex, rpt, gpid,
1014 // iStack/5, iStack%5, iGtuTrack, refTrack->GetTPCsignal());
1018 fHistTrackPtMatched->Fill(gpt);
1019 fHistTrackPtCorr->Fill(rpt, gpt);
1020 fHistTrackPidMatched->Fill(gpid);
1023 if (fDebugLevel >= 3){
1024 LogDebug("#match-info rating: %.2f gpt: %+.2f no ref matching gpid: %d S%02d-%d %d",
1025 bestMatchRating, gpt, gpid,
1026 iStack/5, iStack%5, iGtuTrack);
1028 numUnmatchedTracks++;
1031 } // loop over gtu tracks
1032 } // loop over stacks
1034 LogInfo("#match - %d matched GTU tracks, %d unmatched (%d comparisons)",
1035 numMatchedTracks, numUnmatchedTracks, numComparisonsDone);
1037 fHistTrackMatchingCombinations->Fill(0., (Double_t)(numHLTTracks * fTrackingData->GetNumTracks())); // index 0: full combinatorics
1038 fHistTrackMatchingCombinations->Fill(1., numComparisonsDone); // index 1: track matching comparisons actually done
1043 int AliHLTTRDTriggerComponent::MatchTRDTracks(){
1046 LogError("ESD event data not available in MatchTRDTracks().");
1050 if (fHistoMode == 0){
1051 UInt_t numHists = fHistArray->GetEntries();
1052 for (UInt_t iHist = 0; iHist < numHists; ++iHist)
1053 if (fHistArray->At(iHist))
1054 ((TH1*) (fHistArray->At(iHist)))->Reset();
1058 unsigned int numRefTracks = fEsdEvent->GetNumberOfTracks();
1059 unsigned int numGtuTracks;
1060 Int_t refTrackIndices[fkMaxRefTracksPerStack];
1061 UInt_t refTrackCount = 0;
1063 Double_t distY, distZ;
1064 Double_t matchRating;
1065 Double_t bestMatchRating;
1066 Int_t bestMatchRefIndex;
1067 AliESDtrack* refTrack;
1068 UInt_t numComparisonsDone = 0;
1069 UInt_t numUnmatchedTracks = 0;
1070 UInt_t numMatchedTracks = 0;
1072 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack) {
1073 numGtuTracks = fTrackingData->GetNumTracks(iStack);
1076 // preselect ESD relevant ESD tracks
1077 for (UInt_t iRefTrack = 0; iRefTrack < numRefTracks; ++iRefTrack) {
1078 refTrack = fEsdEvent->GetTrack(iRefTrack);
1079 isRelevant = (refTrack->Pt() >= fRefTrackSelectionPtThreshold);
1081 if (refTrackCount < fkMaxRefTracksPerStack)
1082 refTrackIndices[refTrackCount++] = iRefTrack;
1084 LogError("number of HLT tracks exceeding limit of %d. Skipping some tracks.", fkMaxRefTracksPerStack);
1090 // try to match GTU track with ref tracks
1091 for (UInt_t iGtuTrack = 0; iGtuTrack < numGtuTracks; ++iGtuTrack) {
1092 bestMatchRating = 0.;
1093 bestMatchRefIndex = -1;
1094 Double_t gpt = fTrackingData->GetTrackPt(iStack, iGtuTrack);
1095 UShort_t gpid = fTrackingData->GetTrackPID(iStack, iGtuTrack);
1096 UShort_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iGtuTrack);
1098 for (UInt_t iRefTrack = 0; iRefTrack < refTrackCount; ++iRefTrack) {
1099 refTrack = fEsdEvent->GetTrack(refTrackIndices[iRefTrack]);
1101 if (!CheckRefTrackCuts(refTrack))
1104 numComparisonsDone++;
1106 // if ((!refTrack->GetOuterParam()) && (!refTrack->GetInnerParam())) // use tracks with TPC outer param only (all HLT tracks have it anyways)
1109 Float_t trklLocalY[fkTRDLayers];
1110 Int_t trklBinZ[fkTRDLayers];
1111 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
1112 if ((layerMask >> iLayer) & 1){
1113 trklLocalY[iLayer] = fTrackingData->GetTrackTrackletLocalY(iStack, iGtuTrack, iLayer);
1114 trklBinZ[iLayer] = fTrackingData->GetTrackTrackletBinZ(iStack, iGtuTrack, iLayer);
1118 Int_t distRes = EstimateTrackDistance(refTrack, iStack, layerMask, trklLocalY, trklBinZ,
1119 fEsdEvent->GetMagneticField(), &distY, &distZ);
1122 matchRating = RateTrackMatch(distY, distZ, gpt, refTrack->GetSignedPt());
1127 if ((matchRating >= fMatchRatingThreshold) && (matchRating > bestMatchRating)) {
1128 bestMatchRefIndex = refTrackIndices[iRefTrack];
1129 bestMatchRating = matchRating;
1130 } else if (matchRating > bestMatchRating)
1131 bestMatchRating = matchRating;
1133 // 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",
1134 // iGtuTrack, iStack/5, iStack%5, refTrackIndices[iRefTrack],
1135 // fTrackingData->GetTrackPt(iStack, iGtuTrack), refTrack->GetSignedPt(),
1136 // distY, distZ, matchRating));
1138 } // loop over ref tracks in stack
1140 fHistMatchRating->Fill(bestMatchRating);
1141 fHistMatchRatingByPt->Fill(bestMatchRating, TMath::Abs(gpt));
1142 fHistMatchRatingByPid->Fill(bestMatchRating, gpid);
1143 fHistTrackPt->Fill(gpt);
1144 fHistTrackPid->Fill(gpid);
1146 if (bestMatchRefIndex >= 0){
1147 // GTU track has matching reference track
1148 refTrack = fEsdEvent->GetTrack(bestMatchRefIndex);
1149 Double_t rpt = refTrack->GetSignedPt();
1150 LogDebug("#match - match found: rating %.2f, gpt: %+5.2f, rpt: %+5.2f (%i) -> diff: %.2f%%",
1151 bestMatchRating,gpt, rpt, bestMatchRefIndex, (gpt - rpt)/rpt*100.);
1152 fTrackingData->SetTrackAddInfo(iStack, iGtuTrack, bestMatchRefIndex);
1154 if (fExtendedHistos){
1155 fHistMatchedRefTrackPid->Fill(refTrack->Pt(), refTrack->GetTPCsignal());
1158 if (fDebugLevel >= 3){
1159 LogDebug("#match-info rating: %.2f gpt: %+.2f matchref: %d rpt: %+.2f gpid: %d S%02d-%d %d rpid: %.3f",
1160 bestMatchRating, gpt, bestMatchRefIndex, rpt, gpid,
1161 iStack/5, iStack%5, iGtuTrack, refTrack->GetTPCsignal());
1165 fHistTrackPtMatched->Fill(gpt);
1166 fHistTrackPtCorr->Fill(rpt, gpt);
1167 fHistTrackPidMatched->Fill(gpid);
1170 if (fDebugLevel >= 3){
1171 LogDebug("#match-info rating: %.2f gpt: %+.2f no ref matching gpid: %d S%02d-%d %d",
1172 bestMatchRating, gpt, gpid,
1173 iStack/5, iStack%5, iGtuTrack);
1175 numUnmatchedTracks++;
1178 } // loop over gtu tracks in stack
1180 } // loop over stacks
1182 LogInfo("#match - %d matched GTU tracks, %d unmatched",
1183 numMatchedTracks, numUnmatchedTracks);
1185 fHistTrackMatchingCombinations->Fill(0., (Double_t)(numRefTracks * fTrackingData->GetNumTracks())); // index 0: full combinatorics
1186 fHistTrackMatchingCombinations->Fill(1., numComparisonsDone); // index 1: track matching comparisons actually done
1191 void AliHLTTRDTriggerComponent::DumpTrackingData(){
1193 if (fTrackingData->GetNumTracklets() + fTrackingData->GetNumTracks() == 0)
1196 TString trklStr("");
1197 TString matchStr("");
1200 // for (UShort_t iSector = 0; iSector < 18; ++iSector){
1201 // if (fTrackingData->GetSectorTrgWord(iSector) != ((UInt_t)0x2345352 ^ ((UInt_t)iSector + 34)))
1202 // LogError("invalid sector trigger word in sector %02d: trg word is 0x%08x, should be 0x%08x",
1203 // iSector, fTrackingData->GetSectorTrgWord(iSector), ((UInt_t)0x2345352 ^ ((UInt_t)iSector + 34)));
1204 // for (UShort_t iStack = 0; iStack < 5; ++iStack){
1205 // ULong64_t dwl = ((ULong64_t)0xaffe << 16) | (ULong64_t)iSector << 8 | iStack;
1206 // ULong64_t dw = (((ULong64_t)0xbead << 16) | (ULong64_t)iSector << 8 | iStack) | ((ULong64_t)dwl << 32);
1207 // if (fTrackingData->GetStackTrgWord(iSector, iStack) != dw)
1208 // LogError("stack %02d-%d trg word is 0x%016llx, should be 0x%016llx",
1209 // iSector, iStack, fTrackingData->GetStackTrgWord(iSector, iStack), dw);
1213 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1214 for (Int_t iTrk = 0; iTrk < fTrackingData->GetNumTracks(iStack); ++iTrk){
1216 layerMask = fTrackingData->GetTrackLayerMask(iStack, iTrk);
1218 trklStr = Form("trkl: ");
1219 for (Short_t iLayer = 5; iLayer >= 0; --iLayer){
1220 if ((layerMask >> iLayer) & 1)
1221 trklStr += Form("0x%08x (%+8.3f) ",
1222 fTrackingData->GetTrackTrackletWord(iStack, iTrk, iLayer),
1223 fTrackingData->GetTrackTrackletLocalY(iStack, iTrk, iLayer));
1225 trklStr += "--------------------- ";
1226 } // loop over layers
1227 trklStr.Remove(trklStr.Length() - 2, 2);
1229 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0){
1230 Double_t rpt = (fESDtracksPresent) ? fEsdEvent->GetTrack(fTrackingData->GetTrackAddInfo(iStack, iTrk))->GetSignedPt() :
1231 fHLTTracks->at(fTrackingData->GetTrackAddInfo(iStack, iTrk)).GetSignedPt();
1232 matchStr = Form("mpt: %+7.2f", rpt);
1234 matchStr = "unmatched";
1236 if (fDebugLevel >= 3){
1238 printf("###DOTDA EV%04llu GTU TRACK - S%02d-%d pt: %+7.2f pid: %3d lm: 0x%02x %s %s\n",
1240 iStack/5, iStack%5, fTrackingData->GetTrackPt(iStack, iTrk), fTrackingData->GetTrackPID(iStack, iTrk),
1241 layerMask, trklStr.Data(),
1244 printf("###DOTDB EV%04llu GTU TRACK - S%02d-%d pt: %+7.2f pid: %3d lm: 0x%02x %s\n",
1246 iStack/5, iStack%5, fTrackingData->GetTrackPt(iStack, iTrk), fTrackingData->GetTrackPID(iStack, iTrk),
1247 layerMask, trklStr.Data());
1252 for (Short_t iLayer = 5; iLayer >= 0; --iLayer){
1253 if (((layerMask >> iLayer) & 1) && (fTrackingData->GetTrackTrackletWord(iStack, iTrk, iLayer) == 0x10001000))
1254 LogError("invalid layer mask / tracklet value combination A");
1256 if ((((layerMask >> iLayer) & 1) == 0) && (fTrackingData->GetTrackTrackletWord(iStack, iTrk, iLayer) != 0x10001000))
1257 LogError("invalid layer mask / tracklet value combination B");
1260 } // loop over tracks in stack
1261 } // loop over stacks
1265 void AliHLTTRDTriggerComponent::AssignTrackInfo(TString* infoStr, const UInt_t stack, const UInt_t trackIndex, const char* flagStr) {
1267 TString flags(flagStr);
1268 Bool_t appendRefData = kFALSE;
1270 if (fTrackingData->GetTrackAddInfo(stack, trackIndex) >= 0){
1271 appendRefData = kTRUE;
1272 if (flags.First('M') < 0)
1276 *infoStr = Form("EXCH-TRK-INFO DS<%s> CH<%s> EV%05llu SEC%02d-%d-%d gpt: %+6.1f gpid: %3d flags: %s",
1278 fChunkId->Data(), fEventId,
1279 stack/5, stack%5, trackIndex,
1280 fTrackingData->GetTrackPt(stack, trackIndex),
1281 fTrackingData->GetTrackPID(stack, trackIndex), flags.Data());
1284 Double_t rpt = (fESDtracksPresent) ? fEsdEvent->GetTrack(fTrackingData->GetTrackAddInfo(stack, trackIndex))->GetSignedPt() :
1285 fHLTTracks->at(fTrackingData->GetTrackAddInfo(stack, trackIndex)).GetSignedPt();
1286 *infoStr += Form(" rpt: %+6.1f", rpt);
1291 #ifdef __TRDHLTDEBUG
1292 void AliHLTTRDTriggerComponent::RenderEvent(const Bool_t showGtuTracks, const Bool_t showTracklets, const Bool_t showRefTracks) {
1294 if ((!fEventDisplay) || (!fEsdEvent))
1297 LogDebug("rendering event");
1299 const Float_t refTrackPtDisplayThreshold = 0.7;
1300 const Float_t trackPtEmphasizeThreshold = 1.8;
1302 fEventDisplay->Reset();
1303 fEventDisplay->SetMagField(fEsdEvent->GetMagneticField());
1304 for (UInt_t iDet = 0; iDet < fkTRDStacks*fkTRDLayers; ++iDet)
1305 fEventDisplay->SetChamberState(iDet/fkTRDLayers, iDet%6, ((fSectorsWithData >> (iDet/30)) & 1) );
1308 for (UShort_t iDet = 0; iDet < fkTRDStacks*fkTRDLayers; ++iDet){
1309 UInt_t numTrkl = fTrackingData->GetNumTracklets(iDet);
1310 for (UInt_t iTrkl = 0; iTrkl < numTrkl; ++iTrkl){
1311 fEventDisplay->AddTracklet(fTrackingData->GetTracklet(iDet, iTrkl));
1317 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1318 for (Int_t iTrk = 0; iTrk < fTrackingData->GetNumTracks(iStack); ++iTrk){
1319 AliESDTrdTrack* track = fTrackingData->GetTrack(iStack, iTrk);
1320 Int_t trkIndex = fEventDisplay->AddTrack(track, (TMath::Abs(track->Pt()) >= trackPtEmphasizeThreshold) ? (kMagenta + 2) : kMagenta, 1, 1);
1321 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0)
1322 fEventDisplay->SetTrackTrackletStyle(trkIndex, kRed, 12);
1324 fEventDisplay->SetTrackTrackletStyle(trkIndex, kViolet - 5, 12);
1329 unsigned int numRefTracks = fEsdEvent->GetNumberOfTracks();
1330 unsigned int numRefTracksRendered = 0;
1332 // check for some marks for rendering
1333 UShort_t marks[40000];
1334 memset(marks, 0, sizeof(UShort_t)*40000);
1335 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1336 for (Int_t iTrk = 0; iTrk < fTrackingData->GetNumTracks(iStack); ++iTrk){
1337 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0){
1338 marks[fTrackingData->GetTrackAddInfo(iStack, iTrk)] |= 1;
1340 (fTrackingData->GetTrackPID(iStack, iTrk) >= fElectronTriggerPIDThresholdHQU) &&
1341 (TMath::Abs(fTrackingData->GetTrackPt(iStack, iTrk)) >= fElectronTriggerPtThresholdHQU))
1342 marks[fTrackingData->GetTrackAddInfo(iStack, iTrk)] |= 2;
1348 for (unsigned int iTrack = 0; iTrack < numRefTracks; ++iTrack){
1349 AliESDtrack* track = fEsdEvent->GetTrack(iTrack);
1350 if ((track->Pt() >= refTrackPtDisplayThreshold) || (marks[iTrack] != 0)){
1351 Color_t color = (track->Pt() >= trackPtEmphasizeThreshold) ? (kGray + 2) : kGray;
1354 if (marks[iTrack] & 0x2){
1358 if (!CheckRefTrackCuts(track))
1361 fEventDisplay->AddTrack(track, color, width, style);
1362 numRefTracksRendered++;
1367 if (!fEventDisplay->IsEmpty()){
1368 fEventDisplay->SetTitle("");
1369 fEventDisplay->SetSetupText("HLT", Form("%.1f#scale[0.5]{ }/#scale[0.5]{ }%.1f",
1370 refTrackPtDisplayThreshold, trackPtEmphasizeThreshold));
1371 fEventDisplay->SetBottomText(Form("%05i-%s-%05llu",
1372 fRunNumber, fChunkId->Data(), fEventId));
1373 fEventDisplay->SetBottomTextRight(Form("%d (%d) HLT tracks, %d tracklets, %d GTU tracks",
1375 numRefTracksRendered,
1376 fTrackingData->GetNumTracklets(),
1377 fTrackingData->GetNumTracks()));
1378 fEventDisplay->SetLook(AliTRDtrackingEventDisplay::dmMediumLight);
1379 fEventDisplay->SetDisplayMode(AliTRDtrackingEventDisplay::dmFullXY);
1380 fEventDisplay->SaveToFile(Form("display/event-%s-%05llu.eps",
1381 fChunkId->Data(), fEventId));
1387 Bool_t AliHLTTRDTriggerComponent::TRDElectronTrigger(const char *ident, const Double_t minPt, const UShort_t minPID){
1389 LogDebug("Electron trigger processing (%s: pt>=%.1f, pid>=%d)...", ident, minPt, minPID);
1392 Bool_t highPtElectronSeenGTU = kFALSE;
1393 Bool_t highPtElectronSeen = kFALSE;
1394 UInt_t truncMeanPID = 0;
1395 TString trackExchangeInfo("");
1398 UInt_t trdSectorTrgContribs = 0;
1399 for (UShort_t iSector = 0; iSector < fkTRDSectors; ++iSector)
1400 trdSectorTrgContribs |= fTrackingData->GetSectorTrgContribs(iSector);
1401 if ((trdSectorTrgContribs >> 5) & 0x3)
1402 fIsTRDElectronEvent = kTRUE;
1404 fIsTRDElectronEvent = kFALSE;
1406 if (fIsMinBiasEvent)
1407 fHistElectronTriggerBaseMinBias->Fill(0.);
1409 if (fIsTRDElectronEvent)
1410 fHistElectronTriggerBaseTrdL1->Fill(0.);
1412 if ((fElectronTriggerOnL1TrgOnly) && (!fIsTRDElectronEvent)){
1413 // evaluate trigger for events with TRD L1 electron trigger fired
1414 DbgLog("skipping %s electron trigger evaluation for event, because no TRD trigger flag set (ctbs: 0x%02x)",
1415 ident, trdSectorTrgContribs);
1419 for (UShort_t iStack = 0; iStack < fkTRDStacks; ++iStack){
1420 numTracks = fTrackingData->GetNumTracks(iStack);
1421 for (UInt_t iTrk = 0; iTrk < numTracks; ++iTrk){
1422 Double_t gpt = fTrackingData->GetTrackPt(iStack, iTrk);
1423 Bool_t trdElectronCandidate = kFALSE;
1424 Bool_t hltElectronCandidate = kFALSE;
1426 // re-evaluate GTU only decision for comparison
1428 (TMath::Abs(gpt) >= minPt) &&
1429 (fTrackingData->GetTrackPID(iStack, iTrk) >= minPID)
1431 trdElectronCandidate = kTRUE;
1432 highPtElectronSeenGTU = kTRUE;
1433 fHistElectronCandidatePt->Fill(gpt);
1434 fHistElectronCandidatePid->Fill(fTrackingData->GetTrackPID(iStack, iTrk));
1436 if (fExtendedHistos){
1438 // idea to be checked
1440 Short_t minLyr = -1;
1441 UShort_t minValue = 255;
1442 Short_t maxLyr = -1;
1443 UShort_t maxValue = 0;
1444 UShort_t lyrCount = 0;
1445 UInt_t layerMask = fTrackingData->GetTrackLayerMask(iStack, iTrk);
1447 // scan for min & max values
1448 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
1449 if ((layerMask >> iLayer) & 1){
1450 if (fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer) < minValue){
1451 minValue = fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer);
1454 if (fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer) > maxValue){
1455 maxValue = fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer);
1459 } // loop over layers
1461 // calculate trunc mean
1462 for (UShort_t iLayer = 0; iLayer < fkTRDLayers; ++iLayer){
1463 if (((layerMask >> iLayer) & 1) && (iLayer != minLyr) && (iLayer != maxLyr)){
1464 truncMeanPID += fTrackingData->GetTrackTrackletPID(iStack, iTrk, iLayer);
1467 } // loop over layers
1468 truncMeanPID = TMath::Nint((Double_t)(truncMeanPID)/(Double_t)(lyrCount));
1470 fHistPIDvsTruncPID->Fill(fTrackingData->GetTrackPID(iStack, iTrk), truncMeanPID);
1471 if (fTrackingData->GetTrackAddInfo(iStack, iTrk) < 0)
1472 fHistElectronFalsePIDvsTruncPID->Fill(fTrackingData->GetTrackPID(iStack, iTrk), truncMeanPID);
1476 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]",
1477 (fTrackingData->GetTrackAddInfo(iStack, iTrk) < 0) ? "unmatched" : "matched", ident,
1479 gpt, fTrackingData->GetTrackPID(iStack, iTrk),
1480 iStack/5, iStack%5, iTrk,
1484 // evaluate HLT-level trigger decision using match information
1486 (fTrackingData->GetTrackAddInfo(iStack, iTrk) >= 0) &&
1487 (TMath::Abs(gpt) >= minPt) &&
1488 (fTrackingData->GetTrackPID(iStack, iTrk) >= minPID)
1490 hltElectronCandidate = kTRUE;
1491 highPtElectronSeen = kTRUE;
1493 fHistElectronCandidateMatchedPt->Fill(gpt);
1494 fHistElectronCandidateMatchedPid->Fill(fTrackingData->GetTrackPID(iStack, iTrk));
1496 if (fExtendedHistos){
1497 fHistElectronConfirmedPIDvsTruncPID->Fill(fTrackingData->GetTrackPID(iStack, iTrk), truncMeanPID);
1500 Double_t rpt = (fESDtracksPresent) ? fEsdEvent->GetTrack(fTrackingData->GetTrackAddInfo(iStack, iTrk))->GetSignedPt() :
1501 fHLTTracks->at(fTrackingData->GetTrackAddInfo(iStack, iTrk)).GetSignedPt();
1502 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]",
1503 ident, iStack/5, iStack%5, fTrackingData->GetTrackPt(iStack, iTrk), fTrackingData->GetTrackPID(iStack, iTrk),
1504 rpt, iStack/5, iStack%5, iTrk);
1507 // log output for subsequent offline analysis
1508 if ((fDebugLevel >= 3) && (trdElectronCandidate || hltElectronCandidate)){
1509 trackExchangeInfo = "";
1511 if (trdElectronCandidate)
1513 if (hltElectronCandidate)
1515 AssignTrackInfo(&trackExchangeInfo, iStack, iTrk, flags.Data());
1516 LogDebug("%s\n", trackExchangeInfo.Data());
1519 } // loop over tracks in stack
1520 } // loop over stacks
1522 if (highPtElectronSeenGTU || highPtElectronSeen){
1523 LogInspect("#hlt-trd-trg - event triggered by %s electron trigger (TRD L1: %d, TRD HLT: %d)",
1524 ident, highPtElectronSeenGTU, highPtElectronSeen);
1527 if (highPtElectronSeenGTU){
1528 if (fIsMinBiasEvent)
1529 fHistElectronTriggerBaseMinBias->Fill(1.);
1532 if (highPtElectronSeen){
1533 if (fIsMinBiasEvent)
1534 fHistElectronTriggerBaseMinBias->Fill(2.);
1535 if (fIsTRDElectronEvent)
1536 fHistElectronTriggerBaseTrdL1->Fill(1.);
1539 return (highPtElectronSeen) ? kTRUE : kFALSE;
1543 int AliHLTTRDTriggerComponent::DoTrigger()
1549 UShort_t firedTriggers = 0;
1551 const AliHLTComponentEventData* hltEventData = GetEventData();
1552 fEventId = hltEventData->fEventID;
1553 LogDebug("### START DoTrigger [event id: %llu, %d blocks, size: %d]",
1554 fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1556 // LogDebug("### START DoTrigger [event id: %llu, %d blocks, size: %d]",
1557 // fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1559 if (!IsDataEvent()) { // process data events only
1561 LogDebug("### END DoTrigger [event id: %llu, %d blocks, size: %d] (skipped: no data event)",
1562 fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1566 fTrackingData->SetLogPrefix(Form("TRDHLTGM XXXXXX-%05llu: [TRG] {TrkDat} ", fEventId));
1570 // access to TRD specific data from AliHLTTRDPreprocessorComponent
1571 if (!PrepareTRDData()){
1572 LogError("access to TRD data failed. Skipping event...");
1576 if (fTrackingData->GetNumTracks() + fTrackingData->GetNumTracklets() == 0) {
1577 LogDebug("no trigger-relevant TRD information, skipping further event processing");
1581 // access to ESD data
1582 if (!PrepareESDData()){
1583 LogInfo("access to ESD event data failed.");
1586 // access to alternative HLT data
1587 if (!fESDtracksPresent){
1588 if (!PrepareHLTData()){
1589 LogError("access to HLT event data failed.");
1593 // match TRD and HLT tracks
1594 if (fESDtracksPresent){
1595 if (!MatchTRDTracksESD()){
1596 LogError("matching TRD tracks to ESD tracks failed. Skipping event...");
1599 } else if (fHLTtracksPresent){
1600 if (!MatchTRDTracksHLT()){
1601 LogError("matching TRD tracks to HLT tracks failed. Skipping event...");
1605 LogError("No HLT track information available. Skipping event...");
1609 // if (!MatchTRDTracks()){
1610 // LogError("matching TRD tracks to TPC tracks failed. Skipping event...");
1614 if (fDebugLevel >= 1)
1617 // evaluate electron trigger conditions
1618 if (TRDElectronTrigger("HSE", fElectronTriggerPtThresholdHSE, fElectronTriggerPIDThresholdHSE))
1619 firedTriggers |= fkElectronTriggerHSE;
1621 if (TRDElectronTrigger("HQU", fElectronTriggerPtThresholdHQU, fElectronTriggerPIDThresholdHQU))
1622 firedTriggers |= fkElectronTriggerHQU;
1630 TString description("");
1631 if (firedTriggers & fkElectronTriggerHSE){
1632 if (description.Length() > 0)
1634 description += fgkTriggerDecisionElectronHSE;
1637 if (firedTriggers & fkElectronTriggerHQU){
1638 if (description.Length() > 0)
1640 description += fgkTriggerDecisionElectronHQU;
1643 SetDescription(description.Data());
1644 AliHLTTriggerDecision decision((firedTriggers) ? kTRUE : kFALSE,
1649 TriggerEvent(&decision, kAliHLTDataTypeTObject | kAliHLTDataOriginOut);
1652 LogInspect("TRD HLT trigger fired for event: description: >%s<, flags: 0x%04x",
1653 description.Data(), firedTriggers);
1654 #ifdef __TRDHLTDEBUG
1655 if (fEventRendering)
1659 LogDebug("TRD HLT trigger did not fire for event");
1663 PushBack(fHistArray, (kAliHLTDataTypeTObjArray | kAliHLTDataOriginTRD), 0x3fffff);
1666 LogDebug("### END DoTrigger [event id: %llu, %d blocks, size: %d]",
1667 fEventId, hltEventData->fBlockCnt, hltEventData->fStructSize);
1672 Bool_t AliHLTTRDTriggerComponent::TrackPlaneIntersect(AliExternalTrackParam *trk, Double_t pnt[3], Double_t norm[3], Double_t mag){
1676 Double_t dist = 99999, dist_prev = 99999;
1677 Double_t x[3] = {0., 0., 0.};
1680 dist = (x[0] - pnt[0]) * norm[0] + (x[1] - pnt[1]) *norm[1] + (x[2] - pnt[2]) * norm[2];
1682 while(TMath::Abs(dist) > 0.1) {
1684 trk->GetXYZAt(r, mag, x);
1686 if ((x[0] * x[0] + x[1] * x[1]) < 100.) { // extrapolation to radius failed
1691 //distance between current track position and plane
1692 dist_prev = TMath::Abs(dist);
1693 dist = (x[0] - pnt[0]) * norm[0] + (x[1] - pnt[1]) * norm[1];
1696 if(TMath::Abs(dist) >= dist_prev ||
1697 (r > 380.) || (r < 100.)){
1703 for (Int_t i=0; i<3; i++){
1714 Double_t AliHLTTRDTriggerComponent::RateTrackMatch(Double_t distY, Double_t distZ, Double_t rpt, Double_t gpt){
1716 // maximum limits for spatial distance
1717 if ((distY > 5.) || (distZ > 20.))
1720 // same pt sign required
1721 if ((rpt * gpt) < 0.)
1724 Double_t rating_distY = -0.1 * distY + 1.;
1725 Double_t rating_distZ = -0.025 * distZ + 1.;
1726 Double_t rating_ptDiff = 1. - TMath::Abs((TMath::Abs(rpt) > 0.000001) ? ((gpt-rpt)/rpt) : 0.);
1728 if (rating_ptDiff < 0.)
1729 rating_ptDiff = 0.2;
1731 Double_t total = rating_distY * rating_distZ * rating_ptDiff;
1733 // DbgLog("", Form("#matching: rating: dy: %.3f dz: %.3f dpt: %.3f -> total: %.3f",
1734 // rating_distY, rating_distZ, rating_ptDiff, total));
1737 LogError("track match rating exceeds limit of 1.0: %.3f", total);
1742 Int_t AliHLTTRDTriggerComponent::EstimateTrackDistance(AliESDtrack *esd_track,
1743 const UShort_t stack,
1744 const UShort_t layerMask,
1745 const Float_t trklLocalY[6], const Int_t trklBinZ[6],
1746 Double_t mag, Double_t *ydist, Double_t *zdist){
1750 AliExternalTrackParam* refParam = NULL;
1751 if (esd_track->GetOuterParam())
1752 refParam = new AliExternalTrackParam(*(esd_track->GetOuterParam()));
1754 refParam = new AliExternalTrackParam(*(esd_track));
1756 Int_t res = EstimateTrackDistance(refParam, stack, layerMask, trklLocalY, trklBinZ, mag, ydist, zdist);
1765 Int_t AliHLTTRDTriggerComponent::EstimateTrackDistance(AliExternalTrackParam *refParam,
1766 const UShort_t stack,
1767 const UShort_t layerMask,
1768 const Float_t trklLocalY[6], const Int_t trklBinZ[6],
1769 Double_t mag, Double_t *ydist, Double_t *zdist){
1780 UShort_t stackInSector;
1782 AliTRDpadPlane* padPlane;
1784 for (UShort_t iLayer = 0; iLayer < 6; iLayer++){
1785 if ((layerMask >> iLayer) & 1){
1786 trklDet = stack*6 + iLayer;
1789 stackInSector = stack % 5;
1791 // local coordinates of the outer end point of the tracklet
1792 xtrkl[0] = AliTRDgeometry::AnodePos();
1793 xtrkl[1] = trklLocalY[iLayer];
1795 padPlane = fTRDGeometry->GetPadPlane(trklLayer, stackInSector);
1796 if(stackInSector == 2){ // corrected version by Felix Muecke
1797 xtrkl[2] = padPlane->GetRowPos(trklBinZ[iLayer]) - (padPlane->GetRowSize(trklBinZ[iLayer]))/2. - padPlane->GetRowPos(6);
1799 xtrkl[2] = padPlane->GetRowPos(trklBinZ[iLayer]) - (padPlane->GetRowSize(trklBinZ[iLayer]))/2. - padPlane->GetRowPos(8);
1802 // transform to global coordinates
1803 TGeoHMatrix *matrix = fTRDGeometry->GetClusterMatrix(trklDet);
1805 LogError("invalid TRD cluster matrix in EstimateTrackDistance for detector %i", trklDet);
1808 matrix->LocalToMaster(xtrkl, ptrkl);
1809 fTRDGeometry->RotateBack((stack/5) * 30, ptrkl, ptrkl2); // ptrkl2 now contains the global position of the outer end point of the tracklet
1811 // calculate parameterization of plane representing the tracklets layer
1812 Double_t layer_zero_local[3] = {0., 0., 0.};
1813 Double_t layer_zero_global[3], layer_zero_global2[3];
1815 matrix->LocalToMaster(layer_zero_local, layer_zero_global);
1816 fTRDGeometry->RotateBack(trklDet, layer_zero_global, layer_zero_global2); // layer_zero_global2 points to chamber origin in global coords
1818 Double_t layer_ref_local[3] = {AliTRDgeometry::AnodePos(), 0., 0.};
1819 Double_t layer_ref_global[3], layer_ref_global2[3];
1821 matrix->LocalToMaster(layer_ref_local, layer_ref_global);
1822 fTRDGeometry->RotateBack(trklDet, layer_ref_global, layer_ref_global2); // layer_ref_global2 points to center anode pos within plane in global coords
1824 Double_t n0[3] = {layer_ref_global2[0]-layer_zero_global2[0],
1825 layer_ref_global2[1]-layer_zero_global2[1],
1826 layer_ref_global2[2]-layer_zero_global2[2]};
1828 Double_t n_len = TMath::Sqrt(n0[0]*n0[0] + n0[1]*n0[1] + n0[2]*n0[2]);
1829 if (n_len == 0.){ // This should never happen
1830 //printf("<ERROR> divison by zero in estimate_track_distance!");
1833 Double_t n[3] = {n0[0]/n_len, n0[1]/n_len, n0[2]/n_len}; // normal vector of plane
1835 Bool_t isects = TrackPlaneIntersect(refParam, layer_ref_global2, n, mag); // find intersection point between track and TRD layer
1837 if (isects == kFALSE){ // extrapolation fails, because track never reaches the TRD radius
1841 Double_t m[2] = {ptrkl2[0] - layer_ref_global2[0], ptrkl2[1] - layer_ref_global2[1]};
1842 Double_t len_m = TMath::Sqrt(m[0]*m[0] + m[1]*m[1]);
1844 diff_z += TMath::Abs(ptrkl2[2] - layer_ref_global2[2]);
1850 *ydist = diff_y / nLayers;
1851 *zdist = diff_z / nLayers;
1854 LogError("invalid number of contributing layers (%d) in EstimateTrackDistance()", nLayers);