X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDPattern.cxx;h=800ee2b66f61c0a41e463aa1da7ce6748ba1ff1c;hb=f2597905eb67c24eccdfc2766a88fbb587fbc547;hp=48813737453f3709a16b10f96b332f2b202dd2e6;hpb=17e542eb0f46685944579c4264c0716591d93379;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDPattern.cxx b/FMD/AliFMDPattern.cxx index 48813737453..800ee2b66f6 100644 --- a/FMD/AliFMDPattern.cxx +++ b/FMD/AliFMDPattern.cxx @@ -29,7 +29,7 @@ // Latest changes by Christian Holm Christensen // -// #include +#include // #include // #include @@ -65,7 +65,9 @@ AliFMDPattern::AliFMDPatternDetector::AliFMDPatternDetector(UShort_t id) : fId(id), fCounts(0), fGraphs(0), - fFrame(0) + fFrame(0), + fInners(10), + fOuters(id == 1 ? 0 : 20) { // CTOR // @@ -103,8 +105,48 @@ AliFMDPattern::AliFMDPatternDetector::DrawShape(TObjArray& a) //____________________________________________________________________ void -AliFMDPattern::AliFMDPatternDetector::Begin(Int_t nlevel, Double_t r, - TObjArray& inners, TObjArray& outers) +AliFMDPattern::AliFMDPatternDetector::CopyShapes(TObjArray& src, + TObjArray& dest, + Double_t ang, + Double_t fx, + Double_t fy) +{ + TIter next(&src); + TGraph* g = 0; + while ((g = static_cast(next()))) { + TGraph* gg = new TGraph(*g); + Double_t* x = gg->GetX(); + Double_t* y = gg->GetY(); + for (Int_t i = 0; i < gg->GetN(); i++) { + Float_t xx = x[i] * TMath::Cos(ang) - y[i] * TMath::Sin(ang); + Float_t yy = x[i] * TMath::Sin(ang) + y[i] * TMath::Cos(ang); + gg->SetPoint(i, fx * xx, fy * yy); + } + gg->SetFillStyle(g->GetFillStyle()); + gg->SetFillColor(g->GetFillColor()); + gg->SetLineStyle(g->GetLineStyle()); + gg->SetLineColor(g->GetLineColor()); + gg->SetLineWidth(g->GetLineWidth()); + gg->SetMarkerStyle(g->GetMarkerStyle()); + gg->SetMarkerColor(g->GetMarkerColor()); + gg->SetMarkerSize(g->GetMarkerSize()); + TString name(g->GetName()); + name.ReplaceAll("X", Form("%d",fId)); + gg->SetName(name.Data()); + TString title(g->GetTitle()); + title.ReplaceAll("X", Form("%d",fId)); + gg->SetTitle(title.Data()); + dest.Add(gg); + } + dest.SetOwner(); +} + +//____________________________________________________________________ +void +AliFMDPattern::AliFMDPatternDetector::Begin(Int_t nlevel, + Double_t r, + TObjArray& inners, + TObjArray& outers) { // Start of a run. // @@ -120,16 +162,26 @@ AliFMDPattern::AliFMDPatternDetector::Begin(Int_t nlevel, Double_t r, TStyle* style = gStyle; if (nlevel < 1) nlevel = style->GetNumberOfColors(); fCounts.Set(nlevel); + Double_t rr = 1.05 * r; if (!fFrame) { // The code-checker thinks this is not using the declaration of // TH2F - what a morron! fFrame = new TH2F(Form("fmd%dFrame", fId), Form("FMD%d", fId), - 10, -r, r, 10, -r, r); + 100, -rr, rr, 100, -rr, rr); fFrame->SetStats(kFALSE); fFrame->Draw(); } - DrawShape(inners); - if (fId != 1) DrawShape(outers); + Double_t ang = (fId == 1 ? -TMath::Pi() / 2 : 0); + Double_t fx = (fId == 3 ? -1 : 1); // Flip around Y + Double_t fy = (fId == 1 ? 1 : 1); // Flip around X + + CopyShapes(inners, fInners, ang, fx, fy); + DrawShape(fInners); + if (fId != 1) { + CopyShapes(outers, fOuters, ang, fx, fy); + DrawShape(fOuters); + } + for (Int_t i = 0; i < nlevel; i++) { TGraph* g = new TGraph; Int_t idx = Int_t(Float_t(i) / nlevel * style->GetNumberOfColors()); @@ -140,10 +192,11 @@ AliFMDPattern::AliFMDPatternDetector::Begin(Int_t nlevel, Double_t r, g->SetFillColor(col); g->SetMarkerSize(i * .2 + .2); g->SetMarkerStyle(2); + g->SetEditable(kFALSE); g->Draw("same p"); fGraphs.AddAtAndExpand(g, i); } - TIter next(&fGraphs); + // TIter next(&fGraphs); } //____________________________________________________________________ @@ -167,12 +220,25 @@ AliFMDPattern::AliFMDPatternDetector::End() TIter next(&fGraphs); TGraph* g = 0; Int_t i = 0; - while ((g = static_cast(next()))) g->Set(fCounts[i++]); + while ((g = static_cast(next()))) { + Int_t cnt = fCounts[i++]; + if (cnt > 0) { + g->Set(cnt); + g->SetMarkerSize(i * .2 + .2); + } + else { + g->SetPoint(0,0,0); + g->SetMarkerSize(0); + } + } + } //____________________________________________________________________ void -AliFMDPattern::AliFMDPatternDetector::AddMarker(Double_t x, Double_t y, Float_t s, - Float_t max) +AliFMDPattern::AliFMDPatternDetector::AddMarker(Double_t x, + Double_t y, + Float_t s, + Float_t max) { // Add a marker at (X,Y,Z). The marker color and size is chosen // relative to the MAX argument. @@ -186,6 +252,12 @@ AliFMDPattern::AliFMDPatternDetector::AddMarker(Double_t x, Double_t y, Float_t this a usage of the TMath namespace declaration! Idiot */ Int_t i = TMath::Min(Int_t(fCounts.fN * s / max), Int_t(fGraphs.GetEntries()-1)); + if (i < 0 || i >= fCounts.fN) { + std::cerr << "Graph index " << i << " out of bounds [0," + << fCounts.fN << ") - " + << fCounts.fN << " * " << s << " / " << max << std::endl; + return; + } TGraph* g = static_cast(fGraphs.At(i)); if (!g) return; g->SetPoint(fCounts[i]++, x, y); @@ -211,7 +283,10 @@ AliFMDPattern::AliFMDPattern(const char* gAliceFile) fFMD2Sum(.2, .6, "# in FMD2: "), fFMD3Sum(.2, .5, "# in FMD3: "), fLine(.15, .47, .85, .47), - fTotal(.2, .35, "Total: ") + fTotal(.2, .35, "Total: "), + fFMD1Area(0), + fFMD2Area(0), + fFMD3Area(0) { // Constructor. // @@ -220,6 +295,9 @@ AliFMDPattern::AliFMDPattern(const char* gAliceFile) // gAliceFile The galice.root file to use - if any. // + SetName("AliFMDPattern"); + SetName("2D display of FMD data"); + // RemoveLoad(kGeometry); fEvent.SetBit(TLatex::kTextNDC); fFMD1Sum.SetBit(TLatex::kTextNDC); @@ -252,30 +330,53 @@ AliFMDPattern::Init() geom->Init(); geom->InitTransformations(); + fFMD1Area = 0; + fFMD2Area = 0; + fFMD3Area = 0; + + Double_t innerArea = 0; + Double_t outerArea = 0; + Char_t rs[] = { 'I' , 'O', '\0' }; Char_t *r = rs; do { AliFMDRing* ring = geom->GetRing(*r); if (!ring) continue; + + Double_t rl = ring->GetMinR(); + Double_t rh = ring->GetMaxR(); + Double_t area = rh * rh * TMath::Pi() - rl * rl * TMath::Pi(); + if (*r == 'I') innerArea = area; + else outerArea = area; + + const TObjArray& vs = ring->GetVerticies(); TObjArray& gs = (*r == 'I' ? fInners : fOuters); Float_t& mr = (*r == 'I' ? fInnerMax : fOuterMax); Int_t nm = ring->GetNModules(); - AliInfo(Form("Making %d modules for %c", nm, *r)); + AliFMDDebug(1, ("Making %d modules for %c", nm, *r)); for (Int_t m = 0; m < nm; m++) { - Int_t nv = vs.GetEntries(); + Int_t nv = 6; // vs.GetEntries(); Double_t a = TMath::Pi() / 180 * (m * 2 + 1) * ring->GetTheta(); TGraph* g = new TGraph(nv+1); Double_t x0 = 0, y0 = 0; gs.AddAtAndExpand(g, m); - for (Int_t c = 0; c < nv; c++) { + for (Int_t c = 1; c < 4; c++) { TVector2* v = static_cast(vs.At(c)); mr = TMath::Max(mr, Float_t(v->Mod())); TVector2 w(v->Rotate(a)); - if (c == 0) { x0 = w.X(); y0 = w.Y(); } - g->SetPoint(c, w.X(), w.Y()); + if (c == 1) { x0 = w.X(); y0 = w.Y(); } + g->SetPoint(c-1, w.X(), w.Y()); + } + for (Int_t c = 3; c > 0; c--) { + TVector2* v = static_cast(vs.At(c)); + TVector2 u(-v->X(), v->Y()); + mr = TMath::Max(mr, Float_t(u.Mod())); + TVector2 w(u.Rotate(a)); + g->SetPoint(3+(3-c), w.X(), w.Y()); } - g->SetName(Form("FMDX%c_%02d", *r, m)); + g->SetName(Form("FMDX%c_%02d%02d", *r, 2*m,2*m+1)); + g->SetTitle(Form("FMDX%c, sectors %d and %d", *r, 2*m,2*m+1)); g->SetPoint(nv, x0, y0); g->SetFillColor((*rs == 'I' ? (m % 2 == 0 ? 18 : 17) : @@ -286,7 +387,11 @@ AliFMDPattern::Init() g->SetLineStyle(2); } } while (*(++r)); - + + fFMD1Area = innerArea; + fFMD2Area = innerArea + outerArea; + fFMD3Area = innerArea + outerArea; + return kTRUE; } @@ -302,7 +407,7 @@ AliFMDPattern::Begin(Int_t event) // MakeAux(); if (!fCanvas) { - const char* which[] = { "Continue", "Redisplay", 0 }; + const char* which[] = { "Continue", "Start", "Pause", "Redisplay", 0 }; MakeCanvas(which); AliFMDGeometry* geom = AliFMDGeometry::Instance(); @@ -372,17 +477,20 @@ AliFMDPattern::AtEnd() fFMD1.End(); fFMD1Pad->Modified(); - fFMD1Sum.SetTitle(Form("# hits in FMD1: %5d", fFMD1.Total())); + fFMD1Sum.SetTitle(Form("# hits in FMD1: %5d (%4.2f /cm^{2})", + fFMD1.Total(), fFMD1.Total()/fFMD1Area)); total += fFMD1.Total(); fFMD2.End(); fFMD2Pad->Modified(); - fFMD2Sum.SetTitle(Form("# hits in FMD2: %5d", fFMD2.Total())); + fFMD2Sum.SetTitle(Form("# hits in FMD2: %5d (%4.2f /cm^{2})", + fFMD2.Total(), fFMD2.Total()/fFMD2Area)); total += fFMD2.Total(); fFMD3.End(); fFMD3Pad->Modified(); - fFMD3Sum.SetTitle(Form("# hits in FMD3: %5d", fFMD3.Total())); + fFMD3Sum.SetTitle(Form("# hits in FMD3: %5d (%4.2f /cm^{2})", + fFMD3.Total(), fFMD3.Total()/fFMD3Area)); total += fFMD3.Total(); fTotal.SetTitle(Form("Total: %5d/51200 (%3d%%)", @@ -404,10 +512,21 @@ AliFMDPattern::ProcessHit(AliFMDHit* hit, TParticle*) // HIT The hit to process. // // The TParticle argument is never used. + static const Float_t rMin = fgkEdepRange.fLow; + static const Float_t rMax = fgkEdepRange.fHigh; + + if (!hit) { AliError("No hit"); return kFALSE; } + // if (!p) { AliError("No track"); return kFALSE; } + Float_t edep = hit->Edep(); + + if (fHits) fHits->Add(hit); + if (fSpec) fSpec->Fill(edep); + if (InsideCut(edep, rMin, rMax) && fSpecCut) fSpecCut->Fill(edep); + switch (hit->Detector()) { - case 1: fFMD1.AddMarker(hit->X(), hit->Y(), hit->Edep(), 1); break; - case 2: fFMD2.AddMarker(hit->X(), hit->Y(), hit->Edep(), 1); break; - case 3: fFMD3.AddMarker(hit->X(), hit->Y(), hit->Edep(), 1); break; + case 1: fFMD1.AddMarker(hit->X(), hit->Y(), hit->Edep(), rMax); break; + case 2: fFMD2.AddMarker(hit->X(), hit->Y(), hit->Edep(), rMax); break; + case 3: fFMD3.AddMarker(hit->X(), hit->Y(), hit->Edep(), rMax); break; } return kTRUE; } @@ -417,7 +536,7 @@ AliFMDPattern::ProcessHit(AliFMDHit* hit, TParticle*) void AliFMDPattern::AddMarker(UShort_t det, Char_t rng, UShort_t sec, UShort_t str, - TObject*, Float_t s, Float_t max) + TObject*, Float_t s, Float_t /*min*/, Float_t max) { // Add a marker to the display // @@ -441,7 +560,7 @@ AliFMDPattern::AddMarker(UShort_t det, Char_t rng, geom->Detector2XYZ(det, rng, sec, str, x, y, z); // Make code-checker shut the f**k up TRandom* rand = gRandom; - if (true) { + if (false) { AliFMDRing* r = geom->GetRing(rng); Double_t t = .9 * r->GetTheta() / 2; Double_t a = rand->Uniform(-t,t) * TMath::Pi() / 180;