1 /**************************************************************************
\r
2 * This file is property of and copyright by the ALICE HLT Project *
\r
3 * All rights reserved. *
\r
4 * INFN Laboratori Nazionali di Frascati *
\r
5 * Primary Authors: Federico Ronchetti *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
17 * @file AliHLTEMCALRawHistoMaker.cxx
\r
18 * @author Federico Ronchetti
\r
20 * @brief Histogram maker/pusher for EMCAL HLT
\r
24 #include "AliHLTEMCALRawHistoMaker.h"
\r
25 #include "AliHLTEMCALConstants.h"
\r
26 #include "AliHLTEMCALMapper.h"
\r
27 #include "AliHLTCaloChannelDataStruct.h"
\r
28 #include "AliHLTCaloChannelDataHeaderStruct.h"
\r
29 #include "AliHLTCaloSharedMemoryInterfacev2.h"
\r
30 //#include "AliHLTCaloRawAnalyzer.h"
\r
31 #include "AliCaloRawAnalyzer.h"
\r
32 #include "AliCaloBunchInfo.h"
\r
33 #include "AliCaloFitResults.h"
\r
35 ClassImp(AliHLTEMCALRawHistoMaker);
\r
37 AliHLTEMCALRawHistoMaker::AliHLTEMCALRawHistoMaker():
\r
38 AliHLTCaloConstantsHandler("EMCAL"),
\r
41 fRawCounterMemoryPtr(0),
\r
42 fAltroRawStreamPtr(0),
\r
44 fSTURawStreamPtr(0),
\r
46 fEMCALConstants(NULL),
48 fChannelEMap(0), fChannelTMap(0), fChannelETMap(0), h2DTRU(0), h2DSTU(0)
\r
51 // See header file for documentation
\r
53 fShmPtr = new AliHLTCaloSharedMemoryInterfacev2("EMCAL");
\r
55 fRawCounterMemoryPtr = new AliRawReaderMemory();
\r
57 fAltroRawStreamPtr = new AliAltroRawStreamV3(fRawCounterMemoryPtr);
\r
59 fRawStreamPtr = new AliCaloRawStreamV3(fRawCounterMemoryPtr, "EMCAL");
\r
61 fSTURawStreamPtr = new AliEMCALTriggerSTURawStream(fRawCounterMemoryPtr);
\r
63 fEMCALConstants = new AliHLTEMCALConstants();
66 // Booking sample histograms
\r
71 hList = new TObjArray;
\r
73 fChannelEMap = new TProfile2D *[fCaloConstants->GetNMODULES()];
\r
74 fChannelTMap = new TProfile2D *[fCaloConstants->GetNMODULES()];
\r
75 fChannelETMap = new TH2F *[fCaloConstants->GetNMODULES()];
\r
77 h2DTRU = new TH2I ("h2DTRU","",24,0,24,4,0,4);
\r
80 h2DSTU = new TH2I ("h2DSTU","",24,0,24,4,0,4);
\r
84 for (int i=0; i<fCaloConstants->GetNMODULES(); i++) {
\r
85 sprintf(title, "E(X vs Z): SM %d ", i);
\r
86 sprintf(id, "fChannelEMap%d", i);
\r
87 fChannelEMap[i] = new TProfile2D(id,title,48 ,0, 47, 24, 0, 23);
\r
89 hList->Add(fChannelEMap[i]);
\r
91 sprintf(title, "T(X vs Z): SM %d ", i);
\r
92 sprintf(id, "fChannelTMap%d", i);
\r
93 fChannelTMap[i] = new TProfile2D(id,title,48 ,0, 47, 24, 0, 23);
\r
95 hList->Add(fChannelTMap[i]);
\r
97 printf(title, "(E vs T): SM %d ", i);
\r
98 sprintf(id, "fChannelETMap%d", i);
\r
99 fChannelETMap[i] = new TH2F(id,title,100 ,0, 50, 100, 0, 500);
\r
101 hList->Add(fChannelETMap[i]);
\r
107 AliHLTEMCALRawHistoMaker::~AliHLTEMCALRawHistoMaker()
\r
109 //See header file for documentation
\r
112 // Pointer for histograms objects
\r
113 TObjArray* AliHLTEMCALRawHistoMaker::GetHistograms()
\r
120 AliHLTEMCALRawHistoMaker::MakeHisto(AliHLTCaloChannelDataHeaderStruct* channelDataHeader,
\r
121 const AliHLTComponentBlockData* iter, AliHLTUInt8_t* outputPtr,
\r
122 const AliHLTUInt32_t size, int beverbose)
\r
125 Int_t crazyness = 0;
\r
126 Int_t nSamples = 0;
\r
127 Short_t channelCount = 0;
\r
129 AliHLTCaloCoordinate coord;
130 AliHLTCaloChannelDataStruct* currentchannel = 0;
\r
131 fShmPtr->SetMemory(channelDataHeader);
\r
133 AliHLTCaloChannelDataHeaderStruct *channelDataHeaderPtr = reinterpret_cast<AliHLTCaloChannelDataHeaderStruct*>(outputPtr);
\r
134 AliHLTCaloChannelDataStruct *channelDataPtr = reinterpret_cast<AliHLTCaloChannelDataStruct*>(outputPtr+sizeof(AliHLTCaloChannelDataHeaderStruct));
\r
136 fRawCounterMemoryPtr->SetMemory( reinterpret_cast<UChar_t*>( iter->fPtr ), static_cast<ULong_t>( iter->fSize ) );
\r
137 fRawCounterMemoryPtr->SetEquipmentID( fMapperPtr->GetDDLFromSpec( iter->fSpecification) + fCaloConstants->GetDDLOFFSET() );
\r
138 fRawCounterMemoryPtr->Reset();
\r
140 //fRawCounterMemoryPtr->NextEvent();
\r
142 //--- from STU macro
\r
143 //while ( rawReader->NextEvent() )
\r
145 while (fRawCounterMemoryPtr->NextEvent())
\r
147 fRawCounterMemoryPtr->Reset();
\r
148 fRawCounterMemoryPtr->Select("EMCAL",44);
\r
150 const UInt_t* evtId = fRawCounterMemoryPtr->GetEventId();
\r
151 int evno_raw = (int)evtId[0];
\r
153 UInt_t eventType = fRawCounterMemoryPtr->GetType();
\r
156 cout << "I-RAWHISTOMAKER: event type: " << eventType << endl;
\r
158 // if (eventType != AliRawEventHeaderBase::kPhysicsEvent) continue;
\r
160 // fRawCounterMemoryPtr->DumpData();
\r
162 // fRawCounterMemoryPtr->Reset();
\r
164 fSTURawStreamPtr->ReadPayLoad();
\r
165 // fSTURawStreamPtr->DumpPayLoad("ALL");
\r
169 for (Int_t i=0;i<96;i++)
\r
172 fSTURawStreamPtr->GetADC(29, adc);
\r
174 for (Int_t i=0;i<96;i++)
\r
179 h2DSTU->Fill( x , y , adc[i] );
\r
182 fRawCounterMemoryPtr->Reset();
\r
183 fRawCounterMemoryPtr->Select("EMCAL",0,43);
\r
185 while (fRawStreamPtr->NextDDL())
\r
187 Int_t iRCU = fRawStreamPtr->GetDDLNumber() % 2;
\r
189 while (fRawStreamPtr->NextChannel())
\r
191 Int_t iSM = fRawStreamPtr->GetModule();
\r
193 Int_t iTRUId = 3 * iSM + iRCU * fRawStreamPtr->GetBranch() + iRCU;
\r
197 Int_t nsamples = 0;
\r
198 vector<AliCaloBunchInfo> bunchlist;
\r
199 while (fRawStreamPtr->NextBunch())
\r
201 nsamples += fRawStreamPtr->GetBunchLength();
\r
202 bunchlist.push_back( AliCaloBunchInfo(fRawStreamPtr->GetStartTimeBin(), fRawStreamPtr->GetBunchLength(), fRawStreamPtr->GetSignals() ) );
\r
207 for (std::vector<AliCaloBunchInfo>::iterator itVectorData = bunchlist.begin(); itVectorData != bunchlist.end(); itVectorData++)
\r
209 AliCaloBunchInfo bunch = *(itVectorData);
\r
211 const UShort_t* sig = bunch.GetData();
\r
212 Int_t startBin = bunch.GetStartBin();
\r
214 for (Int_t iS = 0; iS < bunch.GetLength(); iS++)
\r
216 if ( sig[iS] > max ) max = sig[iS];
\r
220 if (nsamples) // this check is needed for when we have zero-supp. on, but not sparse readout
\r
222 if (fRawStreamPtr->IsTRUData() && fRawStreamPtr->GetColumn() < 96)
\r
226 Int_t x = fRawStreamPtr->GetColumn() / 4;
\r
227 Int_t y = fRawStreamPtr->GetColumn() % 4;
\r
229 h2DTRU->Fill( x , y , max );
\r
238 // h2DTRU->Draw("TEXT");
\r
241 // h2DSTU->Draw("TEXT");
\r
245 // h2DTRU->Reset();
\r
246 // h2DSTU->Reset();
\r
253 //------ old stuff to be removed or re-utilized
\r
254 //fRawDataWriter->NewEvent( );
\r
256 if(fAltroRawStreamPtr->NextDDL())
\r
261 while( fAltroRawStreamPtr->NextChannel() )
\r
263 // cout << __FILE__ << ":" << __LINE__ << ":" <<__FUNCTION__ << "T3" << endl;
\r
264 if( fAltroRawStreamPtr->GetHWAddress() < 128 || ( fAltroRawStreamPtr->GetHWAddress() ^ 0x800) < 128 )
\r
271 UShort_t* firstBunchPtr = 0;
\r
272 int chId = fMapperPtr->GetChannelID(iter->fSpecification, fAltroRawStreamPtr->GetHWAddress());
\r
273 //HLTError("Channel HW address: %d", fAltroRawStreamPtr->GetHWAddress());
\r
276 //cout << fRawStreamPtr->GetCaloFlag() << endl;
\r
279 vector <AliCaloBunchInfo> bvctr;
\r
280 while( fAltroRawStreamPtr->NextBunch() == true )
\r
282 bvctr.push_back( AliCaloBunchInfo( fAltroRawStreamPtr->GetStartTimeBin(), fAltroRawStreamPtr->GetBunchLength(), fAltroRawStreamPtr->GetSignals() ) );
\r
284 nSamples = fAltroRawStreamPtr->GetBunchLength();
\r
287 // fRawDataWriter->WriteBunchData( fAltroRawStreamPtr->GetSignals(), nSamples, fAltroRawStreamPtr->GetEndTimeBin() );
\r
288 firstBunchPtr = const_cast< UShort_t* >( fAltroRawStreamPtr->GetSignals() );
\r
294 // fAnalyzerPtr->SetData( firstBunchPtr, nSamples);
\r
295 AliCaloFitResults res = fAnalyzerPtr->Evaluate( bvctr, fAltroRawStreamPtr->GetAltroCFG1(), fAltroRawStreamPtr->GetAltroCFG2() );
\r
297 HLTDebug("Channel energy: %f, max sig: %d, gain = %d, x = %d, z = %d", res.GetAmp(), res.GetMaxSig(), (chId >> 12)&0x1, chId&0x3f, (chId >> 6)&0x3f);
\r
299 // if(fAnalyzerPtr->GetTiming() > fMinPeakPosition && fAnalyzerPtr->GetTiming() < fMaxPeakPosition)
\r
301 channelDataPtr->fChannelID = chId;
\r
302 channelDataPtr->fEnergy = static_cast<Float_t>( res.GetAmp() ) - fOffset;
\r
304 channelDataPtr->fTime = static_cast<Float_t>( res.GetTof() );
\r
305 channelDataPtr->fCrazyness = static_cast<Short_t>(crazyness);
\r
307 channelDataPtr++; // Updating position of the free output.
\r
314 //fRawDataWriter->NewChannel();
\r
320 currentchannel = fShmPtr->NextChannel();
\r
322 while(currentchannel != 0) {
\r
324 AliHLTCaloChannelRawDataStruct rawdata = fShmPtr->GetRawData();
\r
326 fMapperPtr->ChannelId2Coordinate(currentchannel->fChannelID, coord);
328 fChannelTMap[coord.fModuleId]->Fill( coord.fZ, coord.fX , currentchannel->fTime);
\r
329 fChannelEMap[coord.fModuleId]->Fill( coord.fZ, coord.fX , currentchannel->fEnergy);
\r
330 fChannelETMap[coord.fModuleId]->Fill(currentchannel->fEnergy, currentchannel->fTime);
\r
332 currentchannel = fShmPtr->NextChannel(); // Get the next channel
\r