New macro - build tree from scan results on individual events.
* esd_spd_tracklets.C
From Domenico - add cuts to mark "bad" tracklets at load time.
* AliEveTrackCounter
Store scan results by writing ESD track container and AliMultiplicity
into scan_results.root.
Display the results by running show_scan_results.C and then
calling TTree::Draw() commands on the created tree.
Probably the drawing function should also be a macro.
#include <TEveGedEditor.h>
+#include <TFile.h>
+
//==============================================================================
// AliEveTrackCounter
//==============================================================================
/******************************************************************************/
//______________________________________________________________________________
-void AliEveTrackCounter::OutputEventTracks(FILE* out)
+void AliEveTrackCounter::OutputEventTracks()
{
// Print good-track summary into a plain-text file by iteration
// through all registered track-lists.
// State of each track is determined by its line-style, it is
// considered a good track if it's line style is solid.
- if (out == 0)
{
- out = stdout;
- fprintf(out, "AliEveTrackCounter::OutputEventTracks()\n");
+ TFile *f = TFile::Open("scan_results.root", "UPDATE");
+
+ AliESDEvent *esd = AliEveEventManager::AssertESD();
+ TClonesArray *trk = static_cast<TClonesArray*> (esd->GetList()->FindObject("Tracks"));
+ AliMultiplicity *mul = const_cast <AliMultiplicity*>(esd->GetMultiplicity());
+
+ trk->Write(TString::Format("Tracks_%04d", fEventId), kWriteDelete | kSingleKey);
+ mul->Write(TString::Format("Tracklets_%04d", fEventId), kWriteDelete);
+
+ f->Close();
}
+}
+
+//______________________________________________________________________________
+void AliEveTrackCounter::PrintEventTracks()
+{
+ // Print good-track summary to stdout by iteration
+ // through all registered track-lists.
+ // State of each track is determined by its line-style, it is
+ // considered a good track if it's line style is solid.
+
+ FILE* out = stdout;
+
+ fprintf(out, "AliEveTrackCounter::PrintEventTracks()\n");
fprintf(out, "Event=%d\n", fEventId);
fprintf(out, "GoodTracks=%d AllTracks=%d\n", fGoodTracks, fAllTracks);
Int_t GetClickAction() const { return fClickAction; }
void SetClickAction(Int_t a) { fClickAction = a; }
- void OutputEventTracks(FILE* out=0);
+ void OutputEventTracks();
+ void PrintEventTracks();
static AliEveTrackCounter* fgInstance;
#include "TGComboBox.h"
#include "TGMsgBox.h"
+#include "TTree.h"
#include "TH1F.h"
#include "TCanvas.h"
+#include "TLatex.h"
#include "TEveManager.h"
#include "TROOT.h"
{
// Slot for PrintReport.
- fM->OutputEventTracks();
+ fM->PrintEventTracks();
}
//______________________________________________________________________________
{
// Slot for FileReport.
- TString file(Form("ev-report-%03d.txt", fM->GetEventId()));
- if (gSystem->AccessPathName(file) == kFALSE)
- {
- Int_t ret;
- new TGMsgBox(fClient->GetRoot(), GetMainFrame(),
- "File Exist",
- Form("Event record for event %d already exist.\n Replace?", fM->GetEventId()),
- kMBIconQuestion, kMBYes | kMBNo, &ret);
- if (ret == kMBNo)
- return;
- }
- FILE* out = fopen(file, "w");
- if (out) {
- fM->OutputEventTracks(out);
- fclose(out);
- } else {
- Error("AliEveTrackCounterEditor::DoFileReport",
- "Can not open file '%s' for writing.", file.Data());
- }
+ fM->OutputEventTracks();
}
//______________________________________________________________________________
{
// Slot for ShowHistos.
- TH1F* hcnt = new TH1F("cnt", "Primeries per event", 41, -0.5, 40.5);
- TH1F* hchg = new TH1F("chg", "Primary charge", 3, -1.5, 1.5);
- TH1F* hpt = new TH1F("pt", "pT distribution", 40, 0.0, 8.0);
- TH1F* heta = new TH1F("eta", "eta distribution", 40, -1.0, 1.0);
- TH1F* hphi = new TH1F("phi", "phi distribution", 40, -3.1416, 3.1416);
+ static const TEveException kEH("AliEveTrackCounterEditor::DoShowHistos ");
- Int_t nn; // fscanf return value
+ TEveUtil::Macro("show_scan_results.C");
- for (Int_t i=0; i<1000; ++i)
- {
- TString file(Form("ev-report-%03d.txt", i));
- if (gSystem->AccessPathName(file) == kFALSE)
- {
- Int_t ev, ngoodtr, nalltr;
- FILE* f = fopen(file, "read");
-
- nn = fscanf(f, "Event=%d\n", &ev);
- if (nn != 1) { printf("SAFR0 %d\n", nn); fclose(f); return; }
-
- nn = fscanf(f, "GoodTracks=%d AllTracks=%d\n", &ngoodtr, &nalltr);
- if (nn != 2) { printf("SAFR1 %d\n", nn); fclose(f); return; }
-
- hcnt->Fill(ngoodtr);
- for (Int_t t = 0; t < ngoodtr; ++t)
- {
- Int_t id, chg;
- Float_t pt, eta, phi;
- nn = fscanf(f, "%d: chg=%d pt=%f eta=%f phi=%f\n", &id, &chg, &pt, &eta, &phi);
- if (nn != 5) { printf("SAFR2 %d\n", nn); fclose(f); return; }
- hchg->Fill(chg);
- hpt ->Fill(pt);
- heta->Fill(eta);
- hphi->Fill(phi);
- }
- fclose(f);
- }
- }
+ TTree* t = (TTree*) gDirectory->Get("SR");
- TCanvas* c;
- if (gPad == 0 || gPad->GetCanvas()->IsEditable() == kFALSE) {
- c = new TCanvas("Scanwas", "Scanning Results", 800, 600);
- } else {
- c = gPad->GetCanvas();
- c->Clear();
- }
+ if (t == 0)
+ throw kEH + "Tree 'SR' with scan results not found.";
+
+ TCanvas *c = 0;
+
+ //----------------------------------------------------------------------------
+ // Tracks
+ //----------------------------------------------------------------------------
+
+ c = new TCanvas("Tracks", "Track Scanning Results", 800, 600);
c->Divide(2, 3);
- c->cd(1); hcnt->Draw();
- c->cd(2); hchg->Draw();
- c->cd(3); hpt ->Draw();
- c->cd(4); heta->Draw();
- c->cd(5); hphi->Draw();
+ c->cd(1);
+ t->Draw("Sum$(T.fLabel & 1)");
+
+ c->cd(2);
+ t->Draw("T.GetSign()", "T.fLabel & 1");
+
+ c->cd(3);
+ t->Draw("T.GetSign()", "T.fLabel & 1");
+
+ c->cd(4);
+ t->Draw("T.Eta()", "T.fLabel & 1");
+
+ c->cd(5);
+ t->Draw("T.Phi()", "T.fLabel & 1");
+
+ c->Modified();
+ c->Update();
+
+ //----------------------------------------------------------------------------
+ // Trackelts
+ //----------------------------------------------------------------------------
+
+ c = new TCanvas("Tracklets", "Tracklet Scanning Results", 800, 600);
+ (new TLatex(0.2, 0.4, "Not yet available"))->Draw();
c->Modified();
c->Update();
// are relevant for tracklets.
TEveTrackList* esd_spd_tracklets(Float_t radius=8, Width_t line_width=3,
- Float_t d_theta=0.025, Float_t d_phi=0.08)
+ Float_t dPhiWindow=0.080, Float_t dThetaWindow=0.025,
+ Float_t dPhiShift05T=0.0045)
{
// radius - cylindrical radius to which the tracklets should be extrapolated
prop->SetMaxR(radius);
gEve->AddElement(cont);
+ const Float_t Bz = TMath::Abs(field->SolenoidField());
+
+ const Double_t dPhiShift = dPhiShift05T / 5.0 * Bz;
+ const Double_t dPhiWindow2 = dPhiWindow * dPhiWindow;
+ const Double_t dThetaWindow2 = dThetaWindow * dThetaWindow;
+
for (Int_t i = 0; i < mul->GetNumberOfTracklets(); ++i)
{
- Float_t theta = mul->GetTheta(i);
- Float_t phi = mul->GetPhi(i);
+ Float_t theta = mul->GetTheta(i);
+ Float_t phi = mul->GetPhi(i);
+ Float_t dTheta = mul->GetDeltaTheta(i);
+ Float_t dPhi = mul->GetDeltaPhi(i);
AliEveTracklet* t = new AliEveTracklet(i, pv, theta, phi, prop);
t->SetAttLineAttMarker(cont);
t->SetElementName(Form("Tracklet %d", i));
- t->SetElementTitle(Form("id=%d: eta=%.3f, theta=%.3f, phi=%.3f",
- i, mul->GetEta(i), theta, phi));
- // if some condition
- mul->SetLabel(i, 0, 3);
- // else mul->SetLabel(i, 0, 0);
+ t->SetElementTitle(Form("Id = %d\nEta=%.3f, Theta=%.3f, dTheta=%.3f\nPhi=%.3f dPhi=%.3f",
+ i, mul->GetEta(i), theta, dTheta, phi, dPhi));
+
+ dPhi -= dPhiShift;
+
+ Float_t d = dPhi*dPhi/dPhiWindow2 + dTheta*dTheta/dThetaWindow2;
+ if (d < 1.0f)
+ mul->SetLabel(i, 0, 3);
+ else
+ mul->SetLabel(i, 0, 0);
cont->AddElement(t);
}
--- /dev/null
+// Fix magnetic field ... so that we can display
+// old data from alien.
+
+void mf_fix()
+{
+ AliMagF* fld = new AliMagF("Map", "Map", -1.0, 1.0, AliMagF::k5kG, AliMagF::kNoBeamField, -1.0);
+ TGeoGlobalMagField::Instance()->SetField(fld);
+ TGeoGlobalMagField::Instance()->Lock();
+}
--- /dev/null
+// Label is used to store scanning result for tracks and trackelts.
+//
+// BIT(1) stores the original selection.
+// BIT(0) stores the user selection (set to same value as b1 at init).
+//
+// This allows to check all possible combinations.
+
+
+void show_scan_results()
+{
+ TFile *f = TFile::Open("scan_results.root", "UPDATE");
+
+ f->Delete("SR;*");
+
+ T = new TTree("SR", "Scanning results");
+
+ TClonesArray* clones = new TClonesArray("AliESDtrack", 32);
+ TBranch * tb = T->Branch("T", &clones);
+
+ AliMultiplicity *mult = 0;
+ TBranch *mb = T->Branch("M", &mult);
+
+
+ for (Int_t i=0; i<=9999; ++i)
+ {
+ TString name;
+
+ name.Form("Tracks_%04d", i);
+ TClonesArray* ts = (TClonesArray*) f->Get(name);
+
+ name.Form("Tracklets_%04d", i);
+ AliMultiplicity* ms = (AliMultiplicity*) f->Get(name);
+
+ if (ts && ms)
+ {
+ tb->SetAddress(&ts);
+ mb->SetAddress(&ms);
+ T->Fill();
+ }
+ else if ((ts && !ms) || (!ts && ms))
+ {
+ Error("show_scan_results", "Only one of tracks/tracklets exists for index %d.", i);
+ }
+
+ }
+
+ T->Write();
+
+ f->Close();
+ delete f;
+
+ // Reopen in read mode.
+ TFile::Open("scan_results.root");
+}