BLCMDzntuple::Entry Struct Reference

Inheritance diagram for BLCMDzntuple::Entry:

BLManager::ZSteppingAction

List of all members.

Public Member Functions

 Entry (BLCMDzntuple *znt, G4double zpos, BLCoordinateType _coordinateType)
void UserZSteppingAction (const G4Track *track)

Public Attributes

BLCMDzntuplezntuple
BLNTuplentuple
BLEvaluatoreval
BLCoordinateType coordinateType
int nNTuples


Constructor & Destructor Documentation

BLCMDzntuple::Entry::Entry ( BLCMDzntuple znt,
G4double  zpos,
BLCoordinateType  _coordinateType 
)

References coordinateType, BLNTuple::create(), eval, BLCMDzntuple::file, BLCMDzntuple::format, ntuple, BLCMDzntuple::require, snprintf, TrackFields, and zntuple.

00213 {
00214         char name[128];
00215         snprintf(name,sizeof(name),"Z%.0f",floor(zpos+0.5));
00216 
00217         zntuple = znt;
00218         ntuple = BLNTuple::create(zntuple->format,"NTuple",name,
00219                                                 TrackFields,zntuple->file);
00220 
00221         eval = 0;
00222         if(zntuple->require != "") eval = new BLEvaluator();
00223         coordinateType = _coordinateType;
00224 }


Member Function Documentation

void BLCMDzntuple::Entry::UserZSteppingAction ( const G4Track *  track  )  [virtual]

Implements BLManager::ZSteppingAction.

References BLNTuple::appendRow(), B, BEAM, BLCOORD_REFERENCE, coordinateType, BLNTuple::doCallbacks(), E, eval, BLEvaluator::evaluate(), BLCoordinates::getCoords(), BLManager::getExternalParentID(), BLManager::getExternalTrackID(), BLGlobalField::GetFieldValue(), BLNTuple::getNData(), BLGlobalField::getObject(), BLManager::getObject(), BLCoordinates::getRotation(), BLManager::getState(), BLEvaluator::isOK(), BLCoordinates::isValid(), BLCMDzntuple::noSingles, NTrackFields, ntuple, BLCommand::printError(), BLCMDzntuple::require, BLEvaluator::setTrackVariables(), and zntuple.

00227 {
00228         // only use reference coordinates when they are valid
00229         BLManagerState state = BLManager::getObject()->getState();
00230         if(coordinateType == BLCOORD_REFERENCE && state != BEAM) return;
00231 
00232         if(eval) {
00233                 eval->setTrackVariables(track,coordinateType);
00234                 G4double v = eval->evaluate(zntuple->require);
00235                 if(!eval->isOK()) {
00236                         BLCommand::printError("beamlossntuple: invalid expression require='%s'\n",
00237                                 zntuple->require.c_str());
00238                         delete eval;
00239                         eval = 0;
00240                         v = 1.0;
00241                 }
00242                 if(v == 0.0) return;
00243         }
00244 
00245         G4RunManager* runmgr = G4RunManager::GetRunManager();
00246         const G4Event* event = runmgr->GetCurrentEvent();
00247         int evId = event->GetEventID();
00248         G4ThreeVector position = track->GetPosition();
00249         G4double time = track->GetGlobalTime();
00250         G4ThreeVector momentum = track->GetMomentum();
00251 
00252         // get # data fields, and get B and E if needed
00253         unsigned ndata = (ntuple ? ntuple->getNData() : NTrackFields);
00254         G4double field[6];
00255         if(ndata > NTrackFields) {
00256                 G4double point[4];
00257                 point[0] = position[0];
00258                 point[1] = position[1];
00259                 point[2] = position[2];
00260                 point[3] = time;
00261                 BLGlobalField::getObject()->GetFieldValue(point,field);
00262         }
00263 
00264         // transform to desired coordinates, if available
00265         BLCoordinates *c = (BLCoordinates *)track->GetUserInformation();
00266         if(c && c->isValid()) {
00267                 c->getCoords(coordinateType,position);
00268                 momentum = c->getRotation() * momentum;
00269         }
00270 
00271 
00272         float data[18];
00273         assert(ndata <= sizeof(data)/sizeof(data[0]));
00274         data[0] = position[0]/mm;               // x (mm)
00275         data[1] = position[1]/mm;               // y (mm)
00276         data[2] = position[2]/mm;               // z (mm)
00277         data[3] = momentum[0]/MeV;              // Px (MeV/c)
00278         data[4] = momentum[1]/MeV;              // Py (MeV/c)
00279         data[5] = momentum[2]/MeV;              // Pz (MeV/c)
00280         data[6] = time/ns;                      // t (ns)
00281         data[7] = track->GetDefinition()->GetPDGEncoding();
00282         data[8] = evId;                         // Event ID
00283         data[9] = BLManager::getObject()->getExternalTrackID(track);
00284         data[10] = BLManager::getObject()->getExternalParentID(track);
00285         data[11] = track->GetWeight();          // Weight
00286         if(ndata > NTrackFields) {
00287                 G4ThreeVector B(field[0],field[1],field[2]);
00288                 G4ThreeVector E(field[3],field[4],field[5]);
00289                 if(c && c->isValid()) {
00290                         B = c->getRotation() * B;
00291                         E = c->getRotation() * E;
00292                 }
00293                 data[12] = B[0]/tesla;
00294                 data[13] = B[1]/tesla;
00295                 data[14] = B[2]/tesla;
00296                 data[15] = E[0]/(megavolt/meter);
00297                 data[16] = E[1]/(megavolt/meter);
00298                 data[17] = E[2]/(megavolt/meter);
00299         }
00300         if(zntuple->noSingles)
00301                 ntuple->doCallbacks(data,ndata);
00302         else
00303                 ntuple->appendRow(data,ndata);
00304 }


Member Data Documentation

Referenced by Entry(), and UserZSteppingAction().

Referenced by Entry(), and UserZSteppingAction().

Referenced by Entry(), and UserZSteppingAction().


The documentation for this struct was generated from the following file:
g4beamline