#include "THaVDC.h"
#include "THaGlobals.h"
#include "THaEvData.h"
#include "THaDetMap.h"
#include "THaTrack.h"
#include "THaVDCUVPlane.h"
#include "THaVDCUVTrack.h"
#include "THaVDCCluster.h"
#include "THaVDCTrackID.h"
#include "THaVDCTrackPair.h"
#include "THaVDCHit.h"
#include "THaScintillator.h"
#include "THaSpectrometer.h"
#include "TMath.h"
#include "TClonesArray.h"
#include "TList.h"
#include "VarDef.h"
#include "TROOT.h"
#include "THaString.h"
#include <map>
#include <cstdio>
#include <cstdlib>
#ifdef WITH_DEBUG
#include <iostream>
#endif
using namespace std;
using THaString::Split;
THaVDC::THaVDC( const char* name, const char* description,
THaApparatus* apparatus ) :
THaTrackingDetector(name,description,apparatus), fNtracks(0)
{
fLower = new THaVDCUVPlane( "uv1", "Lower UV Plane", this );
fUpper = new THaVDCUVPlane( "uv2", "Upper UV Plane", this );
if( !fLower || !fUpper || fLower->IsZombie() || fUpper->IsZombie() ) {
Error( Here("THaVDC()"), "Failed to create subdetectors." );
MakeZombie();
}
fUVpairs = new TClonesArray( "THaVDCTrackPair", 20 );
SetBit( kOnlyFastest | kHardTDCcut );
}
THaAnalysisObject::EStatus THaVDC::Init( const TDatime& date )
{
if( IsZombie() || !fUpper || !fLower )
return fStatus = kInitError;
EStatus status;
if( (status = THaTrackingDetector::Init( date )) ||
(status = fLower->Init( date )) ||
(status = fUpper->Init( date )) )
return fStatus = status;
fUSpacing = fUpper->GetUPlane()->GetZ() - fLower->GetUPlane()->GetZ();
fVSpacing = fUpper->GetVPlane()->GetZ() - fLower->GetVPlane()->GetZ();
return fStatus = kOK;
}
Int_t THaVDC::ReadDatabase( const TDatime& date )
{
FILE* file = OpenFile( date );
if( !file ) return kFileError;
static const char* const here = "ReadDatabase";
const int LEN = 200;
char buff[LEN];
TString tag(fPrefix);
Ssiz_t pos = tag.Index(".");
if( pos != kNPOS )
tag = tag(0,pos+1);
else
tag.Append(".");
tag.Prepend("[");
tag.Append("global]");
TString line, tag2(tag);
tag.ToLower();
bool found = false;
while (!found && fgets (buff, LEN, file) != NULL) {
char* buf = ::Compress(buff);
line = buf;
delete [] buf;
if( line.EndsWith("\n") ) line.Chop();
line.ToLower();
if ( tag == line )
found = true;
}
if( !found ) {
Error(Here(here), "Database entry %s not found!", tag2.Data() );
fclose(file);
return kInitError;
}
fgets(buff, LEN, file);
if( SeekDBdate( file, date ) == 0 && fConfig.Length() > 0 &&
SeekDBconfig( file, fConfig.Data() )) {}
fgets(buff, LEN, file);
fTMatrixElems.clear();
fDMatrixElems.clear();
fPMatrixElems.clear();
fPTAMatrixElems.clear();
fYMatrixElems.clear();
fYTAMatrixElems.clear();
fLMatrixElems.clear();
fFPMatrixElems.clear();
fFPMatrixElems.resize(3);
typedef vector<string>::size_type vsiz_t;
map<string,vsiz_t> power;
power["t"] = 3;
power["y"] = 3;
power["p"] = 3;
power["D"] = 3;
power["T"] = 3;
power["Y"] = 3;
power["YTA"] = 4;
power["P"] = 3;
power["PTA"] = 4;
power["L"] = 4;
power["XF"] = 5;
power["TF"] = 5;
power["PF"] = 5;
power["YF"] = 5;
map<string,vector<THaMatrixElement>*> matrix_map;
matrix_map["t"] = &fFPMatrixElems;
matrix_map["y"] = &fFPMatrixElems;
matrix_map["p"] = &fFPMatrixElems;
matrix_map["D"] = &fDMatrixElems;
matrix_map["T"] = &fTMatrixElems;
matrix_map["Y"] = &fYMatrixElems;
matrix_map["YTA"] = &fYTAMatrixElems;
matrix_map["P"] = &fPMatrixElems;
matrix_map["PTA"] = &fPTAMatrixElems;
matrix_map["L"] = &fLMatrixElems;
map <string,int> fp_map;
fp_map["t"] = 0;
fp_map["y"] = 1;
fp_map["p"] = 2;
while( fgets(buff, LEN, file) ) {
string line(buff);
if( line.size() > 0 && line[line.size()-1] == '\n' ) {
buff[line.size()-1] = 0;
line.erase(line.size()-1,1);
}
vector<string> line_spl = Split(line);
if(line_spl.empty())
continue;
const char* w = line_spl[0].c_str();
vsiz_t npow = power[w];
if( npow == 0 )
break;
THaMatrixElement ME;
ME.pw.resize(npow);
ME.iszero = true; ME.order = 0;
vsiz_t pos;
for (pos=1; pos<=npow && pos<line_spl.size(); pos++) {
ME.pw[pos-1] = atoi(line_spl[pos].c_str());
}
vsiz_t p_cnt;
for ( p_cnt=0; pos<line_spl.size() && p_cnt<kPORDER && pos<=npow+kPORDER;
pos++,p_cnt++ ) {
ME.poly[p_cnt] = atof(line_spl[pos].c_str());
if (ME.poly[p_cnt] != 0.0) {
ME.iszero = false;
ME.order = p_cnt+1;
}
}
if (p_cnt < 1) {
Error(Here(here), "Could not read in Matrix Element %s%d%d%d!",
w, ME.pw[0], ME.pw[1], ME.pw[2]);
Error(Here(here), "Line looks like: %s",line.c_str());
fclose(file);
return kInitError;
}
if( ME.iszero )
continue;
vector<THaMatrixElement> *mat = matrix_map[w];
if (mat) {
if( mat == &fFPMatrixElems ) {
if( ME.pw[0] == 0 && ME.pw[1] == 0 && ME.pw[2] == 0 ) {
THaMatrixElement& m = (*mat)[fp_map[w]];
if( m.order > 0 ) {
Warning(Here(here), "Duplicate definition of focal plane "
"matrix element: %s. Using first definition.", buff);
} else
m = ME;
} else
Warning(Here(here), "Bad coefficients of focal plane matrix "
"element %s", buff);
}
else {
bool match = false;
for( vector<THaMatrixElement>::iterator it = mat->begin();
it != mat->end() && !(match = it->match(ME)); it++ ) {}
if( match ) {
Warning(Here(here), "Duplicate definition of "
"matrix element: %s. Using first definition.", buff);
} else
mat->push_back(ME);
}
}
else if ( fDebug > 0 )
Warning(Here(here), "Not storing matrix for: %s !", w);
}
const Double_t degrad = TMath::Pi()/180.0;
fTan_vdc = fFPMatrixElems[T000].poly[0];
fVDCAngle = TMath::ATan(fTan_vdc);
fSin_vdc = TMath::Sin(fVDCAngle);
fCos_vdc = TMath::Cos(fVDCAngle);
DefineAxes(0.0*degrad);
fNumIter = 1;
fErrorCutoff = 1e100;
const THaDetector* s1 = GetApparatus()->GetDetector("s1");
if(s1 == NULL)
fCentralDist = 0;
else
fCentralDist = s1->GetOrigin().Z();
CalcMatrix(1.,fLMatrixElems);
fIsInit = true;
fclose(file);
return kOK;
}
THaVDC::~THaVDC()
{
delete fLower;
delete fUpper;
delete fUVpairs;
}
Int_t THaVDC::ConstructTracks( TClonesArray* tracks, Int_t mode )
{
#ifdef WITH_DEBUG
if( fDebug>1 ) {
cout << "-----------------------------------------------\n";
cout << "ConstructTracks: ";
if( mode == 0 )
cout << "iterating";
if( mode == 1 )
cout << "coarse tracking";
if( mode == 2 )
cout << "fine tracking";
cout << endl;
}
#endif
UInt_t theStage = ( mode == 1 ) ? kCoarse : kFine;
fUVpairs->Clear();
Int_t nUpperTracks = fUpper->GetNUVTracks();
Int_t nLowerTracks = fLower->GetNUVTracks();
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << "nUpper/nLower = " << nUpperTracks << " " << nLowerTracks << endl;
#endif
if( nUpperTracks == 0 && nLowerTracks == 0 ) {
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << "No tracks.\n";
#endif
return 0;
}
Int_t nTracks = 0;
Int_t nPairs = 0;
if( nUpperTracks == 0 || nLowerTracks == 0 ) {
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << "missing cluster " << nUpperTracks << " " << nUpperTracks << endl;
#endif
return 0;
}
THaVDCUVTrack *track, *partner;
THaVDCTrackPair *thePair;
for( int i = 0; i < nLowerTracks; i++ ) {
track = fLower->GetUVTrack(i);
if( !track )
continue;
for( int j = 0; j < nUpperTracks; j++ ) {
partner = fUpper->GetUVTrack(j);
if( !partner )
continue;
thePair = new( (*fUVpairs)[nPairs++] ) THaVDCTrackPair( track, partner );
track->SetPartner( NULL );
partner->SetPartner( NULL );
thePair->Analyze( fUSpacing );
}
}
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << nPairs << " pairs.\n";
#endif
int n_exist = 0, n_mod = 0;
int n_oops = 0;
if( tracks )
n_exist = tracks->GetLast()+1;
if( nPairs > 1 )
fUVpairs->Sort();
for( int i = 0; i < nPairs; i++ ) {
if( !(thePair = static_cast<THaVDCTrackPair*>( fUVpairs->At(i) )) )
continue;
#ifdef WITH_DEBUG
if( fDebug>1 ) {
cout << "Pair " << i << ": "
<< thePair->GetUpper()->GetUCluster()->GetPivotWireNum() << " "
<< thePair->GetUpper()->GetVCluster()->GetPivotWireNum() << " "
<< thePair->GetLower()->GetUCluster()->GetPivotWireNum() << " "
<< thePair->GetLower()->GetVCluster()->GetPivotWireNum() << " "
<< thePair->GetError() << endl;
}
#endif
if( thePair->GetError() > fErrorCutoff )
break;
track = thePair->GetLower();
partner = thePair->GetUpper();
if( !track || !partner )
continue;
#ifdef WITH_DEBUG
if( fDebug>1 ) {
cout << "dUpper/dLower = "
<< thePair->GetProjectedDistance( track,partner,fUSpacing) << " "
<< thePair->GetProjectedDistance( partner,track,-fUSpacing);
}
#endif
if( track->GetPartner() || partner->GetPartner() ) {
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << " ... skipped.\n";
#endif
continue;
}
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << " ... good.\n";
#endif
track->SetPartner( partner );
partner->SetPartner( track );
thePair->SetStatus(1);
nTracks++;
THaVDCCluster
*tu = track->GetUCluster(),
*tv = track->GetVCluster(),
*pu = partner->GetUCluster(),
*pv = partner->GetVCluster();
Double_t du = pu->GetIntercept() - tu->GetIntercept();
Double_t dv = pv->GetIntercept() - tv->GetIntercept();
Double_t mu = du / fUSpacing;
Double_t mv = dv / fVSpacing;
tu->SetSlope(mu);
tv->SetSlope(mv);
pu->SetSlope(mu);
pv->SetSlope(mv);
track->CalcDetCoords();
partner->CalcDetCoords();
#ifdef WITH_DEBUG
if( fDebug>2 )
cout << "Global track parameters: "
<< mu << " " << mv << " "
<< track->GetTheta() << " " << track->GetPhi()
<< endl;
#endif
if (tracks) {
THaVDCTrackID* thisID = new THaVDCTrackID(track,partner);
THaTrack* theTrack = NULL;
bool found = false;
int t;
for( t = 0; t < n_exist; t++ ) {
theTrack = static_cast<THaTrack*>( tracks->At(t) );
if( theTrack && theTrack->GetCreator() == this &&
*thisID == *theTrack->GetID() ) {
found = true;
break;
}
n_oops++;
}
UInt_t flag = theStage;
if( nPairs > 1 )
flag |= kMultiTrack;
if( found ) {
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << "Track " << t << " modified.\n";
#endif
delete thisID;
++n_mod;
} else {
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << "Track " << tracks->GetLast()+1 << " added.\n";
#endif
theTrack = AddTrack(*tracks, 0.0, 0.0, 0.0, 0.0, thisID );
theTrack->AddCluster( track );
theTrack->AddCluster( partner );
if( theStage == kFine )
flag |= kReassigned;
}
theTrack->SetD(track->GetX(), track->GetY(), track->GetTheta(),
track->GetPhi());
theTrack->SetFlag( flag );
Double_t chi2=0;
Int_t nhits=0;
track->CalcChisquare(chi2,nhits);
partner->CalcChisquare(chi2,nhits);
theTrack->SetChi2(chi2,nhits-4);
CalcFocalPlaneCoords(theTrack, kRotatingTransport);
}
}
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << nTracks << " good tracks.\n";
#endif
if( tracks && n_exist > n_mod ) {
bool modified = false;
for( int i = 0; i < tracks->GetLast()+1; i++ ) {
THaTrack* theTrack = static_cast<THaTrack*>( tracks->At(i) );
if( (theTrack->GetCreator() == this) &&
((theTrack->GetFlag() & kStageMask) != theStage ) ) {
#ifdef WITH_DEBUG
if( fDebug>1 )
cout << "Track " << i << " deleted.\n";
#endif
tracks->RemoveAt(i);
modified = true;
}
}
if( modified )
tracks->Compress();
}
return nTracks;
}
void THaVDC::Clear( Option_t* opt )
{
fLower->Clear(opt);
fUpper->Clear(opt);
}
Int_t THaVDC::Decode( const THaEvData& evdata )
{
fLower->Decode(evdata);
fUpper->Decode(evdata);
return 0;
}
Int_t THaVDC::CoarseTrack( TClonesArray& tracks )
{
#ifdef WITH_DEBUG
static int nev = 0;
if( fDebug>1 ) {
nev++;
cout << "=========================================\n";
cout << "Event: " << nev << endl;
}
#endif
fLower->CoarseTrack();
fUpper->CoarseTrack();
fNtracks = ConstructTracks( &tracks, 1 );
return 0;
}
Int_t THaVDC::FineTrack( TClonesArray& tracks )
{
if( TestBit(kCoarseOnly) )
return 0;
fLower->FineTrack();
fUpper->FineTrack();
for (Int_t i = 0; i < fNumIter; i++) {
ConstructTracks();
fLower->FineTrack();
fUpper->FineTrack();
}
fNtracks = ConstructTracks( &tracks, 2 );
#ifdef WITH_DEBUG
static char c;
if( fDebug>1 ) {
cin.clear();
while( !cin.eof() && cin.get(c) && c != '\n');
}
#endif
return 0;
}
Int_t THaVDC::FindVertices( TClonesArray& tracks )
{
Int_t n_exist = tracks.GetLast()+1;
for( Int_t t = 0; t < n_exist; t++ ) {
THaTrack* theTrack = static_cast<THaTrack*>( tracks.At(t) );
CalcTargetCoords(theTrack, kRotatingTransport);
}
return 0;
}
void THaVDC::CalcFocalPlaneCoords( THaTrack* track, const ECoordTypes mode )
{
Double_t tan_rho, cos_rho, tan_rho_loc, cos_rho_loc;
Double_t x, y, theta, phi;
Double_t r_x, r_y, r_theta, r_phi;
tan_rho = fFPMatrixElems[T000].poly[0];
cos_rho = 1.0/sqrt(1.0+tan_rho*tan_rho);
theta = (track->GetDTheta()+tan_rho) /
(1.0-track->GetDTheta()*tan_rho);
x = track->GetDX() * cos_rho * (1.0 + theta * tan_rho);
phi = track->GetDPhi() / (1.0-track->GetDTheta()*tan_rho) / cos_rho;
y = track->GetDY() + tan_rho*phi*track->GetDX()*cos_rho;
r_x = x;
if(mode == kTransport)
CalcMatrix( x, fFPMatrixElems );
else if (mode == kRotatingTransport)
CalcMatrix( r_x, fFPMatrixElems );
r_y = y - fFPMatrixElems[Y000].v;
tan_rho_loc = fFPMatrixElems[T000].v;
cos_rho_loc = 1.0/sqrt(1.0+tan_rho_loc*tan_rho_loc);
r_phi = (track->GetDPhi() - fFPMatrixElems[P000].v ) /
(1.0-track->GetDTheta()*tan_rho_loc) / cos_rho_loc;
r_theta = (track->GetDTheta()+tan_rho_loc) /
(1.0-track->GetDTheta()*tan_rho_loc);
track->Set(x, y, theta, phi);
track->SetR(r_x, r_y, r_theta, r_phi);
}
void THaVDC::CalcTargetCoords(THaTrack *track, const ECoordTypes mode)
{
const Int_t kNUM_PRECOMP_POW = 10;
Double_t x_fp, y_fp, th_fp, ph_fp;
Double_t powers[kNUM_PRECOMP_POW][5];
Double_t x, y, theta, phi, dp, p, pathl;
if(mode == kTransport) {
x_fp = track->GetX();
y_fp = track->GetY();
th_fp = track->GetTheta();
ph_fp = track->GetPhi();
} else {
x_fp = track->GetRX();
y_fp = track->GetRY();
th_fp = track->GetRTheta();
ph_fp = track->GetRPhi();
}
for(int i=0; i<kNUM_PRECOMP_POW; i++) {
powers[i][0] = pow(x_fp, i);
powers[i][1] = pow(th_fp, i);
powers[i][2] = pow(y_fp, i);
powers[i][3] = pow(ph_fp, i);
powers[i][4] = pow(TMath::Abs(th_fp),i);
}
CalcMatrix(x_fp, fDMatrixElems);
CalcMatrix(x_fp, fTMatrixElems);
CalcMatrix(x_fp, fYMatrixElems);
CalcMatrix(x_fp, fYTAMatrixElems);
CalcMatrix(x_fp, fPMatrixElems);
CalcMatrix(x_fp, fPTAMatrixElems);
theta = CalcTargetVar(fTMatrixElems, powers);
phi = CalcTargetVar(fPMatrixElems, powers)+CalcTargetVar(fPTAMatrixElems,powers);
y = CalcTargetVar(fYMatrixElems, powers)+CalcTargetVar(fYTAMatrixElems,powers);
THaSpectrometer *app = static_cast<THaSpectrometer*>(GetApparatus());
dp = CalcTargetVar(fDMatrixElems, powers);
p = app->GetPcentral() * (1.0+dp);
pathl = CalcTarget2FPLen(fLMatrixElems, powers);
x = 0.0;
track->SetTarget(x, y, theta, phi);
track->SetDp(dp);
track->SetMomentum(p);
track->SetPathLen(pathl);
app->TransportToLab( p, theta, phi, track->GetPvect() );
}
void THaVDC::CalcMatrix( const Double_t x, vector<THaMatrixElement>& matrix )
{
for( vector<THaMatrixElement>::iterator it=matrix.begin();
it!=matrix.end(); it++ ) {
it->v = 0.0;
if(it->order > 0) {
for(int i=it->order-1; i>=1; i--)
it->v = x * (it->v + it->poly[i]);
it->v += it->poly[0];
}
}
}
Double_t THaVDC::CalcTargetVar(const vector<THaMatrixElement>& matrix,
const Double_t powers[][5])
{
Double_t retval=0.0;
Double_t v=0;
for( vector<THaMatrixElement>::const_iterator it=matrix.begin();
it!=matrix.end(); it++ )
if(it->v != 0.0) {
v = it->v;
unsigned int np = it->pw.size();
for (unsigned int i=0; i<np; i++)
v *= powers[it->pw[i]][i+1];
retval += v;
}
return retval;
}
Double_t THaVDC::CalcTarget2FPLen(const vector<THaMatrixElement>& matrix,
const Double_t powers[][5])
{
Double_t retval=0.0;
for( vector<THaMatrixElement>::const_iterator it=matrix.begin();
it!=matrix.end(); it++ )
if(it->v != 0.0)
retval += it->v * powers[it->pw[0]][0]
* powers[it->pw[1]][1]
* powers[it->pw[2]][2]
* powers[it->pw[3]][3];
return retval;
}
void THaVDC::CorrectTimeOfFlight(TClonesArray& tracks)
{
const static Double_t v = 3.0e-8;
THaScintillator* s1 = static_cast<THaScintillator*>
( GetApparatus()->GetDetector("s1") );
THaScintillator* s2 = static_cast<THaScintillator*>
( GetApparatus()->GetDetector("s2") );
if( (s1 == NULL) || (s2 == NULL) )
return;
Int_t n_exist = tracks.GetLast()+1;
for( Int_t t = 0; t < n_exist; t++ ) {
THaTrack* track = static_cast<THaTrack*>( tracks.At(t) );
Double_t s1_dist, vdc_dist, dist, tdelta;
if(!s1->CalcPathLen(track, s1_dist))
s1_dist = 0.0;
if(!CalcPathLen(track, vdc_dist))
vdc_dist = 0.0;
if( track->GetX() < 0 )
dist = s1_dist + vdc_dist;
else
dist = s1_dist - vdc_dist;
tdelta = ( fCentralDist - dist) / v;
Int_t n_clust = track->GetNclusters();
for( Int_t i = 0; i < n_clust; i++ ) {
THaVDCUVTrack* the_uvtrack =
static_cast<THaVDCUVTrack*>( track->GetCluster(i) );
if( !the_uvtrack )
continue;
the_uvtrack->GetUCluster()->SetTimeCorrection(tdelta);
the_uvtrack->GetVCluster()->SetTimeCorrection(tdelta);
}
}
}
void THaVDC::FindBadTracks(TClonesArray& tracks)
{
THaScintillator* s2 = static_cast<THaScintillator*>
( GetApparatus()->GetDetector("s2") );
if(s2 == NULL) {
return;
}
Int_t n_exist = tracks.GetLast()+1;
for( Int_t t = 0; t < n_exist; t++ ) {
THaTrack* track = static_cast<THaTrack*>( tracks.At(t) );
Double_t x2, y2;
if(!s2->CalcInterceptCoords(track, x2, y2)) {
x2 = 0.0;
y2 = 0.0;
}
if( (TMath::Abs(x2 - s2->GetOrigin().X()) > s2->GetSize()[0]) ||
(TMath::Abs(y2 - s2->GetOrigin().Y()) > s2->GetSize()[1]) ) {
track->SetFlag( track->GetFlag() | kBadTrack );
#ifdef WITH_DEBUG
#endif
}
}
}
void THaVDC::Print(const Option_t* opt) const {
THaTrackingDetector::Print(opt);
printf("Matrix FP (t000, y000, p000)\n");
typedef vector<THaMatrixElement>::size_type vsiz_t;
for (vsiz_t i=0; i<fFPMatrixElems.size(); i++) {
const THaMatrixElement& m = fFPMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Transport Matrix: D-terms\n");
for (vsiz_t i=0; i<fDMatrixElems.size(); i++) {
const THaMatrixElement& m = fDMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Transport Matrix: T-terms\n");
for (vsiz_t i=0; i<fTMatrixElems.size(); i++) {
const THaMatrixElement& m = fTMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Transport Matrix: Y-terms\n");
for (vsiz_t i=0; i<fYMatrixElems.size(); i++) {
const THaMatrixElement& m = fYMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Transport Matrix: YTA-terms (abs(theta))\n");
for (vsiz_t i=0; i<fYTAMatrixElems.size(); i++) {
const THaMatrixElement& m = fYTAMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Transport Matrix: P-terms\n");
for (vsiz_t i=0; i<fPMatrixElems.size(); i++) {
const THaMatrixElement& m = fPMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Transport Matrix: PTA-terms\n");
for (vsiz_t i=0; i<fPTAMatrixElems.size(); i++) {
const THaMatrixElement& m = fPTAMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
printf("Matrix L\n");
for (vsiz_t i=0; i<fLMatrixElems.size(); i++) {
const THaMatrixElement& m = fLMatrixElems[i];
for (vsiz_t j=0; j<m.pw.size(); j++) {
printf(" %2d",m.pw[j]);
}
for (int j=0; j<m.order; j++) {
printf(" %g",m.poly[j]);
}
printf("\n");
}
return;
}
bool THaVDC::THaMatrixElement::match(const THaMatrixElement& rhs) const
{
if( pw.size() != rhs.pw.size() )
return false;
for( vector<int>::size_type i=0; i<pw.size(); i++ ) {
if( pw[i] != rhs.pw[i] )
return false;
}
return true;
}
ClassImp(THaVDC)
Last change: Sat Nov 7 21:26:54 2009
Last generated: 2009-11-07 21:26
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.