X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONDisplay.cxx;h=974b2ba484479ba2afca8da5e99e1560b3ee1703;hb=553b971074b2e3085f827fc41b650ab01d528388;hp=661c75a9086c7876dccc02cff233f3239b8e9900;hpb=c856e08690804a2af62829edaba9a86a5a61afed;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONDisplay.cxx b/MUON/AliMUONDisplay.cxx index 661c75a9086..974b2ba4844 100644 --- a/MUON/AliMUONDisplay.cxx +++ b/MUON/AliMUONDisplay.cxx @@ -23,50 +23,53 @@ // // ////////////////////////////////////////////////////////////////////////// -#include -#include #include #include #include #include #include -#include #include #include -#include #include #include #include -#include #include -#include -#include #include #include -#include #include -#include #include +#include +#include +#include +#include "AliMUONDisplay.h" #include "AliRun.h" -#include "AliDetector.h" #include "AliMUON.h" -#include "AliMUONDisplay.h" #include "AliMUONPoints.h" -#include "TParticle.h" #include "AliMUONGlobalTrigger.h" #include "AliHeader.h" #include "AliMUONHit.h" -#include "AliMUONPadHit.h" #include "AliMUONDigit.h" #include "AliMUONRawCluster.h" +#include "AliMUONTrack.h" +#include "AliMUONTrackParam.h" + +#include "AliMUONGeometryTransformer.h" +#include "AliMUONGeometryModule.h" +#include "AliMpSlatSegmentation.h" +#include "AliMpSlat.h" +#include "AliMpSectorSegmentation.h" +#include "AliMpSector.h" + +#include "AliMpTriggerSegmentation.h" +#include "AliMpTrigger.h" -#include "AliSegmentation.h" -#include "AliMUONResponse.h" -#include "AliMUONChamber.h" +#include "AliMUONSegmentation.h" +#include "AliMUONGeometrySegmentation.h" #include "AliMUONConstants.h" #include "AliMC.h" +#include "AliLog.h" // to manage the same zoom on both cathodes @@ -76,6 +79,7 @@ ClassImp(AliMUONDisplay) //_____________________________________________________________________________ AliMUONDisplay::AliMUONDisplay() + : AliDisplay() { // Constructor fPoints = 0; @@ -88,6 +92,7 @@ AliMUONDisplay::AliMUONDisplay() //_____________________________________________________________________________ AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader) + : AliDisplay() { // Create an event display object. // A canvas named "edisplay" is created with a vertical size in pixels @@ -155,6 +160,7 @@ AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader) // fRzone = 1.e10; fDrawClusters = kTRUE; fDrawCoG = kTRUE; + fDrawTracks = kFALSE; fZoomMode = 1; fZooms = 0; fClustersCuts = 0; @@ -167,7 +173,7 @@ AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader) Int_t ysize = size; if (ysize < 100) ysize = 750; Int_t xsize = Int_t(size*830./ysize); - fCanvas = new TCanvas("Canvas", "MUON Clusters Display",14,47,xsize,ysize); + fCanvas = new TCanvas("Canvas", "MUON Display",14,47,xsize,ysize); fCanvas->ToggleEventStatus(); // Create main display pad @@ -233,10 +239,12 @@ AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader) fMUONData =0x0; } -AliMUONDisplay::AliMUONDisplay(const AliMUONDisplay & display):AliDisplay(display) +AliMUONDisplay::AliMUONDisplay(const AliMUONDisplay & display) + : AliDisplay(display) { -// Dummy copy constructor - ; +// Protected copy constructor + + AliFatal("Not implemented."); } @@ -325,6 +333,12 @@ void AliMUONDisplay::DisplayButtons() button->SetFillColor(38); button->Draw(); + y -= dbutton + dy; + char but8[] = "((AliMUONDisplay*)(gAlice->Display()))->DrawReco()"; + button = new TButton("Tracking", but8, x0, y - dbutton, x1, y); + button->SetFillColor(38); + button->Draw(); + // display logo TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22); diamond->SetFillColor(50); @@ -340,7 +354,7 @@ void AliMUONDisplay::DisplayButtons() } //_____________________________________________________________________________ -void AliMUONDisplay::CreateColors() +void AliMUONDisplay::CreateColors() const { // Create the colors palette used to display clusters @@ -420,11 +434,9 @@ void AliMUONDisplay::DisplayColorScale() text->SetTextSize(0.2); text->SetTextAlign(22); - AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); - AliMUONChamber *iChamber = &(pMUON->Chamber(fChamber-1)); - AliMUONResponse * response=iChamber->ResponseModel(); - Int_t adcmax=1024; - if (response) adcmax = (Int_t) response->MaxAdc(); + + Int_t adcmax=4096; // default 12 bits ADC + TBox *box; @@ -473,73 +485,137 @@ void AliMUONDisplay::Draw(Option_t *) { // Display current event - fPad->cd(); + if (!fDrawTracks) + DrawChamber(); + else + DrawReco(); + +} +//_____________________________________________________________________________ +void AliMUONDisplay::DrawChamber() +{ - DrawView(fTheta, fPhi, fPsi); + fDrawTracks = kFALSE; + fPad->cd(); + DrawView(fTheta, fPhi, fPsi); + // Display the event number and title + fPad->cd(); + DrawTitle(); + +} +//_____________________________________________________________________________ +void AliMUONDisplay::DrawReco(Option_t *) +{ +// Display current event + + fDrawTracks = kTRUE; + // print kinematics of generated particles + PrintKinematics(); + // Draw global view of muon system + fPad->cd(); + DrawGlobalView(135, -50, -140); + // Display the event number and title fPad->cd(); DrawTitle(); } +//_____________________________________________________________________________ +void AliMUONDisplay::PrintKinematics() +{ + AliRunLoader * runLoader; + TParticle *particle = new TParticle(); + Int_t nPart; + Float_t vertex[3], momentum[3]; + + if (fLoader) + runLoader = fLoader->GetRunLoader(); + else + runLoader = 0x0; + + printf("****** Event # %d ******\n",runLoader->GetEventNumber()); + runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle); + nPart = (Int_t)runLoader->TreeK()->GetEntries(); + for(Int_t iPart = 0; iPart < nPart; iPart++) { + runLoader->TreeK()->GetEvent(iPart); + vertex[0] = particle->Vx(); + vertex[1] = particle->Vy(); + vertex[2] = particle->Vz(); + momentum[0] = particle->Px(); + momentum[1] = particle->Py(); + momentum[2] = particle->Pz(); + + printf("===================================================\n"); + printf(" Generated particle # %d \n",iPart); + printf(" name: %s \n",particle->GetName()); + printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]); + printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]); + } + delete particle; +} + void AliMUONDisplay::DrawSegmentation() { + // to be re-written for new seg // Draw graphical representation of segmenatation // Attention: still experimental code - Int_t icat=1; +// Int_t icat=1; - AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); - AliMUONChamber* iChamber; - AliSegmentation* seg; - iChamber = &(pMUON->Chamber(fChamber)); - seg=iChamber->SegmentationModel(icat); - Float_t zpos=iChamber->Z(); - Float_t r=iChamber->ROuter(); +// AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); +// AliMUONChamber* iChamber; + +// AliSegmentation* seg; +// iChamber = &(pMUON->Chamber(fChamber)); +// seg=iChamber->SegmentationModel(icat); + +// Float_t zpos=iChamber->Z(); +// Float_t r=iChamber->ROuter(); - TMarker3DBox *marker; - if (icat == 1) { - for (Int_t j=0; jNpy(); j++) { - Float_t y0; - y0=j*seg->Dpy()-seg->Dpy()/2.; - for (seg->FirstPad(0.,y0,0,300,0.); - seg->MorePads(); - seg->NextPad()) - { - if (seg->ISector()==0) continue; - Float_t x,y,z; - seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z); - Float_t dpx=seg->Dpx(seg->ISector())/2; - Float_t dpy=seg->Dpy(seg->ISector())/2; - marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0); - marker->SetLineColor(seg->ISector()+1); - marker->SetFillStyle(1001); - marker->SetFillColor(0); - marker->Draw(); - } - } - } else { - for (Int_t j=0; j<250; j++) { - Float_t x0=j*seg->Dpx(); - Float_t y0=TMath::Sqrt(r*r-x0*x0); +// TMarker3DBox *marker; +// if (icat == 1) { +// for (Int_t j=0; jNpy(); j++) { +// Float_t y0; +// y0=j*seg->Dpy()-seg->Dpy()/2.; +// for (seg->FirstPad(0.,y0,0,300,0.); +// seg->MorePads(); +// seg->NextPad()) +// { +// if (seg->ISector()==0) continue; +// Float_t x,y,z; +// seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z); +// Float_t dpx=seg->Dpx(seg->ISector())/2; +// Float_t dpy=seg->Dpy(seg->ISector())/2; +// marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0); +// marker->SetLineColor(seg->ISector()+1); +// marker->SetFillStyle(1001); +// marker->SetFillColor(0); +// marker->Draw(); +// } +// } +// } else { +// for (Int_t j=0; j<250; j++) { +// Float_t x0=j*seg->Dpx(); +// Float_t y0=TMath::Sqrt(r*r-x0*x0); - for (seg->FirstPad(x0,0,0,0,y0); - seg->MorePads(); - seg->NextPad()) - { - if (seg->ISector()==0) continue; +// for (seg->FirstPad(x0,0,0,0,y0); +// seg->MorePads(); +// seg->NextPad()) +// { +// if (seg->ISector()==0) continue; - Float_t x,y,z; - seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z); - Float_t dpx=seg->Dpx(seg->ISector())/2; - Float_t dpy=seg->Dpy(seg->ISector())/2; - marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0); - marker->SetLineColor(seg->ISector()+1); - marker->SetFillStyle(1001); - marker->SetFillColor(0); - marker->Draw(); - } - } - } -} +// Float_t x,y,z; +// seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z); +// Float_t dpx=seg->Dpx(seg->ISector())/2; +// Float_t dpy=seg->Dpy(seg->ISector())/2; +// marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0); +// marker->SetLineColor(seg->ISector()+1); +// marker->SetFillStyle(1001); +// marker->SetFillColor(0); +// marker->Draw(); +// } +// } +// } + } //_____________________________________________________________________________ void AliMUONDisplay::DrawClusters() @@ -566,7 +642,7 @@ void AliMUONDisplay::DrawClusters() marker->Draw(); } pm->Draw(); - fClustersCuts +=pm->GetN(); + fClustersCuts += pm->GetN(); } } @@ -616,6 +692,26 @@ void AliMUONDisplay::DrawCoG() } } //_____________________________________________________________________________ +void AliMUONDisplay::DrawTracks() +{ +// Draw tracks + if (!fDrawTracks) return; + LoadTracks(); + + Int_t nTrack, iTrack; + TObjArray *points; + TPolyLine3D *pm; + + points = Rpoints(); + if (!points) return; + nTrack = points->GetEntriesFast(); + for ( iTrack = 0; iTrack < nTrack; iTrack++) { + pm = (TPolyLine3D*)points->UncheckedAt(iTrack); + if (!pm) continue; + pm->Draw(); + } +} +//_____________________________________________________________________________ void AliMUONDisplay::DrawTitle(Option_t *option) { @@ -628,11 +724,11 @@ void AliMUONDisplay::DrawTitle(Option_t *option) Float_t dx = xmax-xmin; Float_t dy = ymax-ymin; - AliRunLoader * RunLoader; + AliRunLoader * runLoader; if (fLoader) - RunLoader = fLoader->GetRunLoader(); + runLoader = fLoader->GetRunLoader(); else - RunLoader = 0x0; + runLoader = 0x0; if (strlen(option) == 0) { @@ -644,7 +740,7 @@ void AliMUONDisplay::DrawTitle(Option_t *option) title->Draw(); char ptitle[100]; sprintf(ptitle, "Alice event:%d Run:%d Chamber:%d Cathode:%d", - RunLoader->GetEventNumber(), + runLoader->GetEventNumber(), gAlice->GetHeader()->GetRun(), fChamber, fCathode); @@ -665,7 +761,7 @@ void AliMUONDisplay::DrawTitle(Option_t *option) void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi) { // Draw a view of MUON clusters - printf("\n Draw View\n"); + AliInfo(" Draw View"); gPad->SetCursor(kWatch); // gPad->SetFillColor(39); @@ -689,12 +785,143 @@ void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi) fZooms = 0; } + Float_t xg1, xg2, yg1, yg2, zg1, zg2; + + // Recovering the chamber + AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); + + const AliMUONGeometryTransformer* kGeomTransformer + = pMUON->GetGeometryTransformer(); + + AliMUONSegmentation* segmentation = pMUON->GetSegmentation(); + // Display MUON Chamber Geometry char nodeName[7]; sprintf(nodeName,"MUON%d",100+fChamber); + printf(">>>> chamber is %d\n",fChamber); + + if(fChamber < 5) { + for(Int_t id = 0; id < 4; id++) { + + Int_t detElemId = fChamber*100+id; + AliMpSectorSegmentation * seg = + (AliMpSectorSegmentation *) segmentation->GetMpSegmentation(detElemId, 0); + const AliMpSector * sector = seg->GetSector(); + + // get sector measurements + TVector2 position = sector->Position(); + TVector2 dimension = sector->Dimensions(); // half length + + Float_t xlocal1 = position.Px(); // mm to cm + Float_t ylocal1 = position.Py(); + Float_t xlocal2 = dimension.Px() * 2.; + Float_t ylocal2 = dimension.Px() * 2.; + + kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1); + kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2); + + // drawing + TPolyLine3D* poly = new TPolyLine3D(); + Int_t nPoint = 0; + + poly->SetPoint(nPoint++, xg1, yg1, 0.); + for (Float_t d = 0; d < TMath::Pi()/2.; d+= 0.01) { + Float_t x = xg1 + xg2 * TMath::Cos(d); + Float_t y = yg1 + yg2 * TMath::Sin(d); + poly->SetPoint(nPoint++, x, y, 0.); + } + poly->SetPoint(nPoint++, xg1, yg1, 0.); + + poly->SetLineColor(2); + poly->Draw("s"); + } + + // } + + } + + if(fChamber >4 && fChamber <11) { + Int_t id=0; + for(id=0; id<26; id++) { + Int_t detElemId = fChamber*100+id; + if ( segmentation->HasDE(detElemId) ) { + AliMpSlatSegmentation * seg = + (AliMpSlatSegmentation *) segmentation->GetMpSegmentation(detElemId, 0); + if (seg) { + const AliMpSlat* slat = seg->Slat(); + Float_t deltax = slat->DX(); + Float_t deltay = slat->DY(); + Float_t xlocal1 = -deltax; + Float_t ylocal1 = -deltay; + Float_t xlocal2 = +deltax; + Float_t ylocal2 = +deltay; + kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1); + kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2); + + // drawing slat active volumes + Float_t xCenter = (xg1 + xg2)/2.; + Float_t yCenter = (yg1 + yg2)/2.; + + TMarker3DBox* box = new TMarker3DBox(xCenter,yCenter,0,xlocal1,ylocal2,0,0,0); + + box->SetFillStyle(0); + box->SetLineColor(2); + box->Draw("s"); + + // drawing inner circle + disc + TPolyLine3D* poly = new TPolyLine3D(); + TPolyLine3D* poly1 = new TPolyLine3D(); + + Int_t nPoint = 0; + Int_t nPoint1 = 0; + for (Float_t d = 0; d < 6.24; d+= 0.005) { + Double_t x = AliMUONConstants::Dmin((fChamber-1)/2) * TMath::Cos(d)/2.; + Double_t y = AliMUONConstants::Dmin((fChamber-1)/2) * TMath::Sin(d)/2.; + if (nPoint % 2 == 0) poly->SetPoint(nPoint++, 0., 0., 0.); + poly->SetPoint(nPoint++, x, y, 0.); + poly1->SetPoint(nPoint1++, x, y, 0.); + + } + poly->SetLineColor(1); + poly->Draw("s"); + poly1->SetLineColor(2); + poly1->Draw("s"); + } + } + } + } - TNode *node1=gAlice->GetGeometry()->GetNode(nodeName); - if (node1) node1->Draw("same"); +/*-- Trigger Chambers ---------------------------------------*/ + if(fChamber >10 && fChamber <15) { + Int_t id=0; + for(id=0; id<18; id++) { + Int_t detElemId = fChamber*100+id; + AliMpTriggerSegmentation * seg + = (AliMpTriggerSegmentation *) segmentation->GetMpSegmentation(detElemId, 0); + if (seg) { + const AliMpTrigger* slat = seg->Slat(); + Float_t deltax = slat->DX(); + Float_t deltay = slat->DY(); + Float_t xlocal1 = -deltax; + Float_t ylocal1 = -deltay; + Float_t xlocal2 = +deltax; + Float_t ylocal2 = +deltay; + + kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1); + kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2); + + // drawing slat active volumes + Float_t xCenter = (xg1 + xg2)/2.; + Float_t yCenter = (yg1 + yg2)/2.; + + TMarker3DBox* box = new TMarker3DBox(xCenter,yCenter,0,xlocal1,ylocal2,0,0,0); + + box->SetFillStyle(0); + box->SetLineColor(4); + box->Draw("s"); + } + } + } //add clusters to the pad DrawClusters(); DrawHits(); @@ -705,6 +932,55 @@ void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi) view->SetView(phi, theta, psi, iret); } +//_____________________________________________________________________________ +void AliMUONDisplay::DrawGlobalView(Float_t theta, Float_t phi, Float_t psi) +{ +// Draw a view of muons chambers with tracks + + gPad->SetCursor(kWatch); + // gPad->SetFillColor(39); + gPad->SetFillColor(1); + gPad->Clear(); + // gPad->SetFillColor(39); + gPad->SetFillColor(1); + + + Int_t iret=0; + TView *view = new TView(1); + + Float_t range = fRrange*fRangeSlider->GetMaximum()*3.; + view->SetRange(-range,-range,-range,range,range,range); + +// Display all MUON Chambers segmentation + char nodeName[7]; + TNode *node1; + sprintf(nodeName,"alice"); + + node1=gAlice->GetGeometry()->GetNode(nodeName); + if (node1) node1->Draw("same"); + + +// Draw clusters for all chambers + Int_t chamberSave = fChamber; + for (fChamber = 1; fChamber <= 10; fChamber++){ + DrawCoG(); + } + fChamber = chamberSave; +// Draw reconstructed tracks + DrawTracks(); + + AppendPad(); + + Float_t zoom = 2.; + Float_t shift = 0.9; + Float_t x0 = (-1+shift)/zoom; + Float_t y0 = (-1+shift)/zoom; + Float_t x1 = (1+shift)/zoom; + Float_t y1 = (1+shift)/zoom; + gPad->Range(x0,y0,x1,y1); + view->SetView(phi, theta, psi, iret); + +} //______________________________________________________________________________ void AliMUONDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py) @@ -781,17 +1057,14 @@ void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode) // Loop on all detectors if (chamber > 14) return; - printf(" chamber %d \n",chamber); fChamber = chamber; fCathode = cathode; ResetPoints(); AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); - AliMUONChamber* iChamber; - AliSegmentation* segmentation; - AliMUONResponse* response; - + AliMUONGeometrySegmentation* segmentation2 = 0x0; + GetMUONData()->SetTreeAddress("D"); TClonesArray *muonDigits = GetMUONData()->Digits(chamber-1); @@ -802,20 +1075,19 @@ void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode) if (GetLoader()->TreeD()) { nent = (Int_t) GetLoader()->TreeD()->GetEntries(); - printf(" entries %d \n", nent); // gAlice->TreeD()->GetEvent(nent-2+cathode-1); - GetMUONData()->GetCathode(cathode-1); + GetMUONData()->GetDigits(); } Int_t ndigits = muonDigits->GetEntriesFast(); if (ndigits == 0) return; if (fPoints == 0) fPoints = new TObjArray(ndigits); - iChamber = &(pMUON->Chamber(chamber-1)); + //segmentation2 = iChamber->SegmentationModel2(cathode); + segmentation2 + = pMUON->GetSegmentation()->GetModuleSegmentation(chamber-1, cathode-1); - segmentation = iChamber->SegmentationModel(cathode); - response = iChamber->ResponseModel(); - Float_t zpos = iChamber->Z(); + Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber-1); AliMUONDigit *mdig; AliMUONPoints *points = 0; @@ -824,8 +1096,8 @@ void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode) //loop over all digits and store their position Int_t npoints = 1; - Float_t adcmax = 1024; - if (response&&chamber<11) adcmax = response->MaxAdc(); + Float_t adcmax = 1024; // default + if (chamber<11) adcmax = 4096; for (Int_t digit = 0; digit < ndigits; digit++) { mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit); @@ -856,11 +1128,14 @@ void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode) // get the center of the pad - add on x and y half of pad size Float_t xpad, ypad, zpad; - segmentation->GetPadC(mdig->PadX(), mdig->PadY(), xpad, ypad, zpad); - - Int_t isec = segmentation->Sector(mdig->PadX(), mdig->PadY()); - Float_t dpx = segmentation->Dpx(isec)/2; - Float_t dpy = segmentation->Dpy(isec)/2; + Int_t isec; + Float_t dpx, dpy; + + Int_t detElemId = mdig->DetElemId(); + segmentation2->GetPadC(detElemId, mdig->PadX(), mdig->PadY(), xpad, ypad, zpad); + isec = segmentation2->Sector(detElemId, mdig->PadX(), mdig->PadY()); + dpx = segmentation2->Dpx(detElemId, isec)/2; + dpy = segmentation2->Dpy(detElemId, isec)/2; // // segmentation->Dump(); @@ -903,9 +1178,6 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/) ResetRpoints(); - AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); - AliMUONChamber* iChamber; - GetMUONData()->SetTreeAddress("RC"); TClonesArray *muonRawClusters = GetMUONData()->RawClusters(chamber-1); @@ -921,8 +1193,7 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/) if (nrawcl == 0) return; if (fRpoints == 0) fRpoints = new TObjArray(nrawcl); - iChamber = &(pMUON->Chamber(chamber-1)); - Float_t zpos=iChamber->Z(); + Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber-1); AliMUONRawCluster *mRaw; AliMUONPoints *points = 0; // @@ -937,11 +1208,103 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/) points->SetHitIndex(-1); points->SetTrackIndex(-1); points->SetDigitIndex(-1); - points->SetPoint(iraw,mRaw->fX[0],mRaw->fY[0],zpos); + points->SetPoint(iraw,mRaw->GetX(0),mRaw->GetY(0),zpos); fRpoints->AddAt(points,iraw); - // printf("%f and %f and %f\n",mRaw->fX[0],mRaw->fY[0],mRaw->fZ[0]); + // printf("%f and %f and %f\n",mRaw->GetX(0),mRaw->GetY(0),mRaw->GetZ(0)); } } + +//___________________________________________ +void AliMUONDisplay::LoadTracks() +{ +// Load tracks + AliMUONTrack* recTrack = 0; + AliMUONTrackParam* trackParam = 0; + TClonesArray * trackParamAtHit = 0; + + ResetRpoints(); + + GetMUONData()->SetTreeAddress("RT"); + TClonesArray* recTracksArray = GetMUONData()->RecTracks(); + if (recTracksArray == NULL) return; + GetMUONData()->GetRecTracks(); + + Int_t nRecTracks = 0; + if (recTracksArray) + nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); + + + if (fRpoints == 0) fRpoints = new TObjArray(nRecTracks); + + for (Int_t iRecTracks = 0; iRecTracks < nRecTracks; iRecTracks++) { + // reading info from tracks + recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks); + + Int_t nTrackHits = recTrack->GetNTrackHits(); + + if (nTrackHits == 0) continue; + + Int_t iPoint = 0; + TPolyLine3D *points = new TPolyLine3D(nTrackHits+1); + points->SetLineColor(6); + points->SetLineWidth(1); + fRpoints->AddAt(points,iRecTracks); + + Float_t xRec=0; + Float_t yRec=0; + Float_t zRec=0; + + trackParam = recTrack->GetTrackParamAtVertex(); + xRec = trackParam->GetNonBendingCoor(); + yRec = trackParam->GetBendingCoor(); + zRec = trackParam->GetZ(); + points->SetPoint(iPoint,xRec,yRec,zRec); + iPoint++; + + for (Int_t iHit = 0; iHit < nTrackHits; iHit++){ + trackParamAtHit = recTrack->GetTrackParamAtHit(); + trackParam = (AliMUONTrackParam*) trackParamAtHit->At(iHit); + xRec = trackParam->GetNonBendingCoor(); + yRec = trackParam->GetBendingCoor(); + zRec = trackParam->GetZ(); + points->SetPoint(iPoint,xRec,yRec,zRec); + iPoint++; + } // end loop rec. hits + PrintTrack(iRecTracks,recTrack); + } // end loop tracks + + +} + +void AliMUONDisplay::PrintTrack(Int_t iRecTracks, AliMUONTrack *recTrack) +{ + AliMUONTrackParam *trackParam; + Float_t vertex[3], momentum[3]; + Float_t pYZ, bendingSlope, nonBendingSlope, chi2dof; + Int_t charge; + + trackParam = recTrack->GetTrackParamAtVertex(); + vertex[0] = trackParam->GetNonBendingCoor(); + vertex[1] = trackParam->GetBendingCoor(); + vertex[2] = trackParam->GetZ(); + pYZ = 1./TMath::Abs(trackParam->GetInverseBendingMomentum()); + bendingSlope = trackParam->GetBendingSlope(); + nonBendingSlope = trackParam->GetNonBendingSlope(); + momentum[2] = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); + momentum[0] = momentum[2] * nonBendingSlope; + momentum[1] = momentum[2] * bendingSlope; + charge = Int_t(TMath::Sign(1.,trackParam->GetInverseBendingMomentum())); + chi2dof = recTrack->GetFitFMin()/(2.0 * recTrack->GetNTrackHits() - 5.); + + printf("===================================================\n"); + printf(" Reconstructed track # %d \n",iRecTracks); + printf(" charge: %d \n",charge); + printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]); + printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]); + printf(" track chi2/dof: %f \n",chi2dof); + +} + //___________________________________________ void AliMUONDisplay::LoadHits(Int_t chamber) { @@ -955,12 +1318,7 @@ void AliMUONDisplay::LoadHits(Int_t chamber) ResetPhits(); - AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON"); - AliMUONChamber* iChamber; - - iChamber = &(pMUON->Chamber(chamber-1)); - Float_t zpos=iChamber->Z(); - + Float_t zpos=AliMUONConstants::DefaultChamberZ(chamber-1); if (GetMUONData()->TreeH()) { GetMUONData()->SetTreeAddress("H"); @@ -1049,7 +1407,7 @@ void AliMUONDisplay::NextChamber(Int_t delta) if (!fPad) return; fPad->Clear(); LoadDigits(fChamber, fCathode); - Draw(); + DrawChamber(); } //_____________________________________________________________________________ @@ -1064,7 +1422,7 @@ void AliMUONDisplay::NextCathode() LoadDigits(fChamber, 1); } fNextCathode = kTRUE; // to keep the same zoom - Draw(); + DrawChamber(); fNextCathode = kFALSE; TPad *pad = (TPad*)gPad->GetPadSave(); pad->Range(fZoomX0[fZooms], fZoomY0[fZooms], @@ -1081,7 +1439,7 @@ void AliMUONDisplay::Trigger() AliMUONGlobalTrigger* globalTrig; GetMUONData()->SetTreeAddress("GLT"); - GetMUONData()->GetTrigger(); + GetMUONData()->GetTriggerD(); globalTrig = (AliMUONGlobalTrigger*)GetMUONData()->GlobalTrigger()->UncheckedAt(0); if (globalTrig == 0) return; @@ -1140,7 +1498,7 @@ void AliMUONDisplay::SetChamberAndCathode(Int_t chamber, Int_t cathode) if (!fPad) return; fPad->Clear(); LoadDigits(chamber,cathode); - Draw(); + DrawChamber(); } void AliMUONDisplay::SetEvent(Int_t newevent) @@ -1187,21 +1545,21 @@ void AliMUONDisplay::SetView(Float_t theta, Float_t phi, Float_t psi) //_____________________________________________________________________________ void AliMUONDisplay::ShowNextEvent(Int_t delta) { - AliRunLoader * RunLoader; + AliRunLoader * runLoader; if (fLoader) - RunLoader = fLoader->GetRunLoader(); + runLoader = fLoader->GetRunLoader(); else - RunLoader = 0x0; + runLoader = 0x0; // Display (current event_number + delta) // delta = 1 shown next event // delta = -1 show previous event if (delta) { - //RunLoader->CleanDetectors(); - //RunLoader->CleanKinematics(); - Int_t currentEvent = RunLoader->GetEventNumber(); + //runLoader->CleanDetectors(); + //runLoader->CleanKinematics(); + Int_t currentEvent = runLoader->GetEventNumber(); Int_t newEvent = currentEvent + delta; - RunLoader->GetEvent(newEvent); + runLoader->GetEvent(newEvent); fEvent=newEvent; } LoadDigits(fChamber, fCathode); @@ -1257,10 +1615,15 @@ void AliMUONDisplay::ResetRpoints() } } -AliMUONDisplay & AliMUONDisplay::operator = (const AliMUONDisplay &) +AliMUONDisplay & AliMUONDisplay::operator = (const AliMUONDisplay & rhs) { -// Dummy assignment operator - return *this; +// Protected assignement operator + + if (this == &rhs) return *this; + + AliFatal("Not implemented."); + + return *this; }