]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/trigger/AliHLTTriggerEmcalElectron.cxx
flat friends update
[u/mrichter/AliRoot.git] / HLT / trigger / AliHLTTriggerEmcalElectron.cxx
CommitLineData
5d8d9319 1// $Id: AliHLTTriggerEmcalElectron.cxx 50471 2011-07-07 09:50:47Z fronchet $
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: marcelfigueredo@gmail.com *
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#include "AliHLTTriggerEmcalElectron.h"
19#include "AliESDEvent.h"
4c47de6b 20#include "AliVCluster.h"
5d8d9319 21#include "AliESDCaloCluster.h"
22#include "AliHLTTriggerDecision.h"
23#include "AliHLTDomainEntry.h"
24#include "AliHLTCaloClusterReader.h"
25#include "AliHLTCaloClusterDataStruct.h"
26#include "TRefArray.h"
27#include "TString.h"
28#include "TMap.h"
29#include "AliESDtrack.h"
c9b754b8 30#include "AliHLTScalars.h"
5d8d9319 31/** ROOT macro for the implementation of ROOT specific class methods */
32ClassImp(AliHLTTriggerEmcalElectron)
33
34AliHLTTriggerEmcalElectron::AliHLTTriggerEmcalElectron() :
35 AliHLTTrigger(),
36 fEThreshold(0.0),
2e2fdcf2 37 fEoverPThreshold(0.),
38 fEoverPLimit(0.),
39 fdEta(1.),
40 fdPhi(1.),
41
42// fClustersRefs(NULL),
43// fClusterReader(NULL),
44 fOCDBEntry("HLT/ConfigHLT/EmcalElectronTrigger"),
45// fOCDBEntry(""),
5d8d9319 46 fDetector("EMCAL"),
cdac6043 47 fInputDataType(),
48 fMakeStats(kFALSE)
5d8d9319 49{
50 // see header file for class documentation
51 // or
52 // refer to README to build package
53 // or
54 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlts
55
cdac6043 56 //if ( fMakeStats ) AliHLTScalars scalars;
57 //AliHLTScalars scalars;
2e2fdcf2 58// fClusterReader = new AliHLTCaloClusterReader();
59// fClustersRefs = new TRefArray();
5d8d9319 60
61}
62
63
64AliHLTTriggerEmcalElectron::~AliHLTTriggerEmcalElectron() {
65 // see header file for class documentation
2e2fdcf2 66// if (fClusterReader)
67// delete fClusterReader;
68// fClusterReader = NULL;
69//
70// if(fClustersRefs)
71// delete fClustersRefs;
72// fClustersRefs = NULL;
5d8d9319 73}
74
75//Trigger name
76const char* AliHLTTriggerEmcalElectron::GetTriggerName() const {
77 // see header file for class documentation
78 return "EmcalElectronTrigger";
79}
80
8ffa7c29 81AliHLTComponent* AliHLTTriggerEmcalElectron::Spawn() {
82 // see header file for class documentation
2e2fdcf2 83 return new AliHLTTriggerEmcalElectron;
8ffa7c29 84}
5d8d9319 85
86Int_t AliHLTTriggerEmcalElectron::DoTrigger() {
87 // see header file for class documentation
88
89 Int_t iResult = 0;
cdac6043 90 AliHLTScalars scalars;
5d8d9319 91
92 if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) )
93 return 0;
94
95 //Try the caloclusterstruct input
96
97/*
98 for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(fInputDataType); pBlock!=NULL; pBlock=GetNextInputBlock()) {
99 AliHLTCaloClusterHeaderStruct *caloClusterHeader = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(pBlock->fPtr);
100 fClusterReader->SetMemory(caloClusterHeader);
101
102 AliHLTCaloClusterDataStruct * caloClusterStruct;
103 while( (caloClusterStruct = fClusterReader->NextCluster()) != 0) {
104 if (TriggerOnEoverP(caloClusterStruct)) {
105 return iResult;
106 }
107 }
108 }*/
109
110 //Try the ESD input
111 const TObject* obj = GetFirstInputObject(kAliHLTAllDataTypes, "AliESDEvent");
112 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(const_cast<TObject*>(obj));
113
114 if (esd != NULL) {
115 esd->GetStdContent();
116
2e2fdcf2 117// Int_t ncc = GetClustersFromEsd(esd, fClustersRefs); //marcel test
118 Int_t ncc = esd->GetNumberOfCaloClusters();
119// Int_t ncc = GetClustersFromEsd(esd, fClustersRefs);
5d8d9319 120
121 for (Int_t i = 0; i < ncc ; i++) {
122
2e2fdcf2 123// AliESDCaloCluster * cluster = static_cast<AliESDCaloCluster*>(fClustersRefs->At(i));
124 AliVCluster *cluster = (AliVCluster*) esd->GetCaloCluster(i); //MARCEL test
5d8d9319 125 if(TriggerOnEoverP(cluster,esd)) {
126 return iResult;
127 }
128 }
129 }
130
131 // If we got to this point then we did not find any clusters with E > fEThreshold
132 // generate negative trigger decision
133 TString description;
134 description.Form("No %s clusters corresponding to Energy > %.02f GeV and %.02f < E/P < %.02f", fDetector.Data(),fEThreshold,fEoverPThreshold,fEoverPLimit);
135 SetDescription(description.Data());
136 TriggerEvent(false);
c9b754b8 137
138 if ( fMakeStats ) iResult = PushBack(&scalars, kAliHLTDataTypeEventStatistics|kAliHLTDataOriginHLT);
5d8d9319 139 return iResult;
140
141}
142
143
144template <class T>
145Bool_t AliHLTTriggerEmcalElectron::TriggerOnEoverP(T* cluster,AliESDEvent *esd) {
146
cdac6043 147 AliHLTScalars scalars;
148
2e2fdcf2 149 if (cluster->E() > fEThreshold) {
150
5d8d9319 151 Int_t trackindex=cluster->GetTrackMatchedIndex();
152 if(trackindex<0)return kFALSE;
c9b754b8 153
2e2fdcf2 154 Double_t dEta=cluster->GetTrackDz();
155 Double_t dPhi=cluster->GetTrackDx();
c9b754b8 156
5d8d9319 157 AliESDtrack* track = esd->GetTrack(trackindex);
158 if(!track)return kFALSE;
159 Double_t EoverP=cluster->E()/track->P();
c9b754b8 160
161 if ( fMakeStats ) {
162 Double_t deltaR=TMath::Sqrt(dEta*dEta+dPhi*dPhi);
163 scalars.Add("dR","Residuals dR of track matching", deltaR);
164 scalars.Add("dEta","Residuals dEta of track matching", dEta);
165 scalars.Add("dPhi","Residuals dPhi of track matching", dPhi);
166 }
167
168 if(TMath::Abs(dEta)>fdEta)return kFALSE;
169 if(TMath::Abs(dPhi)>fdPhi)return kFALSE;
5d8d9319 170
c9b754b8 171 if ( fMakeStats ) {
172 scalars.Add("TracksPt","TPC tracks pT", track->Pt());
173 scalars.Add("ClusterEn","Cluster Energy",cluster->E());
174 scalars.Add("EoverP","EoverP for matched tracks",EoverP);
175 }
176
177 if(EoverP<fEoverPThreshold)return kFALSE;
178 if(EoverP>fEoverPLimit)return kFALSE;
179
180 //We have a cluster satisfying trigger criteria
5d8d9319 181 TString description;
2e2fdcf2 182 description.Form("Event contains at least one %s cluster with energy greater than %.02f corresponding to %.02f < E/P < %.02f, residuals: dPhi < %.02f dEta < %.02f", fDetector.Data(),fEThreshold,fEoverPThreshold,fEoverPLimit,fdPhi,fdEta);
5d8d9319 183 SetDescription(description.Data());
184
5d8d9319 185 // Enable the detectors for readout.
186
187 //GetReadoutList().Enable(AliHLTReadoutList::kPHOS);
188// SetCaloReadoutList("EMCAL"); //FR
2e2fdcf2 189// SetCaloReadoutList(); //FR
190
5d8d9319 191 // Add the available HLT information for readout too.
192 GetTriggerDomain().Add(kAliHLTAnyDataTypeID, fDetector.Data());
193
194 //Set trigger decision
195 TriggerEvent(kTRUE);
196
197 return kTRUE;
198 }
199
200
201 return kFALSE;
202
203}
204
205int AliHLTTriggerEmcalElectron::DoInit(int argc, const char** argv) {
206 // see header file for class documentation
2e2fdcf2 207// return 0;// marcel test
5d8d9319 208 // first configure the default
209 int iResult=ConfigureFromCDBTObjString(fOCDBEntry);
210
211 // configure from the command line parameters if specified
212 if (iResult>=0 && argc>0) {
213 iResult=ConfigureFromArgumentString(argc, argv);
2e2fdcf2 214 HLTImportant("Trigger threshold set from argument string: %.02f GeV: E/P:%.02f and %.02f, residuals: dPhi:%.02f dEta:%.02f", fDetector.Data(),fEThreshold,fEoverPThreshold,fEoverPLimit,fdPhi,fdEta);
5d8d9319 215 } else if ( iResult >=0 ) {
2e2fdcf2 216 HLTImportant("Trigger threshold set from OCDB database entry: %.02f GeV: E/P:%.02f and %.02f, residuals: dPhi:%.02f dEta:%.02f", fDetector.Data(),fEThreshold,fEoverPThreshold,fEoverPLimit,fdPhi,fdEta);
5d8d9319 217 }
218 return iResult;
219}
220
221int AliHLTTriggerEmcalElectron::DoDeinit() {
222
223 // see header file for class documentation
224
225 return 0;
226}
227
228int AliHLTTriggerEmcalElectron::Reconfigure(const char* cdbEntry, const char* /*chainId*/) {
229 // see header file for class documentation
230
231 // configure from the specified antry or the default one
232 const char* entry=cdbEntry;
233 if (!entry || entry[0]==0) entry=fOCDBEntry;
234
235 return ConfigureFromCDBTObjString(entry);
236}
237
238int AliHLTTriggerEmcalElectron::ScanConfigurationArgument(int argc, const char** argv) {
239 // see header file for class documentation
240 if (argc<=0) return 0;
2e2fdcf2 241 int i=0;
5d8d9319 242 TString argument=argv[i];
243
244 // -maxpt
245 if (argument.CompareTo("-energy")==0) {
246 if (++i>=argc) return -EPROTO;
247 argument=argv[i];
248 fEThreshold=argument.Atof(); //
249 return 2;
250 }
251
252 if (argument.CompareTo("-minEoverP")==0) {
253 if (++i>=argc) return -EPROTO;
254 argument=argv[i];
255 fEoverPThreshold=argument.Atof(); //
256 return 2;
257 }
258
259 if (argument.CompareTo("-maxEoverP")==0) {
260 if (++i>=argc) return -EPROTO;
261 argument=argv[i];
262 fEoverPLimit=argument.Atof(); //
263 return 2;
2e2fdcf2 264 }
265
266 if (argument.CompareTo("-dEta")==0) {
267 if (++i>=argc) return -EPROTO;
268 argument=argv[i];
269 fdEta=argument.Atof(); //
270 return 2;
5d8d9319 271 }
2e2fdcf2 272
273 if (argument.CompareTo("-dPhi")==0) {
274 if (++i>=argc) return -EPROTO;
275 argument=argv[i];
276 fdPhi=argument.Atof(); //
277 return 2;
278 }
279
c9b754b8 280 if (argument.CompareTo("-makestats")==0) {
281 fMakeStats = kTRUE;
282 return 2;
283 }
284
2e2fdcf2 285// unknown argument
5d8d9319 286 return -EINVAL;
287}
288
c9b754b8 289//______________________________________________________________
290
291void AliHLTTriggerEmcalElectron::GetOutputDataTypes(AliHLTComponentDataTypeList &list) const {
292 // return the output data types generated
293
294 list.push_back(kAliHLTDataTypeTriggerDecision);
295 list.push_back(kAliHLTDataTypeEventStatistics|kAliHLTDataOriginHLT);
296}
297//_______________________________________________________________
298//
5d8d9319 299void AliHLTTriggerEmcalElectron::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier) {
300 // see header file for documentation
301 constBase = sizeof(AliHLTTriggerDecision) + sizeof(AliHLTDomainEntry)*14;
302 inputMultiplier = 1;
303}
304
305
306void AliHLTTriggerEmcalElectron::GetOCDBObjectDescription( TMap* const targetMap) {
2e2fdcf2 307
5d8d9319 308 // Get a list of OCDB object description.
309 if (!targetMap) return;
310 targetMap->Add(new TObjString(fOCDBEntry),
311 new TObjString(Form("%s threshold trigger OCDB object", fDetector.Data()) )
312 );
313}
8ffa7c29 314
315