3 TOF DA for online calibration
5 Contact: Chiara.Zampolli@bo.infn.it
6 Roberto.Preghenella@bo.infn.it
10 Number of events needed:
12 Output Files: TOFdaCalib.root
13 Event types used: CALIBRATION_EVENT
17 #define FILE_CALIB "TOFdaCalib.root"
32 #include "TPluginManager.h"
36 #include "AliTOFRawStream.h"
37 #include "AliRawReaderDate.h"
38 #include "AliRawReader.h"
40 #include "AliTOFGeometry.h"
41 #include "AliTOFDecoderV2.h"
42 #include "AliTOFDecoderSummaryData.h"
43 #include "AliTOFDRMSummaryData.h"
44 #include "AliTOFTRMSummaryData.h"
45 #include "AliTOFChainSummaryData.h"
46 #include "AliTOFTDCHitBuffer.h"
47 #include "AliTOFTDCHit.h"
51 1- monitoring data source
54 main(int argc, char **argv)
57 /* magic line from Rene */
58 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
65 /* log start of process */
66 printf("TOF DA started\n");
68 /* check that we got some arguments = list of files */
70 printf("Wrong number of arguments\n");
80 const Int_t nChannels = 157248;
81 /* counters and flags */
84 Int_t ddl, slot, trm, chain, tdc, channel, index, det[5], dummy;
85 /* TOF raw data handling */
86 AliTOFRawStream *rawStream = new AliTOFRawStream();
87 AliTOFDecoderV2 *decoder = rawStream->GetDecoderV2();
88 AliTOFDecoderSummaryData *decodersd;
89 AliTOFDRMSummaryData *drmsd;
90 AliTOFTRMSummaryData *trmsd;
91 AliTOFChainSummaryData *chainsd;
92 AliTOFTDCHitBuffer *hitBuffer;
99 /* init counters and flags */
102 /* open CALIB output file */
103 TFile *fileOutCalib = new TFile(FILE_CALIB, "RECREATE");
104 /* create calib hit histo */
105 TH1F *hCalibHit = new TH1F("hCalibHit", "Calibration events;index;N_{hits}/N_{events}", nChannels, 0., nChannels);
111 AliLog::SetGlobalLogLevel(AliLog::kFatal);
112 struct eventHeaderStruct *event;
114 /* define monitoring table */
115 char *monTable[5] = {
120 ret = monitorDeclareTable(monTable);
122 printf("monitorDeclareTable() failed: %s\n", monitorDecodeError(ret));
125 /* define data source : this is argument 1 */
126 ret = monitorSetDataSource(argv[1]);
128 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(ret));
131 /* declare monitoring program */
132 ret = monitorDeclareMp("TOFdaCalib");
134 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(ret));
137 /* define wait event timeout - 1s max */
139 monitorSetNoWaitNetworkTimeout(1000);
141 /* loop over events */
144 /* check shutdown condition */
145 if (daqDA_checkShutdown()) break;
151 /* get next event (blocking call until timeout) */
152 ret = monitorGetEventDynamic((void **)&event);
153 if (ret == MON_ERR_EOF) {
154 printf ("End of File detected\n");
155 break; /* end of monitoring file has been reached */
158 printf("monitorGetEventDynamic() failed (ret=%d errno=%d): %s\n", ret, errno, monitorDecodeError(ret));
161 /* retry if got no event */
162 if (event==NULL) continue;
163 /* check TOF in partecipating detectors */
164 if (!TEST_DETECTOR_IN_PATTERN(event->eventDetectorPattern, EVENT_DETECTOR_TOF)) {
168 /* check event type */
169 if (event->eventType != CALIBRATION_EVENT) {
170 printf("not a calibration event: %d\n", event->eventType);
174 /* increment number of calib events */
181 /* create and setup raw reader */
182 AliRawReader *rawReader = new AliRawReaderDate((void *)event);
184 rawReader->Select("TOF", 0, AliDAQ::NumberOfDdls("TOF") - 1);
185 /* setup raw stream */
186 rawStream->SetRawReader(rawReader);
188 /* loop over DDLs - rawReader->ReadHeader() */
189 while (rawReader->ReadHeader()) {
191 /* read equipment data */
192 dataSize = rawReader->GetDataSize();
193 data = new UChar_t[dataSize];
194 if (!rawReader->ReadNext(data, dataSize)){
200 dataWords = dataSize / 4;
201 decoder->Decode((UInt_t *)data, dataWords);
204 /* read equipment info */
205 currentDDL = rawReader->GetDDLID();
206 /* read decoder summary data */
207 decodersd = decoder->GetDecoderSummaryData();
208 /* check DRM header/trailer */
209 drmsd = decodersd->GetDRMSummaryData();
210 if (!drmsd->GetHeader() || !drmsd->GetTrailer()) continue;
211 /* loop over TRM to get hits */
212 for (Int_t itrm = 0; itrm < 10; itrm++) {
213 trmsd = drmsd->GetTRMSummaryData(itrm);
214 /* check header/trailer */
215 if (!trmsd->GetHeader() || !trmsd->GetTrailer()) continue;
216 /* loop over chains */
217 for (Int_t ichain = 0; ichain < 2; ichain++) {
218 chainsd = trmsd->GetChainSummaryData(ichain);
219 /* check header/trailer */
220 if (!chainsd->GetHeader() || !chainsd->GetTrailer()) continue;
221 hitBuffer = chainsd->GetTDCPackedHitBuffer();
227 /* loop over hits in buffer */
228 for (Int_t ihit = 0; ihit < hitBuffer->GetEntries(); ihit++) {
231 hit = hitBuffer->GetHit(ihit);
233 /* get channel info */
235 slot = trmsd->GetSlotID();
237 chain = chainsd->GetChain();
238 tdc = hit->GetTDCID();
239 channel = hit->GetChan();
241 rawStream->EquipmentId2VolumeId(ddl, slot, chain, tdc, channel, det);
245 /* check valid index */
246 if (det[0] < 0 || det[0] > 17 ||
247 det[1] < 0 || det[1] > 5 ||
248 det[2] < 0 || det[2] > 18 ||
249 det[3] < 0 || det[3] > 1 ||
250 det[4] < 0 || det[4] > 47) continue;
251 index = AliTOFGeometry::GetIndex(det);
253 /* fill calib hit histo */
254 hCalibHit->Fill(index);
256 } /* end of loop over hits in buffer */
257 } /* end of loop over chains */
258 } /* end of loop over TRMs */
259 } /* end of loop over DDLs - rawReader->ReadHeader() */
261 /* delete raw reader */
266 } /* end of loop over events */
268 /* scale calib hit histo by number of calib events */
269 printf("found %d calibration events\n", nCalibEvents);
271 if (nCalibEvents > 0)
272 hCalibHit->Scale(1. / nCalibEvents);
274 /* write calib hit histo on CALIB file */
277 fileOutCalib->Close();
278 /* export file to FXS */
279 if (daqDA_FES_storeFile(FILE_CALIB, "CALIB"))