#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
+#include "THn.h"
#include "THnSparse.h"
#include "TMath.h"
#include "TMatrixD.h"
#define EPSILON 1e-12
-THnSparseD * AliTRDdEdxUtils::fgHistGain=0x0;
-THnSparseD * AliTRDdEdxUtils::fgHistT0=0x0;
-THnSparseD * AliTRDdEdxUtils::fgHistVd=0x0;
+THnF * AliTRDdEdxUtils::fgHistGain=0x0;
+THnF * AliTRDdEdxUtils::fgHistT0=0x0;
+THnF * AliTRDdEdxUtils::fgHistVd=0x0;
TObjArray * AliTRDdEdxUtils::fgHistPHQ=new TObjArray(8);
TString AliTRDdEdxUtils::fgCalibFile;
return (TObjArray*) fgObjPHQ->At(GetPHQIterator(kinvq, mag, charge));
}
-THnSparseD * AliTRDdEdxUtils::GetHistPHQ(const Bool_t kinvq, const Double_t mag, const Int_t charge)
+THnF * AliTRDdEdxUtils::GetHistPHQ(const Bool_t kinvq, const Double_t mag, const Int_t charge)
{
//
//return calib hist
//
- return (THnSparseD*) fgHistPHQ->At(GetPHQIterator(kinvq, mag, charge));
+ return (THnF*) fgHistPHQ->At(GetPHQIterator(kinvq, mag, charge));
}
TString AliTRDdEdxUtils::GetPHQName(const Bool_t kobj, const Int_t iter)
nbin[0]=NTRDtimebin(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=20;
for(Int_t iter=0; iter<8; iter++){
const TString hn = GetPHQName(0, iter);
- THnSparseD *hi = new THnSparseD(hn, "", 2, nbin, xmin, xmax);
+ THnF *hi = new THnF(hn, "", 2, nbin, xmin, xmax);
//fgHistPHQ owns the hists
fgHistPHQ->AddAt(hi, iter);
list->Add(hi);
if(kPHQonly)
return;
- nbin[0]=NTRDchamber(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=20; fgHistGain = new THnSparseD("TRDCalibHistGain", "", 2, nbin, xmin, xmax);
- nbin[0]=NTRDchamber(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=AliTRDseedV1::kNtb; fgHistT0 = new THnSparseD("TRDCalibHistT0", "", 2, nbin, xmin, xmax);
- nbin[0]=NTRDchamber(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=AliTRDseedV1::kNtb; fgHistVd = new THnSparseD("TRDCalibHistVd", "", 2, nbin, xmin, xmax);
+ nbin[0]=NTRDchamber(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=20; fgHistGain = new THnF("TRDCalibHistGain", "", 2, nbin, xmin, xmax);
+ nbin[0]=NTRDchamber(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=AliTRDseedV1::kNtb; fgHistT0 = new THnF("TRDCalibHistT0", "", 2, nbin, xmin, xmax);
+ nbin[0]=NTRDchamber(); nbin[1]= 11250; xmax[0]=nbin[0]; xmax[1]=AliTRDseedV1::kNtb; fgHistVd = new THnF("TRDCalibHistVd", "", 2, nbin, xmin, xmax);
list->Add(fgHistGain);
list->Add(fgHistT0);
for(Int_t iter=0; iter<8; iter++){
const TString hn = GetPHQName(0, iter);
- THnSparseD * tmph=0x0;
+ THnF * tmph=0x0;
if(array){
- tmph = (THnSparseD *) array->FindObject(hn);
+ tmph = (THnF *) array->FindObject(hn);
}
else{
- tmph = (THnSparseD *) fcalib.Get(hn);
+ tmph = (THnF *) fcalib.Get(hn);
}
if(!tmph){
printf("AliTRDdEdxUtils::ReadCalibHist warning calib hist not found! %s %s\n", filename.Data(), listname.Data());
}
return kFALSE;
}
- THnSparseD *hi = (THnSparseD*)tmph->Clone();
+ THnF *hi = (THnF*)tmph->Clone();
fgHistPHQ->AddAt(hi, iter);
}
return kTRUE;
}
-void AliTRDdEdxUtils::FillCalibHist(const Int_t ncls, const TVectorD *arrayQ, const TVectorD *arrayX, THnSparseD * hcalib, const Double_t scale)
+void AliTRDdEdxUtils::FillCalibHist(const Int_t ncls, const TVectorD *arrayQ, const TVectorD *arrayX, THnF * hcalib, const Double_t scale)
{
//
//fill calibration hist
//get cluster Q and fill calib hist, if kinvq = kTRUE, 1/Q is filled
//
- THnSparseD * hcalib = AliTRDdEdxUtils::GetHistPHQ(kinvq, mag, charge);
+ THnF * hcalib = AliTRDdEdxUtils::GetHistPHQ(kinvq, mag, charge);
TVectorD arrayQ(200), arrayX(200);
const Int_t ncls = AliTRDdEdxUtils::GetArrayClusterQ(kinvq, &arrayQ, &arrayX, trdv1);
const Int_t nh=lin->GetEntries();
for(Int_t ii=0; ii<nh; ii++){
- const THnSparseD *hh=(THnSparseD*)lin->At(ii);
+ const THnF *hh=(THnF*)lin->At(ii);
const TString hname = hh->GetName();
if(!objnames.Contains(hname))
continue;
delete lout;
}
-TObjArray* AliTRDdEdxUtils::GetCalibObj(const THnSparseD *hh, Int_t run, TList *lout, TTreeSRedirector *calibStream)
+TObjArray* AliTRDdEdxUtils::GetCalibObj(const THnF *hh, Int_t run, TList *lout, TTreeSRedirector *calibStream)
{
//
//produce calibration objects
Double_t rndqsum = 0;
for(Int_t ii=0; ii<7; ii++){
- const Int_t icol = pad3col+(ii-3);
+ if(cl->GetSignals()[ii] < EPSILON){//bad pad marked by electronics
+ continue;
+ }
- const Double_t padgain = IsPadGainOn()? GetPadGain(det, icol, padrow) : 1;
- if(padgain<0){//indices out of range
- //printf("testout %d %d\n\n", pad3col, ii);
+ const Int_t icol = pad3col+(ii-3);
+ const Double_t padgain = GetPadGain(det, icol, padrow);
+ if(padgain<0){//indices out of range, pad3col near boundary case
continue;
}
- const Double_t rndsignal = (cl->GetSignals()[ii] - baseline)/padgain;
+ const Double_t rndsignal = (cl->GetSignals()[ii] - baseline)/(IsPadGainOn()? padgain : 1);
//sum it anyway even if signal below baseline, as long as the total is positive
rndqsum += rndsignal;
Double_t dq = 0;
AliTRDcluster *cl = 0x0;
- //GetRNDClusterQ(cl)>0 ensures that the total sum of q is above baseline*7.
+ //GetRNDClusterQ(cl)>0 ensures that the total sum of q is above baseline*NsignalPhysical.
cl = seed->GetClusters(itb); if(cl && GetRNDClusterQ(cl)>0 ) dq+= GetRNDClusterQ(cl);//cl->GetRawQ();
cl = seed->GetClusters(itb+AliTRDseedV1::kNtb); if(cl && GetRNDClusterQ(cl)>0 ) dq+= GetRNDClusterQ(cl);//cl->GetRawQ();
return (Int_t) nch;
}
-void AliTRDdEdxUtils::SetChamberQT(const AliTRDtrackV1 *trdtrack, const Int_t kcalib, THnSparseD * hgain, THnSparseD * ht0, THnSparseD * hvd)
+void AliTRDdEdxUtils::SetChamberQT(const AliTRDtrackV1 *trdtrack, const Int_t kcalib, THnF * hgain, THnF * ht0, THnF * hvd)
{
//
//CookdEdx at TRD track level, use chamber info, related calibrations: chamber-gain; T0, Vd based on raw PH distribution