5 #include <Alieve/TPCSectorData.h>
7 #include <AliSimDigits.h>
8 #include <AliTPCParam.h>
9 #include <AliTPCRawStream.h>
11 using namespace Alieve;
13 //______________________________________________________________________
16 // A central manager for TPC data of an event. Can read digits (from
17 // a tree: LoadDigits()) and raw-data (via AliRawReader: LoadRaw()).
19 // The sector data is stored in 36 TPCSectorData objects.
20 // Sectors 0 - 17: +z side, 18 - 35: -z side.
21 // No separation of inner/outer segments, use row numbers for addressing.
23 // Threshold application and pedestal subtraction can be performed at
24 // load time: use SetLoadThreshold(thresh) and SetLoadPedestal(ped).
26 // For raw-data (loaded using LoadRaw) pedestals can be calculated
27 // automatically per pad. Use SetAutoPedestal(kTRUE) to activate it.
28 // You might still want to set load threshold (default iz zero).
34 fSectors(36), fSectorBlockSize(65536),
35 fLoadThreshold(0), fLoadPedestal(0), fAutoPedestal(kFALSE)
37 TPCSectorData::InitStatics();
45 /**************************************************************************/
47 void TPCData::CreateSector(Int_t sector)
49 if(fSectors[sector] == 0)
50 fSectors[sector] = new TPCSectorData(sector, fSectorBlockSize);
53 void TPCData::CreateAllSectors()
55 for(Int_t s=0; s<36; ++s)
59 void TPCData::DropAllSectors()
61 for(Int_t s=0; s<36; ++s) {
63 fSectors[s]->DropData();
67 void TPCData::DeleteAllSectors()
69 for(Int_t s=0; s<36; ++s) {
75 /**************************************************************************/
77 TPCSectorData* TPCData::GetSectorData(Int_t sector, Bool_t spawnSectors)
79 if(sector < 0 || sector > 35) return 0;
80 if(fSectors[sector] == 0 && spawnSectors)
82 return fSectors[sector];
85 /**************************************************************************/
87 void TPCData::LoadDigits(TTree* tree, Bool_t spawnSectors)
89 // Load data from TTree of AliSimDigits.
90 // If spawnSectors is false only sectors that have been created previously
91 // via CreateSector() are loaded.
92 // If spawnSectors is true sectors are created if data for them is encountered.
94 AliSimDigits digit, *digitPtr = &digit;
95 tree->GetBranch("Segment")->SetAddress(&digitPtr);
97 Int_t sector, row, pad, curPad;
99 Bool_t inFill = kFALSE;
100 TPCSectorData* secData = 0;
102 Int_t numEnt = (Int_t) tree->GetEntries();
103 for (Int_t ent=0; ent<numEnt; ent++) {
105 Alieve::TPCSectorData::GetParam().AdjustSectorRow(digit.GetID(), sector, row);
108 row += TPCSectorData::GetInnSeg().GetNRows();
110 secData = GetSectorData(sector, spawnSectors);
114 if(digit.First() == kFALSE)
118 pad = digit.CurrentColumn();
119 time = digit.CurrentRow();
120 signal = digit.CurrentDigit();
124 secData->EndPad(fAutoPedestal, fLoadThreshold);
125 secData->BeginPad(row, pad, kFALSE);
130 secData->RegisterData(time, signal);
132 signal -= fLoadPedestal;
133 if(signal >= fLoadThreshold)
134 secData->RegisterData(time, signal);
137 } while (digit.Next());
139 secData->EndPad(fAutoPedestal, fLoadThreshold);
145 void TPCData::LoadRaw(AliTPCRawStream& input, Bool_t spawnSectors, Bool_t warn)
147 // Load data from AliTPCRawStream.
148 // If spawnSectors is false only sectors that have been created previously
149 // via CreateSector() are loaded.
150 // If spawnSectors is true sectors are created if data for them is encountered.
152 static const TEveException eH("TPCData::LoadRaw ");
154 Int_t sector = -1, row = -1, pad = -1, rowOffset = 0;
155 Short_t time, signal;
156 Bool_t inFill = kFALSE;
157 Short_t lastTime = 9999;
158 Bool_t lastTimeWarn = kFALSE;
159 TPCSectorData* secData = 0;
161 Short_t threshold = fLoadThreshold;
163 while (input.Next()) {
164 if (input.IsNewSector()) {
166 secData->EndPad(fAutoPedestal, threshold);
169 sector = input.GetSector();
172 rowOffset = TPCSectorData::GetInnSeg().GetNRows();
176 secData = GetSectorData(sector, spawnSectors);
181 if (input.IsNewPad()) {
183 secData->EndPad(fAutoPedestal, threshold);
186 row = input.GetRow() + rowOffset;
187 pad = input.GetPad();
189 if(pad >= TPCSectorData::GetNPadsInRow(row)) {
191 Warning(eH.Data(), "pad out of range (row=%d, pad=%d, maxpad=%d).",
192 row, pad, TPCSectorData::GetNPadsInRow(row));
197 TPCSectorData::PadRowHack* prh = secData->GetPadRowHack(row, pad);
199 threshold = prh->fThrExt + Short_t(prh->fThrFac*fLoadThreshold);
201 threshold = fLoadThreshold;
204 secData->BeginPad(row, pad, kTRUE);
206 lastTime = 1024; lastTimeWarn = kFALSE;
209 time = input.GetTime();
210 signal = input.GetSignal();
211 if(time >= lastTime) {
212 if(lastTimeWarn == kFALSE) {
214 Warning(eH.Data(), "time out of order (row=%d, pad=%d, time=%d, lastTime=%d).",
215 row, pad, time, lastTime);
216 lastTimeWarn = kTRUE;
222 secData->RegisterData(time, signal);
224 signal -= fLoadPedestal;
225 if(signal > threshold)
226 secData->RegisterData(time, signal);
231 secData->EndPad(fAutoPedestal, threshold);