1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.3 2007/10/12 13:36:27 cvetan
19 Coding convention fixes from Stefan
21 Revision 1.2 2007/09/18 09:44:45 cvetan
22 Sorting out some issues concerning the compilation with and without DATE support
24 Revision 1.1 2007/09/17 10:23:31 cvetan
25 New TPC monitoring package from Stefan Kniege. The monitoring package can be started by running TPCMonitor.C macro located in macros folder.
29 ////////////////////////////////////////////////////////////////////////
31 //// AliTPCMonitor class
33 //// Main class for TPC Monitor
34 //// Monitor can handle rootified data, files and online streams in DATE format.
35 //// The monitor GUI is started by the macro TPCMonitor.C
37 //// In the The data are read in in two read cycles.
38 //// If no sector is specified (sectorid==-1) all sectors are read and only the max value
39 //// for each channel is stored in a global histogram for Side A and C.
40 //// In this way the whole TPC can be read in at once.
42 //// If the sector is specified only one sector is read in and additional quantities
43 //// e.g baseline and baseline rms are calculated and stored.
45 //// Author: Stefan Kniege, IKF, Frankfurt
48 /////////////////////////////////////////////////////////////////////////
53 #include "AliTPCMonitor.h"
54 #include "AliTPCMonitorMappingHandler.h"
55 #include "AliTPCMonitorDateFile.h"
56 #include "AliTPCMonitorDateFormat.h"
57 #include "AliTPCMonitorAltro.h"
58 #include "AliTPCMonitorFFT.h"
59 #include "AliRawReaderRoot.h"
60 #include "AliRawReader.h"
68 #include "TDirectory.h"
70 #include "TPaveText.h"
72 #include <Riostream.h>
73 #include "AliTPCMonitorDateMonitor.h"
75 ClassImp(AliTPCMonitor)
77 //____________________________________________________________________________
78 AliTPCMonitor::AliTPCMonitor(char* name, char* title) :
79 AliTPCMonitorConfig(name,title),
80 fPad(new Int_t*[GetMaxHwAddr()]),
81 fPadMapHw(new Float_t[GetMaxHwAddr()]),
82 fPadMapRCU(new Int_t*[GetMaxHwAddr()]),
100 fHistAddrBaseMean(0),
104 fHistDistrSumIROC(0),
105 fHistDistrMaxIROC(0),
106 fHistDistrSumOROC(0),
107 fHistDistrMaxOROC(0),
108 fHistDistrBase2dIROC(0),
109 fHistDistrBase2dOROC(0),
110 fHistDistrBaseRmsIROC(0),
111 fHistDistrBaseMeanIROC(0),
112 fHistDistrBaseRmsOROC(0),
113 fHistDistrBaseMeanOROC(0),
116 fHistList(new TObjArray()),
143 fMapEqidsSec(new Int_t*[36]),
144 fMapEqidsRcu(new Int_t[1000]),
154 for(Int_t i = 0; i<GetMaxHwAddr(); i++) { fPad[i] = new Int_t[GetTimeBins()];}
155 for(Int_t i = 0; i<GetMaxHwAddr(); i++) { fPadMapRCU[i] = new Int_t[6];}
156 for(Int_t i = 0; i<36; i++) { fMapEqidsSec[i] = new Int_t[6];}
160 if (!gDirectory->GetList())
162 Warning("Build","Current directory is not a valid directory");
165 AliTPCMonitor *hold = (AliTPCMonitor*)gDirectory->GetList()->FindObject(GetName());
168 Warning("Build","Replacing existing histogram: %s (Potential memory leak).",GetName());
169 gDirectory->GetList()->Remove(hold);
171 gDirectory->Append(this);
178 //____________________________________________________________________________
179 AliTPCMonitor::AliTPCMonitor(const AliTPCMonitor &monitor):
180 AliTPCMonitorConfig(monitor.GetName(),monitor.GetTitle()),
181 fPad(new Int_t*[GetMaxHwAddr()]),
182 fPadMapHw(new Float_t[GetMaxHwAddr()]),
183 fPadMapRCU(new Int_t*[GetMaxHwAddr()]),
199 fHistAddrMapIndex(0),
201 fHistAddrBaseMean(0),
205 fHistDistrSumIROC(0),
206 fHistDistrMaxIROC(0),
207 fHistDistrSumOROC(0),
208 fHistDistrMaxOROC(0),
209 fHistDistrBase2dIROC(0),
210 fHistDistrBase2dOROC(0),
211 fHistDistrBaseRmsIROC(0),
212 fHistDistrBaseMeanIROC(0),
213 fHistDistrBaseRmsOROC(0),
214 fHistDistrBaseMeanOROC(0),
217 fHistList(new TObjArray()),
218 fkNRowsIroc(monitor.fkNRowsIroc),
219 fkNRowsOroc(monitor.fkNRowsOroc),
220 fkNPadsIroc(monitor.fkNPadsIroc),
221 fkNPadsOroc(monitor.fkNPadsOroc),
222 fkNPadMinIroc(monitor.fkNPadMinIroc),
223 fkNPadMinOroc(monitor.fkNPadMinOroc),
224 fkNPadMaxIroc(monitor.fkNPadMaxIroc),
225 fkNPadMaxOroc(monitor.fkNPadMaxOroc),
226 fVerb(monitor.fVerb),
227 fLastEv(monitor.fLastEv),
228 fEventNumber(monitor.fEventNumber),
229 fEventNumberOld(monitor.fEventNumberOld),
230 fDisableFit(monitor.fDisableFit),
231 fExecGlob(monitor.fExecGlob),
232 fExecPlaneMax(monitor.fExecPlaneMax),
233 fExecPadIrocRms(monitor.fExecPadIrocRms),
234 fExecPadOrocRms(monitor.fExecPadOrocRms),
235 fRunId(monitor.fRunId),
236 fEqId(monitor.fEqId),
237 fPadUsedRoc(monitor.fPadUsedRoc),
238 fPadUsedHwAddr(monitor.fPadUsedHwAddr),
239 fGdcId(monitor.fGdcId),
240 fLdcId(monitor.fLdcId),
241 fLdcIdOld(monitor.fLdcIdOld),
242 fMapEqidsSec(new Int_t*[36]),
243 fMapEqidsRcu(new Int_t[1000]),
244 fMirror(monitor.fMirror),
245 fChannelIter(monitor.fChannelIter),
246 fMapHand(monitor.fMapHand),
247 fReaderROOT(monitor.fReaderROOT),
248 fReaderDATE(monitor.fReaderDATE),
249 fReaderDATEMon(monitor.fReaderDATEMon)
253 fHistIROC=(TH2F*)monitor.fHistIROC->Clone(); fHistList->Add(fHistIROC);
254 fHistOROC=(TH2F*)monitor.fHistOROC->Clone(); fHistList->Add(fHistOROC);
255 fHistIROCIndex=(TH2S*)monitor.fHistIROCIndex->Clone(); fHistList->Add(fHistIROCIndex);
256 fHistOROCIndex=(TH2S*)monitor.fHistOROCIndex->Clone(); fHistList->Add(fHistOROCIndex);
257 fHistIROCTime=(TH2F*)monitor.fHistIROCTime->Clone(); fHistList->Add(fHistIROCTime);
258 fHistOROCTime=(TH2F*)monitor.fHistOROCTime->Clone(); fHistList->Add(fHistOROCTime);
259 fHistIROCClone=(TH2F*)monitor.fHistIROCClone->Clone(); fHistList->Add(fHistIROCClone);
260 fHistOROCClone=(TH2F*)monitor.fHistOROCClone->Clone(); fHistList->Add(fHistOROCClone);
261 fHistIROCRMS=(TH2F*)monitor.fHistIROCRMS->Clone(); fHistList->Add(fHistIROCRMS);
262 fHistOROCRMS=(TH2F*)monitor.fHistOROCRMS->Clone(); fHistList->Add(fHistOROCRMS);
263 fHistIROCBASE=(TH2F*)monitor.fHistIROCBASE->Clone(); fHistList->Add(fHistIROCBASE);
264 fHistOROCBASE=(TH2F*)monitor.fHistOROCBASE->Clone(); fHistList->Add(fHistOROCBASE);
265 fHistIROCSUM=(TH2F*)monitor.fHistIROCSUM->Clone(); fHistList->Add(fHistIROCSUM);
266 fHistOROCSUM=(TH2F*)monitor.fHistOROCSUM->Clone(); fHistList->Add(fHistOROCSUM);
268 fHistChannelTime=(TH2F*)monitor.fHistChannelTime->Clone(); fHistList->Add(fHistChannelTime);
270 fHistAddrMapIndex=(TH1F*)monitor.fHistAddrMapIndex->Clone(); fHistList->Add(fHistAddrMapIndex);
271 fHistAddrMaxAdc=(TH1F*)monitor.fHistAddrMaxAdc->Clone(); fHistList->Add(fHistAddrMaxAdc);
272 fHistAddrBaseMean=(TH1F*)monitor.fHistAddrBaseMean->Clone(); fHistList->Add(fHistAddrBaseMean);
273 fHistAddrMaxAdcX=(TH1F*)monitor.fHistAddrMaxAdcX->Clone(); fHistList->Add(fHistAddrMaxAdcX);
274 fHistAddrAdcSum=(TH1F*)monitor.fHistAddrAdcSum->Clone(); fHistList->Add(fHistAddrAdcSum);
275 fHistAddrBaseRms=(TH1F*)monitor.fHistAddrBaseRms->Clone(); fHistList->Add(fHistAddrBaseRms);
278 fHistDistrSumIROC=(TH1F*)monitor.fHistDistrSumIROC->Clone(); fHistList->Add(fHistDistrSumIROC);
279 fHistDistrMaxIROC=(TH1F*)monitor.fHistDistrMaxIROC->Clone(); fHistList->Add(fHistDistrMaxIROC);
280 fHistDistrSumOROC=(TH1F*)monitor.fHistDistrSumOROC->Clone(); fHistList->Add(fHistDistrSumOROC);
281 fHistDistrMaxOROC=(TH1F*)monitor.fHistDistrMaxOROC->Clone(); fHistList->Add(fHistDistrMaxOROC);
283 fHistDistrBase2dIROC=(TH2F*)monitor.fHistDistrBase2dIROC->Clone(); fHistList->Add(fHistDistrBase2dIROC);
284 fHistDistrBase2dOROC=(TH2F*)monitor.fHistDistrBase2dOROC->Clone(); fHistList->Add(fHistDistrBase2dOROC);
285 fHistDistrBaseRmsIROC=(TH1D*)monitor.fHistDistrBaseRmsIROC->Clone(); fHistList->Add(fHistDistrBaseRmsIROC);
286 fHistDistrBaseMeanIROC=(TH1D*)monitor.fHistDistrBaseMeanIROC->Clone(); fHistList->Add(fHistDistrBaseMeanIROC);
287 fHistDistrBaseRmsOROC=(TH1D*)monitor.fHistDistrBaseRmsOROC->Clone(); fHistList->Add(fHistDistrBaseRmsOROC);
288 fHistDistrBaseMeanOROC=(TH1D*)monitor.fHistDistrBaseMeanOROC->Clone(); fHistList->Add(fHistDistrBaseMeanOROC);
290 fHistGlobalMaxA=(TH2S*)monitor.fHistGlobalMaxA->Clone(); fHistList->Add(fHistGlobalMaxA);
291 fHistGlobalMaxC=(TH2S*)monitor.fHistGlobalMaxC->Clone(); fHistList->Add(fHistGlobalMaxC);
293 // fPad = new Int_t*[monitor.GetMaxHwAddr()];
294 for(Int_t i = 0; i<GetMaxHwAddr(); i++) { fPad[i] = new Int_t[monitor.GetTimeBins()];}
296 //fPadMapRCU = new Int_t*[monitor.GetMaxHwAddr()];
297 for(Int_t i = 0; i<monitor.GetMaxHwAddr(); i++) { fPadMapRCU[i] = new Int_t[6];}
299 //fPadMapHw = new Float_t[monitor.GetMaxHwAddr()];
301 //fMapEqidsRcu = new Int_t[1000];
302 //fMapEqidsSec = new Int_t*[36];
303 for(Int_t i = 0; i<36; i++) { fMapEqidsSec[i] = new Int_t[6];}
308 if (!gDirectory->GetList())
310 Warning("Build","Current directory is not a valid directory");
315 AliTPCMonitor *hold = (AliTPCMonitor*)gDirectory->GetList()->FindObject(monitor.GetName());
318 Warning("Build","Replacing existing histogram: %s (Potential memory leak).",monitor.GetName());
319 gDirectory->GetList()->Remove(hold);
321 gDirectory->Append(this);
327 //____________________________________________________________________________
329 AliTPCMonitor &AliTPCMonitor:: operator= (const AliTPCMonitor& monitor)
331 // assigment operator
334 ((AliTPCMonitorConfig *)this)->operator=(monitor);
335 fkNRowsIroc=monitor.fkNRowsIroc;
336 fkNRowsOroc=monitor.fkNRowsOroc;
337 fkNPadsIroc=monitor.fkNPadsIroc;
338 fkNPadsOroc=monitor.fkNPadsOroc;
339 fkNPadMinIroc=monitor.fkNPadMinIroc;
340 fkNPadMinOroc=monitor.fkNPadMinOroc;
341 fkNPadMaxIroc=monitor.fkNPadMaxIroc;
342 fkNPadMaxOroc=monitor.fkNPadMaxOroc;
344 fLastEv=monitor.fLastEv;
345 fEventNumber=monitor.fEventNumber;
346 fEventNumberOld=monitor.fEventNumberOld;
347 fDisableFit=monitor.fDisableFit;
348 fExecGlob=monitor.fExecGlob;
349 fExecPlaneMax=monitor.fExecPlaneMax;
350 fExecPadIrocRms=monitor.fExecPadIrocRms;
351 fExecPadOrocRms=monitor.fExecPadOrocRms;
352 fRunId=monitor.fRunId;
354 fPadUsedRoc=monitor.fPadUsedRoc;
355 fPadUsedHwAddr=monitor.fPadUsedHwAddr;
356 fGdcId=monitor.fGdcId;
357 fLdcId=monitor.fLdcId;
358 fLdcIdOld=monitor.fLdcIdOld;
359 fMapHand=monitor.fMapHand;
360 fReaderROOT=monitor.fReaderROOT;
361 fReaderDATE=monitor.fReaderDATE;
364 fHistList = new TObjArray();
365 fHistIROC=(TH2F*)monitor.fHistIROC->Clone(); fHistList->Add(fHistIROC);
366 fHistOROC=(TH2F*)monitor.fHistOROC->Clone(); fHistList->Add(fHistOROC);
367 fHistIROCIndex=(TH2S*)monitor.fHistIROCIndex->Clone(); fHistList->Add(fHistIROCIndex);
368 fHistOROCIndex=(TH2S*)monitor.fHistOROCIndex->Clone(); fHistList->Add(fHistOROCIndex);
369 fHistIROCTime=(TH2F*)monitor.fHistIROCTime->Clone(); fHistList->Add(fHistIROCTime);
370 fHistOROCTime=(TH2F*)monitor.fHistOROCTime->Clone(); fHistList->Add(fHistOROCTime);
371 fHistIROCClone=(TH2F*)monitor.fHistIROCClone->Clone(); fHistList->Add(fHistIROCClone);
372 fHistOROCClone=(TH2F*)monitor.fHistOROCClone->Clone(); fHistList->Add(fHistOROCClone);
373 fHistIROCRMS=(TH2F*)monitor.fHistIROCRMS->Clone(); fHistList->Add(fHistIROCRMS);
374 fHistOROCRMS=(TH2F*)monitor.fHistOROCRMS->Clone(); fHistList->Add(fHistOROCRMS);
375 fHistIROCBASE=(TH2F*)monitor.fHistIROCBASE->Clone(); fHistList->Add(fHistIROCBASE);
376 fHistOROCBASE=(TH2F*)monitor.fHistOROCBASE->Clone(); fHistList->Add(fHistOROCBASE);
377 fHistIROCSUM=(TH2F*)monitor.fHistIROCSUM->Clone(); fHistList->Add(fHistIROCSUM);
378 fHistOROCSUM=(TH2F*)monitor.fHistOROCSUM->Clone(); fHistList->Add(fHistOROCSUM);
380 fHistChannelTime=(TH2F*)monitor.fHistChannelTime->Clone(); fHistList->Add(fHistChannelTime);
382 fHistAddrMapIndex=(TH1F*)monitor.fHistAddrMapIndex->Clone(); fHistList->Add(fHistAddrMapIndex);
383 fHistAddrMaxAdc=(TH1F*)monitor.fHistAddrMaxAdc->Clone(); fHistList->Add(fHistAddrMaxAdc);
384 fHistAddrBaseMean=(TH1F*)monitor.fHistAddrBaseMean->Clone(); fHistList->Add(fHistAddrBaseMean);
385 fHistAddrMaxAdcX=(TH1F*)monitor.fHistAddrMaxAdcX->Clone(); fHistList->Add(fHistAddrMaxAdcX);
386 fHistAddrAdcSum=(TH1F*)monitor.fHistAddrAdcSum->Clone(); fHistList->Add(fHistAddrAdcSum);
387 fHistAddrBaseRms=(TH1F*)monitor.fHistAddrBaseRms->Clone(); fHistList->Add(fHistAddrBaseRms);
390 fHistDistrSumIROC=(TH1F*)monitor.fHistDistrSumIROC->Clone(); fHistList->Add(fHistDistrSumIROC);
391 fHistDistrMaxIROC=(TH1F*)monitor.fHistDistrMaxIROC->Clone(); fHistList->Add(fHistDistrMaxIROC);
392 fHistDistrSumOROC=(TH1F*)monitor.fHistDistrSumOROC->Clone(); fHistList->Add(fHistDistrSumOROC);
393 fHistDistrMaxOROC=(TH1F*)monitor.fHistDistrMaxOROC->Clone(); fHistList->Add(fHistDistrMaxOROC);
395 fHistDistrBase2dIROC=(TH2F*)monitor.fHistDistrBase2dIROC->Clone(); fHistList->Add(fHistDistrBase2dIROC);
396 fHistDistrBase2dOROC=(TH2F*)monitor.fHistDistrBase2dOROC->Clone(); fHistList->Add(fHistDistrBase2dOROC);
397 fHistDistrBaseRmsIROC=(TH1D*)monitor.fHistDistrBaseRmsIROC->Clone(); fHistList->Add(fHistDistrBaseRmsIROC);
398 fHistDistrBaseMeanIROC=(TH1D*)monitor.fHistDistrBaseMeanIROC->Clone(); fHistList->Add(fHistDistrBaseMeanIROC);
399 fHistDistrBaseRmsOROC=(TH1D*)monitor.fHistDistrBaseRmsOROC->Clone(); fHistList->Add(fHistDistrBaseRmsOROC);
400 fHistDistrBaseMeanOROC=(TH1D*)monitor.fHistDistrBaseMeanOROC->Clone(); fHistList->Add(fHistDistrBaseMeanOROC);
402 fHistGlobalMaxA=(TH2S*)monitor.fHistGlobalMaxA->Clone(); fHistList->Add(fHistGlobalMaxA);
403 fHistGlobalMaxC=(TH2S*)monitor.fHistGlobalMaxC->Clone(); fHistList->Add(fHistGlobalMaxC);
405 fPad = new Int_t*[monitor.GetMaxHwAddr()];
406 for(Int_t i = 0; i<GetMaxHwAddr(); i++) { fPad[i] = new Int_t[monitor.GetTimeBins()];}
408 fPadMapRCU = new Int_t*[monitor.GetMaxHwAddr()];
409 for(Int_t i = 0; i<monitor.GetMaxHwAddr(); i++) { fPadMapRCU[i] = new Int_t[6];}
411 fPadMapHw = new Float_t[monitor.GetMaxHwAddr()];
413 fMapEqidsRcu = new Int_t[1000];
414 fMapEqidsSec = new Int_t*[36];
415 for(Int_t i = 0; i<36; i++) { fMapEqidsSec[i] = new Int_t[6];}
420 if (!gDirectory->GetList())
422 Warning("Build","Current directory is not a valid directory");
425 AliTPCMonitor *hold = (AliTPCMonitor*)gDirectory->GetList()->FindObject(monitor.GetName());
428 Warning("Build","Replacing existing histogram: %s (Potential memory leak).",monitor.GetName());
429 gDirectory->GetList()->Remove(hold);
431 gDirectory->Append(this);
433 fReaderDATEMon=monitor.fReaderDATEMon;
439 //____________________________________________________________________________
440 AliTPCMonitor::~AliTPCMonitor()
444 for(Int_t i = 0; i<GetMaxHwAddr(); i++) { delete[] fPad[i] ;}
445 for(Int_t i = 0; i<GetMaxHwAddr(); i++) { delete[] fPadMapRCU[i];}
450 //____________________________________________________________________________
451 void AliTPCMonitor::CreateHistos()
453 // Create histograms to be displayed
455 if(fVerb) cout << " create new ones " << endl;
456 fHistIROC = new TH2F("fHistIROC" ,"fHistIROC" ,fkNRowsIroc,0,fkNRowsIroc,fkNPadsIroc, fkNPadMinIroc, fkNPadMaxIroc); fHistList->Add(fHistIROC);
457 fHistOROC = new TH2F("fHistOROC" ,"fHistOROC" ,fkNRowsOroc,0,fkNRowsOroc,fkNPadsOroc, fkNPadMinOroc, fkNPadMaxOroc); fHistList->Add(fHistOROC);
459 fHistIROCIndex = new TH2S("fHistIROCIndex" ,"fHistIROCIndex" ,fkNRowsIroc,0,fkNRowsIroc,fkNPadsIroc, fkNPadMinIroc, fkNPadMaxIroc); fHistList->Add(fHistIROCIndex);
460 fHistOROCIndex = new TH2S("fHistOROCIndex" ,"fHistOROCIndex" ,fkNRowsOroc,0,fkNRowsOroc,fkNPadsOroc, fkNPadMinOroc, fkNPadMaxOroc); fHistList->Add(fHistOROCIndex);
462 fHistIROCTime = new TH2F("fHistIROCTime" ,"fHistIROCTime" ,fkNRowsIroc,0,fkNRowsIroc,fkNPadsIroc, fkNPadMinIroc, fkNPadMaxIroc); fHistList->Add(fHistIROCTime);
463 fHistOROCTime = new TH2F("fHistOROCTime" ,"fHistOROCTime" ,fkNRowsOroc,0,fkNRowsOroc,fkNPadsOroc, fkNPadMinOroc, fkNPadMaxOroc); fHistList->Add(fHistOROCTime);
465 fHistIROCRMS = new TH2F("fHistIROCRMS" ,"fHistIROCRMS" ,fkNRowsIroc,0,fkNRowsIroc,fkNPadsIroc, fkNPadMinIroc, fkNPadMaxIroc); fHistList->Add(fHistIROCRMS);
466 fHistOROCRMS = new TH2F("fHistOROCRMS" ,"fHistOROCRMS" ,fkNRowsOroc,0,fkNRowsOroc,fkNPadsOroc, fkNPadMinOroc, fkNPadMaxOroc); fHistList->Add(fHistOROCRMS);
468 fHistIROCSUM = new TH2F("fHistIROCSUM" ,"fHistIROCSUM" ,fkNRowsIroc,0,fkNRowsIroc,fkNPadsIroc, fkNPadMinIroc, fkNPadMaxIroc); fHistList->Add(fHistIROCSUM);
469 fHistOROCSUM = new TH2F("fHistOROCSUM" ,"fHistOROCSUM" ,fkNRowsOroc,0,fkNRowsOroc,fkNPadsOroc, fkNPadMinOroc, fkNPadMaxOroc); fHistList->Add(fHistOROCSUM);
471 fHistIROCBASE = new TH2F("fHistIROCBASE" ,"fHistIROCBASE" ,fkNRowsIroc,0,fkNRowsIroc,fkNPadsIroc, fkNPadMinIroc, fkNPadMaxIroc); fHistList->Add(fHistIROCBASE);
472 fHistOROCBASE = new TH2F("fHistOROCBASE" ,"fHistOROCBASE" ,fkNRowsOroc,0,fkNRowsOroc,fkNPadsOroc, fkNPadMinOroc, fkNPadMaxOroc); fHistList->Add(fHistOROCBASE);
475 fHistChannelTime = new TH2F("fHistChannelTime" ,"fHistChannelTime" ,GetNumOfChannels(),0,GetNumOfChannels(),GetTimeBins(),0,GetTimeBins());fHistList->Add(fHistChannelTime);
476 fHistAddrMapIndex = new TH1F("fHistAddrMapIndex" ,"fHistAddrMapIndex" ,GetMaxHwAddr() ,0,GetMaxHwAddr()); fHistList->Add(fHistAddrMapIndex);
477 fHistAddrMaxAdc = new TH1F("fHistAddrMaxAdc" ,"fHistAddrMaxAdc" ,GetMaxHwAddr(),0,GetMaxHwAddr()); fHistList->Add(fHistAddrMaxAdc);
478 fHistAddrMaxAdcX = new TH1F("fHistAddrMaxAdcX" ,"fHistAddrMaxAdcX" ,GetMaxHwAddr(),0,GetMaxHwAddr()); fHistList->Add(fHistAddrMaxAdcX);
479 fHistAddrBaseMean = new TH1F("fHistAddrBaseMean" ,"fHistAddrBaseMean" ,GetMaxHwAddr(),0,GetMaxHwAddr()); fHistList->Add(fHistAddrBaseMean);
480 fHistAddrAdcSum = new TH1F("fHistAddrAdcSum" ,"fHistAddrAdcSum" ,GetMaxHwAddr(),0,GetMaxHwAddr()); fHistList->Add(fHistAddrAdcSum);
481 fHistAddrBaseRms = new TH1F("fHistAddrBaseRms" ,"fHistAddrBaseRms" ,GetMaxHwAddr(),0,GetMaxHwAddr()); fHistList->Add(fHistAddrBaseRms);
482 fHistDistrSumIROC = new TH1F("fHistDistrSumIROC" ,"fHistDistrSumIROC" ,400,0.0,4000.0); fHistList->Add(fHistDistrSumIROC);
483 fHistDistrMaxIROC = new TH1F("fHistDistrMaxIROC" ,"fHistDistrMaxIROC" ,500,0.0,1000.0); fHistList->Add(fHistDistrMaxIROC);
484 fHistDistrSumOROC = new TH1F("fHistDistrSumOROC" ,"fHistDistrSumOROC" ,400,0.0,4000.0); fHistList->Add(fHistDistrSumOROC);
485 fHistDistrMaxOROC = new TH1F("fHistDistrMaxOROC" ,"fHistDistrMaxOROC" ,500,0.0,1000.0); fHistList->Add(fHistDistrMaxOROC);
487 fHistDistrBase2dIROC = new TH2F("fHistDistrBase2dIROC" ,"fHistDistrBase2dIROC",100,0.0,100.0,100,0.0,10.0); fHistList->Add(fHistDistrBase2dIROC);
488 fHistDistrBase2dOROC = new TH2F("fHistDistrBase2dOROC" ,"fHistDistrBase2dOROC",100,0.0,100.0,100,0.0,10.0); fHistList->Add(fHistDistrBase2dOROC);
490 fHistGlobalMaxA = new TH2S("SIDE A" ,"SIDE A" ,500,-3000,3000,500,-3000,3000); fHistList->Add(fHistGlobalMaxA);
491 fHistGlobalMaxC = new TH2S("SIDE C" ,"SIDE C" ,500,-3000,3000,500,-3000,3000); fHistList->Add(fHistGlobalMaxC);
495 //____________________________________________________________________________
496 Int_t AliTPCMonitor::ProcessEvent()
499 // Depending on the value of the sector id all sectors (sectorid == -1) are processed.
501 // In this case only the maximum values are calculated per pad and filled to the global histograms
502 // In a second loop the last processed(displayed) sector will be processed (sectorid!=-1)
503 // again and the baseline rms and further quantities are calculated
505 // If only one sector should be processed SetProcOneSector(1) should be set.
506 // In this case only the specified (last/last displayed) sector will be processed.
508 // If GetProcNextEvent()==0 the same event will be processed again
512 Int_t retflag = 0; // id of last sector + 1000, or error flag
513 if(GetProcNextEvent()==1 && fLastEv) { AliInfo("Last event already processed"); }
514 if(GetProcNextEvent()==1) ResetSectorArray();
517 if(GetProcNextEvent()==0 || GetProcOneSector()==1 ) sectorid = GetLastSector();
521 retflag = ReadData(sectorid);
523 SetLastProcFile(GetFile());
525 if(retflag>=10 && retflag<1000){ AliError("Could not read event properly: Check file name and format or try next event"); return 0 ;}
530 if(sectorid==-1 && retflag >1000)
532 AliInfo("Second read cycle");
534 if(GetLastSectorDisplayed()==-1) {sectorid = GetLastSector() ; }
535 else {sectorid = GetLastSectorDisplayed(); SetLastSector(sectorid) ; }
536 retflag = ReadData(sectorid);
539 SetLastSectorDisplayed(sectorid) ;
540 fMapHand->ReadfecHwMap(GetLastSector());
543 SetEventProcessed(1);
547 //__________________________________________________________________
548 Int_t AliTPCMonitor::ReadData(Int_t secid)
550 // Read Data File/Stream for specified Format.
551 // Payload will be extracted from either ROOT or DATE format
552 // and passed to FillHistsDecode for decoding of the adc information
554 Int_t format = GetFormat();
557 //if(format==2 && !gSystem->Getenv("DATE_ROOT")) { AliError("DATE not initialized on this system"); return 11;}
559 if( format==0) {return ReadDataROOT(secid);}
560 else if(format==1) {return ReadDataDATEFile(secid);}
563 return ReadDataDATEStream(secid);
566 AliWarning("Function should already be left");
569 //__________________________________________________________________
570 Int_t AliTPCMonitor::ReadDataDATEFile(Int_t secid)
572 // Read Data in Date format.
573 // Date file and monitor will be handled in this function.
575 if(fReaderROOT) { delete fReaderROOT ; fReaderROOT=0;}
578 if(fReaderDATEMon) { delete fReaderDATEMon ; fReaderDATEMon=0;}
581 Char_t* eventPtr = 0;
582 AliTPCMonitorDateFormat* dateform = 0;
585 if( fReaderDATE==0 || ( fReaderDATE!=0 && (strcmp(GetLastProcFile(),GetFile())!=0) ) )
587 cout << " Create new DATE file "<< endl;
588 if(fReaderDATE) { delete fReaderDATE ; fReaderDATE=0; }
589 fReaderDATE = new AliTPCMonitorDateFile() ;
590 fReaderDATE->SetName("fReaderDATE") ;
591 fReaderDATE->OpenDateFile(GetFile()) ;
595 // Get Event pointer ///
596 if(fReaderDATE->IsDateFileOpen() ==false ) { AliError("Could not open Date File"); return 11 ; }
597 // Rewind event if new event number is smaller than old one
598 if(fEventNumberOld>fEventNumber ) { fReaderDATE->ResetFilePos(); }
599 while(GetProcNextEvent() || fEventNumber==0)
601 fReaderDATE->ReadEvent();
602 eventPtr = fReaderDATE->GetMemoryPointer();
603 dateform = new AliTPCMonitorDateFormat(eventPtr);
604 Int_t currentev = dateform->GetEventID();
605 if(fEventNumber <= currentev ){ break; }
608 eventPtr = fReaderDATE->GetMemoryPointer();
610 if(dateform==0) dateform = new AliTPCMonitorDateFormat(eventPtr);
611 fEventNumber = dateform->GetEventID();
612 fEventNumberOld = dateform->GetEventID();
614 if(fReaderDATE->IsLastEvent()) fLastEv =1;
615 if(dateform->IsEventEndOfRun()) { AliInfo("Event is end of run: eventType END_OF_RUN "); }
617 if(fReaderDATE->IsEventValid() == false ) {AliInfo("Skipping Event because invalid"); return 10; }
618 if(dateform->IsEventPhysicsEvent() == false ) {AliInfo("Skipping Header/event because not Physics event"); return 12; }
622 Int_t lastrcu = ReadDataDATESubEventLoop(dateform,secid);
625 if(fVerb) cout << " last rcu " << lastrcu << endl;
631 //__________________________________________________________________
632 Int_t AliTPCMonitor::ReadDataDATEStream(Int_t secid)
634 // Read Data from DATE stream.
635 // Can also be used for DATE file.
638 if(fReaderROOT) { delete fReaderROOT ; fReaderROOT=0;}
639 if(fReaderDATE) { delete fReaderDATE ; fReaderDATE =0; }
641 Char_t* eventPtr = 0;
643 AliTPCMonitorDateFormat* dateform =0 ;
645 // Create objects ///
646 if((fReaderDATEMon==0 || ( fReaderDATEMon!=0 && (strcmp(GetLastProcFile(),GetFile())!=0) )))
648 if(fReaderDATEMon!=0)
650 fReaderDATEMon->Logout();
651 delete fReaderDATEMon;
653 fReaderDATEMon = new AliTPCMonitorDateMonitor();
654 fReaderDATEMon->SetName("DMon");
655 Int_t status = fReaderDATEMon->OpenMonitoring(GetFile());
656 if(status) { AliError(Form("Could not read event online: Error: %s",fReaderDATEMon->DecodeError(status))); return 11; }
659 if(GetProcNextEvent())
661 fReaderDATEMon->Free();
662 Int_t status = fReaderDATEMon->GetEvent();
663 if(status) { AliError(Form("Could not read event online: Error: %s",fReaderDATEMon->DecodeError(status))); return 11 ;}
664 //fReaderDATEMon->Logout();
667 eventPtr = fReaderDATEMon->GetEventPointerasChar();
669 if(dateform==0) dateform = new AliTPCMonitorDateFormat(eventPtr);
670 fEventNumber = dateform->GetEventID();
671 fEventNumberOld = dateform->GetEventID();
673 if(dateform->IsEventEndOfRun()) { AliInfo("Event is end of run: eventType END_OF_RUN "); }
674 if(dateform->IsEventPhysicsEvent() == false ) {AliInfo("Skipping Header/event because not Physics event"); return 12; }
678 Int_t lastrcu = ReadDataDATESubEventLoop(dateform,secid);
681 if(fVerb) cout << " last rcu " << lastrcu << endl;
685 //__________________________________________________________________
686 Int_t AliTPCMonitor::ReadDataDATEStream(Int_t /*secid*/)
688 // Read Data from DATE stream.
689 // Can also be used for DATE file.
690 // In case DATE is not install
691 // this method is dummy
693 AliError("DATE not initialized on this system");
698 Int_t AliTPCMonitor::ReadDataDATESubEventLoop(AliTPCMonitorDateFormat* dateform, Int_t secid)
700 // Loop over DATE Subevents
702 Bool_t exitSubEventLoop = false;
707 Char_t* eventPtr = 0;
708 UInt_t* eventPtrUI = 0;
712 while(exitSubEventLoop == false)
714 if(start==1) { dateform->GotoSubEventHeader() ; start=0;}
715 else { dateform->GotoNextSubEventHeader(); }
716 if(dateform->IsLastSubEventHeader()) exitSubEventLoop = true;
718 if(fVerb) cout << " next subevent LDC " << (Int_t)dateform->GetSubEventLDC() << endl;
725 if(neq ==0){ dateform->GotoFirstEquipment();}
726 else { dateform->GotoNextEquipment();}
728 fGdcId = dateform->GetSubEventGDC() ;
729 fLdcId = dateform->GetSubEventLDC();
730 fRunId = dateform->GetEventRunID();
731 fEqId = dateform->GetEquipmentID();
732 rcupatch = GetRCUPatch(fRunId, fEqId);
733 lastrcuid = (rcupatch+1000);
736 if(fLdcIdOld!=fLdcId && fChannelIter!=0) {
739 FillGlobal(GetLastSector());
751 if(dateform->IsLastEquipment() != false ) lasteq = 1;
753 eventPtr = dateform->GetFirstDataPointer();
754 eventPtrUI = (UInt_t *) eventPtr;
755 Int_t payload = dateform->GetPayloadSize(); // 40Bit words
757 if(fVerb)DumpHeader(dateform);
758 if(fVerb) cout << "Check sector and fEqId " << endl;
760 if(fVerb && secid >0 )
762 cout << "secid : "<< secid << " fEqId "<< fEqId << " equipment 0 form map " << endl;
763 cout << fMapEqidsSec[secid][0] << endl;
764 cout << " showed map_eqids " << endl;
767 if(CheckEqId(secid,fEqId))
769 if(fVerb) cout << " init altro " << endl;
770 AliTPCMonitorAltro* altro = new AliTPCMonitorAltro((UInt_t *)eventPtrUI,(payload/4),1); //hier
771 altro->SetWrite10Bit(GetWrite10Bit());
772 altro->SetActFilename(GetFile());
773 if(fVerb) cout << " allocated 10bit " << endl;
774 altro->Allocate10BitArray();
775 altro->Decodeto10Bit(fEqId);
776 AliInfo(Form("Process eqid %i , patch %i ",fEqId,rcupatch%6));
777 FillHistsDecode(altro,(rcupatch%6),secid);
778 if(fChannelIter!=0 && secid==-1 ) SetSectorFilled(rcupatch/6);
782 SetLastSector(rcupatch/6);
784 if(fChannelIter!=0 && secid==-1){ FillGlobal(GetLastSector()); }
788 //__________________________________________________________________
789 Int_t AliTPCMonitor::ReadDataROOT(Int_t secid)
791 // Read in data in ROOT format
792 if(fReaderDATE){ delete fReaderDATE ; fReaderDATE=0;}
796 Int_t equipmentSize = 0;
797 UChar_t* eventPtr = 0 ;
798 UInt_t* eventPtrUI = 0 ;
801 if(fReaderROOT==0 || ( fReaderROOT!=0 && (strcmp(GetLastProcFile(),GetFile())!=0) ) )
803 if(fVerb) cout << "AliTPCMonitor::ReadDataROOT create new reader " << endl;
804 if(fReaderROOT) { delete fReaderROOT ; fReaderROOT=0; }
805 fReaderROOT = new AliRawReaderRoot(GetFile());
806 if(!fReaderROOT) { AliError("Could not initiate AliRawReaderRoo "); return 10;}
810 // reset to beginning of the event
811 fReaderROOT->Reset();
813 // Rewind event if new event number is smaller than old one
814 if(fEventNumberOld>fEventNumber) fReaderROOT->RewindEvents();
816 while(GetProcNextEvent() || fEventNumber==0)
818 if(fVerb) cout << "AliTPCMonitor::ReadDataROOT get event " << endl;
819 if(!fReaderROOT->NextEvent()) { AliError("Could not get next Event"); return 11 ;}
820 Int_t currentev = *(fReaderROOT->GetEventId());
822 if(fEventNumber <= currentev ){ break; }
825 fEventNumber = *(fReaderROOT->GetEventId());
826 fEventNumberOld = *(fReaderROOT->GetEventId());
830 while(fReaderROOT->ReadHeader())
832 if(fVerb) cout << "AliTPCMonitor::ReadDataROOT read header " << endl;
833 fGdcId = fReaderROOT->GetGDCId() ;
834 fLdcId = fReaderROOT->GetLDCId() ;
835 fRunId = fReaderROOT->GetRunNumber() ;
836 equipmentSize = fReaderROOT->GetEquipmentSize();
837 fEqId = fReaderROOT->GetEquipmentId();
838 evtype = fReaderROOT->GetType();
839 rcupatch = GetRCUPatch(fRunId, fEqId);
840 lastrcuid = (rcupatch+1000);
842 if(evtype==1) { AliWarning(Form("EventType==1 in event %i ",fEventNumber)); return 10; }
843 if(equipmentSize==0) { AliWarning(Form("Equipmentsize ==0 in event %i ",fEventNumber)); return 10; }
845 if(fVerb) DumpHeader(fReaderROOT);
847 if(fLdcIdOld!=fLdcId && fChannelIter!=0) {
850 FillGlobal(GetLastSector());
861 if(CheckEqId(secid,fEqId))
863 fReaderROOT->ReadNextData(eventPtr);
864 eventPtrUI = (UInt_t *) eventPtr;
866 Int_t fsize = (Int_t)((equipmentSize/4) -offset) +1;
867 AliTPCMonitorAltro* altro = new AliTPCMonitorAltro((UInt_t *)eventPtrUI,fsize,2);
868 altro->SetWrite10Bit(GetWrite10Bit());
869 if(fVerb) cout << "AliTPCMonitor::ReadDataROOT Set Write10bit to " << GetWrite10Bit() << endl;
870 altro->SetActFilename(GetFile());
871 altro->Allocate10BitArray();
872 altro->Decodeto10Bit(fEqId);
873 AliInfo(Form("Process sector %i eqid %i , patch %i ",rcupatch/6,fEqId,rcupatch%6));
874 FillHistsDecode(altro,(rcupatch%6),secid);
875 if(fChannelIter!=0 && secid==-1 ) SetSectorFilled(rcupatch/6);
878 SetLastSector(rcupatch/6);
880 if(fChannelIter!=0 && secid==-1) { FillGlobal(GetLastSector()); }
885 //____________________________________________________________________________
886 void AliTPCMonitor::FillHistsDecode(AliTPCMonitorAltro* altro ,Int_t rcupatch, Int_t secid)
888 // Decode Channels, calculate base mean and rms depending on the
889 // value of secid (see ProcessEvent) and fill histograms
892 if(fVerb) cout << "FillHistsDecode : rcupatch " << rcupatch << " id " << secid << endl;
894 Int_t sampleiter = 0;
895 Int_t samplelength = 0;
896 Int_t samplebins = 0;
904 Int_t nextHwAddress = 0;
908 Int_t lastpos = altro->Get10BitArraySize()-1;
909 Short_t* entries = altro->Get10BitArray();
911 Double_t hmean = 0.0;
912 Int_t supnextpos = 0;
913 // TH1D* hbase = new TH1D("hbase","hbase",GetTimeBins(),0.5,(GetTimeBins()+0.5));
917 nextpos = altro->DecodeTrailer(lastpos);
918 supnextpos = altro->GetNextTrailerPos();
919 if(nextpos==-1) { break; }
922 blockpos = altro->GetTrailerBlockPos();
923 hw = altro->GetTrailerHwAddress();
924 nwords = altro->GetTrailerNWords();
925 nextHwAddress = ( hw + (rcupatch<<12) );
926 fPad[fChannelIter][0] = nextHwAddress ;
928 if(fPadMapHw[nextHwAddress]!=-1 )
930 //Int_t hw_before1 = fPad[fChannelIter-2][0];
931 //Int_t hw_before2 = fPad[fChannelIter-3][0];
933 if(fVerb){ cout <<"\n //// Ambiguous hwaddress " << nextHwAddress << " write 10bit files and check file for eqid : " << fEqId << " /////// " << endl;}
936 if( TMath::Abs(fPadMapRCU[nextHwAddress][4] - fChannelIter)==1)
938 if(fVerb) cout << "//// Difference to previous channel==1 : reset branch bit of hw from last channel to 1 " << endl;
939 Int_t hwreset = (nextHwAddress + (1<<11));
940 fPad[fChannelIter-1][0] = hwreset;
942 fPadMapHw[hwreset] = fChannelIter-1 ;
943 fPadMapRCU[hwreset][0]= rcupatch ;
944 fPadMapRCU[hwreset][1]= ((hwreset & AliTPCMonitorAltro::GetHwMaskBranch()) >> 11);
945 fPadMapRCU[hwreset][2]= ((hwreset & AliTPCMonitorAltro::GetHwMaskFEC()) >>7 );
946 fPadMapRCU[hwreset][3]= ( hwreset & AliTPCMonitorAltro::GetHwMaskFECChannel() );
947 fPadMapRCU[hwreset][4]= fChannelIter-1;
948 fPadMapRCU[hwreset][5]= altro->GetTrailerPos();
952 fPadMapHw[nextHwAddress] = fChannelIter ;
953 fPadMapRCU[nextHwAddress][0]= rcupatch ;
954 fPadMapRCU[nextHwAddress][1]= ((nextHwAddress & AliTPCMonitorAltro::GetHwMaskBranch())>> 11) ;
955 fPadMapRCU[nextHwAddress][2]= ((nextHwAddress & AliTPCMonitorAltro::GetHwMaskFEC()) >>7);
956 fPadMapRCU[nextHwAddress][3]= (nextHwAddress & AliTPCMonitorAltro::GetHwMaskFECChannel());
957 fPadMapRCU[nextHwAddress][4]= fChannelIter;
958 fPadMapRCU[nextHwAddress][5]= altro->GetTrailerPos();
972 for(Int_t iterwords = 0 ; iterwords< nwords ; iterwords++)
974 if(entries[blockpos-iterwords]==682) { continue; }
975 if(entries[blockpos-iterwords]!=682 && sampleiter==0)
977 samplelength = entries[blockpos-iterwords];
978 sampleiter = samplelength;
980 timestamp = entries[blockpos-iterwords-1];
986 ntime = timestamp-samplebins;
987 adc = entries[blockpos-iterwords];
988 fPad[fChannelIter][ntime] = adc;
989 // if( (adc!=0) && (ntime>=GetRangeBaseMin() ) && (ntime<GetRangeBaseMax() )) {hbase->Fill(adc) ;}
990 if( (adc>max) && (ntime>=GetRangeMaxAdcMin()) && (ntime<GetRangeMaxAdcMax() )) {max = adc;maxx = ntime ;}
991 if( (ntime>=GetRangeSumMin()) && (ntime<GetRangeSumMax() )) {sum+=adc; sumn++;}
997 // hmean = hbase->GetMean();
998 // hbase->GetXaxis()->SetRangeUser(hmean- hmean/3 , hmean + hmean/3);
999 // hmean = hbase->GetMean();
1000 // hrms = hbase->GetRMS();
1002 if( GetPedestals()==1) fHistAddrMaxAdc->SetBinContent( nextHwAddress,max- hmean);
1003 else fHistAddrMaxAdc->SetBinContent( nextHwAddress,max );
1009 fHistDistrBase2dIROC->Fill(hmean,hrms);
1010 fHistDistrSumIROC->Fill(sum);
1011 if( GetPedestals()==1 ) { fHistDistrMaxIROC->Fill(max-hmean); fHistDistrSumIROC->Fill(sum -sumn*hmean);}
1012 else { fHistDistrMaxIROC->Fill(max); fHistDistrSumIROC->Fill(sum );}
1016 fHistDistrBase2dOROC->Fill(hmean,hrms);
1017 fHistDistrSumOROC->Fill(sum);
1018 if( GetPedestals()==1 ){ fHistDistrMaxOROC->Fill(max-hmean); fHistDistrSumOROC->Fill(sum -sumn*hmean);}
1019 else { fHistDistrMaxOROC->Fill(max); fHistDistrSumOROC->Fill(sum) ;}
1022 fHistAddrAdcSum->SetBinContent( nextHwAddress,sum);
1023 fHistAddrMapIndex->SetBinContent(nextHwAddress,fChannelIter);
1024 fHistAddrBaseMean->SetBinContent(nextHwAddress,hmean);
1025 fHistAddrMaxAdcX->SetBinContent( nextHwAddress,maxx);
1026 fHistAddrBaseRms->SetBinContent( nextHwAddress,hrms);
1029 if(nextpos<0) { AliError("Error : next pos < 0 "); break ;}
1036 //____________________________________________________________________________
1037 void AliTPCMonitor::FillHistsPadPlane()
1039 // Fill 2Dim histograms for IROC and OROC (max , rms and sum)
1041 if(fVerb)cout << "AliTPCMonitor::FillHistsPadPlane() Start " << endl;
1042 if(fVerb)PrintConfig();
1049 for(Int_t ch = 0; ch<fChannelIter; ch++)
1052 fHistChannelTime->SetCellContent(ch,0,hwadd);
1054 for(Int_t bin = 1; bin <GetTimeBins(); bin++)
1056 if( fHistChannelTime->GetCellContent(ch,bin)!=0) cout << " cellcontent already set " << endl;
1057 if( GetPedestals()==1 ) fHistChannelTime->SetCellContent(ch,bin,(fPad[ch][bin]- fHistAddrBaseMean->GetBinContent(hwadd)));
1058 else fHistChannelTime->SetCellContent(ch,bin,(fPad[ch][bin]));
1061 pad = fMapHand->GetPad( hwadd);
1062 row = fMapHand->GetPadRow(hwadd);
1063 padmax = fMapHand->GetNumofPads(row);
1067 fHistIROC->SetCellContent( row +1 ,pad +55 -padmax/2 +1,fHistAddrMaxAdc->GetBinContent( hwadd));
1068 fHistIROCIndex->SetCellContent(row +1 ,pad +55 -padmax/2 +1,ch);
1069 fHistIROCRMS->SetCellContent( row +1 ,pad +55 -padmax/2 +1,fHistAddrBaseRms->GetBinContent( hwadd));
1070 fHistIROCBASE->SetCellContent( row +1 ,pad +55 -padmax/2 +1,fHistAddrBaseMean->GetBinContent(hwadd));
1071 fHistIROCSUM->SetCellContent( row +1 ,pad +55 -padmax/2 +1,fHistAddrAdcSum->GetBinContent( hwadd));
1075 fHistOROC->SetCellContent( row-63 +1 ,pad +70 -padmax/2 +1,fHistAddrMaxAdc->GetBinContent( hwadd));
1076 fHistOROCIndex->SetCellContent(row-63 +1 ,pad +70 -padmax/2 +1,ch);
1077 fHistOROCRMS->SetCellContent( row-63 +1 ,pad +70 -padmax/2 +1,fHistAddrBaseRms->GetBinContent( hwadd));
1078 fHistOROCBASE->SetCellContent( row-63 +1 ,pad +70 -padmax/2 +1,fHistAddrBaseMean->GetBinContent(hwadd));
1079 fHistOROCSUM->SetCellContent( row-63 +1 ,pad +70 -padmax/2 +1,fHistAddrAdcSum->GetBinContent( hwadd));
1083 fHistChannelTime->GetXaxis()->SetRange(0,fChannelIter);
1084 fHistChannelTime->GetYaxis()->SetRange(0,GetTimeBins());
1089 //____________________________________________________________________________
1090 void AliTPCMonitor::ResetArrays()
1092 // Reset data arrays
1093 for(Int_t row = 0 ; row < fkNRowsIroc; row++)
1095 for(Int_t pad = 0 ; pad < fkNPadsIroc ; pad++)
1097 fHistIROCIndex->SetCellContent(row+1,pad+1,-1);
1100 for(Int_t row = 0 ; row < fkNRowsOroc; row++)
1102 for(Int_t pad = 0 ; pad < fkNPadsOroc ; pad++)
1104 fHistOROCIndex->SetCellContent(row+1,pad+1,-1);
1108 for(Int_t ch= 0; ch<GetMaxHwAddr(); ch++)
1110 fHistAddrMaxAdcX->SetBinContent(ch,-1);
1111 fHistAddrMapIndex->SetBinContent(ch,-1);
1112 fHistAddrMaxAdc->SetBinContent( ch, 0);
1113 fHistAddrBaseMean->SetBinContent( ch, 0);
1114 fHistAddrAdcSum->SetBinContent( ch, 0);
1115 fHistAddrBaseRms->SetBinContent(ch, 0);
1118 for(Int_t ch = 0; ch< GetNumOfChannels(); ch++)
1120 for(Int_t bin = 0; bin< GetTimeBins(); bin++)
1125 for(Int_t ch = 0; ch< GetMaxHwAddr(); ch++)
1128 fPadMapRCU[ch][0]=-1;
1129 fPadMapRCU[ch][1]=-1;
1130 fPadMapRCU[ch][2]=-1;
1131 fPadMapRCU[ch][3]=-1;
1132 fPadMapRCU[ch][4]=-1;
1133 fPadMapRCU[ch][5]=-1;
1139 //____________________________________________________________________________
1140 void AliTPCMonitor::ResetHistos()
1143 for(Int_t i =0; i<fHistList->GetEntries(); i++)
1145 if(GetProcNextEvent()==0 && strcmp(((TH1*)fHistList->At(i))->GetName(),"SIDE A")==0) continue;
1146 if(GetProcNextEvent()==0 && strcmp(((TH1*)fHistList->At(i))->GetName(),"SIDE C")==0) continue;
1147 ((TH1*)fHistList->At(i))->Reset();
1152 //____________________________________________________________________________
1153 void AliTPCMonitor::DeleteHistos()
1155 // Delete histograms
1156 for(Int_t i =0; i<fHistList->GetEntries(); i++)
1158 delete (TH1*)fHistList->At(i);
1163 //__________________________________________________________________
1164 Int_t AliTPCMonitor::CheckEqId(Int_t secid,Int_t eqid)
1166 // Check if equipment id corresponds to any rcu patch in sector
1167 // Equipment ids changed during commisioning in 2006 (starting from run 704)
1168 // However Runids started from 0 again in 2007
1169 // Now only runids from commissioning in 2006 after runid 704 and all new ones are supported.
1170 // Comment in equipment check for runids < 704 if old runs should be processed
1172 if(fVerb) cout << "AliTPCMonitor::CheckEqId : SectorId " << secid << " EquipmentId " << eqid << " runid " << fRunId << endl;
1174 if(fRunId<704 && 0) // commented out --> runs with runid < 704 in 2006 are not recognized anymore
1176 if( (secid>-1) && (secid<36) ) // if ( secid is in range) { take only specific eqids} else { take all }
1178 if( (secid==13) && ( eqid!=408 && eqid!=409 && eqid!=509 && eqid!=512 && eqid!=513 && eqid!=517 )) {passed=0;}
1179 else if( (secid==4) && ( eqid!=404 && eqid!=504 && eqid!=407 && eqid!=503 && eqid!=508 && eqid!=506 )) {passed=0;}
1181 else {if(fVerb) cout << "passed check "<< endl; }
1185 if( (secid>-1) && (secid<36) ) // if ( secid is in range) { take only specific eqids} else { take all }
1187 if(eqid!=fMapEqidsSec[secid][0] && eqid!= fMapEqidsSec[secid][1] && eqid!=fMapEqidsSec[secid][2] &&
1188 eqid!=fMapEqidsSec[secid][3] && eqid!= fMapEqidsSec[secid][4] && eqid!=fMapEqidsSec[secid][5] ) {passed=0;}
1190 else {if(fVerb) cout << "passed check "<< endl;}
1195 //__________________________________________________________________
1196 void AliTPCMonitor::SetEqIds()
1198 // Set mapping for equipment ids
1199 for(Int_t i = 0; i<36 ; i++)
1201 for(Int_t j = 0; j<6; j++)
1203 if(j<2) fMapEqidsSec[i][j]= 768+i*2+j;
1204 else fMapEqidsSec[i][j]= 840+i*4+j-2;
1208 for(Int_t i = 0; i<36 ; i++)
1210 for(Int_t j = 0; j<6; j++)
1212 if(j<2) fMapEqidsRcu[768+i*2+j] = i*6 +j;
1213 else fMapEqidsRcu[840+i*4+j-2] = i*6 +j;
1218 //__________________________________________________________________
1219 void AliTPCMonitor::FillGlobal(Int_t sector)
1222 // Fill global histograms with max adc for each channel
1225 if((sector/18) ==0) hglob = fHistGlobalMaxA;
1226 else hglob = fHistGlobalMaxC;
1228 Float_t rotsec = (2*TMath::Pi()/18.0);
1229 Float_t rot = (-rotsec*(sector%18) +4*rotsec);
1231 Float_t m11 = TMath::Cos(rot);
1232 Float_t m12 = TMath::Sin(rot);
1233 Float_t m21 = -1*TMath::Sin(rot);
1234 Float_t m22 = TMath::Cos(rot);
1236 Int_t max = 0; // use integer for global view
1238 Double_t xval = 0.0;
1239 Double_t yval = 0.0;
1248 for(Int_t hw = 0; hw<fHistAddrMaxAdc->GetNbinsX(); hw++)
1250 max = (Int_t)fHistAddrMaxAdc->GetBinContent(hw);
1253 pad = fMapHand->GetPad( hw);
1254 row = fMapHand->GetPadRow(hw);
1255 padmax = fMapHand->GetNumofPads(row);
1256 if (sector%36>17) fMirror=-1;
1258 GetXY(xval ,yval , padmax,row ,pad);
1259 xdr = xval*m11 +yval*m12;
1260 ydr = xval*m21 +yval*m22;
1261 if(hglob->GetBinContent(hglob->GetXaxis()->FindBin(xdr),hglob->GetYaxis()->FindBin(ydr))==0) hglob->Fill(xdr,ydr,(Int_t)max);
1267 //__________________________________________________________________
1268 void AliTPCMonitor::GetXY( Double_t& xval , Double_t& yval , Int_t padmax, Int_t row , Int_t pad) const
1270 // Get x and y position of pad
1274 xval = fMirror*( 2*padmax -4*pad -2);
1275 yval = 852.25 +7.5*row;
1279 xval = fMirror*( 3*padmax -6*pad -3);
1280 if((row-63)<63) { yval = 10*(row-63) +1351; }
1281 else { yval = 15*(row-63-64)+1993.5; }
1286 //__________________________________________________________________
1287 Int_t AliTPCMonitor::GetPadAtX(Float_t xval, Int_t row, Int_t padmax) const
1289 // Get pad number at given position in x
1292 if(row<63) {pad = (Int_t)( ( (xval/fMirror) +2 -2*padmax)/-4);}
1293 else {pad = (Int_t)( ( (xval/fMirror) +3 -3*padmax)/-6);}
1295 if(pad>=padmax) return -1;
1300 //__________________________________________________________________
1301 Int_t AliTPCMonitor::GetPadAtX(Float_t xval, Int_t row) const
1304 // Get pad number at given position in x
1306 Int_t padmax = fMapHand->GetNumofPads(row);
1309 if(row<63) {pad = (Int_t)( ( (xval/fMirror) +2 -2*padmax)/-4);}
1310 else {pad = (Int_t)( ( (xval/fMirror) +3 -3*padmax)/-6);}
1312 if(pad>=padmax) return -1;
1317 //__________________________________________________________________
1318 void AliTPCMonitor::DrawHists(Int_t histos)
1321 // Draw sets of histograms
1322 // histos==1 : 2Dim histos for MAX adc and add executables
1323 // histos==2 : distributions max/rms/sum
1324 // histos==3 : global max adc for specified SideA/C
1327 if(fVerb) cout << " Draw histos " << endl;
1329 if(GetLastSector()/18==0 ) sprintf(cside,"A");
1330 else sprintf(cside,"C");
1332 Char_t titleSEC[256]; sprintf(titleSEC ,"Sector %i Side %s Run : %05i EventID %i " ,GetLastSector()%18,cside,fRunId, fEventNumber);
1333 Char_t titleEvent[256]; sprintf(titleEvent ,"Time <-> Channles %s" ,titleSEC);
1334 Char_t titleIROC[256]; sprintf(titleIROC ,"IROC %s" ,titleSEC);
1335 Char_t titleOROC[256]; sprintf(titleOROC ,"OROC %s" ,titleSEC);
1337 Char_t titleMAX[256]; sprintf(titleMAX ,"Max (timebin: %i,%i) %s" ,GetRangeMaxAdcMin(),GetRangeMaxAdcMax(),titleSEC);
1338 Char_t titleSUM[256]; sprintf(titleSUM ,"Sum (timebin: %i,%i) %s" ,GetRangeSumMin() ,GetRangeSumMax() ,titleSEC);
1339 Char_t titleBASE[256]; sprintf(titleBASE ,"Baseline RMS<->Mean (timebin: %i-%i) %s" ,GetRangeBaseMin() ,GetRangeBaseMax() ,titleSEC);
1340 Char_t titleMEAN[256]; sprintf(titleMEAN ,"Baseline Mean (timebin: %i-%i) %s" ,GetRangeBaseMin() ,GetRangeBaseMax() ,titleSEC);
1341 Char_t titleRMS[256] ; sprintf(titleRMS ,"Baseline RMS (timebin: %i-%i) %s" ,GetRangeBaseMin() ,GetRangeBaseMax() ,titleSEC);
1345 // IROC _______________________________________________________________
1347 ciroc = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("ciroc");
1350 ciroc = CreateCanvas("ciroc");
1355 fHistIROC->SetXTitle("row");
1356 fHistIROC->SetYTitle("pad");
1357 if(GetPedestals()) fHistIROC->SetZTitle("max ADC (baseline sub)");
1358 else fHistIROC->SetZTitle("max ADC ");
1359 fHistIROC->SetTitle(titleIROC);
1360 fHistIROC->SetMinimum(0.01);
1361 fHistIROC->Draw("COLZ");
1362 ciroc->UseCurrentStyle();
1365 fHistIROCTime->SetXTitle("row"); fHistIROCTime->SetZTitle("peak time (fit)"); fHistIROCTime->SetYTitle("pad"); fHistIROCTime->SetTitle(titleIROC);
1366 fHistIROCRMS->SetXTitle("row"); fHistIROCRMS->SetZTitle( "baseline rms (ADC)"); fHistIROCRMS->SetYTitle("pad"); fHistIROCRMS->SetTitle(titleIROC);
1370 coroc =(TCanvas*)gROOT->GetListOfCanvases()->FindObject("coroc");
1372 coroc = CreateCanvas("coroc");
1377 fHistOROC->SetXTitle("row");
1378 fHistOROC->SetYTitle("pad");
1379 if(GetPedestals()) fHistOROC->SetZTitle("max ADC (baseline sub)");
1380 else fHistOROC->SetZTitle("max ADC ");
1381 fHistOROC->SetTitle(titleOROC);
1382 fHistOROC->SetMinimum(0.01);
1383 fHistOROC->Draw("COLZ");
1384 coroc->UseCurrentStyle();
1387 fHistOROCTime->SetXTitle("row"); fHistOROCTime->SetZTitle("peak time (fit) (timebins)"); fHistOROCTime->SetYTitle("pad"); fHistOROCTime->SetTitle(titleOROC);
1388 fHistOROCRMS->SetXTitle("row"); fHistOROCRMS->SetZTitle("baseline rms (ADC)"); fHistOROCRMS->SetYTitle("pad"); fHistOROCRMS->SetTitle(titleOROC);
1391 Char_t namesum[256] ; sprintf(namesum,"ADC sum (bins: %i, %i)",GetRangeSumMin() ,GetRangeSumMax() );
1392 fHistIROCSUM->SetXTitle("row"); fHistIROCSUM->SetZTitle(namesum); fHistIROCSUM->SetYTitle("pad"); fHistIROCSUM->SetTitle(titleIROC);
1393 fHistOROCSUM->SetXTitle("row"); fHistOROCSUM->SetZTitle(namesum); fHistOROCSUM->SetYTitle("pad"); fHistOROCSUM->SetTitle(titleOROC);
1396 Char_t namebase[256] ; sprintf(namebase ,"base mean (timbebin: %i, %i )",GetRangeBaseMin(),GetRangeBaseMax());
1397 fHistIROCBASE->SetXTitle("row"); fHistIROCBASE->SetZTitle(namebase); fHistIROCBASE->SetYTitle("pad"); fHistIROCBASE->SetTitle(titleIROC);
1398 fHistOROCBASE->SetXTitle("row"); fHistOROCBASE->SetZTitle(namebase); fHistOROCBASE->SetYTitle("pad"); fHistOROCBASE->SetTitle(titleOROC);
1400 if(fHistIROCClone) fHistIROCClone->Delete();
1401 if(fHistOROCClone) fHistOROCClone->Delete();
1402 fHistIROCClone = (TH2F*)fHistIROC->Clone("fHistIROCClone");
1403 fHistOROCClone = (TH2F*)fHistOROC->Clone("fHistOROCClone");
1406 if(fExecPlaneMax==0)
1409 sprintf(carry1,".x %s/TPC/AliTPCMonitorExec.C(1)",gSystem->Getenv("ALICE_ROOT"));
1410 ciroc->AddExec("pad",carry1);
1411 coroc->AddExec("pad",carry1);
1414 sprintf(carry2,".x %s/TPC/AliTPCMonitorExec.C(2)",gSystem->Getenv("ALICE_ROOT"));
1415 ciroc->AddExec("row",carry2);
1416 coroc->AddExec("row",carry2);
1424 // MAX ADC distribution ____________________________________________
1426 cmax = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("cmax");
1427 if(!cmax) cmax = CreateCanvas("cmax");
1430 fHistDistrMaxIROC->GetXaxis()->SetRangeUser(0.0,1000.0);
1431 fHistDistrMaxIROC->SetXTitle("max ADC (ADC)");
1432 fHistDistrMaxIROC->SetYTitle("counts");
1433 fHistDistrMaxIROC->SetTitle(titleMAX);
1434 fHistDistrMaxIROC->Draw("");
1435 fHistDistrMaxOROC->SetLineColor(2);
1436 fHistDistrMaxOROC->Draw("same");
1438 if(fHistDistrMaxOROC->GetMaximum()> fHistDistrMaxIROC->GetMaximum()) fHistDistrMaxIROC->SetMaximum(fHistDistrMaxOROC->GetMaximum()*1.1);
1440 TLegend* legio = new TLegend(0.6,0.6,0.8,0.8);
1441 legio->SetFillColor(0);
1442 legio->AddEntry(fHistDistrMaxIROC,"IROC","l");
1443 legio->AddEntry(fHistDistrMaxOROC,"OROC","l");
1444 legio->Draw("same");
1446 // ADC sum distribution
1448 csum = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("csum");
1449 if(!csum) csum = CreateCanvas("csum") ;
1452 fHistDistrSumIROC->SetXTitle("sum ADC (ADC)");
1453 fHistDistrSumIROC->SetYTitle("counts");
1454 fHistDistrSumIROC->SetTitle(titleSUM);
1455 fHistDistrSumIROC->Draw("");
1456 fHistDistrSumOROC->SetLineColor(2);
1457 fHistDistrSumOROC->Draw("same");
1458 if(fHistDistrSumOROC->GetMaximum()> fHistDistrSumIROC->GetMaximum()) fHistDistrSumIROC->SetMaximum(fHistDistrSumOROC->GetMaximum()*1.1);
1459 legio->Draw("same");
1461 // BASELINE MEAN distribution
1462 TCanvas* cbasemean = 0;
1463 cbasemean = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("cbasemean");
1464 if(!cbasemean) cbasemean = CreateCanvas("cbasemean");
1467 fHistDistrBaseMeanIROC = fHistDistrBase2dIROC->ProjectionX("fHistDistrBaseMeanIROC");
1468 fHistDistrBaseMeanIROC->SetXTitle("base mean (ADC)");
1469 fHistDistrBaseMeanIROC->SetYTitle("counts");
1470 fHistDistrBaseMeanIROC->SetTitle(titleMEAN);
1471 fHistDistrBaseMeanIROC->Draw("");
1473 fHistDistrBaseMeanOROC = fHistDistrBase2dOROC->ProjectionX("fHistDistrBaseMeanOROC");
1474 fHistDistrBaseMeanOROC->SetLineColor(2);
1475 fHistDistrBaseMeanOROC->Draw("same");
1476 if(fHistDistrBaseMeanOROC->GetMaximum()>fHistDistrBaseMeanIROC->GetMaximum()) fHistDistrBaseMeanIROC->SetMaximum(fHistDistrBaseMeanOROC->GetMaximum()*1.1);
1477 legio->Draw("same");
1479 TCanvas* cbaserms = 0;
1480 cbaserms = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("cbaserms");
1481 if(!cbaserms) cbaserms = CreateCanvas("cbaserms") ;
1484 // BASELINE RMS distribution
1485 fHistDistrBaseRmsIROC = fHistDistrBase2dIROC->ProjectionY("fHistDistrBaseRmsIROC");
1486 fHistDistrBaseRmsIROC->SetXTitle("base rms (ADC)");
1487 fHistDistrBaseRmsIROC->SetYTitle("counts");
1488 fHistDistrBaseRmsIROC->SetTitle(titleRMS);
1489 fHistDistrBaseRmsIROC->Draw("");
1491 fHistDistrBaseRmsOROC = fHistDistrBase2dOROC->ProjectionY("fHistDistrBaseRmsOROC");
1492 fHistDistrBaseRmsOROC->SetLineColor(2);
1493 fHistDistrBaseRmsOROC->Draw("same");
1494 if(fHistDistrBaseRmsOROC->GetMaximum()>fHistDistrBaseRmsIROC->GetMaximum()) fHistDistrBaseRmsIROC->SetMaximum(fHistDistrBaseRmsOROC->GetMaximum()*1.1);
1495 legio->Draw("same");
1499 cbasemean->Update();
1504 // GLOBAL MAX ADC _________________________________
1505 if(GetProcNextEvent()==1)
1510 if(!(cglobC=(TCanvas*)gROOT->GetListOfCanvases()->FindObject("SIDE C all"))) cglobC = CreateCanvas("SIDE C all");
1511 if(!(cglobA=(TCanvas*)gROOT->GetListOfCanvases()->FindObject("SIDE A all"))) cglobA = CreateCanvas("SIDE A all");
1513 Char_t globtitle1[256]; sprintf(globtitle1,"SIDE A Run %05i (EventID %i)",fRunId,fEventNumber);
1514 Char_t globtitle2[256]; sprintf(globtitle2,"SIDE C Run %05i (EventID %i)",fRunId,fEventNumber);
1516 fHistGlobalMaxA->SetTitle(globtitle1);
1517 fHistGlobalMaxC->SetTitle(globtitle2);
1518 fHistGlobalMaxA->SetXTitle("x/mm");
1519 fHistGlobalMaxA->SetYTitle("y/mm");
1520 fHistGlobalMaxC->SetXTitle("x/mm");
1521 fHistGlobalMaxC->SetYTitle("y/mm");
1523 if(GetPedestals()==0) { fHistGlobalMaxA->SetZTitle("max adc (not baseline sub)"); fHistGlobalMaxC->SetZTitle("max adc (not baseline sub)"); }
1524 else { fHistGlobalMaxA->SetZTitle("max adc "); fHistGlobalMaxC->SetZTitle("max adc "); }
1526 fHistGlobalMaxA->SetMinimum(0.01);
1527 fHistGlobalMaxC->SetMinimum(0.01);
1529 cglobC->cd() ; fHistGlobalMaxC->Draw("COLZ");
1530 cglobA->cd() ; fHistGlobalMaxA->Draw("COLZ");
1533 sprintf(nameom,".x %s/TPC/AliTPCMonitorExec.C(3)",gSystem->Getenv("ALICE_ROOT"));
1537 if(fVerb)cout << " set exec " << nameom << endl;
1538 cglobC->AddExec("glob",nameom);
1539 cglobA->AddExec("glob",nameom);
1544 cglobC->DeleteExec("glob");
1545 cglobA->DeleteExec("glob");
1547 if(fVerb) cout << " set exec " << nameom << endl;
1548 cglobC->AddExec("glob",nameom);
1549 cglobA->AddExec("glob",nameom);
1561 //__________________________________________________________________
1562 void AliTPCMonitor::DrawRMSMap()
1564 // Draw 2Dim rms histos for IROC and OROC
1565 // and set executables for canvases
1567 TCanvas* crmsoroc =0;
1568 TCanvas* crmsiroc =0;
1569 if(!(crmsoroc = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("crmsoroc"))) crmsoroc = CreateCanvas("crmsoroc");
1570 if(!(crmsiroc = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("crmsiroc"))) crmsiroc = CreateCanvas("crmsiroc");
1572 crmsiroc->cd(); fHistIROCRMS->Draw("COLZ");
1573 crmsoroc->cd(); fHistOROCRMS->Draw("COLZ");
1575 Char_t carry1[100]; sprintf(carry1,".x %s/TPC/AliTPCMonitorExec.C(1)",gSystem->Getenv("ALICE_ROOT"));
1576 Char_t carry2[100]; sprintf(carry2,".x %s/TPC/AliTPCMonitorExec.C(2)",gSystem->Getenv("ALICE_ROOT"));
1578 if(fExecPadIrocRms==0)
1580 crmsiroc->AddExec("pad",carry1);
1581 crmsiroc->AddExec("row",carry2);
1585 if(fExecPadOrocRms==0)
1587 crmsoroc->AddExec("pad",carry1);
1588 crmsoroc->AddExec("row",carry2);
1599 //__________________________________________________________________
1600 void AliTPCMonitor::ExecPad()
1603 // Executable for Pad
1604 // Show time profile for channel the mouse is pointing at
1606 Int_t event = gPad->GetEvent();
1607 if (event != 51) return;
1609 TObject *select = gPad->GetSelected();
1611 if(!select->InheritsFrom("TH2")) { return; }
1612 gPad->GetCanvas()->FeedbackMode(kTRUE);
1615 Int_t px = gPad->GetEventX();
1616 Int_t py = gPad->GetEventY();
1617 Float_t upy = gPad->AbsPixeltoY(py);
1618 Float_t upx = gPad->AbsPixeltoX(px);
1619 Float_t y = gPad->PadtoY(upy);
1620 Float_t x = gPad->PadtoX(upx);
1625 // Char_t namehist[50];
1626 Char_t projhist[60];
1627 Char_t namesel[256];
1628 Char_t namecanv[256];
1632 Float_t ybinmin = 0;
1633 Float_t ybinmax = 0;
1636 // Check wich Canvas executed the event
1638 sprintf(namesel,select->GetName());
1639 if(strcmp(namesel,"fHistOROC")==0 || strcmp(namesel,"fHistOROCRMS")==0 || strcmp(namesel,"fHistOROCTime")==0 )
1643 sprintf(projhist,"ProjectionOROC");
1644 sprintf(namecanv,"coroc_ch");
1645 fHistIndex = fHistOROCIndex;
1647 if(strcmp(namesel,"fHistIROC")==0 || strcmp(namesel,"fHistIROCRMS")==0 || strcmp(namesel,"fHistIROCTime")==0 )
1651 sprintf(projhist,"ProjectionIROC");
1652 sprintf(namecanv,"ciroc_ch");
1653 fHistIndex = fHistIROCIndex;
1656 // Check if Canvas already existed and get Ranges from former Prjection histogram
1657 if((cpad=(TCanvas*)gROOT->GetListOfCanvases()->FindObject(namecanv)))
1660 if(gROOT->Get(projhist))
1663 xbinmin = ((TH1D*)gROOT->Get(projhist))->GetXaxis()->GetFirst();
1664 xbinmax = ((TH1D*)gROOT->Get(projhist))->GetXaxis()->GetLast();
1665 ybinmin = ((TH1D*)gROOT->Get(projhist))->GetMinimum();
1666 ybinmax = ((TH1D*)gROOT->Get(projhist))->GetMaximum();
1667 delete gROOT->Get("legfit");
1668 delete gROOT->Get("fg");
1673 cpad = CreateCanvas(namecanv); cpad->cd();
1677 Int_t testy = fHistIndex->GetYaxis()->FindBin(y);
1678 Int_t testx = fHistIndex->GetXaxis()->FindBin(x);
1679 Int_t binchannel = (Int_t)fHistIndex->GetCellContent(testx,testy);
1680 if(binchannel>30000 || binchannel<0) return;
1682 if(gROOT->Get(projhist)) delete gROOT->Get(projhist);
1684 TH1D *hp = (TH1D*)(((TH1D*)fHistChannelTime->ProjectionY("hp",binchannel,binchannel))->Clone(projhist));
1686 // Make title and Pave for channel Info
1688 Int_t npadRow , npad , nhw , nmax , hwadd;
1690 hwadd = (Int_t)fHistChannelTime->GetCellContent(binchannel,0);
1691 fPadUsedHwAddr = hwadd;
1693 if(rocid==0)npadRow = fMapHand->GetPadRow(hwadd);
1694 else npadRow = fMapHand->GetPadRow(hwadd)-63;
1695 npad = fMapHand->GetPad(hwadd);
1697 nmax = (Int_t)hp->GetMaximum();
1700 TPaveText* legstat = new TPaveText(0.18,0.65,0.3,0.8,"NDC");
1702 Int_t connector = fMapHand->GetFECconnector(hwadd);
1703 Int_t fecnr = fMapHand->GetFECfromHw(hwadd);
1704 Int_t fecch = fMapHand->GetFECchannel(hwadd);
1705 Int_t altrochip = fMapHand->GetAltro(hwadd);
1706 Int_t altrochannel= (fMapHand->GetAltroChannel(hwadd))%16;
1707 Int_t fecloc = fMapHand->U2fGetFECinRCU(fecnr) ;
1708 Int_t feclocbran = fMapHand->U2fGetFECinBranch(fecnr);
1709 Int_t branch = fMapHand->U2fGetBranch(fecnr);
1712 Short_t fecget = (hwadd & AliTPCMonitorAltro::GetHwMaskFEC()) >> 7;
1713 Short_t branchget = (hwadd & AliTPCMonitorAltro::GetHwMaskBranch())>> 11;
1716 Char_t nstat1[100]; Char_t nstat2[100]; Char_t nstat3[100]; Char_t nstat4[100];
1717 Char_t nstat5[100]; Char_t nstat6[100]; Char_t nstat7[100]; Char_t nstat8[100];
1719 sprintf(nstat1,"Branch (map) \t %i (%i) \n",branchget,branch);
1720 sprintf(nstat2,"Fec in patch \t %i \n",fecloc);
1721 sprintf(nstat8,"Fec in branch (map)\t %i (%i)\n",fecget,feclocbran);
1722 sprintf(nstat7,"Connector \t %i \n",connector);
1723 sprintf(nstat3,"Fec No. \t %i \n",fecnr);
1724 sprintf(nstat4,"Fec chan \t %i \n",fecch);
1725 sprintf(nstat5,"Altro chip\t %i \n",altrochip);
1726 sprintf(nstat6,"Altro chan\t %i \n",altrochannel);
1728 legstat->AddText(nstat1); legstat->AddText(nstat2); legstat->AddText(nstat8); legstat->AddText(nstat7);
1729 legstat->AddText(nstat3); legstat->AddText(nstat4); legstat->AddText(nstat5); legstat->AddText(nstat6);
1731 sprintf(title,"Row=%d Pad=%d Hw =%d maxADC =%d count =%d",npadRow,npad,nhw,nmax,binchannel);
1733 hp->SetName(projhist);
1734 hp->SetTitleSize(0.04);
1735 hp->SetTitle(title);
1736 hp->SetYTitle("ADC");
1737 hp->SetXTitle("Timebin");
1738 hp->GetXaxis()->SetTitleColor(1);
1742 hp->GetXaxis()->SetRange(xbinmin,xbinmax);
1743 hp->SetMinimum(ybinmin);
1744 hp->SetMaximum(ybinmax);
1748 hp->SetMinimum(0.0);
1749 hp->SetMaximum(1000.0);
1756 if(GetPedestals() && fDisableFit==0)
1758 Int_t maxx = (Int_t)fHistAddrMaxAdcX->GetBinContent(hwadd);
1759 Float_t max = (Float_t)fHistAddrMaxAdc->GetBinContent(hwadd);
1760 Float_t base = (Float_t)fHistAddrBaseMean->GetBinContent(hwadd);
1763 if( ((max+base)/base)>1.2)
1765 TF1* fg = new TF1("fg",AliTPCMonitor::Gamma4,maxx-5,maxx+5,4);
1766 fg->SetParName(0,"Normalisation");
1767 fg->SetParName(1,"Minimum");
1768 fg->SetParName(2,"Width");
1769 fg->SetParName(3,"Base");
1770 fg->SetParameter(0,max);
1771 fg->SetParameter(1,maxx-2);
1772 fg->SetParameter(2,1.5);
1773 fg->FixParameter(3,0);
1774 fg->SetLineColor(4);
1775 fg->SetLineWidth(1);
1778 TLegend* legfit = new TLegend(0.6,0.7,0.7,0.8);
1779 legfit->AddEntry("fg","#Gamma 4 fit","l");
1780 legfit->SetFillColor(0);
1781 legfit->SetName("legfit");
1782 legfit->Draw("same");
1786 legstat->SetFillColor(0);
1787 legstat->Draw("same");
1792 //__________________________________________________________________
1793 void AliTPCMonitor::ExecRow()
1796 // Executable for Pad
1797 // Show profile of max adc over given pad row
1798 // and 2dim histo adc(pad-in-row,time bin)
1800 Int_t event = gPad->GetEvent();
1801 if (event != 61) return;
1803 TObject *select = gPad->GetSelected();
1805 if(!select->InheritsFrom("TH2")) { return; }
1808 // Char_t namehist[50];
1810 Char_t rowhistsum[60];
1811 Char_t rowhistmax[60];
1812 Char_t rowhistxmax[60];
1814 sprintf(rowhist, "hrowtime");
1815 sprintf(rowhistxmax ,"hxmax");
1816 sprintf(rowhistmax , "hrowmax");
1819 Int_t px = gPad->GetEventX();
1820 Int_t py = gPad->GetEventY();
1821 Float_t upy = gPad->AbsPixeltoY(py);
1822 Float_t upx = gPad->AbsPixeltoX(px);
1823 Float_t y = gPad->PadtoY(upy);
1824 Float_t x = gPad->PadtoX(upx);
1826 TCanvas*crowtime = 0;
1827 TCanvas*crowmax = 0;
1830 TH2S* fHistIndex = 0;
1832 // ranges from already existing histos
1833 Int_t rowtimexmin = 0;
1834 Int_t rowtimexmax = 0;
1835 Int_t rowtimeymin = 0;
1836 Int_t rowtimeymax = 0;
1837 Float_t rowtimezmin = 0;
1838 Float_t rowtimezmax = 0;
1840 Int_t profrowxmin = 0;
1841 Int_t profrowxmax = 0;
1842 Double_t profrowymin = 0;
1843 Double_t profrowymax = 0;
1845 Int_t profxxmin = 0;
1846 Int_t profxxmax = 0;
1847 Double_t profxymin = 0;
1848 Double_t profxymax = 0;
1854 if( strcmp(select->GetName(),"fHistIROC")==0 || strcmp(select->GetName(),"fHistIROCRMS")==0 ) { fHistIndex = fHistIROCIndex; rocid =1; }
1855 else if(strcmp(select->GetName(),"fHistOROC")==0 || strcmp(select->GetName(),"fHistOROCRMS")==0 ) { fHistIndex = fHistOROCIndex; rocid =2; }
1856 else { cout << " not implemented for this histo " << endl; return; }
1858 gPad->GetCanvas()->FeedbackMode(kTRUE);
1862 // check if canvases exist //
1863 crowtime = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("crowtime");
1864 crowmax = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("crowmax");
1865 cxmax = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("cxmax");
1867 if(!crowtime) crowtime = CreateCanvas("crowtime") ;
1868 if(!crowmax) crowmax = CreateCanvas("crowmax") ;
1869 if(!cxmax ) cxmax = CreateCanvas("cxmax") ;
1871 // check ranges of already existing histos
1872 if(gROOT->Get(rowhist))
1874 rowtimexmin = ((TH2F*)gROOT->Get(rowhist))->GetXaxis()->GetFirst();
1875 rowtimexmax = ((TH2F*)gROOT->Get(rowhist))->GetXaxis()->GetLast();
1876 rowtimeymin = ((TH2F*)gROOT->Get(rowhist))->GetYaxis()->GetFirst();
1877 rowtimeymax = ((TH2F*)gROOT->Get(rowhist))->GetYaxis()->GetLast();
1878 rowtimezmin = ((TH2F*)gROOT->Get(rowhist))->GetMinimum();
1879 rowtimezmax = ((TH2F*)gROOT->Get(rowhist))->GetMaximum();
1881 profrowxmin = ((TH1F*)gROOT->Get(rowhistmax))->GetXaxis()->GetFirst();
1882 profrowxmax = ((TH1F*)gROOT->Get(rowhistmax))->GetXaxis()->GetLast();
1883 profrowymin = ((TH1F*)gROOT->Get(rowhistmax))->GetMinimum();
1884 profrowymax = ((TH1F*)gROOT->Get(rowhistmax))->GetMaximum();
1886 profxxmin = ((TH1F*)gROOT->Get(rowhistxmax))->GetXaxis()->GetFirst();
1887 profxxmax = ((TH1F*)gROOT->Get(rowhistxmax))->GetXaxis()->GetLast();
1888 profxymin = ((TH1F*)gROOT->Get(rowhistxmax))->GetMinimum();
1889 profxymax = ((TH1F*)gROOT->Get(rowhistxmax))->GetMaximum();
1893 delete gROOT->Get(rowhist);
1894 delete gROOT->Get(rowhistmax);
1895 delete gROOT->Get(rowhistsum);
1896 delete gROOT->Get("hxmax");
1897 delete gROOT->Get("legrow");
1900 // get channel for xy bin -> getRow -> getNrows -> getHw for each Pad in Row -> get channel for each hw -> make proj
1901 Int_t testy = fHistIndex->GetYaxis()->FindBin(y);
1902 Int_t testx = fHistIndex->GetXaxis()->FindBin(x);
1903 Int_t binchannel = (Int_t)fHistIndex->GetCellContent(testx,testy);
1905 if(binchannel>30000) return;
1906 if(binchannel<=0 ) { crowtime->Update() ; crowmax->Update() ; return ; }
1909 Int_t hwadd = (Int_t)fHistChannelTime->GetCellContent(binchannel,0);
1910 Int_t row = fMapHand->GetPadRow(hwadd);
1911 Int_t pad = fMapHand->GetPad(hwadd) ;
1912 Int_t numofpads = fMapHand->GetNumofPads(row);
1915 TH2F *hrowtime = new TH2F(rowhist , "" ,numofpads,0,numofpads,GetTimeBins(),0.0,GetTimeBins());
1916 TH1F *hrowmax = new TH1F(rowhistmax , "" ,numofpads,0,numofpads);
1917 TH1F *hxmax = new TH1F(rowhistxmax, "" ,159,0,159 );
1919 // Row profile ///////////
1920 if(fVerb) cout << " Number of pads " << numofpads << endl;
1921 for(Int_t padnr = 0; padnr<numofpads;padnr++)
1923 Int_t addrinrow = fMapHand->GetPadAddInRow(row,padnr );
1924 Int_t channel = (Int_t)fHistAddrMapIndex->GetBinContent(addrinrow);
1925 if(channel==-1) continue;
1927 hrowmax->SetBinContent(padnr+1,fHistAddrMaxAdc->GetBinContent(addrinrow));
1928 TH1D *hp = fHistChannelTime->ProjectionY("hp",channel,channel);
1929 for(Int_t time = 0;time<GetTimeBins();time++) {
1931 Float_t val = hp->GetBinContent(time);
1932 hrowtime->SetCellContent(padnr+1,time+1,val);
1936 // X profile /////////////
1937 Double_t xval = 0.0;
1938 Double_t yval = 0.0;
1939 GetXY(xval,yval,numofpads,row,pad);
1943 for(Int_t nrow = 0; nrow<159; nrow++)
1945 padnr = GetPadAtX(xval,nrow);
1948 hw = fMapHand->GetPadAddInRow(nrow,padnr);
1949 if(fPadMapHw[hw]==-1){ continue ; }
1950 else { hxmax->SetBinContent(nrow+1,fHistAddrMaxAdc->GetBinContent(hw)) ; }
1955 Char_t hxtitle[50] ; sprintf(hxtitle,"max adc in pads at x=%5.1f mm",xval);
1956 hxmax->SetTitle(hxtitle);
1957 hxmax->SetXTitle("row");
1958 if(!GetPedestals()) hxmax->SetYTitle("max adc (baseline sub.)");
1959 else hxmax->SetYTitle("max adc ");
1960 hxmax->SetMinimum(0.01);
1965 hxmax->GetXaxis()->SetRange(profxxmin,profxxmax);
1966 hxmax->SetMinimum(profxymin);
1967 hxmax->SetMaximum(profxymax);
1974 Char_t titlemax[256];
1975 if(rocid==1) {sprintf(title,"%s Row=%d",((TH2*)select)->GetTitle(),row) ; sprintf(titlemax,"IROC max/sum Row=%d",row );}
1976 else {sprintf(title,"%s Row=%d",((TH2*)select)->GetTitle(),row-63); sprintf(titlemax,"OROC max/sum Row=%d",row-63);}
1977 if(fVerb) cout << " set name " << endl;
1982 hrowtime->SetTitleSize(0.04);
1983 hrowtime->SetTitle(title);
1984 hrowtime->SetYTitle("timbin");
1985 hrowtime->SetXTitle("pad in row");
1986 hrowtime->SetZTitle("signal (ADC)");
1988 hrowtime->GetXaxis()->SetTitleColor(1);
1989 hrowtime->SetMaximum(1000.0);
1990 hrowtime->SetMinimum(0.0);
1994 hrowtime->GetXaxis()->SetRange(rowtimexmin,rowtimexmax);
1995 hrowtime->GetYaxis()->SetRange(rowtimeymin,rowtimeymax);
1996 hrowtime->SetMinimum(rowtimezmin);
1997 hrowtime->SetMaximum(rowtimezmax);
2000 hrowtime->Draw("COLZ");
2001 crowtime->UseCurrentStyle();
2004 // max and sum /////////////////////////
2007 hrowmax->GetXaxis()->SetRange(profrowxmin,profrowxmax);
2008 hrowmax->SetMinimum(profrowymin);
2009 hrowmax->SetMaximum(profrowymax);
2011 hrowmax->SetTitleSize(0.04);
2012 hrowmax->SetTitle(title);
2013 hrowmax->SetYTitle("max adc");
2014 hrowmax->SetXTitle("pad in row");
2015 hrowmax->GetXaxis()->SetTitleColor(1);
2017 hrowmax->SetLineColor(2);
2024 //__________________________________________________________________
2025 void AliTPCMonitor::Write10bitChannel()
2028 // Write 10 bit words form histogram for active(last pointed) channel
2030 if(fPadUsedHwAddr==-1){ AliWarning(" No active pad "); return ;}
2032 Int_t pad = (Int_t)fMapHand->GetPad( fPadUsedHwAddr);
2033 Int_t row = (Int_t)fMapHand->GetPadRow(fPadUsedHwAddr);
2034 Int_t channel = (Int_t)fPadMapHw[fPadUsedHwAddr];
2036 Char_t filenameroot[256];
2037 Char_t filenamedat[256];
2038 Char_t projhist[256];
2040 if(fPadUsedRoc==1) { sprintf(projhist,"ProjectionOROC"); }
2041 if(fPadUsedRoc==0) { sprintf(projhist,"ProjectionIROC"); }
2043 sprintf(filenamedat, "Channel_Run%05i_EventID_%i_Pad_%i_Row_%i.dat" ,fRunId,fEventNumber,pad,row);
2044 sprintf(filenameroot,"Channel_Run%05i_EventID_%i_Pad_%i_Row_%i.root" ,fRunId,fEventNumber,pad,row);
2047 if((hpr=(TH1D*)gROOT->Get(projhist)))
2050 TFile f(filenameroot,"recreate");
2055 ofstream datout(filenamedat,ios::out);
2056 datout <<"Timebin \t ADC value " << endl;
2057 for(Int_t i = 1; i <GetTimeBins(); i++)
2059 datout << i << " \t \t " << fPad[channel][i] << endl;
2065 AliWarning("No projection histo found ");
2069 //__________________________________________________________________
2070 void AliTPCMonitor::ExecTransform()
2073 // Make Fast Fourier Transformation for active pad
2074 // fft is only performed for a data sample of size 2^n
2075 // reduce window according to largest power of 2 which is smaller than the viewing range
2077 Char_t namecanv[256];
2078 Char_t projhist[256];
2079 Char_t namehtrimag[256];
2080 Char_t namehtrreal[256];
2082 if(fPadUsedRoc==1) { sprintf(namecanv,"coroc_ch_trans") ; sprintf(projhist,"ProjectionOROC"); }
2083 if(fPadUsedRoc==0) { sprintf(namecanv,"ciroc_ch_trans") ; sprintf(projhist,"ProjectionIROC"); }
2087 if((TH1D*)gROOT->Get(projhist)==0){AliWarning("Proj histo does not exist \n Move mouse over 2d histo choose channel \n and drag mouse form histo again!"); return ;}
2088 else hproj = (TH1D*)gROOT->Get(projhist) ;
2091 if(fPadUsedRoc==1) { sprintf(namehtrimag,"htransimagfreq_oroc"); sprintf(namehtrreal,"htransrealfreq_oroc"); }
2092 else { sprintf(namehtrimag,"htransimagfreq_iroc"); sprintf(namehtrreal,"htransrealfreq_iroc"); }
2094 if( gROOT->Get(namehtrimag)) delete gROOT->Get(namehtrimag);
2095 if( gROOT->Get(namehtrreal)) delete gROOT->Get(namehtrreal);
2097 TCanvas *ctrans = 0;
2098 if(!(ctrans = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(namecanv)))
2100 ctrans = CreateCanvas(namecanv);
2101 ctrans->Divide(1,2);
2104 Int_t binfirst = hproj->GetXaxis()->GetFirst();
2105 Int_t binlast = hproj->GetXaxis()->GetLast();
2106 Int_t bins = binlast -binfirst +1;
2109 for(Int_t pot = 0; pot<=10 ; pot++)
2111 Int_t comp = (Int_t)TMath::Power(2,pot);
2112 if(bins>=comp)power = pot;
2115 bins = (Int_t)TMath::Power(2,power);
2117 // sampling frequency ;
2118 Double_t deltat = 1.0/(Float_t)GetSamplingFrequency();
2121 TH1D* htransrealfreq = new TH1D(namehtrreal,namehtrreal,10000,-1/(2*deltat),1/(2*deltat));
2122 TH1D* htransimagfreq = new TH1D(namehtrimag,namehtrimag,10000,-1/(2*deltat),1/(2*deltat));
2125 Char_t titlereal[256];
2126 Char_t titleimag[256];
2127 if(fPadUsedRoc==1) { sprintf(titlereal,"OROC DFT real part"); sprintf(titleimag,"OROC DFT imag part"); }
2128 else { sprintf(titlereal,"IROC DFT real part"); sprintf(titleimag,"IROC DFT imag part"); }
2130 htransrealfreq->SetTitle(titlereal); htransrealfreq->SetXTitle("f/hz"); htransrealfreq->SetYTitle("z_{real}(f)");
2131 htransimagfreq->SetTitle(titleimag); htransimagfreq->SetXTitle("f/hz"); htransimagfreq->SetYTitle("z_{imag}(f)");
2134 // create complex packed data array
2135 const Int_t kdatasiz = 2*bins;
2136 Double_t* data = new Double_t[kdatasiz];
2137 for(Int_t i=0;i<2*bins;i++) { data[i] = 0.0;}
2138 for(Int_t i=0;i<bins;i++) { data[2*i] = (Double_t)hproj->GetBinContent(binfirst+i); }
2140 // make fourier transformation
2141 AliTPCMonitorFFT* four = new AliTPCMonitorFFT();
2142 four->ComplexRadix2ForwardWrap(data,1,bins);
2144 // write output and fill histos forward
2145 Double_t freq = 0.0;
2146 for(Int_t i=0;i<2*bins;i++)
2150 if(i<(bins/2)) { freq = i/(bins*deltat) ; }
2151 else { freq = -1*((bins-i)/(bins*deltat)); }
2152 htransrealfreq->Fill( freq,data[2*i] );
2153 htransimagfreq->Fill( freq,data[2*i+1]);
2160 htransrealfreq->Draw();
2162 htransimagfreq->Draw();
2168 //__________________________________________________________________
2169 void AliTPCMonitor::ShowSel(Int_t* compval)
2172 // Show only selected components
2173 // First restore original histogram from clone
2174 // Than remove all not matching pads form histos
2176 Int_t connector = 0;
2178 Int_t altrochip = 0;
2179 Int_t feclocbran = 0;
2186 Float_t maxiroc = fHistIROCClone->GetMaximum();
2187 Float_t maxoroc = fHistOROCClone->GetMaximum();
2190 // restore original histos
2191 for(Int_t row = 0; row<fkNRowsIroc; row++)
2193 for(Int_t pad = 0; pad<fkNPadsIroc; pad++)
2195 index = (Int_t)fHistIROCIndex->GetCellContent(row+1,pad+1);
2196 if(index==-1)continue;
2197 else fHistIROC->SetCellContent(row+1,pad+1,fHistIROCClone->GetCellContent(row+1,pad+1));
2200 for(Int_t row = 0; row<fkNRowsOroc; row++)
2202 for(Int_t pad = 0; pad<fkNPadsOroc; pad++)
2204 index = (Int_t)fHistOROCIndex->GetCellContent(row+1,pad+1);
2205 if(index==-1)continue;
2206 else fHistOROC->SetCellContent(row+1,pad+1,fHistOROCClone->GetCellContent(row+1,pad+1));
2211 // remove not matching entries from fHistIROC/fHistOROC
2214 TH2S* fHistIndex =0;
2218 for(Int_t row = 0; row< (fkNRowsIroc + fkNRowsOroc); row++)
2220 if(row<fkNRowsIroc) { fHist=fHistIROC ; fHistIndex = fHistIROCIndex; npads = fkNPadsIroc; subrows =0 ;}
2221 else { fHist=fHistOROC ; fHistIndex = fHistOROCIndex; npads = fkNPadsOroc; subrows =fkNRowsIroc;}
2223 for(Int_t pad = 0; pad<npads; pad++)
2225 index = (Int_t)fHistIndex->GetCellContent(row -subrows +1,pad+1);
2226 if(index==-1) continue ;
2227 hwadd = (Int_t)fHistChannelTime->GetCellContent(index,0);
2230 fecnr = fMapHand->GetFECfromHw(hwadd);
2231 if(compval[0]!=-1 && fecnr!=compval[0]) { fHist->SetCellContent(row-subrows+1,pad+1,0); continue; }
2234 rcuget = (hwadd & AliTPCMonitorAltro::GetHwMaskRCU())>> 12;
2235 if(compval[1]!=-1 && rcuget!=compval[1]) { fHist->SetCellContent(row-subrows+1,pad+1,0); continue; }
2238 branch = fMapHand->U2fGetBranch(fecnr) ;
2239 if(compval[2]!=-1 && branch!=compval[2]) { fHist->SetCellContent(row-subrows+1,pad+1,0); continue; }
2242 feclocbran= fMapHand->U2fGetFECinBranch(fecnr) ;
2243 if(compval[3]!=-1 && feclocbran!=compval[3]) { fHist->SetCellContent(row-subrows+1,pad+1,0); continue; }
2246 connector = fMapHand->GetFECconnector(hwadd);
2247 if(compval[4]!=-1 && connector!=compval[4]) { fHist->SetCellContent(row-subrows+1,pad+1,0); continue; }
2250 altrochip = fMapHand->GetAltro(hwadd);
2251 if(compval[5]!=-1 && altrochip!=compval[5]) { fHist->SetCellContent(row-subrows+1,pad+1,0); continue; }
2258 if(gROOT->GetListOfCanvases()->FindObject("ciroc"))
2260 c1 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("ciroc");
2262 fHistIROC->Draw("COLZ");
2263 fHistIROC->SetMaximum(maxiroc);
2264 fHistIROC->SetMinimum(0.0);
2267 if(gROOT->GetListOfCanvases()->FindObject("coroc"))
2269 c2 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("coroc");
2271 fHistOROC->Draw("COLZ");
2272 fHistOROC->SetMaximum(maxoroc);
2273 fHistOROC->SetMinimum(0.0);
2279 //__________________________________________________________________
2280 void AliTPCMonitor::ResizeCanv()
2282 // Resize canvases and delete some of them
2285 sprintf(carry1,".x %s/TPC/AliTPCMonitorExec.C(1)",gSystem->Getenv("ALICE_ROOT"));
2287 sprintf(carry3,".x %s/TPC/AliTPCMonitorExec.C(2)",gSystem->Getenv("ALICE_ROOT"));
2288 if(fVerb) cout << " canv 1 " << endl;
2290 if(gROOT->GetListOfCanvases()->FindObject( "coroc_ch")) { delete gROOT->GetListOfCanvases()->FindObject("coroc_ch") ; }
2291 if(gROOT->GetListOfCanvases()->FindObject( "ciroc_ch")) { delete gROOT->GetListOfCanvases()->FindObject("ciroc_ch") ; }
2293 // for 2dim plots delete create and draw again
2294 if(gROOT->GetListOfCanvases()->FindObject("ciroc"))
2296 delete gROOT->GetListOfCanvases()->FindObject("ciroc");
2297 TCanvas* ciroc = CreateCanvas("ciroc");
2299 fHistIROC->Draw("COLZ");
2300 ciroc->AddExec("pad",carry1);
2301 ciroc->AddExec("row",carry3);
2305 // for 2dim plots delete create and draw again
2306 if(gROOT->GetListOfCanvases()->FindObject("coroc"))
2308 delete gROOT->GetListOfCanvases()->FindObject("coroc");
2309 TCanvas* coroc = CreateCanvas("coroc");
2311 fHistOROC->Draw("COLZ");
2313 coroc->AddExec("pad",carry1);
2314 coroc->AddExec("row",carry3);
2319 if(gROOT->GetListOfCanvases()->FindObject( "cbasemean")) { delete gROOT->GetListOfCanvases()->FindObject("cbasemean"); }
2320 if(gROOT->GetListOfCanvases()->FindObject( "cbase")) { delete gROOT->GetListOfCanvases()->FindObject("cbase");}
2321 if(gROOT->GetListOfCanvases()->FindObject( "cbaserms")) { delete gROOT->GetListOfCanvases()->FindObject("cbaserms"); }
2322 if(gROOT->GetListOfCanvases()->FindObject( "cmax")) { delete gROOT->GetListOfCanvases()->FindObject("cmax"); }
2323 if(gROOT->GetListOfCanvases()->FindObject( "csum")) { delete gROOT->GetListOfCanvases()->FindObject("csum"); }
2324 if(gROOT->GetListOfCanvases()->FindObject( "ciroc_ch_trans")) { delete gROOT->GetListOfCanvases()->FindObject("ciroc_ch_trans");}
2325 if(gROOT->GetListOfCanvases()->FindObject( "coroc_ch_trans")) { delete gROOT->GetListOfCanvases()->FindObject("coroc_ch_trans");}
2326 if(gROOT->GetListOfCanvases()->FindObject( "crowtime")) { delete gROOT->GetListOfCanvases()->FindObject("crowtime"); }
2327 if(gROOT->GetListOfCanvases()->FindObject( "crowmax")) { delete gROOT->GetListOfCanvases()->FindObject("crowmax"); }
2328 if(gROOT->GetListOfCanvases()->FindObject( "cxmax")) { delete gROOT->GetListOfCanvases()->FindObject("cxmax"); }
2329 if(gROOT->GetListOfCanvases()->FindObject( "crmsoroc")) { delete gROOT->GetListOfCanvases()->FindObject("crmsoroc"); fExecPadOrocRms = 0; }
2330 if(gROOT->GetListOfCanvases()->FindObject( "crmsiroc")) { delete gROOT->GetListOfCanvases()->FindObject("crmsiroc"); fExecPadIrocRms = 0; }
2331 if(gROOT->GetListOfCanvases()->FindObject( "crowmax")) { delete gROOT->GetListOfCanvases()->FindObject("crowmax"); }
2332 if(gROOT->GetListOfCanvases()->FindObject( "crowmax")) { delete gROOT->GetListOfCanvases()->FindObject("crowmax"); }
2339 //__________________________________________________________________
2340 Int_t AliTPCMonitor::ExecProcess()
2342 // Executable for global Histogram
2343 // Will be called from /TPC/AliTPCMonitorExec.C(3)
2344 // Call ProcessEvent for same event and sector pointed at
2349 Int_t event = gPad->GetEvent();
2350 if(event != 61) return -1;
2352 TObject *select = gPad->GetSelected();
2353 if(!select) return -1;
2354 if(!select->InheritsFrom("TH2")) {gPad->SetUniqueID(0); return -1; }
2355 if( strcmp(select->GetName(),"hglobal" )==0 || ( strcmp(select->GetName(),"SIDE A" )==0) ) side = 0;
2356 else if( strcmp(select->GetName(),"hglobal2")==0 || ( strcmp(select->GetName(),"SIDE C" )==0) ) side = 1;
2359 Int_t px = gPad->GetEventX();
2360 Int_t py = gPad->GetEventY();
2361 Float_t upy = gPad->AbsPixeltoY(py);
2362 Float_t upx = gPad->AbsPixeltoX(px);
2363 Float_t y = gPad->PadtoY(upy);
2364 Float_t x = gPad->PadtoX(upx);
2366 Int_t testy = ((TH2*)select)->GetYaxis()->FindBin(y);
2367 Int_t testx = ((TH2*)select)->GetXaxis()->FindBin(x);
2368 if(((TH2*)select)->GetCellContent(testx,testy)==0) return -1 ;
2370 Float_t alpha = 0.0;
2371 if(x>0.0 && y > 0.0) alpha = TMath::Abs(TMath::ATan(TMath::Abs(x/y)));
2372 if(x>0.0 && y < 0.0) alpha = TMath::Abs(TMath::ATan(TMath::Abs(y/x)));
2373 if(x<0.0 && y < 0.0) alpha = TMath::Abs(TMath::ATan(TMath::Abs(x/y)));
2374 if(x<0.0 && y > 0.0) alpha = TMath::Abs(TMath::ATan(TMath::Abs(y/x)));
2376 if(x>0.0 && y < 0.0) alpha += ( TMath::Pi()/2);
2377 if(x<0.0 && y < 0.0) alpha += ( TMath::Pi());
2378 if(x<0.0 && y > 0.0) alpha += (1.5*TMath::Pi());
2380 sector = (Int_t)(alpha/(2*TMath::Pi()/18.0));
2381 if(alpha> (sector+0.5)*(2*TMath::Pi()/18.0)) sector+=1;
2383 if(sector==18 && side ==0 ) {
2384 AliWarning("There was a wromg assignment of sector 0 with sector 18. Check sectors");
2388 sector = (18-sector +4)%18;
2389 SetLastSector(sector+ side*18);
2390 SetProcNextEvent(0);
2392 if(fVerb) cout << "AliTPCMonitor::ExecProcess() next side " << side << " next sector " << sector << endl;
2394 return (Int_t)ProcessEvent();
2398 //__________________________________________________________________
2399 Int_t AliTPCMonitor::GetRCUPatch(Int_t runid, Int_t eqid) const
2402 // Return RCU patch index for given equipment id eqid
2407 if(eqid>=1000) return 0;
2408 patch = fMapEqidsRcu[eqid] ;
2412 if(eqid==408) {patch = 13*6+4 +0; }
2413 if(eqid==409) {patch = 13*6+5 +0; }
2414 if(eqid==509) {patch = 13*6+0 +0; }
2415 if(eqid==512) {patch = 13*6+3 +0; }
2416 if(eqid==513) {patch = 13*6+1 +0; }
2417 if(eqid==517) {patch = 13*6+2 +0; }
2419 if(eqid==404) {patch = 4*6+5 +0; }
2420 if(eqid==504) {patch = 4*6+4 +0; }
2421 if(eqid==407) {patch = 4*6+3 +0; }
2422 if(eqid==503) {patch = 4*6+2 +0; }
2423 if(eqid==508) {patch = 4*6+1 +0; }
2424 if(eqid==506) {patch = 4*6+0 +0; }
2429 //__________________________________________________________________
2430 void AliTPCMonitor::DumpHeader(AliRawReaderRoot * fReaderROOT) const
2432 // Dump Event header for ROOT format
2434 cout << "EventHeader : fReaderROOT->GetEquipmentSize() :" << fReaderROOT->GetEquipmentSize() << endl;
2435 cout << "EventHeader : fReaderROOT->GetType() :" << fReaderROOT->GetType() << endl;
2436 cout << "EventHeader : fReaderROOT->GetRunNumber() :" << fReaderROOT->GetRunNumber() << endl;
2437 cout << "EventHeader : fReaderROOT->GetEventId() :" << *(fReaderROOT->GetEventId()) << endl;
2438 cout << "EventHeader : fReaderROOT->GetLDCId() :" << fReaderROOT->GetLDCId() << endl;
2439 cout << "EventHeader : fReaderROOT->GetGDCId() :" << fReaderROOT->GetGDCId() << endl;
2442 //__________________________________________________________________
2443 void AliTPCMonitor::DumpHeader(AliTPCMonitorDateFormat* dateform) const
2445 // Dump Event header for DATE format
2447 cout << "EquipmentHeader : dateform->GetEquipmentSize() :" << dateform->GetEquipmentSize() << endl;
2448 cout << "EquipmentHeader : dateform->GetEquipmentType() :" << dateform->GetEquipmentType() << endl;
2449 cout << "EquipmentHeader : dateform->GetEquipmentID() :" << dateform->GetEquipmentID() << endl;
2450 cout << "EquipmentHeader : dateform->GetEquipmentTypeAttribute() :" << dateform->GetEquipmentTypeAttribute() << endl;
2451 cout << "EquipmentHeader : dateform->GetEquipmentBasicSize() :" << dateform->GetEquipmentBasicSize() << endl;
2452 cout << "EquipmentHeader : dateform->GetEquipmentHeaderSize() :" << dateform->GetEquipmentHeaderSize() << endl;
2453 cout << "EquipmentHeader : dateform->IsLastSubEventHeader() :" << dateform->IsLastSubEventHeader() << endl;
2456 //__________________________________________________________________
2457 Double_t AliTPCMonitor::Gamma4(Double_t* x, Double_t* par) {
2459 // Gamma4 function used to fit signals
2460 // Defined in sections: diverging branch set to 0
2464 val = par[0]*exp(4.0)* pow((x[0]-par[1])/par[2],4)*exp(-4.0*(x[0]-par[1])/par[2])+ par[3];
2470 //__________________________________________________________________
2471 TCanvas* AliTPCMonitor::CreateCanvas(Char_t* name)
2477 Int_t xoffset = GetCanvasXOffset();
2478 Int_t xsize = GetCanvasXSize();
2479 Int_t ysize = GetCanvasYSize();
2480 Int_t xspace = GetCanvasXSpace();
2481 Int_t yspace = GetCanvasYSpace();
2483 // ROC 2dim max distribution
2484 if( strcmp(name,"coroc" )==0) { canv = new TCanvas("coroc" ,"coroc" , -1+xoffset,(Int_t)(yspace+0.5*ysize) ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2485 else if(strcmp(name,"ciroc" )==0) { canv = new TCanvas("ciroc" ,"ciroc" , -1+xoffset, 0 ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2486 // ROC 2dim rms distribution
2487 else if(strcmp(name,"crmsoroc" )==0) { canv = new TCanvas("crmsoroc" ,"crmsoroc" , -1+xoffset,(Int_t)(yspace+0.5*ysize) ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2488 else if(strcmp(name,"crmsiroc" )==0) { canv = new TCanvas("crmsiroc" ,"crmsiroc" , -1+xoffset, 0 ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2489 // Global ADC max Histos
2490 else if(strcmp(name,"SIDE C all" )==0) { canv = new TCanvas("SIDE C all" ,"SIDE C all" , (Int_t)(3*xspace+ xoffset),(Int_t)(yspace+0.5*ysize) ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2491 else if(strcmp(name,"SIDE A all" )==0) { canv = new TCanvas("SIDE A all" ,"SIDE A all" , (Int_t)(3*xspace+ xoffset), 0 ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2492 // 1 dim max sum basekine distribution
2493 else if(strcmp(name,"cmax" )==0) { canv = new TCanvas("cmax" ,"cmax" , -1+xoffset, 3*yspace ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2494 else if(strcmp(name,"csum" )==0) { canv = new TCanvas("csum" ,"csum" , xspace+xoffset, 3*yspace ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2495 else if(strcmp(name,"cbasemean" )==0) { canv = new TCanvas("cbasemean" ,"cbasemean" , 2*xspace+xoffset, 3*yspace ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2496 else if(strcmp(name,"cbaserms" )==0) { canv = new TCanvas("cbaserms" ,"cbaserms" , 3*xspace+xoffset, 3*yspace ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2497 // Projections of single channel
2498 else if(strcmp(name,"coroc_ch" )==0) { canv = new TCanvas("coroc_ch" ,"coroc_ch" , (Int_t)(1.5*xspace+xoffset),(Int_t)(yspace+0.5*ysize),(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2499 else if(strcmp(name,"ciroc_ch" )==0) { canv = new TCanvas("ciroc_ch" ,"ciroc_ch" , (Int_t)(1.5*xspace+xoffset), 0 ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2500 // FFT for single channel
2501 else if(strcmp(name,"coroc_ch_trans")==0) { canv = new TCanvas("coroc_ch_trans","coroc_ch_trans",(Int_t)(3.0*xspace+xoffset),(Int_t)(yspace+0.5*ysize),(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2502 else if(strcmp(name,"ciroc_ch_trans")==0) { canv = new TCanvas("ciroc_ch_trans","ciroc_ch_trans",(Int_t)(3.0*xspace+xoffset), 0 ,(Int_t)(1.5*xsize),(Int_t)(1.5*ysize)); return canv; }
2503 // row profile histograms
2504 else if(strcmp(name,"crowtime" )==0) { canv = new TCanvas("crowtime" ,"crowtime" , 1*xspace+xoffset, 2*yspace +ysize ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2505 else if(strcmp(name,"crowmax" )==0) { canv = new TCanvas("crowmax" ,"crowmax" , 2*xspace+xoffset, 2*yspace +ysize ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2506 else if(strcmp(name,"cxmax" )==0) { canv = new TCanvas("cxmax" ,"cxmax" , 3*xspace+xoffset, 2*yspace +ysize ,(Int_t)(1.0*xsize),(Int_t)(1.0*ysize)); return canv; }
2507 else { cout << " Warning Canvas name unknown " << endl; return 0 ; }
2510 //__________________________________________________________________
2511 void AliTPCMonitor::WriteHistos()
2513 // Writes all available histograms to a file in current directory
2514 // File name will be specified by : sector, side, runid and eventnumber
2516 if(GetEventProcessed())
2518 AliInfo("Write histos to file");
2520 sprintf(name,"SIDE_%i_SECTOR_%02i_RUN_%05i_EventID_%06i.root",(GetLastSector()/18),(GetLastSector()%18),fRunId,fEventNumber);
2521 TFile* f = new TFile(name,"recreate");
2522 for(Int_t i =0; i<fHistList->GetEntries(); i++)
2524 if(((TH1*)fHistList->At(i))!=0)
2526 ((TH1*)fHistList->At(i))->Write();
2534 AliError("No Event Processed : Chose Format , File and push 'Next Event' ");
2539 //__________________________________________________________________
2540 TH1* AliTPCMonitor::GetHisto(char* histname)
2543 // Returns histogram specified by histname
2544 // check available names for histos in CreateHistos()
2547 if((TH1*)fHistList->FindObject(histname))
2549 hist = (TH1*)fHistList->FindObject(histname);
2553 cout << " AliTPCMonitor::GetHisto :: Can not find histo with name " << histname << endl;