/************************************************************************** * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ //////////////////////////////////////////////////////////// // Author: Henrik Tydesjo // // This class is used in the detector algorithm framework // // to process the data stored in special container files // // (see AliITSOnlineSPDscan). For instance, minimum // // threshold values can be calculated. // //////////////////////////////////////////////////////////// #include "AliITSOnlineSPDscanAnalyzer.h" #include "AliITSOnlineSPDscan.h" #include "AliITSOnlineSPDscanSingle.h" #include "AliITSOnlineSPDscanMultiple.h" #include "AliITSOnlineSPDscanMeanTh.h" #include "AliITSOnlineCalibrationSPDhandler.h" #include "AliITSRawStreamSPD.h" #include #include #include #include #include #include Double_t itsSpdErrorf(Double_t *x, Double_t *par){ if (par[2]<0) par[2]=0; 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.))); return val; } //Double_t itsSpdErrorfOrig(Double_t *x, Double_t *par){ // return 0.5+0.5*TMath::Erf((x[0]-par[0])/par[1]/sqrt(2.)); //} AliITSOnlineSPDscanAnalyzer::AliITSOnlineSPDscanAnalyzer(const Char_t *fileName) : fType(99),fDacId(99),fRouterNr(99),fFileName(fileName),fScanObj(NULL),fTriggers(NULL), fOverWrite(kFALSE),fNoiseThreshold(0.01),fNoiseMinimumEvents(100), fMinNrStepsBeforeIncrease(5),fMinIncreaseFromBaseLine(2),fStepDownDacSafe(2),fMaxBaseLineLevel(10) { // constructor for (UInt_t chipNr=0; chipNr<11; chipNr++) { for (UInt_t hs=0; hs<6; hs++) { fMeanMultiplicity[hs][chipNr]=NULL; fHitEventEfficiency[hs][chipNr]=NULL; } } for (Int_t module=0; module<240; module++) { fHandler[module]=NULL; } Init(); } AliITSOnlineSPDscanAnalyzer::AliITSOnlineSPDscanAnalyzer(const AliITSOnlineSPDscanAnalyzer& handle) : fType(99),fDacId(99),fRouterNr(99),fFileName("."),fScanObj(NULL),fTriggers(NULL), fOverWrite(kFALSE),fNoiseThreshold(0.01),fNoiseMinimumEvents(100), fMinNrStepsBeforeIncrease(5),fMinIncreaseFromBaseLine(2),fStepDownDacSafe(2),fMaxBaseLineLevel(10) { // copy constructor, only copies the filename (not the processed data) fFileName=handle.fFileName; fScanObj=NULL; for (UInt_t chipNr=0; chipNr<11; chipNr++) { for (UInt_t hs=0; hs<6; hs++) { fMeanMultiplicity[hs][chipNr]=NULL; fHitEventEfficiency[hs][chipNr]=NULL; } } fTriggers=NULL; for (Int_t module=0; module<240; module++) { fHandler[module]=NULL; } Init(); } AliITSOnlineSPDscanAnalyzer::~AliITSOnlineSPDscanAnalyzer() { // destructor for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<11; chipNr++) { if (fMeanMultiplicity[hs][chipNr]!=NULL) { delete fMeanMultiplicity[hs][chipNr]; } if (fHitEventEfficiency[hs][chipNr]!=NULL) { delete fHitEventEfficiency[hs][chipNr]; } } } if (fTriggers!=NULL) delete fTriggers; if (fScanObj!=NULL) delete fScanObj; for (Int_t module=0; module<240; module++) { if (fHandler[module]!=NULL) { delete fHandler[module]; } } } AliITSOnlineSPDscanAnalyzer& AliITSOnlineSPDscanAnalyzer::operator=(const AliITSOnlineSPDscanAnalyzer& handle) { // assignment operator, only copies the filename (not the processed data) if (this!=&handle) { for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<11; chipNr++) { if (fMeanMultiplicity[hs][chipNr]!=NULL) { delete fMeanMultiplicity[hs][chipNr]; } if (fHitEventEfficiency[hs][chipNr]!=NULL) { delete fHitEventEfficiency[hs][chipNr]; } } } if (fTriggers!=NULL) delete fTriggers; if (fScanObj!=NULL) delete fScanObj; for (Int_t module=0; module<240; module++) { if (fHandler[module]!=NULL) { delete fHandler[module]; } } fFileName=handle.fFileName; fScanObj=NULL; fType=99; fDacId=99; fRouterNr=99; for (UInt_t chipNr=0; chipNr<11; chipNr++) { for (UInt_t hs=0; hs<6; hs++) { fMeanMultiplicity[hs][chipNr]=NULL; fHitEventEfficiency[hs][chipNr]=NULL; } } fTriggers=NULL; for (Int_t module=0; module<240; module++) { fHandler[module]=NULL; } Init(); } return *this; } void AliITSOnlineSPDscanAnalyzer::Init() { // first checks type of container and then initializes container obj FILE* fp0 = fopen(fFileName.Data(), "r"); if (fp0 == NULL) { return; } else { fclose(fp0); } fScanObj = new AliITSOnlineSPDscan(fFileName.Data()); fType = fScanObj->GetType(); fRouterNr = fScanObj->GetRouterNr(); delete fScanObj; // init container switch(fType) { case kUNIMA: case kNOISE: fScanObj = new AliITSOnlineSPDscanSingle(fFileName.Data()); break; case kMINTH: case kDAC: case kDELAY: fScanObj = new AliITSOnlineSPDscanMultiple(fFileName.Data()); fDacId = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacId(); break; case kMEANTH: fScanObj = new AliITSOnlineSPDscanMeanTh(fFileName.Data()); fDacId = ((AliITSOnlineSPDscanMeanTh*)fScanObj)->GetDacId(); break; default: Error("AliITSOnlineSPDscanAnalyzer::Init","Type %d not defined!",fType); fScanObj=NULL; return; break; } // set some default values (these should later be read from text file) fOverWrite=kFALSE; fNoiseThreshold=0.01; fNoiseMinimumEvents=100; fMinNrStepsBeforeIncrease=6; fMinIncreaseFromBaseLine=2; fStepDownDacSafe=2; fMaxBaseLineLevel=10; } void AliITSOnlineSPDscanAnalyzer::SetParam(const Char_t *pname, const Char_t *pval) { // set a parameter TString name = pname; TString val = pval; if (name.CompareTo("fOverWrite")==0) { if (val.CompareTo("YES")==0) { fOverWrite = kTRUE; } } else if (name.CompareTo("fNoiseThreshold")==0) { fNoiseThreshold = val.Atof(); } else if (name.CompareTo("fNoiseMinimumEvents")==0) { fNoiseMinimumEvents = val.Atoi(); } else if (name.CompareTo("fMinNrStepsBeforeIncrease")==0) { fMinNrStepsBeforeIncrease = val.Atoi(); } else if (name.CompareTo("fMinIncreaseFromBaseLine")==0) { fMinIncreaseFromBaseLine = val.Atof(); } else if (name.CompareTo("fStepDownDacSafe")==0) { fStepDownDacSafe = val.Atoi(); } else if (name.CompareTo("fMaxBaseLineLevel")==0) { fMaxBaseLineLevel = val.Atof(); } else { Error("AliITSOnlineSPDscanAnalyzer::SetParam","Parameter %s in configuration file unknown.",name.Data()); } } Bool_t AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels(Char_t *oldcalibDir) { // process dead pixel data, for uniformity scan, // NB: This will not be the general way of finding dead pixels. if (fScanObj==NULL) { Warning("AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels","No data!"); return kFALSE; } // should be type kUNIMA if (fType!=kUNIMA) { Warning("AliITSOnlineSPDscanAnalyzer::ProcessDeadPixels","Dead pixels only for scan type %d.",kUNIMA); return kFALSE; } UInt_t routerNr = fScanObj->GetRouterNr(); UInt_t rowStart = fScanObj->GetRowStart(); UInt_t rowEnd = fScanObj->GetRowEnd(); for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<10; chipNr++) { if (fScanObj->GetChipPresent(hs,chipNr) && fScanObj->GetAverageMultiplicity(0,hs,chipNr)>0) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!! UInt_t module = AliITSRawStreamSPD::GetModuleNumber(routerNr,hs,chipNr); for (UInt_t col=0; col<32; col++) { for (UInt_t row=rowStart; row<=rowEnd; row++) { if (col!=1 && col!=9 && col!=17 && col!=25) { //exclude test columns!!! if (fScanObj->GetHits(0,hs,chipNr,col,row)==0) { if (!fHandler[module]) { fHandler[module] = new AliITSOnlineCalibrationSPDhandler(); fHandler[module]->SetFileLocation(oldcalibDir); fHandler[module]->ReadFromFile(module); if (fOverWrite) {fHandler[module]->ResetDeadForChip(routerNr,hs,chipNr);} } fHandler[module]->SetDeadPixel(routerNr,hs,chipNr,col,row); } } } } } } } return kTRUE; } Bool_t AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels(Char_t *oldcalibDir) { // process noisy pixel data if (fScanObj==NULL) { Warning("AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels","No data!"); return kFALSE; } // should be type kNOISE if (fType != kNOISE) { Warning("AliITSOnlineSPDscanAnalyzer::ProcessNoisyPixels","Noisy pixels only for scan type %d.",kNOISE); return kFALSE; } if (fScanObj->GetTriggers(0)GetRouterNr(); for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<10; chipNr++) { if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!! UInt_t module = AliITSRawStreamSPD::GetModuleNumber(routerNr,hs,chipNr); for (UInt_t col=0; col<32; col++) { for (UInt_t row=0; row<256; row++) { if (fScanObj->GetHitsEfficiency(0,hs,chipNr,col,row)>fNoiseThreshold) { if (!fHandler[module]) { fHandler[module] = new AliITSOnlineCalibrationSPDhandler(); fHandler[module]->SetFileLocation(oldcalibDir); fHandler[module]->ReadFromFile(module); if (fOverWrite) {fHandler[module]->ResetNoisyForChip(routerNr,hs,chipNr);} } fHandler[module]->SetNoisyPixel(routerNr,hs,chipNr,col,row); } } } } } } return kTRUE; } Bool_t AliITSOnlineSPDscanAnalyzer::SaveDeadNoisyPixels(UInt_t module, Char_t *calibDir) { // save dead and noisy pixels to file in dir calibDir if (fHandler[module]!=NULL) { fHandler[module]->SetFileLocation(calibDir); fHandler[module]->WriteToFile(module); return kTRUE; } return kFALSE; } Int_t AliITSOnlineSPDscanAnalyzer::GetDelay(UInt_t hs, UInt_t chipNr) { // get delay if (hs>=6 || chipNr>10) return -1; if (fScanObj==NULL) { Warning("AliITSOnlineSPDscanAnalyzer::GetDelay","No data!"); return -1; } // should be type kDELAY or kDAC with id 42 (delay_ctrl) if (fType!=kDELAY && (fType!=kDAC || fDacId!=42)) { Warning("AliITSOnlineSPDscanAnalyzer::GetDelay","Delay only for scan type %d or %d and dac_id 42.",kDELAY,kDAC); return -1; } if (fMeanMultiplicity[hs][chipNr]==NULL) { if (!ProcessMeanMultiplicity()) { return -1; } } UInt_t maxStep=0; Float_t maxVal=0; for (UInt_t step=0; stepGetNSteps(); step++) { Double_t thisDac; Double_t thisMult; fMeanMultiplicity[hs][chipNr]->GetPoint(step,thisDac,thisMult); if (thisMult > maxVal) { maxVal = thisMult; maxStep = step; } } if (maxVal>0) { return ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(maxStep); } else { return -1; } } Int_t AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima(UInt_t hs, UInt_t chipNr) { // in case of a uniformity scan, returns the nr of noisy pixels, (here > 200 hits) if (hs>=6 || chipNr>10) return -1; if (fScanObj==NULL) { Error("AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima","No data!"); return kFALSE; } // should be type kUNIMA if (fType != kUNIMA) { Error("AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima","Noisy pixels Unima only for scan type %d.",kUNIMA); return kFALSE; } if (fScanObj->GetTriggers(0)!=25600) { Error("AliITSOnlineSPDscanAnalyzer::GetNrNoisyUnima","Process noisy unima: Incorrect number of events (!=25600."); return kFALSE; } Int_t nrNoisy=0; if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!! for (UInt_t col=0; col<32; col++) { for (UInt_t row=0; row<256; row++) { if (fScanObj->GetHits(0,hs,chipNr,col,row)>200) { nrNoisy++; } } } } else { return -1; } return nrNoisy; } Int_t AliITSOnlineSPDscanAnalyzer::FindLastMinThDac(UInt_t hs, UInt_t chipNr) { // returns dac value where fMinIncreaseFromBaseLine reached if (hs>=6 || chipNr>10) return -1; if (fMeanMultiplicity[hs][chipNr]==NULL) { if (!ProcessMeanMultiplicity()) { return -1; } } Double_t firstVal, dummy1; fMeanMultiplicity[hs][chipNr]->GetPoint(0,dummy1,firstVal); UInt_t step=0; while (stepGetNSteps()-1) { Double_t graphVal, dummy2; fMeanMultiplicity[hs][chipNr]->GetPoint(step+1,dummy2,graphVal); if (graphVal>firstVal+fMinIncreaseFromBaseLine) break; step++; } if (step==fScanObj->GetNSteps()-1) return -1; return ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step); } Int_t AliITSOnlineSPDscanAnalyzer::FindClosestLowerStep(Float_t dacValueInput) { // returns step closest (lower) to a dacvalue UInt_t step=0; while (stepGetNSteps()-1) { Int_t dacVal = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step+1); if (dacVal>=dacValueInput) break; step++; } return step; } Float_t AliITSOnlineSPDscanAnalyzer::GetCompareLine(UInt_t step, UInt_t hs, UInt_t chipNr, Float_t basePar2) { // returns value to compare mean mult with (when finding min th) if (hs>=6 || chipNr>10) return -1; if (stepGetPoint(st,d,m); baseM+=m-baseLine; baseS+=(m-baseLine)*(m-baseLine); } baseAdd=2*sqrt( baseS/(2*step/3-1) - (baseM/(2*step/3-1))*(baseM/(2*step/3-1)) ); baseAdd+=0.03; // magic number if (baseAdd>fMinIncreaseFromBaseLine) baseAdd=fMinIncreaseFromBaseLine; return baseLine + baseAdd; } Int_t AliITSOnlineSPDscanAnalyzer::GetMinTh(UInt_t hs, UInt_t chipNr) { // calculates and returns the minimum threshold if (hs>=6 || chipNr>10) return -1; if (fScanObj==NULL) { Error("AliITSOnlineSPDscanAnalyzer::GetMinTh","No data!"); return -1; } // should be type kMINTH or kDAC with id 39 (pre_vth) if (fType!=kMINTH && (fType!=kDAC || fDacId!=39)) { Error("AliITSOnlineSPDscanAnalyzer::GetMinTh","MinTh only for scan type %d OR %d with dac_id 39.",kMINTH,kDAC); return -1; } if (fMeanMultiplicity[hs][chipNr]==NULL) { if (!ProcessMeanMultiplicity()) { return -1; } } Int_t lastDac = FindLastMinThDac(hs,chipNr); if (lastDac==-1) { Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: Increase of Mean Multiplicity by %1.2f never reached.",hs,chipNr,fMinIncreaseFromBaseLine); return -1; } Int_t minDac = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(0); TString funcName = Form("Fit minth func HS%d CHIP%d",hs,chipNr); TF1 *minThFunc = new TF1(funcName.Data(),itsSpdErrorf,100,500,3); minThFunc->SetParameter(0,lastDac+10); minThFunc->SetParameter(1,2); minThFunc->SetParameter(2,0); minThFunc->SetParName(0,"Mean"); minThFunc->SetParName(1,"Sigma"); minThFunc->SetParName(2,"BaseLine"); minThFunc->SetLineWidth(1); if (fMeanMultiplicity[hs][chipNr]==NULL) { if (!ProcessMeanMultiplicity()) { return -1; } } fMeanMultiplicity[hs][chipNr]->Fit(funcName,"Q0","",minDac,lastDac); // Double_t mean = fMinThFunc[hs][chipNr]->GetParameter(0); // Double_t sigma = fMinThFunc[hs][chipNr]->GetParameter(1); Double_t baseLine = minThFunc->GetParameter(2); delete minThFunc; if (baseLine>fMaxBaseLineLevel) { Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: BaseLine too large (%1.2f>%1.2f).",hs,chipNr,baseLine,fMaxBaseLineLevel); return -1; } UInt_t step=FindClosestLowerStep(lastDac); Float_t compareLine = GetCompareLine(step,hs,chipNr,baseLine); if (compareLine==-1) { Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: Not enough steps (%d<%d) before increase to get a compare line.",hs,chipNr,step,fMinNrStepsBeforeIncrease); return -1; } Double_t mult, dummy; mult=1000; while (mult > compareLine && step>0) { fMeanMultiplicity[hs][chipNr]->GetPoint(step,dummy,mult); step--; } Int_t minth = ((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step+1)-fStepDownDacSafe; if (step>0) { return minth; } else { Warning("AliITSOnlineSPDscanAnalyzer::GetMinTh","HS%d, Chip%d: Did not find a point below the compare line (%f).",hs,chipNr,compareLine); return -1; } } Bool_t AliITSOnlineSPDscanAnalyzer::ProcessMeanMultiplicity() { // process mean multiplicity data if (fScanObj==NULL) { Error("AliITSOnlineSPDscanAnalyzer::ProcessMeanMultiplicity","No data!"); return kFALSE; } for (UInt_t step=0; stepGetNSteps(); step++) { for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<11; chipNr++) { // if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (step==0) { if (fMeanMultiplicity[hs][chipNr]!=NULL) { delete fMeanMultiplicity[hs][chipNr]; } fMeanMultiplicity[hs][chipNr] = new TGraph(); } Float_t multiplMean=fScanObj->GetAverageMultiplicity(step,hs,chipNr); if (fType==kMINTH || fType==kMEANTH || fType==kDAC || fType==kDELAY) { fMeanMultiplicity[hs][chipNr]->SetPoint(step,((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step),multiplMean); } else { fMeanMultiplicity[hs][chipNr]->SetPoint(step,0,multiplMean); } } // } } } return kTRUE; } TGraph* AliITSOnlineSPDscanAnalyzer::GetMeanMultiplicityG(UInt_t hs, UInt_t chipNr) { // returns mean multiplicity graph if (hs>=6 || chipNr>10) return NULL; if (fMeanMultiplicity[hs][chipNr]==NULL) { if (!ProcessMeanMultiplicity()) { return NULL; } } return fMeanMultiplicity[hs][chipNr]; } Bool_t AliITSOnlineSPDscanAnalyzer::ProcessHitEventEfficiency() { // process hit event efficiency if (fScanObj==NULL) { Error("AliITSOnlineSPDscanAnalyzer::ProcessHitEventEfficiency","No data!"); return kFALSE; } for (UInt_t step=0; stepGetNSteps(); step++) { for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<11; chipNr++) { // if (fScanObj->GetChipPresent(hs,chipNr)) { // check the status of the chippresent parameter in the mood header!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (step==0) { if (fHitEventEfficiency[hs][chipNr]!=NULL) { delete fHitEventEfficiency[hs][chipNr]; } fHitEventEfficiency[hs][chipNr] = new TGraph(); } Float_t efficiency=fScanObj->GetHitEventsEfficiency(step,hs,chipNr); if (fType==kMINTH || fType==kMEANTH || fType==kDAC || fType==kDELAY) { fHitEventEfficiency[hs][chipNr]->SetPoint(step,((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step),efficiency); } else { fHitEventEfficiency[hs][chipNr]->SetPoint(step,0,efficiency); } } // } } } return kTRUE; } TGraph* AliITSOnlineSPDscanAnalyzer::GetHitEventEfficiencyG(UInt_t hs, UInt_t chipNr) { // returns hit event efficiency graph if (hs>=6 || chipNr>10) return NULL; if (fHitEventEfficiency[hs][chipNr]==NULL) { if (!ProcessHitEventEfficiency()) { return NULL; } } return fHitEventEfficiency[hs][chipNr]; } Bool_t AliITSOnlineSPDscanAnalyzer::ProcessNrTriggers() { // process nr of triggers data if (fScanObj==NULL) { Error("AliITSOnlineSPDscanAnalyzer::ProcessNrTriggers","No data!"); return kFALSE; } for (UInt_t step=0; stepGetNSteps(); step++) { if (step==0) { if (fTriggers!=NULL) { delete fTriggers; } fTriggers = new TGraph(); } if (fType==kMINTH || fType==kMEANTH || fType==kDAC || fType==kDELAY) { fTriggers->SetPoint(step,((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step),fScanObj->GetTriggers(step)); } else { fTriggers->SetPoint(step,0,fScanObj->GetTriggers(step)); } } return kTRUE; } TGraph* AliITSOnlineSPDscanAnalyzer::GetNrTriggersG() { // returns nr of triggers graph if (fTriggers==NULL) { if (!ProcessNrTriggers()) { return NULL; } } return fTriggers; } Bool_t AliITSOnlineSPDscanAnalyzer::GetHalfStavePresent(UInt_t hs) { // returns half stave present info if (hs<6 && fScanObj!=NULL) { Int_t chipstatus=0; for (Int_t chip=0; chip<10; chip++) { chipstatus+=fScanObj->GetChipPresent(hs,chip); } if (chipstatus>0) return kTRUE; } return kFALSE; } AliITSOnlineCalibrationSPDhandler* AliITSOnlineSPDscanAnalyzer::GetOnlineCalibrationHandler(UInt_t module) { // returns a pointer to the AliITSOnlineCalibrationSPDhandler if (module<240) return fHandler[module]; else return NULL; } UInt_t AliITSOnlineSPDscanAnalyzer::GetRouterNr() { // returns the router nr of scan obj if (fScanObj!=NULL) return fScanObj->GetRouterNr(); else return 99; } TH2F* AliITSOnlineSPDscanAnalyzer::GetHitMapTot(UInt_t step) { // creates and returns a pointer to a hitmap histo (half sector style a la spdmood) if (fScanObj==NULL) { Error("AliITSOnlineSPDscanAnalyzer::GetHitMapTot","No data!"); return NULL; } TString histoname; if (fType==kMINTH || fType==kMEANTH || fType==kDAC) { histoname = Form("Router %d , DAC %d",GetRouterNr(),((AliITSOnlineSPDscanMultiple*)fScanObj)->GetDacValue(step)); } else { histoname = Form("Router %d ",GetRouterNr()); } TH2F* fHitMapTot = new TH2F(histoname.Data(),histoname.Data(),32*10,-0.5,32*10-0.5,256*6,-0.5,256*6-0.5); fHitMapTot->SetNdivisions(-10,"X"); fHitMapTot->SetNdivisions(-006,"Y"); fHitMapTot->SetTickLength(0,"X"); fHitMapTot->SetTickLength(0,"Y"); fHitMapTot->GetXaxis()->SetLabelColor(gStyle->GetCanvasColor()); fHitMapTot->GetYaxis()->SetLabelColor(gStyle->GetCanvasColor()); for (UInt_t hs=0; hs<6; hs++) { for (UInt_t chipNr=0; chipNr<10; chipNr++) { for (UInt_t col=0; col<32; col++) { for (UInt_t row=0; row<256; row++) { fHitMapTot->Fill(chipNr*32+col,(5-hs)*256+row,fScanObj->GetHits(step,hs,chipNr,col,row)); } } } } return fHitMapTot; }