- const Float_t kxmin = 280;
- const Float_t kxmax = 380;
- const Float_t kxdelta = (kxmax - kxmin)/1000;
-
- if(strcmp(direction, "y") && strcmp(direction, "z")){
- AliError(Form("Direction %s does not exist. Abborting!", direction));
- return 0x0;
- }
-
- TFile *debfile = TFile::Open("TRD.TrackerDebug.root");
- if(!debfile){
- AliError("File TRD.TrackerDebug.root not found.");
- return 0x0;
- }
- TString *treename = 0x0;
- if(iteration > -1)
- treename = new TString("ImproveSeedQuality");
- else
- treename = new TString("MakeSeeds1");
- fTree = (TTree *)(debfile->Get(treename->Data()));
- if(!fTree){
- AliError(Form("Tree %s not found in File TRD.TrackerDebug.root.", treename->Data()));
- delete treename;
- return 0x0;
- }
- delete treename;
-
- TGraph *fitfun = new TGraph(1000);
- // Prepare containers
- Float_t x0[AliTRDtrackerV1::kNPlanes],
- refP[AliTRDtrackerV1::kNPlanes],
- clx[AliTRDtrackerV1::kNPlanes * AliTRDtrackerV1::kNTimeBins],
- clp[AliTRDtrackerV1::kNPlanes * AliTRDtrackerV1::kNTimeBins];
- Int_t nLayers = 0, ncls = 0;
-
- TLinearFitter *fitter = 0x0;
- AliTRDseedV1 *tracklet[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
- for(Int_t iLayer = 0; iLayer < 6; iLayer++)
- fTree->SetBranchAddress(Form("S%d.", iLayer), &tracklet[iLayer]);
- fTree->SetBranchAddress("FitterT.", &fitter);
- fTree->SetBranchAddress("EventNumber", &fgEventNumber);
- fTree->SetBranchAddress("CandidateNumber", &fgCandidateNumber);
-
- Int_t nEntries = fTree->GetEntriesFast();
- Bool_t found = kFALSE;
- for(Int_t entry = 0; entry < nEntries; entry++){
- fTree->GetEntry(entry);
- if(fgEventNumber < event) continue;
- if(fgEventNumber > event) break;
- // EventNumber matching: Do the same for the candidate number
- if(fgCandidateNumber < candidate) continue;
- if(fgCandidateNumber > candidate) break;
- found = kTRUE;
-
- for(Int_t iLayer = 0; iLayer < 6; iLayer++){
- if(!tracklet[iLayer]->IsOK()) continue;
- x0[nLayers] = tracklet[iLayer]->GetX0();
- if(!strcmp(direction, "y"))
- refP[nLayers] = tracklet[iLayer]->GetYref(0);
- else
- refP[nLayers] = tracklet[iLayer]->GetZref(0);
- nLayers++;
- for(Int_t itb = 0; itb < 30; itb++){
- if(!tracklet[iLayer]->IsUsable(itb)) continue;
- AliTRDcluster *cl = tracklet[iLayer]->GetClusters(itb);
- if(!strcmp(direction, "y"))
- clp[ncls] = cl->GetY();
- else
- clp[ncls] = cl->GetZ();
- clx[ncls] = cl->GetX();
- ncls++;
- }
- }
- // Add function derived by the tilted Rieman fit (Defined by the curvature)
- Int_t nPoints = 0;
- if(!strcmp(direction, "y")){
- Double_t a = fitter->GetParameter(0);
- Double_t b = fitter->GetParameter(1);
- Double_t c = fitter->GetParameter(2);
- Double_t curvature = 1.0 + b*b - c*a;
- if (curvature > 0.0) {
- curvature = a / TMath::Sqrt(curvature);
- }
- // Numerical evaluation of the function:
- for(Int_t ipt = 0; ipt < 1000; ipt++){
- Float_t x = kxmin + ipt * kxdelta;
- Double_t res = (x * a + b); // = (x - x0)/y0
- res *= res;
- res = 1.0 - c * a + b * b - res; // = (R^2 - (x - x0)^2)/y0^2
- Double_t y = 0.;
- if (res >= 0) {
- res = TMath::Sqrt(res);
- y = (1.0 - res) / a;
- }
- fitfun->SetPoint(nPoints++, y, x);
- }
- }
- else{
- Double_t offset = fitter->GetParameter(3);
- Double_t slope = fitter->GetParameter(4);
- // calculate the reference x (defined as medium between layer 2 and layer 3)
- // same procedure as in the tracker code
- Float_t medx = 0, xref = 0;
- Int_t startIndex = 5, nDistances = 0;
- for(Int_t iLayer = 5; iLayer > 0; iLayer--){
- if(tracklet[iLayer]->IsOK() && tracklet[iLayer - 1]->IsOK()){
- medx += tracklet[iLayer]->GetX0() - tracklet[iLayer - 1]->GetX0();
- startIndex = iLayer - 1;
- nDistances++;
- }
- }
- if(nDistances){
- medx /= nDistances;
- }
- else{
- Float_t xpos[2]; memset(xpos, 0, sizeof(Float_t) * 2);
- Int_t ien = 0, idiff = 0;
- for(Int_t iLayer = 5; iLayer > 0; iLayer--){
- if(tracklet[iLayer]->IsOK()){
- xpos[ien++] = tracklet[iLayer]->GetX0();
- startIndex = iLayer;
- }
- if(ien)
- idiff++;
- if(ien >=2)
- break;
- }
- medx = (xpos[0] - xpos[1])/idiff;
- }
- xref = tracklet[startIndex]->GetX0() + medx * (2.5 - startIndex) - 0.5 * (AliTRDgeometry::AmThick() + AliTRDgeometry::DrThick());
-
- for(Int_t ipt = 0; ipt < 1000; ipt++){
- Float_t x = kxmin + ipt * kxdelta;
- Float_t z = offset + slope * (x - xref);
- fitfun->SetPoint(nPoints++, z, x);
- }
- }
- break;
- }
- if(found){
- TGraph *trGraph = new TGraph(ncls);
- TGraph *refPoints = new TGraph(nLayers);
- trGraph->SetMarkerStyle(20);
- trGraph->SetMarkerColor(kRed);
- refPoints->SetMarkerStyle(21);
- refPoints->SetMarkerColor(kBlue);
- // fill the graphs
- for(Int_t iLayer = 0; iLayer < nLayers; iLayer++)
- refPoints->SetPoint(iLayer, refP[iLayer], x0[iLayer]);
- for(Int_t icls = 0; icls < ncls; icls++)
- trGraph->SetPoint(icls, clp[icls], clx[icls]);
- TCanvas *c1 = new TCanvas();
- trGraph->SetTitle(Form("Event %d, Candidate %d\n", fgEventNumber, fgCandidateNumber));
- refPoints->SetTitle(Form("Event %d, Candidate %d\n", fgEventNumber, fgCandidateNumber));
- fitfun->SetTitle(Form("Event %d, Candidate %d\n", fgEventNumber, fgCandidateNumber));
- trGraph->Draw("ap");
- refPoints->Draw("psame");
- fitfun->Draw("lpsame");
- return c1;
- }
- else{
- AliError(Form("Combination consisting of event %d and candidate %d not found", event, candidate));
- delete fitfun;
- return 0x0;
- }
+ const Float_t kxmin = 280;
+ const Float_t kxmax = 380;
+ const Float_t kxdelta = (kxmax - kxmin)/1000;
+
+ if(strcmp(direction, "y") && strcmp(direction, "z")){
+ AliError(Form("Direction %s does not exist. Abborting!", direction));
+ return NULL;
+ }
+
+ TFile *debfile = TFile::Open("TRD.TrackerDebug.root");
+ if(!debfile){
+ AliError("File TRD.TrackerDebug.root not found.");
+ return NULL;
+ }
+ TString *treename = NULL;
+ if(iteration > -1)
+ treename = new TString("ImproveSeedQuality");
+ else
+ treename = new TString("MakeSeeds1");
+ fTree = (TTree *)(debfile->Get(treename->Data()));
+ if(!fTree){
+ AliError(Form("Tree %s not found in File TRD.TrackerDebug.root.", treename->Data()));
+ delete treename;
+ return NULL;
+ }
+ delete treename;
+
+ TGraph *fitfun = new TGraph(1000);
+ // Prepare containers
+ Float_t x0[AliTRDtrackerV1::kNPlanes],
+ refP[AliTRDtrackerV1::kNPlanes],
+ clx[AliTRDtrackerV1::kNPlanes * AliTRDtrackerV1::kNTimeBins],
+ clp[AliTRDtrackerV1::kNPlanes * AliTRDtrackerV1::kNTimeBins];
+ Int_t nLayers = 0, ncls = 0;
+
+ TLinearFitter *fitter = NULL;
+ AliTRDseedV1 *tracklet[6] = {NULL, NULL, NULL, NULL, NULL, NULL};
+ for(Int_t iLayer = 0; iLayer < 6; iLayer++)
+ fTree->SetBranchAddress(Form("S%d.", iLayer), &tracklet[iLayer]);
+ fTree->SetBranchAddress("FitterT.", &fitter);
+ fTree->SetBranchAddress("EventNumber", &fgEventNumber);
+ fTree->SetBranchAddress("CandidateNumber", &fgCandidateNumber);
+
+ Int_t nEntries = fTree->GetEntriesFast();
+ Bool_t found = kFALSE;
+ for(Int_t entry = 0; entry < nEntries; entry++){
+ fTree->GetEntry(entry);
+ if(fgEventNumber < event) continue;
+ if(fgEventNumber > event) break;
+ // EventNumber matching: Do the same for the candidate number
+ if(fgCandidateNumber < candidate) continue;
+ if(fgCandidateNumber > candidate) break;
+ found = kTRUE;
+
+ for(Int_t iLayer = 0; iLayer < 6; iLayer++){
+ if(!tracklet[iLayer]->IsOK()) continue;
+ x0[nLayers] = tracklet[iLayer]->GetX0();
+ if(!strcmp(direction, "y"))
+ refP[nLayers] = tracklet[iLayer]->GetYref(0);
+ else
+ refP[nLayers] = tracklet[iLayer]->GetZref(0);
+ nLayers++;
+ AliTRDcluster *cl(NULL);
+ for(Int_t itb = 0; itb < 30; itb++){
+ if(!tracklet[iLayer]->IsUsable(itb)) continue;
+ if(!(cl = tracklet[iLayer]->GetClusters(itb))) continue;
+
+ if(!strcmp(direction, "y"))
+ clp[ncls] = cl->GetY();
+ else
+ clp[ncls] = cl->GetZ();
+ clx[ncls] = cl->GetX();
+ ncls++;
+ }
+ }
+ // Add function derived by the tilted Rieman fit (Defined by the curvature)
+ Int_t nPoints = 0;
+ if(!strcmp(direction, "y")){
+ Double_t a = fitter->GetParameter(0);
+ Double_t b = fitter->GetParameter(1);
+ Double_t c = fitter->GetParameter(2);
+ Double_t curvature = 1.0 + b*b - c*a;
+ if (curvature > 0.0) {
+ curvature = a / TMath::Sqrt(curvature);
+ }
+ // Numerical evaluation of the function:
+ for(Int_t ipt = 0; ipt < 1000; ipt++){
+ Float_t x = kxmin + ipt * kxdelta;
+ Double_t res = (x * a + b); // = (x - x0)/y0
+ res *= res;
+ res = 1.0 - c * a + b * b - res; // = (R^2 - (x - x0)^2)/y0^2
+ Double_t y = 0.;
+ if (res >= 0) {
+ res = TMath::Sqrt(res);
+ y = (1.0 - res) / a;
+ }
+ fitfun->SetPoint(nPoints++, y, x);
+ }
+ }
+ else{
+ Double_t offset = fitter->GetParameter(3);
+ Double_t slope = fitter->GetParameter(4);
+ // calculate the reference x (defined as medium between layer 2 and layer 3)
+ // same procedure as in the tracker code
+ Float_t medx = 0, xref = 0;
+ Int_t startIndex = 5, nDistances = 0;
+ for(Int_t iLayer = 5; iLayer > 0; iLayer--){
+ if(tracklet[iLayer]->IsOK() && tracklet[iLayer - 1]->IsOK()){
+ medx += tracklet[iLayer]->GetX0() - tracklet[iLayer - 1]->GetX0();
+ startIndex = iLayer - 1;
+ nDistances++;
+ }
+ }
+ if(nDistances){
+ medx /= nDistances;
+ }
+ else{
+ Float_t xpos[2]; memset(xpos, 0, sizeof(Float_t) * 2);
+ Int_t ien = 0, idiff = 0;
+ for(Int_t iLayer = 5; iLayer > 0; iLayer--){
+ if(tracklet[iLayer]->IsOK()){
+ xpos[ien++] = tracklet[iLayer]->GetX0();
+ startIndex = iLayer;
+ }
+ if(ien)
+ idiff++;
+ if(ien >=2)
+ break;
+ }
+ medx = (xpos[0] - xpos[1])/idiff;
+ }
+ xref = tracklet[startIndex]->GetX0() + medx * (2.5 - startIndex) - 0.5 * (AliTRDgeometry::AmThick() + AliTRDgeometry::DrThick());
+
+ for(Int_t ipt = 0; ipt < 1000; ipt++){
+ Float_t x = kxmin + ipt * kxdelta;
+ Float_t z = offset + slope * (x - xref);
+ fitfun->SetPoint(nPoints++, z, x);
+ }
+ }
+ break;
+ }
+ if(found){
+ TGraph *trGraph = new TGraph(ncls);
+ TGraph *refPoints = new TGraph(nLayers);
+ trGraph->SetMarkerStyle(20);
+ trGraph->SetMarkerColor(kRed);
+ refPoints->SetMarkerStyle(21);
+ refPoints->SetMarkerColor(kBlue);
+ // fill the graphs
+ for(Int_t iLayer = 0; iLayer < nLayers; iLayer++)
+ refPoints->SetPoint(iLayer, refP[iLayer], x0[iLayer]);
+ for(Int_t icls = 0; icls < ncls; icls++)
+ trGraph->SetPoint(icls, clp[icls], clx[icls]);
+ TCanvas *c1 = new TCanvas();
+ trGraph->SetTitle(Form("Event %d, Candidate %d\n", fgEventNumber, fgCandidateNumber));
+ refPoints->SetTitle(Form("Event %d, Candidate %d\n", fgEventNumber, fgCandidateNumber));
+ fitfun->SetTitle(Form("Event %d, Candidate %d\n", fgEventNumber, fgCandidateNumber));
+ trGraph->Draw("ap");
+ refPoints->Draw("psame");
+ fitfun->Draw("lpsame");
+ return c1;
+ }
+ else{
+ AliError(Form("Combination consisting of event %d and candidate %d not found", event, candidate));
+ delete fitfun;
+ return NULL;
+ }