]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/trigger/AliHLTTriggerBarrelGeomMultiplicity.cxx
little changes
[u/mrichter/AliRoot.git] / HLT / trigger / AliHLTTriggerBarrelGeomMultiplicity.cxx
1 // $Id$
2 //**************************************************************************
3 //* This file is property of and copyright by the ALICE HLT Project        * 
4 //* ALICE Experiment at CERN, All rights reserved.                         *
5 //*                                                                        *
6 //* Primary Authors: Oystein Djuvsland                                     *
7 //*                  for The ALICE HLT Project.                            *
8 //*                                                                        *
9 //* Permission to use, copy, modify and distribute this software and its   *
10 //* documentation strictly for non-commercial purposes is hereby granted   *
11 //* without fee, provided that the above copyright notice appears in all   *
12 //* copies and that both the copyright notice and this permission notice   *
13 //* appear in the supporting documentation. The authors make no claims     *
14 //* about the suitability of this software for any purpose. It is          *
15 //* provided "as is" without express or implied warranty.                  *
16 //**************************************************************************
17
18 /// @file   AliHLTTriggerBarrelGeomMultiplicity.cxx
19 /// @author Oystein Djuvsland
20 /// @date   2009-10-08
21 /// @brief  HLT trigger component for charged particle multiplicity 
22 ///         within a geometrical acceptance in the central barrel.
23
24 // see header file for class documentation
25 // or
26 // refer to README to build package
27 // or
28 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
29
30 #include "AliHLTTriggerBarrelGeomMultiplicity.h"
31 #include "AliHLTTriggerDetectorGeom.h"
32 #include "AliHLTTriggerDecisionParameters.h"
33 #include "AliESDEvent.h"
34 #include "AliHLTTriggerDecision.h"
35 #include "AliHLTDomainEntry.h"
36 #include "AliHLTGlobalBarrelTrack.h"
37 #include "TObjArray.h"
38 #include "TObjString.h"
39 #include "AliCDBEntry.h"
40 #include "AliCDBManager.h"
41 #include "TFile.h"
42 #include "AliHLTTrigger.h"
43
44 /** ROOT macro for the implementation of ROOT specific class methods */
45 ClassImp(AliHLTTriggerBarrelGeomMultiplicity)
46
47 AliHLTTriggerBarrelGeomMultiplicity::AliHLTTriggerBarrelGeomMultiplicity()
48   : AliHLTTrigger()
49   , fSolenoidBz(0)
50   , fMinTracks(1)
51   , fDetectorArray(0)
52   , fTriggerDecisionPars(0)
53   , fTriggerName(0)
54   , fOCDBEntry(0)
55 {
56   // see header file for class documentation
57   // or
58   // refer to README to build package
59   // or
60   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
61
62   fDetectorArray = new TObjArray;
63
64 }
65
66 AliHLTTriggerBarrelGeomMultiplicity::~AliHLTTriggerBarrelGeomMultiplicity()
67 {
68   // see header file for class documentation
69
70   if (fDetectorArray != NULL) delete fDetectorArray;
71 }
72
73 const char* AliHLTTriggerBarrelGeomMultiplicity::GetTriggerName() const 
74 {
75   // see header file for class documentation
76
77   return "BarrelGeomMultiplicityTrigger";
78 }
79
80 AliHLTComponent* AliHLTTriggerBarrelGeomMultiplicity::Spawn()
81 {
82   // see header file for class documentation
83   return new AliHLTTriggerBarrelGeomMultiplicity;
84 }
85
86 int AliHLTTriggerBarrelGeomMultiplicity::Reconfigure(const char *cdbEntry, const char *chainId)
87 {
88   // see header file for class documentation
89
90   // configure from the specified entry or the default
91   const char* entry=cdbEntry;
92
93   if (!entry)
94     {
95       HLTDebug("No CDB path specified");
96       entry = fOCDBEntry; 
97     }
98
99   return GetDetectorGeomsFromCDBObject(entry, chainId);
100
101
102 int AliHLTTriggerBarrelGeomMultiplicity::DoTrigger()
103 {
104   // see header file for class documentation
105   int iResult=0;
106   int numberOfTracks=-1;
107
108   if (!fTriggerDecisionPars) {
109     iResult=-ENODEV;
110   }
111
112   // try the ESD as input
113   const TObject* obj = GetFirstInputObject(kAliHLTAllDataTypes, "AliESDEvent");
114   AliESDEvent* esd = dynamic_cast<AliESDEvent*>(const_cast<TObject*>(obj));
115   TString description;
116
117   if (esd != NULL) 
118     {
119       numberOfTracks=0;
120       esd->GetStdContent();
121       for (Int_t i = 0; i < esd->GetNumberOfTracks(); i++) 
122         {
123           if (CheckCondition(esd->GetTrack(i), esd->GetMagneticField())) numberOfTracks++;
124         }
125     }
126
127   // try the AliHLTExternal track data as input
128   if (iResult>=0 && numberOfTracks<0) 
129     {
130       for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeTrack);
131            pBlock!=NULL; pBlock=GetNextInputBlock()) 
132         {
133           if (numberOfTracks<0) numberOfTracks=0;
134           vector<AliHLTGlobalBarrelTrack> tracks;
135           if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>0) 
136             {
137               for (vector<AliHLTGlobalBarrelTrack>::iterator element=tracks.begin();
138                    element!=tracks.end(); element++) 
139                 {
140                   if (CheckCondition(&(*element), fSolenoidBz)) numberOfTracks++;
141                 }
142             } 
143           else if (iResult<0) 
144             {
145               HLTError("can not extract tracks from data block of type %s (specification %08x) of size %d: error %d", 
146                        DataType2Text(pBlock->fDataType).c_str(), pBlock->fSpecification, pBlock->fSize, iResult);
147             }
148         }
149     }
150
151   bool condition=false;
152   description="Geometrical conditions not matched";
153   AliHLTReadoutList readout;
154
155   if (numberOfTracks>=fMinTracks) 
156     {
157       condition=true;
158       description=fTriggerDecisionPars->GetDescription();
159       readout=fTriggerDecisionPars->GetReadoutListParameter();
160       HLTDebug("Geometrical acceptance trigger %s triggered", fTriggerDecisionPars->GetTriggerName().Data());
161     }
162
163   AliHLTTriggerDecision decision(
164                                  condition,
165                                  fTriggerDecisionPars->GetTriggerName().Data(),
166                                  AliHLTTriggerDomain(readout),
167                                  description.Data()
168                                  );
169   TriggerEvent(&decision, kAliHLTDataTypeTObject|kAliHLTDataOriginOut);
170
171   return iResult;
172
173 }
174
175
176 template<class T>
177 bool AliHLTTriggerBarrelGeomMultiplicity::CheckCondition(T* track, float b)
178 {
179
180   bool ret = false;
181
182   // see header file for class documentation
183   if (!track) return false;
184
185   ret = IsInDetectors(track, b);
186
187   return ret;
188
189 }
190
191 template<class T>
192 bool AliHLTTriggerBarrelGeomMultiplicity::IsInDetectors(T* track, float b)
193 {
194   // See header file for class documentation  
195   for(Int_t i = 0; i < fDetectorArray->GetEntries(); i++)
196     {
197       AliHLTTriggerDetectorGeom *det = static_cast<AliHLTTriggerDetectorGeom*>(fDetectorArray->At(i));
198
199       Double_t trackPoint[3];
200       Double_t normVector[3];
201
202       det->GetInitialPoint(trackPoint);
203       det->GetNormVector(normVector);
204
205       bool ret = track->Intersect(trackPoint, normVector, b);
206
207       if(ret)
208         {
209           if(det->IsInDetector(trackPoint)) return true;
210         }
211     }
212   return false;
213 }
214
215 int AliHLTTriggerBarrelGeomMultiplicity::DoInit(int argc, const char** argv)
216 {
217   // see header file for class documentation
218
219   // first configure the default
220   int iResult=0;
221
222   // Matthias 05.04.2011 code audit
223   // looks like somebody has to commission this component
224   HLTWarning("this component is not tested and needs most likely a major revision!");
225
226   if (iResult>=0 && argc>0)
227     iResult=ConfigureFromArgumentString(argc, argv);
228
229   if (!fTriggerDecisionPars) {
230     HLTError("decision parameter not initialized");
231     iResult=-ENODEV;
232   }
233   fSolenoidBz=GetBz();
234
235   return iResult;
236 }
237
238 int AliHLTTriggerBarrelGeomMultiplicity::DoDeinit()
239  {
240   // see header file for class documentation
241    if (fTriggerName) delete fTriggerName;
242    fTriggerName=NULL;
243   return 0;
244 }
245
246 int AliHLTTriggerBarrelGeomMultiplicity::ReadPreprocessorValues(const char* /*modules*/)
247 {
248     // see header file for function documentation
249
250   // nothing to do for the moment
251   return 0;
252 }
253
254 int AliHLTTriggerBarrelGeomMultiplicity::GetDetectorGeomsFromCDBObject(const char *cdbEntry, const char* chainId)
255 {
256     // see header file for function documentation
257   int nDetectorGeoms=0;
258
259   if(fDetectorArray)
260     {
261       fDetectorArray->Clear();
262     }
263   else
264     {
265       fDetectorArray = new TObjArray();
266     }
267   
268   const char *path = cdbEntry;
269
270   if(!path) path = fOCDBEntry;
271   
272   if(path)
273     {
274       //     const char* chainId=GetChainId();
275       HLTInfo("configure from entry %s, chain id %s", path, (chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
276       AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
277       if (pEntry) 
278         {
279           TObjArray* pArr=dynamic_cast<TObjArray*>(pEntry->GetObject());
280           if (pArr) 
281             {
282
283               for(int i = 0; i < pArr->GetEntries(); i++)
284                 {
285                   if(!strcmp(pArr->At(i)->ClassName(), "AliHLTTriggerDecisionParameters"))
286                     {
287                       fTriggerDecisionPars = dynamic_cast<AliHLTTriggerDecisionParameters*>(pArr->At(i));
288                     }
289                   else if(pArr->At(i)->InheritsFrom("AliHLTTriggerDetectorGeom"))
290                     {
291                       fDetectorArray->AddLast(dynamic_cast<AliHLTTriggerDetectorGeom*>(pArr->At(i)));
292                       nDetectorGeoms++;
293                       HLTDebug("received detector geometry of type %s", pArr->At(i)->ClassName());
294                     }
295                   else
296                     {
297                       HLTWarning("Unknown object of type %s in configuration object", pArr->At(i)->ClassName());
298                     }
299                 }
300             } 
301           else 
302             {
303               HLTError("configuration object \"%s\" has wrong type, required TObjArray", path);
304               nDetectorGeoms=-EINVAL;
305             }
306         }
307       else 
308         {
309           HLTError("can not fetch object \"%s\" from OCDB", path);
310           nDetectorGeoms=-ENOENT;
311         }
312     }
313
314   HLTInfo("received %d detector geometries", nDetectorGeoms);
315
316   return nDetectorGeoms;
317 }
318
319 int AliHLTTriggerBarrelGeomMultiplicity::GetDetectorGeomsFromFile(const char *filename)
320 {
321     // see header file for function documentation
322   int nDetectorGeoms=0;
323
324   if(fDetectorArray)
325     {
326       fDetectorArray->Clear();
327     }
328   else
329     {
330       fDetectorArray = new TObjArray();
331     }
332   
333
334   if (filename) 
335     {
336       TFile *geomfile = TFile::Open(filename, "READ");
337       
338       if(geomfile)
339         {
340           HLTInfo("configure from file \"%s\"", filename);
341           TObjArray* pArr=dynamic_cast<TObjArray*>(geomfile->Get("GeomConf"));
342           if (pArr) 
343             {
344
345               for(int i = 0; i < pArr->GetEntries(); i++)
346                 {
347                   if(!strcmp(pArr->At(i)->ClassName(), "AliHLTTriggerDecisionParameters"))
348                     {
349                       fTriggerDecisionPars = dynamic_cast<AliHLTTriggerDecisionParameters*>(pArr->At(i));
350                     }
351                   else if(pArr->At(i)->InheritsFrom("AliHLTTriggerDetectorGeom"))
352                     {
353                       fDetectorArray->AddLast(dynamic_cast<AliHLTTriggerDetectorGeom*>(pArr->At(i)));
354                       nDetectorGeoms++;
355                       HLTDebug("received detector geometry of type %s", pArr->At(i)->ClassName());
356                     }
357                   else
358                     {
359                       HLTWarning("Unknown object of type %s in configuration object", pArr->At(i)->ClassName());
360                     }
361                 }
362             } 
363           else 
364             {
365               HLTError("configuration object has wrong type, required TObjArray");
366               nDetectorGeoms=-EINVAL;
367             }
368           } 
369       else 
370         {
371           HLTError("could not open file \"%s\"", filename);
372           nDetectorGeoms=-ENOENT;
373         }
374     }
375   else
376     {
377       HLTError("ROOT file name not specified");
378     }
379   HLTInfo("received %d detector geometries", nDetectorGeoms);
380
381   return nDetectorGeoms;
382 }
383
384 int AliHLTTriggerBarrelGeomMultiplicity::ScanConfigurationArgument(int argc, const char** argv)
385 {
386   // See header file for class documentation
387   if (argc<=0) return 0;
388   int i=0;
389   TString argument=argv[i];
390
391   if (argument.CompareTo("-geomfile")==0) 
392     {
393       if (++i>=argc) return -EPROTO;
394     
395       GetDetectorGeomsFromFile(argv[i]);
396     
397       return 2;
398     }    
399
400   if (argument.CompareTo("-triggername")==0) 
401     {
402       if (++i>=argc || argv[i]==NULL) return -EPROTO;
403
404       int namelen=strlen(argv[i])+1;
405       fTriggerName = new char[namelen];
406       if (!fTriggerName) return -ENOMEM;
407       snprintf(fTriggerName, namelen, "%s", argv[i]);
408       
409       fOCDBEntry = fTriggerName;
410
411       return 2;
412   }    
413   return 0;
414 }
415