1 /**************************************************************************
2 * Copyright(c) 2007-2009, 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 ////////////////////////////////////////////////////////////
19 // Author: Henrik Tydesjo //
20 // This class is used in the detector algorithm framework //
21 // to process the data stored in special container files //
22 // (see AliITSOnlineSPDscan). For instance, minimum //
23 // threshold values can be extracted. //
24 ////////////////////////////////////////////////////////////
26 #include "AliITSOnlineSPDscanAnalyzer.h"
27 #include "AliITSOnlineSPDscan.h"
28 #include "AliITSOnlineSPDscanSingle.h"
29 #include "AliITSOnlineSPDscanMultiple.h"
30 #include "AliITSOnlineSPDscanMeanTh.h"
31 #include "AliITSOnlineCalibrationSPDhandler.h"
32 #include "AliITSRawStreamSPD.h"
42 Double_t itsSpdErrorf(Double_t *x, Double_t *par){
43 if (par[2]<0) par[2]=0;
44 Double_t val = par[2]+(0.12*256*32-par[2])*(0.5+0.5*TMath::Erf((x[0]-par[0])/par[1]/sqrt(2.)));
47 //Double_t itsSpdErrorfOrig(Double_t *x, Double_t *par){
48 // return 0.5+0.5*TMath::Erf((x[0]-par[0])/par[1]/sqrt(2.));
52 AliITSOnlineSPDscanAnalyzer::AliITSOnlineSPDscanAnalyzer(const Char_t *fileName, AliITSOnlineCalibrationSPDhandler *handler, Bool_t readFromGridFile) :
53 fType(99),fDacId(99),fFileName(fileName),fScanObj(NULL),fHandler(handler),fTriggers(NULL),
54 fOverWrite(kFALSE),fNoiseThreshold(0.01),fNoiseMinimumEvents(100),
55 fMinNrStepsBeforeIncrease(5),fMinIncreaseFromBaseLine(2),fStepDownDacSafe(5),fMaxBaseLineLevel(10)
58 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
59 for (UInt_t hs=0; hs<6; hs++) {
60 fMeanMultiplicity[hs][chipNr]=NULL;
61 fHitEventEfficiency[hs][chipNr]=NULL;
64 for (UInt_t mod=0; mod<240; mod++) {
65 fbModuleScanned[mod]=kFALSE;
68 Init(readFromGridFile);
71 AliITSOnlineSPDscanAnalyzer::AliITSOnlineSPDscanAnalyzer(const AliITSOnlineSPDscanAnalyzer& handle) :
72 fType(99),fDacId(99),fFileName("."),fScanObj(NULL),fHandler(NULL),fTriggers(NULL),
73 fOverWrite(kFALSE),fNoiseThreshold(0.01),fNoiseMinimumEvents(100),
74 fMinNrStepsBeforeIncrease(5),fMinIncreaseFromBaseLine(2),fStepDownDacSafe(5),fMaxBaseLineLevel(10)
76 // copy constructor, only copies the filename and params (not the processed data)
77 fFileName=handle.fFileName;
78 fOverWrite=handle.fOverWrite;
79 fNoiseThreshold=handle.fNoiseThreshold;
80 fNoiseMinimumEvents=handle.fNoiseMinimumEvents;
81 fMinNrStepsBeforeIncrease=handle.fMinNrStepsBeforeIncrease;
82 fMinIncreaseFromBaseLine=handle.fMinIncreaseFromBaseLine;
83 fStepDownDacSafe=handle.fStepDownDacSafe;
84 fMaxBaseLineLevel=handle.fMaxBaseLineLevel;
86 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
87 for (UInt_t hs=0; hs<6; hs++) {
88 fMeanMultiplicity[hs][chipNr]=NULL;
89 fHitEventEfficiency[hs][chipNr]=NULL;
92 for (UInt_t mod=0; mod<240; mod++) {
93 fbModuleScanned[mod]=kFALSE;
99 AliITSOnlineSPDscanAnalyzer::~AliITSOnlineSPDscanAnalyzer() {
101 for (UInt_t hs=0; hs<6; hs++) {
102 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
103 if (fMeanMultiplicity[hs][chipNr]!=NULL) {
104 delete fMeanMultiplicity[hs][chipNr];
106 if (fHitEventEfficiency[hs][chipNr]!=NULL) {
107 delete fHitEventEfficiency[hs][chipNr];
111 if (fTriggers!=NULL) delete fTriggers;
112 if (fScanObj!=NULL) delete fScanObj;
115 AliITSOnlineSPDscanAnalyzer& AliITSOnlineSPDscanAnalyzer::operator=(const AliITSOnlineSPDscanAnalyzer& handle) {
116 // assignment operator, only copies the filename and params (not the processed data)
118 for (UInt_t hs=0; hs<6; hs++) {
119 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
120 if (fMeanMultiplicity[hs][chipNr]!=NULL) {
121 delete fMeanMultiplicity[hs][chipNr];
123 if (fHitEventEfficiency[hs][chipNr]!=NULL) {
124 delete fHitEventEfficiency[hs][chipNr];
128 if (fTriggers!=NULL) delete fTriggers;
129 if (fScanObj!=NULL) delete fScanObj;
131 fFileName=handle.fFileName;
132 fOverWrite=handle.fOverWrite;
133 fNoiseThreshold=handle.fNoiseThreshold;
134 fNoiseMinimumEvents=handle.fNoiseMinimumEvents;
135 fMinNrStepsBeforeIncrease=handle.fMinNrStepsBeforeIncrease;
136 fMinIncreaseFromBaseLine=handle.fMinIncreaseFromBaseLine;
137 fStepDownDacSafe=handle.fStepDownDacSafe;
138 fMaxBaseLineLevel=handle.fMaxBaseLineLevel;
140 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
141 for (UInt_t hs=0; hs<6; hs++) {
142 fMeanMultiplicity[hs][chipNr]=NULL;
143 fHitEventEfficiency[hs][chipNr]=NULL;
146 for (UInt_t mod=0; mod<240; mod++) {
147 fbModuleScanned[mod]=kFALSE;
161 void AliITSOnlineSPDscanAnalyzer::Init(Bool_t readFromGridFile) {
162 // first checks type of container and then initializes container obj
163 if (!readFromGridFile) {
164 FILE* fp0 = fopen(fFileName.Data(), "r");
173 fScanObj = new AliITSOnlineSPDscan(fFileName.Data(),readFromGridFile);
174 fType = fScanObj->GetType();
181 fScanObj = new AliITSOnlineSPDscanSingle(fFileName.Data(),readFromGridFile);
186 fScanObj = new AliITSOnlineSPDscanMultiple(fFileName.Data(),readFromGridFile);
187 fDacId = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacId();
190 fScanObj = new AliITSOnlineSPDscanMeanTh(fFileName.Data(),readFromGridFile);
191 fDacId = ((AliITSOnlineSPDscanMeanTh*)fScanObj)->GetDacId();
194 Error("AliITSOnlineSPDscanAnalyzer::Init","Type %d not defined!",fType);
202 void AliITSOnlineSPDscanAnalyzer::SetParam(const Char_t *pname, const Char_t *pval) {
204 TString name = pname;
206 if (name.CompareTo("fOverWrite")==0) {
207 if (val.CompareTo("YES")==0 || val.CompareTo("1")==0) {
210 else fOverWrite = kFALSE;
212 else if (name.CompareTo("fNoiseThreshold")==0) {
213 fNoiseThreshold = val.Atof();
215 else if (name.CompareTo("fNoiseMinimumEvents")==0) {
216 fNoiseMinimumEvents = val.Atoi();
218 else if (name.CompareTo("fMinNrStepsBeforeIncrease")==0) {
219 fMinNrStepsBeforeIncrease = val.Atoi();
221 else if (name.CompareTo("fMinIncreaseFromBaseLine")==0) {
222 fMinIncreaseFromBaseLine = val.Atof();
224 else if (name.CompareTo("fStepDownDacSafe")==0) {
225 fStepDownDacSafe = val.Atoi();
227 else if (name.CompareTo("fMaxBaseLineLevel")==0) {
228 fMaxBaseLineLevel = val.Atof();
231 Error("AliITSOnlineSPDscanAnalyzer::SetParam","Parameter %s in configuration file unknown.",name.Data());
235 void AliITSOnlineSPDscanAnalyzer::ReadParamsFromLocation(const Char_t *dirName) {
236 // opens file (default name) in dir dirName and reads parameters from it
237 TString paramsFileName = Form("%s/standal_params.txt",dirName);
239 paramsFile.open(paramsFileName, ifstream::in);
240 if (paramsFile.fail()) {
241 printf("No config file (%s) present. Using default tuning parameters.\n",paramsFileName.Data());
247 paramsFile >> paramN;
248 if (paramsFile.eof()) break;
249 paramsFile >> paramV;
250 SetParam(paramN,paramV);
251 if (paramsFile.eof()) break;
257 Bool_t AliITSOnlineSPDscanAnalyzer::IsChipPresent(UInt_t hs, UInt_t chipNr) {
258 // is the chip present?
259 if (fScanObj==NULL) {
260 Warning("AliITSOnlineSPDscanAnalyzer::IsChipPresent","No data!");
263 return fScanObj->GetChipPresent(hs,chipNr);
266 Bool_t AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels(/*Char_t *oldcalibDir*/) {
267 // process dead pixel data, for uniformity scan,
268 // NB: This will not be the general way of finding dead pixels.
269 if (fScanObj==NULL) {
270 Warning("AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels","No data!");
273 // should be type kUNIMA
275 Warning("AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels","Dead pixels only for scan type %d.",kUNIMA);
278 // handler should be initialized
279 if (fHandler==NULL) {
280 Error("AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels","Calibration handler is not initialized!");
284 UInt_t routerNr = fScanObj->GetRouterNr();
285 UInt_t rowStart = fScanObj->GetRowStart();
286 UInt_t rowEnd = fScanObj->GetRowEnd();
287 for (UInt_t hs=0; hs<6; hs++) {
288 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
289 if (fScanObj->GetChipPresent(hs,chipNr) && fScanObj->GetAverageMultiplicity(0,hs,chipNr)>0) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!!
290 if (fOverWrite) {fHandler->ResetDeadForChip(routerNr,hs,chipNr);}
291 for (UInt_t col=0; col<32; col++) {
292 for (UInt_t row=rowStart; row<=rowEnd; row++) {
293 if (col!=1 && col!=9 && col!=17 && col!=25) { //exclude test columns!!!
294 if (fScanObj->GetHits(0,hs,chipNr,col,row)==0) {
295 fHandler->SetDeadPixel(routerNr,hs,chipNr,col,row);
308 Bool_t AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels(/*Char_t *oldcalibDir*/) {
309 // process noisy pixel data
310 if (fScanObj==NULL) {
311 Warning("AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels","No data!");
314 // should be type kNOISE
315 if (fType != kNOISE) {
316 Warning("AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels","Noisy pixels only for scan type %d.",kNOISE);
319 // handler should be initialized
320 if (fHandler==NULL) {
321 Error("AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels","Calibration handler is not initialized!");
324 // check if enough statistics
325 if (fScanObj->GetTriggers(0)<fNoiseMinimumEvents) {
326 Warning("AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels","Process noisy: Too few events.");
330 UInt_t routerNr = fScanObj->GetRouterNr();
331 for (UInt_t hs=0; hs<6; hs++) {
332 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
333 if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!!
334 if (fOverWrite) {fHandler->ResetNoisyForChip(routerNr,hs,chipNr);}
335 for (UInt_t col=0; col<32; col++) {
336 for (UInt_t row=0; row<256; row++) {
337 if (fScanObj->GetHitsEfficiency(0,hs,chipNr,col,row)>fNoiseThreshold) {
338 fHandler->SetNoisyPixel(routerNr,hs,chipNr,col,row);
348 Int_t AliITSOnlineSPDscanAnalyzer::GetDelay(UInt_t hs, UInt_t chipNr) {
350 if (hs>=6 || chipNr>10) return -1;
351 if (fScanObj==NULL) {
352 Warning("AliITSOnlineSPDscanAnalyzer::GetDelay","No data!");
355 // should be type kDELAY or kDAC with id 42 (delay_ctrl)
356 if (fType!=kDELAY && (fType!=kDAC || fDacId!=42)) {
357 Warning("AliITSOnlineSPDscanAnalyzer::GetDelay","Delay only for scan type %d or %d and dac_id 42.",kDELAY,kDAC);
360 if (fMeanMultiplicity[hs][chipNr]==NULL) {
361 if (!ProcessMeanMultiplicity()) {
368 for (UInt_t step=0; step<fScanObj->GetNSteps(); step++) {
371 fMeanMultiplicity[hs][chipNr]->GetPoint(step,thisDac,thisMult);
372 if (thisMult > maxVal) {
379 return ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(maxStep);
388 Int_t AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima(UInt_t hs, UInt_t chipNr) {
389 // in case of a uniformity scan, returns the nr of noisy pixels, (here > 200 hits)
390 if (hs>=6 || chipNr>10) return -1;
391 if (fScanObj==NULL) {
392 Error("AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima","No data!");
395 // should be type kUNIMA
396 if (fType != kUNIMA) {
397 Error("AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima","Noisy pixels Unima only for scan type %d.",kUNIMA);
400 if (fScanObj->GetTriggers(0)!=25600) {
401 Error("AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima","Process noisy unima: Incorrect number of events (!=25600.");
406 if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!!
407 for (UInt_t col=0; col<32; col++) {
408 for (UInt_t row=0; row<256; row++) {
409 if (fScanObj->GetHits(0,hs,chipNr,col,row)>200) {
421 Int_t AliITSOnlineSPDscanAnalyzer::FindLastMinThDac(UInt_t hs, UInt_t chipNr) {
422 // returns dac value where fMinIncreaseFromBaseLine reached
423 if (hs>=6 || chipNr>10) return -1;
424 if (fMeanMultiplicity[hs][chipNr]==NULL) {
425 if (!ProcessMeanMultiplicity()) {
429 Double_t firstVal, dummy1;
430 fMeanMultiplicity[hs][chipNr]->GetPoint(0,dummy1,firstVal);
432 while (step<fScanObj->GetNSteps()-1) {
433 Double_t graphVal, dummy2;
434 fMeanMultiplicity[hs][chipNr]->GetPoint(step+1,dummy2,graphVal);
435 if (graphVal>firstVal+fMinIncreaseFromBaseLine) break;
438 if (step==fScanObj->GetNSteps()-1) return -1;
439 return ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step);
442 Int_t AliITSOnlineSPDscanAnalyzer::FindClosestLowerStep(Float_t dacValueInput) {
443 // returns step closest (lower) to a dacvalue
445 while (step<fScanObj->GetNSteps()-1) {
446 Int_t dacVal = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step+1);
447 if (dacVal>=dacValueInput) break;
453 Float_t AliITSOnlineSPDscanAnalyzer::GetCompareLine(UInt_t step, UInt_t hs, UInt_t chipNr, Float_t basePar2) {
454 // returns value to compare mean mult with (when finding min th)
455 if (hs>=6 || chipNr>10) return -1;
456 if (step<fMinNrStepsBeforeIncrease) return -1;
457 Float_t baseLine = basePar2;
458 if (baseLine<0) baseLine=0;
463 for (UInt_t st=1;st<2*step/3;st++) { // skip first point...
464 fMeanMultiplicity[hs][chipNr]->GetPoint(st,d,m);
466 baseS+=(m-baseLine)*(m-baseLine);
468 baseAdd=2*sqrt( baseS/(2*step/3-1) - (baseM/(2*step/3-1))*(baseM/(2*step/3-1)) );
469 baseAdd+=0.03; // magic number
470 if (baseAdd>fMinIncreaseFromBaseLine) baseAdd=fMinIncreaseFromBaseLine;
471 return baseLine + baseAdd;
474 Int_t AliITSOnlineSPDscanAnalyzer::GetMinTh(UInt_t hs, UInt_t chipNr) {
475 // calculates and returns the minimum threshold
476 if (hs>=6 || chipNr>10) return -1;
477 if (fScanObj==NULL) {
478 Error("AliITSOnlineSPDscanAnalyzer::GetMinTh","No data!");
481 // should be type kMINTH or kDAC with id 39 (pre_vth)
482 if (fType!=kMINTH && (fType!=kDAC || fDacId!=39)) {
483 Error("AliITSOnlineSPDscanAnalyzer::GetMinTh","MinTh only for scan type %d OR %d with dac_id 39.",kMINTH,kDAC);
486 if (fMeanMultiplicity[hs][chipNr]==NULL) {
487 if (!ProcessMeanMultiplicity()) {
492 Int_t lastDac = FindLastMinThDac(hs,chipNr);
494 Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: Increase of Mean Multiplicity by %1.2f never reached.",hs,chipNr,fMinIncreaseFromBaseLine);
498 Int_t minDac = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(0);
499 TString funcName = Form("Fit minth func HS%d CHIP%d",hs,chipNr);
500 TF1 *minThFunc = new TF1(funcName.Data(),itsSpdErrorf,100,500,3);
501 minThFunc->SetParameter(0,lastDac+10);
502 minThFunc->SetParameter(1,2);
503 minThFunc->SetParameter(2,0);
504 minThFunc->SetParName(0,"Mean");
505 minThFunc->SetParName(1,"Sigma");
506 minThFunc->SetParName(2,"BaseLine");
507 minThFunc->SetLineWidth(1);
508 if (fMeanMultiplicity[hs][chipNr]==NULL) {
509 if (!ProcessMeanMultiplicity()) {
513 fMeanMultiplicity[hs][chipNr]->Fit(funcName,"Q0","",minDac,lastDac);
515 // Double_t mean = fMinThFunc[hs][chipNr]->GetParameter(0);
516 // Double_t sigma = fMinThFunc[hs][chipNr]->GetParameter(1);
517 Double_t baseLine = minThFunc->GetParameter(2);
520 if (baseLine>fMaxBaseLineLevel) {
521 Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: BaseLine too large (%1.2f>%1.2f).",hs,chipNr,baseLine,fMaxBaseLineLevel);
524 UInt_t step=FindClosestLowerStep(lastDac);
525 Float_t compareLine = GetCompareLine(step,hs,chipNr,baseLine);
526 if (compareLine==-1) {
527 Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: Not enough steps (%d<%d) before increase to get a compare line.",hs,chipNr,step,fMinNrStepsBeforeIncrease);
531 Double_t mult, dummy;
533 while (mult > compareLine && step>0) {
534 fMeanMultiplicity[hs][chipNr]->GetPoint(step,dummy,mult);
537 Int_t minth = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step+1)-fStepDownDacSafe;
543 Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: Did not find a point below the compare line (%f).",hs,chipNr,compareLine);
550 Bool_t AliITSOnlineSPDscanAnalyzer::ProcessMeanMultiplicity() {
551 // process mean multiplicity data
552 if (fScanObj==NULL) {
553 Error("AliITSOnlineSPDscanAnalyzer::ProcessMeanMultiplicity","No data!");
556 for (UInt_t step=0; step<fScanObj->GetNSteps(); step++) {
557 for (UInt_t hs=0; hs<6; hs++) {
558 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
559 // if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!!
561 if (fMeanMultiplicity[hs][chipNr]!=NULL) {
562 delete fMeanMultiplicity[hs][chipNr];
564 fMeanMultiplicity[hs][chipNr] = new TGraph();
566 Float_t multiplMean=fScanObj->GetAverageMultiplicity(step,hs,chipNr);
567 if (fType==kMINTH || fType==kMEANTH || fType==kDAC || fType==kDELAY) {
568 fMeanMultiplicity[hs][chipNr]->SetPoint(step,((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step),multiplMean);
571 fMeanMultiplicity[hs][chipNr]->SetPoint(step,0,multiplMean);
580 TGraph* AliITSOnlineSPDscanAnalyzer::GetMeanMultiplicityG(UInt_t hs, UInt_t chipNr) {
581 // returns mean multiplicity graph
582 if (hs>=6 || chipNr>10) return NULL;
583 if (fMeanMultiplicity[hs][chipNr]==NULL) {
584 if (!ProcessMeanMultiplicity()) {
588 return fMeanMultiplicity[hs][chipNr];
591 Bool_t AliITSOnlineSPDscanAnalyzer::ProcessHitEventEfficiency() {
592 // process hit event efficiency
593 if (fScanObj==NULL) {
594 Error("AliITSOnlineSPDscanAnalyzer::ProcessHitEventEfficiency","No data!");
597 for (UInt_t step=0; step<fScanObj->GetNSteps(); step++) {
598 for (UInt_t hs=0; hs<6; hs++) {
599 for (UInt_t chipNr=0; chipNr<11; chipNr++) {
600 // if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!!
602 if (fHitEventEfficiency[hs][chipNr]!=NULL) {
603 delete fHitEventEfficiency[hs][chipNr];
605 fHitEventEfficiency[hs][chipNr] = new TGraph();
607 Float_t efficiency=fScanObj->GetHitEventsEfficiency(step,hs,chipNr);
608 if (fType==kMINTH || fType==kMEANTH || fType==kDAC || fType==kDELAY) {
609 fHitEventEfficiency[hs][chipNr]->SetPoint(step,((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step),efficiency);
612 fHitEventEfficiency[hs][chipNr]->SetPoint(step,0,efficiency);
621 TGraph* AliITSOnlineSPDscanAnalyzer::GetHitEventEfficiencyG(UInt_t hs, UInt_t chipNr) {
622 // returns hit event efficiency graph
623 if (hs>=6 || chipNr>10) return NULL;
624 if (fHitEventEfficiency[hs][chipNr]==NULL) {
625 if (!ProcessHitEventEfficiency()) {
629 return fHitEventEfficiency[hs][chipNr];
633 Bool_t AliITSOnlineSPDscanAnalyzer::ProcessNrTriggers() {
634 // process nr of triggers data
635 if (fScanObj==NULL) {
636 Error("AliITSOnlineSPDscanAnalyzer::ProcessNrTriggers","No data!");
639 for (UInt_t step=0; step<fScanObj->GetNSteps(); step++) {
641 if (fTriggers!=NULL) {
644 fTriggers = new TGraph();
646 if (fType==kMINTH || fType==kMEANTH || fType==kDAC || fType==kDELAY) {
647 fTriggers->SetPoint(step,((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step),fScanObj->GetTriggers(step));
650 fTriggers->SetPoint(step,0,fScanObj->GetTriggers(step));
656 TGraph* AliITSOnlineSPDscanAnalyzer::GetNrTriggersG() {
657 // returns nr of triggers graph
658 if (fTriggers==NULL) {
659 if (!ProcessNrTriggers()) {
666 Bool_t AliITSOnlineSPDscanAnalyzer::GetHalfStavePresent(UInt_t hs) {
667 // returns half stave present info
668 if (hs<6 && fScanObj!=NULL) {
670 for (Int_t chip=0; chip<10; chip++) {
671 chipstatus+=fScanObj->GetChipPresent(hs,chip);
673 if (chipstatus>0) return kTRUE;
678 UInt_t AliITSOnlineSPDscanAnalyzer::GetRouterNr() {
679 // returns the router nr of scan obj
680 if (fScanObj!=NULL) return fScanObj->GetRouterNr();
684 TH2F* AliITSOnlineSPDscanAnalyzer::GetHitMapTot(UInt_t step) {
685 // creates and returns a pointer to a hitmap histo (half sector style a la spdmood)
686 if (fScanObj==NULL) {
687 Error("AliITSOnlineSPDscanAnalyzer::GetHitMapTot","No data!");
691 if (fType==kMINTH || fType==kMEANTH || fType==kDAC) {
692 histoname = Form("Router %d , DAC %d",GetRouterNr(),((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step));
695 histoname = Form("Router %d ",GetRouterNr());
697 TH2F* fHitMapTot = new TH2F(histoname.Data(),histoname.Data(),32*10,-0.5,32*10-0.5,256*6,-0.5,256*6-0.5);
698 fHitMapTot->SetNdivisions(-10,"X");
699 fHitMapTot->SetNdivisions(-006,"Y");
700 fHitMapTot->SetTickLength(0,"X");
701 fHitMapTot->SetTickLength(0,"Y");
702 fHitMapTot->GetXaxis()->SetLabelColor(gStyle->GetCanvasColor());
703 fHitMapTot->GetYaxis()->SetLabelColor(gStyle->GetCanvasColor());
704 for (UInt_t hs=0; hs<6; hs++) {
705 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
706 for (UInt_t col=0; col<32; col++) {
707 for (UInt_t row=0; row<256; row++) {
708 fHitMapTot->Fill(chipNr*32+col,(5-hs)*256+row,fScanObj->GetHits(step,hs,chipNr,col,row));
716 TH2F* AliITSOnlineSPDscanAnalyzer::GetHitMapChip(UInt_t step, UInt_t hs, UInt_t chip) {
717 // creates and returns a pointer to a hitmap histo (chip style a la spdmood)
718 if (fScanObj==NULL) {
719 Error("AliITSOnlineSPDscanAnalyzer::GetHitMapChip","No data!");
725 histoName = Form("fChipHisto_%d_%d_%d", GetRouterNr(), hs, chip);
726 histoTitle = Form("Eq ID %d, Half Stave %d, Chip %d", GetRouterNr(), hs, chip);
728 TH2F *returnHisto = new TH2F(histoName.Data(), histoTitle.Data(), 32, -0.5, 31.5, 256, -0.5, 255.5);
729 returnHisto->SetMinimum(0);
730 for (UInt_t col=0; col<32; col++) {
731 for (UInt_t row=0; row<256; row++) {
732 returnHisto->Fill(col,row,fScanObj->GetHits(step,hs,chip,col,row));