3 TOF DA for online calibration
6 Contact: 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"
18 #define EVENT_DETECTOR_TOF 5
33 #include "TPluginManager.h"
37 #include "AliTOFRawStream.h"
38 #include "AliRawReaderDate.h"
39 #include "AliRawReader.h"
41 #include "AliTOFGeometry.h"
42 #include "AliTOFDecoderV2.h"
43 #include "AliTOFDecoderSummaryData.h"
44 #include "AliTOFDRMSummaryData.h"
45 #include "AliTOFTRMSummaryData.h"
46 #include "AliTOFChainSummaryData.h"
47 #include "AliTOFTDCHitBuffer.h"
48 #include "AliTOFTDCHit.h"
52 1- monitoring data source
55 main(int argc, char **argv)
58 /* magic line from Rene */
59 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
66 /* log start of process */
67 printf("TOF DA started\n");
69 /* check that we got some arguments = list of files */
71 printf("Wrong number of arguments\n");
81 const Int_t nChannels = 157248;
82 /* counters and flags */
85 Int_t ddl, slot, trm, chain, tdc, channel, index, det[5], dummy;
86 /* TOF raw data handling */
87 AliTOFRawStream *rawStream = new AliTOFRawStream();
88 AliTOFDecoderV2 *decoder = rawStream->GetDecoderV2();
89 AliTOFDecoderSummaryData *decodersd;
90 AliTOFDRMSummaryData *drmsd;
91 AliTOFTRMSummaryData *trmsd;
92 AliTOFChainSummaryData *chainsd;
93 AliTOFTDCHitBuffer *hitBuffer;
100 /* init counters and flags */
103 /* open CALIB output file */
104 TFile *fileOutCalib = new TFile(FILE_CALIB, "RECREATE");
105 /* create calib hit histo */
106 TH1F *hCalibHit = new TH1F("hCalibHit", "Calibration events;index;N_{hits}/N_{events}", nChannels, 0., nChannels);
112 AliLog::SetGlobalLogLevel(AliLog::kFatal);
113 struct eventHeaderStruct *event;
115 /* define monitoring table */
116 char *monTable[5] = {
121 ret = monitorDeclareTable(monTable);
123 printf("monitorDeclareTable() failed: %s\n", monitorDecodeError(ret));
126 /* define data source : this is argument 1 */
127 ret = monitorSetDataSource(argv[1]);
129 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(ret));
132 /* declare monitoring program */
133 ret = monitorDeclareMp("TOFdaCalib");
135 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(ret));
138 /* define wait event timeout - 1s max */
140 monitorSetNoWaitNetworkTimeout(1000);
142 /* loop over events */
145 /* check shutdown condition */
146 if (daqDA_checkShutdown()) break;
152 /* get next event (blocking call until timeout) */
153 ret = monitorGetEventDynamic((void **)&event);
154 if (ret == MON_ERR_EOF) {
155 printf ("End of File detected\n");
156 break; /* end of monitoring file has been reached */
159 printf("monitorGetEventDynamic() failed (ret=%d errno=%d): %s\n", ret, errno, monitorDecodeError(ret));
162 /* retry if got no event */
163 if (event==NULL) continue;
164 /* check TOF in partecipating detectors */
165 if (!TEST_DETECTOR_IN_PATTERN(event->eventDetectorPattern, EVENT_DETECTOR_TOF)) {
169 /* check event type */
170 if (event->eventType != CALIBRATION_EVENT) {
171 printf("not a calibration event: %d\n", event->eventType);
175 /* increment number of calib events */
182 /* create and setup raw reader */
183 AliRawReader *rawReader = new AliRawReaderDate((void *)event);
185 rawReader->Select("TOF", 0, AliDAQ::NumberOfDdls("TOF") - 1);
186 /* setup raw stream */
187 rawStream->SetRawReader(rawReader);
189 /* loop over DDLs - rawReader->ReadHeader() */
190 while (rawReader->ReadHeader()) {
192 /* read equipment data */
193 dataSize = rawReader->GetDataSize();
194 data = new UChar_t[dataSize];
195 if (!rawReader->ReadNext(data, dataSize)){
201 dataWords = dataSize / 4;
202 decoder->Decode((UInt_t *)data, dataWords);
205 /* read equipment info */
206 currentDDL = rawReader->GetDDLID();
207 /* read decoder summary data */
208 decodersd = decoder->GetDecoderSummaryData();
209 /* check DRM header/trailer */
210 drmsd = decodersd->GetDRMSummaryData();
211 if (!drmsd->GetHeader() || !drmsd->GetTrailer()) continue;
212 /* loop over TRM to get hits */
213 for (Int_t itrm = 0; itrm < 10; itrm++) {
214 trmsd = drmsd->GetTRMSummaryData(itrm);
215 /* check header/trailer */
216 if (!trmsd->GetHeader() || !trmsd->GetTrailer()) continue;
217 /* loop over chains */
218 for (Int_t ichain = 0; ichain < 2; ichain++) {
219 chainsd = trmsd->GetChainSummaryData(ichain);
220 /* check header/trailer */
221 if (!chainsd->GetHeader() || !chainsd->GetTrailer()) continue;
222 hitBuffer = chainsd->GetTDCPackedHitBuffer();
228 /* loop over hits in buffer */
229 for (Int_t ihit = 0; ihit < hitBuffer->GetEntries(); ihit++) {
232 hit = hitBuffer->GetHit(ihit);
234 /* get channel info */
236 slot = trmsd->GetSlotID();
238 chain = chainsd->GetChain();
239 tdc = hit->GetTDCID();
240 channel = hit->GetChan();
242 rawStream->EquipmentId2VolumeId(ddl, slot, chain, tdc, channel, det);
246 /* check valid index */
247 if (det[0] < 0 || det[0] > 17 ||
248 det[1] < 0 || det[1] > 5 ||
249 det[2] < 0 || det[2] > 18 ||
250 det[3] < 0 || det[3] > 1 ||
251 det[4] < 0 || det[4] > 47) continue;
252 index = AliTOFGeometry::GetIndex(det);
254 /* fill calib hit histo */
255 hCalibHit->Fill(index);
257 } /* end of loop over hits in buffer */
258 } /* end of loop over chains */
259 } /* end of loop over TRMs */
260 } /* end of loop over DDLs - rawReader->ReadHeader() */
262 /* delete raw reader */
267 } /* end of loop over events */
269 /* scale calib hit histo by number of calib events */
270 printf("found %d calibration events\n", nCalibEvents);
272 if (nCalibEvents > 0)
273 hCalibHit->Scale(1. / nCalibEvents);
275 /* write calib hit histo on CALIB file */
278 fileOutCalib->Close();
279 /* export file to FXS */
280 if (daqDA_FES_storeFile(FILE_CALIB, "CALIB"))