#include "TSystem.h"
#include "TStatToolkit.h"
#include "TCut.h"
+#include "THnSparse.h"
AliTPCcalibBase(),
fClusterParam(0),
fROC(0),
+ fHisDeltaY(0), // THnSparse - delta Y
+ fHisDeltaZ(0), // THnSparse - delta Z
+ fHisRMSY(0), // THnSparse - rms Y
+ fHisRMSZ(0), // THnSparse - rms Z
+ fHisQmax(0), // THnSparse - qmax
+ fHisQtot(0), // THnSparse - qtot
fArrayAmpRow(0),
fArrayAmp(0),
fArrayQDY(0),
//
// AliTPCcalibTracks default constructor
//
- SetDebugLevel(1);
if (GetDebugLevel() > 0) cout << "AliTPCcalibTracks' default constructor called" << endl;
}
AliTPCcalibBase(calibTracks),
fClusterParam(0),
fROC(0),
+ fHisDeltaY(0), // THnSparse - delta Y
+ fHisDeltaZ(0), // THnSparse - delta Z
+ fHisRMSY(0), // THnSparse - rms Y
+ fHisRMSZ(0), // THnSparse - rms Z
+ fHisQmax(0), // THnSparse - qmax
+ fHisQtot(0), // THnSparse - qtot
fArrayAmpRow(0),
fArrayAmp(0),
fArrayQDY(0),
AliTPCcalibBase(),
fClusterParam(0),
fROC(0),
+ fHisDeltaY(0), // THnSparse - delta Y
+ fHisDeltaZ(0), // THnSparse - delta Z
+ fHisRMSY(0), // THnSparse - rms Y
+ fHisRMSZ(0), // THnSparse - rms Z
+ fHisQmax(0), // THnSparse - qmax
+ fHisQtot(0), // THnSparse - qtot
fArrayAmpRow(0),
fArrayAmp(0),
fArrayQDY(0),
}
fCuts = cuts;
SetDebugLevel(logLevel);
+ MakeHistos();
TH1::AddDirectory(kFALSE);
// amplitude
sprintf(chname,"Amp_Sector%d",i);
- his1 = new TH1F(chname,chname,250,0,500); // valgrind
+ his1 = new TH1F(chname,chname,100,0,32); // valgrind
his1->SetXTitle("Max Amplitude (ADC)");
fArrayAmp->AddAt(his1,i);
sprintf(chname,"Amp_Sector%d",i+36);
- his1 = new TH1F(chname,chname,200,0,600); // valgrind 3 13,408,208 bytes in 229 blocks are still reachable
+ his1 = new TH1F(chname,chname,100,0,32); // valgrind 3 13,408,208 bytes in 229 blocks are still reachable
his1->SetXTitle("Max Amplitude (ADC)");
fArrayAmp->AddAt(his1,i+36);
// driftlength
sprintf(chname, "driftlengt vs. charge, ROC %i", i);
- prof1 = new TProfile(chname, chname, 500, 0, 250);
+ prof1 = new TProfile(chname, chname, 25, 0, 250);
prof1->SetYTitle("Charge");
prof1->SetXTitle("Driftlength");
fArrayChargeVsDriftlength->AddAt(prof1,i);
sprintf(chname, "driftlengt vs. charge, ROC %i", i+36);
- prof1 = new TProfile(chname, chname, 500, 0, 250);
+ prof1 = new TProfile(chname, chname, 25, 0, 250);
prof1->SetYTitle("Charge");
prof1->SetXTitle("Driftlength");
fArrayChargeVsDriftlength->AddAt(prof1,i+36);
Float_t qmean = GetQ(bin);
char hname[200];
sprintf(hname,"ResolY Pad%d Qmiddle%f",ipad, qmean);
- his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, -1,1);
+ his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, -1,1);
fArrayQDY->AddAt(his3D, bin);
sprintf(hname,"ResolZ Pad%d Qmiddle%f",ipad, qmean);
- his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, -1,1);
+ his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, -1,1);
fArrayQDZ->AddAt(his3D, bin);
sprintf(hname,"RMSY Pad%d Qmiddle%f",ipad, qmean);
- his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, 0,1);
+ his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, 0,0.6);
fArrayQRMSY->AddAt(his3D, bin);
sprintf(hname,"RMSZ Pad%d Qmiddle%f",ipad, qmean);
- his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 50, 0,1);
+ his3D = new TH3F(hname, hname, 20,10,250, 20, 0,1.5, 100, 0,0.6);
fArrayQRMSZ->AddAt(his3D, bin);
}
}
fcalPadRegionChargeVsDriftlength->Delete();
delete fcalPadRegionChargeVsDriftlength;
}
+ delete fHisDeltaY; // THnSparse - delta Y
+ delete fHisDeltaZ; // THnSparse - delta Z
+ delete fHisRMSY; // THnSparse - rms Y
+ delete fHisRMSZ; // THnSparse - rms Z
+ delete fHisQmax; // THnSparse - qmax
+ delete fHisQtot; // THnSparse - qtot
+
}
// To be called in the selector
// first AcceptTrack is evaluated, then calls all the following analyse functions:
// FillResolutionHistoLocal(track)
- // AlignUpDown(track, esd)
+
//
if (GetDebugLevel() > 5) Info("Process","Starting to process the track...");
Int_t accpetStatus = AcceptTrack(track);
if (accpetStatus == 0) {
FillResolutionHistoLocal(track);
- // AlignUpDown(track, esd);
}
else fRejectedTracksHisto->Fill(accpetStatus);
}
fFitterParY.Eval();
fFitterParZ.Eval();
Double_t chi2 = (fFitterParY.GetChisquare() + fFitterParZ.GetChisquare()) / (2. * nclFound - 6.);
- //if (chi2 > kCutChi2) fRejectedTracksHisto->Fill(9);
- //if (chi2 > kCutChi2) fClusterCutHisto->Fill(2, irow);
- //if (chi2 > kCutChi2) continue; // if chi^2 is too big goto next padrow
TTreeSRedirector *cstream = GetDebugStreamer();
if (cstream){
(*cstream)<<"Cut9"<<
TMatrixD chi2Z(difZT, TMatrixD::kMult, mulZ);
cchi2 += chi2Z(0, 0);
- // REMOVE KINK - TO be fixed - proper chi2 calculation for curved track to be implemented
- //if (chi2 * 0.25 > kCutChi2) fRejectedTracksHisto->Fill(8);
- //if (chi2 * 0.25 > kCutChi2) fClusterCutHisto->Fill(3, irow);
- //if (chi2 * 0.25 > kCutChi2) continue; // if chi2 is too big goto next padrow
- // fit tracklet with polynom of 2nd order and two polynoms of 1st order
- // take both polynoms of 1st order, calculate difference of their parameters
- // add covariance matrixes and calculate chi2 of this difference
- // if this chi2 is bigger than a given threshold, assume that the current cluster is
- // a kink an goto next padrow
-
- TTreeSRedirector *cstream = GetDebugStreamer();
if (cstream){
(*cstream)<<"Cut8"<<
"chi2="<<cchi2<<
TProfile *profAmpRow = (TProfile*)fArrayAmpRow->At(sector);
if ( irow >= kFirstLargePad) max /= kLargePadSize;
- profAmpRow->Fill( (Double_t)cluster0->GetRow(), max );
+ Double_t smax = TMath::Sqrt(max);
+ profAmpRow->Fill( (Double_t)cluster0->GetRow(), smax );
TH1F *hisAmp = (TH1F*)fArrayAmp->At(sector);
- hisAmp->Fill(max);
+ hisAmp->Fill(smax);
// remove the following two lines one day:
TProfile *profDriftLength = (TProfile*)fArrayChargeVsDriftlength->At(sector);
- profDriftLength->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), max );
+ profDriftLength->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), smax );
TProfile *profDriftLengthTmp = (TProfile*)(fcalPadRegionChargeVsDriftlength->GetObject(isegment, padSize));
- profDriftLengthTmp->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), max );
+ profDriftLengthTmp->Fill( 250.-(Double_t)TMath::Abs(cluster0->GetZ()), smax );
fHclusterPerPadrow->Fill(irow); // fill histogram showing clusters per padrow
Int_t ipad = TMath::Nint(cluster0->GetPad());
if (GetDebugLevel() > 20) Info("FillResolutionHistoLocal","Filling 'TPCSelectorDebug.root', irow = %i", irow);
FillResolutionHistoLocalDebugPart(track, cluster0, irow, angley, anglez, nclFound, kDelta);
} // if (useForResol && nclFound > 2 * kMinRatio * kDelta)
+ //
+ // Fill THN histograms
+ //
+ Double_t xvar[9];
+ xvar[1]=padSize;
+ xvar[2]=1.-TMath::Abs(cluster0->GetZ())/250.;
+ xvar[3]=cluster0->GetMax();
+ xvar[5]=angley;
+ xvar[6]=anglez;
+
+ xvar[4]=cluster0->GetPad()-TMath::Nint(cluster0->GetPad());
+ xvar[0]=deltay;
+ fHisDeltaY->Fill(xvar);
+ xvar[0]=TMath::Sqrt(cluster0->GetSigmaY2());
+ fHisRMSY->Fill(xvar);
+
+ xvar[4]=cluster0->GetTimeBin()-TMath::Nint(cluster0->GetTimeBin());
+ xvar[0]=deltaz;
+ fHisDeltaZ->Fill(xvar);
+ xvar[0]=TMath::Sqrt(cluster0->GetSigmaZ2());
+ fHisRMSZ->Fill(xvar);
} // loop over all padrows along the track: for (Int_t irow = 0; irow < 159; irow++)
} // FillResolutionHistoLocal(...)
}
-void AliTPCcalibTracks::MakeReport(Int_t stat, char* pathName){
+void AliTPCcalibTracks::MakeReport(Int_t stat, const char* pathName){
//
// all functions are called, that produce pictures
// the histograms are written to the directory 'pathName'
}
-void AliTPCcalibTracks::MakeAmpPlots(Int_t stat, char* pathName){
+void AliTPCcalibTracks::MakeAmpPlots(Int_t stat, const char* pathName){
//
// creates several plots:
// fArrayAmp.ps, fArrayAmpRow.ps and DeltaYZ.ps
}
-void AliTPCcalibTracks::MakeDeltaPlots(char* pathName){
+void AliTPCcalibTracks::MakeDeltaPlots(const char* pathName){
//
// creates several plots:
// DeltaYZ.ps: DeltaY and DeltaZ histogram with gaus fit
}
-void AliTPCcalibTracks::MakeChargeVsDriftLengthPlotsOld(char* pathName){
+void AliTPCcalibTracks::MakeChargeVsDriftLengthPlotsOld(const char* pathName){
//
// creates charge vs. driftlength plots, one TProfile for each ROC
// is not correct like this, should be one TProfile for each sector and padsize
}
-void AliTPCcalibTracks::MakeChargeVsDriftLengthPlots(char* pathName){
+void AliTPCcalibTracks::MakeChargeVsDriftLengthPlots(const char* pathName){
//
// creates charge vs. driftlength plots, one TProfile for each ROC
// under development....
-void AliTPCcalibTracks::FitResolutionNew(char* pathName){
+void AliTPCcalibTracks::FitResolutionNew(const char* pathName){
//
// calculates different resulution fits in Y and Z direction
// the histograms are written to 'ResolutionYZ.ps'
}
-void AliTPCcalibTracks::FitRMSNew(char* pathName){
+void AliTPCcalibTracks::FitRMSNew(const char* pathName){
//
// calculates different resulution-rms fits in Y and Z direction
// the histograms are written to 'RMS_YZ.ps'
}
-void AliTPCcalibTracks::MakeResPlotsQTree(Int_t minEntries, char* pathName){
+void AliTPCcalibTracks::MakeResPlotsQTree(Int_t minEntries, const char* pathName){
//
// Make tree with resolution parameters
// the result is written to 'resol.root' in directory 'pathname'
AliTPCcalibTracks *calibTracks = 0;
if (GetDebugLevel() > 1) cout << "start to iterate, filling lists" << endl;
Int_t counter = 0;
- while ( (calibTracks = (AliTPCcalibTracks*)listIterator->Next()) ){
+ while ( (calibTracks = dynamic_cast<AliTPCcalibTracks*> (listIterator->Next())) ){
// loop over all entries in the collectionList and get dataMembers into lists
if (!calibTracks) continue;
clusterCutHistoList->Add(calibTracks->GetfClusterCutHisto());
hclusterPerPadrowList->Add(calibTracks->GetfHclusterPerPadrow());
hclusterPerPadrowRawList->Add(calibTracks->GetfHclusterPerPadrowRaw());
- fCalPadClusterPerPad->Add(calibTracks->GetfCalPadClusterPerPad());
- fCalPadClusterPerPadRaw->Add(calibTracks->GetfCalPadClusterPerPadRaw());
+ //
+ if (fCalPadClusterPerPad && calibTracks->GetfCalPadClusterPerPad())
+ fCalPadClusterPerPad->Add(calibTracks->GetfCalPadClusterPerPad());
+ // fCalPadClusterPerPadRaw->Add(calibTracks->GetfCalPadClusterPerPadRaw());
counter++;
if (GetDebugLevel() > 5) cout << "filling lists, object " << counter << " added." << endl;
+ AddHistos(calibTracks);
}
//1. Load Parameters to be modified:
//e.g:
- AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT");
+ AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
AliCDBManager::Instance()->SetRun(0)
AliTPCClusterParam * param = AliTPCcalibDB::Instance()->GetClusterParam();
//
TString *strZ0 = toolkit.FitPlane(chainres,"(Cl.fZ-PZ0.fElements[0]):CSigmaZ0",fstringZ.Data(), "Cl.fDetector<36"+cutA, chi2,npoints,fitParamZ0,covMatrix,-1,0,maxPoints);
printf("Z0 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
- param->fPosZcor[0] = (TVectorD*) fitParamZ0.Clone();
+ param->PosZcor(0) = (TVectorD*) fitParamZ0.Clone();
//
TString *strZ1 = toolkit.FitPlane(chainres,"(Cl.fZ-PZ0.fElements[0]):CSigmaZ0",fstringZ.Data(), "Cl.fDetector>36"+cutA, chi2,npoints,fitParamZ1,covMatrix,-1,0,maxPoints);
//
printf("Z1 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
- param->fPosZcor[1] = (TVectorD*) fitParamZ1.Clone();
- param->fPosZcor[2] = (TVectorD*) fitParamZ1.Clone();
+ param->PosZcor(1) = (TVectorD*) fitParamZ1.Clone();
+ param->PosZcor(2) = (TVectorD*) fitParamZ1.Clone();
//
// Y corrections
//
TString *strY0 = toolkit.FitPlane(chainres,"(Cl.fY-PY0.fElements[0]):CSigmaY0",fstringY.Data(), "Cl.fDetector<36"+cutA, chi2,npoints,fitParamY0,covMatrix,-1,0,maxPoints);
printf("Y0 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
- param->fPosYcor[0] = (TVectorD*) fitParamY0.Clone();
+ param->PosYcor(0) = (TVectorD*) fitParamY0.Clone();
TString *strY1 = toolkit.FitPlane(chainres,"(Cl.fY-PY0.fElements[0]):CSigmaY0",fstringY.Data(), "Cl.fDetector>36"+cutA, chi2,npoints,fitParamY1,covMatrix,-1,0,maxPoints);
//
printf("Y1 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
- param->fPosYcor[1] = (TVectorD*) fitParamY1.Clone();
- param->fPosYcor[2] = (TVectorD*) fitParamY1.Clone();
+ param->PosYcor(1) = (TVectorD*) fitParamY1.Clone();
+ param->PosYcor(2) = (TVectorD*) fitParamY1.Clone();
//
//
//
+void AliTPCcalibTracks::MakeHistos(){
+ //
+ ////make THnSparse
+ //
+ //THnSparse *fHisDeltaY; // THnSparse - delta Y
+ //THnSparse *fHisDeltaZ; // THnSparse - delta Z
+ //THnSparse *fHisRMSY; // THnSparse - rms Y
+ //THnSparse *fHisRMSZ; // THnSparse - rms Z
+ //THnSparse *fHisQmax; // THnSparse - qmax
+ //THnSparse *fHisQtot; // THnSparse - qtot
+ // cluster performance bins
+ // 0 - variable of interest
+ // 1 - pad type - 0- short 1-medium 2-long pads
+ // 2 - drift length - drift length -0-1
+ // 3 - Qmax - Qmax - 2- 400
+ // 4 - cog - COG position - 0-1
+ // 5 - tan(phi) - local y angle
+ // 6 - tan(theta) - local z angle
+ // 7 - sector - sector number
+ Double_t xminTrack[8], xmaxTrack[8];
+ Int_t binsTrack[8];
+ TString axisName[8];
+
+ //
+ binsTrack[0]=100;
+ axisName[0] ="var";
+
+ binsTrack[1] =3;
+ xminTrack[1] =0; xmaxTrack[1]=3;
+ axisName[1] ="pad type";
+ //
+ binsTrack[2] =10;
+ xminTrack[2] =0; xmaxTrack[2]=1;
+ axisName[2] ="drift length";
+ //
+ binsTrack[3] =10;
+ xminTrack[3] =1; xmaxTrack[3]=400;
+ axisName[3] ="Qmax";
+ //
+ binsTrack[4] =10;
+ xminTrack[4] =0; xmaxTrack[4]=1;
+ axisName[4] ="cog";
+ //
+ binsTrack[5] =10;
+ xminTrack[5] =0; xmaxTrack[5]=2;
+ axisName[5] ="tan(phi)";
+ //
+ binsTrack[6] =10;
+ xminTrack[6] =0; xmaxTrack[6]=2;
+ axisName[6] ="tan(theta)";
+ //
+ xminTrack[0] =-0.5; xmaxTrack[0]=0.5;
+ fHisDeltaY=new THnSparseS("#Delta_{y} (cm)","#Delta_{y} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+ xminTrack[0] =-0.5; xmaxTrack[0]=0.5;
+ fHisDeltaZ=new THnSparseS("#Delta_{z} (cm)","#Delta_{z} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+ xminTrack[0] =0.; xmaxTrack[0]=0.5;
+ fHisRMSY=new THnSparseS("#RMS_{y} (cm)","#RMS_{y} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+ xminTrack[0] =0.; xmaxTrack[0]=0.5;
+ fHisRMSZ=new THnSparseS("#RMS_{z} (cm)","#RMS_{z} (cm)", 7, binsTrack,xminTrack, xmaxTrack);
+ xminTrack[0] =0.; xmaxTrack[0]=100;
+ fHisQmax=new THnSparseS("Qmax (ADC)","Qmax (ADC)", 7, binsTrack,xminTrack, xmaxTrack);
+
+ xminTrack[0] =0.; xmaxTrack[0]=250;
+ fHisQtot=new THnSparseS("Qtot (ADC)","Qtot (ADC)", 7, binsTrack,xminTrack, xmaxTrack);
+ BinLogX(fHisDeltaY,3);
+ BinLogX(fHisDeltaZ,3);
+ BinLogX(fHisRMSY,3);
+ BinLogX(fHisRMSZ,3);
+ BinLogX(fHisQmax,3);
+ BinLogX(fHisQtot,3);
+
+}
+
+void AliTPCcalibTracks::AddHistos(AliTPCcalibTracks* calib){
+ //
+ // Add histograms
+ //
+ if (calib->fHisDeltaY) fHisDeltaY->Add(calib->fHisDeltaY);
+ if (calib->fHisDeltaZ) fHisDeltaZ->Add(calib->fHisDeltaZ);
+ if (calib->fHisRMSY) fHisRMSY->Add(calib->fHisRMSY);
+ if (calib->fHisRMSZ) fHisRMSZ->Add(calib->fHisRMSZ);
+}