// @(#) $Id$
/** \class AliHLTTPCDisplay
//_____________________________________________________________
// AliHLTTPCDisplay
//
// Display class for the HLT TPC events.
*/
// Author: Jochen Thaeder
// Anders Vestbo
//*-- Copyright © ALICE HLT Group
// Recent Changes:
// ==============
// - Rename and Merge of functions / Complete new arrangement in order to use the AliHLTGUI
// - 3D Geometry
// - display padrows, cluster, tracks
// - select single Tracks
// - select used / unused cluster
// - Histogram
// - display padrows
// - display pads in padrows
#include "AliHLTTPCStandardIncludes.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef use_aliroot
#include
#include
#include
#include
#endif
#include "AliHLTTPCLogging.h"
#include "AliHLTTPCDisplay.h"
#include "AliHLTTPCTransform.h"
#include "AliHLTTPCTrack.h"
#include "AliHLTTPCTrackArray.h"
#include "AliHLTTPCSpacePointData.h"
#include "AliHLTTPCMemHandler.h"
#include "AliHLTTPCDigitReaderPacked.h"
#if __GNUC__ == 3
using namespace std;
#endif
ClassImp(AliHLTTPCDisplay)
// #############################################################################
AliHLTTPCDisplay::AliHLTTPCDisplay(Char_t *gfile) {
//constructor
memset(fClusters,0,36*6*sizeof(AliHLTTPCSpacePointData*));
memset(fNcl, 0, 36*6*sizeof(UInt_t));
fTracks = NULL;
fHistrawcl = NULL;
fHistraw = NULL;
fHistpad1 = NULL;
fHistpad2 = NULL;
fHistpad3 = NULL;
fHistallresiduals = NULL;
fHistcharge = NULL;
fGraphresiduals = NULL;
fGeom = NULL;
fNPads = 0;
fNTimes = 0;
fMinHits = 0;
fPtThreshold = 0.;
fPad = -1;
fPadRow = 0;
fSlicePadRow = 0;
fSelectTrack = -1;
fSelectTrackSlice = 0;
fSelectTrackSwitch = kFALSE;
fSelectCluster = 0;
fMinSlice = 0;
fMaxSlice = 35;
fSlicePair = kFALSE;
SetSliceArray();
fBackColor = 1;
fLineColor = 0;
fSwitch3DCluster = kFALSE;
fSwitch3DTracks = kFALSE;
fSwitch3DPadRow = kFALSE;
fSwitch3DGeometry = kFALSE;
//ctor. Specify which slices you want to look at.
LoadGeometrie(gfile);
}
// #############################################################################
AliHLTTPCDisplay::~AliHLTTPCDisplay() {
//destructor
if(fTracks) delete fTracks;
fTracks = NULL;
}
// #############################################################################
Bool_t AliHLTTPCDisplay::LoadGeometrie(Char_t *gfile) {
if (gfile) {
TFile *file = TFile::Open(gfile);
if(!file) {
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::AliHLTTPCDisplay","File Open") <<"Geometry file " << gfile << " does not exist!"<Get("AliceGeom");
file->Close();
delete file;
}
return kTRUE;
}
// #############################################################################
// SETTER
// #############################################################################
void AliHLTTPCDisplay::SetHistPadRowAxis() {
// Set Axis range of Histogramm, due to variable NPads per padrow
fNPads = AliHLTTPCTransform::GetNPads(fPadRow);
fHistrawcl->SetAxisRange(0,fNPads);
fHistraw->SetAxisRange(0,fNPads);
fHistrawcl->SetAxisRange(0,fNTimes,"Y");
fHistraw->SetAxisRange(0,fNTimes,"Y");
}
void AliHLTTPCDisplay::SetSliceArray() {
Int_t slice=0;
Int_t minSlice = fMinSlice;
Int_t maxSlice = fMaxSlice;
Int_t realslice = 0;
for (slice=0;slice<=35;slice++){
fSliceArray[slice] = kFALSE;
}
// Single Slice, or Range
if (minSlice > maxSlice) maxSlice += 17;
for (slice=minSlice;slice<=maxSlice;slice++){
realslice = slice % 18;
fSliceArray[realslice] = kTRUE;
fSliceArray[realslice+18] = kTRUE;
}
// Pair of Slices
if (fSlicePair) {
minSlice = fMinSlice + 9;
maxSlice = fMaxSlice + 9;
if (minSlice > maxSlice) maxSlice += 17;
for (slice=minSlice;slice<=maxSlice;slice++){
realslice = slice % 18;
fSliceArray[realslice] = kTRUE;
fSliceArray[realslice+18] = kTRUE;
}
}
}
// #############################################################################
// SETUP
// #############################################################################
void AliHLTTPCDisplay::SetupCluster(Int_t slice, Int_t patch, UInt_t nofClusters, AliHLTTPCSpacePointData* data) {
if (data && slice>=0 && slice<36 && patch>=0 && patchGetNTracks();
for(Int_t j=0; jGetCheckedTrack(j);
if(!gtrack) continue;
Int_t nHits = gtrack->GetNHits();
UInt_t *hitnum = gtrack->GetHitNumbers();
for(Int_t h=0; h>25) & 0x7f;
Int_t patch = (id>>22) & 0x7;
UInt_t pos = id&0x3fffff;
AliHLTTPCSpacePointData *points = fClusters[slice][patch];
if(!points) {
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::Draw3D","Clusterarray") <<"No points at slice "<=fNcl[slice][patch]) {
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::Draw3D","Clusterarray") <<"Pos is too large: pos "<SetOption("COLZ");
fHistallresiduals->SetTitleSize(0.03);
fHistallresiduals->GetXaxis()->SetLabelSize(0.03);
fHistallresiduals->GetXaxis()->SetTitleSize(0.03);
fHistallresiduals->GetYaxis()->SetLabelSize(0.03);
fHistallresiduals->GetYaxis()->SetTitleSize(0.03);
fHistcharge->SetTitleSize(0.03);
fHistcharge->GetXaxis()->SetLabelSize(0.03);
fHistcharge->GetXaxis()->SetTitleSize(0.03);
fHistcharge->GetYaxis()->SetLabelSize(0.03);
fHistcharge->GetYaxis()->SetTitleSize(0.03);
fHistraw->SetTitleSize(0.03);
fHistraw->GetXaxis()->SetLabelSize(0.03);
fHistraw->GetXaxis()->SetTitleSize(0.03);
fHistraw->GetYaxis()->SetLabelSize(0.03);
fHistraw->GetYaxis()->SetTitleSize(0.03);
fHistpad1->SetTitleSize(0.03);
fHistpad1->GetXaxis()->SetLabelSize(0.03);
fHistpad1->GetXaxis()->SetTitleSize(0.03);
fHistpad1->GetYaxis()->SetLabelSize(0.03);
fHistpad1->GetYaxis()->SetTitleSize(0.03);
fHistpad2->SetTitleSize(0.03);
fHistpad2->GetXaxis()->SetLabelSize(0.03);
fHistpad2->GetXaxis()->SetTitleSize(0.03);
fHistpad2->GetYaxis()->SetLabelSize(0.03);
fHistpad2->GetYaxis()->SetTitleSize(0.03);
fHistpad3->SetTitleSize(0.03);
fHistpad3->GetXaxis()->SetLabelSize(0.03);
fHistpad3->GetXaxis()->SetTitleSize(0.03);
fHistpad3->GetYaxis()->SetLabelSize(0.03);
fHistpad3->GetYaxis()->SetTitleSize(0.03);
gStyle->SetPalette(1);
SetHistPadRowAxis();
}
// ####################################################################################################
void AliHLTTPCDisplay::FillPadRow(Int_t patch, ULong_t dataBlock, ULong_t dataLen){
AliHLTTPCDigitReaderPacked* fDigitReader = new AliHLTTPCDigitReaderPacked();
bool readValue = true;
Int_t rowOffset = 0;
// Initialize RAW DATA
Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
// Outer sector, patches 2, 3, 4, 5 - start counting in patch 2 with row 0
if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
// Initialize block for reading packed data
void* tmpdataBlock = (void*) dataBlock;
fDigitReader->InitBlock(tmpdataBlock,dataLen,firstRow,lastRow);
readValue = fDigitReader->Next();
if (!readValue){
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::FillPadRow","Read first value") << "No value in data block" << ENDLOG;
return;
}
// FILL PADROW 3D --- Initialize the colorbins
if (fSwitch3DPadRow){
for (UInt_t ii=0;ii < 20;ii++){
fbinct[ii] = 0;
fcolorbin[ii] = 0;
}
// read number of entries in colorbin
while ( readValue ){
Int_t row = fDigitReader->GetRow() + rowOffset;
if (row == fPadRow){
UInt_t charge = fDigitReader->GetSignal();
for (UInt_t ii=0;ii < 19;ii++){
if ( charge > (ii*21) && charge <= ((ii*21) + 21) ) fcolorbin[ii]++;
}
// larger than 19 * 21
if (charge > 399 ) fcolorbin[19]++;
}
// read next value
readValue = fDigitReader->Next();
if(!readValue) break; //No more value
}
//Initialize fpmarr[color][3*colorbin[ii]]
fpmarr[0] = new Float_t[fcolorbin[0]*3];
fpmarr[1] = new Float_t[fcolorbin[1]*3];
fpmarr[2] = new Float_t[fcolorbin[2]*3];
fpmarr[3] = new Float_t[fcolorbin[3]*3];
fpmarr[4] = new Float_t[fcolorbin[4]*3];
fpmarr[5] = new Float_t[fcolorbin[5]*3];
fpmarr[6] = new Float_t[fcolorbin[6]*3];
fpmarr[7] = new Float_t[fcolorbin[7]*3];
fpmarr[8] = new Float_t[fcolorbin[8]*3];
fpmarr[9] = new Float_t[fcolorbin[9]*3];
fpmarr[10] = new Float_t[fcolorbin[10]*3];
fpmarr[11] = new Float_t[fcolorbin[11]*3];
fpmarr[12] = new Float_t[fcolorbin[12]*3];
fpmarr[13] = new Float_t[fcolorbin[13]*3];
fpmarr[14] = new Float_t[fcolorbin[14]*3];
fpmarr[15] = new Float_t[fcolorbin[15]*3];
fpmarr[16] = new Float_t[fcolorbin[16]*3];
fpmarr[17] = new Float_t[fcolorbin[17]*3];
fpmarr[18] = new Float_t[fcolorbin[18]*3];
fpmarr[19] = new Float_t[fcolorbin[19]*3];
// Rewind the raw reader and fill the polymarker3D
fDigitReader->InitBlock(tmpdataBlock,dataLen,firstRow,lastRow);
readValue = fDigitReader->Next();
} // END if (fSwitch3DPadRow)
// -- Fill Raw Data
while ( readValue ){
Int_t row = fDigitReader->GetRow() + rowOffset;
// select padrow to fill in histogramm
if (row == fPadRow){
UChar_t pad = fDigitReader->GetPad();
UShort_t time = fDigitReader->GetTime();
UInt_t charge = fDigitReader->GetSignal();
Float_t xyz[3];
fHistraw->Fill(pad,time,charge);
if (pad == (fPad-1) ) fHistpad1->Fill(time,charge);
if (pad == fPad) fHistpad2->Fill(time,charge);
if (pad == (fPad+1) ) fHistpad3->Fill(time,charge);
if (fSwitch3DPadRow) {
// Transform raw coordinates to local coordinates
AliHLTTPCTransform::RawHLT2Global(xyz, fSlicePadRow, fPadRow, pad, time);
for (UInt_t ii=0;ii < 19;ii++){
if ( charge > (ii*21) && charge <= ((ii*21) + 21) ){
fpmarr[ii][fbinct[ii]] = xyz[0];
fpmarr[ii][fbinct[ii]+1] = xyz[1];
fpmarr[ii][fbinct[ii]+2] = xyz[2];
fbinct[ii] += 3;
}
}
// larger than 19 * 21
if (charge > 399 ) {
fpmarr[19][fbinct[19]] = xyz[0];
fpmarr[19][fbinct[19]+1] = xyz[1];
fpmarr[19][fbinct[19]+2] = xyz[2];
fbinct[19] += 3;
}
} // END if (fSwitch3DPadRow)
}
// read next value
readValue = fDigitReader->Next();
//Check where to stop:
if(!readValue) break; //No more value
}
if ( fDigitReader )
delete fDigitReader;
fDigitReader = NULL;
AliHLTTPCSpacePointData *points = fClusters[fSlicePadRow][patch];
if(!points) return;
Int_t npoints = fNcl[fSlicePadRow][patch];
Float_t xyz[3];
for(Int_t i=0; iFill(xyz[1],xyz[2]);
}
}
}
// #############################################################################
void AliHLTTPCDisplay::ResetHistPadRow(){
fHistraw->Reset();
fHistrawcl->Reset();
fHistpad1->Reset();
fHistpad2->Reset();
fHistpad3->Reset();
}
// #############################################################################
void AliHLTTPCDisplay::ResetHistResiduals(){
fHistallresiduals->Reset();
}
// #############################################################################
void AliHLTTPCDisplay::ResetHistCharge(){
fHistcharge->Reset();
}
// #############################################################################
// DRAWER
// #############################################################################
void AliHLTTPCDisplay::DrawGeomSector(Int_t sector) {
Char_t fname[256];
Int_t realsector = sector;// % 18;
if (realsector < 10){
sprintf(fname,"LS0%d",realsector);
fGeom->GetNode(fname)->SetLineColor(fLineColor);
fGeom->GetNode(fname)->Draw("same");
sprintf(fname,"US0%d",realsector);
fGeom->GetNode(fname)->SetLineColor(fLineColor);
fGeom->GetNode(fname)->Draw("same");
}
else {
sprintf(fname,"LS%d",realsector);
fGeom->GetNode(fname)->SetLineColor(fLineColor);
fGeom->GetNode(fname)->Draw("same");
sprintf(fname,"US%d",realsector);
fGeom->GetNode(fname)->SetLineColor(fLineColor);
fGeom->GetNode(fname)->Draw("same");
}
}
// #############################################################################
void AliHLTTPCDisplay::DrawHistPadRow(){
Char_t title[256];
sprintf(title,"Selected PadRow %d with found Clusters",fPadRow);
fHistraw->SetTitle(title);
fHistraw->SetStats(kFALSE);
fHistraw->Draw("COLZ");
fHistrawcl->SetStats(kFALSE);
fHistrawcl->SetMarkerStyle(28);
fHistrawcl->SetMarkerSize(2);
fHistrawcl->SetMarkerColor(1);
fHistrawcl->Draw("psame");
}
// #############################################################################
void AliHLTTPCDisplay::DrawHistPad1(){
Char_t title[256];
sprintf(title,"Selected Pad %d",fPad -1);
fHistpad1->SetStats(kFALSE);
fHistpad1->SetTitle(title);
fHistpad1->Draw();
}
// #############################################################################
void AliHLTTPCDisplay::DrawHistPad2(){
Char_t title[256];
sprintf(title,"Selected Pad %d",fPad);
fHistpad2->SetStats(kFALSE);
fHistpad2->SetTitle(title);
fHistpad2->Draw();
}
// #############################################################################
void AliHLTTPCDisplay::DrawHistPad3(){
Char_t title[256];
sprintf(title,"Selected Pad %d",fPad +1);
fHistpad3->SetStats(kFALSE);
fHistpad3->SetTitle(title);
fHistpad3->Draw();
}
// #############################################################################
void AliHLTTPCDisplay::DrawHistResiduals(){
if (fSwitch3DTracks){
// Residual histogram for 1 track
if (fSelectTrackSwitch){
Char_t title[256];
sprintf(title,"Residuals of Track %d in Slice %d",fSelectTrack, fSelectTrackSlice );
// fHistresiduals->SetMarkerStyle(2);
// fHistresiduals->SetStats(kFALSE);
// fHistresiduals->SetTitle(title);
// fHistresiduals->Draw("p");
fGraphresiduals->SetTitle(title);
fGraphresiduals->GetXaxis()->SetTitle("z");
fGraphresiduals->GetYaxis()->SetTitle("residuals");
fGraphresiduals->Draw("A*");
}
// Global residuals histogram
else{
fHistallresiduals->SetStats(kFALSE);
fHistallresiduals->Draw();
}
}
}
// #############################################################################
void AliHLTTPCDisplay::DrawHistCharge(){
if (fSwitch3DCluster){
// fHistcharge->SetStats(kFALSE);
fHistcharge->Draw();
}
}
// #############################################################################
void AliHLTTPCDisplay::Draw3D(){
TView *v = new TView(1);
v->SetRange(-800,-800,-800,800,800,800);
Float_t* etaRange = NULL; // ------ STILL TO FIX
//--------------------------------------------------------------------------------------------
// DRAW 3D CLUSTER
//--------------------------------------------------------------------------------------------
if (fSwitch3DCluster){
for (Int_t slice=0; slice <= 35; slice++){
UInt_t maxCharge = 0;
Float_t maxXYZ[3];
UChar_t padrow;
if (!fSliceArray[slice]) continue;
for(Int_t p=0;p<6;p++){
AliHLTTPCSpacePointData *points = fClusters[slice][p];
if(!points) continue;
Int_t npoints = fNcl[slice][p];
TPolyMarker3D *pm = new TPolyMarker3D(npoints);
Float_t xyz[3];
for(Int_t i=0; ietaRange[1] )
continue;
}
AliHLTTPCTransform::Local2Global(xyz,slice);
pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
// Fill Charge Histogram
fHistcharge->Fill(points[i].fCharge);
if (points[i].fCharge > maxCharge ){
maxCharge = points[i].fCharge;
maxXYZ[0] = points[i].fX;
maxXYZ[1] = points[i].fY;
maxXYZ[2] = points[i].fZ;
padrow = points[i].fPadRow;
}
}
pm->SetMarkerSize(4);
pm->SetMarkerColor(2);
pm->Draw("");
}
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::CHARGE","")<< "MAX CHARGE =" << maxCharge << " slice=" << slice
<< " z=" << maxXYZ[0]<< " y=" << maxXYZ[1]<< " z=" << maxXYZ[2]
<< ENDLOG;
}
} // END - DRAW 3D CLUSTER
//--------------------------------------------------------------------------------------------
// DRAW 3D TRACKS
//--------------------------------------------------------------------------------------------
if (fSwitch3DTracks){
Int_t ntracks = fTracks->GetNTracks();
TPolyLine3D *line = new TPolyLine3D[ntracks];
TPolyLine3D *lineT = new TPolyLine3D[ntracks];
Float_t xCl[176];
Float_t yCl[176];
Float_t zCl[176];
Float_t xT[176];
Float_t yT[176];
Float_t zT[176];
Float_t res[176];
Int_t trackcounter = 0;
for(Int_t j=0; jGetCheckedTrack(j);
if(!gtrack) continue;
Int_t nHits = gtrack->GetNHits();
UInt_t *hitnum = gtrack->GetHitNumbers();
Int_t hitcount=0;
Bool_t nexttrack = kFALSE;
TPolyMarker3D *pm = new TPolyMarker3D(nHits,7);
TPolyMarker3D *pmT = new TPolyMarker3D(nHits,7);
TPolyMarker3D *pmL = new TPolyMarker3D(1,2);
TPolyMarker3D *pmF = new TPolyMarker3D(1,2);
Double_t lambda = 0.; // dipAngle lambda
Double_t r = 0.; // radius
Double_t kappa = 0.; // curvature = 1/R , signed
Double_t xyz0[3]; // startingpoint of track
Double_t xyzT[3]; // point on track
Double_t xyzC[3]; // cluster
Double_t s = 0.; // length of track
Double_t phi0 = 0.; // azimuthal angle of startingpoint, with respect to helix axis
Double_t bfield = 0; // BField
Double_t xyzL[3]; // lastpoint of track
Double_t xyzF[3]; // firstpoint of track
Double_t maxZ = 0; // range of the histogram
Double_t minZ =99999.; // range of the histogram
for(Int_t h=0; h>25) & 0x7f;
Int_t patch = (id>>22) & 0x7;
UInt_t pos = id&0x3fffff;
// select if slice should be displayed or not
if (!fSliceArray[slice]) {
nexttrack = kTRUE;
break;
}
// select Single Track
if (fSelectTrackSwitch){
if(slice != fSelectTrackSlice) {
nexttrack = kTRUE;
break;
}
if (trackcounter != fSelectTrack && h==0){
trackcounter++;
nexttrack = kTRUE;
break;
}
trackcounter++;
}
// --> in the hit loop because of 'trackcounter++', otherwise wrong single track in slice will be selected
if((fPtThreshold > 0) && (gtrack->GetPt()< fPtThreshold)) {
nexttrack = kTRUE;
break;
}
// --> in the hit loop because of 'trackcounter++', otherwise wrong single track in slice will be selected
if(nHits < fMinHits) {
nexttrack = kTRUE;
break;
}
AliHLTTPCSpacePointData *points = fClusters[slice][patch];
if(!points) {
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::Draw3D","Clusterarray") <<"No points at slice "<=fNcl[slice][patch]) {
LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplay::Draw3D","Clusterarray") <<"Pos is too large: pos "< Curvature / Radius / Phi0
//kappa = gtrack->GetKappa();
//r = gtrack->GetRadius();
//phi0 = gtrack->GetPhi0();
//bfield = AliHLTTPCTransform::GetBFieldValue();
lambda = atan( gtrack->GetTgl() );
bfield = 0.0029980 * 0.4; // KORRIGIERE B für =0.4 T Feld
xyz0[0] = gtrack->GetFirstPointX();
xyz0[1] = gtrack->GetFirstPointY();
xyz0[2] = gtrack->GetFirstPointZ();
xyzF[0] = gtrack->GetFirstPointX();
xyzF[1] = gtrack->GetFirstPointY();
xyzF[2] = gtrack->GetFirstPointZ();
xyzL[0] = gtrack->GetLastPointX();
xyzL[1] = gtrack->GetLastPointY();
xyzL[2] = gtrack->GetLastPointZ();
pmL->SetPoint(0,xyzL[0],xyzL[1],xyzL[2]);
pmF->SetPoint(0,xyzF[0],xyzF[1],xyzF[2]);
phi0 = gtrack->GetPsi() + (gtrack->GetCharge() * AliHLTTPCTransform::PiHalf() );
if (bfield != 0.){
r = gtrack->GetPt() / bfield;
kappa = - gtrack->GetCharge() * 1. / r;
}
else {
r = 999999; // just infinity
kappa = 0;
}
//Write Track Parameters for single track
if (fSelectTrackSwitch){
fTrackParam.id = trackcounter - 1;
fTrackParam.nHits = nHits;
fTrackParam.charge = gtrack->GetCharge();
fTrackParam.lambda = lambda;
fTrackParam.kappa = kappa;
fTrackParam.radius = r;
fTrackParam.slice = slice;
fTrackParam.phi0 = phi0;
fTrackParam.pt = gtrack->GetPt();
fTrackParam.bfield = bfield;
fTrackParam.xyzF[0] = gtrack->GetFirstPointX();
fTrackParam.xyzF[1] = gtrack->GetFirstPointY();
fTrackParam.xyzF[2] = gtrack->GetFirstPointZ();
fTrackParam.xyzL[0] = gtrack->GetLastPointX();
fTrackParam.xyzL[1] = gtrack->GetLastPointY();
fTrackParam.xyzL[2] = gtrack->GetLastPointZ();
fTrackParam.psi = gtrack->GetPsi();
}
}
Float_t xyzCtmp[3]; // cluster tmp
xyzCtmp[0] = points[pos].fX;
xyzCtmp[1] = points[pos].fY;
xyzCtmp[2] = points[pos].fZ;
AliHLTTPCTransform::Local2Global(xyzCtmp,slice);
xCl[h] = xyzCtmp[0];
yCl[h] = xyzCtmp[1];
zCl[h] = xyzCtmp[2];
// FILL POLYMARKER FOR THE ORIGINAL TRACKS
pm->SetPoint(h,xCl[h],yCl[h],zCl[h]);
xyzC[0] = (Double_t) xyzCtmp[0];
xyzC[1] = (Double_t) xyzCtmp[1];
xyzC[2] = (Double_t) xyzCtmp[2];
xyzT[2] = xyzC[2];
//calculate length
s = ( xyzT[2] - xyz0[2] ) / sin(lambda);
// calculate the corresponding coordinates on the track
xyzT[0] = xyz0[0] + r * ( cos( phi0 + (s*kappa*cos(lambda)) ) - cos( phi0 ) );
xyzT[1] = xyz0[1] + r * ( sin( phi0 + (s*kappa*cos(lambda)) ) - sin( phi0 ) );
Double_t deltaX = ( xyzC[0] - xyzT[0] );
Double_t deltaY = ( xyzC[1] - xyzT[1] );
Double_t residual = sqrt( deltaX*deltaX + deltaY*deltaY );
res[h] = (Float_t) residual;
if (maxZ < fabs(xyzT[2])) maxZ = fabs(xyzT[2]);
if (minZ > fabs(xyzT[2])) minZ = fabs(xyzT[2]);
// FILL RESIDUALS HISTOGRAM
fHistallresiduals->Fill(residual);
// FILL ARRAYS IN ORDER TO DRAW THE TRACKPOINTS, OUT OF THE PARAMETER
xT[h] = xyzT[0];
yT[h] = xyzT[1];
zT[h] = xyzT[2];
// FILL POLYMARKER FOR THE NEW TRACKS
pmT->SetPoint(h,xT[h],yT[h],zT[h]);
hitcount++;
}
if(nexttrack) continue;
if(hitcount==0) continue;
if ( fGraphresiduals){
delete fGraphresiduals;
fGraphresiduals = NULL;
}
// FILL RESIDUALS GRAPH
fGraphresiduals = new TGraph(nHits,zT,res);
fGraphresiduals->GetXaxis()->SetLabelSize(0.02);
fGraphresiduals->GetXaxis()->SetTitleSize(0.02);
fGraphresiduals->GetYaxis()->SetLabelSize(0.02);
fGraphresiduals->GetYaxis()->SetTitleSize(0.02);
TPolyLine3D *currentline = &(line[j]);
currentline = new TPolyLine3D(nHits,xCl,yCl,zCl,"");
currentline->SetLineColor(4);
currentline->SetLineWidth(2);
// currentline->Draw("same");
TPolyLine3D *currentlineT = &(lineT[j]);
currentlineT = new TPolyLine3D(nHits,xT,yT,zT,"");
currentlineT->SetLineColor(7);
currentlineT->SetLineWidth(1);
// currentlineT->Draw("same");
//Last Point of Track
pmL->SetMarkerSize(3);
pmL->SetMarkerColor(4);
pmL->Draw();
//First Point of Track
pmF->SetMarkerSize(3);
pmF->SetMarkerColor(5);
pmF->Draw();
//Original Track
pm->SetMarkerSize(4);
pm->SetMarkerColor(6);
pm->Draw();
//New Track
pmT->SetMarkerSize(4);
pmT->SetMarkerColor(3);
pmT->Draw();
} // END for tracks
} // END - DRAW 3D Tracks
//--------------------------------------------------------------------------------------------
// DRAW 3D GEOMETRY
//--------------------------------------------------------------------------------------------
if (fSwitch3DGeometry){
for (Int_t slice=0; slice <= 17; slice++){
if (!fSliceArray[slice]) continue;
DrawGeomSector(slice);
}
} // END - DRAW 3D GEOMETRY
//--------------------------------------------------------------------------------------------
// DRAW 3D PadRow
//--------------------------------------------------------------------------------------------
if (fSwitch3DPadRow && fSliceArray[fSlicePadRow]){
Int_t markercolor = 51;
for (UInt_t ii=0;ii < 20;ii++){
if (fcolorbin[ii]> 0){
TPolyMarker3D *pm = new TPolyMarker3D(fcolorbin[ii], fpmarr[ii], 7 );
pm->SetMarkerColor(markercolor);
pm->Draw("");
}
// in order to have the SetPalette(1), so called "pretty"
if (ii % 2 == 0 ) markercolor += 2;
else markercolor += 3;
}
}
//--------------------------------------------------------------------------------------------
// DRAW 3D
//--------------------------------------------------------------------------------------------
v->ZoomView(0,4);
v->Draw();
}