751dc9273514796ad2bf121fa8e0d65ae7a92d54
[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 <iostream>
18 #include "AliHLTPHOSRcuCellEnergyDataStruct.h"
19 #include "AliHLTPHOSRcuHistogramProducer.h"
20 #include "AliHLTPHOSRcuHistogramProducerComponent.h"
21 #include "AliHLTPHOSRcuCellAccumulatedEnergyDataStruct.h"
22
23
24 AliHLTPHOSRcuHistogramProducerComponent gAliHLTPHOSRcuHistogramProducerComponent;
25
26
27
28 /*************************************************************************
29 * Class AliHLTPHOSRcuHistogramProducerComponent accumulating histograms  *
30 * with amplitudes per PHOS channel                                       *
31 * It is intended to run at the HLT farm                                  *
32 * and it fills the histograms with amplitudes per channel.               * 
33 * Usage example see in PHOS/macros/Shuttle/AliPHOSCalibHistoProducer.C   *
34 **************************************************************************/
35 AliHLTPHOSRcuHistogramProducerComponent:: AliHLTPHOSRcuHistogramProducerComponent():AliHLTPHOSProcessor(), fRcuHistoProducerPtr(0)
36 {
37   //Default constructor
38
39
40
41 AliHLTPHOSRcuHistogramProducerComponent::~ AliHLTPHOSRcuHistogramProducerComponent()
42 {
43   //Destructor
44 }
45
46
47 AliHLTPHOSRcuHistogramProducerComponent::AliHLTPHOSRcuHistogramProducerComponent(const  AliHLTPHOSRcuHistogramProducerComponent & ) : AliHLTPHOSProcessor(), fRcuHistoProducerPtr(0)
48 {
49
50 }
51
52
53 int 
54 AliHLTPHOSRcuHistogramProducerComponent::Deinit()
55 {
56   //See html documentation of base class
57   cout << "AliHLTPHOSRcuHistogramProducerComponent::Deinit()" << endl;
58   fRcuHistoProducerPtr->WriteEnergyHistograms();
59   return 0;
60 }
61
62
63 const char* 
64 AliHLTPHOSRcuHistogramProducerComponent::GetComponentID()
65 {
66   //See html documentation of base class
67   return "RcuHistogramProducer";
68 }
69
70
71 void
72 AliHLTPHOSRcuHistogramProducerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
73 {
74   //See html documentation of base class
75   const AliHLTComponentDataType* pType=fgkInputDataTypes;
76   while (pType->fID!=0) 
77     {
78       list.push_back(*pType);
79       pType++;
80     }
81 }
82
83
84 AliHLTComponentDataType 
85 AliHLTPHOSRcuHistogramProducerComponent::GetOutputDataType()
86 {
87   //See html documentation of base class  
88   return AliHLTPHOSDefinitions::fgkCellEnergyDataType;
89 }
90
91
92 void
93 AliHLTPHOSRcuHistogramProducerComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier )
94 {
95   //See html documentation of base class
96   constBase = 30;
97   inputMultiplier = 1;
98 }
99
100
101 int  AliHLTPHOSRcuHistogramProducerComponent::DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks, 
102                                               AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr, 
103                                               AliHLTUInt32_t& size, vector<AliHLTComponentBlockData>& outputBlocks )
104 {
105   //See html documentation of base class
106   unsigned long ndx       = 0;
107   UInt_t offset           = 0; 
108   UInt_t mysize           = 0;
109   UInt_t tSize            = 0;
110   const AliHLTComponentBlockData* iter = NULL;   
111   AliHLTPHOSRcuCellEnergyDataStruct *cellDataPtr;
112   AliHLTUInt8_t* outBPtr;
113   int tmpCnt;
114
115   for( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
116     {
117       iter = blocks+ndx;
118       cellDataPtr = (AliHLTPHOSRcuCellEnergyDataStruct*)( iter->fPtr);
119       tmpCnt =  cellDataPtr->fCnt;
120
121       for(int i= 0; i <= tmpCnt; i ++)
122         {
123           fRcuHistoProducerPtr->FillEnergy(cellDataPtr->fValidData[i].fX,
124                                            cellDataPtr->fValidData[i].fZ, 
125                                            cellDataPtr->fValidData[i].fGain, 
126                                            cellDataPtr->fValidData[i].fEnergy);
127         }
128     }
129   
130   outBPtr = outputPtr;
131   fOutPtr =  (AliHLTPHOSRcuCellAccumulatedEnergyDataStruct*)outBPtr;
132   const AliHLTPHOSRcuCellAccumulatedEnergyDataStruct  &innPtr = fRcuHistoProducerPtr->GetCellAccumulatedEnergies();
133
134   fOutPtr->fModuleID = fModuleID;
135   fOutPtr->fRcuX     = fRcuX;
136   fOutPtr->fRcuZ     = fRcuZ;
137
138
139   for(int x=0; x < N_XCOLUMNS_RCU; x ++)
140     {
141       for(int z=0; z < N_XCOLUMNS_RCU; z ++)
142         {
143           for(int gain =0;  gain < N_GAINS; gain ++)
144             {
145               fOutPtr->fAccumulatedEnergies[x][z][gain] = innPtr.fAccumulatedEnergies[x][z][gain];
146               fOutPtr->fHits[x][z][gain] = innPtr.fHits[x][z][gain];
147             }
148         }
149     }
150
151
152   //pushing data to shared output memory
153   mysize += sizeof(AliHLTPHOSRcuCellAccumulatedEnergyDataStruct);
154   AliHLTComponentBlockData bd;
155   FillBlockData( bd );
156   bd.fOffset = offset;
157   bd.fSize = mysize;
158   bd.fDataType = AliHLTPHOSDefinitions::fgkCellAccumulatedEnergyDataType;
159   bd.fSpecification = 0xFFFFFFFF;
160   outputBlocks.push_back( bd );
161   tSize += mysize;
162   outBPtr += mysize;
163
164   if( tSize > size )
165     {
166       Logging( kHLTLogFatal, "HLT::AliHLTRcuHistogramProducerComponent::DoEvent", "Too much data",
167                "Data written over allowed buffer. Amount written: %lu, allowed amount: %lu."
168                , tSize, size );
169       return EMSGSIZE;
170     }
171
172   fPhosEventCount++; 
173   return 0;
174   
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
187   if(fIsSetEquippmentID == kFALSE)
188     {
189       Logging( kHLTLogFatal, "HLT::AliHLTPHOSRcuHistogramProducerComponent::DoInt( int argc, const char** argv )", "Missing argument",
190                "The argument equippmentID is not set: set it with a component argumet like this: -equippmentID  <number>");
191       iResult = -2; 
192     }
193   fRcuHistoProducerPtr = new AliHLTPHOSRcuHistogramProducer( fModuleID, fRcuX, fRcuZ);
194
195   return iResult; 
196   
197 }
198
199
200 AliHLTComponent*
201 AliHLTPHOSRcuHistogramProducerComponent::Spawn()
202 {
203   //See html documentation of base class
204   return new AliHLTPHOSRcuHistogramProducerComponent;
205 }
206
207