]>
Commit | Line | Data |
---|---|---|
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 */ |
32 | ClassImp(AliHLTTriggerEmcalElectron) | |
33 | ||
34 | AliHLTTriggerEmcalElectron::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 | ||
64 | AliHLTTriggerEmcalElectron::~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 | |
76 | const char* AliHLTTriggerEmcalElectron::GetTriggerName() const { | |
77 | // see header file for class documentation | |
78 | return "EmcalElectronTrigger"; | |
79 | } | |
80 | ||
8ffa7c29 | 81 | AliHLTComponent* AliHLTTriggerEmcalElectron::Spawn() { |
82 | // see header file for class documentation | |
2e2fdcf2 | 83 | return new AliHLTTriggerEmcalElectron; |
8ffa7c29 | 84 | } |
5d8d9319 | 85 | |
86 | Int_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 | ||
144 | template <class T> | |
145 | Bool_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 | ||
205 | int 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 | ||
221 | int AliHLTTriggerEmcalElectron::DoDeinit() { | |
222 | ||
223 | // see header file for class documentation | |
224 | ||
225 | return 0; | |
226 | } | |
227 | ||
228 | int 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 | ||
238 | int 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 | ||
291 | void 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 | 299 | void 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 | ||
306 | void 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 |