3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Timur Pocheptsov <Timur.Pocheptsov@cern.ch> *
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 AliHLTV0FinderComponent.cxx
20 /// @author Timur Pocheptsov
22 /// @brief V0 finder component
27 #include "AliHLTDataTypes.h"
28 #include "AliHLTV0FinderComponent.h"
30 ClassImp(AliHLTV0FinderComponent)
32 const double AliHLTV0FinderComponent::fgDaughterPrimDeviation = 2.5;
33 const double AliHLTV0FinderComponent::fgPrimDeviation = 3.5;
34 const double AliHLTV0FinderComponent::fgChi = 3.5;
35 const double AliHLTV0FinderComponent::fgDecayLengthInSigmas = 3.;
37 //________________________________________________________________________
38 AliHLTV0FinderComponent::AliHLTV0FinderComponent()
44 fDaughterPrimDeviation(fgDaughterPrimDeviation),
45 fPrimDeviation(fgPrimDeviation),
47 fDecayLengthInSigmas(fgDecayLengthInSigmas),
56 //________________________________________________________________________
57 const char* AliHLTV0FinderComponent::GetComponentID()
63 //________________________________________________________________________
64 void AliHLTV0FinderComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
66 //Input to the primary vertex finder:
67 //a)tracks from ESD object;
70 //d)primary vertex (AliKFVertex)
71 //e)indices of primary tracks.
74 list.push_back(kAliHLTDataTypeESDObject);
75 list.push_back(kAliHLTDataTypeTrack | kAliHLTDataOriginITS);
76 list.push_back(kAliHLTDataTypeTrack | kAliHLTDataOriginTPC);
77 //Input from primary finder:
79 list.push_back(kAliHLTDataTypeKFVertex | kAliHLTDataOriginOut);
80 //Primary tracks' indices.
81 list.push_back(kAliHLTDataTypePrimaryFinder | kAliHLTDataOriginOut);
84 //________________________________________________________________________
85 AliHLTComponentDataType AliHLTV0FinderComponent::GetOutputDataType()
87 //Data type of output.
88 return kAliHLTMultipleDataType;
91 //________________________________________________________________________
92 int AliHLTV0FinderComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
94 //Output type for V0 finder.
96 //Indices of tracks, participating in V0s.
97 tgtList.push_back(kAliHLTDataTypeV0Finder | kAliHLTDataOriginOut);
99 return tgtList.size();
102 //________________________________________________________________________
103 void AliHLTV0FinderComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
105 //These numbers are complete crap.
107 inputMultiplier = 2.;
110 //________________________________________________________________________
111 AliHLTComponent* AliHLTV0FinderComponent::Spawn()
113 //Create primary vertex finder componet.
114 return new AliHLTV0FinderComponent;
117 //________________________________________________________________________
118 int AliHLTV0FinderComponent::DoInit(int argc, const char** argv)
120 //1. Default parameters.
121 fDaughterPrimDeviation = fgDaughterPrimDeviation;
122 fPrimDeviation = fgPrimDeviation;
124 fDecayLengthInSigmas = fgDecayLengthInSigmas;
127 fGammaFinder = false;
129 //2. Parameters from OCDB.
130 TString cdbPath("HLT/ConfigHLT/");
131 cdbPath += GetComponentID();
133 int res = ConfigureFromCDBTObjString(cdbPath);
137 //3. "Command line" parameters.
139 res = ConfigureFromArgumentString(argc, argv);
144 //________________________________________________________________________
145 int AliHLTV0FinderComponent::ScanConfigurationArgument(int argc, const char** argv)
147 //Scan one argument and its parameters from the list
148 //Return number of processed entries.
149 //Possible arguments:
150 //-daughterPrimDeviation num
153 //-decayLengthInSigmas num
158 AliHLTUtility::CmdLineParser parser;
159 parser.Add("-daughterPrimDeviation", &fDaughterPrimDeviation);
160 parser.Add("-primDeviation", &fPrimDeviation);
161 parser.Add("-chi", &fChi);
162 parser.Add("-decayLengthInSigmas", &fDecayLengthInSigmas);
163 parser.Add("-posPID", &fPosPID);
164 parser.Add("-negPID", &fNegPID);
165 parser.Add("-gammaFinder", &fGammaFinder);
167 const int nParsed = parser.Parse(argc, argv, 0);
169 HLTError(parser.GetError().Data());
176 //________________________________________________________________________
177 int AliHLTV0FinderComponent::DoDeinit()
179 //Reset parameters to default.
180 fDaughterPrimDeviation = fgDaughterPrimDeviation;
181 fPrimDeviation = fgPrimDeviation;
183 fDecayLengthInSigmas = fgDecayLengthInSigmas;
186 fGammaFinder = false;
191 //________________________________________________________________________
192 int AliHLTV0FinderComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/,
193 AliHLTComponentTriggerData& /*trigData*/)
195 //Find primary vertex.
196 if (GetFirstInputBlock(kAliHLTDataTypeSOR) || GetFirstInputBlock(kAliHLTDataTypeEOR))
199 //Clean all previous track infos.
201 fPrimaryTracks.clear();
203 //Initialize KF package.
204 AliKFParticle::SetField(GetBz());
206 if (!ReadPrimaryVertex())
217 //________________________________________________________________________
218 bool AliHLTV0FinderComponent::ReadPrimaryVertex()
220 //Primary finder produces primary vertex (AliKFVertex) and
221 //indices for primary tracks.
222 //1. Try to extract primary vertex.
223 const TObject* obj = GetFirstInputObject(kAliHLTDataTypeKFVertex | kAliHLTDataOriginOut);
224 const AliKFVertex* kfVtx = dynamic_cast<const AliKFVertex*>(obj);
227 HLTError("V0 finder requires KF vertex (primary vertex) as input");
231 //2. Try to read primary track indices.
232 const AliHLTComponentBlockData* p = GetFirstInputBlock(kAliHLTDataTypePrimaryFinder
233 | kAliHLTDataOriginOut);
234 if (!p || !p->fSize || !p->fPtr) {
235 HLTError("Array of primary track indices expected");
239 //Data block from primary finder
240 const PrimaryFinderBlock* blk = static_cast<PrimaryFinderBlock*>(p->fPtr);
241 //Track ids must be positive integers.
242 if (blk->fMinPrimID < 0 || blk->fMaxPrimID < 0) {
243 HLTError("Got negative track ID from primary finder, internal HLT error");
247 //3. Got correct data, modify the component's state.
249 fPrimaryVtx = *kfVtx;
251 fNPrimaryTracks = blk->fNPrimaryTracks;
252 fMinPrimID = blk->fMinPrimID;
253 fMaxPrimID = blk->fMaxPrimID;
255 fPrimaryTracks.assign(fMaxPrimID + 1, 0);
256 for (int i = 0; i < fNPrimaryTracks; ++i)
257 fPrimaryTracks[blk->fPrimTrackIds[i]] = 1;
262 //________________________________________________________________________
263 bool AliHLTV0FinderComponent::ReadTracks()
265 //The logic, how vertex finder reads input tracks,
266 //is taken from the original global vertexer.
267 //First, try to read tracks from ESD event.
268 ReadESDTracks(fPosPID, fNegPID);
269 if (fTrackInfos.size()) {
270 FindPrimaryDeviations();
274 //No good esd tracks, try:
275 ReadHLTTracks(kAliHLTDataTypeTrack | kAliHLTDataOriginITS, fPosPID, fNegPID);
276 if (fTrackInfos.size()) {
277 FindPrimaryDeviations();
281 //If no good its tracks, try:
282 ReadHLTTracks(kAliHLTDataTypeTrack | kAliHLTDataOriginTPC, fPosPID, fNegPID);
283 if (fTrackInfos.size()) {
284 FindPrimaryDeviations();
288 HLTError("No input tracks found for V0 finder");
293 //________________________________________________________________________
294 void AliHLTV0FinderComponent::FindPrimaryDeviations()
296 //Quite a tricky part.
297 for (VectorSize_t i = 0; i < fTrackInfos.size(); ++i) {
298 AliHLTTrackInfo& info = fTrackInfos[i];
299 if (IsPrimaryTrack(info.fID)) {
300 info.fPrimUsed = true;
301 //The way primary deviation is computed in primary finder:
302 if (fNPrimaryTracks <= 20) {
303 AliKFVertex tmp(fPrimaryVtx - info.fParticle);
304 info.fPrimDeviation = info.fParticle.GetDeviationFromVertex(tmp);
306 info.fPrimDeviation = info.fParticle.GetDeviationFromVertex(fPrimaryVtx);
308 info.fPrimUsed = false;
309 info.fPrimDeviation = info.fParticle.GetDeviationFromVertex(fPrimaryVtx);
314 //________________________________________________________________________
315 bool AliHLTV0FinderComponent::IsPrimaryTrack(int id)const
317 if (id < fMinPrimID || id > fMaxPrimID)
320 return fPrimaryTracks[id];
323 //________________________________________________________________________
324 void AliHLTV0FinderComponent::FindV0s()
327 if (fPrimaryVtx.GetNContributors() < 3)
331 fV0s.push_back(0); //Number of v0s.
333 for (int iTr = 0, ei = fTrackInfos.size(); iTr < ei; ++iTr) {
334 AliHLTTrackInfo& info = fTrackInfos[iTr];
335 if (info.fParticle.GetQ() > 0)
337 if (info.fPrimDeviation < fDaughterPrimDeviation)
340 for (int jTr = 0; jTr < ei; ++jTr) {
341 AliHLTTrackInfo& jnfo = fTrackInfos[jTr];
342 if (jnfo.fParticle.GetQ() < 0)
344 if (jnfo.fPrimDeviation < fDaughterPrimDeviation)
347 //Check if the particles fit
348 if (info.fParticle.GetDeviationFromParticle(jnfo.fParticle) > fChi)
351 //Construct V0 mother
352 AliKFParticle v0(info.fParticle, jnfo.fParticle /*, bGammaFinder*/);
354 if (v0.GetChi2() < 0. || v0.GetChi2() > fChi * fChi * v0.GetNDF())
357 //Subtruct daughters from primary vertex
358 AliKFVertex primVtxCopy(fPrimaryVtx);
360 if (info.fPrimUsed) {
361 if (primVtxCopy.GetNContributors() <= 2)
363 primVtxCopy -= info.fParticle;
366 if (jnfo.fPrimUsed) {
367 if (primVtxCopy.GetNContributors() <= 2)
369 primVtxCopy -= jnfo.fParticle;
372 //Check v0 Chi^2 deviation from primary vertex
373 if (v0.GetDeviationFromVertex(primVtxCopy) > fPrimDeviation)
375 //Add V0 to primary vertex to improve the primary vertex resolution
377 //Set production vertex for V0
378 v0.SetProductionVertex(primVtxCopy);
379 //Get V0 decay length with estimated error
380 double length = 0., sigmaLength = 0.;
381 if (v0.GetDecayLength(length, sigmaLength))
383 //Reject V0 if it decays too close[sigma] to the primary vertex
384 if (length < fDecayLengthInSigmas * sigmaLength)
387 fV0s.push_back(info.fID);
388 fV0s.push_back(jnfo.fID);
395 //________________________________________________________________________
396 int AliHLTV0FinderComponent::DoOutput()
398 //Save V0s' track pairs' indices.
399 if (!fV0s.size() || !fV0s[0]) {
400 HLTInfo("No v0s were found");
404 //Indices of primary tracks.
405 return PushBack(&fV0s[0], fV0s.size() * sizeof(int),
406 kAliHLTDataTypeV0Finder | kAliHLTDataOriginOut);