1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * ALICE Experiment at CERN, All rights reserved. *
5 * Primary Authors: Svein Lindal <slindal@fys.uio.no > *
6 * for The ALICE HLT Project. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 /// @file AliHLTEveCalo.cxx
18 /// @author Svein Lindal <slindal@fys.uio.no>
19 /// @brief Calorimeter base class for the HLT EVE display
21 #include "TCollection.h"
22 #include "TObjArray.h"
23 #include "AliHLTEveCalo.h"
24 #include "AliHLTHOMERBlockDesc.h"
26 #include "AliHLTEveBase.h"
27 #include "TEveBoxSet.h"
28 #include "AliPHOSGeometry.h"
30 #include "AliEveHLTEventManager.h"
31 #include "TEveManager.h"
32 #include "AliHLTCaloDigitDataStruct.h"
33 #include "AliHLTCaloClusterDataStruct.h"
34 #include "AliHLTCaloClusterReader.h"
35 #include "TEveTrans.h"
39 #include "TRefArray.h"
40 #include "AliESDEvent.h"
41 #include "AliESDCaloCluster.h"
43 ClassImp(AliHLTEveCalo);
45 AliHLTEveCalo::AliHLTEveCalo(Int_t nm, TString name) :
48 fBoxSetClusters(NULL),
60 fPadTitles = new TString[GetMaxHistograms()];
62 for(int i = 0; i < GetMaxHistograms(); i++) {
66 fClustersArray = new TRefArray();
67 fClusterReader = new AliHLTCaloClusterReader();
74 AliHLTEveCalo::~AliHLTEveCalo()
82 delete fBoxSetClusters;
83 fBoxSetClusters = NULL;
92 delete fClusterReader;
93 fClusterReader = NULL;
98 void AliHLTEveCalo::ProcessBlock(AliHLTHOMERBlockDesc * block) {
99 //See header file for documentation
101 if ( block->GetDataType().CompareTo("ROOTHIST") == 0 ) {
102 ProcessHistogram(block);
107 if ( block->GetDataType().CompareTo("CALOCLUS") == 0 ){
108 //cout <<"Skipping calo clusters"<<endl;
109 ProcessClusters( block );
110 } else if ( block->GetDataType().CompareTo("DIGITTYP") == 0 ) {
111 //ProcessDigits( block);
113 } else if ( block->GetDataType().CompareTo("CHANNELT") == 0 ) {
114 //ProcessClusters( block );
115 } else if (!block->GetDataType().CompareTo("ALIESDV0")) {
116 ProcessEsdBlock(block);
121 void AliHLTEveCalo::ProcessHistogram(AliHLTHOMERBlockDesc * block ) {
122 //See header file for documentation
125 fCanvas = CreateCanvas(Form("%s QA", fName.Data()), Form("%s QA", fName.Data()));
126 fCanvas->Divide(3, 3);
129 if(!fInvMassCanvas) {
130 fInvMassCanvas = CreateCanvas(Form("%s IM", fName.Data()), Form("%s IM", fName.Data()));
131 fInvMassCanvas->Divide(3, 2);
135 AddHistogramsToCanvas(block, fCanvas, fHistoCount);
141 // void AliHLTEveCalo::ProcessDigits(AliHLTHOMERBlockDesc* block) {
142 // //See header file for documentation
144 // AliHLTCaloDigitDataStruct *ds = reinterpret_cast<AliHLTCaloDigitDataStruct*> (block->GetData());
145 // UInt_t nDigits = block->GetSize()/sizeof(AliHLTCaloDigitDataStruct);
148 // for(UInt_t i = 0; i < nDigits; i++, ds++) {
150 // Float_t x = (ds->fX - 32)* 2.2;
151 // Float_t z = (ds->fZ - 28) * 2.2;
154 // fBoxSetDigits[4-ds->fModule].AddBox(x, 0, z, 2.2, ds->fEnergy*200, 2.2);
155 // fBoxSetDigits[4-ds->fModule].DigitValue(static_cast<Int_t>(ds->fEnergy*10));
160 void AliHLTEveCalo::ProcessEsdBlock(AliHLTHOMERBlockDesc * block) {
161 AliESDEvent * event = dynamic_cast<AliESDEvent*>(block->GetTObject());
165 cout << "problem getting the event!"<<endl;
170 void AliHLTEveCalo::ProcessEvent(AliESDEvent * event) {
171 //see header file for documentation
175 Int_t nClusters = GetClusters(event, fClustersArray);
176 for(int ic = 0; ic < nClusters; ic++) {
177 AliESDCaloCluster * cluster = dynamic_cast<AliESDCaloCluster*>(fClustersArray->At(ic));
178 ProcessESDCluster(cluster);
184 void AliHLTEveCalo::ProcessClusters(AliHLTHOMERBlockDesc* block) {
185 //See header file for documentation
187 AliHLTCaloClusterHeaderStruct *dh = reinterpret_cast<AliHLTCaloClusterHeaderStruct*> (block->GetData());
188 fClusterReader->SetMemory(dh);
190 AliHLTCaloClusterDataStruct * ds;
192 while( (ds = fClusterReader->NextCluster()) ){
193 AddClusters(ds->fGlobalPos, ds->fModule, ds->fEnergy);
196 AliHLTCaloDigitDataStruct *dg = fClusterReader->GetDigits();
197 UInt_t nDigits = fClusterReader->GetNDigits();;
198 for(UInt_t i = 0; i < nDigits; i++, dg++) {
199 AddDigits(dg->fX, dg->fZ, dg->fModule, dg->fEnergy);
203 void AliHLTEveCalo::UpdateElements() {
204 //See header file for documentation
205 if(fCanvas) fCanvas->Update();
206 if(fInvMassCanvas) fInvMassCanvas->Update();
210 for(int im = 0; im < fNModules; im++) {
211 fBoxSetDigits[im].ElementChanged();
215 if(fBoxSetClusters) {
216 for(int im = 0; im < fNModules; im++) {
217 fBoxSetClusters[im].ElementChanged();
223 void AliHLTEveCalo::ResetElements(){
224 //See header file for documentation
227 if ( fBoxSetDigits ){
228 for(int im = 0; im < fNModules; im++){
229 fBoxSetDigits[im].Reset();
233 if ( fBoxSetClusters ){
234 for(int im = 0; im < fNModules; im++){
235 fBoxSetClusters[im].Reset();
241 Int_t AliHLTEveCalo::GetPadNumber(TString name) {
244 for(int i = 0; i < GetMaxHistograms(); i++) {
245 if (!fPadTitles[i].CompareTo(name)){
248 else if (!fPadTitles[i].CompareTo("")) {
249 //cout <<"in empty title"<<endl;
250 fPadTitles[i] = name;
255 cout << "AliHLTEveCalo()->GetPadNUmber():returning one"<<endl;
260 void AliHLTEveCalo::DrawInvMassHistogram(TH1F * histo) {
262 fInvMassCanvas->cd(++fHistoCount);
264 histo->SetAxisRange(histo->GetXaxis()->GetBinLowEdge(histo->FindFirstBinAbove(0, 1) - 3), histo->GetXaxis()->GetBinUpEdge(histo->FindLastBinAbove(0, 1) + 3), "X");
265 //histo->Fit("gaus", "", "", histo->GetXaxis()->GetBinLowEdge(histo->FindFirstBinAbove(0, 1)), histo->GetXaxis()->GetBinUpEdge(histo->FindLastBinAbove(0, 1)));
271 void AliHLTEveCalo::AddHistogramsToCanvas(AliHLTHOMERBlockDesc * block, TCanvas * canvas, Int_t &/*cdCount*/) {
272 //See header file for documentation
274 if ( ! block->GetClassName().CompareTo("TObjArray")) {
275 TIter next((TObjArray*)(block->GetTObject()));
280 while (( object = (TObject*) next())) {
282 TString name = static_cast<TH1*>(object)->GetName();
283 if(name.Contains("InvMass")){
284 DrawInvMassHistogram(static_cast<TH1F*>(object));
289 Int_t iPad = GetPadNumber(name);
293 //Check if histo is 2D histo
294 TH2F* histo2 = dynamic_cast<TH2F*>(object);
297 Int_t lb = histo2->FindLastBinAbove(0,1);
299 histo2->SetAxisRange(0, histo2->GetXaxis()->GetBinUpEdge(histo2->FindLastBinAbove(0, 1) + 3), "X");
300 histo2->SetAxisRange(0, histo2->GetYaxis()->GetBinUpEdge(histo2->FindLastBinAbove(0, 2) + 3), "Y");
303 histo2->Draw("COLZ");
309 TH1F* histo = dynamic_cast<TH1F*>(object);
312 TString name2 = histo->GetName();
314 if(name2.Contains("Energy")) {
315 histo->SetAxisRange(0, histo->GetXaxis()->GetBinUpEdge(histo->FindLastBinAbove(0, 1) + 3), "X");
321 cout <<"AliHLTEveCaloBase::AddHistogramsTocCanvas: Histogram neither TH1F nor TH2F"<<endl;
327 } else if ( ! block->GetClassName().CompareTo("TH1F")) {
329 TH1F* histo = reinterpret_cast<TH1F*>(block->GetTObject());
332 Int_t iPad = GetPadNumber(histo->GetName());
338 } else if ( ! block->GetClassName().CompareTo("TH2F")) {
340 TH2F *histo = reinterpret_cast<TH2F*>(block->GetTObject());
343 Int_t iPad = GetPadNumber(histo->GetName());