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 ///////////////////////////////////////////////////////////////////////////////
20 // TPC calibration class for parameters which saved per pad //
22 ///////////////////////////////////////////////////////////////////////////////
24 #include "AliTPCCalPad.h"
25 #include "AliTPCCalROC.h"
26 #include <TObjArray.h>
31 #include "TTreeStream.h"
35 ClassImp(AliTPCCalPad)
37 //_____________________________________________________________________________
38 AliTPCCalPad::AliTPCCalPad():TNamed()
41 // AliTPCCalPad default constructor
44 for (Int_t isec = 0; isec < kNsec; isec++) {
50 //_____________________________________________________________________________
51 AliTPCCalPad::AliTPCCalPad(const Text_t *name, const Text_t *title)
55 // AliTPCCalPad constructor
57 for (Int_t isec = 0; isec < kNsec; isec++) {
58 fROC[isec] = new AliTPCCalROC(isec);
63 //_____________________________________________________________________________
64 AliTPCCalPad::AliTPCCalPad(const AliTPCCalPad &c):TNamed(c)
67 // AliTPCCalPad copy constructor
70 for (Int_t isec = 0; isec < kNsec; isec++) {
73 fROC[isec] = new AliTPCCalROC(*(c.fROC[isec]));
77 //_____________________________________________________________________________
78 AliTPCCalPad::AliTPCCalPad(TObjArray * array):TNamed()
81 // AliTPCCalPad default constructor
84 for (Int_t isec = 0; isec < kNsec; isec++) {
85 fROC[isec] = (AliTPCCalROC *)array->At(isec);
91 ///_____________________________________________________________________________
92 AliTPCCalPad::~AliTPCCalPad()
95 // AliTPCCalPad destructor
98 for (Int_t isec = 0; isec < kNsec; isec++) {
107 //_____________________________________________________________________________
108 AliTPCCalPad &AliTPCCalPad::operator=(const AliTPCCalPad &c)
111 // Assignment operator
114 if (this != &c) ((AliTPCCalPad &) c).Copy(*this);
119 //_____________________________________________________________________________
120 void AliTPCCalPad::Copy(TObject &c) const
126 for (Int_t isec = 0; isec < kNsec; isec++) {
128 fROC[isec]->Copy(*((AliTPCCalPad &) c).fROC[isec]);
134 //_____________________________________________________________________________
135 void AliTPCCalPad::Add(Float_t c1)
138 // add constant for all channels of all ROCs
141 for (Int_t isec = 0; isec < kNsec; isec++) {
148 //_____________________________________________________________________________
149 void AliTPCCalPad::Multiply(Float_t c1)
152 // multiply constant for all channels of all ROCs
154 for (Int_t isec = 0; isec < kNsec; isec++) {
156 fROC[isec]->Multiply(c1);
161 //_____________________________________________________________________________
162 void AliTPCCalPad::Add(const AliTPCCalPad * pad, Double_t c1)
165 // add calpad channel by channel multiplied by c1 - all ROCs
167 for (Int_t isec = 0; isec < kNsec; isec++) {
169 fROC[isec]->Add(pad->GetCalROC(isec),c1);
174 //_____________________________________________________________________________
175 void AliTPCCalPad::Multiply(const AliTPCCalPad * pad)
178 // multiply calpad channel by channel - all ROCs
180 for (Int_t isec = 0; isec < kNsec; isec++) {
182 fROC[isec]->Multiply(pad->GetCalROC(isec));
187 //_____________________________________________________________________________
188 void AliTPCCalPad::Divide(const AliTPCCalPad * pad)
191 // divide calpad channel by channel - all ROCs
193 for (Int_t isec = 0; isec < kNsec; isec++) {
195 fROC[isec]->Divide(pad->GetCalROC(isec));
200 //_____________________________________________________________________________
201 TGraph * AliTPCCalPad::MakeGraph(Int_t type, Float_t ratio){
207 for (Int_t i=0;i<72;i++) if (fROC[i]) npoints++;
208 TGraph * graph = new TGraph(npoints);
210 for (Int_t isec=0;isec<72;isec++){
211 if (!fROC[isec]) continue;
212 if (type==0) graph->SetPoint(npoints,isec,fROC[isec]->GetMean());
213 if (type==1) graph->SetPoint(npoints,isec,fROC[isec]->GetMedian());
214 if (type==2) graph->SetPoint(npoints,isec,fROC[isec]->GetLTM(0,ratio));
218 graph->GetXaxis()->SetTitle("Sector");
220 graph->GetYaxis()->SetTitle("Mean");
221 graph->SetMarkerStyle(22);
224 graph->GetYaxis()->SetTitle("Median");
225 graph->SetMarkerStyle(22);
228 graph->GetYaxis()->SetTitle(Form("Mean%f",ratio));
229 graph->SetMarkerStyle(24);
235 //_____________________________________________________________________________
236 Double_t AliTPCCalPad::GetMeanRMS(Double_t &rms)
239 // Calculate mean an RMS of all rocs
241 Double_t sum = 0, sum2 = 0, n=0, val=0;
242 for (Int_t isec = 0; isec < kNsec; isec++) {
243 AliTPCCalROC *calRoc = fROC[isec];
245 for (UInt_t irow=0; irow<calRoc->GetNrows(); irow++){
246 for (UInt_t ipad=0; ipad<calRoc->GetNPads(irow); ipad++){
247 val = calRoc->GetValue(irow,ipad);
257 Double_t mean = sum*n1;
258 rms = TMath::Sqrt(TMath::Abs(sum2*n1-mean*mean));
263 //_____________________________________________________________________________
264 Double_t AliTPCCalPad::GetMean(AliTPCCalPad* outlierPad)
267 // return mean of the mean of all ROCs
271 for (Int_t isec = 0; isec < kNsec; isec++) {
272 AliTPCCalROC *calRoc = fROC[isec];
274 AliTPCCalROC* outlierROC = 0;
275 if (outlierPad) outlierROC = outlierPad->GetCalROC(isec);
276 arr[n] = calRoc->GetMean(outlierROC);
280 return TMath::Mean(n,arr);
283 //_____________________________________________________________________________
284 Double_t AliTPCCalPad::GetRMS(AliTPCCalPad* outlierPad)
287 // return mean of the RMS of all ROCs
291 for (Int_t isec = 0; isec < kNsec; isec++) {
292 AliTPCCalROC *calRoc = fROC[isec];
294 AliTPCCalROC* outlierROC = 0;
295 if (outlierPad) outlierROC = outlierPad->GetCalROC(isec);
296 arr[n] = calRoc->GetRMS(outlierROC);
300 return TMath::Mean(n,arr);
303 //_____________________________________________________________________________
304 Double_t AliTPCCalPad::GetMedian(AliTPCCalPad* outlierPad)
307 // return mean of the median of all ROCs
311 for (Int_t isec = 0; isec < kNsec; isec++) {
312 AliTPCCalROC *calRoc = fROC[isec];
314 AliTPCCalROC* outlierROC = 0;
315 if (outlierPad) outlierROC = outlierPad->GetCalROC(isec);
316 arr[n] = calRoc->GetMedian(outlierROC);
320 return TMath::Mean(n,arr);
323 //_____________________________________________________________________________
324 Double_t AliTPCCalPad::GetLTM(Double_t *sigma, Double_t fraction, AliTPCCalPad* outlierPad)
327 // return mean of the LTM and sigma of all ROCs
329 Double_t arrm[kNsec];
330 Double_t arrs[kNsec];
334 for (Int_t isec = 0; isec < kNsec; isec++) {
335 AliTPCCalROC *calRoc = fROC[isec];
337 if ( sigma ) sTemp=arrs+n;
338 AliTPCCalROC* outlierROC = 0;
339 if (outlierPad) outlierROC = outlierPad->GetCalROC(isec);
340 arrm[n] = calRoc->GetLTM(sTemp,fraction, outlierROC);
344 if ( sigma ) *sigma = TMath::Mean(n,arrs);
345 return TMath::Mean(n,arrm);
348 //_____________________________________________________________________________
349 TH1F * AliTPCCalPad::MakeHisto1D(Float_t min, Float_t max,Int_t type){
352 // type -1 = user defined range
353 // 0 = nsigma cut nsigma=min
357 Float_t mean = GetMean();
358 Float_t sigma = GetRMS();
359 Float_t nsigma = TMath::Abs(min);
360 min = mean-nsigma*sigma;
361 max = mean+nsigma*sigma;
365 Float_t mean = GetMedian();
372 // LTM mean +- nsigma
375 Float_t mean = GetLTM(&sigma,max);
382 sprintf(name,"%s Pad 1D",GetTitle());
383 TH1F * his = new TH1F(name,name,100, min,max);
384 for (Int_t isec = 0; isec < kNsec; isec++) {
386 for (UInt_t irow=0; irow<fROC[isec]->GetNrows(); irow++){
387 UInt_t npads = (Int_t)fROC[isec]->GetNPads(irow);
388 for (UInt_t ipad=0; ipad<npads; ipad++){
389 his->Fill(fROC[isec]->GetValue(irow,ipad));
397 //_____________________________________________________________________________
398 TH2F *AliTPCCalPad::MakeHisto2D(Int_t side){
401 // side - specify the side A = 0 C = 1
402 // type - used types of determination of boundaries in z
403 Float_t kEpsilon = 0.000000000001;
404 TH2F * his = new TH2F(GetName(), GetName(), 250,-250,250,250,-250,250);
405 AliTPCROC * roc = AliTPCROC::Instance();
406 for (Int_t isec=0; isec<72; isec++){
407 if (side==0 && isec%36>=18) continue;
408 if (side>0 && isec%36<18) continue;
410 AliTPCCalROC * calRoc = fROC[isec];
411 for (UInt_t irow=0; irow<calRoc->GetNrows(); irow++)
412 for (UInt_t ipad=0; ipad<calRoc->GetNPads(irow); ipad++)
413 if (TMath::Abs(calRoc->GetValue(irow,ipad))>kEpsilon){
415 roc->GetPositionGlobal(isec,irow,ipad,xyz);
416 Int_t binx = 1+TMath::Nint((xyz[0]+250.)*0.5);
417 Int_t biny = 1+TMath::Nint((xyz[1]+250.)*0.5);
418 Float_t value = calRoc->GetValue(irow,ipad);
419 his->SetBinContent(binx,biny,value);
423 his->SetXTitle("x (cm)");
424 his->SetYTitle("y (cm)");
431 void AliTPCCalPad::MakeTree(const char * fileName, TObjArray * array, const char * mapFileName, AliTPCCalPad* outlierPad, Float_t ltmFraction) {
433 // Write tree with all available information
435 AliTPCROC* tpcROCinstance = AliTPCROC::Instance();
437 TObjArray* mapIROCs = 0;
438 TObjArray* mapOROCs = 0;
439 TVectorF *mapIROCArray = 0;
440 TVectorF *mapOROCArray = 0;
441 Int_t mapEntries = 0;
442 TString* mapNames = 0;
445 TFile mapFile(mapFileName, "read");
447 TList* listOfROCs = mapFile.GetListOfKeys();
448 mapEntries = listOfROCs->GetEntries()/2;
449 mapIROCs = new TObjArray(mapEntries*2);
450 mapOROCs = new TObjArray(mapEntries*2);
451 mapIROCArray = new TVectorF[mapEntries];
452 mapOROCArray = new TVectorF[mapEntries];
454 mapNames = new TString[mapEntries];
455 for (Int_t ivalue = 0; ivalue < mapEntries; ivalue++) {
456 TString ROCname(((TKey*)(listOfROCs->At(ivalue*2)))->GetName());
457 ROCname.Remove(ROCname.Length()-4, 4);
458 mapIROCs->AddAt((AliTPCCalROC*)mapFile.Get((ROCname + "IROC").Data()), ivalue);
459 mapOROCs->AddAt((AliTPCCalROC*)mapFile.Get((ROCname + "OROC").Data()), ivalue);
460 mapNames[ivalue].Append(ROCname);
463 for (Int_t ivalue = 0; ivalue < mapEntries; ivalue++) {
464 mapIROCArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(0));
465 mapOROCArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(36));
467 for (UInt_t ichannel = 0; ichannel < tpcROCinstance->GetNChannels(0); ichannel++)
468 (mapIROCArray[ivalue])[ichannel] = ((AliTPCCalROC*)(mapIROCs->At(ivalue)))->GetValue(ichannel);
469 for (UInt_t ichannel = 0; ichannel < tpcROCinstance->GetNChannels(36); ichannel++)
470 (mapOROCArray[ivalue])[ichannel] = ((AliTPCCalROC*)(mapOROCs->At(ivalue)))->GetValue(ichannel);
473 } // if (mapFileName)
475 TTreeSRedirector cstream(fileName);
476 Int_t arrayEntries = array->GetEntries();
478 TString* names = new TString[arrayEntries];
479 for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++)
480 names[ivalue].Append(((AliTPCCalPad*)array->At(ivalue))->GetName());
482 for (UInt_t isector = 0; isector < tpcROCinstance->GetNSectors(); isector++) {
484 // get statistic for given sector
486 TVectorF median(arrayEntries);
487 TVectorF mean(arrayEntries);
488 TVectorF rms(arrayEntries);
489 TVectorF ltm(arrayEntries);
490 TVectorF ltmrms(arrayEntries);
491 TVectorF medianWithOut(arrayEntries);
492 TVectorF meanWithOut(arrayEntries);
493 TVectorF rmsWithOut(arrayEntries);
494 TVectorF ltmWithOut(arrayEntries);
495 TVectorF ltmrmsWithOut(arrayEntries);
497 TVectorF *vectorArray = new TVectorF[arrayEntries];
498 for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++)
499 vectorArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(isector));
501 for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
502 AliTPCCalPad* calPad = (AliTPCCalPad*) array->At(ivalue);
503 AliTPCCalROC* calROC = calPad->GetCalROC(isector);
504 AliTPCCalROC* outlierROC = 0;
505 if (outlierPad) outlierROC = outlierPad->GetCalROC(isector);
507 median[ivalue] = calROC->GetMedian();
508 mean[ivalue] = calROC->GetMean();
509 rms[ivalue] = calROC->GetRMS();
510 Double_t ltmrmsValue = 0;
511 ltm[ivalue] = calROC->GetLTM(<mrmsValue, ltmFraction);
512 ltmrms[ivalue] = ltmrmsValue;
514 medianWithOut[ivalue] = calROC->GetMedian(outlierROC);
515 meanWithOut[ivalue] = calROC->GetMean(outlierROC);
516 rmsWithOut[ivalue] = calROC->GetRMS(outlierROC);
518 ltmWithOut[ivalue] = calROC->GetLTM(<mrmsValue, ltmFraction, outlierROC);
519 ltmrmsWithOut[ivalue] = ltmrmsValue;
528 medianWithOut[ivalue] = 0.;
529 meanWithOut[ivalue] = 0.;
530 rmsWithOut[ivalue] = 0.;
531 ltmWithOut[ivalue] = 0.;
532 ltmrmsWithOut[ivalue] = 0.;
537 // fill vectors of variable per pad
539 TVectorF *posArray = new TVectorF[8];
540 for (Int_t ivalue = 0; ivalue < 8; ivalue++)
541 posArray[ivalue].ResizeTo(tpcROCinstance->GetNChannels(isector));
543 Float_t posG[3] = {0};
544 Float_t posL[3] = {0};
546 for (UInt_t irow = 0; irow < tpcROCinstance->GetNRows(isector); irow++) {
547 for (UInt_t ipad = 0; ipad < tpcROCinstance->GetNPads(isector, irow); ipad++) {
548 tpcROCinstance->GetPositionLocal(isector, irow, ipad, posL);
549 tpcROCinstance->GetPositionGlobal(isector, irow, ipad, posG);
550 posArray[0][ichannel] = irow;
551 posArray[1][ichannel] = ipad;
552 posArray[2][ichannel] = posL[0];
553 posArray[3][ichannel] = posL[1];
554 posArray[4][ichannel] = posG[0];
555 posArray[5][ichannel] = posG[1];
556 posArray[6][ichannel] = (Int_t)(ipad - (Double_t)(tpcROCinstance->GetNPads(isector, irow))/2);
557 posArray[7][ichannel] = ichannel;
559 // loop over array containing AliTPCCalPads
560 for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
561 AliTPCCalPad* calPad = (AliTPCCalPad*) array->At(ivalue);
562 AliTPCCalROC* calROC = calPad->GetCalROC(isector);
564 (vectorArray[ivalue])[ichannel] = calROC->GetValue(irow, ipad);
566 (vectorArray[ivalue])[ichannel] = 0;
572 cstream << "calPads" <<
573 "sector=" << isector;
575 for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
576 cstream << "calPads" <<
577 (Char_t*)((names[ivalue] + "_Median=").Data()) << median[ivalue] <<
578 (Char_t*)((names[ivalue] + "_Mean=").Data()) << mean[ivalue] <<
579 (Char_t*)((names[ivalue] + "_RMS=").Data()) << rms[ivalue] <<
580 (Char_t*)((names[ivalue] + "_LTM=").Data()) << ltm[ivalue] <<
581 (Char_t*)((names[ivalue] + "_RMS_LTM=").Data()) << ltmrms[ivalue];
583 cstream << "calPads" <<
584 (Char_t*)((names[ivalue] + "_Median_OutlierCutted=").Data()) << medianWithOut[ivalue] <<
585 (Char_t*)((names[ivalue] + "_Mean_OutlierCutted=").Data()) << meanWithOut[ivalue] <<
586 (Char_t*)((names[ivalue] + "_RMS_OutlierCutted=").Data()) << rmsWithOut[ivalue] <<
587 (Char_t*)((names[ivalue] + "_LTM_OutlierCutted=").Data()) << ltmWithOut[ivalue] <<
588 (Char_t*)((names[ivalue] + "_RMS_LTM_OutlierCutted=").Data()) << ltmrmsWithOut[ivalue];
592 for (Int_t ivalue = 0; ivalue < arrayEntries; ivalue++) {
593 cstream << "calPads" <<
594 (Char_t*)((names[ivalue] + ".=").Data()) << &vectorArray[ivalue];
598 for (Int_t ivalue = 0; ivalue < mapEntries; ivalue++) {
600 cstream << "calPads" <<
601 (Char_t*)((mapNames[ivalue] + ".=").Data()) << &mapIROCArray[ivalue];
603 cstream << "calPads" <<
604 (Char_t*)((mapNames[ivalue] + ".=").Data()) << &mapOROCArray[ivalue];
608 cstream << "calPads" <<
609 "row.=" << &posArray[0] <<
610 "pad.=" << &posArray[1] <<
611 "lx.=" << &posArray[2] <<
612 "ly.=" << &posArray[3] <<
613 "gx.=" << &posArray[4] <<
614 "gy.=" << &posArray[5] <<
615 "rpad.=" << &posArray[6] <<
616 "channel.=" << &posArray[7];
618 cstream << "calPads" <<
622 delete[] vectorArray;
629 delete[] mapIROCArray;
630 delete[] mapOROCArray;