#include "AliTRDclusterResolution.h"
#include "AliTRDtrackInfo/AliTRDclusterInfo.h"
+#include "AliTRDgeometry.h"
+#include "AliTRDpadPlane.h"
#include "AliLog.h"
//_______________________________________________________
AliTRDclusterResolution::AliTRDclusterResolution()
- : AliTRDrecoTask("CalibClRes", "Calibrate Cluster Resolution for Tracking")
+ : AliTRDrecoTask("ClErrParam", "Cluster Error Parametrization")
,fInfo(0x0)
,fResults(0x0)
,fAt(0x0)
TObjArray* AliTRDclusterResolution::Histos()
{
if(fContainer) return fContainer;
- fContainer = new TObjArray(kN+1);
+ fContainer = new TObjArray(3);
//fContainer->SetOwner(kTRUE);
+ TH2I *h2 = 0x0;
+ TObjArray *arr = 0x0;
+
+ fContainer->AddAt(h2 = new TH2I("h_q", "", 50, 2.2, 7.5, 100, -.5, .5), kQRes);
+ h2->SetXTitle("log(q) [a.u.]");
+ h2->SetYTitle("#Delta y[cm]");
+ h2->SetZTitle("entries");
+
+ Double_t w = 0.;
+ AliTRDgeometry geo;
+ fContainer->AddAt(arr = new TObjArray(AliTRDgeometry::kNlayer), kYRes);
+ for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
+ w = .5*geo.GetPadPlane(ily, 2)->GetWidthIPad();
+ arr->AddAt(h2 = new TH2I(Form("h_y%d", ily), Form("Ly[%d]", ily), 50, -w, w, 100, -.5, .5), ily);
+ h2->SetXTitle("y_{w} [w]");
+ h2->SetYTitle("#Delta y[cm]");
+ h2->SetZTitle("entries");
+ }
+
+ fContainer->AddAt(arr = new TObjArray(kN), kSXRes);
Int_t ih = 0;
for(Int_t id=1; id<=fAd->GetNbins(); id++){
for(Int_t it=1; it<=fAt->GetNbins(); it++){
- fContainer->AddAt(new TH2I(Form("h_d%02dt%02d", id, it), Form("d_{wire}(%5.2f-%5.2f)[mm] x_{drift}(%5.2f-%5.2f)[mm]", 10.*fAd->GetBinCenter(id)- 5.*fAd->GetBinWidth(id), 10.*fAd->GetBinCenter(id)+ 5.*fAd->GetBinWidth(id), 10.*fAt->GetBinCenter(it)- 5.*fAt->GetBinWidth(it), 10.*fAt->GetBinCenter(it)+ 5.*fAt->GetBinWidth(it)), 30, -.15, .15, 100, -.5, .5), ih++);
+ arr->AddAt(h2 = new TH2I(Form("h_d%02dt%02d", id, it), Form("d_{wire}(%3.1f-%3.1f)[mm] x_{drift}(%5.2f-%5.2f)[mm]", 10.*fAd->GetBinCenter(id)- 5.*fAd->GetBinWidth(id), 10.*fAd->GetBinCenter(id)+ 5.*fAd->GetBinWidth(id), 10.*fAt->GetBinCenter(it)- 5.*fAt->GetBinWidth(it), 10.*fAt->GetBinCenter(it)+ 5.*fAt->GetBinWidth(it)), 30, -.15, .15, 100, -.5, .5), ih++);
+ h2->SetXTitle("tg#phi");
+ h2->SetYTitle("#Delta y[cm]");
+ h2->SetZTitle("entries");
}
}
- fContainer->AddAt(new TH2I("h_q", "", 50, 2.2, 7.5, 100, -.5, .5), ih++);
- fContainer->AddAt(new TH2I("h_y", "", 50, -.35, .35, 100, -.5, .5), ih++);
return fContainer;
}
Int_t det, t;
Float_t x, y, z, q, dy, dydx, dzdx, cov[3], covcl[3];
TH2I *h2 = 0x0;
+
+ TObjArray *arr0 = (TObjArray*)fContainer->At(kYRes);
+ TObjArray *arr1 = (TObjArray*)fContainer->At(kSXRes);
+
const AliTRDclusterInfo *cli = 0x0;
TIterator *iter=fInfo->MakeIterator();
while((cli=dynamic_cast<AliTRDclusterInfo*>((*iter)()))){
AliWarning(Form("Distance to anode %f outside allowed range", cli->GetAnisochronity()));
continue;
}
- if(!(h2 = (TH2I*)fContainer->At((id-1)*kNTB+it-1))){
+ if(!(h2 = (TH2I*)arr1->At((id-1)*kNTB+it-1))){
AliWarning(Form("Missing histo at index idx[%3d] [id[%2d] it[%2d]] xd[%f] d[%f]\n", (id-1)*kNTB+it-1, id, it, cli->GetDriftLength(), cli->GetAnisochronity()));
continue;
}
// only for phi equal exB
if(TMath::Abs(dydx-fExB)<.01){
cli->GetCluster(det, x, y, z, q, t, covcl);
- h2 = (TH2I*)fContainer->At(kN);
+ h2 = (TH2I*)fContainer->At(kQRes);
h2->Fill(TMath::Log(q), dy);
- h2 = (TH2I*)fContainer->At(kN+1);
+ h2 = (TH2I*)arr0->At(AliTRDgeometry::GetLayer(det));
h2->Fill(cli->GetYDisplacement(), dy);
}
}
{
if(!fContainer) return kFALSE;
+ TObjArray *arr = 0x0;
TH2 *h2 = 0x0;
if(!fResults){
TGraphErrors *g = 0x0;
fResults = new TObjArray(4);
fResults->SetOwner();
- TObjArray *arr = 0x0;
fResults->AddAt(arr = new TObjArray(2), kQRes);
arr->SetOwner();
arr->AddAt(g = new TGraphErrors(), 0);
} else {
TObject *o = 0x0;
TIterator *iter=fResults->MakeIterator();
- while((o=((*iter)()))) o->Clear();
+ while((o=((*iter)()))) o->Clear(); // maybe it is wrong but we should never reach this point
}
TF1 f("f", "gaus", -.5, .5);
TH1D *h1 = 0x0;
// process resolution dependency on charge
- if((h2 = (TH2I*)fContainer->At(kN))) {
+ if((h2 = (TH2I*)fContainer->At(kQRes))) {
TObjArray *arr = (TObjArray*)fResults->At(kQRes);
TGraphErrors *gqm = (TGraphErrors*)arr->At(0);
TGraphErrors *gqs = (TGraphErrors*)arr->At(1);
} else AliWarning("Missing dy=f(Q) histo");
// process resolution dependency on y displacement
- if((h2 = (TH2I*)fContainer->At(kN+1))) {
- TObjArray *arr = (TObjArray*)fResults->At(kYRes);
- TGraphErrors *gym = (TGraphErrors*)arr->At(0);
- TGraphErrors *gys = (TGraphErrors*)arr->At(1);
- ax = h2->GetXaxis();
- for(Int_t ix=1; ix<=ax->GetNbins(); ix++){
- Float_t yd = ax->GetBinCenter(ix);
- h1 = h2->ProjectionY("py", ix, ix);
- if(h1->GetEntries() < 50) continue;
- Adjust(&f, h1);
- h1->Fit(&f, "Q");
-
- // Fill sy^2 = f(log(q))
- Int_t ip = gym->GetN();
- gym->SetPoint(ip, yd, 10.*f.GetParameter(1));
- gym->SetPointError(ip, 0., 10.*f.GetParError(1));
- gys->SetPoint(ip, yd, 1.e2*f.GetParameter(2)*f.GetParameter(2));
- gys->SetPointError(ip, 0., 2.e2*f.GetParameter(2)*f.GetParError(2));
- }
- } else AliWarning("Missing dy=f(y_d) histo");
-
- // process resolution dependency on drift legth and drift cell width
- TGraphErrors *gm = new TGraphErrors(), *gs = new TGraphErrors();
- Float_t d(0.), x(0.);
- TH2F *hsx = (TH2F*)fResults->At(kSXRes);
- TH2F *hsy = (TH2F*)fResults->At(kSYRes);
- for(Int_t id=1; id<=fAd->GetNbins(); id++){
- d = fAd->GetBinCenter(id); //[mm]
- printf("Doing d=%f[mm]\n", d);
- for(Int_t it=1; it<=fAt->GetNbins(); it++){
- x = fAt->GetBinCenter(it); //[mm]
- printf("Doing x=%f[mm]\n", x);
- Int_t idx = (id-1)*kNTB+it-1;
- if(!(h2 = (TH2I*)fContainer->At(idx))) {
- AliWarning(Form("Missing histo at index idx[%3d] [id[%2d] it[%2d]] xd[%f] d[%f]\n", idx, id, it, x, d));
- continue;
- }
-
- Int_t ip = 0;
+ if((arr = (TObjArray*)fContainer->At(kYRes))) {
+ for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
+ if(!(h2 = (TH2I*)arr->At(ily))) continue;
+ TObjArray *arrg = (TObjArray*)fResults->At(kYRes);
+ TGraphErrors *gym = (TGraphErrors*)arrg->At(0);
+ TGraphErrors *gys = (TGraphErrors*)arrg->At(1);
ax = h2->GetXaxis();
for(Int_t ix=1; ix<=ax->GetNbins(); ix++){
- Float_t dydx = ax->GetBinCenter(ix) - fExB;
- if(dydx<0.) continue;
+ Float_t yd = ax->GetBinCenter(ix);
h1 = h2->ProjectionY("py", ix, ix);
if(h1->GetEntries() < 50) continue;
Adjust(&f, h1);
- h1->Fit(&f, "Q", "", -.2, .2);
+ h1->Fit(&f, "Q");
+
+ // Fill sy^2 = f(log(q))
+ Int_t ip = gym->GetN();
+ gym->SetPoint(ip, yd, 10.*f.GetParameter(1));
+ gym->SetPointError(ip, 0., 10.*f.GetParError(1));
+ gys->SetPoint(ip, yd, 1.e2*f.GetParameter(2)*f.GetParameter(2));
+ gys->SetPointError(ip, 0., 2.e2*f.GetParameter(2)*f.GetParError(2));
+ }
+ }
+ } else AliWarning("Missing dy=f(y_d) container");
- // Fill sy^2 = f(tg_phi^2)
- gm->SetPoint(ip, dydx, 10.*f.GetParameter(1));
- gm->SetPointError(ip, 0., 10.*f.GetParError(1));
- gs->SetPoint(ip, dydx*dydx, 1.e2*f.GetParameter(2)*f.GetParameter(2));
- gs->SetPointError(ip, 0., 2.e2*f.GetParameter(2)*f.GetParError(2));
- ip++;
- }
- for(;ip<gm->GetN(); ip++){
- gm->RemovePoint(ip);gs->RemovePoint(ip);
+ // process resolution dependency on drift legth and drift cell width
+ TGraphErrors *gm = new TGraphErrors(), *gs = new TGraphErrors();
+ Float_t d(0.), x(0.);
+ TH2F *hsx = (TH2F*)fResults->At(kSXRes);
+ TH2F *hsy = (TH2F*)fResults->At(kSYRes);
+ if((arr = (TObjArray*)fContainer->At(kSXRes))) {
+ for(Int_t id=1; id<=fAd->GetNbins(); id++){
+ d = fAd->GetBinCenter(id); //[mm]
+ printf("Doing d=%f[mm]\n", d);
+ for(Int_t it=1; it<=fAt->GetNbins(); it++){
+ x = fAt->GetBinCenter(it); //[mm]
+ printf("Doing x=%f[mm]\n", x);
+ Int_t idx = (id-1)*kNTB+it-1;
+ if(!(h2 = (TH2I*)arr->At(idx))) {
+ AliWarning(Form("Missing histo at index idx[%3d] [id[%2d] it[%2d]] xd[%f] d[%f]\n", idx, id, it, x, d));
+ continue;
+ }
+
+ Int_t ip = 0;
+ ax = h2->GetXaxis();
+ for(Int_t ix=1; ix<=ax->GetNbins(); ix++){
+ Float_t dydx = ax->GetBinCenter(ix) - fExB;
+ if(dydx<0.) continue;
+ h1 = h2->ProjectionY("py", ix, ix);
+ if(h1->GetEntries() < 50) continue;
+ Adjust(&f, h1);
+ h1->Fit(&f, "Q", "", -.2, .2);
+
+ // Fill sy^2 = f(tg_phi^2)
+ gm->SetPoint(ip, dydx, 10.*f.GetParameter(1));
+ gm->SetPointError(ip, 0., 10.*f.GetParError(1));
+ gs->SetPoint(ip, dydx*dydx, 1.e2*f.GetParameter(2)*f.GetParameter(2));
+ gs->SetPointError(ip, 0., 2.e2*f.GetParameter(2)*f.GetParError(2));
+ ip++;
+ }
+ for(;ip<gm->GetN(); ip++){
+ gm->RemovePoint(ip);gs->RemovePoint(ip);
+ }
+ gs->Fit(&sig, "Q");
+ hsx->SetBinContent(id, it, sig.GetParameter(1));
+ hsx->SetBinError(id, it, sig.GetParError(1));
+ hsy->SetBinContent(id, it, sig.GetParameter(0));
+ hsy->SetBinError(id, it, sig.GetParError(0));
}
- gs->Fit(&sig, "Q");
- hsx->SetBinContent(id, it, sig.GetParameter(1));
- hsx->SetBinError(id, it, sig.GetParError(1));
- hsy->SetBinContent(id, it, sig.GetParameter(0));
- hsy->SetBinError(id, it, sig.GetParError(0));
}
- }
+ } else AliWarning("Missing dy=f(x_d, d_wire) container");
delete gm; delete gs;
return kTRUE;
// "EFF" : TRD Tracking Efficiency
// "EFFC" : TRD Tracking Efficiency Combined (barrel + stand alone) - only in case of simulations
// "RES" : TRD tracking Resolution
+// "CLRES": clusters Resolution
// "CAL" : TRD calibration
// "PID" : TRD PID - pion efficiency
// "PIDR" : TRD PID - reference data
#include "TRD/qaRec/AliTRDpidChecker.h"
#include "TRD/qaRec/AliTRDpidRefMaker.h"
#include "TRD/qaRec/AliTRDcheckDetector.h"
+#include "TRD/qaRec/AliTRDclusterResolution.h"
#endif
#include "run.h"
fHasMCdata = kFALSE;
} else {
Bool_t foundOpt = kFALSE;
- for(Int_t itask = 1; itask < NTRDTASKS; itask++){
+ for(Int_t itask = 1; itask <= NTRDTASKS; itask++){
if(s.CompareTo(fgkTRDtaskOpt[itask]) != 0) continue;
SETBIT(fSteerTask, itask);
foundOpt = kTRUE;
if(!foundOpt) Info("run.C", Form("Task %s not implemented (yet).", s.Data()));
}
}
+ // extra rules for calibration tasks
+ if(TSTBIT(fSteerTask, kClusterErrorParam)) SETBIT(fSteerTask, kTrackingResolution);
+
// define task list pointers;
AliTRDrecoTask *taskPtr[NTRDTASKS], *task = 0x0;
memset(taskPtr, 0, NTRDTASKS*sizeof(AliAnalysisTask*));
mgr->ConnectInput( task, 0, coutput1);
mgr->ConnectOutput(task, 0, mgr->CreateContainer(task->GetName(), TObjArray::Class(), AliAnalysisManager::kOutputContainer, Form("TRD.Task%s.root", task->GetName())));
- AliAnalysisDataContainer *co1 = mgr->CreateContainer(Form("%sClRez", task->GetName()), TObjArray::Class(), AliAnalysisManager::kExchangeContainer);
- mgr->ConnectOutput(task, 1, co1);
-
- AliAnalysisDataContainer *co2 = mgr->CreateContainer(Form("%sClRes", task->GetName()), TObjArray::Class(), AliAnalysisManager::kExchangeContainer);
- mgr->ConnectOutput(task, 2, co2);
-
- AliAnalysisDataContainer *co3 = mgr->CreateContainer(Form("%sTrkltRes", task->GetName()), TObjArray::Class(), AliAnalysisManager::kExchangeContainer);
- mgr->ConnectOutput(task, 3, co3);
+ // Create output containers for calibration tasks
+ const Int_t nc = 3;
+ const Char_t *cn[nc] = {"ClRez", "ClRes", "TrkltRes"};
+ AliAnalysisDataContainer *co[nc];
+ for(Int_t ic = 0; ic<nc; ic++){
+ co[ic] = mgr->CreateContainer(Form("%s%s", task->GetName(), cn[ic]), TObjArray::Class(), AliAnalysisManager::kExchangeContainer);
+ mgr->ConnectOutput(task, 1+ic, co[ic]);
+ }
// test reconstruction calibration plugin
- mgr->AddTask(task = new AliTRDclusterResolution());
- mgr->ConnectInput(task, 0, co2);
- mgr->ConnectOutput(task, 0, mgr->CreateContainer(task->GetName(), TObjArray::Class(), AliAnalysisManager::kOutputContainer, Form("TRD.Task%s.root", task->GetName())));
+ if(TSTBIT(fSteerTask, kClusterErrorParam)){
+ mgr->AddTask(task = new AliTRDclusterResolution());
+ taskPtr[(Int_t)kClusterErrorParam] = task;
+ mgr->ConnectInput(task, 0, co[0]);
+ mgr->ConnectOutput(task, 0, mgr->CreateContainer(task->GetName(), TObjArray::Class(), AliAnalysisManager::kOutputContainer, Form("TRD.Task%s.root", task->GetName())));
+
+ mgr->AddTask(task = new AliTRDclusterResolution());
+ mgr->ConnectInput(task, 0, co[1]);
+ mgr->ConnectOutput(task, 0, mgr->CreateContainer(Form("%sMC", task->GetName()), TObjArray::Class(), AliAnalysisManager::kOutputContainer, Form("TRD.Task%sMC.root", task->GetName())));
+ }
}
//____________________________________________
if (!mgr->InitAnalysis()) return;
printf("\n\tRUNNING TRAIN FOR TASKS:\n");
- for(Int_t itask = 1; itask < NTRDTASKS; itask++){
+ for(Int_t itask = 1; itask <= NTRDTASKS; itask++){
if(TSTBIT(fSteerTask, itask)) printf("\t %s [%s]\n", taskPtr[itask]->GetTitle(), taskPtr[itask]->GetName());
}
printf("\n\n");