5 #include <Alieve/TPCSectorData.h>
7 #include <AliSimDigits.h>
8 #include <AliTPCParam.h>
9 #include <AliTPCRawStream.h>
10 #include <AliTPCRawStreamOld.h>
14 using namespace Alieve;
16 //______________________________________________________________________
19 // A central manager for TPC data of an event. Can read digits (from
20 // a tree: LoadDigits()) and raw-data (via AliRawReader: LoadRaw()).
22 // The sector data is stored in 36 TPCSectorData objects.
23 // Sectors 0 - 17: +z side, 18 - 35: -z side.
24 // No separation of inner/outer segments, use row numbers for addressing.
26 // Threshold application and pedestal subtraction can be performed at
27 // load time: use SetLoadThreshold(thresh) and SetLoadPedestal(ped).
29 // For raw-data (loaded using LoadRaw) pedestals can be calculated
30 // automatically per pad. Use SetAutoPedestal(kTRUE) to activate it.
31 // You might still want to set load threshold (default iz zero).
37 fSectors(36), fSectorBlockSize(65536),
38 fLoadThreshold(0), fLoadPedestal(0), fAutoPedestal(kFALSE)
40 TPCSectorData::InitStatics();
48 /**************************************************************************/
50 void TPCData::CreateSector(Int_t sector)
52 if(fSectors[sector] == 0)
53 fSectors[sector] = new TPCSectorData(sector, fSectorBlockSize);
56 void TPCData::CreateAllSectors()
58 for(Int_t s=0; s<36; ++s)
62 void TPCData::DropAllSectors()
64 for(Int_t s=0; s<36; ++s) {
66 fSectors[s]->DropData();
70 void TPCData::DeleteAllSectors()
72 for(Int_t s=0; s<36; ++s) {
78 /**************************************************************************/
80 TPCSectorData* TPCData::GetSectorData(Int_t sector, Bool_t spawnSectors)
82 if(sector < 0 || sector > 35) return 0;
83 if(fSectors[sector] == 0 && spawnSectors)
85 return fSectors[sector];
88 /**************************************************************************/
90 void TPCData::LoadDigits(TTree* tree, Bool_t spawnSectors)
92 // Load data from TTree of AliSimDigits.
93 // If spawnSectors is false only sectors that have been created previously
94 // via CreateSector() are loaded.
95 // If spawnSectors is true sectors are created if data for them is encountered.
97 AliSimDigits digit, *digitPtr = &digit;
98 tree->GetBranch("Segment")->SetAddress(&digitPtr);
100 Int_t sector, row, pad, curPad;
101 Short_t time, signal;
102 Bool_t inFill = kFALSE;
103 TPCSectorData* secData = 0;
105 Int_t numEnt = (Int_t) tree->GetEntries();
106 for (Int_t ent=0; ent<numEnt; ent++) {
108 Alieve::TPCSectorData::GetParam().AdjustSectorRow(digit.GetID(), sector, row);
111 row += TPCSectorData::GetInnSeg().GetNRows();
113 secData = GetSectorData(sector, spawnSectors);
117 if(digit.First() == kFALSE)
121 pad = digit.CurrentColumn();
122 time = digit.CurrentRow();
123 signal = digit.CurrentDigit();
127 secData->EndPad(fAutoPedestal, fLoadThreshold);
128 secData->BeginPad(row, pad, kFALSE);
132 if(signal > fLoadThreshold)
133 secData->RegisterData(time, signal - fLoadPedestal);
135 } while (digit.Next());
137 secData->EndPad(fAutoPedestal, fLoadThreshold);
143 void TPCData::LoadRaw(AliTPCRawStream& input, Bool_t spawnSectors)
145 // Load data from AliTPCRawStream.
146 // If spawnSectors is false only sectors that have been created previously
147 // via CreateSector() are loaded.
148 // If spawnSectors is true sectors are created if data for them is encountered.
150 Int_t sector = -1, row = -1, pad = -1, rowOffset = 0;
151 Short_t time, signal;
152 Bool_t inFill = kFALSE;
153 TPCSectorData* secData = 0;
155 while (input.Next()) {
156 if (input.IsNewSector()) {
158 secData->EndPad(fAutoPedestal, fLoadThreshold);
161 sector = input.GetSector();
164 rowOffset = TPCSectorData::GetInnSeg().GetNRows();
168 secData = GetSectorData(sector, spawnSectors);
173 if (input.IsNewPad()) {
175 secData->EndPad(fAutoPedestal, fLoadThreshold);
178 row = input.GetRow() + rowOffset;
179 pad = input.GetPad();
181 secData->BeginPad(row, pad, kTRUE);
185 time = input.GetTime();
186 signal = input.GetSignal();
188 secData->RegisterData(time, signal);
190 if(signal > fLoadThreshold)
191 secData->RegisterData(time, signal - fLoadPedestal);
196 secData->EndPad(fAutoPedestal, fLoadThreshold);
201 void TPCData::LoadRaw(AliTPCRawStreamOld& input, Bool_t spawnSectors, Bool_t warn)
203 // Load data from AliTPCRawStream.
204 // If spawnSectors is false only sectors that have been created previously
205 // via CreateSector() are loaded.
206 // If spawnSectors is true sectors are created if data for them is encountered.
208 static const Exc_t eH("TPCData::LoadRaw ");
210 Int_t sector = -1, row = -1, pad = -1, rowOffset = 0;
211 Short_t time, signal;
212 Bool_t inFill = kFALSE;
213 Short_t lastTime = 9999;
214 Bool_t lastTimeWarn = kFALSE;
215 TPCSectorData* secData = 0;
217 while (input.Next()) {
218 if (input.IsNewSector()) {
220 secData->EndPad(fAutoPedestal, fLoadThreshold);
223 sector = input.GetSector();
226 rowOffset = TPCSectorData::GetInnSeg().GetNRows();
230 secData = GetSectorData(sector, spawnSectors);
235 if (input.IsNewPad()) {
237 secData->EndPad(fAutoPedestal, fLoadThreshold);
240 row = input.GetRow() + rowOffset;
241 pad = input.GetPad();
243 if(pad >= TPCSectorData::GetNPadsInRow(row)) {
245 Warning(eH.Data(), "pad out of range (row=%d, pad=%d, maxpad=%d).",
246 row, pad, TPCSectorData::GetNPadsInRow(row));
251 secData->BeginPad(row, pad, kTRUE);
253 lastTime = 1024; lastTimeWarn = kFALSE;
256 time = input.GetTime();
257 signal = input.GetSignal();
258 if(time >= lastTime) {
259 if(lastTimeWarn == kFALSE) {
260 Warning(eH.Data(), "time out of order (row=%d, pad=%d, time=%d, lastTime=%d).",
261 row, pad, time, lastTime);
262 lastTimeWarn = kTRUE;
268 secData->RegisterData(time, signal);
270 if(signal > fLoadThreshold)
271 secData->RegisterData(time, signal - fLoadPedestal);
276 secData->EndPad(fAutoPedestal, fLoadThreshold);