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: TOFdaHits.root
13 Event types used: PHYSICS_EVENT
17 #define FILE_HITS "TOFdaHits.root"
18 #define FILE_CALIB "TOFdaCalib.root"
30 #include "AliTOFRawStream.h"
31 #include "AliRawReaderDate.h"
32 #include "AliRawReader.h"
34 #include "AliTOFHitData.h"
35 #include "AliTOFHitDataBuffer.h"
36 #include "AliTOFDaConfigHandler.h"
37 #include "AliTOFHitField.h"
39 #include "AliTOFGeometry.h"
49 #include "TPluginManager.h"
50 #include "TSAXParser.h"
55 1- monitoring data source
58 main(int argc, char **argv)
61 /* magic line from Rene */
62 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
69 /* log start of process */
70 printf("TOF DA started\n");
72 /* check that we got some arguments = list of files */
74 printf("Wrong number of arguments\n");
82 /* retrieve config file */
83 int getConfigFile = daqDA_DB_getFile("TOFPhysicsConfig.xml","TOFPhysicsConfig.xml");
84 if (getConfigFile != 0){
85 printf("Failed to retrieve config file from DB! returning...\n");
88 /* parse config file */
89 AliTOFDaConfigHandler* tofHandler = new AliTOFDaConfigHandler();
90 TSAXParser *parser = new TSAXParser();
91 parser->ConnectToHandler("AliTOFDaConfigHandler", tofHandler);
92 if (parser->ParseFile("./TOFPhysicsConfig.xml") != 0) {
93 printf("Failed parsing config file! retunring... \n");
96 /* setup config params */
97 Int_t meanMultiplicity = tofHandler->GetMeanMultiplicity(); /* average expected TOF multiplicity */
98 Int_t maxHits = tofHandler->GetMaxHits(); /* max number of hits to be collected */
99 printf("current settings:\n");
100 printf(" - meanMultiplicity = %d\n", meanMultiplicity);
101 printf(" - maxHits = %d\n", maxHits);
103 const Int_t nChannels = 157248;
104 Int_t noiseCheckTrigger = 10; /* first noise check after 10 events */
105 Float_t meanChannelRate = (Float_t)meanMultiplicity / (Float_t)nChannels; /* average expected channel rate (hits/event) */
106 Float_t noiseThreshold = 10. * meanChannelRate; /* noise threshold (hits/event) */
107 Int_t minNoiseHits = 10; /* min number of channel hits to check noise */
108 /* counters and flags */
109 Int_t nPhysicsEvents, nCalibEvents, totHits;
110 Int_t nChHits[nChannels];
111 Bool_t inhibitCollection;
112 Bool_t noiseFlag[nChannels];
114 Int_t nhits, ddl, slot, trm, chain, tdc, channel, index, timebin, totbin, deltaBC, l0l1latency, det[5], dummy;
115 Float_t noiseHitThreshold;
121 /* init counters and flags */
125 inhibitCollection = kFALSE;
126 for (Int_t ich = 0; ich < nChannels; ich++) {
128 noiseFlag[ich] = kFALSE;
131 /* TOF raw data handling */
132 AliTOFRawStream *rawStream = new AliTOFRawStream();
133 AliTOFHitDataBuffer *pdb = NULL;
134 AliTOFHitData *hit = NULL;
136 /* open HITS output file */
137 TFile *fileOutHits = new TFile(FILE_HITS, "RECREATE");
138 /* create hit field data structure */
139 AliTOFHitField *hitField = new AliTOFHitField();
140 /* create temporary tree */
141 TTree *tempTree = new TTree("tempTree", "temporary tree");
142 tempTree->Branch("hit", "AliTOFHitField", &hitField);
143 /* create output tree */
144 TTree *outTree = new TTree("hitTree", "hit tree");
145 outTree->Branch("hit", "AliTOFHitField", &hitField);
147 /* open CALIB output file */
148 TFile *fileOutCalib = new TFile(FILE_CALIB, "RECREATE");
149 /* create calib hit histo */
150 TH1F *hCalibHit = new TH1F("hCalibHit", "Calibration events;index;N_{hits}/N_{events}", nChannels, 0., nChannels);
156 AliLog::SetGlobalLogLevel(AliLog::kFatal);
157 struct eventHeaderStruct *event;
159 /* define data source : this is argument 1 */
160 ret = monitorSetDataSource(argv[1]);
162 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(ret));
165 /* declare monitoring program */
166 ret = monitorDeclareMp("tofDA");
168 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(ret));
171 /* define wait event timeout - 1s max */
173 monitorSetNoWaitNetworkTimeout(1000);
175 /* loop over events */
178 /* check shutdown condition */
179 if (daqDA_checkShutdown()) break;
185 /* check inhibit collection */
186 if (!inhibitCollection) {
187 /* check number of events and check noise */
188 if (nPhysicsEvents >= noiseCheckTrigger || totHits >= maxHits) {
189 noiseHitThreshold = noiseThreshold * nPhysicsEvents;
190 printf("noise check triggered after %d events: threshold is %f hits\n", nPhysicsEvents, noiseHitThreshold);
191 /* loop over all channels */
192 for (Int_t ich = 0; ich < nChannels; ich++) {
194 if (nChHits[ich] < minNoiseHits || noiseFlag[ich] || nChHits[ich] < noiseHitThreshold) continue;
195 printf("channel %d tagged as noisy (%d hits): disabled\n", ich, nChHits[ich]);
196 noiseFlag[ich] = kTRUE;
197 totHits -= nChHits[ich];
198 } /* end of loop over all channels */
199 /* set new noise check trigger value */
200 noiseCheckTrigger *= 10;
201 } /* end of noise check */
203 /* inhibit hit collection when maximum number of hits exceeded */
204 if (totHits >= maxHits) {
205 printf("maximum number of hits exceeded (%d): inhibit hit collection\n", maxHits);
206 inhibitCollection = kTRUE;
214 /* get next event (blocking call until timeout) */
215 ret = monitorGetEventDynamic((void **)&event);
216 if (ret == MON_ERR_EOF) {
217 printf ("End of File detected\n");
218 break; /* end of monitoring file has been reached */
221 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(ret));
224 /* retry if got no event */
225 if (event==NULL) continue;
226 /* check event type */
227 if (event->eventType != PHYSICS_EVENT && event->eventType != CALIBRATION_EVENT) {
231 /* check inhibit collection */
232 if (event->eventType == PHYSICS_EVENT && inhibitCollection) {
236 /* increment number of physics events */
237 if (event->eventType == PHYSICS_EVENT) nPhysicsEvents++;
238 /* increment number of calib events */
239 if (event->eventType == CALIBRATION_EVENT) nCalibEvents++;
245 /* create raw reader */
246 AliRawReader *rawReader = new AliRawReaderDate((void *)event);
247 /* setup raw stream */
248 rawStream->SetRawReader(rawReader);
250 rawStream->ResetBuffers();
252 rawStream->DecodeDDL(0, AliDAQ::NumberOfDdls("TOF") - 1, 0);
259 for (Int_t iddl = 0; iddl < AliDAQ::NumberOfDdls("TOF"); iddl++) {
260 /* get packed-data buffer */
261 pdb = rawStream->GetPackedDataBuffer(iddl);
262 nhits = pdb->GetEntries();
263 /* loop over hits in buffer */
264 for (Int_t ihit = 0; ihit < nhits; ihit++) {
266 hit = pdb->GetHit(ihit);
267 /* get channel info */
269 slot = hit->GetSlotID();
271 chain = hit->GetChain();
273 channel = hit->GetChan();
275 rawStream->EquipmentId2VolumeId(ddl, slot, chain, tdc, channel, det);
279 /* check valid index */
280 if (det[0] < 0 || det[0] > 17 ||
281 det[1] < 0 || det[1] > 5 ||
282 det[2] < 0 || det[2] > 18 ||
283 det[3] < 0 || det[3] > 1 ||
284 det[4] < 0 || det[4] > 47) continue;
285 index = AliTOFGeometry::GetIndex(det);
287 /* switch event type */
288 switch (event->eventType) {
295 /* check noise flag */
296 if (noiseFlag[index]) continue;
297 /* increment number of channel hits and total hits */
300 /* get signal info */
301 timebin = hit->GetTimeBin();
302 totbin = hit->GetTOTBin();
303 deltaBC = hit->GetDeltaBunchID();
304 l0l1latency = hit->GetL0L1Latency();
305 /* set hit field data */
306 hitField->SetIndex(index);
307 hitField->SetTimeBin(timebin);
308 hitField->SetTOTBin(totbin);
309 hitField->SetDeltaBC(deltaBC);
310 hitField->SetL0L1Latency(l0l1latency);
319 case CALIBRATION_EVENT:
320 /* fill calib hit histo */
321 hCalibHit->Fill(index);
324 } /* end of switch event type */
325 } /* end of loop over hits in buffer */
326 } /* end of loop over DDLs */
328 /* delete raw reader */
333 } /* end of loop over events */
335 /* final noise check */
336 noiseHitThreshold = noiseThreshold * nPhysicsEvents;
337 printf("final noise check after %d events: threshold is %f hits\n", nPhysicsEvents, noiseHitThreshold);
338 /* loop over all channels */
339 for (Int_t ich = 0; ich < nChannels; ich++) {
341 if (nChHits[ich] < minNoiseHits || noiseFlag[ich] || nChHits[ich] < noiseHitThreshold) continue;
342 printf("channel %d tagged as noisy (%d hits): disabled\n", ich, nChHits[ich]);
343 noiseFlag[ich] = kTRUE;
344 totHits -= nChHits[ich];
345 } /* end of loop over all channels */
347 /* copy hits into output tree from temp tree */
348 printf("copy hits from temporary tree into output tree\n");
349 printf("temporary tree contains %d hits\n", (Int_t)tempTree->GetEntries());
350 for (Int_t ihit = 0; ihit < tempTree->GetEntries(); ihit++) {
352 tempTree->GetEntry(ihit);
353 /* check noise flag */
354 if (noiseFlag[hitField->GetIndex()]) continue;
355 /* fill output tree */
357 } /* end of copy hits into output tree from temp tree */
358 printf("output tree contains %d hits\n", (Int_t)outTree->GetEntries());
360 /* write output tree on HITS file */
363 fileOutHits->Close();
364 /* export file to FXS */
365 if (daqDA_FES_storeFile(FILE_HITS, "HITS"))
368 /* scale calib hit histo by number of calib events */
370 hCalibHit->Scale(1. / nCalibEvents);
372 /* write calib hit histo on CALIB file */
375 fileOutCalib->Close();
376 /* export file to FXS */
377 if (daqDA_FES_storeFile(FILE_CALIB, "CALIB"))