]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/PHOS/AliHLTPHOSRcuHistogramProducerComponent.cxx
completely re-worked TPC CA tracking code (Sergey/Ivan)
[u/mrichter/AliRoot.git] / HLT / PHOS / AliHLTPHOSRcuHistogramProducerComponent.cxx
1 /**************************************************************************
2  * Copyright(c) 2006, ALICE Experiment at CERN, All rights reserved.      *
3  *                                                                        *
4  * Authors: Boris Polichtchouk & Per Thomas Hille for the ALICE           *
5  * offline/HLT Project. Contributors are mentioned in the code where      *
6  * appropriate.                                                           *
7  *                                                                        *
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  **************************************************************************/
16
17 #include "AliHLTPHOSRcuCellEnergyDataStruct.h"
18 #include "AliHLTPHOSRcuHistogramProducer.h"
19 #include "AliHLTPHOSRcuHistogramProducerComponent.h"
20 #include "AliHLTPHOSRcuCellAccumulatedEnergyDataStruct.h"
21 #include "AliHLTPHOSSharedMemoryInterface.h"
22 #include "AliHLTPHOSValidCellDataStruct.h" 
23
24 AliHLTPHOSRcuHistogramProducerComponent gAliHLTPHOSRcuHistogramProducerComponent;
25 /*************************************************************************
26 * Class AliHLTPHOSRcuHistogramProducerComponent accumulating histograms  *
27 * with amplitudes per PHOS channel                                       *
28 * It is intended to run at the HLT farm                                  *
29 * and it fills the histograms with amplitudes per channel.               * 
30 * Usage example see in PHOS/macros/Shuttle/AliPHOSCalibHistoProducer.C   *
31 **************************************************************************/
32 AliHLTPHOSRcuHistogramProducerComponent:: AliHLTPHOSRcuHistogramProducerComponent() :
33   AliHLTPHOSRcuProcessor(), fHistoWriteFrequency(100), fRcuHistoProducerPtr(0), fOutPtr(NULL)
34 {
35   fShmPtr = new AliHLTPHOSSharedMemoryInterface();
36  //Default constructor
37
38
39
40 AliHLTPHOSRcuHistogramProducerComponent::~ AliHLTPHOSRcuHistogramProducerComponent()
41 {
42   //Destructor
43 }
44
45
46 int 
47 AliHLTPHOSRcuHistogramProducerComponent::Deinit()
48 {
49   //See html documentation of base class
50   cout << "AliHLTPHOSRcuHistogramProducerComponent::Deinit()" << endl;
51   fRcuHistoProducerPtr->WriteAllHistograms("recreate");
52   return 0;
53 }
54
55
56 const char* 
57 AliHLTPHOSRcuHistogramProducerComponent::GetComponentID()
58 {
59   //See html documentation of base class
60   return "RcuHistogramProducer";
61 }
62
63
64 void
65 AliHLTPHOSRcuHistogramProducerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
66 {
67   //See html documentation of base class
68   const AliHLTComponentDataType* pType=fgkInputDataTypes;
69   while (pType->fID!=0) 
70     {
71       list.push_back(*pType);
72       pType++;
73     }
74 }
75
76
77 AliHLTComponentDataType 
78 AliHLTPHOSRcuHistogramProducerComponent::GetOutputDataType()
79 {
80   //See html documentation of base class  
81   return AliHLTPHOSDefinitions::fgkCellEnergyDataType;
82 }
83
84
85 void
86 AliHLTPHOSRcuHistogramProducerComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier )
87 {
88   //See html documentation of base class
89   constBase = 30;
90   inputMultiplier = 1;
91 }
92
93
94
95 int  AliHLTPHOSRcuHistogramProducerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks, 
96                                               AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr, 
97                                               AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks )
98 {
99   //See html documentation of base class
100   AliHLTPHOSValidCellDataStruct *currentChannel =0;
101   unsigned long ndx       = 0;
102   UInt_t offset           = 0; 
103   UInt_t mysize           = 0;
104   UInt_t tSize            = 0;
105   const AliHLTComponentBlockData* iter = NULL;   
106   AliHLTPHOSRcuCellEnergyDataStruct *cellDataPtr;
107   AliHLTUInt8_t* outBPtr;
108
109   for( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
110     {
111       iter = blocks+ndx;
112       if(iter->fDataType != AliHLTPHOSDefinitions::fgkCellEnergyDataType)
113         {
114           continue;
115         }
116       
117       cellDataPtr = (AliHLTPHOSRcuCellEnergyDataStruct*)( iter->fPtr);
118       fShmPtr->SetMemory(cellDataPtr);
119       currentChannel = fShmPtr->NextChannel();
120
121       while(currentChannel != 0)
122         {
123           fRcuHistoProducerPtr->FillEnergy(currentChannel->fX, currentChannel->fZ, currentChannel->fGain, currentChannel->fEnergy);
124           fRcuHistoProducerPtr->FillLiveChannels(currentChannel->fData, fNTotalSamples, currentChannel->fX, currentChannel->fZ,currentChannel->fGain);
125           currentChannel = fShmPtr->NextChannel();
126         }
127     }
128
129   outBPtr = outputPtr;
130   fOutPtr =  (AliHLTPHOSRcuCellAccumulatedEnergyDataStruct*)outBPtr;
131   const AliHLTPHOSRcuCellAccumulatedEnergyDataStruct  &innPtr = fRcuHistoProducerPtr->GetCellAccumulatedEnergies();
132   fOutPtr->fModuleID = fModuleID;
133   fOutPtr->fRcuX     = fRcuX;
134   fOutPtr->fRcuZ     = fRcuZ;
135
136   for(unsigned int x=0; x < N_XCOLUMNS_RCU; x ++)
137     {
138       for(unsigned int z=0; z < N_ZROWS_RCU; z ++)
139         {
140           for(unsigned int gain =0;  gain < N_GAINS; gain ++)
141             {
142               fOutPtr->fAccumulatedEnergies[x][z][gain] = innPtr.fAccumulatedEnergies[x][z][gain];
143               fOutPtr->fHits[x][z][gain] = innPtr.fHits[x][z][gain];
144               fOutPtr->fDeadChannelMap[x][z][gain] = innPtr.fDeadChannelMap[x][z][gain];
145             }
146         }
147     }
148
149   mysize += sizeof(AliHLTPHOSRcuCellAccumulatedEnergyDataStruct);
150   AliHLTComponentBlockData bd;
151   FillBlockData( bd );
152   bd.fOffset = offset;
153   bd.fSize = mysize;
154   bd.fDataType = AliHLTPHOSDefinitions::fgkCellAccumulatedEnergyDataType;
155   bd.fSpecification = 0xFFFFFFFF;
156   outputBlocks.push_back( bd );
157   tSize += mysize;
158   outBPtr += mysize;
159
160   if( tSize > size )
161     {
162       Logging( kHLTLogFatal, "HLT::AliHLTRcuHistogramProducerComponent::DoEvent", "Too much data",
163                "Data written over allowed buffer. Amount written: %lu, allowed amount: %lu."
164                , tSize, size );
165       return EMSGSIZE;
166     }
167
168   fPhosEventCount++; 
169
170   if( (fPhosEventCount%fHistoWriteFrequency == 0) &&  ( fPhosEventCount != 0))
171     {
172       fRcuHistoProducerPtr->WriteAllHistograms("recreate");
173     }
174   return 0;
175 }//end DoEvent
176
177
178 int
179 AliHLTPHOSRcuHistogramProducerComponent::DoInit( int argc, const char** argv )
180 {
181   //See html documentation of base class
182   fPrintInfo = kFALSE;
183   int iResult=0;
184   TString argument="";
185   iResult = ScanArguments(argc, argv);
186   if(fIsSetEquippmentID == kFALSE)
187     {
188       Logging( kHLTLogFatal, "HLT::AliHLTPHOSRcuHistogramProducerComponent::DoInt( int argc, const char** argv )", "Missing argument",
189                "The argument equippmentID is not set: set it with a component argumet like this: -equippmentID  <number>");
190       iResult = -2; 
191     }
192   fRcuHistoProducerPtr = new AliHLTPHOSRcuHistogramProducer( fModuleID, fRcuX, fRcuZ);
193   return iResult; 
194   
195 }
196
197
198 AliHLTComponent*
199 AliHLTPHOSRcuHistogramProducerComponent::Spawn()
200 {
201   //See html documentation of base class
202   return new AliHLTPHOSRcuHistogramProducerComponent;
203 }
204
205
206